From f171c6111a62f6d3886384a23a1a1a83740c6c0f Mon Sep 17 00:00:00 2001 From: Blake Harnden <32446120+bharnden@users.noreply.github.com> Date: Thu, 17 Dec 2020 22:32:25 -0800 Subject: [PATCH] pygui: created node function to check if it can be linked to another node --- daemon/core/gui/graph/graph.py | 24 ++---------------------- daemon/core/gui/graph/node.py | 20 +++++++++++++++++++- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/daemon/core/gui/graph/graph.py b/daemon/core/gui/graph/graph.py index edaaa11e..62e98b25 100644 --- a/daemon/core/gui/graph/graph.py +++ b/daemon/core/gui/graph/graph.py @@ -362,11 +362,9 @@ class CanvasGraph(tk.Canvas): def handle_edge_release(self, _event: tk.Event) -> None: edge = self.drawing_edge self.drawing_edge = None - # not drawing edge return if edge is None: return - # edge dst must be a node logging.debug("current selected: %s", self.selected) src_node = self.nodes.get(edge.src) @@ -374,28 +372,10 @@ class CanvasGraph(tk.Canvas): if not dst_node or not src_node: edge.delete() return - - # edge dst is same as src, delete edge - if edge.src == self.selected: + # check if node can be linked + if not src_node.is_linkable(dst_node): edge.delete() return - - # rj45 nodes can only support one link - if NodeUtils.is_rj45_node(src_node.core_node.type) and src_node.edges: - edge.delete() - return - if NodeUtils.is_rj45_node(dst_node.core_node.type) and dst_node.edges: - edge.delete() - return - - # only 1 link between bridge based nodes - is_src_bridge = NodeUtils.is_bridge_node(src_node.core_node) - is_dst_bridge = NodeUtils.is_bridge_node(dst_node.core_node) - common_links = src_node.edges & dst_node.edges - if all([is_src_bridge, is_dst_bridge, common_links]): - edge.delete() - return - # finalize edge creation self.complete_edge(src_node, dst_node, edge) diff --git a/daemon/core/gui/graph/node.py b/daemon/core/gui/graph/node.py index bd637a2f..6f712b66 100644 --- a/daemon/core/gui/graph/node.py +++ b/daemon/core/gui/graph/node.py @@ -257,7 +257,7 @@ class CanvasNode: canvas_menu = tk.Menu(link_menu) themes.style_menu(canvas_menu) for node in canvas.nodes.values(): - if node == self: + if not self.is_linkable(node): continue func_link = functools.partial(self.click_link, node) canvas_menu.add_command( @@ -389,3 +389,21 @@ class CanvasNode: self.core_node.icon = icon_path self.image = Images.create(icon_path, nodeutils.ICON_SIZE) self.canvas.itemconfig(self.id, image=self.image) + + def is_linkable(self, node: "CanvasNode") -> bool: + # cannot link to self + if self == node: + return False + # rj45 nodes can only support one link + if NodeUtils.is_rj45_node(self.core_node.type) and self.edges: + return False + if NodeUtils.is_rj45_node(node.core_node.type) and node.edges: + return False + # only 1 link between bridge based nodes + is_src_bridge = NodeUtils.is_bridge_node(self.core_node) + is_dst_bridge = NodeUtils.is_bridge_node(node.core_node) + common_links = self.edges & node.edges + if all([is_src_bridge, is_dst_bridge, common_links]): + return False + # valid link + return True