pygui: fixed interface creation after deletion, fixed issue reusing deleted subnets

This commit is contained in:
Blake Harnden 2020-05-16 23:35:19 -07:00
parent 91220078f1
commit 06e3d84862
5 changed files with 33 additions and 30 deletions

View file

@ -322,26 +322,25 @@ class CanvasGraph(tk.Canvas):
self.edges[edge.token] = edge
self.core.links[edge.token] = edge
if link.HasField("interface_one"):
interface_one = link.interface_one
self.core.interface_to_edge[
(node_one.id, link.interface_one.id)
(node_one.id, interface_one.id)
] = token
canvas_node_one.interfaces.append(link.interface_one)
edge.src_interface = link.interface_one
canvas_node_one.interfaces[interface_one.id] = interface_one
edge.src_interface = interface_one
if link.HasField("interface_two"):
interface_two = link.interface_two
self.core.interface_to_edge[
(node_two.id, link.interface_two.id)
(node_two.id, interface_two.id)
] = edge.token
canvas_node_two.interfaces.append(link.interface_two)
edge.dst_interface = link.interface_two
canvas_node_two.interfaces[interface_two.id] = interface_two
edge.dst_interface = interface_two
elif link.options.unidirectional:
edge = self.edges[token]
edge.asymmetric_link = link
else:
logging.error("duplicate link received: %s", link)
# raise the nodes so they on top of the links
self.tag_raise(tags.NODE)
def stopped_session(self):
# clear wireless edges
for edge in self.wireless_edges.values():
@ -522,8 +521,8 @@ class CanvasGraph(tk.Canvas):
other_interface = edge.dst_interface
other_node = self.nodes[other_id]
other_node.edges.remove(edge)
if other_interface in other_node.interfaces:
other_node.interfaces.remove(other_interface)
if other_interface:
del other_node.interfaces[other_interface.id]
if is_wireless:
other_node.delete_antenna()
@ -541,12 +540,12 @@ class CanvasGraph(tk.Canvas):
del self.edges[edge.token]
src_node = self.nodes[edge.src]
src_node.edges.discard(edge)
if edge.src_interface in src_node.interfaces:
src_node.interfaces.remove(edge.src_interface)
if edge.src_interface:
del src_node.interfaces[edge.src_interface.id]
dst_node = self.nodes[edge.dst]
dst_node.edges.discard(edge)
if edge.dst_interface in dst_node.interfaces:
dst_node.interfaces.remove(edge.dst_interface)
if edge.dst_interface:
del dst_node.interfaces[edge.dst_interface.id]
src_wireless = NodeUtils.is_wireless_node(src_node.core_node.type)
if src_wireless:
dst_node.delete_antenna()

View file

@ -55,7 +55,7 @@ class CanvasNode:
)
self.tooltip = CanvasTooltip(self.canvas)
self.edges = set()
self.interfaces = []
self.interfaces = {}
self.wireless_edges = set()
self.antennas = []
self.antenna_images = {}
@ -70,6 +70,12 @@ class CanvasNode:
self.context = tk.Menu(self.canvas)
themes.style_menu(self.context)
def next_interface_id(self) -> int:
i = 0
while i in self.interfaces:
i += 1
return i
def setup_bindings(self):
self.canvas.tag_bind(self.id, "<Double-Button-1>", self.double_click)
self.canvas.tag_bind(self.id, "<Enter>", self.on_enter)