diff --git a/daemon/core/gui/dialogs/wlanconfig.py b/daemon/core/gui/dialogs/wlanconfig.py index eb525f6d..c0c8c845 100644 --- a/daemon/core/gui/dialogs/wlanconfig.py +++ b/daemon/core/gui/dialogs/wlanconfig.py @@ -1,7 +1,3 @@ -""" -wlan configuration -""" - from tkinter import ttk from typing import TYPE_CHECKING @@ -16,6 +12,9 @@ if TYPE_CHECKING: from core.gui.app import Application from core.gui.graph.node import CanvasNode +RANGE_COLOR = "#009933" +RANGE_WIDTH = 3 + class WlanConfigDialog(Dialog): def __init__( @@ -29,14 +28,27 @@ class WlanConfigDialog(Dialog): self.config_frame = None self.range_entry = None self.has_error = False + self.canvas = app.canvas + self.ranges = {} + self.positive_int = self.app.master.register(self.validate_and_update) try: self.config = self.app.core.get_wlan_config(self.node.id) + self.init_draw_range() self.draw() except grpc.RpcError as e: show_grpc_error(e, self.app, self.app) self.has_error = True self.destroy() + def init_draw_range(self): + if self.canvas_node.id in self.canvas.wireless_network: + for cid in self.canvas.wireless_network[self.canvas_node.id]: + x, y = self.canvas.coords(cid) + range_id = self.canvas.create_oval( + x, y, x, y, width=RANGE_WIDTH, outline=RANGE_COLOR, tags="range" + ) + self.ranges[cid] = range_id + def draw(self): self.top.columnconfigure(0, weight=1) self.top.rowconfigure(0, weight=1) @@ -44,6 +56,7 @@ class WlanConfigDialog(Dialog): self.config_frame.draw_config() self.config_frame.grid(sticky="nsew", pady=PADY) self.draw_apply_buttons() + self.top.bind("", self.remove_ranges) def draw_apply_buttons(self): """ @@ -57,7 +70,7 @@ class WlanConfigDialog(Dialog): self.range_entry = self.config_frame.winfo_children()[0].frame.winfo_children()[ -1 ] - self.range_entry.bind("", self.update_range) + self.range_entry.config(validatecommand=(self.positive_int, "%P")) button = ttk.Button(frame, text="Apply", command=self.click_apply) button.grid(row=0, column=0, padx=PADX, sticky="ew") @@ -74,8 +87,35 @@ class WlanConfigDialog(Dialog): if self.app.core.is_runtime(): session_id = self.app.core.session_id self.app.core.client.set_wlan_config(session_id, self.node.id, config) + self.remove_ranges() self.destroy() - def update_range(self, event): - if event.char.isdigit(): - print(self.range_entry.get() + event.char) + def remove_ranges(self, event=None): + for cid in self.canvas.find_withtag("range"): + self.canvas.delete(cid) + self.ranges.clear() + + def validate_and_update(self, s: str) -> bool: + """ + custom validation to also redraw the mdr ranges when the range value changes + """ + if len(s) == 0: + return True + try: + int_value = int(s) + if int_value >= 0: + net_range = int_value * self.canvas.ratio + if self.canvas_node.id in self.canvas.wireless_network: + for cid in self.canvas.wireless_network[self.canvas_node.id]: + x, y = self.canvas.coords(cid) + self.canvas.coords( + self.ranges[cid], + x - net_range, + y - net_range, + x + net_range, + y + net_range, + ) + return True + return False + except ValueError: + return False diff --git a/daemon/core/gui/graph/edges.py b/daemon/core/gui/graph/edges.py index c00fd2aa..0ca1c8e6 100644 --- a/daemon/core/gui/graph/edges.py +++ b/daemon/core/gui/graph/edges.py @@ -14,6 +14,7 @@ if TYPE_CHECKING: TEXT_DISTANCE = 0.30 EDGE_WIDTH = 3 EDGE_COLOR = "#ff0000" +WIRELESS_COLOR = "#009933" class CanvasWirelessEdge: @@ -31,7 +32,7 @@ class CanvasWirelessEdge: self.dst = dst self.canvas = canvas self.id = self.canvas.create_line( - *position, tags=tags.WIRELESS_EDGE, width=1.5, fill="#009933" + *position, tags=tags.WIRELESS_EDGE, width=EDGE_WIDTH, fill="#009933" ) def delete(self): diff --git a/daemon/core/gui/graph/node.py b/daemon/core/gui/graph/node.py index 8210b4f2..ecd95d58 100644 --- a/daemon/core/gui/graph/node.py +++ b/daemon/core/gui/graph/node.py @@ -97,7 +97,7 @@ class CanvasNode: self.canvas.nodes[other].wireless_edges.discard(wireless_edge) wlan_edge = self.canvas.wireless_edges.pop(token, None) self.canvas.delete(wlan_edge.id) - self.delete_antennas() + self.delete_antennas() self.wireless_edges.clear()