class TransactionalToolChain(ToolChain): """ In addition to a normal toolchain, this chain begins an undo-transaction at button-press and commits the transaction at button-release. """ def __init__(self, event_manager, view=None): super().__init__(view) self.event_manager = event_manager self._tx = None def handle(self, event): # For double click: button_press, double_click, button_release # print 'event', self.EVENT_HANDLERS.get(event.type) if self.EVENT_HANDLERS.get(event.type) in ("on_button_press", ): assert not self._tx self._tx = Transaction(self.event_manager) try: return super().handle(event) finally: if self._tx and self.EVENT_HANDLERS.get(event.type) in ( "on_button_release", "on_double_click", "on_triple_click", ): self._tx.commit() self._tx = None
class TransactionalToolChain(ToolChain): """ In addition to a normal toolchain, this chain begins an undo-transaction at button-press and commits the transaction at button-release. """ def __init__(self, view=None): super(TransactionalToolChain, self).__init__(view) self._tx = None def handle(self, event): # For double click: button_press, double_click, button_release # print 'event', self.EVENT_HANDLERS.get(event.type) if self.EVENT_HANDLERS.get(event.type) in ("on_button_press",): assert not self._tx self._tx = Transaction() try: super(TransactionalToolChain, self).handle(event) finally: if self._tx and self.EVENT_HANDLERS.get(event.type) in ( "on_button_release", "on_double_click", "on_triple_click", ): self._tx.commit() self._tx = None
class PlacementTool(_PlacementTool): """ PlacementTool is used to place items on the canvas. """ def __init__(self, view, item_factory, after_handler=None, handle_index=-1): """ item_factory is a callable. It is used to create a CanvasItem that is displayed on the diagram. """ _PlacementTool.__init__(self, view, factory=item_factory, handle_tool=ConnectHandleTool(), handle_index=handle_index) self.after_handler = after_handler self._tx = None @transactional def create_item(self, pos): return self._create_item(pos) def on_button_press(self, event): assert not self._tx self._tx = Transaction() view = self.view view.unselect_all() if _PlacementTool.on_button_press(self, event): try: opposite = self.new_item.opposite( self.new_item.handles()[self._handle_index]) except (KeyError, AttributeError): pass else: # Connect opposite handle first, using the HandleTool's # mechanisms # First make sure all matrices are updated: view.canvas.update_matrix(self.new_item) view.update_matrix(self.new_item) vpos = event.x, event.y item = self.handle_tool.glue(self.new_item, opposite, vpos) if item: self.handle_tool.connect(self.new_item, opposite, vpos) return True return False def on_button_release(self, event): try: if self.after_handler: self.after_handler(self.new_item) return _PlacementTool.on_button_release(self, event) finally: self._tx.commit() self._tx = None
class PlacementTool(_PlacementTool): """ PlacementTool is used to place items on the canvas. """ def __init__(self, view, item_factory, after_handler=None, handle_index=-1): """ item_factory is a callable. It is used to create a CanvasItem that is displayed on the diagram. """ _PlacementTool.__init__( self, view, factory=item_factory, handle_tool=ConnectHandleTool(), handle_index=handle_index, ) self.after_handler = after_handler self._tx = None @transactional def create_item(self, pos): return self._create_item(pos) def on_button_press(self, event): assert not self._tx self._tx = Transaction() view = self.view view.unselect_all() if _PlacementTool.on_button_press(self, event): try: opposite = self.new_item.opposite( self.new_item.handles()[self._handle_index] ) except (KeyError, AttributeError): pass else: # Connect opposite handle first, using the HandleTool's # mechanisms # First make sure all matrices are updated: view.canvas.update_matrix(self.new_item) view.update_matrix(self.new_item) vpos = event.x, event.y item = self.handle_tool.glue(self.new_item, opposite, vpos) if item: self.handle_tool.connect(self.new_item, opposite, vpos) return True return False def on_button_release(self, event): try: if self.after_handler: self.after_handler(self.new_item) return _PlacementTool.on_button_release(self, event) finally: self._tx.commit() self._tx = None