From ede9e93b52265edc7751771c1dc65df366d2159d Mon Sep 17 00:00:00 2001 From: Huy Pham <42948410+hpham@users.noreply.github.com> Date: Mon, 3 Feb 2020 09:10:46 -0800 Subject: [PATCH 1/3] add a menu option for opening recent files, hard code some example xml files for testing --- daemon/core/gui/menuaction.py | 11 +++++++---- daemon/core/gui/menubar.py | 20 ++++++++++++++++++++ 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/daemon/core/gui/menuaction.py b/daemon/core/gui/menuaction.py index 6f7e5371..870bb239 100644 --- a/daemon/core/gui/menuaction.py +++ b/daemon/core/gui/menuaction.py @@ -89,12 +89,15 @@ class MenuAction: title="Open", filetypes=(("XML Files", "*.xml"), ("All Files", "*")), ) - if file_path: - self.app.core.xml_file = file_path - self.app.core.xml_dir = str(os.path.dirname(file_path)) + self.open_xml_task(file_path) + + def open_xml_task(self, filename): + if filename: + self.app.core.xml_file = filename + self.app.core.xml_dir = str(os.path.dirname(filename)) self.prompt_save_running_session() self.app.statusbar.progress_bar.start(5) - task = BackgroundTask(self.app, self.app.core.open_xml, args=(file_path,)) + task = BackgroundTask(self.app, self.app.core.open_xml, args=(filename,)) task.start() def gui_preferences(self): diff --git a/daemon/core/gui/menubar.py b/daemon/core/gui/menubar.py index afaf2b1a..83852f29 100644 --- a/daemon/core/gui/menubar.py +++ b/daemon/core/gui/menubar.py @@ -1,3 +1,5 @@ +import logging +import os import tkinter as tk from functools import partial from typing import TYPE_CHECKING @@ -55,6 +57,17 @@ class Menubar(tk.Menu): menu.add_command(label="Save", accelerator="Ctrl+S", command=self.save) menu.add_command(label="Reload", underline=0, state=tk.DISABLED) self.app.bind_all("", self.save) + sample_xmls = [ + "sample1.xml", + "/home/ncs/.coretk/xmls/sample1.xml", + "sample1.xml", + ] + recent = tk.Menu(menu) + for i in sample_xmls: + recent.add_command(label=i, command=partial(self.open_recent_files, i)) + menu.add_cascade(label="Recent files", menu=recent) + + # menu.add_command(label="Recent files") menu.add_separator() menu.add_command(label="Export Python script...", state=tk.DISABLED) menu.add_command(label="Execute XML or Python script...", state=tk.DISABLED) @@ -409,6 +422,13 @@ class Menubar(tk.Menu): menu.add_command(label="About", command=self.menuaction.show_about) self.add_cascade(label="Help", menu=menu) + def open_recent_files(self, filename: str): + if os.path.isfile(filename): + logging.debug("Open recent file %s", filename) + self.menuaction.open_xml_task(filename) + else: + logging.warning("File does not exist %s", filename) + def save(self): xml_file = self.app.core.xml_file if xml_file: From 875739e748f1b9cb49789f149aa7b56231f85066 Mon Sep 17 00:00:00 2001 From: Huy Pham <42948410+hpham@users.noreply.github.com> Date: Mon, 3 Feb 2020 10:35:25 -0800 Subject: [PATCH 2/3] track nodes whose services have been modified by the user to differentiate between newly created nodes and default type nodes with empty services --- daemon/core/gui/coreclient.py | 9 +++++++++ daemon/core/gui/dialogs/nodeservice.py | 10 +++++++++- daemon/core/gui/graph/graph.py | 5 +++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/daemon/core/gui/coreclient.py b/daemon/core/gui/coreclient.py index fa3b91a9..487cf03f 100644 --- a/daemon/core/gui/coreclient.py +++ b/daemon/core/gui/coreclient.py @@ -110,6 +110,8 @@ class CoreClient: self.xml_dir = None self.xml_file = None + self.modified_service_nodes = set() + def reset(self): # helpers self.interfaces_manager.reset() @@ -124,6 +126,7 @@ class CoreClient: self.emane_config = None self.service_configs.clear() self.file_configs.clear() + self.modified_service_nodes.clear() for mobility_player in self.mobility_players.values(): mobility_player.handle_close() self.mobility_players.clear() @@ -807,6 +810,9 @@ class CoreClient: logging.error("unknown node: %s", node_id) continue del self.canvas_nodes[node_id] + + self.modified_service_nodes.discard(node_id) + if node_id in self.mobility_configs: del self.mobility_configs[node_id] if node_id in self.wlan_configs: @@ -1047,3 +1053,6 @@ class CoreClient: config = self.emane_model_configs.get(_from) if config: self.emane_model_configs[_to] = config + + def service_been_modified(self, node_id: int) -> bool: + return node_id in self.modified_service_nodes diff --git a/daemon/core/gui/dialogs/nodeservice.py b/daemon/core/gui/dialogs/nodeservice.py index 0b4391ce..c61983f7 100644 --- a/daemon/core/gui/dialogs/nodeservice.py +++ b/daemon/core/gui/dialogs/nodeservice.py @@ -36,8 +36,14 @@ class NodeServiceDialog(Dialog): services = canvas_node.core_node.services model = canvas_node.core_node.model if len(services) == 0: - if not NodeUtils.is_custom(canvas_node.core_node.model): + # not custom node type and node's services haven't been modified before + if not NodeUtils.is_custom( + canvas_node.core_node.model + ) and not self.app.core.service_been_modified(self.node_id): services = set(self.app.core.default_services[model]) + # services of default type nodes were modified to be empty + elif canvas_node.core_node.id in self.app.core.modified_service_nodes: + services = set() else: services = set( NodeUtils.get_custom_node_services(self.app.guiconfig, model) @@ -141,12 +147,14 @@ class NodeServiceDialog(Dialog): ) def click_save(self): + # if node is custom type or current services are not the default services then set core node services and add node to modified services node set if ( self.canvas_node.core_node.model not in self.app.core.default_services or self.current_services != self.app.core.default_services[self.canvas_node.core_node.model] ): self.canvas_node.core_node.services[:] = self.current_services + self.app.core.modified_service_nodes.add(self.canvas_node.core_node.id) else: if len(self.canvas_node.core_node.services) > 0: self.canvas_node.core_node.services[:] = [] diff --git a/daemon/core/gui/graph/graph.py b/daemon/core/gui/graph/graph.py index e1f2232a..cbc7e89f 100644 --- a/daemon/core/gui/graph/graph.py +++ b/daemon/core/gui/graph/graph.py @@ -856,6 +856,11 @@ class CanvasGraph(tk.Canvas): node = CanvasNode( self.master, scaled_x, scaled_y, copy, self.nodes[canvas_nid].image ) + + # add new node to modified_service_nodes set if that set contains the to_copy node + if self.app.core.service_been_modified(core_node.id): + self.app.core.modified_service_nodes.add(copy.id) + copy_map[canvas_nid] = node.id self.core.canvas_nodes[copy.id] = node self.nodes[node.id] = node From 034d126a2ad03c6c941aa2583aebaa219395d75a Mon Sep 17 00:00:00 2001 From: Huy Pham <42948410+hpham@users.noreply.github.com> Date: Mon, 3 Feb 2020 10:53:24 -0800 Subject: [PATCH 3/3] remove unnecessary comment --- daemon/core/gui/menubar.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/daemon/core/gui/menubar.py b/daemon/core/gui/menubar.py index 83852f29..29db70b1 100644 --- a/daemon/core/gui/menubar.py +++ b/daemon/core/gui/menubar.py @@ -57,6 +57,8 @@ class Menubar(tk.Menu): menu.add_command(label="Save", accelerator="Ctrl+S", command=self.save) menu.add_command(label="Reload", underline=0, state=tk.DISABLED) self.app.bind_all("", self.save) + + # some hard code values for testing sample_xmls = [ "sample1.xml", "/home/ncs/.coretk/xmls/sample1.xml", @@ -66,8 +68,6 @@ class Menubar(tk.Menu): for i in sample_xmls: recent.add_command(label=i, command=partial(self.open_recent_files, i)) menu.add_cascade(label="Recent files", menu=recent) - - # menu.add_command(label="Recent files") menu.add_separator() menu.add_command(label="Export Python script...", state=tk.DISABLED) menu.add_command(label="Execute XML or Python script...", state=tk.DISABLED)