Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Package Import to Toolbar #298

Merged
merged 5 commits into from
Apr 12, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
9 changes: 9 additions & 0 deletions gaphor/diagram/diagramtoolbox_actions_uml.py
Original file line number Diff line number Diff line change
Expand Up @@ -535,6 +535,15 @@ def metaclass_config(new_item):
diagram.profiles.ExtensionItem
),
),
ToolDef(
"toolbox-import",
gettext("Import"),
"gaphor-import-symbolic",
"<Shift>M",
item_factory=PlacementTool.new_item_factory(
diagram.profiles.PackageImportItem
),
),
),
),
)
2 changes: 2 additions & 0 deletions gaphor/diagram/profiles/__init__.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
from gaphor.diagram.profiles.extension import ExtensionItem
from gaphor.diagram.profiles.packageimport import PackageImportItem


def _load():
from gaphor.diagram.profiles import (
extensionconnect,
metaclasspropertypage,
packageimportconnect,
stereotypepropertypages,
)

Expand Down
22 changes: 22 additions & 0 deletions gaphor/diagram/profiles/packageimport.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
"""Profile Import dependency relationship."""

from gaphor import UML
from gaphor.diagram.presentation import LinePresentation
from gaphor.diagram.shapes import Text, draw_arrow_head
from gaphor.diagram.support import represents
from gaphor.UML.modelfactory import stereotypes_str


@represents(UML.PackageImport)
class PackageImportItem(LinePresentation):
"""Profile Import dependency relationship."""

def __init__(self, id=None, model=None):
super().__init__(id, model, style={"dash-style": (7.0, 5.0)})

self.shape_middle = Text(
text=lambda: stereotypes_str(self.subject, ("import",)),
style={"min-width": 0, "min-height": 0},
)
self.watch("subject.appliedStereotype.classifier.name")
self.draw_head = draw_arrow_head
44 changes: 44 additions & 0 deletions gaphor/diagram/profiles/packageimportconnect.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
"""Package Import connection adapters."""

from gaphor import UML
from gaphor.diagram.connectors import Connector, RelationshipConnect
from gaphor.diagram.presentation import Named
from gaphor.diagram.profiles.packageimport import PackageImportItem


@Connector.register(Named, PackageImportItem)
class PackageImportConnect(RelationshipConnect):
"""Connect an external model to a Package using an Import."""

def allow(self, handle, port):
line = self.line
element = self.element

# Element at the head should be a Package
if handle is line.head and not isinstance(element.subject, UML.Package):
return None

# Element at the tail should also be a Package
if handle is line.tail and not isinstance(element.subject, UML.Package):
return None

return super().allow(handle, port)

def reconnect(self, handle, port):
line = self.line
impl = line.subject
assert isinstance(impl, UML.Package)
self.reconnect_relationship(
handle,
UML.PackageImport.importedPackage,
UML.PackageImport.importingNamespace,
)

def connect_subject(self, handle):
"""Perform import package relationship connection."""
relation = self.relationship_or_new(
UML.PackageImport,
UML.PackageImport.importedPackage,
UML.PackageImport.importingNamespace,
)
self.line.subject = relation
47 changes: 47 additions & 0 deletions gaphor/diagram/profiles/tests/test_packageimportconnect.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
"""Package Import Item connection adapter tests."""

from gaphor import UML
from gaphor.diagram.classes.klass import ClassItem
from gaphor.diagram.classes.package import PackageItem
from gaphor.diagram.profiles.packageimport import PackageImportItem
from gaphor.diagram.tests.fixtures import allow, connect


def test_glue(element_factory, diagram):
"""Test gluing package import item."""

pkg_import = diagram.create(PackageImportItem)
package1 = diagram.create(PackageItem, subject=element_factory.create(UML.Package))
package2 = diagram.create(PackageItem, subject=element_factory.create(UML.Package))

glued = allow(pkg_import, pkg_import.tail, package1)

assert glued

connect(pkg_import, pkg_import.tail, package1)

glued = allow(pkg_import, pkg_import.head, package2)

assert glued


def test_package_glue(element_factory, diagram):
"""Test package import item can't glue to a class."""

pkg_import = diagram.create(PackageImportItem)
import_class = diagram.create(ClassItem, subject=element_factory.create(UML.Class))

glued = allow(pkg_import, pkg_import.head, import_class)

assert not glued


def test_connection(element_factory, diagram):
"""Test package import item connection."""

pkg_import = diagram.create(PackageImportItem)
package1 = diagram.create(PackageItem, subject=element_factory.create(UML.Package))
package2 = diagram.create(PackageItem, subject=element_factory.create(UML.Package))

connect(pkg_import, pkg_import.tail, package1)
connect(pkg_import, pkg_import.head, package2)
47 changes: 47 additions & 0 deletions gaphor/ui/icons/gaphor-import-symbolic.svg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.