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