sacle toolbar button after choosing a node from node picker, scale canvas nodes and canvas node text

This commit is contained in:
Huy Pham 2020-02-13 12:15:56 -08:00
parent 9cd756f2dc
commit 55b6cbbd90
5 changed files with 44 additions and 11 deletions

View file

@ -137,3 +137,5 @@ class PreferencesDialog(Dialog):
# scale toolbar icons and picker icons # scale toolbar icons and picker icons
self.app.toolbar.scale() self.app.toolbar.scale()
self.app.canvas.scale_graph()

View file

@ -12,7 +12,7 @@ from core.gui.graph.enums import GraphMode, ScaleOption
from core.gui.graph.node import CanvasNode from core.gui.graph.node import CanvasNode
from core.gui.graph.shape import Shape from core.gui.graph.shape import Shape
from core.gui.graph.shapeutils import ShapeType, is_draw_shape, is_marker from core.gui.graph.shapeutils import ShapeType, is_draw_shape, is_marker
from core.gui.images import ImageEnum, Images from core.gui.images import ImageEnum, Images, TypeToImage
from core.gui.nodeutils import EdgeUtils, NodeUtils from core.gui.nodeutils import EdgeUtils, NodeUtils
if TYPE_CHECKING: if TYPE_CHECKING:
@ -914,3 +914,14 @@ class CanvasGraph(tk.Canvas):
width=self.itemcget(edge.id, "width"), width=self.itemcget(edge.id, "width"),
fill=self.itemcget(edge.id, "fill"), fill=self.itemcget(edge.id, "fill"),
) )
def scale_graph(self):
for nid, canvas_node in self.nodes.items():
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))
self.itemconfig(nid, image=img)
canvas_node.image = img
canvas_node.scale_text()

View file

@ -106,6 +106,12 @@ class CanvasNode:
image_box = self.canvas.bbox(self.id) image_box = self.canvas.bbox(self.id)
return image_box[3] + NODE_TEXT_OFFSET return image_box[3] + NODE_TEXT_OFFSET
def scale_text(self):
text_bound = self.canvas.bbox(self.text_id)
prev_y = (text_bound[3] + text_bound[1]) / 2
new_y = self._get_label_y()
self.canvas.move(self.text_id, 0, new_y - prev_y)
def move(self, x: int, y: int): def move(self, x: int, y: int):
x, y = self.canvas.get_scaled_coords(x, y) x, y = self.canvas.get_scaled_coords(x, y)
current_x, current_y = self.canvas.coords(self.id) current_x, current_y = self.canvas.coords(self.id)

View file

@ -3,6 +3,7 @@ from tkinter import messagebox
from PIL import Image, ImageTk from PIL import Image, ImageTk
from core.api.grpc import core_pb2
from core.gui.appconfig import LOCAL_ICONS_PATH from core.gui.appconfig import LOCAL_ICONS_PATH
@ -90,3 +91,23 @@ class ImageEnum(Enum):
SHUTDOWN = "shutdown" SHUTDOWN = "shutdown"
CANCEL = "cancel" CANCEL = "cancel"
ERROR = "error" ERROR = "error"
class TypeToImage:
type_to_image = {
(core_pb2.NodeType.DEFAULT, "router"): ImageEnum.ROUTER,
(core_pb2.NodeType.DEFAULT, "PC"): ImageEnum.PC,
(core_pb2.NodeType.DEFAULT, "host"): ImageEnum.HOST,
(core_pb2.NodeType.DEFAULT, "mdr"): ImageEnum.MDR,
(core_pb2.NodeType.DEFAULT, "prouter"): ImageEnum.PROUTER,
(core_pb2.NodeType.HUB, ""): ImageEnum.HUB,
(core_pb2.NodeType.SWITCH, ""): ImageEnum.SWITCH,
(core_pb2.NodeType.WIRELESS_LAN, ""): ImageEnum.WLAN,
(core_pb2.NodeType.EMANE, ""): ImageEnum.EMANE,
(core_pb2.NodeType.RJ45, ""): ImageEnum.RJ45,
(core_pb2.NodeType.TUNNEL, ""): ImageEnum.TUNNEL,
}
@classmethod
def get(cls, node_type, model):
return cls.type_to_image.get((node_type, model), None)

