updated observers dialog to create/edit/delete custom observers and save configuration

This commit is contained in:
Blake Harnden 2019-11-11 14:04:50 -08:00
parent dd73c96830
commit f5480c8e35
5 changed files with 68 additions and 61 deletions

View file

@ -84,6 +84,12 @@ class CustomNode:
self.services = services self.services = services
class Observer:
def __init__(self, name, cmd):
self.name = name
self.cmd = cmd
class CoreClient: class CoreClient:
def __init__(self, app): def __init__(self, app):
""" """
@ -124,24 +130,23 @@ class CoreClient:
def read_config(self): def read_config(self):
# read distributed server # read distributed server
for server_config in self.app.config.get("servers", []): for config in self.app.config.get("servers", []):
server = CoreServer( server = CoreServer(config["name"], config["address"], config["port"])
server_config["name"], server_config["address"], server_config["port"]
)
self.servers[server.name] = server self.servers[server.name] = server
# read custom nodes # read custom nodes
for node in self.app.config.get("nodes", []): for config in self.app.config.get("nodes", []):
image_file = node["image"] image_file = config["image"]
image = Images.get_custom(image_file) image = Images.get_custom(image_file)
custom_node = CustomNode( 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 self.custom_nodes[custom_node.name] = custom_node
# read observers # read observers
for observer in self.app.config.get("observers", []): for config in self.app.config.get("observers", []):
self.custom_observers[observer["name"]] = observer["cmd"] observer = Observer(config["name"], config["cmd"])
self.custom_observers[observer.name] = observer
def handle_events(self, event): def handle_events(self, event):
logging.info("event: %s", event) logging.info("event: %s", event)

View file

@ -1,36 +1,31 @@
import tkinter as tk import tkinter as tk
from coretk import appdirs
from coretk.coreclient import Observer
from coretk.dialogs.dialog import Dialog from coretk.dialogs.dialog import Dialog
class Widget: class ObserverDialog(Dialog):
def __init__(self, name, command):
self.name = name
self.command = command
class ObserverWidgetsDialog(Dialog):
def __init__(self, master, app): def __init__(self, master, app):
super().__init__(master, app, "Observer Widgets", modal=True) super().__init__(master, app, "Observer Widgets", modal=True)
self.config_widgets = {} self.observers = None
self.widgets = None
self.save_button = None self.save_button = None
self.delete_button = None self.delete_button = None
self.selected = None self.selected = None
self.selected_index = None self.selected_index = None
self.name = tk.StringVar() self.name = tk.StringVar()
self.command = tk.StringVar() self.cmd = tk.StringVar()
self.draw() self.draw()
def draw(self): def draw(self):
self.columnconfigure(0, weight=1) self.columnconfigure(0, weight=1)
self.rowconfigure(0, weight=1) self.rowconfigure(0, weight=1)
self.draw_widgets() self.draw_listbox()
self.draw_widget_fields() self.draw_form_fields()
self.draw_widget_buttons() self.draw_config_buttons()
self.draw_apply_buttons() self.draw_apply_buttons()
def draw_widgets(self): def draw_listbox(self):
frame = tk.Frame(self) frame = tk.Frame(self)
frame.grid(sticky="nsew") frame.grid(sticky="nsew")
frame.columnconfigure(0, weight=1) frame.columnconfigure(0, weight=1)
@ -39,15 +34,17 @@ class ObserverWidgetsDialog(Dialog):
scrollbar = tk.Scrollbar(frame, orient=tk.VERTICAL) scrollbar = tk.Scrollbar(frame, orient=tk.VERTICAL)
scrollbar.grid(row=0, column=1, sticky="ns") scrollbar.grid(row=0, column=1, sticky="ns")
self.widgets = tk.Listbox( self.observers = tk.Listbox(
frame, selectmode=tk.SINGLE, yscrollcommand=scrollbar.set frame, selectmode=tk.SINGLE, yscrollcommand=scrollbar.set
) )
self.widgets.grid(row=0, column=0, sticky="nsew") self.observers.grid(row=0, column=0, sticky="nsew")
self.widgets.bind("<<ListboxSelect>>", self.handle_widget_change) self.observers.bind("<<ListboxSelect>>", 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 = tk.Frame(self)
frame.grid(sticky="ew") frame.grid(sticky="ew")
frame.columnconfigure(1, weight=1) frame.columnconfigure(1, weight=1)
@ -59,10 +56,10 @@ class ObserverWidgetsDialog(Dialog):
label = tk.Label(frame, text="Command") label = tk.Label(frame, text="Command")
label.grid(row=1, column=0, sticky="w") 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") entry.grid(row=1, column=1, sticky="ew")
def draw_widget_buttons(self): def draw_config_buttons(self):
frame = tk.Frame(self) frame = tk.Frame(self)
frame.grid(pady=2, sticky="ew") frame.grid(pady=2, sticky="ew")
for i in range(3): for i in range(3):
@ -87,58 +84,62 @@ class ObserverWidgetsDialog(Dialog):
for i in range(2): for i in range(2):
frame.columnconfigure(i, weight=1) frame.columnconfigure(i, weight=1)
button = tk.Button( button = tk.Button(frame, text="Save", command=self.click_save_config)
frame, text="Save Configuration", command=self.click_save_configuration
)
button.grid(row=0, column=0, sticky="ew") button.grid(row=0, column=0, sticky="ew")
button = tk.Button(frame, text="Cancel", command=self.destroy) button = tk.Button(frame, text="Cancel", command=self.destroy)
button.grid(row=0, column=1, sticky="ew") button.grid(row=0, column=1, sticky="ew")
def click_save_configuration(self): def click_save_config(self):
pass 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): def click_create(self):
name = self.name.get() name = self.name.get()
if name not in self.config_widgets: if name not in self.app.core.custom_observers:
command = self.command.get() cmd = self.cmd.get()
widget = Widget(name, command) observer = Observer(name, cmd)
self.config_widgets[name] = widget self.app.core.custom_observers[name] = observer
self.widgets.insert(tk.END, name) self.observers.insert(tk.END, name)
def click_save(self): def click_save(self):
name = self.name.get() name = self.name.get()
if self.selected: if self.selected:
previous_name = self.selected previous_name = self.selected
self.selected = name self.selected = name
widget = self.config_widgets.pop(previous_name) observer = self.app.core.custom_observers.pop(previous_name)
widget.name = name observer.name = name
widget.command = self.command.get() observer.cmd = self.cmd.get()
self.config_widgets[name] = widget self.app.core.custom_observers[name] = observer
self.widgets.delete(self.selected_index) self.observers.delete(self.selected_index)
self.widgets.insert(self.selected_index, name) self.observers.insert(self.selected_index, name)
self.widgets.selection_set(self.selected_index) self.observers.selection_set(self.selected_index)
def click_delete(self): def click_delete(self):
if self.selected: if self.selected:
self.widgets.delete(self.selected_index) self.observers.delete(self.selected_index)
del self.config_widgets[self.selected] del self.app.core.custom_observers[self.selected]
self.selected = None self.selected = None
self.selected_index = None self.selected_index = None
self.name.set("") self.name.set("")
self.command.set("") self.cmd.set("")
self.widgets.selection_clear(0, tk.END) self.observers.selection_clear(0, tk.END)
self.save_button.config(state=tk.DISABLED) self.save_button.config(state=tk.DISABLED)
self.delete_button.config(state=tk.DISABLED) self.delete_button.config(state=tk.DISABLED)
def handle_widget_change(self, event): def handle_observer_change(self, event):
selection = self.widgets.curselection() selection = self.observers.curselection()
if selection: if selection:
self.selected_index = selection[0] self.selected_index = selection[0]
self.selected = self.widgets.get(self.selected_index) self.selected = self.observers.get(self.selected_index)
widget = self.config_widgets[self.selected] observer = self.app.core.custom_observers[self.selected]
self.name.set(widget.name) self.name.set(observer.name)
self.command.set(widget.command) self.cmd.set(observer.cmd)
self.save_button.config(state=tk.NORMAL) self.save_button.config(state=tk.NORMAL)
self.delete_button.config(state=tk.NORMAL) self.delete_button.config(state=tk.NORMAL)
else: else:

View file

@ -117,6 +117,7 @@ class ServersDialog(Dialog):
) )
self.app.config["servers"] = servers self.app.config["servers"] = servers
appdirs.save_config(self.app.config) appdirs.save_config(self.app.config)
self.destroy()
def click_create(self): def click_create(self):
name = self.name.get() name = self.name.get()

