2019-10-10 17:02:28 -07:00
|
|
|
from enum import Enum
|
2020-01-27 16:27:21 -08:00
|
|
|
from tkinter import messagebox
|
2020-06-19 22:08:24 -07:00
|
|
|
from typing import Dict, Optional, Tuple
|
2019-09-18 11:26:26 -07:00
|
|
|
|
2020-06-19 22:08:24 -07:00
|
|
|
from PIL import Image
|
|
|
|
from PIL.ImageTk import PhotoImage
|
2019-09-15 23:45:13 -07:00
|
|
|
|
2020-08-27 11:02:02 -07:00
|
|
|
from core.api.grpc.wrappers import NodeType
|
2019-12-19 09:30:21 -08:00
|
|
|
from core.gui.appconfig import LOCAL_ICONS_PATH
|
2019-09-18 11:20:22 -07:00
|
|
|
|
2019-09-15 23:45:13 -07:00
|
|
|
|
|
|
|
class Images:
|
2020-06-19 22:08:24 -07:00
|
|
|
images: Dict[str, str] = {}
|
2019-09-15 23:45:13 -07:00
|
|
|
|
2019-11-02 23:47:43 -07:00
|
|
|
@classmethod
|
2020-06-19 22:08:24 -07:00
|
|
|
def create(cls, file_path: str, width: int, height: int = None) -> PhotoImage:
|
2019-11-12 17:32:34 -08:00
|
|
|
if height is None:
|
|
|
|
height = width
|
2019-11-02 23:47:43 -07:00
|
|
|
image = Image.open(file_path)
|
2019-11-12 17:32:34 -08:00
|
|
|
image = image.resize((width, height), Image.ANTIALIAS)
|
2020-06-19 22:08:24 -07:00
|
|
|
return PhotoImage(image)
|
2019-11-02 23:47:43 -07:00
|
|
|
|
2019-11-01 10:45:47 -07:00
|
|
|
@classmethod
|
2020-06-19 22:08:24 -07:00
|
|
|
def load_all(cls) -> None:
|
2019-11-01 16:31:40 -07:00
|
|
|
for image in LOCAL_ICONS_PATH.glob("*"):
|
2019-11-12 17:32:34 -08:00
|
|
|
cls.images[image.stem] = str(image)
|
2019-09-15 23:45:13 -07:00
|
|
|
|
|
|
|
@classmethod
|
2020-06-19 22:08:24 -07:00
|
|
|
def get(cls, image_enum: Enum, width: int, height: int = None) -> PhotoImage:
|
2019-11-12 17:32:34 -08:00
|
|
|
file_path = cls.images[image_enum.value]
|
|
|
|
return cls.create(file_path, width, height)
|
2019-10-01 16:25:26 -07:00
|
|
|
|
2019-11-07 11:33:40 -08:00
|
|
|
@classmethod
|
2020-01-27 16:27:21 -08:00
|
|
|
def get_with_image_file(
|
|
|
|
cls, stem: str, width: int, height: int = None
|
2020-06-19 22:08:24 -07:00
|
|
|
) -> PhotoImage:
|
2020-01-27 16:27:21 -08:00
|
|
|
file_path = cls.images[stem]
|
2019-11-12 17:32:34 -08:00
|
|
|
return cls.create(file_path, width, height)
|
2019-11-07 11:33:40 -08:00
|
|
|
|
2020-01-27 16:27:21 -08:00
|
|
|
@classmethod
|
2020-06-19 22:08:24 -07:00
|
|
|
def get_custom(cls, name: str, width: int, height: int = None) -> PhotoImage:
|
2020-01-27 16:27:21 -08:00
|
|
|
try:
|
|
|
|
file_path = cls.images[name]
|
|
|
|
return cls.create(file_path, width, height)
|
|
|
|
except KeyError:
|
|
|
|
messagebox.showwarning(
|
|
|
|
"Missing image file",
|
2020-04-18 09:02:15 -07:00
|
|
|
f"{name}.png is missing at daemon/core/gui/data/icons, drop image "
|
|
|
|
f"file at daemon/core/gui/data/icons and restart the gui",
|
2020-01-27 16:27:21 -08:00
|
|
|
)
|
|
|
|
|
2019-10-01 16:25:26 -07:00
|
|
|
|
2019-10-10 17:02:28 -07:00
|
|
|
class ImageEnum(Enum):
|
|
|
|
SWITCH = "lanswitch"
|
|
|
|
CORE = "core-icon"
|
|
|
|
START = "start"
|
|
|
|
MARKER = "marker"
|
|
|
|
ROUTER = "router"
|
|
|
|
SELECT = "select"
|
|
|
|
LINK = "link"
|
|
|
|
HUB = "hub"
|
|
|
|
WLAN = "wlan"
|
2019-11-01 08:35:14 -07:00
|
|
|
EMANE = "emane"
|
2019-10-10 17:02:28 -07:00
|
|
|
RJ45 = "rj45"
|
|
|
|
TUNNEL = "tunnel"
|
|
|
|
OVAL = "oval"
|
|
|
|
RECTANGLE = "rectangle"
|
|
|
|
TEXT = "text"
|
|
|
|
HOST = "host"
|
|
|
|
PC = "pc"
|
|
|
|
MDR = "mdr"
|
2019-11-21 12:33:43 -08:00
|
|
|
PROUTER = "prouter"
|
2019-10-10 17:02:28 -07:00
|
|
|
OVS = "OVS"
|
2019-11-21 12:33:43 -08:00
|
|
|
EDITNODE = "edit-node"
|
2019-10-10 17:02:28 -07:00
|
|
|
PLOT = "plot"
|
|
|
|
TWONODE = "twonode"
|
2019-11-27 08:48:21 -08:00
|
|
|
PAUSE = "pause"
|
2019-10-10 17:02:28 -07:00
|
|
|
STOP = "stop"
|
|
|
|
OBSERVE = "observe"
|
|
|
|
RUN = "run"
|
2019-10-18 16:42:00 -07:00
|
|
|
DOCUMENTNEW = "document-new"
|
2019-11-11 16:34:41 -08:00
|
|
|
DOCUMENTSAVE = "document-save"
|
2019-10-18 16:42:00 -07:00
|
|
|
FILEOPEN = "fileopen"
|
|
|
|
EDITDELETE = "edit-delete"
|
|
|
|
ANTENNA = "antenna"
|
2019-11-15 13:09:53 -08:00
|
|
|
DOCKER = "docker"
|
|
|
|
LXC = "lxc"
|
2019-12-12 10:49:52 -08:00
|
|
|
ALERT = "alert"
|
2020-01-15 15:23:49 -08:00
|
|
|
DELETE = "delete"
|
|
|
|
SHUTDOWN = "shutdown"
|
|
|
|
CANCEL = "cancel"
|
2020-02-05 15:53:14 -08:00
|
|
|
ERROR = "error"
|
2020-02-13 12:15:56 -08:00
|
|
|
|
|
|
|
|
|
|
|
class TypeToImage:
|
2020-06-19 22:08:24 -07:00
|
|
|
type_to_image: Dict[Tuple[NodeType, str], ImageEnum] = {
|
|
|
|
(NodeType.DEFAULT, "router"): ImageEnum.ROUTER,
|
|
|
|
(NodeType.DEFAULT, "PC"): ImageEnum.PC,
|
|
|
|
(NodeType.DEFAULT, "host"): ImageEnum.HOST,
|
|
|
|
(NodeType.DEFAULT, "mdr"): ImageEnum.MDR,
|
|
|
|
(NodeType.DEFAULT, "prouter"): ImageEnum.PROUTER,
|
|
|
|
(NodeType.HUB, ""): ImageEnum.HUB,
|
|
|
|
(NodeType.SWITCH, ""): ImageEnum.SWITCH,
|
|
|
|
(NodeType.WIRELESS_LAN, ""): ImageEnum.WLAN,
|
|
|
|
(NodeType.EMANE, ""): ImageEnum.EMANE,
|
|
|
|
(NodeType.RJ45, ""): ImageEnum.RJ45,
|
|
|
|
(NodeType.TUNNEL, ""): ImageEnum.TUNNEL,
|
|
|
|
(NodeType.DOCKER, ""): ImageEnum.DOCKER,
|
|
|
|
(NodeType.LXC, ""): ImageEnum.LXC,
|
2020-02-13 12:15:56 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
@classmethod
|
2020-06-19 22:08:24 -07:00
|
|
|
def get(cls, node_type, model) -> Optional[ImageEnum]:
|
|
|
|
return cls.type_to_image.get((node_type, model))
|