gui: updated core.gui to not use deprecated type hinting

This commit is contained in:
Blake Harnden 2023-04-13 15:53:16 -07:00
parent 69f05a6712
commit e7351b594d
40 changed files with 268 additions and 257 deletions

View file

@ -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)

View file

@ -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)

View file

@ -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:

View file

@ -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:

View file

@ -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:

View file

@ -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:

View file

@ -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,

View file

@ -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()