Simplify GroupPlacementTool

This commit is contained in:
Arjan Molenaar 2010-06-29 08:03:34 +02:00
parent 984c26dd3c
commit 517f50974e
2 changed files with 9 additions and 109 deletions

View File

@ -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())

View File

@ -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):