def draw_emane_buttons(self) -> None: frame = ttk.Frame(self.top) frame.grid(sticky=tk.EW, pady=PADY) for i in range(2): frame.columnconfigure(i, weight=1) image = images.from_enum(ImageEnum.EDITNODE, width=images.BUTTON_SIZE) self.emane_model_button = ttk.Button( frame, text=f"{self.emane_model.get()} options", image=image, compound=tk.RIGHT, command=self.click_model_config, ) self.emane_model_button.image = image self.emane_model_button.grid(row=0, column=0, padx=PADX, sticky=tk.EW) image = images.from_enum(ImageEnum.EDITNODE, width=images.BUTTON_SIZE) button = ttk.Button( frame, text="EMANE options", image=image, compound=tk.RIGHT, command=self.click_emane_config, ) button.image = image button.grid(row=0, column=1, sticky=tk.EW)
def draw_buttons(self) -> None: frame = ttk.Frame(self.top) for i in range(4): frame.columnconfigure(i, weight=1) frame.grid(sticky=tk.EW) image = images.from_enum(ImageEnum.DOCUMENTNEW, width=images.BUTTON_SIZE) b = ttk.Button(frame, image=image, text="New", compound=tk.LEFT, command=self.click_new) b.image = image b.grid(row=0, padx=PADX, sticky=tk.EW) image = images.from_enum(ImageEnum.FILEOPEN, width=images.BUTTON_SIZE) self.connect_button = ttk.Button( frame, image=image, text="Connect", compound=tk.LEFT, command=self.click_connect, state=tk.DISABLED, ) self.connect_button.image = image self.connect_button.grid(row=0, column=1, padx=PADX, sticky=tk.EW) image = images.from_enum(ImageEnum.DELETE, width=images.BUTTON_SIZE) self.delete_button = ttk.Button( frame, image=image, text="Delete", compound=tk.LEFT, command=self.click_delete, state=tk.DISABLED, ) self.delete_button.image = image self.delete_button.grid(row=0, column=2, padx=PADX, sticky=tk.EW) image = images.from_enum(ImageEnum.CANCEL, width=images.BUTTON_SIZE) if self.is_start_app: b = ttk.Button( frame, image=image, text="Exit", compound=tk.LEFT, command=self.click_exit, ) else: b = ttk.Button( frame, image=image, text="Cancel", compound=tk.LEFT, command=self.destroy, ) b.image = image b.grid(row=0, column=3, sticky=tk.EW)
def setup() -> None: global ANTENNA_ICON nodes = [ (ImageEnum.ROUTER, NodeType.DEFAULT, "Router", "router"), (ImageEnum.HOST, NodeType.DEFAULT, "Host", "host"), (ImageEnum.PC, NodeType.DEFAULT, "PC", "PC"), (ImageEnum.MDR, NodeType.DEFAULT, "MDR", "mdr"), (ImageEnum.PROUTER, NodeType.DEFAULT, "PRouter", "prouter"), (ImageEnum.DOCKER, NodeType.DOCKER, "Docker", None), (ImageEnum.LXC, NodeType.LXC, "LXC", None), ] for image_enum, node_type, label, model in nodes: node_draw = NodeDraw.from_setup(image_enum, node_type, label, model) NODES.append(node_draw) NODE_ICONS[(node_type, model)] = node_draw.image network_nodes = [ (ImageEnum.HUB, NodeType.HUB, "Hub"), (ImageEnum.SWITCH, NodeType.SWITCH, "Switch"), (ImageEnum.WLAN, NodeType.WIRELESS_LAN, "WLAN"), (ImageEnum.EMANE, NodeType.EMANE, "EMANE"), (ImageEnum.RJ45, NodeType.RJ45, "RJ45"), (ImageEnum.TUNNEL, NodeType.TUNNEL, "Tunnel"), ] for image_enum, node_type, label in network_nodes: node_draw = NodeDraw.from_setup(image_enum, node_type, label) NETWORK_NODES.append(node_draw) NODE_ICONS[(node_type, None)] = node_draw.image ANTENNA_ICON = images.from_enum(ImageEnum.ANTENNA, width=images.ANTENNA_SIZE)
def get_icon(node: Node, app: "Application") -> PhotoImage: scale = app.app_scale image = None # node icon was overriden with a specific value if node.icon: try: image = images.from_file(node.icon, width=images.NODE_SIZE, scale=scale) except OSError: logging.error("invalid icon: %s", node.icon) # custom node elif is_custom(node): image_file = _get_custom_file(app.guiconfig, node.model) logging.info("custom node file: %s", image_file) if image_file: image = images.from_file(image_file, width=images.NODE_SIZE, scale=scale) # built in node else: image = images.from_node(node, scale=scale) # default image, if everything above fails if not image: image = images.from_enum(ImageEnum.EDITNODE, width=images.NODE_SIZE, scale=scale) return image
def draw_emane_configuration(self) -> None: """ draw the main frame for emane configuration """ label = ttk.Label( self.top, text= "The EMANE emulation system provides more complex wireless radio " "emulation \nusing pluggable MAC and PHY modules. Refer to the wiki " "for configuration option details", justify=tk.CENTER, ) label.grid(pady=PADY) image = images.from_enum(ImageEnum.EDITNODE, width=images.BUTTON_SIZE) button = ttk.Button( self.top, image=image, text="EMANE Wiki", compound=tk.RIGHT, command=lambda: webbrowser.open_new( "https://github.com/adjacentlink/emane/wiki"), ) button.image = image button.grid(sticky=tk.EW, pady=PADY)
def setup_app(self) -> None: self.master.title("CORE") self.center() self.master.protocol("WM_DELETE_WINDOW", self.on_closing) image = images.from_enum(ImageEnum.CORE, width=images.DIALOG_SIZE) self.master.tk.call("wm", "iconphoto", self.master._w, image) self.master.option_add("*tearOff", tk.FALSE) self.setup_file_dialogs()
def draw(self) -> None: self.top.columnconfigure(0, weight=1) self.top.rowconfigure(1, weight=1) image = images.from_enum(ImageEnum.ERROR, width=images.ERROR_SIZE) label = ttk.Label( self.top, text=self.message, image=image, compound=tk.LEFT, anchor=tk.CENTER ) label.image = image label.grid(sticky=tk.W, pady=PADY) self.error_message = CodeText(self.top) self.error_message.text.insert("1.0", self.details) self.error_message.text.config(state=tk.DISABLED) self.error_message.grid(sticky=tk.EW, pady=PADY) button = ttk.Button(self.top, text="Close", command=lambda: self.destroy()) button.grid(sticky=tk.EW)
def from_setup( cls, image_enum: ImageEnum, node_type: NodeType, label: str, model: str = None, tooltip: str = None, ) -> "NodeDraw": node_draw = NodeDraw() node_draw.image_enum = image_enum node_draw.image = images.from_enum(image_enum, width=images.NODE_SIZE) node_draw.node_type = node_type node_draw.label = label node_draw.model = model node_draw.tooltip = tooltip return node_draw
def __init__( self, app: "Application", title: str, modal: bool = True, master: tk.BaseWidget = None, ) -> None: if master is None: master = app super().__init__(master) self.withdraw() self.app: "Application" = app self.modal: bool = modal self.title(title) self.protocol("WM_DELETE_WINDOW", self.destroy) image = images.from_enum(ImageEnum.CORE, width=images.DIALOG_SIZE) self.tk.call("wm", "iconphoto", self._w, image) self.columnconfigure(0, weight=1) self.rowconfigure(0, weight=1) self.top: ttk.Frame = ttk.Frame(self, padding=DIALOG_PAD) self.top.grid(sticky=tk.NSEW)
def get_enum_icon(self, image_enum: ImageEnum, *, width: int) -> PhotoImage: return images.from_enum(image_enum, width=width, scale=self.app_scale)
def draw_tab_files(self) -> None: tab = ttk.Frame(self.notebook, padding=FRAME_PAD) tab.grid(sticky=tk.NSEW) tab.columnconfigure(0, weight=1) self.notebook.add(tab, text="Files") label = ttk.Label( tab, text="Config files and scripts that are generated for this service." ) label.grid() frame = ttk.Frame(tab) frame.grid(sticky=tk.EW, pady=PADY) frame.columnconfigure(1, weight=1) label = ttk.Label(frame, text="File Name") label.grid(row=0, column=0, padx=PADX, sticky=tk.W) self.filename_combobox = ttk.Combobox(frame, values=self.filenames) self.filename_combobox.bind("<<ComboboxSelected>>", self.display_service_file_data) self.filename_combobox.grid(row=0, column=1, sticky=tk.EW, padx=PADX) button = ttk.Button(frame, image=self.documentnew_img, command=self.add_filename) button.grid(row=0, column=2, padx=PADX) button = ttk.Button(frame, image=self.editdelete_img, command=self.delete_filename) button.grid(row=0, column=3) frame = ttk.Frame(tab) frame.grid(sticky=tk.EW, pady=PADY) frame.columnconfigure(1, weight=1) button = ttk.Radiobutton( frame, variable=self.radiovar, text="Copy Source File", value=1, state=tk.DISABLED, ) button.grid(row=0, column=0, sticky=tk.W, padx=PADX) entry = ttk.Entry(frame, state=tk.DISABLED) entry.grid(row=0, column=1, sticky=tk.EW, padx=PADX) image = images.from_enum(ImageEnum.FILEOPEN, width=images.BUTTON_SIZE) button = ttk.Button(frame, image=image) button.image = image button.grid(row=0, column=2) frame = ttk.Frame(tab) frame.grid(sticky=tk.EW, pady=PADY) frame.columnconfigure(0, weight=1) button = ttk.Radiobutton( frame, variable=self.radiovar, text="Use text below for file contents", value=2, ) button.grid(row=0, column=0, sticky=tk.EW) image = images.from_enum(ImageEnum.FILEOPEN, width=images.BUTTON_SIZE) button = ttk.Button(frame, image=image) button.image = image button.grid(row=0, column=1) image = images.from_enum(ImageEnum.DOCUMENTSAVE, width=images.BUTTON_SIZE) button = ttk.Button(frame, image=image) button.image = image button.grid(row=0, column=2) self.service_file_data = CodeText(tab) self.service_file_data.grid(sticky=tk.NSEW) tab.rowconfigure(self.service_file_data.grid_info()["row"], weight=1) if len(self.filenames) > 0: self.filename_combobox.current(0) self.service_file_data.text.delete(1.0, "end") self.service_file_data.text.insert( "end", self.temp_service_files[self.filenames[0]]) self.service_file_data.text.bind("<FocusOut>", self.update_temp_service_file_data)