View file

@ -11,7 +11,7 @@ from coretk.appdirs import XML_PATH
from coretk.dialogs.canvasbackground import CanvasBackgroundDialog from coretk.dialogs.canvasbackground import CanvasBackgroundDialog
from coretk.dialogs.canvassizeandscale import SizeAndScaleDialog from coretk.dialogs.canvassizeandscale import SizeAndScaleDialog
from coretk.dialogs.hooks import HooksDialog 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.servers import ServersDialog
from coretk.dialogs.sessionoptions import SessionOptionsDialog from coretk.dialogs.sessionoptions import SessionOptionsDialog
from coretk.dialogs.sessions import SessionsDialog from coretk.dialogs.sessions import SessionsDialog
@ -118,5 +118,5 @@ class MenuAction:
dialog.show() dialog.show()
def edit_observer_widgets(self): def edit_observer_widgets(self):
dialog = ObserverWidgetsDialog(self.app, self.app) dialog = ObserverDialog(self.app, self.app)
dialog.show() dialog.show()

View file

@ -388,12 +388,12 @@ class Menubar(tk.Menu):
command=partial(self.app.core.set_observer, cmd), command=partial(self.app.core.set_observer, cmd),
) )
for name in sorted(self.app.core.custom_observers): 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( menu.add_radiobutton(
label=name, label=name,
variable=var, variable=var,
value=name, 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) widget_menu.add_cascade(label="Observer Widgets", menu=menu)