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