def move(self, pos): """ Move the item. x and y are in view coordinates. """ super(DropZoneInMotion, self).move(pos) item = self.item view = self.view x, y = pos current_parent = view.canvas.get_parent(item) over_item = view.get_item_at_point((x, y), selected=False) if not over_item: view.dropzone_item = None view.window.set_cursor(None) return if current_parent and not over_item: # are we going to remove from parent? adapter = Group(current_parent, item) if adapter: view.window.set_cursor(OUT_CURSOR) view.dropzone_item = current_parent current_parent.request_update(matrix=False) if over_item: # are we going to add to parent? adapter = Group(over_item, item) if adapter and adapter.can_contain(): view.dropzone_item = over_item view.window.set_cursor(IN_CURSOR) over_item.request_update(matrix=False)
def on_motion_notify(self, event): """ Change parent item to dropzone state if it can accept diagram item object to be created. """ view = self.view if view.focused_item: view.unselect_item(view.focused_item) view.focused_item = None try: parent = view.get_item_at_point((event.x, event.y)) except KeyError: parent = None if parent: # create dummy adapter adapter = Group(parent, self._factory.item_class()) if adapter and adapter.can_contain(): view.dropzone_item = parent cursor = Gdk.Cursor.new_for_display( view.get_window().get_display(), IN_CURSOR_TYPE) view.get_window().set_cursor(cursor) self._parent = parent else: view.dropzone_item = None view.get_window().set_cursor(None) self._parent = None parent.request_update(matrix=False) else: if view.dropzone_item: view.dropzone_item.request_update(matrix=False) view.dropzone_item = None view.get_window().set_cursor(None)
def stop_move(self): """Motion stops: drop!""" super().stop_move() item = self.item view = self.view canvas = view.canvas old_parent = view.canvas.get_parent(item) new_parent = view.dropzone_item try: if new_parent is old_parent: if old_parent is not None: old_parent.request_update(matrix=False) return if old_parent: canvas.reparent(item, None) adapter = Group(old_parent, item) if adapter: adapter.ungroup() old_parent.request_update() if new_parent: canvas.reparent(item, new_parent) adapter = Group(new_parent, item) if adapter and adapter.can_contain(): adapter.group() new_parent.request_update() finally: view.dropzone_item = None
def on_motion_notify(self, event): """Change parent item to dropzone state if it can accept diagram item object to be created.""" if self.grabbed_handle: return self.handle_tool.on_motion_notify(event) view = self.view try: parent = view.get_item_at_point((event.x, event.y)) except KeyError: parent = None if parent: # create dummy adapter adapter = Group(parent, self._factory.item_class()) if adapter and adapter.can_contain(): view.dropzone_item = parent self._parent = parent else: view.dropzone_item = None self._parent = None parent.request_update(matrix=False) else: if view.dropzone_item: view.dropzone_item.request_update(matrix=False) view.dropzone_item = None
def move(self, pos): """Move the item. x and y are in view coordinates. """ super().move(pos) item = self.item view = self.view x, y = pos current_parent = view.canvas.get_parent(item) over_item = view.get_item_at_point((x, y), selected=False) if not over_item: view.dropzone_item = None return if current_parent and not over_item: # are we going to remove from parent? group = Group(current_parent, item) if group: view.dropzone_item = current_parent current_parent.request_update(matrix=False) if over_item: # are we going to add to parent? group = Group(over_item, item) if group and group.can_contain(): view.dropzone_item = over_item over_item.request_update(matrix=False)
def stop_move(self, pos): """Motion stops: drop!""" super().stop_move(pos) item = self.item view = self.view old_parent = item.parent new_parent = view.selection.dropzone_item try: if new_parent is old_parent: if old_parent is not None: old_parent.request_update(matrix=False) return if old_parent: item.parent = None adapter = Group(old_parent, item) if adapter: adapter.ungroup() old_parent.request_update() if new_parent: item.parent = new_parent adapter = Group(new_parent, item) if adapter and adapter.can_contain(): adapter.group() new_parent.request_update() finally: view.selection.dropzone_item = None
def item_factory(diagram, parent=None): if subject_class: element_factory = diagram.model subject = element_factory.create(subject_class) else: subject = None item = diagram.create(item_class, subject=subject) if config_func: config_func(item) adapter = Group(parent, item) if parent and adapter.can_contain(): adapter.group() diagram.canvas.reparent(item, parent=parent) return item
def stop_move(self): """ Motion stops: drop! """ super(DropZoneInMotion, self).stop_move() item = self.item view = self.view canvas = view.canvas old_parent = view.canvas.get_parent(item) new_parent = view.dropzone_item try: if new_parent is old_parent: if old_parent is not None: old_parent.request_update(matrix=False) return if old_parent: adapter = Group(old_parent, item) if adapter: adapter.ungroup() canvas.reparent(item, None) m = canvas.get_matrix_i2c(old_parent) item.matrix *= m old_parent.request_update() if new_parent: adapter = Group(new_parent, item) if adapter and adapter.can_contain(): adapter.group() canvas.reparent(item, new_parent) m = canvas.get_matrix_c2i(new_parent) item.matrix *= m new_parent.request_update() finally: view.dropzone_item = None view.get_window().set_cursor(None)
def on_motion(controller, x, y, item_class): view: GtkView = controller.get_widget() model = view.model try: parent = item_at_point(view, (x, y)) except KeyError: parent = None if parent: # create dummy adapter connections = Connections() adapter = Group(parent, item_class(connections)) if adapter and adapter.can_contain(): view.selection.dropzone_item = parent else: view.selection.dropzone_item = None model.request_update(parent, matrix=False) else: if view.selection.dropzone_item: model.request_update(view.selection.dropzone_item) view.selection.dropzone_item = None
def move(self, pos): """ Move the item. x and y are in view coordinates. """ super().move(pos) item = self.item view = self.view x, y = pos current_parent = view.canvas.get_parent(item) over_item = view.get_item_at_point((x, y), selected=False) if not over_item: view.dropzone_item = None view.get_window().set_cursor(None) return if current_parent and not over_item: # are we going to remove from parent? group = Group(current_parent, item) if group: cursor = Gdk.Cursor.new_for_display( view.get_window().get_display(), OUT_CURSOR_TYPE ) view.get_window().set_cursor(cursor) view.dropzone_item = current_parent current_parent.request_update(matrix=False) if over_item: # are we going to add to parent? group = Group(over_item, item) if group and group.can_contain(): cursor = Gdk.Cursor.new_for_display( view.get_window().get_display(), IN_CURSOR_TYPE ) view.get_window().set_cursor(cursor) view.dropzone_item = over_item over_item.request_update(matrix=False)
def _create_item(self, pos): """ Create diagram item and place it within parent's boundaries. """ parent = self._parent view = self.view try: adapter = Group(parent, self._factory.item_class()) if parent and adapter and adapter.can_contain(): item = super()._create_item(pos, parent=parent) else: item = super()._create_item(pos) adapter = Group(parent, item) if parent and item and adapter: adapter.group() parent.request_update(matrix=False) finally: self._parent = None view.dropzone_item = None view.get_window().set_cursor(None) return item
def _create_item(self, pos, **kw): """ Create diagram item and place it within parent's boundaries. """ parent = self._parent view = self.view try: adapter = Group(parent, self._factory.item_class()) if parent and adapter and adapter.can_contain(): kw["parent"] = parent item = super(GroupPlacementTool, self)._create_item(pos, **kw) adapter = Group(parent, item) if parent and item and adapter: adapter.group() canvas = view.canvas parent.request_update(matrix=False) finally: self._parent = None view.dropzone_item = None view.window.set_cursor(None) return item
def can_group(self, parent, item): """ Check if an item can be grouped by parent. """ adapter = Group(parent, item) return adapter.can_contain()