Merge branch 'coretk' of https://github.com/coreemu/core into coretk
This commit is contained in:
commit
6fd38c4195
6 changed files with 116 additions and 25 deletions
|
@ -10,6 +10,7 @@ from coretk.images import ImageEnum, Images
|
||||||
from coretk.menuaction import MenuAction
|
from coretk.menuaction import MenuAction
|
||||||
from coretk.menubar import Menubar
|
from coretk.menubar import Menubar
|
||||||
from coretk.nodeutils import NodeUtils
|
from coretk.nodeutils import NodeUtils
|
||||||
|
from coretk.status import StatusBar
|
||||||
from coretk.toolbar import Toolbar
|
from coretk.toolbar import Toolbar
|
||||||
|
|
||||||
|
|
||||||
|
@ -80,7 +81,7 @@ class Application(tk.Frame):
|
||||||
self.canvas.configure(yscrollcommand=scroll_y.set)
|
self.canvas.configure(yscrollcommand=scroll_y.set)
|
||||||
|
|
||||||
def draw_status(self):
|
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)
|
self.statusbar.pack(side=tk.BOTTOM, fill=tk.X)
|
||||||
|
|
||||||
def on_closing(self):
|
def on_closing(self):
|
||||||
|
|
|
@ -350,10 +350,7 @@ class CanvasGraph(tk.Canvas):
|
||||||
:param event:
|
:param event:
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
# delete canvas data
|
|
||||||
nodes = self.canvas_management.delete_selected_nodes()
|
nodes = self.canvas_management.delete_selected_nodes()
|
||||||
|
|
||||||
# delete core data
|
|
||||||
self.core.delete_graph_nodes(nodes)
|
self.core.delete_graph_nodes(nodes)
|
||||||
|
|
||||||
def add_node(self, x, y):
|
def add_node(self, x, y):
|
||||||
|
|
|
@ -88,18 +88,41 @@ class WlanAntennaManager:
|
||||||
"""
|
"""
|
||||||
if self.quantity < 5:
|
if self.quantity < 5:
|
||||||
x, y = self.canvas.coords(self.node_id)
|
x, y = self.canvas.coords(self.node_id)
|
||||||
self.antennas.append(
|
aid = self.canvas.create_image(
|
||||||
self.canvas.create_image(
|
x - 16 + self.offset,
|
||||||
x - 16 + self.offset,
|
y - 23,
|
||||||
y - 16,
|
anchor=tk.CENTER,
|
||||||
anchor=tk.CENTER,
|
image=self.image,
|
||||||
image=self.image,
|
tags="antenna",
|
||||||
tags="antenna",
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
# self.canvas.tag_raise("antenna")
|
||||||
|
self.antennas.append(aid)
|
||||||
self.quantity = self.quantity + 1
|
self.quantity = self.quantity + 1
|
||||||
self.offset = self.offset + 8
|
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):
|
def update_antennas_position(self, offset_x, offset_y):
|
||||||
"""
|
"""
|
||||||
redraw antennas of a node according to the new node position
|
redraw antennas of a node according to the new node position
|
||||||
|
@ -108,15 +131,3 @@ class WlanAntennaManager:
|
||||||
"""
|
"""
|
||||||
for i in self.antennas:
|
for i in self.antennas:
|
||||||
self.canvas.move(i, offset_x, offset_y)
|
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)
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
"""
|
"""
|
||||||
manage deletion
|
manage deletion
|
||||||
"""
|
"""
|
||||||
|
from core.api.grpc import core_pb2
|
||||||
|
|
||||||
|
|
||||||
class CanvasComponentManagement:
|
class CanvasComponentManagement:
|
||||||
|
@ -41,6 +42,24 @@ class CanvasComponentManagement:
|
||||||
def delete_selected_nodes(self):
|
def delete_selected_nodes(self):
|
||||||
edges = set()
|
edges = set()
|
||||||
nodes = []
|
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):
|
for node_id in list(self.selected):
|
||||||
bbox_id = self.selected[node_id]
|
bbox_id = self.selected[node_id]
|
||||||
canvas_node = self.canvas.nodes.pop(node_id)
|
canvas_node = self.canvas.nodes.pop(node_id)
|
||||||
|
|
44
coretk/coretk/status.py
Normal file
44
coretk/coretk/status.py
Normal file
|
@ -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")
|
|
@ -1,4 +1,5 @@
|
||||||
import logging
|
import logging
|
||||||
|
import time
|
||||||
import tkinter as tk
|
import tkinter as tk
|
||||||
from functools import partial
|
from functools import partial
|
||||||
from tkinter import ttk
|
from tkinter import ttk
|
||||||
|
@ -195,13 +196,25 @@ class Toolbar(ttk.Frame):
|
||||||
|
|
||||||
:return: nothing
|
: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.config(cursor="watch")
|
||||||
self.master.update()
|
self.master.update()
|
||||||
self.app.canvas.mode = GraphMode.SELECT
|
self.app.canvas.mode = GraphMode.SELECT
|
||||||
|
start = time.time()
|
||||||
self.app.core.start_session()
|
self.app.core.start_session()
|
||||||
|
dur = time.time() - start
|
||||||
self.runtime_frame.tkraise()
|
self.runtime_frame.tkraise()
|
||||||
self.master.config(cursor="")
|
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):
|
def click_link(self):
|
||||||
logging.debug("Click LINK button")
|
logging.debug("Click LINK button")
|
||||||
|
@ -355,7 +368,13 @@ class Toolbar(ttk.Frame):
|
||||||
:return: nothing
|
:return: nothing
|
||||||
"""
|
"""
|
||||||
logging.debug("Click on STOP button ")
|
logging.debug("Click on STOP button ")
|
||||||
|
# self.status_thread.join()
|
||||||
|
start = time.time()
|
||||||
self.app.core.stop_session()
|
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.app.canvas.delete("wireless")
|
||||||
self.design_frame.tkraise()
|
self.design_frame.tkraise()
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue