pygui: further updates to support hiding nodes and related edges, added hidden nodes to metadata sent to daemon and parsed when joining a session

This commit is contained in:
Blake Harnden 2021-01-09 20:35:24 -08:00
parent 313768ea56
commit 6f3246e329
5 changed files with 74 additions and 17 deletions

View file

@ -150,6 +150,14 @@ class ShadowNode:
self.canvas.delete(self.id)
self.canvas.delete(self.text_id)
def hide(self) -> None:
self.canvas.itemconfig(self.id, state=tk.HIDDEN)
self.canvas.itemconfig(self.text_id, state=tk.HIDDEN)
def show(self) -> None:
self.canvas.itemconfig(self.id, state=tk.NORMAL)
self.canvas.itemconfig(self.text_id, state=tk.NORMAL)
class Edge:
tag: str = tags.EDGE
@ -176,6 +184,7 @@ class Edge:
self.color: str = EDGE_COLOR
self.width: int = EDGE_WIDTH
self.linked_wireless: bool = False
self.hidden: bool = False
if self.dst:
self.linked_wireless = self.src.is_wireless() or self.dst.is_wireless()
@ -479,6 +488,38 @@ class Edge:
self.dst_label2 = None
self.manager.edges.pop(self.token, None)
def hide(self) -> None:
self.hidden = True
if self.src_shadow:
self.src_shadow.hide()
if self.dst_shadow:
self.dst_shadow.hide()
self.src.canvas.itemconfigure(self.id, state=tk.HIDDEN)
self.src.canvas.itemconfigure(self.src_label, state=tk.HIDDEN)
self.src.canvas.itemconfigure(self.dst_label, state=tk.HIDDEN)
self.src.canvas.itemconfigure(self.middle_label, state=tk.HIDDEN)
if self.id2:
self.dst.canvas.itemconfigure(self.id2, state=tk.HIDDEN)
self.dst.canvas.itemconfigure(self.src_label2, state=tk.HIDDEN)
self.dst.canvas.itemconfigure(self.dst_label2, state=tk.HIDDEN)
self.dst.canvas.itemconfigure(self.middle_label2, state=tk.HIDDEN)
def show(self) -> None:
self.hidden = False
if self.src_shadow:
self.src_shadow.show()
if self.dst_shadow:
self.dst_shadow.show()
self.src.canvas.itemconfigure(self.id, state=tk.NORMAL)
self.src.canvas.itemconfigure(self.src_label, state=tk.NORMAL)
self.src.canvas.itemconfigure(self.dst_label, state=tk.NORMAL)
self.src.canvas.itemconfigure(self.middle_label, state=tk.NORMAL)
if self.id2:
self.dst.canvas.itemconfigure(self.id2, state=tk.NORMAL)
self.dst.canvas.itemconfigure(self.src_label2, state=tk.NORMAL)
self.dst.canvas.itemconfigure(self.dst_label2, state=tk.NORMAL)
self.dst.canvas.itemconfigure(self.middle_label2, state=tk.NORMAL)
class CanvasWirelessEdge(Edge):
tag = tags.WIRELESS_EDGE

View file

@ -307,30 +307,19 @@ class CanvasGraph(tk.Canvas):
self.core.deleted_canvas_nodes(nodes)
def hide_selected_objects(self) -> None:
edges = set()
for object_id in self.selection:
# delete selection box
selection_id = self.selection[object_id]
self.delete(selection_id)
# hide node and related edges
if object_id in self.nodes:
canvas_node = self.nodes[object_id]
canvas_node.hide()
# hide related edges
for edge in canvas_node.edges:
if edge in edges:
continue
edges.add(edge)
def show_hidden(self) -> None:
edges = set()
for node in self.nodes.values():
node.show()
for edge in node.edges:
if edge in edges:
continue
edges.add(edge)
if node.hidden:
node.show()
def zoom(self, event: tk.Event, factor: float = None) -> None:
if not factor:

View file

@ -292,6 +292,7 @@ class CanvasNode:
edit_menu.add_command(label="Cut", command=self.click_cut)
edit_menu.add_command(label="Copy", command=self.canvas_copy)
edit_menu.add_command(label="Delete", command=self.canvas_delete)
edit_menu.add_command(label="Hide", command=self.hide)
self.context.add_cascade(label="Edit", menu=edit_menu)
self.context.tk_popup(event.x_root, event.y_root)
@ -415,8 +416,17 @@ class CanvasNode:
self.hidden = True
self.canvas.itemconfig(self.id, state=tk.HIDDEN)
self.canvas.itemconfig(self.text_id, state=tk.HIDDEN)
for edge in self.edges:
if not edge.hidden:
edge.hide()
def show(self) -> None:
self.hidden = False
self.canvas.itemconfig(self.id, state=tk.NORMAL)
self.canvas.itemconfig(self.text_id, state=tk.NORMAL)
for edge in self.edges:
other_node = edge.src
if edge.src == self:
other_node = edge.dst
if edge.hidden and not other_node.hidden:
edge.show()