diff --git a/daemon/core/gui/app.py b/daemon/core/gui/app.py index 3a19b9eb..31651cfa 100644 --- a/daemon/core/gui/app.py +++ b/daemon/core/gui/app.py @@ -22,10 +22,6 @@ class Application(tk.Frame): # load node icons NodeUtils.setup() - self.fonts_size = {name: font.nametofont(name)["size"] for name in font.names()} - self.icon_text_font = font.Font(family="TkIconFont", size=12) - self.edge_font = font.Font(family="TkDefaultFont", size=8) - # widgets self.menubar = None self.toolbar = None @@ -33,8 +29,15 @@ class Application(tk.Frame): self.statusbar = None self.validation = None + # fonts + self.fonts_size = None + self.icon_text_font = None + self.edge_font = None + # setup self.guiconfig = appconfig.read() + self.app_scale = self.guiconfig["scale"] + self.setup_scaling() self.style = ttk.Style() self.setup_theme() self.core = CoreClient(self, proxy) @@ -42,6 +45,20 @@ class Application(tk.Frame): self.draw() self.core.set_up() + def setup_scaling(self): + self.fonts_size = {name: font.nametofont(name)["size"] for name in font.names()} + for name in font.names(): + f = font.nametofont(name) + if name in self.fonts_size: + if name == "TkSmallCaptionFont": + f.config(size=int(self.fonts_size[name] * self.app_scale * 8 / 9)) + else: + f.config(size=int(self.fonts_size[name] * self.app_scale)) + self.icon_text_font = font.Font( + family="TkIconFont", size=int(12 * self.app_scale) + ) + self.edge_font = font.Font(family="TkDefaultFont", size=int(8 * self.app_scale)) + def setup_theme(self): themes.load(self.style) self.master.bind_class("Menu", "<>", themes.theme_change_menu) @@ -62,7 +79,9 @@ class Application(tk.Frame): screen_height = self.master.winfo_screenheight() x = int((screen_width / 2) - (WIDTH / 2)) y = int((screen_height / 2) - (HEIGHT / 2)) - self.master.geometry(f"{WIDTH}x{HEIGHT}+{x}+{y}") + self.master.geometry( + f"{int(WIDTH * self.app_scale)}x{int(HEIGHT * self.app_scale)}+{x}+{y}" + ) def draw(self): self.master.option_add("*tearOff", tk.FALSE) diff --git a/daemon/core/gui/appconfig.py b/daemon/core/gui/appconfig.py index f73a842c..97c76065 100644 --- a/daemon/core/gui/appconfig.py +++ b/daemon/core/gui/appconfig.py @@ -96,6 +96,7 @@ def check_directory(): "nodes": [], "recentfiles": [], "observers": [{"name": "hello", "cmd": "echo hello"}], + "scale": 1.0, } save(config) diff --git a/daemon/core/gui/dialogs/preferences.py b/daemon/core/gui/dialogs/preferences.py index 45feef8c..440fab40 100644 --- a/daemon/core/gui/dialogs/preferences.py +++ b/daemon/core/gui/dialogs/preferences.py @@ -17,7 +17,7 @@ HEIGHT = 800 class PreferencesDialog(Dialog): def __init__(self, master: "Application", app: "Application"): super().__init__(master, app, "Preferences", modal=True) - self.gui_scale = tk.DoubleVar(value=self.app.canvas.app_scale) + self.gui_scale = tk.DoubleVar(value=self.app.app_scale) preferences = self.app.guiconfig["preferences"] self.editor = tk.StringVar(value=preferences["editor"]) self.theme = tk.StringVar(value=preferences["theme"]) @@ -111,15 +111,17 @@ class PreferencesDialog(Dialog): preferences["editor"] = self.editor.get() preferences["gui3d"] = self.gui3d.get() preferences["theme"] = self.theme.get() + self.gui_scale.set(round(self.gui_scale.get(), 2)) + app_scale = self.gui_scale.get() + self.app.guiconfig["scale"] = app_scale + self.app.save_config() self.scale_adjust() self.destroy() def scale_adjust(self): - self.gui_scale.set(round(self.gui_scale.get(), 2)) app_scale = self.gui_scale.get() - self.app.canvas.app_scale = app_scale - + self.app.app_scale = app_scale self.app.master.tk.call("tk", "scaling", app_scale) # scale fonts diff --git a/daemon/core/gui/graph/edges.py b/daemon/core/gui/graph/edges.py index 413d94ac..9516de14 100644 --- a/daemon/core/gui/graph/edges.py +++ b/daemon/core/gui/graph/edges.py @@ -32,7 +32,7 @@ class CanvasWirelessEdge: self.id = self.canvas.create_line( *position, tags=tags.WIRELESS_EDGE, - width=1.5 * self.canvas.app_scale, + width=1.5 * self.canvas.app.app_scale, fill="#009933", ) @@ -68,7 +68,7 @@ class CanvasEdge: x2, y2, tags=tags.EDGE, - width=EDGE_WIDTH * self.canvas.app_scale, + width=EDGE_WIDTH * self.canvas.app.app_scale, fill=EDGE_COLOR, ) self.text_src = None diff --git a/daemon/core/gui/graph/graph.py b/daemon/core/gui/graph/graph.py index d65f8c1c..dd5025fd 100644 --- a/daemon/core/gui/graph/graph.py +++ b/daemon/core/gui/graph/graph.py @@ -53,9 +53,6 @@ class CanvasGraph(tk.Canvas): self.marker_tool = None self.to_copy = [] - # app's scale, different scale values to support higher resolution display - self.app_scale = 1.0 - # background related self.wallpaper_id = None self.wallpaper = None @@ -223,10 +220,14 @@ class CanvasGraph(tk.Canvas): # peer to peer node is not drawn on the GUI if NodeUtils.is_ignore_node(core_node.type): continue - image = NodeUtils.node_image(core_node, self.app.guiconfig, self.app_scale) + image = NodeUtils.node_image( + core_node, self.app.guiconfig, self.app.app_scale + ) # if the gui can't find node's image, default to the "edit-node" image if not image: - image = Images.get(ImageEnum.EDITNODE, int(ICON_SIZE * self.app_scale)) + image = Images.get( + ImageEnum.EDITNODE, int(ICON_SIZE * self.app.app_scale) + ) x = core_node.position.x y = core_node.position.y node = CanvasNode(self.master, x, y, core_node, image) @@ -667,7 +668,7 @@ class CanvasGraph(tk.Canvas): actual_x, actual_y, self.node_draw.node_type, self.node_draw.model ) self.node_draw.image = Images.get( - self.node_draw.image_enum, int(ICON_SIZE * self.app_scale) + self.node_draw.image_enum, int(ICON_SIZE * self.app.app_scale) ) node = CanvasNode(self.master, x, y, core_node, self.node_draw.image) self.core.canvas_nodes[core_node.id] = node @@ -923,11 +924,11 @@ class CanvasGraph(tk.Canvas): image_enum = TypeToImage.get( canvas_node.core_node.type, canvas_node.core_node.model ) - img = Images.get(image_enum, int(ICON_SIZE * self.app_scale)) + img = Images.get(image_enum, int(ICON_SIZE * self.app.app_scale)) self.itemconfig(nid, image=img) canvas_node.image = img canvas_node.scale_text() for edge_id in self.find_withtag(tags.EDGE): - self.itemconfig(edge_id, width=int(EDGE_WIDTH * self.app_scale)) + self.itemconfig(edge_id, width=int(EDGE_WIDTH * self.app.app_scale)) diff --git a/daemon/core/gui/toolbar.py b/daemon/core/gui/toolbar.py index 10075b74..d0702386 100644 --- a/daemon/core/gui/toolbar.py +++ b/daemon/core/gui/toolbar.py @@ -85,10 +85,7 @@ class Toolbar(ttk.Frame): self.draw() def get_icon(self, image_enum, width=TOOLBAR_SIZE): - if not self.app.canvas: - return Images.get(image_enum, width) - else: - return Images.get(image_enum, int(width * self.app.canvas.app_scale)) + return Images.get(image_enum, int(width * self.app.app_scale)) def draw(self): self.columnconfigure(0, weight=1) @@ -349,7 +346,7 @@ class Toolbar(ttk.Frame): """ Create network layer button """ - image = icon(ImageEnum.ROUTER, TOOLBAR_SIZE) + image = self.get_icon(ImageEnum.ROUTER, TOOLBAR_SIZE) self.node_button = ttk.Button( self.design_frame, image=image, command=self.draw_node_picker ) @@ -390,7 +387,7 @@ class Toolbar(ttk.Frame): Create link-layer node button and the options that represent different link-layer node types. """ - image = icon(ImageEnum.HUB) + image = self.get_icon(ImageEnum.HUB, TOOLBAR_SIZE) self.network_button = ttk.Button( self.design_frame, image=image, command=self.draw_network_picker ) @@ -429,7 +426,7 @@ class Toolbar(ttk.Frame): """ Create marker button and options that represent different marker types """ - image = icon(ImageEnum.MARKER) + image = self.get_icon(ImageEnum.MARKER, TOOLBAR_SIZE) self.annotation_button = ttk.Button( self.design_frame, image=image, command=self.draw_annotation_picker ) @@ -518,7 +515,7 @@ class Toolbar(ttk.Frame): # def scale_button(cls, button, image_enum, scale): def scale_button(self, button, image_enum): - image = icon(image_enum, int(TOOLBAR_SIZE * self.app.canvas.app_scale)) + image = icon(image_enum, int(TOOLBAR_SIZE * self.app.app_scale)) button.config(image=image) button.image = image