API proposal: drag view

Pavel Safrata pavel.safrata at oracle.com
Tue Jan 15 07:04:23 PST 2013


On 15.1.2013 15:41, Kevin Rushforth wrote:
> Hi Pavel,
>
>>>> The developer could use the synchronous version of snapshot. But I 
>>>> think either snapshot should be fixed to be transparent by default 
>>>> instead of a white fill by default or add another snapshot method 
>>>> which produces a transparent fill by default.
>>
>> True. Kevin, how easy/hard it would be to add such snapshot method?
>
> I'm not sure that doubling the number of Node.snapshot methods to add 
> variants with a default of transparent fill is worth the bloat, given 
> that the two existing Node snapshot methods take a SnapshotParameters, 
> and you only need to add the following one line to make it transparent:
>
>    params.setFill(Color.TRANSPARENT);
>
> As I was discussing with Richard yesterday, it might have been better 
> for TRANSPARENT to be the default, but for consistency with Scene we 
> chose WHITE.

Thanks, Kevin. I'll let you and Richard decide about possible changing 
the default value. We could also provide 
DragBoard.DEFAULT_SNAPSHOT_PARAMETERS with the transparent fill and 
encourage its usage for producing the drag image.

Pavel

>
> -- Kevin
>
>
>
>
>
>
>
>
>
>
> Pavel Safrata wrote:
>> Hi Richard, Steve,
>>
>> On 14.1.2013 20:51, steve.x.northover at oracle.com wrote:
>>> +1
>>>
>>> I'd like to see some example code where the tree and table set a 
>>> default image as part of the implementation of these controls. 
>>> Applications would get a reasonable image for free and be able to 
>>> override it as necessary.  Having and getter is necessary for this.
>>
>> Is it? What will be done with it? User will get the image and 
>> programatically check if it looks good?
>>
>> (please see my answers to Richard's comments below).
>>
>>>
>>> BTW, the last time I looked, on Windows, when you set image content, 
>>> then you will get a drag image for free.  This doesn't happen on the 
>>> Mac.  We should stop doing this on Windows.
>>>
>>> Steve
>>>
>>> On 14/01/2013 2:09 PM, Richard Bair wrote:
>>>> HI Pavel!
>>>>
>>>> Overall great. I don't see why you can't have a getter. The only 
>>>> way to set the drag view is via an API we control so it seems 
>>>> pretty easy to implement the getter as well. 
>>
>> No. DnD is an OS feature. You can drag data from native applications 
>> to FX. Is it possible on all systems to find out what did the native 
>> application use as drag image? I'm really not sure. Anybody has the 
>> knowledge?
>>
>>>> You could either have a DragView class which encapsulates the 
>>>> node/image and the offsetX and offsetY, or you could just break it 
>>>> out into three properties on the DragBoard and save yourself the 
>>>> extra class.
>>
>> If we are OK with the properties having value only during starting 
>> DnD and not during the rest of the gesture, then yes, this could be 
>> done. But I still don't see the value.
>>
>>>>
>>>> I think you should just have an image based dragImage property and 
>>>> dragImageOffsetX and dragImageOffsetY properties. We shouldn't by 
>>>> default put anything in as the drag image, except for a few UI 
>>>> controls. We'll want a ListView, TreeView, TableView, TreeTableView 
>>>> to automatically pre-populate the DragBoard before the 
>>>> onDragDetected code is called, so that those control give you a 
>>>> nice drag image for free but the developer is free to replace it or 
>>>> clear it as they see fit.
>>
>> I don't think this is possible with the proposed API. The DragBoard 
>> instance doesn't exist until you start DnD in the DRAG_DETECTED 
>> handler, so you cannot really pre-populate it. Would it be sufficient 
>> if the controls contained getDefaultDragImage() method that users 
>> would explicitly call?
>>
>>>>
>>>> The developer could use the synchronous version of snapshot. But I 
>>>> think either snapshot should be fixed to be transparent by default 
>>>> instead of a white fill by default or add another snapshot method 
>>>> which produces a transparent fill by default.
>>
>> True. Kevin, how easy/hard it would be to add such snapshot method?
>>
>> Thanks,
>> Pavel
>>
>>>> Basically:
>>>>
>>>> source.setOnDragDetected(new EventHandler<MouseEvent>() {
>>>>      public void handle(MouseEvent event) {
>>>>          DragBoard db = source.startDragAndDrop(TransferMode.ANY);
>>>>          db.setContent(…);
>>>>          db.setDragImage(source.snapshot());
>>>>          db.setDragImageOffsetX(event.getX());
>>>>          db.setDragImageOffsetY(event.getY());
>>>>          event.consume();
>>>>      }
>>>> }
>>>>
>>>> Maybe also have a convenience method on DragBoard:
>>>>
>>>>      db.updateDragImage(node, x, y);
>>>>
>>>> which then just calls the 3 setters as appropriate.
>>>>
>>>> Richard
>>>>
>>>> On Jan 13, 2013, at 11:59 PM, Pavel 
>>>> Safrata<pavel.safrata at oracle.com>  wrote:
>>>>
>>>>> Hello,
>>>>> this is a proposal of an API allowing to specify the image 
>>>>> floating with mouse cursor during a drag&drop operation.
>>>>>
>>>>> Jira: http://javafx-jira.kenai.com/browse/RT-14730
>>>>>
>>>>> I propose to add two methods to DragBoard:
>>>>> setDragView(Image image, double offsetX, double offsetY)
>>>>> setDragView(Node node, double offsetX, double offsetY)
>>>>>
>>>>> The first one simply uses the given image for the drag view with 
>>>>> the offsetX and offsetY specifying cursor position over the image. 
>>>>> The second one renders the given node to an image and uses the 
>>>>> result (the coordinates being in the node's local space).
>>>>>
>>>>> The typical usage will look like this:
>>>>>         sourceNode.setOnDragDetected(new EventHandler<MouseEvent>() {
>>>>>             public void handle(MouseEvent event) {
>>>>>                 Dragboard db = 
>>>>> source.startDragAndDrop(TransferMode.ANY);
>>>>>                 ClipboardContent content = ...
>>>>>                 db.setContent(content);
>>>>>                 db.setDragView(sourceNode, event.getX(), 
>>>>> event.getY()); // that's it
>>>>>                 event.consume();
>>>>>             }
>>>>>         });
>>>>>
>>>>>
>>>>> This API is meant for telling the operating system what visual 
>>>>> cues to provide, I don't think it is useful (and I'm not sure it 
>>>>> is even possible) to provide getters.
>>>>>
>>>>> There is a possibility to provide default drag view - if none of 
>>>>> those methods is called, the default drag view would be an image 
>>>>> of the drag gesture source. This should work nice most of the 
>>>>> times. However, it may cause inconveniences to some existing apps 
>>>>> - for instance a text editor node which puts the selected text on 
>>>>> the DragBoard - after updating FX the application starts to show 
>>>>> the entire editor in the drag view. For this reason I think the 
>>>>> default behavior should remain unchanged.
>>>>>
>>>>> Thanks,
>>>>> Pavel
>>



More information about the openjfx-dev mailing list