diff --git a/coretk/coretk/app.py b/coretk/coretk/app.py index 68060927..f0445257 100644 --- a/coretk/coretk/app.py +++ b/coretk/coretk/app.py @@ -10,6 +10,7 @@ from coretk.images import ImageEnum, Images from coretk.menuaction import MenuAction from coretk.menubar import Menubar from coretk.nodeutils import NodeUtils +from coretk.status import StatusBar from coretk.toolbar import Toolbar @@ -80,7 +81,7 @@ class Application(tk.Frame): self.canvas.configure(yscrollcommand=scroll_y.set) def draw_status(self): - self.statusbar = ttk.Frame(self) + self.statusbar = StatusBar(master=self, app=self) self.statusbar.pack(side=tk.BOTTOM, fill=tk.X) def on_closing(self): diff --git a/coretk/coretk/graph.py b/coretk/coretk/graph.py index ca4b0001..df660c7f 100644 --- a/coretk/coretk/graph.py +++ b/coretk/coretk/graph.py @@ -350,10 +350,7 @@ class CanvasGraph(tk.Canvas): :param event: :return: """ - # delete canvas data nodes = self.canvas_management.delete_selected_nodes() - - # delete core data self.core.delete_graph_nodes(nodes) def add_node(self, x, y): diff --git a/coretk/coretk/graph_helper.py b/coretk/coretk/graph_helper.py index e691667b..1ad0c8f6 100644 --- a/coretk/coretk/graph_helper.py +++ b/coretk/coretk/graph_helper.py @@ -88,18 +88,41 @@ class WlanAntennaManager: """ if self.quantity < 5: x, y = self.canvas.coords(self.node_id) - self.antennas.append( - self.canvas.create_image( - x - 16 + self.offset, - y - 16, - anchor=tk.CENTER, - image=self.image, - tags="antenna", - ) + aid = self.canvas.create_image( + x - 16 + self.offset, + y - 23, + anchor=tk.CENTER, + image=self.image, + tags="antenna", ) + # self.canvas.tag_raise("antenna") + self.antennas.append(aid) self.quantity = self.quantity + 1 self.offset = self.offset + 8 + def delete_antenna(self): + """ + delete one antenna + + :return: nothing + """ + if len(self.antennas) > 0: + self.canvas.delete(self.antennas.pop()) + self.quantity -= 1 + self.offset -= 8 + + def delete_antennas(self): + """ + delete all antennas + + :return: nothing + """ + for aid in self.antennas: + self.canvas.delete(aid) + self.antennas.clear() + self.quantity = 0 + self.offset = 0 + def update_antennas_position(self, offset_x, offset_y): """ redraw antennas of a node according to the new node position @@ -108,15 +131,3 @@ class WlanAntennaManager: """ for i in self.antennas: self.canvas.move(i, offset_x, offset_y) - - def delete_antenna(self, canvas_id): - return - - def delete_antennas(self): - """ - Delete all the antennas of a node - - :return: nothing - """ - for i in self.antennas: - self.canvas.delete(i) diff --git a/coretk/coretk/nodedelete.py b/coretk/coretk/nodedelete.py index 165fde53..27e330b5 100644 --- a/coretk/coretk/nodedelete.py +++ b/coretk/coretk/nodedelete.py @@ -1,6 +1,7 @@ """ manage deletion """ +from core.api.grpc import core_pb2 class CanvasComponentManagement: @@ -41,6 +42,24 @@ class CanvasComponentManagement: def delete_selected_nodes(self): edges = set() nodes = [] + for cnid in self.selected: + canvas_node = self.canvas.nodes[cnid] + if canvas_node.core_node.type != core_pb2.NodeType.WIRELESS_LAN: + canvas_node.antenna_draw.delete_antennas() + else: + for e in canvas_node.edges: + link_proto = self.app.links[e.token] + node_one_id, node_two_id = ( + link_proto.node_one_id, + link_proto.node_two_id, + ) + if node_one_id == canvas_node.core_node.id: + neighbor_id = node_two_id + else: + neighbor_id = node_one_id + neighbor = self.app.canvas_nodes[neighbor_id] + if neighbor.core_node.type != core_pb2.NodeType.WIRELESS_LAN: + neighbor.antenna_draw.delete_antenna() for node_id in list(self.selected): bbox_id = self.selected[node_id] canvas_node = self.canvas.nodes.pop(node_id) diff --git a/coretk/coretk/status.py b/coretk/coretk/status.py new file mode 100644 index 00000000..69869f51 --- /dev/null +++ b/coretk/coretk/status.py @@ -0,0 +1,44 @@ +"status bar" +import time +import tkinter as tk +from tkinter import ttk + + +class StatusBar(ttk.Frame): + def __init__(self, master, app, **kwargs): + super().__init__(master, **kwargs) + self.app = app + + self.status = None + self.statusvar = tk.StringVar() + self.zoom = None + self.cpu_usage = None + self.memory = None + self.emulation_light = None + self.running = False + self.draw() + + def draw(self): + self.columnconfigure(0, weight=8) + self.columnconfigure(1, weight=1) + self.columnconfigure(2, weight=1) + self.columnconfigure(3, weight=1) + self.status = ttk.Label(self, textvariable=self.statusvar) + self.statusvar.set("status") + self.status.grid(row=0, column=0) + self.zoom = ttk.Label(self, text="zoom") + self.zoom.grid(row=0, column=1) + self.cpu_usage = ttk.Label(self, text="cpu usage") + self.cpu_usage.grid(row=0, column=2) + self.emulation_light = ttk.Label(self, text="emulation light") + self.emulation_light.grid(row=0, column=3) + + def processing(self): + texts = ["Processing.", "Processing..", "Processing...", "Processing...."] + i = 0 + while self.running: + self.statusvar.set(texts[i % 4]) + self.master.update() + i = i + 1 + time.sleep(0.002) + print("thread finish") diff --git a/coretk/coretk/toolbar.py b/coretk/coretk/toolbar.py index 834f7b39..1aae22c8 100644 --- a/coretk/coretk/toolbar.py +++ b/coretk/coretk/toolbar.py @@ -1,4 +1,5 @@ import logging +import time import tkinter as tk from functools import partial from tkinter import ttk @@ -195,13 +196,25 @@ class Toolbar(ttk.Frame): :return: nothing """ - logging.debug("clicked start button") + self.app.statusbar.running = True + # thread = threading.Thread(target=self.app.statusbar.processing) + # thread.start() self.master.config(cursor="watch") self.master.update() self.app.canvas.mode = GraphMode.SELECT + start = time.time() self.app.core.start_session() + dur = time.time() - start self.runtime_frame.tkraise() self.master.config(cursor="") + nodes_num = len(self.app.core.canvas_nodes) + links_num = len(self.app.core.links) + self.app.statusbar.statusvar.set( + "Network topology instantiated in %s seconds (%s node(s) and %s link(s))" + % ("%.3f" % dur, nodes_num, links_num) + ) + # self.app.statusbar.running = False + # print("done") def click_link(self): logging.debug("Click LINK button") @@ -355,7 +368,13 @@ class Toolbar(ttk.Frame): :return: nothing """ logging.debug("Click on STOP button ") + # self.status_thread.join() + start = time.time() self.app.core.stop_session() + dur = time.time() - start + self.app.statusbar.statusvar.set( + "Cleanup completed in %s seconds" % "%.3f" % dur + ) self.app.canvas.delete("wireless") self.design_frame.tkraise()