mirror of
https://github.com/blw1138/Zordon.git
synced 2025-12-17 08:48:13 +00:00
New split client layout
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
import subprocess
|
import subprocess
|
||||||
|
import logging
|
||||||
import requests
|
import requests
|
||||||
import tkinter as tk
|
import tkinter as tk
|
||||||
import threading
|
import threading
|
||||||
@@ -59,38 +59,40 @@ class ZordonClient:
|
|||||||
|
|
||||||
server_frame = tk.LabelFrame(self.root, text="Server")
|
server_frame = tk.LabelFrame(self.root, text="Server")
|
||||||
server_frame.pack(fill=tk.BOTH, pady=5, padx=5, expand=True)
|
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)
|
# Create server tree
|
||||||
self.server_combo.pack(fill=tk.X)
|
self.server_tree = ttk.Treeview(server_frame, show="headings")
|
||||||
self.server_combo.bind("<<ComboboxSelected>>", self.server_picked)
|
self.server_tree.pack(side=tk.LEFT, expand=True, fill=tk.BOTH)
|
||||||
self.server_combo['values'] = servers
|
self.server_tree["columns"] = ("server")
|
||||||
self.server_combo.current(0)
|
self.server_tree.column("server", width=50)
|
||||||
|
self.server_tree.bind("<<TreeviewSelect>>", 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
|
# Setup the Tree
|
||||||
self.tree = ttk.Treeview(server_frame, show="headings", height=20)
|
self.job_tree = ttk.Treeview(server_frame, show="headings", height=20)
|
||||||
self.tree.tag_configure('running', background='lawn green', font=('', 0, 'bold'))
|
self.job_tree.tag_configure('running', background='lawn green', font=('', 0, 'bold'))
|
||||||
self.tree.bind("<<TreeviewSelect>>", self.on_row_select)
|
self.job_tree.bind("<<TreeviewSelect>>", self.on_row_select)
|
||||||
self.tree["columns"] = ("id", "Name", "Renderer", "Priority", "Status", "Time Elapsed", "Frames")
|
self.job_tree["columns"] = ("id", "Name", "Renderer", "Priority", "Status", "Time Elapsed", "Frames", "")
|
||||||
|
|
||||||
# Format the columns
|
# Format the columns
|
||||||
self.tree.column("id", width=0, stretch=False)
|
self.job_tree.column("id", width=0, stretch=False)
|
||||||
self.tree.column("Name", width=50)
|
self.job_tree.column("Name", width=300)
|
||||||
self.tree.column("Renderer", width=100, stretch=False)
|
self.job_tree.column("Renderer", width=100, stretch=False)
|
||||||
self.tree.column("Priority", width=50, stretch=False)
|
self.job_tree.column("Priority", width=50, stretch=False)
|
||||||
self.tree.column("Status", width=100, stretch=False)
|
self.job_tree.column("Status", width=100, stretch=False)
|
||||||
self.tree.column("Time Elapsed", width=100, stretch=False)
|
self.job_tree.column("Time Elapsed", width=100, stretch=False)
|
||||||
self.tree.column("Frames", width=50, stretch=False)
|
self.job_tree.column("Frames", width=50, stretch=False)
|
||||||
|
|
||||||
# Create the column headings
|
# Create the column headings
|
||||||
for name in self.tree['columns']:
|
for name in self.job_tree['columns']:
|
||||||
self.tree.heading(name, text=name)
|
self.job_tree.heading(name, text=name)
|
||||||
|
|
||||||
# Pack the Treeview widget
|
# 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 = tk.Frame(server_frame)
|
||||||
button_frame.pack(pady=5, fill=tk.BOTH, expand=True)
|
button_frame.pack(pady=5, fill=tk.BOTH, expand=True)
|
||||||
@@ -113,27 +115,37 @@ class ZordonClient:
|
|||||||
self.root.geometry("500x600+300+300")
|
self.root.geometry("500x600+300+300")
|
||||||
self.root.maxsize(width=2000, height=1200)
|
self.root.maxsize(width=2000, height=1200)
|
||||||
self.root.minsize(width=900, height=1000)
|
self.root.minsize(width=900, height=1000)
|
||||||
make_sortable(self.tree)
|
make_sortable(self.job_tree)
|
||||||
|
|
||||||
self.update_jobs()
|
self.update_jobs()
|
||||||
selected_item = self.tree.get_children()[0]
|
selected_job = self.job_tree.get_children()[0]
|
||||||
self.tree.selection_set(selected_item)
|
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()
|
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):
|
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.server_proxy.hostname = new_hostname
|
||||||
|
self.job_cache = []
|
||||||
self.update_jobs(clear_table=True)
|
self.update_jobs(clear_table=True)
|
||||||
|
|
||||||
def stop_job(self):
|
def stop_job(self):
|
||||||
selected_item = self.tree.selection()[0] # Get the selected item
|
selected_item = self.job_tree.selection()[0] # Get the selected item
|
||||||
row_data = self.tree.item(selected_item) # Get the text of 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_id = row_data['values'][0]
|
||||||
self.server_proxy.request_data(f'job/{job_id}/cancel?confirm=true')
|
self.server_proxy.request_data(f'job/{job_id}/cancel?confirm=true')
|
||||||
|
|
||||||
def delete_job(self):
|
def delete_job(self):
|
||||||
selected_item = self.tree.selection()[0] # Get the selected item
|
selected_item = self.job_tree.selection()[0] # Get the selected item
|
||||||
row_data = self.tree.item(selected_item) # Get the text of 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_id = row_data['values'][0]
|
||||||
job = next((d for d in self.job_cache if d.get('id') == job_id), None)
|
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'])
|
display_name = job['name'] or os.path.basename(job['input_path'])
|
||||||
@@ -143,9 +155,9 @@ class ZordonClient:
|
|||||||
self.update_jobs(clear_table=True)
|
self.update_jobs(clear_table=True)
|
||||||
|
|
||||||
def on_row_select(self, event):
|
def on_row_select(self, event):
|
||||||
if self.tree.selection():
|
if self.job_tree.selection():
|
||||||
selected_item = self.tree.selection()[0] # Get the selected item
|
selected_item = self.job_tree.selection()[0] # Get the selected item
|
||||||
row_data = self.tree.item(selected_item) # Get the text of 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_id = row_data['values'][0]
|
||||||
|
|
||||||
# update thumb
|
# update thumb
|
||||||
@@ -169,8 +181,8 @@ class ZordonClient:
|
|||||||
self.stop_button.config(state=button_state)
|
self.stop_button.config(state=button_state)
|
||||||
|
|
||||||
def reveal_in_finder(self):
|
def reveal_in_finder(self):
|
||||||
selected_item = self.tree.selection()[0] # Get the selected item
|
selected_item = self.job_tree.selection()[0] # Get the selected item
|
||||||
row_data = self.tree.item(selected_item) # Get the text of 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_id = row_data['values'][0]
|
||||||
|
|
||||||
job = next((d for d in self.job_cache if d.get('id') == job_id), None)
|
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])
|
subprocess.run(['open', output_dir])
|
||||||
|
|
||||||
def open_logs(self):
|
def open_logs(self):
|
||||||
selected_item = self.tree.selection()[0] # Get the selected item
|
selected_item = self.job_tree.selection()[0] # Get the selected item
|
||||||
row_data = self.tree.item(selected_item) # Get the text of 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_id = row_data['values'][0]
|
||||||
|
|
||||||
job = next((d for d in self.job_cache if d.get('id') == job_id), None)
|
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)
|
tree.item(item, values=new_values, tags=tags)
|
||||||
break
|
break
|
||||||
if clear_table:
|
if clear_table:
|
||||||
self.tree.delete(*self.tree.get_children())
|
self.job_tree.delete(*self.job_tree.get_children())
|
||||||
self.job_cache.clear()
|
self.job_cache.clear()
|
||||||
job_fetch = self.server_proxy.get_jobs()
|
job_fetch = self.server_proxy.get_jobs()
|
||||||
if job_fetch:
|
if job_fetch:
|
||||||
@@ -223,10 +235,10 @@ class ZordonClient:
|
|||||||
display_status,
|
display_status,
|
||||||
job['time_elapsed'],
|
job['time_elapsed'],
|
||||||
job['total_frames'])
|
job['total_frames'])
|
||||||
if self.tree.exists(job['id']):
|
if self.job_tree.exists(job['id']):
|
||||||
update_row(self.tree, job['id'], new_values=values, tags=tags)
|
update_row(self.job_tree, job['id'], new_values=values, tags=tags)
|
||||||
else:
|
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):
|
def show_new_job_window(self):
|
||||||
new_window = tk.Toplevel(self.root)
|
new_window = tk.Toplevel(self.root)
|
||||||
|
|||||||
Reference in New Issue
Block a user