hydrus/include/ClientDragDrop.py

119 lines
4.3 KiB
Python
Raw Normal View History

2017-11-22 21:03:07 +00:00
import ClientGUICommon
2017-05-17 21:53:02 +00:00
import HydrusGlobals as HG
2017-12-20 22:55:48 +00:00
import json
2015-07-29 19:11:35 +00:00
import wx
2018-01-03 22:37:30 +00:00
class FileDropTarget( wx.DropTarget ):
2015-07-29 19:11:35 +00:00
2017-12-20 22:55:48 +00:00
def __init__( self, parent, filenames_callable = None, url_callable = None, media_callable = None, page_callable = None ):
2015-07-29 19:11:35 +00:00
2018-01-03 22:37:30 +00:00
wx.DropTarget.__init__( self )
2015-07-29 19:11:35 +00:00
2017-11-22 21:03:07 +00:00
self._parent = parent
2017-05-17 21:53:02 +00:00
self._filenames_callable = filenames_callable
self._url_callable = url_callable
2017-12-20 22:55:48 +00:00
self._media_callable = media_callable
2017-08-23 21:34:25 +00:00
self._page_callable = page_callable
2017-05-17 21:53:02 +00:00
2015-07-29 19:11:35 +00:00
self._receiving_data_object = wx.DataObjectComposite()
self._hydrus_media_data_object = wx.CustomDataObject( 'application/hydrus-media' )
2017-08-23 21:34:25 +00:00
self._hydrus_page_tab_data_object = wx.CustomDataObject( 'application/hydrus-page-tab' )
2015-07-29 19:11:35 +00:00
self._file_data_object = wx.FileDataObject()
2017-05-17 21:53:02 +00:00
self._text_data_object = wx.TextDataObject()
2015-07-29 19:11:35 +00:00
self._receiving_data_object.Add( self._hydrus_media_data_object, True )
2017-08-23 21:34:25 +00:00
self._receiving_data_object.Add( self._hydrus_page_tab_data_object )
2015-07-29 19:11:35 +00:00
self._receiving_data_object.Add( self._file_data_object )
2017-05-17 21:53:02 +00:00
self._receiving_data_object.Add( self._text_data_object )
2015-07-29 19:11:35 +00:00
self.SetDataObject( self._receiving_data_object )
def OnData( self, x, y, result ):
if self.GetData():
received_format = self._receiving_data_object.GetReceivedFormat()
2017-05-17 21:53:02 +00:00
received_format_type = received_format.GetType()
if received_format_type == wx.DF_FILENAME and self._filenames_callable is not None:
2015-07-29 19:11:35 +00:00
paths = self._file_data_object.GetFilenames()
2017-09-27 21:52:54 +00:00
wx.CallAfter( self._filenames_callable, paths ) # callafter to terminate dnd event now
result = wx.DragNone
2015-07-29 19:11:35 +00:00
2017-05-17 21:53:02 +00:00
elif received_format_type in ( wx.DF_TEXT, wx.DF_UNICODETEXT ) and self._url_callable is not None:
text = self._text_data_object.GetText()
2017-09-27 21:52:54 +00:00
wx.CallAfter( self._url_callable, text ) # callafter to terminate dnd event now
result = wx.DragCopy
2017-05-17 21:53:02 +00:00
2015-07-29 19:11:35 +00:00
else:
try:
format_id = received_format.GetId()
except:
format_id = None
2017-12-20 22:55:48 +00:00
if format_id == 'application/hydrus-media' and self._media_callable is not None:
2015-07-29 19:11:35 +00:00
2018-01-03 22:37:30 +00:00
mview = self._hydrus_media_data_object.GetData()
data = mview.tobytes()
2017-12-20 22:55:48 +00:00
( encoded_page_key, encoded_hashes ) = json.loads( data )
page_key = encoded_page_key.decode( 'hex' )
hashes = [ encoded_hash.decode( 'hex' ) for encoded_hash in encoded_hashes ]
wx.CallAfter( self._media_callable, page_key, hashes ) # callafter so we can terminate dnd event now
result = wx.DragMove
2015-07-29 19:11:35 +00:00
2017-08-23 21:34:25 +00:00
if format_id == 'application/hydrus-page-tab' and self._page_callable is not None:
2018-01-03 22:37:30 +00:00
mview = self._hydrus_page_tab_data_object.GetData()
page_key = mview.tobytes()
2017-08-23 21:34:25 +00:00
2017-12-20 22:55:48 +00:00
wx.CallAfter( self._page_callable, page_key ) # callafter so we can terminate dnd event now
2017-09-27 21:52:54 +00:00
result = wx.DragMove
2017-08-23 21:34:25 +00:00
2015-07-29 19:11:35 +00:00
return result
2017-11-22 21:03:07 +00:00
def OnDrop( self, x, y ):
2017-11-29 21:48:23 +00:00
screen_position = self._parent.ClientToScreen( ( x, y ) )
drop_tlp = ClientGUICommon.GetXYTopTLP( screen_position )
2017-11-22 21:03:07 +00:00
my_tlp = ClientGUICommon.GetTLP( self._parent )
if drop_tlp == my_tlp:
return True
else:
return False
2017-09-27 21:52:54 +00:00
# setting OnDragOver to return copy gives Linux trouble with page tab drops with shift held down