Simplify GroupPlacementTool
This commit is contained in:
parent
984c26dd3c
commit
517f50974e
@ -31,6 +31,7 @@ class DiagramItemConnector(Connector.default):
|
||||
It also adds handles to lines when a line is grabbed on the middle of
|
||||
a line segment (points are drawn by the LineSegmentPainter).
|
||||
"""
|
||||
|
||||
def allow(self, sink):
|
||||
adapter = component.queryMultiAdapter((sink.item, self.item), IConnect)
|
||||
return adapter and adapter.allow(self.handle, sink.port)
|
||||
@ -313,8 +314,6 @@ def DefaultTool():
|
||||
"""
|
||||
The default tool chain build from HoverTool, ItemTool and HandleTool.
|
||||
"""
|
||||
from gaphor.ui.groupingtools import GroupItemTool
|
||||
|
||||
chain = TransactionalToolChain()
|
||||
chain.append(HoverTool())
|
||||
chain.append(ConnectHandleTool())
|
||||
|
@ -24,7 +24,6 @@ class GroupPlacementTool(PlacementTool):
|
||||
super(GroupPlacementTool, self).__init__(view,
|
||||
item_factory, after_handler, handle_index)
|
||||
self._parent = None
|
||||
self._adapter = None
|
||||
|
||||
|
||||
def on_motion_notify(self, event):
|
||||
@ -33,8 +32,6 @@ class GroupPlacementTool(PlacementTool):
|
||||
object to be created.
|
||||
"""
|
||||
view = self.view
|
||||
parent = None
|
||||
self._adapter = None
|
||||
|
||||
if view.focused_item:
|
||||
view.unselect_item(view.focused_item)
|
||||
@ -43,17 +40,15 @@ class GroupPlacementTool(PlacementTool):
|
||||
try:
|
||||
parent = view.get_item_at_point((event.x, event.y))
|
||||
except KeyError:
|
||||
# No bounding box yet.
|
||||
return
|
||||
|
||||
self._parent = parent
|
||||
parent = None
|
||||
|
||||
if parent:
|
||||
# create dummy adapter
|
||||
adapter = component.queryMultiAdapter((parent, self._factory.item_class()), IGroup)
|
||||
if adapter and adapter.can_contain():
|
||||
view.dropzone_item = parent
|
||||
view.window.set_cursor(IN_CURSOR)
|
||||
self._adapter = adapter
|
||||
self._parent = parent
|
||||
else:
|
||||
view.dropzone_item = None
|
||||
view.window.set_cursor(None)
|
||||
@ -73,14 +68,15 @@ class GroupPlacementTool(PlacementTool):
|
||||
parent = self._parent
|
||||
view = self.view
|
||||
try:
|
||||
if parent and self._adapter:
|
||||
adapter = component.queryMultiAdapter((parent, self._factory.item_class()), IGroup)
|
||||
if parent and adapter and adapter.can_contain():
|
||||
kw['parent'] = parent
|
||||
|
||||
item = super(GroupPlacementTool, self)._create_item(pos, **kw)
|
||||
|
||||
if parent and item and self._adapter:
|
||||
self._adapter.item = item
|
||||
self._adapter.group()
|
||||
adapter = component.queryMultiAdapter((parent, item), IGroup)
|
||||
if parent and item and adapter:
|
||||
adapter.group()
|
||||
|
||||
canvas = view.canvas
|
||||
parent.request_update(matrix=False)
|
||||
@ -91,101 +87,6 @@ class GroupPlacementTool(PlacementTool):
|
||||
return item
|
||||
|
||||
|
||||
class GroupItemTool(ItemTool):
|
||||
"""
|
||||
Group diagram item by dropping it on another item.
|
||||
|
||||
Works only for one selected item, now.
|
||||
"""
|
||||
|
||||
def on_motion_notify(self, event):
|
||||
"""
|
||||
Indicate possibility of grouping/ungrouping of selected item.
|
||||
"""
|
||||
super(GroupItemTool, self).on_motion_notify(event)
|
||||
view = self.view
|
||||
|
||||
if event.state & gtk.gdk.BUTTON_PRESS_MASK and len(view.selected_items) == 1:
|
||||
item = list(view.selected_items)[0]
|
||||
parent = view.canvas.get_parent(item)
|
||||
|
||||
over = view.get_item_at_point((event.x, event.y), selected=False)
|
||||
assert over is not item
|
||||
|
||||
if over is parent: # do nothing when item is over parent
|
||||
view.dropzone_item = None
|
||||
view.window.set_cursor(None)
|
||||
return
|
||||
|
||||
if parent and not over: # are we going to remove from parent?
|
||||
adapter = component.queryMultiAdapter((parent, item), IGroup)
|
||||
if adapter:
|
||||
view.window.set_cursor(OUT_CURSOR)
|
||||
view.dropzone_item = parent
|
||||
parent.request_update(matrix=False)
|
||||
|
||||
if over: # are we going to add to parent?
|
||||
adapter = component.queryMultiAdapter((over, item), IGroup)
|
||||
if adapter and adapter.can_contain():
|
||||
view.dropzone_item = over
|
||||
view.window.set_cursor(IN_CURSOR)
|
||||
over.request_update(matrix=False)
|
||||
|
||||
|
||||
def on_button_release(self, event):
|
||||
"""
|
||||
Group item if it is dropped on parent's item. Ungroup item if it is
|
||||
moved out of its parent boundaries. Method also moves item from old
|
||||
parent to new one (regrouping).
|
||||
"""
|
||||
super(GroupItemTool, self).on_button_release(event)
|
||||
view = self.view
|
||||
try:
|
||||
if event.button == 1 and len(view.selected_items) == 1:
|
||||
item = list(view.selected_items)[0]
|
||||
parent = view.canvas.get_parent(item)
|
||||
over = view.get_item_at_point((event.x, event.y), selected=False)
|
||||
assert over is not item
|
||||
|
||||
if over is parent:
|
||||
if parent is not None:
|
||||
parent.request_update(matrix=False)
|
||||
return
|
||||
|
||||
if parent: # remove from parent
|
||||
adapter = component.queryMultiAdapter((parent, item), IGroup)
|
||||
if adapter:
|
||||
adapter.ungroup()
|
||||
|
||||
canvas = view.canvas
|
||||
canvas.reparent(item, None)
|
||||
|
||||
# reset item's position
|
||||
px, py = canvas.get_matrix_c2i(parent).transform_point(0, 0)
|
||||
item.matrix.translate(-px, -py)
|
||||
parent.request_update()
|
||||
|
||||
|
||||
if over: # add to over (over becomes parent)
|
||||
adapter = component.queryMultiAdapter((over, item), IGroup)
|
||||
if adapter and adapter.can_contain():
|
||||
adapter.group()
|
||||
|
||||
canvas = view.canvas
|
||||
canvas.reparent(item, over)
|
||||
|
||||
# reset item's position
|
||||
x, y = canvas.get_matrix_i2c(over).transform_point(0, 0)
|
||||
item.matrix.translate(-x, -y)
|
||||
over.request_update()
|
||||
finally:
|
||||
item = view.dropzone_item
|
||||
view.dropzone_item = None
|
||||
view.window.set_cursor(None)
|
||||
if item:
|
||||
item.request_update()
|
||||
|
||||
|
||||
@InMotion.when_type(ElementItem)
|
||||
class DropZoneInMotion(GuidedItemInMotion):
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user