From f5480c8e352cb3b224d1c45628090cdd8ae5f706 Mon Sep 17 00:00:00 2001 From: Blake Harnden <32446120+bharnden@users.noreply.github.com> Date: Mon, 11 Nov 2019 14:04:50 -0800 Subject: [PATCH] updated observers dialog to create/edit/delete custom observers and save configuration --- coretk/coretk/coreclient.py | 23 +++-- .../{observerwidgets.py => observers.py} | 97 ++++++++++--------- coretk/coretk/dialogs/servers.py | 1 + coretk/coretk/menuaction.py | 4 +- coretk/coretk/menubar.py | 4 +- 5 files changed, 68 insertions(+), 61 deletions(-) rename coretk/coretk/dialogs/{observerwidgets.py => observers.py} (57%) diff --git a/coretk/coretk/coreclient.py b/coretk/coretk/coreclient.py index 8ae310c9..0285d60b 100644 --- a/coretk/coretk/coreclient.py +++ b/coretk/coretk/coreclient.py @@ -84,6 +84,12 @@ class CustomNode: self.services = services +class Observer: + def __init__(self, name, cmd): + self.name = name + self.cmd = cmd + + class CoreClient: def __init__(self, app): """ @@ -124,24 +130,23 @@ class CoreClient: def read_config(self): # read distributed server - for server_config in self.app.config.get("servers", []): - server = CoreServer( - server_config["name"], server_config["address"], server_config["port"] - ) + for config in self.app.config.get("servers", []): + server = CoreServer(config["name"], config["address"], config["port"]) self.servers[server.name] = server # read custom nodes - for node in self.app.config.get("nodes", []): - image_file = node["image"] + for config in self.app.config.get("nodes", []): + image_file = config["image"] image = Images.get_custom(image_file) custom_node = CustomNode( - node["name"], image, image_file, set(node["services"]) + config["name"], image, image_file, set(config["services"]) ) self.custom_nodes[custom_node.name] = custom_node # read observers - for observer in self.app.config.get("observers", []): - self.custom_observers[observer["name"]] = observer["cmd"] + for config in self.app.config.get("observers", []): + observer = Observer(config["name"], config["cmd"]) + self.custom_observers[observer.name] = observer def handle_events(self, event): logging.info("event: %s", event) diff --git a/coretk/coretk/dialogs/observerwidgets.py b/coretk/coretk/dialogs/observers.py similarity index 57% rename from coretk/coretk/dialogs/observerwidgets.py rename to coretk/coretk/dialogs/observers.py index c1c4d170..406f62be 100644 --- a/coretk/coretk/dialogs/observerwidgets.py +++ b/coretk/coretk/dialogs/observers.py @@ -1,36 +1,31 @@ import tkinter as tk +from coretk import appdirs +from coretk.coreclient import Observer from coretk.dialogs.dialog import Dialog -class Widget: - def __init__(self, name, command): - self.name = name - self.command = command - - -class ObserverWidgetsDialog(Dialog): +class ObserverDialog(Dialog): def __init__(self, master, app): super().__init__(master, app, "Observer Widgets", modal=True) - self.config_widgets = {} - self.widgets = None + self.observers = None self.save_button = None self.delete_button = None self.selected = None self.selected_index = None self.name = tk.StringVar() - self.command = tk.StringVar() + self.cmd = tk.StringVar() self.draw() def draw(self): self.columnconfigure(0, weight=1) self.rowconfigure(0, weight=1) - self.draw_widgets() - self.draw_widget_fields() - self.draw_widget_buttons() + self.draw_listbox() + self.draw_form_fields() + self.draw_config_buttons() self.draw_apply_buttons() - def draw_widgets(self): + def draw_listbox(self): frame = tk.Frame(self) frame.grid(sticky="nsew") frame.columnconfigure(0, weight=1) @@ -39,15 +34,17 @@ class ObserverWidgetsDialog(Dialog): scrollbar = tk.Scrollbar(frame, orient=tk.VERTICAL) scrollbar.grid(row=0, column=1, sticky="ns") - self.widgets = tk.Listbox( + self.observers = tk.Listbox( frame, selectmode=tk.SINGLE, yscrollcommand=scrollbar.set ) - self.widgets.grid(row=0, column=0, sticky="nsew") - self.widgets.bind("<>", self.handle_widget_change) + self.observers.grid(row=0, column=0, sticky="nsew") + self.observers.bind("<>", self.handle_observer_change) + for name in sorted(self.app.core.custom_observers): + self.observers.insert(tk.END, name) - scrollbar.config(command=self.widgets.yview) + scrollbar.config(command=self.observers.yview) - def draw_widget_fields(self): + def draw_form_fields(self): frame = tk.Frame(self) frame.grid(sticky="ew") frame.columnconfigure(1, weight=1) @@ -59,10 +56,10 @@ class ObserverWidgetsDialog(Dialog): label = tk.Label(frame, text="Command") label.grid(row=1, column=0, sticky="w") - entry = tk.Entry(frame, textvariable=self.command) + entry = tk.Entry(frame, textvariable=self.cmd) entry.grid(row=1, column=1, sticky="ew") - def draw_widget_buttons(self): + def draw_config_buttons(self): frame = tk.Frame(self) frame.grid(pady=2, sticky="ew") for i in range(3): @@ -87,58 +84,62 @@ class ObserverWidgetsDialog(Dialog): for i in range(2): frame.columnconfigure(i, weight=1) - button = tk.Button( - frame, text="Save Configuration", command=self.click_save_configuration - ) + button = tk.Button(frame, text="Save", command=self.click_save_config) button.grid(row=0, column=0, sticky="ew") button = tk.Button(frame, text="Cancel", command=self.destroy) button.grid(row=0, column=1, sticky="ew") - def click_save_configuration(self): - pass + def click_save_config(self): + observers = [] + for name in sorted(self.app.core.custom_observers): + observer = self.app.core.custom_observers[name] + observers.append({"name": observer.name, "cmd": observer.cmd}) + self.app.config["observers"] = observers + appdirs.save_config(self.app.config) + self.destroy() def click_create(self): name = self.name.get() - if name not in self.config_widgets: - command = self.command.get() - widget = Widget(name, command) - self.config_widgets[name] = widget - self.widgets.insert(tk.END, name) + if name not in self.app.core.custom_observers: + cmd = self.cmd.get() + observer = Observer(name, cmd) + self.app.core.custom_observers[name] = observer + self.observers.insert(tk.END, name) def click_save(self): name = self.name.get() if self.selected: previous_name = self.selected self.selected = name - widget = self.config_widgets.pop(previous_name) - widget.name = name - widget.command = self.command.get() - self.config_widgets[name] = widget - self.widgets.delete(self.selected_index) - self.widgets.insert(self.selected_index, name) - self.widgets.selection_set(self.selected_index) + observer = self.app.core.custom_observers.pop(previous_name) + observer.name = name + observer.cmd = self.cmd.get() + self.app.core.custom_observers[name] = observer + self.observers.delete(self.selected_index) + self.observers.insert(self.selected_index, name) + self.observers.selection_set(self.selected_index) def click_delete(self): if self.selected: - self.widgets.delete(self.selected_index) - del self.config_widgets[self.selected] + self.observers.delete(self.selected_index) + del self.app.core.custom_observers[self.selected] self.selected = None self.selected_index = None self.name.set("") - self.command.set("") - self.widgets.selection_clear(0, tk.END) + self.cmd.set("") + self.observers.selection_clear(0, tk.END) self.save_button.config(state=tk.DISABLED) self.delete_button.config(state=tk.DISABLED) - def handle_widget_change(self, event): - selection = self.widgets.curselection() + def handle_observer_change(self, event): + selection = self.observers.curselection() if selection: self.selected_index = selection[0] - self.selected = self.widgets.get(self.selected_index) - widget = self.config_widgets[self.selected] - self.name.set(widget.name) - self.command.set(widget.command) + self.selected = self.observers.get(self.selected_index) + observer = self.app.core.custom_observers[self.selected] + self.name.set(observer.name) + self.cmd.set(observer.cmd) self.save_button.config(state=tk.NORMAL) self.delete_button.config(state=tk.NORMAL) else: diff --git a/coretk/coretk/dialogs/servers.py b/coretk/coretk/dialogs/servers.py index 3ff95cde..ce6b9698 100644 --- a/coretk/coretk/dialogs/servers.py +++ b/coretk/coretk/dialogs/servers.py @@ -117,6 +117,7 @@ class ServersDialog(Dialog): ) self.app.config["servers"] = servers appdirs.save_config(self.app.config) + self.destroy() def click_create(self): name = self.name.get() diff --git a/coretk/coretk/menuaction.py b/coretk/coretk/menuaction.py index 3b33377c..f1eb51e3 100644 --- a/coretk/coretk/menuaction.py +++ b/coretk/coretk/menuaction.py @@ -11,7 +11,7 @@ from coretk.appdirs import XML_PATH from coretk.dialogs.canvasbackground import CanvasBackgroundDialog from coretk.dialogs.canvassizeandscale import SizeAndScaleDialog from coretk.dialogs.hooks import HooksDialog -from coretk.dialogs.observerwidgets import ObserverWidgetsDialog +from coretk.dialogs.observers import ObserverDialog from coretk.dialogs.servers import ServersDialog from coretk.dialogs.sessionoptions import SessionOptionsDialog from coretk.dialogs.sessions import SessionsDialog @@ -118,5 +118,5 @@ class MenuAction: dialog.show() def edit_observer_widgets(self): - dialog = ObserverWidgetsDialog(self.app, self.app) + dialog = ObserverDialog(self.app, self.app) dialog.show() diff --git a/coretk/coretk/menubar.py b/coretk/coretk/menubar.py index c39bd3f8..d482045a 100644 --- a/coretk/coretk/menubar.py +++ b/coretk/coretk/menubar.py @@ -388,12 +388,12 @@ class Menubar(tk.Menu): command=partial(self.app.core.set_observer, cmd), ) for name in sorted(self.app.core.custom_observers): - cmd = self.app.core.custom_observers[name] + observer = self.app.core.custom_observers[name] menu.add_radiobutton( label=name, variable=var, value=name, - command=partial(self.app.core.set_observer, cmd), + command=partial(self.app.core.set_observer, observer.cmd), ) widget_menu.add_cascade(label="Observer Widgets", menu=menu)