From ddf36f858a7c1b684766e850ce1fcd8ae84fa28b Mon Sep 17 00:00:00 2001 From: Brett Williams Date: Thu, 1 Jun 2023 01:53:59 -0500 Subject: [PATCH] New split client layout --- lib/client/client.py | 98 +++++++++++++++++++++++++------------------- 1 file changed, 55 insertions(+), 43 deletions(-) diff --git a/lib/client/client.py b/lib/client/client.py index 63f4a8d..1959b2f 100644 --- a/lib/client/client.py +++ b/lib/client/client.py @@ -1,5 +1,5 @@ import subprocess - +import logging import requests import tkinter as tk import threading @@ -59,38 +59,40 @@ class ZordonClient: server_frame = tk.LabelFrame(self.root, text="Server") server_frame.pack(fill=tk.BOTH, pady=5, padx=5, expand=True) - server_picker_frame = tk.Frame(server_frame) - server_picker_frame.pack(fill=tk.X, expand=True) - server_label = tk.Label(server_picker_frame, text="Current Server:") - server_label.pack(side=tk.LEFT, padx=5) - self.server_combo = tk.ttk.Combobox(server_picker_frame) - self.server_combo.pack(fill=tk.X) - self.server_combo.bind("<>", self.server_picked) - self.server_combo['values'] = servers - self.server_combo.current(0) + # Create server tree + self.server_tree = ttk.Treeview(server_frame, show="headings") + self.server_tree.pack(side=tk.LEFT, expand=True, fill=tk.BOTH) + self.server_tree["columns"] = ("server") + self.server_tree.column("server", width=50) + self.server_tree.bind("<>", self.server_picked) + self.server_tree.column("server", width=200) + + # Create separator + separator = ttk.Separator(server_frame, orient=tk.VERTICAL) + separator.pack(side=tk.LEFT, padx=5, pady=5, fill=tk.Y) # Setup the Tree - self.tree = ttk.Treeview(server_frame, show="headings", height=20) - self.tree.tag_configure('running', background='lawn green', font=('', 0, 'bold')) - self.tree.bind("<>", self.on_row_select) - self.tree["columns"] = ("id", "Name", "Renderer", "Priority", "Status", "Time Elapsed", "Frames") + self.job_tree = ttk.Treeview(server_frame, show="headings", height=20) + self.job_tree.tag_configure('running', background='lawn green', font=('', 0, 'bold')) + self.job_tree.bind("<>", self.on_row_select) + self.job_tree["columns"] = ("id", "Name", "Renderer", "Priority", "Status", "Time Elapsed", "Frames", "") # Format the columns - self.tree.column("id", width=0, stretch=False) - self.tree.column("Name", width=50) - self.tree.column("Renderer", width=100, stretch=False) - self.tree.column("Priority", width=50, stretch=False) - self.tree.column("Status", width=100, stretch=False) - self.tree.column("Time Elapsed", width=100, stretch=False) - self.tree.column("Frames", width=50, stretch=False) + self.job_tree.column("id", width=0, stretch=False) + self.job_tree.column("Name", width=300) + self.job_tree.column("Renderer", width=100, stretch=False) + self.job_tree.column("Priority", width=50, stretch=False) + self.job_tree.column("Status", width=100, stretch=False) + self.job_tree.column("Time Elapsed", width=100, stretch=False) + self.job_tree.column("Frames", width=50, stretch=False) # Create the column headings - for name in self.tree['columns']: - self.tree.heading(name, text=name) + for name in self.job_tree['columns']: + self.job_tree.heading(name, text=name) # Pack the Treeview widget - self.tree.pack(fill=tk.BOTH, expand=True) + self.job_tree.pack(fill=tk.BOTH, expand=True) button_frame = tk.Frame(server_frame) button_frame.pack(pady=5, fill=tk.BOTH, expand=True) @@ -113,27 +115,37 @@ class ZordonClient: self.root.geometry("500x600+300+300") self.root.maxsize(width=2000, height=1200) self.root.minsize(width=900, height=1000) - make_sortable(self.tree) + make_sortable(self.job_tree) self.update_jobs() - selected_item = self.tree.get_children()[0] - self.tree.selection_set(selected_item) + selected_job = self.job_tree.get_children()[0] + self.job_tree.selection_set(selected_job) + self.populate_server_tree() + selected_server = self.server_tree.get_children()[0] + self.server_tree.selection_set(selected_server) self.start_update_thread() + def populate_server_tree(self): + servers = available_servers() + self.server_tree.delete(*self.server_tree.get_children()) + for hostname in servers: + self.server_tree.insert("", tk.END, iid=hostname, values=(hostname,)) + def server_picked(self, event): - new_hostname = self.server_combo.get() + new_hostname = self.server_tree.selection()[0] self.server_proxy.hostname = new_hostname + self.job_cache = [] self.update_jobs(clear_table=True) def stop_job(self): - selected_item = self.tree.selection()[0] # Get the selected item - row_data = self.tree.item(selected_item) # Get the text of the selected item + selected_item = self.job_tree.selection()[0] # Get the selected item + row_data = self.job_tree.item(selected_item) # Get the text of the selected item job_id = row_data['values'][0] self.server_proxy.request_data(f'job/{job_id}/cancel?confirm=true') def delete_job(self): - selected_item = self.tree.selection()[0] # Get the selected item - row_data = self.tree.item(selected_item) # Get the text of the selected item + selected_item = self.job_tree.selection()[0] # Get the selected item + row_data = self.job_tree.item(selected_item) # Get the text of the selected item job_id = row_data['values'][0] job = next((d for d in self.job_cache if d.get('id') == job_id), None) display_name = job['name'] or os.path.basename(job['input_path']) @@ -143,9 +155,9 @@ class ZordonClient: self.update_jobs(clear_table=True) def on_row_select(self, event): - if self.tree.selection(): - selected_item = self.tree.selection()[0] # Get the selected item - row_data = self.tree.item(selected_item) # Get the text of the selected item + if self.job_tree.selection(): + selected_item = self.job_tree.selection()[0] # Get the selected item + row_data = self.job_tree.item(selected_item) # Get the text of the selected item job_id = row_data['values'][0] # update thumb @@ -169,8 +181,8 @@ class ZordonClient: self.stop_button.config(state=button_state) def reveal_in_finder(self): - selected_item = self.tree.selection()[0] # Get the selected item - row_data = self.tree.item(selected_item) # Get the text of the selected item + selected_item = self.job_tree.selection()[0] # Get the selected item + row_data = self.job_tree.item(selected_item) # Get the text of the selected item job_id = row_data['values'][0] job = next((d for d in self.job_cache if d.get('id') == job_id), None) @@ -178,8 +190,8 @@ class ZordonClient: subprocess.run(['open', output_dir]) def open_logs(self): - selected_item = self.tree.selection()[0] # Get the selected item - row_data = self.tree.item(selected_item) # Get the text of the selected item + selected_item = self.job_tree.selection()[0] # Get the selected item + row_data = self.job_tree.item(selected_item) # Get the text of the selected item job_id = row_data['values'][0] job = next((d for d in self.job_cache if d.get('id') == job_id), None) @@ -207,7 +219,7 @@ class ZordonClient: tree.item(item, values=new_values, tags=tags) break if clear_table: - self.tree.delete(*self.tree.get_children()) + self.job_tree.delete(*self.job_tree.get_children()) self.job_cache.clear() job_fetch = self.server_proxy.get_jobs() if job_fetch: @@ -223,10 +235,10 @@ class ZordonClient: display_status, job['time_elapsed'], job['total_frames']) - if self.tree.exists(job['id']): - update_row(self.tree, job['id'], new_values=values, tags=tags) + if self.job_tree.exists(job['id']): + update_row(self.job_tree, job['id'], new_values=values, tags=tags) else: - self.tree.insert("", tk.END, iid=job['id'], values=values, tags=tags) + self.job_tree.insert("", tk.END, iid=job['id'], values=values, tags=tags) def show_new_job_window(self): new_window = tk.Toplevel(self.root)