drag on userarea [SOLVED]
On 11/06/2015 at 12:51, xxxxxxxx wrote:
Hello,
I use the Message of a Dialog to revive a drag - in the dialog are several userareas and i like to call a different function when the drag finished over a userarea than on the rest of the dialog - can i check if it over ?
Thanks
On 12/06/2015 at 07:44, xxxxxxxx wrote:
Hi,
I'm not quite sure, what you mean with "revive a drag". Basically all you need to do, is to process the BFM_DRAGRECEIVE message in your GeUserArea. For example see this thread.
On 12/06/2015 at 11:08, xxxxxxxx wrote:
Hi Andreas,
I use the BFM_DRAGRECEIVE in the Message of a gui.GeDialog - to receive the drag on the dialog - but i need to know if the drag was on the free space in the dialog or on a special GeUserArea within the dialog
i try to add the BFM_DRAGRECEIVE in the GeUserArea but the dialog take the message
On 16/06/2015 at 03:29, xxxxxxxx wrote:
Hi conner,
indeed, this was a bit tricky. I guess, that's why Drag&Drop for Python is not documented, yet.
Here's what I did to make it work:
Basically I implemented Message() only for the GeDialog and have a custom MyDragMessage() function on the GeUserArea.
Note: I used the MemoryViewer example from the Python SDK examples. In there I duplicated the mem_info user area and added a static text in between in order to have some "dialog" area.
In my GeUserArea:
def MyDragMessage(self, msg, draginfo, result) : # Don't discard here, if lost drag or if it has been escaped. Already done in parent dialog. # Check drop area and discard if not on the user area if not self.CheckDropArea(msg, True, True) : self.SetDragDestination(c4d.MOUSE_FORBIDDEN) return False # Here: Mouse hovers over user area # Check if drag is finished (=drop) if msg.GetInt32(c4d.BFM_DRAG_FINISHED)==1: print "Dropped on UserArea %s" % self.uaIdx return True # Return current mouse cursor for valid drag operation self.SetDragDestination(c4d.MOUSE_MOVE) return True
In my GeDialog:
def Message(self, msg, result) : if msg.GetId()==c4d.BFM_DRAGRECEIVE: # Get drag object type and data draginfo = self.GetDragObject(msg) # Discard if lost drag or if it has been escaped if msg.GetInt32(c4d.BFM_DRAG_LOST) or msg.GetInt32(c4d.BFM_DRAG_ESC) : # Not sure, why we need to test the UserArea here as well if self.mem_info.MyDragMessage(msg, draginfo, result)==True: return True if self.mem_info_2.MyDragMessage(msg, draginfo, result)==True: return True return self.SetDragDestination(c4d.MOUSE_FORBIDDEN) # if we are here, mouse hovers over dialog if self.mem_info.MyDragMessage(msg, draginfo, result)==True: return True if self.mem_info_2.MyDragMessage(msg, draginfo, result)==True: return True # Check if drag is finished (=drop) if msg.GetInt32(c4d.BFM_DRAG_FINISHED)==1: print "Dropped on Dialog" return True # Return current mouse cursor for valid drag operation return self.SetDragDestination(c4d.MOUSE_MOVE) # Call GeDialog.Message() implementation so that it can handle all the other messages return gui.GeDialog.Message(self, msg, result)
On 19/06/2015 at 11:35, xxxxxxxx wrote:
Hey Andreas,
thanks for you help - In my case it`s a bit more tricky- I have a undefined count of GeUserArea of two different types - is there a way to check that and return the id ?
Many Thanks
On 19/06/2015 at 21:03, xxxxxxxx wrote:
Hi conner,
you need to add a "MyDragMessage" to both types. Then have a index member in your GeUserAreas. In my case it's uaIdx (my code already prints, on which area the user dropped) and I initialize it, when instancing the GeUserAreas. I simply used indeces beginning with 0, but of course you can use anything you like (e.g. DescIds). Sorry, I should have mentioned that. And you are free to change the "MyDragMessage" functions to return the index (and for example -1 in false cases), if you need that information in the parent dialog.
On 20/06/2015 at 04:40, xxxxxxxx wrote:
You probably have the user areas in a list somewhere. If you have mixed types of user areas
in the list, then you could use isinstance() to check the type or (even more portable) call the
method only on objects that support it via hasattr().
for ua in self.user_areas: if hasattr(ua, 'MyDragMessage') and ua.MyDragMessage(msg, draginfo, result) : return True
On 21/06/2015 at 06:02, xxxxxxxx wrote:
great - that work
good help - thanks