From 275a03b9e72791473d97a44a75ea45456d39a44a Mon Sep 17 00:00:00 2001 From: Blake Harnden <32446120+bharnden@users.noreply.github.com> Date: Tue, 5 Nov 2019 17:32:48 -0800 Subject: [PATCH] added observer widget dialog, still needs to be hooked to where widgets will be kept --- coretk/coretk/coremenubar.py | 4 +- coretk/coretk/dialogs/observerwidgets.py | 148 +++++++++++++++++++++++ coretk/coretk/dialogs/servers.py | 9 +- coretk/coretk/menuaction.py | 5 + 4 files changed, 158 insertions(+), 8 deletions(-) create mode 100644 coretk/coretk/dialogs/observerwidgets.py diff --git a/coretk/coretk/coremenubar.py b/coretk/coretk/coremenubar.py index 5add9790..f720b093 100644 --- a/coretk/coretk/coremenubar.py +++ b/coretk/coretk/coremenubar.py @@ -543,7 +543,9 @@ class CoreMenubar(object): observer_widget_menu.add_command( label="PIM neighbors", command=action.sub_menu_items ) - observer_widget_menu.add_command(label="Edit...", command=action.sub_menu_items) + observer_widget_menu.add_command( + label="Edit...", command=self.menu_action.edit_observer_widgets + ) widget_menu.add_cascade(label="Observer Widgets", menu=observer_widget_menu) diff --git a/coretk/coretk/dialogs/observerwidgets.py b/coretk/coretk/dialogs/observerwidgets.py new file mode 100644 index 00000000..c1c4d170 --- /dev/null +++ b/coretk/coretk/dialogs/observerwidgets.py @@ -0,0 +1,148 @@ +import tkinter as tk + +from coretk.dialogs.dialog import Dialog + + +class Widget: + def __init__(self, name, command): + self.name = name + self.command = command + + +class ObserverWidgetsDialog(Dialog): + def __init__(self, master, app): + super().__init__(master, app, "Observer Widgets", modal=True) + self.config_widgets = {} + self.widgets = 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.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_apply_buttons() + + def draw_widgets(self): + frame = tk.Frame(self) + frame.grid(sticky="nsew") + frame.columnconfigure(0, weight=1) + frame.rowconfigure(0, weight=1) + + scrollbar = tk.Scrollbar(frame, orient=tk.VERTICAL) + scrollbar.grid(row=0, column=1, sticky="ns") + + self.widgets = 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) + + scrollbar.config(command=self.widgets.yview) + + def draw_widget_fields(self): + frame = tk.Frame(self) + frame.grid(sticky="ew") + frame.columnconfigure(1, weight=1) + + label = tk.Label(frame, text="Name") + label.grid(row=0, column=0, sticky="w") + entry = tk.Entry(frame, textvariable=self.name) + entry.grid(row=0, column=1, sticky="ew") + + label = tk.Label(frame, text="Command") + label.grid(row=1, column=0, sticky="w") + entry = tk.Entry(frame, textvariable=self.command) + entry.grid(row=1, column=1, sticky="ew") + + def draw_widget_buttons(self): + frame = tk.Frame(self) + frame.grid(pady=2, sticky="ew") + for i in range(3): + frame.columnconfigure(i, weight=1) + + button = tk.Button(frame, text="Create", command=self.click_create) + button.grid(row=0, column=0, sticky="ew") + + self.save_button = tk.Button( + frame, text="Save", state=tk.DISABLED, command=self.click_save + ) + self.save_button.grid(row=0, column=1, sticky="ew") + + self.delete_button = tk.Button( + frame, text="Delete", state=tk.DISABLED, command=self.click_delete + ) + self.delete_button.grid(row=0, column=2, sticky="ew") + + def draw_apply_buttons(self): + frame = tk.Frame(self) + frame.grid(sticky="ew") + for i in range(2): + frame.columnconfigure(i, weight=1) + + button = tk.Button( + frame, text="Save Configuration", command=self.click_save_configuration + ) + 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_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) + + 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) + + def click_delete(self): + if self.selected: + self.widgets.delete(self.selected_index) + del self.config_widgets[self.selected] + self.selected = None + self.selected_index = None + self.name.set("") + self.command.set("") + self.widgets.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() + 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.save_button.config(state=tk.NORMAL) + self.delete_button.config(state=tk.NORMAL) + else: + self.selected_index = None + self.selected = None + self.save_button.config(state=tk.DISABLED) + self.delete_button.config(state=tk.DISABLED) diff --git a/coretk/coretk/dialogs/servers.py b/coretk/coretk/dialogs/servers.py index 9ab6a694..3ff95cde 100644 --- a/coretk/coretk/dialogs/servers.py +++ b/coretk/coretk/dialogs/servers.py @@ -40,12 +40,7 @@ class ServersDialog(Dialog): scrollbar.grid(row=0, column=1, sticky="ns") self.servers = tk.Listbox( - frame, - selectmode=tk.SINGLE, - yscrollcommand=scrollbar.set, - relief=tk.FLAT, - highlightthickness=0.5, - bd=0, + frame, selectmode=tk.SINGLE, yscrollcommand=scrollbar.set ) self.servers.grid(row=0, column=0, sticky="nsew") self.servers.bind("<>", self.handle_server_change) @@ -134,7 +129,7 @@ class ServersDialog(Dialog): def click_save(self): name = self.name.get() - if self.selected and name not in self.app.core.servers: + if self.selected: previous_name = self.selected self.selected = name server = self.app.core.servers.pop(previous_name) diff --git a/coretk/coretk/menuaction.py b/coretk/coretk/menuaction.py index a60f7458..391cf765 100644 --- a/coretk/coretk/menuaction.py +++ b/coretk/coretk/menuaction.py @@ -11,6 +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.servers import ServersDialog from coretk.dialogs.sessionoptions import SessionOptionsDialog from coretk.dialogs.sessions import SessionsDialog @@ -403,3 +404,7 @@ class MenuAction: logging.debug("Click session emulation servers") dialog = ServersDialog(self.app, self.app) dialog.show() + + def edit_observer_widgets(self): + dialog = ObserverWidgetsDialog(self.app, self.app) + dialog.show()