user area - drop finished
-
On 06/03/2015 at 12:06, xxxxxxxx wrote:
I try to revive a drag and drop on a user area but I don`t get the finished
def Message(self, msg, result) : if msg.GetId() == c4d.BFM_DRAGRECEIVE: str = "" type = 0; object = None bl = None print "revice" dragobject = self.GetDragObject(msg) print dragobject if msg.GetLong(c4d.BFM_DRAG_FINISHED) : print " info(Dropped..."
-
On 09/03/2015 at 10:45, xxxxxxxx wrote:
Hi,
Drag and drop methods are not currently documented in GeUserArea and GeDialog but they are fully functioning. They will be documented in the near future.
To receive drag and drop messages as expected it is important to return the appropriate values from Message() with SetDragDestination().
Here is the code I added to the Py-MemoryViewer example:def Message(self, msg, result) : if msg.GetId()==c4d.BFM_DRAGRECEIVE: # Discard if lost drag or if it has been escaped if msg.GetInt32(c4d.BFM_DRAG_LOST) or msg.GetInt32(c4d.BFM_DRAG_ESC) : return self.SetDragDestination(c4d.MOUSE_FORBIDDEN) # Check drop area and discard if not on the user area if not self.CheckDropArea(msg, True, True) : return self.SetDragDestination(c4d.MOUSE_FORBIDDEN) print "Dragged" # Get drag object type and data draginfo = self.GetDragObject(msg) # Check if drag is finished (=drop) if msg.GetInt32(c4d.BFM_DRAG_FINISHED)==1: print "Dropped" return True # Return current mouse cursor for valid drag operation return self.SetDragDestination(c4d.MOUSE_MOVE) # Call GeUserAre.Message() implementation so that it can handle all the other messages return gui.GeUserArea.Message(self, msg, result)
Note GetDragObject() returns a dictionary with 2 object "type" and "object" (in the code I prefer to assign these individually).
MOUSE_POINT_HAND is returned for the current drag destination cursor but any other valid MOUSE value can be returned.EDIT: Updated code.
-
On 09/03/2015 at 16:49, xxxxxxxx wrote:
Thanks Yannick,
work great
-
On 10/03/2015 at 00:56, xxxxxxxx wrote:
Originally posted by xxxxxxxx
[...]
def Message(self, msg, result) : if msg.GetId()==c4d.BFM_DRAGRECEIVE: # Discard if lost drag or if it has been escaped if msg.GetInt32(c4d.BFM_DRAG_LOST) or msg.GetInt32(c4d.BFM_DRAG_ESC) : return self.SetDragDestination(c4d.MOUSE_FORBIDDEN) # Check drop area and discard if not on the user area if not gui.GeUserArea.CheckDropArea(self, msg, True, True) : return self.SetDragDestination(c4d.MOUSE_FORBIDDEN) print "Dragged" # Get drag object type and data type, data = self.GetDragObject(msg) # Check if drag is finished (=drop) if msg.GetInt32(c4d.BFM_DRAG_FINISHED)==1: print "Dropped" return True # Return current mouse cursor for valid drag operation return self.SetDragDestination(c4d.MOUSE_MOVE) # Call GeUserAre.Message() implementation so that it can handle all the other messages return gui.GeUserArea.Message(self, msg, result)
Note GetDragObject() returns a dictionary with 2 object "type" and "object" (in the code I prefer to assign these individually).
MOUSE_POINT_HAND is returned for the current drag destination cursor but any other valid MOUSE value can be returned.I just want to point out that it is not guaranteed that the dictionary will
unpack in the order you expect it, so you should definetly assign type
and data seperately.Also, you can (should) use self.CheckDropArea(...) instead of
c4d.gui.GeUserArea.CheckDropArea(self, ...).Best regards,
Niklas -
On 10/03/2015 at 02:02, xxxxxxxx wrote:
Hi Niklas,
Originally posted by xxxxxxxx
I just want to point out that it is not guaranteed that the dictionary will
unpack in the order you expect it, so you should definitely assign type
and data separately.You're right. The code I posted doesn't actually unpack the drag object information dictionary from GetDragObject() as expected.
Originally posted by xxxxxxxx
Also, you can (should) use self.CheckDropArea(...) instead of
c4d.gui.GeUserArea.CheckDropArea(self, ...).Yes it's better and it looks nicer to call CheckDropArea() on self instead.
I updated the code I posted yesterday.