pygui: created node function to check if it can be linked to another node

This commit is contained in:
Blake Harnden 2020-12-17 22:32:25 -08:00
parent 28d22c5800
commit f171c6111a
2 changed files with 21 additions and 23 deletions

View file

@ -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)

View file

@ -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