Add more types to tools

This commit is contained in:
Arjan Molenaar 2020-11-10 08:12:43 +01:00
parent d12ee26c2b
commit 3230a82fc5
7 changed files with 70 additions and 11 deletions

View File

@ -517,7 +517,7 @@ Tool for placing items on the Canvas.
```python ```python
def on_clicked(button): def on_clicked(button):
view.tool.grab(PlacementTool(view, factory(view, MyLine), HandleTool(), 1)) view.tool.grab(PlacementTool(view, factory(view, MyLine), HandleTool(view), 1))
``` ```
#### Class: `gaphas.aspects.ItemFinder` #### Class: `gaphas.aspects.ItemFinder`

View File

@ -339,7 +339,7 @@ Tool for placing items on the Canvas.
.. code-block: python .. code-block: python
def on_clicked(button): def on_clicked(button):
view.tool.grab(PlacementTool(view, factory(view, MyLine), HandleTool, 1)) view.tool.grab(PlacementTool(view, factory(view, MyLine), HandleTool(view), 1))
Class: ``gaphas.aspects.ItemFinder`` Class: ``gaphas.aspects.ItemFinder``
------ ------

View File

@ -142,7 +142,7 @@ def create_window(canvas, title, zoom=1.0): # noqa too complex
def on_add_box_clicked(button, view): def on_add_box_clicked(button, view):
# view.window.set_cursor(Gdk.Cursor.new(Gdk.CursorType.CROSSHAIR)) # view.window.set_cursor(Gdk.Cursor.new(Gdk.CursorType.CROSSHAIR))
view.tool.grab(PlacementTool(view, factory(view, MyBox), HandleTool, 2)) view.tool.grab(PlacementTool(view, factory(view, MyBox), HandleTool(view), 2))
b.connect("clicked", on_add_box_clicked, view) b.connect("clicked", on_add_box_clicked, view)
v.add(b) v.add(b)
@ -150,7 +150,7 @@ def create_window(canvas, title, zoom=1.0): # noqa too complex
b = Gtk.Button.new_with_label("Add line") b = Gtk.Button.new_with_label("Add line")
def on_add_line_clicked(button): def on_add_line_clicked(button):
view.tool.grab(PlacementTool(view, factory(view, MyLine), HandleTool, 1)) view.tool.grab(PlacementTool(view, factory(view, MyLine), HandleTool(view), 1))
b.connect("clicked", on_add_line_clicked) b.connect("clicked", on_add_line_clicked)
v.add(b) v.add(b)

View File

@ -1,15 +1,34 @@
from typing import Optional, Tuple from typing import Optional, Tuple
from gi.repository import Gdk from gi.repository import Gdk
from typing_extensions import Protocol
from gaphas.aspect import Connector, HandleFinder, HandleInMotion, HandleSelection from gaphas.aspect import Connector, HandleFinder, HandleInMotion, HandleSelection
from gaphas.connector import Handle from gaphas.connector import Handle
from gaphas.item import Item from gaphas.item import Item
from gaphas.tool.tool import Tool from gaphas.tool.tool import Tool
from gaphas.view import GtkView
Pos = Tuple[float, float] Pos = Tuple[float, float]
class HandleInMotionType(Protocol):
def __init__(self, item: Item, handle: Handle, view: GtkView):
...
def start_move(self, pos: Pos):
...
def move(self, pos: Pos):
...
def stop_move(self):
...
def glue(self, pos: Pos, distance: float = 0):
...
class HandleTool(Tool): class HandleTool(Tool):
"""Tool for moving handles around. """Tool for moving handles around.
@ -21,7 +40,7 @@ class HandleTool(Tool):
super().__init__(view) super().__init__(view)
self.grabbed_handle: Optional[Handle] = None self.grabbed_handle: Optional[Handle] = None
self.grabbed_item: Optional[Item] = None self.grabbed_item: Optional[Item] = None
self.motion_handle = None self.motion_handle: Optional[HandleInMotionType] = None
def grab_handle(self, item: Item, handle: Handle): def grab_handle(self, item: Item, handle: Handle):
"""Grab a specific handle. """Grab a specific handle.

View File

@ -1,7 +1,28 @@
from typing import Set, Tuple
from gi.repository import Gdk from gi.repository import Gdk
from typing_extensions import Protocol
from gaphas.aspect import InMotion, Selection from gaphas.aspect import InMotion, Selection
from gaphas.item import Item
from gaphas.tool.tool import Tool from gaphas.tool.tool import Tool
from gaphas.view import GtkView
Pos = Tuple[float, float]
class InMotionType(Protocol):
def __init__(self, item: Item, view: GtkView):
...
def start_move(self, pos: Pos):
...
def move(self, pos: Pos):
...
def stop_move(self):
...
class ItemTool(Tool): class ItemTool(Tool):
@ -16,7 +37,7 @@ class ItemTool(Tool):
def __init__(self, view, buttons=(1,)): def __init__(self, view, buttons=(1,)):
super().__init__(view) super().__init__(view)
self._buttons = buttons self._buttons = buttons
self._movable_items = set() self._movable_items: Set[InMotionType] = set()
def get_item(self): def get_item(self):
return self.view.selection.hovered_item return self.view.selection.hovered_item

View File

@ -1,16 +1,35 @@
from typing import Callable
from typing_extensions import Protocol
from gaphas.connector import Handle
from gaphas.item import Item
from gaphas.tool.tool import Tool from gaphas.tool.tool import Tool
from gaphas.view import GtkView
FactoryType = Callable[..., Item] # type: ignore[misc]
class HandleToolType(Protocol):
def grab_handle(self, new_item: Item, handle: Handle):
...
class PlacementTool(Tool): class PlacementTool(Tool):
def __init__(self, view, factory, handle_tool, handle_index): def __init__(
self,
view: GtkView,
factory: FactoryType,
handle_tool: HandleToolType,
handle_index: int,
):
super().__init__(view) super().__init__(view)
self._factory = factory self._factory = factory
self.handle_tool = handle_tool(view) self.handle_tool = handle_tool
self._handle_index = handle_index self._handle_index = handle_index
self._new_item = None self._new_item = None
self.grabbed_handle = None self.grabbed_handle = None
# handle_tool = property(lambda s: s._handle_tool, doc="Handle tool")
handle_index = property( handle_index = property(
lambda s: s._handle_index, doc="Index of handle to be used by handle_tool" lambda s: s._handle_index, doc="Index of handle to be used by handle_tool"
) )

View File

@ -50,7 +50,7 @@ class Tool:
def __init__(self, view: GtkView): def __init__(self, view: GtkView):
self.view = view self.view = view
def _dispatch(self, event): def _dispatch(self, event: Gdk.Event):
"""Deal with the event. """Deal with the event.
The event is dispatched to a specific handler for the event The event is dispatched to a specific handler for the event
@ -66,7 +66,7 @@ class Tool:
return bool(h(event)) return bool(h(event))
return False return False
def handle(self, event): def handle(self, event: Gdk.Event):
return self._dispatch(event) return self._dispatch(event)
def draw(self, context): def draw(self, context):