Skip to content

Commit

Permalink
First pass at synching Gaphor with Gaphas 3
Browse files Browse the repository at this point in the history
  • Loading branch information
amolenaar committed Oct 27, 2020
1 parent 747fdfb commit 48479f7
Show file tree
Hide file tree
Showing 23 changed files with 1,292 additions and 1,276 deletions.
2 changes: 1 addition & 1 deletion gaphor/SysML/blocks/proxyport.py
Expand Up @@ -98,7 +98,7 @@ def save(self, save_func):

def load(self, name, value):
if name == "matrix":
self.matrix = ast.literal_eval(value)
self.matrix.set(*ast.literal_eval(value))
elif name == "connection":
self._load_connection = value
else:
Expand Down
2 changes: 1 addition & 1 deletion gaphor/UML/actions/actionseditors.py
Expand Up @@ -20,7 +20,7 @@ def escape():
return False

join_spec = subject.joinSpec or ""
box = view.get_item_bounding_box(view.hovered_item)
box = view.get_item_bounding_box(view.selection.hovered_item)
entry = popup_entry(join_spec, update_text)
show_popover(entry, view, box, escape)
return True
2 changes: 1 addition & 1 deletion gaphor/UML/actions/activitynodes.py
Expand Up @@ -254,7 +254,7 @@ def save(self, save_func):

def load(self, name, value):
if name == "matrix":
self.matrix = ast.literal_eval(value)
self.matrix.set(*ast.literal_eval(value))
elif name == "height":
self._handles[1].pos.y = ast.literal_eval(value)
elif name == "combined":
Expand Down
2 changes: 1 addition & 1 deletion gaphor/UML/classes/classeseditors.py
Expand Up @@ -64,7 +64,7 @@ def escape():
item.subject.name = text

entry = popup_entry(text, update_text)
box = editable_text_box(view, view.hovered_item)
box = editable_text_box(view, view.selection.hovered_item)

show_popover(entry, view, box, escape)
return True
2 changes: 1 addition & 1 deletion gaphor/UML/interactions/executionspecification.py
Expand Up @@ -103,7 +103,7 @@ def save_connection(name, handle):

def load(self, name, value):
if name == "matrix":
self.matrix = ast.literal_eval(value)
self.matrix.set(*ast.literal_eval(value))
elif name == "points":
points = ast.literal_eval(value)
for h, p in zip(self.handles(), points):
Expand Down
13 changes: 8 additions & 5 deletions gaphor/UML/interactions/lifeline.py
Expand Up @@ -28,7 +28,8 @@
)
from gaphas.geometry import distance_line_point
from gaphas.item import SE, SW
from gaphas.solver import STRONG
from gaphas.position import MatrixProjection
from gaphas.solver import STRONG, MultiConstraint

from gaphor import UML
from gaphor.diagram.presentation import ElementPresentation, Named
Expand All @@ -42,11 +43,12 @@ class LifetimePort(LinePort):
def constraint(self, canvas, item, handle, glue_item):
"""Create connection line constraint between item's handle and the
port."""
line = canvas.project(glue_item, self.start, self.end)
point = canvas.project(item, handle.pos)
start = MatrixProjection(self.start, glue_item.matrix_i2c)
end = MatrixProjection(self.end, glue_item.matrix_i2c)
point = MatrixProjection(handle.pos, item.matrix_i2c)

x, y = canvas.get_matrix_i2c(item).transform_point(*handle.pos)
x, y = canvas.get_matrix_c2i(glue_item).transform_point(x, y)
x, y = canvas.get_matrix_i2c(glue_item).inverse().transform_point(x, y)

# keep message at the same distance from head or bottom of lifetime
# line depending on situation
Expand All @@ -57,7 +59,8 @@ def constraint(self, canvas, item, handle, glue_item):
else:
delta = y - self.end.y
align = 1
return LineAlignConstraint(line, point, align, delta)
line = LineAlignConstraint((start, end), point, align, delta)
return MultiConstraint(start, end, point, line)


class LifetimeItem:
Expand Down
14 changes: 7 additions & 7 deletions gaphor/core/modeling/diagram.py
Expand Up @@ -205,10 +205,10 @@ def state(self) -> Sequence[str]:
if view:
item = self.item
return (
"active" if item in view.selected_items else "",
"focus" if item is view.focused_item else "",
"hover" if item is view.hovered_item else "",
"drop" if item is view.dropzone_item else "",
"active" if item in view.selection.selected_items else "",
"focus" if item is view.selection.focused_item else "",
"hover" if item is view.selection.hovered_item else "",
"drop" if item is view.selection.dropzone_item else "",
)
return ()

Expand Down Expand Up @@ -279,13 +279,13 @@ def reparent(self, item, parent):
if old_parent:
super().reparent(item, None)
m = self.get_matrix_i2c(old_parent)
item.matrix *= m
item.matrix.set(*item.matrix.multiply(m))
old_parent.request_update()

