add nodeutils function to get node's image, add a function to get edge token

This commit is contained in:
Huy Pham 2020-01-20 14:04:31 -08:00
parent 510252c4a7
commit b0087bbde1
3 changed files with 29 additions and 22 deletions

View file

@ -6,7 +6,7 @@ from typing import TYPE_CHECKING, Any, Tuple
from core.gui import themes from core.gui import themes
from core.gui.dialogs.linkconfig import LinkConfigurationDialog from core.gui.dialogs.linkconfig import LinkConfigurationDialog
from core.gui.graph import tags from core.gui.graph import tags
from core.gui.nodeutils import NodeUtils from core.gui.nodeutils import EdgeUtils, NodeUtils
if TYPE_CHECKING: if TYPE_CHECKING:
from core.gui.graph.graph import CanvasGraph from core.gui.graph.graph import CanvasGraph
@ -160,7 +160,7 @@ class CanvasEdge:
def complete(self, dst: int): def complete(self, dst: int):
self.dst = dst self.dst = dst
self.token = tuple(sorted((self.src, self.dst))) self.token = EdgeUtils.get_token(self.src, self.dst)
x, y = self.canvas.coords(self.dst) x, y = self.canvas.coords(self.dst)
x1, y1, _, _ = self.canvas.coords(self.id) x1, y1, _, _ = self.canvas.coords(self.id)
self.canvas.coords(self.id, x1, y1, x, y) self.canvas.coords(self.id, x1, y1, x, y)

View file

@ -5,7 +5,6 @@ from typing import TYPE_CHECKING, List, Tuple
from PIL import Image, ImageTk from PIL import Image, ImageTk
from core.api.grpc import core_pb2 from core.api.grpc import core_pb2
from core.gui import nodeutils
from core.gui.dialogs.shapemod import ShapeDialog from core.gui.dialogs.shapemod import ShapeDialog
from core.gui.graph import tags from core.gui.graph import tags
from core.gui.graph.edges import CanvasEdge, CanvasWirelessEdge from core.gui.graph.edges import CanvasEdge, CanvasWirelessEdge
@ -13,8 +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 Images from core.gui.nodeutils import EdgeUtils, NodeUtils
from core.gui.nodeutils import NodeUtils
if TYPE_CHECKING: if TYPE_CHECKING:
from core.gui.app import Application from core.gui.app import Application
@ -192,7 +190,7 @@ class CanvasGraph(tk.Canvas):
""" """
add a wireless edge between 2 canvas nodes add a wireless edge between 2 canvas nodes
""" """
token = tuple(sorted((src.id, dst.id))) token = EdgeUtils.get_token(src.id, dst.id)
x1, y1 = self.coords(src.id) x1, y1 = self.coords(src.id)
x2, y2 = self.coords(dst.id) x2, y2 = self.coords(dst.id)
position = (x1, y1, x2, y2) position = (x1, y1, x2, y2)
@ -204,7 +202,7 @@ class CanvasGraph(tk.Canvas):
self.tag_raise(dst.id) self.tag_raise(dst.id)
def delete_wireless_edge(self, src: CanvasNode, dst: CanvasNode): def delete_wireless_edge(self, src: CanvasNode, dst: CanvasNode):
token = tuple(sorted((src.id, dst.id))) token = EdgeUtils.get_token(src.id, dst.id)
edge = self.wireless_edges.pop(token) edge = self.wireless_edges.pop(token)
edge.delete() edge.delete()
src.wireless_edges.remove(edge) src.wireless_edges.remove(edge)
@ -219,16 +217,7 @@ class CanvasGraph(tk.Canvas):
# peer to peer node is not drawn on the GUI # peer to peer node is not drawn on the GUI
if NodeUtils.is_ignore_node(core_node.type): if NodeUtils.is_ignore_node(core_node.type):
continue continue
image = NodeUtils.node_image(core_node)
# draw nodes on the canvas
logging.info("drawing core node: %s", core_node)
image = NodeUtils.node_icon(core_node.type, core_node.model)
if core_node.icon:
try:
image = Images.create(core_node.icon, nodeutils.ICON_SIZE)
except OSError:
logging.error("invalid icon: %s", core_node.icon)
x = core_node.position.x x = core_node.position.x
y = core_node.position.y y = core_node.position.y
node = CanvasNode(self.master, x, y, core_node, image) node = CanvasNode(self.master, x, y, core_node, image)
@ -242,7 +231,7 @@ class CanvasGraph(tk.Canvas):
node_one = canvas_node_one.core_node node_one = canvas_node_one.core_node
canvas_node_two = self.core.canvas_nodes[link.node_two_id] canvas_node_two = self.core.canvas_nodes[link.node_two_id]
node_two = canvas_node_two.core_node node_two = canvas_node_two.core_node
token = tuple(sorted((canvas_node_one.id, canvas_node_two.id))) token = EdgeUtils.get_token(canvas_node_one.id, canvas_node_two.id)
if link.type == core_pb2.LinkType.WIRELESS: if link.type == core_pb2.LinkType.WIRELESS:
self.add_wireless_edge(canvas_node_one, canvas_node_two) self.add_wireless_edge(canvas_node_one, canvas_node_two)
@ -387,7 +376,7 @@ class CanvasGraph(tk.Canvas):
return return
# ignore repeated edges # ignore repeated edges
token = tuple(sorted((edge.src, self.selected))) token = EdgeUtils.get_token(edge.src, self.selected)
if token in self.edges: if token in self.edges:
edge.delete() edge.delete()
return return
@ -885,7 +874,7 @@ class CanvasGraph(tk.Canvas):
dest_node_copy = self.nodes[copy_map[edge.token[1]]] dest_node_copy = self.nodes[copy_map[edge.token[1]]]
self.create_edge(source_node_copy, dest_node_copy) self.create_edge(source_node_copy, dest_node_copy)
copy_edge = self.edges[ copy_edge = self.edges[
tuple(sorted([source_node_copy.id, dest_node_copy.id])) EdgeUtils.get_token(source_node_copy.id, dest_node_copy.id)
] ]
copy_link = copy_edge.link copy_link = copy_edge.link
options = edge.link.options options = edge.link.options

