Source code for enable.tools.base_drop_tool
# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
# All rights reserved.
#
# This software is provided without warranty under the terms of the BSD
# license included in LICENSE.txt and may be redistributed only under
# the conditions described in the aforementioned license. The license
# is also available online at http://www.enthought.com/licenses/BSD.txt
#
# Thanks for using Enthought open source!
""" Abstract base class for tools that handle drag and drop """
from traits.api import Enum
from enable.base_tool import BaseTool
[docs]class BaseDropTool(BaseTool):
""" Abstract base class for tools that handle drag and drop
"""
default_drag_result = Enum(
"copy", "move", "link", "cancel", "error", "none"
)
[docs] def normal_drag_over(self, event):
""" Handle dragging over the component
"""
if event.handled:
return
try:
result = self.get_drag_result((event.x, event.y), event.obj)
if result is not None:
event.window.set_drag_result(result)
event.handled = True
except Exception:
event.window.set_drag_result("error")
raise
[docs] def normal_dropped_on(self, event):
if event.handled:
return
position = (event.x, event.y)
if self.accept_drop(position, event.obj):
self.handle_drop(position, event.obj)
event.handled = True
[docs] def get_drag_result(self, position, obj):
""" The type of drag that will happen
By default, if the dragged objects are available this method calls
accept_drop() and returns "none" if the result is False, otherwise
it returns the value of default_drag_result.
Parameters
----------
position :
The coordinates of the drag over event
obj : any
The object(s) being dragged, if available. Some backends (such as
Wx) may not be able to provide the object being dragged, in which
case `obj` will be `None`.
Returns
-------
Either None, if the drop should be ignored by this tool and not
handled, or one of the keys of DRAG_RESULTS_MAP: "none", "copy, "move",
"link", "cancel" or "error".
"""
if obj is not None:
# if we have the object, see if we can accept
if not self.accept_drop(position, obj):
return None
return self.default_drag_result
[docs] def accept_drop(self, position, obj):
""" Whether or not to accept the drop
Subclasses should override this method.
Parameters
----------
position :
The coordinates of the drag over event
obj : any
The object(s) being dragged, if available. Some backends (such as
Wx) may not be able to provide the object being dragged, in which
case `obj` will be `None`.
Returns
-------
True if the drop should be accepted, False otherwise.
"""
raise NotImplementedError
[docs] def handle_drop(self, position, obj):
""" Handle objects being dropped on the component
Subclasses should override this method.
Parameters
----------
position :
The coordinates of the drag over event
obj : any
The object(s) being dragged.
"""
raise NotImplementedError