View file

@ -103,21 +103,18 @@ class Toolbar(ttk.Frame):
self.design_frame.columnconfigure(0, weight=1) self.design_frame.columnconfigure(0, weight=1)
self.play_button = self.create_button( self.play_button = self.create_button(
self.design_frame, self.design_frame,
# icon(ImageEnum.START),
self.get_icon(ImageEnum.START), self.get_icon(ImageEnum.START),
self.click_start, self.click_start,
"start the session", "start the session",
) )
self.select_button = self.create_button( self.select_button = self.create_button(
self.design_frame, self.design_frame,
# icon(ImageEnum.SELECT),
self.get_icon(ImageEnum.SELECT), self.get_icon(ImageEnum.SELECT),
self.click_selection, self.click_selection,
"selection tool", "selection tool",
) )
self.link_button = self.create_button( self.link_button = self.create_button(
self.design_frame, self.design_frame,
# icon(ImageEnum.LINK),
self.get_icon(ImageEnum.LINK), self.get_icon(ImageEnum.LINK),
self.click_link, self.click_link,
"link tool", "link tool",
@ -152,21 +149,18 @@ class Toolbar(ttk.Frame):
self.stop_button = self.create_button( self.stop_button = self.create_button(
self.runtime_frame, self.runtime_frame,
# icon(ImageEnum.STOP),
self.get_icon(ImageEnum.STOP), self.get_icon(ImageEnum.STOP),
self.click_stop, self.click_stop,
"stop the session", "stop the session",
) )
self.runtime_select_button = self.create_button( self.runtime_select_button = self.create_button(
self.runtime_frame, self.runtime_frame,
# icon(ImageEnum.SELECT),
self.get_icon(ImageEnum.SELECT), self.get_icon(ImageEnum.SELECT),
self.click_runtime_selection, self.click_runtime_selection,
"selection tool", "selection tool",
) )
self.plot_button = self.create_button( self.plot_button = self.create_button(
self.runtime_frame, self.runtime_frame,
# icon(ImageEnum.PLOT),
self.get_icon(ImageEnum.PLOT), self.get_icon(ImageEnum.PLOT),
self.click_plot_button, self.click_plot_button,
"plot", "plot",
@ -192,8 +186,7 @@ class Toolbar(ttk.Frame):
self.node_picker = ttk.Frame(self.master) self.node_picker = ttk.Frame(self.master)
# draw default nodes # draw default nodes
for node_draw in NodeUtils.NODES: for node_draw in NodeUtils.NODES:
toolbar_image = icon(node_draw.image_enum) toolbar_image = self.get_icon(node_draw.image_enum, TOOLBAR_SIZE)
# image = icon(node_draw.image_enum, PICKER_SIZE)
image = self.get_icon(node_draw.image_enum, PICKER_SIZE) image = self.get_icon(node_draw.image_enum, PICKER_SIZE)
func = partial( func = partial(
self.update_button, self.update_button,
@ -372,7 +365,7 @@ class Toolbar(ttk.Frame):
self.hide_pickers() self.hide_pickers()
self.network_picker = ttk.Frame(self.master) self.network_picker = ttk.Frame(self.master)
for node_draw in NodeUtils.NETWORK_NODES: for node_draw in NodeUtils.NETWORK_NODES:
toolbar_image = icon(node_draw.image_enum) toolbar_image = self.get_icon(node_draw.image_enum, TOOLBAR_SIZE)
image = self.get_icon(node_draw.image_enum, PICKER_SIZE) image = self.get_icon(node_draw.image_enum, PICKER_SIZE)
self.create_picker_button( self.create_picker_button(
image, image,
@ -419,7 +412,7 @@ class Toolbar(ttk.Frame):
(ImageEnum.TEXT, ShapeType.TEXT), (ImageEnum.TEXT, ShapeType.TEXT),
] ]
for image_enum, shape_type in nodes: for image_enum, shape_type in nodes:
toolbar_image = icon(image_enum) toolbar_image = self.get_icon(image_enum, TOOLBAR_SIZE)
image = self.get_icon(image_enum, PICKER_SIZE) image = self.get_icon(image_enum, PICKER_SIZE)
self.create_picker_button( self.create_picker_button(
image, image,