gui: updated core.gui to not use deprecated type hinting
This commit is contained in:
parent
69f05a6712
commit
e7351b594d
40 changed files with 268 additions and 257 deletions
|
@ -2,7 +2,7 @@ import functools
|
|||
import logging
|
||||
import math
|
||||
import tkinter as tk
|
||||
from typing import TYPE_CHECKING, Optional, Tuple, Union
|
||||
from typing import TYPE_CHECKING, Optional, Union
|
||||
|
||||
from core.api.grpc.wrappers import Interface, Link
|
||||
from core.gui import nodeutils, themes
|
||||
|
@ -54,7 +54,7 @@ def create_edge_token(link: Link) -> str:
|
|||
|
||||
def node_label_positions(
|
||||
src_x: int, src_y: int, dst_x: int, dst_y: int
|
||||
) -> Tuple[Tuple[float, float], Tuple[float, float]]:
|
||||
) -> tuple[tuple[float, float], tuple[float, float]]:
|
||||
v_x, v_y = dst_x - src_x, dst_y - src_y
|
||||
v_len = math.sqrt(v_x**2 + v_y**2)
|
||||
if v_len == 0:
|
||||
|
@ -128,8 +128,8 @@ class Edge:
|
|||
return self.width * self.app.app_scale
|
||||
|
||||
def _get_arcpoint(
|
||||
self, src_pos: Tuple[float, float], dst_pos: Tuple[float, float]
|
||||
) -> Tuple[float, float]:
|
||||
self, src_pos: tuple[float, float], dst_pos: tuple[float, float]
|
||||
) -> tuple[float, float]:
|
||||
src_x, src_y = src_pos
|
||||
dst_x, dst_y = dst_pos
|
||||
mp_x = (src_x + dst_x) / 2
|
||||
|
@ -317,7 +317,7 @@ class Edge:
|
|||
if self.dst_label2:
|
||||
self.dst.canvas.itemconfig(self.dst_label2, text=text)
|
||||
|
||||
def drawing(self, pos: Tuple[float, float]) -> None:
|
||||
def drawing(self, pos: tuple[float, float]) -> None:
|
||||
src_x, src_y, _, _, _, _ = self.src.canvas.coords(self.id)
|
||||
src_pos = src_x, src_y
|
||||
self.moved(src_pos, pos)
|
||||
|
@ -368,7 +368,7 @@ class Edge:
|
|||
dst_pos = dst_x, dst_y
|
||||
self.moved(self.src.position(), dst_pos)
|
||||
|
||||
def moved(self, src_pos: Tuple[float, float], dst_pos: Tuple[float, float]) -> None:
|
||||
def moved(self, src_pos: tuple[float, float], dst_pos: tuple[float, float]) -> None:
|
||||
arc_pos = self._get_arcpoint(src_pos, dst_pos)
|
||||
self.src.canvas.coords(self.id, *src_pos, *arc_pos, *dst_pos)
|
||||
if self.middle_label:
|
||||
|
@ -381,7 +381,7 @@ class Edge:
|
|||
self.src.canvas.coords(self.dst_label, *dst_pos)
|
||||
|
||||
def moved2(
|
||||
self, src_pos: Tuple[float, float], dst_pos: Tuple[float, float]
|
||||
self, src_pos: tuple[float, float], dst_pos: tuple[float, float]
|
||||
) -> None:
|
||||
arc_pos = self._get_arcpoint(src_pos, dst_pos)
|
||||
self.dst.canvas.coords(self.id2, *src_pos, *arc_pos, *dst_pos)
|
||||
|
@ -568,7 +568,7 @@ class CanvasEdge(Edge):
|
|||
label += f"{iface.ip6}/{iface.ip6_mask}"
|
||||
return label
|
||||
|
||||
def create_node_labels(self) -> Tuple[str, str]:
|
||||
def create_node_labels(self) -> tuple[str, str]:
|
||||
label1 = None
|
||||
if self.link.iface1:
|
||||
label1 = self.iface_label(self.link.iface1)
|
||||
|
|
|
@ -2,7 +2,7 @@ import logging
|
|||
import tkinter as tk
|
||||
from copy import deepcopy
|
||||
from pathlib import Path
|
||||
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Set, Tuple
|
||||
from typing import TYPE_CHECKING, Any, Optional
|
||||
|
||||
from PIL import Image
|
||||
from PIL.ImageTk import PhotoImage
|
||||
|
@ -27,8 +27,8 @@ if TYPE_CHECKING:
|
|||
|
||||
ZOOM_IN: float = 1.1
|
||||
ZOOM_OUT: float = 0.9
|
||||
MOVE_NODE_MODES: Set[GraphMode] = {GraphMode.NODE, GraphMode.SELECT}
|
||||
MOVE_SHAPE_MODES: Set[GraphMode] = {GraphMode.ANNOTATION, GraphMode.SELECT}
|
||||
MOVE_NODE_MODES: set[GraphMode] = {GraphMode.NODE, GraphMode.SELECT}
|
||||
MOVE_SHAPE_MODES: set[GraphMode] = {GraphMode.ANNOTATION, GraphMode.SELECT}
|
||||
BACKGROUND_COLOR: str = "#cccccc"
|
||||
|
||||
|
||||
|
@ -40,32 +40,32 @@ class CanvasGraph(tk.Canvas):
|
|||
manager: "CanvasManager",
|
||||
core: "CoreClient",
|
||||
_id: int,
|
||||
dimensions: Tuple[int, int],
|
||||
dimensions: tuple[int, int],
|
||||
) -> None:
|
||||
super().__init__(master, highlightthickness=0, background=BACKGROUND_COLOR)
|
||||
self.id: int = _id
|
||||
self.app: "Application" = app
|
||||
self.manager: "CanvasManager" = manager
|
||||
self.core: "CoreClient" = core
|
||||
self.selection: Dict[int, int] = {}
|
||||
self.selection: dict[int, int] = {}
|
||||
self.select_box: Optional[Shape] = None
|
||||
self.selected: Optional[int] = None
|
||||
self.nodes: Dict[int, CanvasNode] = {}
|
||||
self.shadow_nodes: Dict[int, ShadowNode] = {}
|
||||
self.shapes: Dict[int, Shape] = {}
|
||||
self.shadow_core_nodes: Dict[int, ShadowNode] = {}
|
||||
self.nodes: dict[int, CanvasNode] = {}
|
||||
self.shadow_nodes: dict[int, ShadowNode] = {}
|
||||
self.shapes: dict[int, Shape] = {}
|
||||
self.shadow_core_nodes: dict[int, ShadowNode] = {}
|
||||
|
||||
# map wireless/EMANE node to the set of MDRs connected to that node
|
||||
self.wireless_network: Dict[int, Set[int]] = {}
|
||||
self.wireless_network: dict[int, set[int]] = {}
|
||||
|
||||
self.drawing_edge: Optional[CanvasEdge] = None
|
||||
self.rect: Optional[int] = None
|
||||
self.shape_drawing: bool = False
|
||||
self.current_dimensions: Tuple[int, int] = dimensions
|
||||
self.current_dimensions: tuple[int, int] = dimensions
|
||||
self.ratio: float = 1.0
|
||||
self.offset: Tuple[int, int] = (0, 0)
|
||||
self.cursor: Tuple[int, int] = (0, 0)
|
||||
self.to_copy: List[CanvasNode] = []
|
||||
self.offset: tuple[int, int] = (0, 0)
|
||||
self.cursor: tuple[int, int] = (0, 0)
|
||||
self.to_copy: list[CanvasNode] = []
|
||||
|
||||
# background related
|
||||
self.wallpaper_id: Optional[int] = None
|
||||
|
@ -82,7 +82,7 @@ class CanvasGraph(tk.Canvas):
|
|||
self.draw_canvas()
|
||||
self.draw_grid()
|
||||
|
||||
def draw_canvas(self, dimensions: Tuple[int, int] = None) -> None:
|
||||
def draw_canvas(self, dimensions: tuple[int, int] = None) -> None:
|
||||
if self.rect is not None:
|
||||
self.delete(self.rect)
|
||||
if not dimensions:
|
||||
|
@ -126,23 +126,23 @@ class CanvasGraph(tk.Canvas):
|
|||
shadow_node = ShadowNode(self.app, self, node)
|
||||
return shadow_node
|
||||
|
||||
def get_actual_coords(self, x: float, y: float) -> Tuple[float, float]:
|
||||
def get_actual_coords(self, x: float, y: float) -> tuple[float, float]:
|
||||
actual_x = (x - self.offset[0]) / self.ratio
|
||||
actual_y = (y - self.offset[1]) / self.ratio
|
||||
return actual_x, actual_y
|
||||
|
||||
def get_scaled_coords(self, x: float, y: float) -> Tuple[float, float]:
|
||||
def get_scaled_coords(self, x: float, y: float) -> tuple[float, float]:
|
||||
scaled_x = (x * self.ratio) + self.offset[0]
|
||||
scaled_y = (y * self.ratio) + self.offset[1]
|
||||
return scaled_x, scaled_y
|
||||
|
||||
def inside_canvas(self, x: float, y: float) -> Tuple[bool, bool]:
|
||||
def inside_canvas(self, x: float, y: float) -> tuple[bool, bool]:
|
||||
x1, y1, x2, y2 = self.bbox(self.rect)
|
||||
valid_x = x1 <= x <= x2
|
||||
valid_y = y1 <= y <= y2
|
||||
return valid_x and valid_y
|
||||
|
||||
def valid_position(self, x1: int, y1: int, x2: int, y2: int) -> Tuple[bool, bool]:
|
||||
def valid_position(self, x1: int, y1: int, x2: int, y2: int) -> tuple[bool, bool]:
|
||||
valid_topleft = self.inside_canvas(x1, y1)
|
||||
valid_bottomright = self.inside_canvas(x2, y2)
|
||||
return valid_topleft and valid_bottomright
|
||||
|
@ -161,7 +161,7 @@ class CanvasGraph(tk.Canvas):
|
|||
self.tag_lower(tags.GRIDLINE)
|
||||
self.tag_lower(self.rect)
|
||||
|
||||
def canvas_xy(self, event: tk.Event) -> Tuple[float, float]:
|
||||
def canvas_xy(self, event: tk.Event) -> tuple[float, float]:
|
||||
"""
|
||||
Convert window coordinate to canvas coordinate
|
||||
"""
|
||||
|
@ -516,7 +516,7 @@ class CanvasGraph(tk.Canvas):
|
|||
self.nodes[node.id] = node
|
||||
self.core.set_canvas_node(core_node, node)
|
||||
|
||||
def width_and_height(self) -> Tuple[int, int]:
|
||||
def width_and_height(self) -> tuple[int, int]:
|
||||
"""
|
||||
retrieve canvas width and height in pixels
|
||||
"""
|
||||
|
@ -601,7 +601,7 @@ class CanvasGraph(tk.Canvas):
|
|||
self.redraw_canvas((image.width(), image.height()))
|
||||
self.draw_wallpaper(image)
|
||||
|
||||
def redraw_canvas(self, dimensions: Tuple[int, int] = None) -> None:
|
||||
def redraw_canvas(self, dimensions: tuple[int, int] = None) -> None:
|
||||
logger.debug("redrawing canvas to dimensions: %s", dimensions)
|
||||
|
||||
# reset scale and move back to original position
|
||||
|
@ -814,7 +814,7 @@ class CanvasGraph(tk.Canvas):
|
|||
for edge_id in self.find_withtag(tags.EDGE):
|
||||
self.itemconfig(edge_id, width=int(EDGE_WIDTH * self.app.app_scale))
|
||||
|
||||
def get_metadata(self) -> Dict[str, Any]:
|
||||
def get_metadata(self) -> dict[str, Any]:
|
||||
wallpaper_path = None
|
||||
if self.wallpaper_file:
|
||||
wallpaper = Path(self.wallpaper_file)
|
||||
|
@ -830,7 +830,7 @@ class CanvasGraph(tk.Canvas):
|
|||
dimensions=self.current_dimensions,
|
||||
)
|
||||
|
||||
def parse_metadata(self, config: Dict[str, Any]) -> None:
|
||||
def parse_metadata(self, config: dict[str, Any]) -> None:
|
||||
fit_image = config.get("fit_image", False)
|
||||
self.adjust_to_dim.set(fit_image)
|
||||
wallpaper_style = config.get("wallpaper_style", 1)
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
import json
|
||||
import logging
|
||||
import tkinter as tk
|
||||
from collections.abc import ValuesView
|
||||
from copy import deepcopy
|
||||
from tkinter import BooleanVar, messagebox, ttk
|
||||
from typing import TYPE_CHECKING, Any, Dict, Optional, Tuple, ValuesView
|
||||
from typing import TYPE_CHECKING, Any, Optional
|
||||
|
||||
from core.api.grpc.wrappers import Link, LinkType, Node, Session, ThroughputsEvent
|
||||
from core.gui import nodeutils as nutils
|
||||
|
@ -78,14 +79,14 @@ class CanvasManager:
|
|||
self.mode: GraphMode = GraphMode.SELECT
|
||||
self.annotation_type: Optional[ShapeType] = None
|
||||
self.node_draw: Optional[NodeDraw] = None
|
||||
self.canvases: Dict[int, CanvasGraph] = {}
|
||||
self.canvases: dict[int, CanvasGraph] = {}
|
||||
|
||||
# global edge management
|
||||
self.edges: Dict[str, CanvasEdge] = {}
|
||||
self.wireless_edges: Dict[str, CanvasWirelessEdge] = {}
|
||||
self.edges: dict[str, CanvasEdge] = {}
|
||||
self.wireless_edges: dict[str, CanvasWirelessEdge] = {}
|
||||
|
||||
# global canvas settings
|
||||
self.default_dimensions: Tuple[int, int] = (
|
||||
self.default_dimensions: tuple[int, int] = (
|
||||
self.app.guiconfig.preferences.width,
|
||||
self.app.guiconfig.preferences.height,
|
||||
)
|
||||
|
@ -111,8 +112,8 @@ class CanvasManager:
|
|||
|
||||
# widget
|
||||
self.notebook: Optional[ttk.Notebook] = None
|
||||
self.canvas_ids: Dict[str, int] = {}
|
||||
self.unique_ids: Dict[int, str] = {}
|
||||
self.canvas_ids: dict[str, int] = {}
|
||||
self.unique_ids: dict[int, str] = {}
|
||||
self.draw()
|
||||
|
||||
self.setup_bindings()
|
||||
|
@ -273,17 +274,17 @@ class CanvasManager:
|
|||
if not self.canvases:
|
||||
self.add_canvas()
|
||||
|
||||
def redraw_canvas(self, dimensions: Tuple[int, int]) -> None:
|
||||
def redraw_canvas(self, dimensions: tuple[int, int]) -> None:
|
||||
canvas = self.current()
|
||||
canvas.redraw_canvas(dimensions)
|
||||
if canvas.wallpaper:
|
||||
canvas.redraw_wallpaper()
|
||||
|
||||
def get_metadata(self) -> Dict[str, Any]:
|
||||
def get_metadata(self) -> dict[str, Any]:
|
||||
canvases = [x.get_metadata() for x in self.all()]
|
||||
return dict(gridlines=self.show_grid.get(), canvases=canvases)
|
||||
|
||||
def parse_metadata_canvas(self, metadata: Dict[str, Any]) -> None:
|
||||
def parse_metadata_canvas(self, metadata: dict[str, Any]) -> None:
|
||||
# canvas setting
|
||||
canvas_config = metadata.get("canvas")
|
||||
logger.debug("canvas metadata: %s", canvas_config)
|
||||
|
@ -303,7 +304,7 @@ class CanvasManager:
|
|||
canvas = self.get(canvas_id)
|
||||
canvas.parse_metadata(canvas_config)
|
||||
|
||||
def parse_metadata_shapes(self, metadata: Dict[str, Any]) -> None:
|
||||
def parse_metadata_shapes(self, metadata: dict[str, Any]) -> None:
|
||||
# load saved shapes
|
||||
shapes_config = metadata.get("shapes")
|
||||
if not shapes_config:
|
||||
|
@ -313,7 +314,7 @@ class CanvasManager:
|
|||
logger.debug("loading shape: %s", shape_config)
|
||||
Shape.from_metadata(self.app, shape_config)
|
||||
|
||||
def parse_metadata_edges(self, metadata: Dict[str, Any]) -> None:
|
||||
def parse_metadata_edges(self, metadata: dict[str, Any]) -> None:
|
||||
# load edges config
|
||||
edges_config = metadata.get("edges")
|
||||
if not edges_config:
|
||||
|
@ -330,7 +331,7 @@ class CanvasManager:
|
|||
else:
|
||||
logger.warning("invalid edge token to configure: %s", edge_token)
|
||||
|
||||
def parse_metadata_hidden(self, metadata: Dict[str, Any]) -> None:
|
||||
def parse_metadata_hidden(self, metadata: dict[str, Any]) -> None:
|
||||
# read hidden nodes
|
||||
hidden_config = metadata.get("hidden")
|
||||
if not hidden_config:
|
||||
|
|
|
@ -2,7 +2,7 @@ import functools
|
|||
import logging
|
||||
import tkinter as tk
|
||||
from pathlib import Path
|
||||
from typing import TYPE_CHECKING, Dict, List, Optional, Set, Tuple
|
||||
from typing import TYPE_CHECKING, Optional
|
||||
|
||||
import grpc
|
||||
from PIL.ImageTk import PhotoImage
|
||||
|
@ -62,17 +62,17 @@ class CanvasNode:
|
|||
state=self.app.manager.show_node_labels.state(),
|
||||
)
|
||||
self.tooltip: CanvasTooltip = CanvasTooltip(self.canvas)
|
||||
self.edges: Set[CanvasEdge] = set()
|
||||
self.ifaces: Dict[int, Interface] = {}
|
||||
self.wireless_edges: Set[CanvasWirelessEdge] = set()
|
||||
self.antennas: List[int] = []
|
||||
self.antenna_images: Dict[int, PhotoImage] = {}
|
||||
self.edges: set[CanvasEdge] = set()
|
||||
self.ifaces: dict[int, Interface] = {}
|
||||
self.wireless_edges: set[CanvasWirelessEdge] = set()
|
||||
self.antennas: list[int] = []
|
||||
self.antenna_images: dict[int, PhotoImage] = {}
|
||||
self.hidden: bool = False
|
||||
self.setup_bindings()
|
||||
self.context: tk.Menu = tk.Menu(self.canvas)
|
||||
themes.style_menu(self.context)
|
||||
|
||||
def position(self) -> Tuple[int, int]:
|
||||
def position(self) -> tuple[int, int]:
|
||||
return self.canvas.coords(self.id)
|
||||
|
||||
def next_iface_id(self) -> int:
|
||||
|
@ -543,7 +543,7 @@ class ShadowNode:
|
|||
self.canvas.shadow_nodes[self.id] = self
|
||||
self.canvas.shadow_core_nodes[self.node.core_node.id] = self
|
||||
|
||||
def position(self) -> Tuple[int, int]:
|
||||
def position(self) -> tuple[int, int]:
|
||||
return self.canvas.coords(self.id)
|
||||
|
||||
def should_delete(self) -> bool:
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import logging
|
||||
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Union
|
||||
from typing import TYPE_CHECKING, Any, Optional, Union
|
||||
|
||||
from core.gui.dialogs.shapemod import ShapeDialog
|
||||
from core.gui.graph import tags
|
||||
|
@ -72,7 +72,7 @@ class Shape:
|
|||
self.draw()
|
||||
|
||||
@classmethod
|
||||
def from_metadata(cls, app: "Application", config: Dict[str, Any]) -> None:
|
||||
def from_metadata(cls, app: "Application", config: dict[str, Any]) -> None:
|
||||
shape_type = config["type"]
|
||||
try:
|
||||
shape_type = ShapeType(shape_type)
|
||||
|
@ -144,7 +144,7 @@ class Shape:
|
|||
logger.error("unknown shape type: %s", self.shape_type)
|
||||
self.created = True
|
||||
|
||||
def get_font(self) -> List[Union[int, str]]:
|
||||
def get_font(self) -> list[Union[int, str]]:
|
||||
font = [self.shape_data.font, self.shape_data.font_size]
|
||||
if self.shape_data.bold:
|
||||
font.append("bold")
|
||||
|
@ -198,7 +198,7 @@ class Shape:
|
|||
self.canvas.delete(self.id)
|
||||
self.canvas.delete(self.text_id)
|
||||
|
||||
def metadata(self) -> Dict[str, Union[str, int, bool]]:
|
||||
def metadata(self) -> dict[str, Union[str, int, bool]]:
|
||||
coords = self.canvas.coords(self.id)
|
||||
# update coords to actual positions
|
||||
if len(coords) == 4:
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
import enum
|
||||
from typing import Set
|
||||
|
||||
|
||||
class ShapeType(enum.Enum):
|
||||
|
@ -9,7 +8,7 @@ class ShapeType(enum.Enum):
|
|||
TEXT = "text"
|
||||
|
||||
|
||||
SHAPES: Set[ShapeType] = {ShapeType.OVAL, ShapeType.RECTANGLE}
|
||||
SHAPES: set[ShapeType] = {ShapeType.OVAL, ShapeType.RECTANGLE}
|
||||
|
||||
|
||||
def is_draw_shape(shape_type: ShapeType) -> bool:
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
from typing import List
|
||||
|
||||
ANNOTATION: str = "annotation"
|
||||
GRIDLINE: str = "gridline"
|
||||
SHAPE: str = "shape"
|
||||
|
@ -15,7 +13,7 @@ WALLPAPER: str = "wallpaper"
|
|||
SELECTION: str = "selectednodes"
|
||||
MARKER: str = "marker"
|
||||
HIDDEN: str = "hidden"
|
||||
ORGANIZE_TAGS: List[str] = [
|
||||
ORGANIZE_TAGS: list[str] = [
|
||||
WALLPAPER,
|
||||
GRIDLINE,
|
||||
SHAPE,
|
||||
|
@ -29,7 +27,7 @@ ORGANIZE_TAGS: List[str] = [
|
|||
SELECTION,
|
||||
MARKER,
|
||||
]
|
||||
RESET_TAGS: List[str] = [
|
||||
RESET_TAGS: list[str] = [
|
||||
EDGE,
|
||||
NODE,
|
||||
NODE_LABEL,
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import tkinter as tk
|
||||
from tkinter import ttk
|
||||
from typing import TYPE_CHECKING, Optional, Tuple
|
||||
from typing import TYPE_CHECKING, Optional
|
||||
|
||||
from core.gui.themes import Styles
|
||||
|
||||
|
@ -27,7 +27,7 @@ class CanvasTooltip:
|
|||
self,
|
||||
canvas: "CanvasGraph",
|
||||
*,
|
||||
pad: Tuple[int, int, int, int] = (5, 3, 5, 3),
|
||||
pad: tuple[int, int, int, int] = (5, 3, 5, 3),
|
||||
waittime: int = 400,
|
||||
wraplength: int = 600
|
||||
) -> None:
|
||||
|
@ -37,7 +37,7 @@ class CanvasTooltip:
|
|||
self.wraplength: int = wraplength
|
||||
self.canvas: "CanvasGraph" = canvas
|
||||
self.text: tk.StringVar = tk.StringVar()
|
||||
self.pad: Tuple[int, int, int, int] = pad
|
||||
self.pad: tuple[int, int, int, int] = pad
|
||||
self.id: Optional[str] = None
|
||||
self.tw: Optional[tk.Toplevel] = None
|
||||
|
||||
|
@ -63,8 +63,8 @@ class CanvasTooltip:
|
|||
canvas: "CanvasGraph",
|
||||
label: ttk.Label,
|
||||
*,
|
||||
tip_delta: Tuple[int, int] = (10, 5),
|
||||
pad: Tuple[int, int, int, int] = (5, 3, 5, 3)
|
||||
tip_delta: tuple[int, int] = (10, 5),
|
||||
pad: tuple[int, int, int, int] = (5, 3, 5, 3)
|
||||
):
|
||||
c = canvas
|
||||
s_width, s_height = c.winfo_screenwidth(), c.winfo_screenheight()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue