API proposal: drag view
steve.x.northover at oracle.com
steve.x.northover at oracle.com
Tue Jan 15 09:55:12 PST 2013
Without a getter, the application has no idea whether a drag image has
already been set for them. Having a setter without a getter generally
makes no sense. Since we set the drag image, we can easily return the
image that we set.
Steve
On 15/01/2013 4:20 AM, 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