if parent:
super().reparent(item, parent)
m = self.get_matrix_c2i(parent)
item.matrix *= m
m = self.get_matrix_i2c(parent).inverse()
item.matrix.set(*item.matrix.multiply(m))
parent.request_update()


Expand Down
3 changes: 2 additions & 1 deletion gaphor/diagram/connectors.py
Expand Up @@ -8,7 +8,8 @@

from typing import List, Optional, Type, TypeVar, Union

from gaphas.canvas import Canvas, Connection
from gaphas.canvas import Canvas
from gaphas.connections import Connection
from gaphas.connector import Handle, Port
from generic.multidispatch import FunctionDispatcher, multidispatch
from typing_extensions import Protocol
Expand Down
31 changes: 15 additions & 16 deletions gaphor/diagram/diagramtools.py
Expand Up @@ -130,7 +130,7 @@ class TextEditTool(Tool):

def on_key_press(self, event):
view = self.view
item = view.hovered_item
item = view.selection.hovered_item
if (
item
and event.type == Gdk.EventType.KEY_PRESS
Expand All @@ -141,7 +141,7 @@ def on_key_press(self, event):

def on_double_click(self, event):
view = self.view
item = view.hovered_item
item = view.selection.hovered_item
if item:
x, y = view.get_matrix_v2i(item).transform_point(event.x, event.y)
return InlineEditor(item, view, (x, y))
Expand Down Expand Up @@ -202,7 +202,7 @@ def create_item(self, pos):

def on_button_press(self, event):
view = self.view
view.unselect_all()
view.selection.unselect_all()
if super().on_button_press(event):
try:
opposite = self.new_item.opposite(
Expand All @@ -215,8 +215,7 @@ def on_button_press(self, event):
# mechanisms

# First make sure all matrices are updated:
view.canvas.update_matrices([self.new_item])
view.update_matrix(self.new_item)
self.new_item.matrix_i2c.set(*view.canvas.get_matrix_i2c(self.new_item))

vpos = event.x, event.y

Expand Down Expand Up @@ -247,16 +246,16 @@ def on_motion_notify(self, event):
# create dummy adapter
adapter = Group(parent, self._factory.item_class())
if adapter and adapter.can_contain():
view.dropzone_item = parent
view.selection.set_dropzone_item(parent)
self._parent = parent
else:
view.dropzone_item = None
view.selection.set_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
if view.selection.dropzone_item:
view.selection.dropzone_item.request_update(matrix=False)
view.selection.set_dropzone_item(None)

def _create_item(self, pos):
"""Create diagram item and place it within parent's boundaries."""
Expand All @@ -267,7 +266,7 @@ def _create_item(self, pos):
item = super()._create_item(pos, diagram=diagram, parent=parent)
finally:
self._parent = None
view.dropzone_item = None
view.selection.set_dropzone_item(None)
return item


Expand All @@ -287,21 +286,21 @@ def move(self, pos):
over_item = view.get_item_at_point((x, y), selected=False)

if not over_item:
view.dropzone_item = None
view.selection.set_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
view.selection.set_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
view.selection.set_dropzone_item(over_item)
over_item.request_update(matrix=False)

def stop_move(self):
Expand All @@ -311,7 +310,7 @@ def stop_move(self):
view = self.view
canvas = view.canvas
old_parent = view.canvas.get_parent(item)
new_parent = view.dropzone_item
new_parent = view.selection.dropzone_item
try:

if new_parent is old_parent:
Expand All @@ -337,7 +336,7 @@ def stop_move(self):

new_parent.request_update()
finally:
view.dropzone_item = None
view.selection.set_dropzone_item(None)


class TransactionalToolChain(ToolChain):
Expand Down
2 changes: 1 addition & 1 deletion gaphor/diagram/general/generaleditors.py
Expand Up @@ -32,7 +32,7 @@ def escape():
buffer.connect("changed", lambda _: update_text())

text_view = Gtk.TextView.new_with_buffer(buffer)
box = view.get_item_bounding_box(view.hovered_item)
box = view.get_item_bounding_box(view.selection.hovered_item)

frame = Gtk.Frame()
frame.add(text_view)
Expand Down
6 changes: 3 additions & 3 deletions gaphor/diagram/general/simpleitem.py
Expand Up @@ -28,7 +28,7 @@ def load(self, name, value):
if name == "horizontal":
self.horizontal = ast.literal_eval(value)
elif name == "matrix":
self.matrix = ast.literal_eval(value)
self.matrix.set(*ast.literal_eval(value))
elif name == "orthogonal":
self._load_orthogonal = ast.literal_eval(value)
elif name == "points":
Expand Down Expand Up @@ -70,7 +70,7 @@ def save(self, save_func):

def load(self, name, value):
if name == "matrix":
self.matrix = ast.literal_eval(value)
self.matrix.set(*ast.literal_eval(value))
elif name == "width":
self.width = ast.literal_eval(value)
elif name == "height":
Expand Down Expand Up @@ -99,7 +99,7 @@ def save(self, save_func):

def load(self, name, value):
if name == "matrix":
self.matrix = ast.literal_eval(value)
self.matrix.set(*ast.literal_eval(value))
elif name == "width":
self.width = ast.literal_eval(value)
elif name == "height":
Expand Down
4 changes: 2 additions & 2 deletions gaphor/diagram/inlineeditors.py
Expand Up @@ -36,9 +36,9 @@ def update_text(text):
if not subject:
return False

box = editable_text_box(view, view.hovered_item)
box = editable_text_box(view, view.selection.hovered_item)
if not box:
box = view.get_item_bounding_box(view.hovered_item)
box = view.get_item_bounding_box(view.selection.hovered_item)
name = subject.name or ""
entry = popup_entry(name, update_text)

Expand Down
15 changes: 9 additions & 6 deletions gaphor/diagram/painter.py
Expand Up @@ -10,6 +10,7 @@

from cairo import LINE_JOIN_ROUND
from gaphas.painter import Painter
from gaphas.view import GtkView, Selection

from gaphor.core.modeling.diagram import DrawContext, StyledItem

Expand All @@ -26,17 +27,19 @@ def draw_item(self, item, cairo):
diagram = item.diagram
cairo.save()
try:
cairo.set_matrix(view.matrix)
cairo.transform(view.canvas.get_matrix_i2c(item))
cairo.set_matrix(view.matrix.to_cairo())
cairo.transform(view.canvas.get_matrix_i2c(item).to_cairo())

selection = view.selection if isinstance(view, GtkView) else Selection()

item.draw(
DrawContext(
cairo=cairo,
style=diagram.style(StyledItem(item, view)),
selected=(item in view.selected_items),
focused=(item is view.focused_item),
hovered=(item is view.hovered_item),
dropzone=(item is view.dropzone_item),
selected=(item in selection.selected_items),
focused=(item is selection.focused_item),
hovered=(item is selection.hovered_item),
dropzone=(item is selection.dropzone_item),
)
)

Expand Down
4 changes: 2 additions & 2 deletions gaphor/diagram/presentation.py
Expand Up @@ -129,7 +129,7 @@ def save(self, save_func):

def load(self, name, value):
if name == "matrix":
self.matrix = ast.literal_eval(value)
self.matrix.set(*ast.literal_eval(value))
elif name in ("width", "height"):
setattr(self, name, ast.literal_eval(value))
else:
Expand Down Expand Up @@ -242,7 +242,7 @@ def save_connection(name, handle):

def load(self, name, value):
if name == "matrix":
self.matrix = ast.literal_eval(value)
self.matrix.set(*ast.literal_eval(value))
elif name == "points":
points = ast.literal_eval(value)
for _ in range(len(points) - 2):
Expand Down
3 changes: 2 additions & 1 deletion gaphor/plugins/diagramexport/__init__.py
Expand Up @@ -4,9 +4,10 @@
import os

import cairo
from gaphas.canvas import Context
from gaphas.freehand import FreeHandPainter
from gaphas.painter import BoundingBoxPainter
from gaphas.view import Context, View
from gaphas.view import View

from gaphor.abc import ActionProvider, Service
from gaphor.core import action, gettext
Expand Down
6 changes: 3 additions & 3 deletions gaphor/services/copyservice.py
Expand Up @@ -80,7 +80,7 @@ def copy_action(self):
if view.is_focus():
self.clipboard_semaphore += 1
self.clipboard.set_text("", -1)
items = view.selected_items
items = view.selection.selected_items
self.copy(items)

@action(name="edit-cut", shortcut="<Primary>x")
Expand All @@ -89,7 +89,7 @@ def cut_action(self):
if view.is_focus():
self.clipboard_semaphore += 1
self.clipboard.set_text("", -1)
items = view.selected_items
items = view.selection.selected_items
self.copy(items)
for i in list(items):
i.unlink()
Expand All @@ -106,7 +106,7 @@ def paste_action(self):

new_items = self.paste(diagram)

view.unselect_all()
view.selection.unselect_all()

for item in new_items:
view.select_item(item)
Expand Down
5 changes: 3 additions & 2 deletions gaphor/storage/tests/test_storage.py
Expand Up @@ -188,8 +188,9 @@ def test_save_and_load_of_association_with_two_connected_classes(self):
c1 = self.create(ClassItem, UML.Class)
c2 = self.create(ClassItem, UML.Class)
c2.matrix.translate(200, 200)
self.diagram.canvas.update_matrix(c2)
assert tuple(self.diagram.canvas.get_matrix_i2c(c2)) == (1, 0, 0, 1, 200, 200)
self.diagram.canvas.request_update(c2)
self.diagram.canvas.update_now()
assert tuple(c2.matrix_i2c) == (1, 0, 0, 1, 200, 200)

a = self.create(AssociationItem)

Expand Down

0 comments on commit 48479f7

Please sign in to comment.