View file

@ -1,10 +1,12 @@
from typing import TYPE_CHECKING, Optional, Set import logging
from typing import TYPE_CHECKING, Optional, Set, Tuple
from core.api.grpc.core_pb2 import NodeType from core.api.grpc.core_pb2 import NodeType
from core.gui.images import ImageEnum, Images from core.gui.images import ImageEnum, Images
if TYPE_CHECKING: if TYPE_CHECKING:
from core.api.grpc import core_pb2 from core.api.grpc import core_pb2
from PIL import ImageTk
ICON_SIZE = 48 ICON_SIZE = 48
ANTENNA_SIZE = 32 ANTENNA_SIZE = 32
@ -89,11 +91,21 @@ class NodeUtils:
return node_type in cls.RJ45_NODES return node_type in cls.RJ45_NODES
@classmethod @classmethod
def node_icon(cls, node_type: NodeType, model: str) -> bool: def node_icon(cls, node_type: NodeType, model: str) -> "ImageTk.PhotoImage":
if model == "": if model == "":
model = None model = None
return cls.NODE_ICONS[(node_type, model)] return cls.NODE_ICONS[(node_type, model)]
@classmethod
def node_image(cls, core_node: "core_pb2.Node") -> "ImageTk.PhotoImage":
image = cls.node_icon(core_node.type, core_node.model)
if core_node.icon:
try:
image = Images.create(core_node.icon, ICON_SIZE)
except OSError:
logging.error("invalid icon: %s", core_node.icon)
return image
@classmethod @classmethod
def setup(cls): def setup(cls):
nodes = [ nodes = [
@ -123,3 +135,9 @@ class NodeUtils:
cls.NETWORK_NODES.append(node_draw) cls.NETWORK_NODES.append(node_draw)
cls.NODE_ICONS[(node_type, None)] = node_draw.image cls.NODE_ICONS[(node_type, None)] = node_draw.image
cls.ANTENNA_ICON = Images.get(ImageEnum.ANTENNA, ANTENNA_SIZE) cls.ANTENNA_ICON = Images.get(ImageEnum.ANTENNA, ANTENNA_SIZE)
class EdgeUtils:
@classmethod
def get_token(cls, src: int, dst: int) -> Tuple[int, ...]:
return tuple(sorted([src, dst]))