diff --git a/lib/client/dashboard_window.py b/lib/client/dashboard_window.py index 4f59532..89082db 100644 --- a/lib/client/dashboard_window.py +++ b/lib/client/dashboard_window.py @@ -1,12 +1,10 @@ -import subprocess import logging -import requests import tkinter as tk import threading import time import socket -import os, sys -from tkinter import ttk, messagebox +import os +from tkinter import ttk, messagebox, simpledialog from PIL import Image, ImageTk from lib.client.new_job_window import NewJobWindow from lib.server.server_proxy import RenderServerProxy @@ -42,6 +40,7 @@ class DashboardWindow: self.local_host = socket.gethostname() self.server_proxy = RenderServerProxy(hostname=self.local_host) self.job_cache = [] + self.added_hostnames = [] # Setup zeroconf self.zeroconf = ZeroconfServer("_zordon._tcp.local.", socket.gethostname(), 8080) @@ -58,13 +57,21 @@ class DashboardWindow: server_frame.pack(fill=tk.BOTH, pady=5, padx=5, expand=True) # Create server tree - self.server_tree = ttk.Treeview(server_frame, show="headings") - self.server_tree.pack(side=tk.LEFT, expand=True, fill=tk.BOTH) + left_frame = tk.Frame(server_frame) + left_frame.pack(side=tk.LEFT, expand=True, fill=tk.BOTH) + self.server_tree = ttk.Treeview(left_frame, show="headings") + self.server_tree.pack(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) - make_sortable(self.server_tree) + + left_button_frame = tk.Frame(left_frame) + left_button_frame.pack(side=tk.BOTTOM, fill=tk.X, expand=False) + + # Create buttons + add_server_button = tk.Button(left_button_frame, text="Add Server", command=self.add_server_button) + add_server_button.pack(side=tk.RIGHT, padx=5, pady=5) # Create separator separator = ttk.Separator(server_frame, orient=tk.VERTICAL) @@ -96,7 +103,7 @@ class DashboardWindow: 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) + button_frame.pack(pady=5, fill=tk.X, expand=False) # Create buttons self.logs_button = tk.Button(button_frame, text="Logs", command=self.open_logs) @@ -105,8 +112,6 @@ class DashboardWindow: self.delete_button = tk.Button(button_frame, text="Delete", command=self.delete_job) add_job_button = tk.Button(button_frame, text="Add Job", command=self.show_new_job_window) - self.stop_button.config(state='disabled') - # Pack the buttons in the frame self.stop_button.pack(side=tk.LEFT) self.stop_button.config(state='disabled') @@ -123,6 +128,7 @@ class DashboardWindow: self.root.maxsize(width=2000, height=1200) self.root.minsize(width=900, height=800) make_sortable(self.job_tree) + make_sortable(self.server_tree) # update jobs self.update_jobs() @@ -145,6 +151,16 @@ class DashboardWindow: x.daemon = True x.start() + def add_server_button(self): + hostname = simpledialog.askstring("Server Hostname", "Enter the server hostname to add:") + if hostname: + hostname = hostname.strip() + if hostname not in self.added_hostnames: + if RenderServerProxy(hostname=hostname).connect(): + self.added_hostnames.append(hostname) + else: + messagebox.showerror("Cannot Connect", f"Cannot connect to server at hostname: '{hostname}'") + def server_picked(self, event): try: new_hostname = self.server_tree.selection()[0] @@ -250,7 +266,7 @@ class DashboardWindow: time.sleep(3) def update_servers(self): - servers = self.zeroconf.found_clients() + servers = list(set(self.zeroconf.found_clients() + self.added_hostnames)) if len(servers) < len(self.server_tree.get_children()): self.server_tree.delete(*self.server_tree.get_children()) for hostname in servers: @@ -268,7 +284,7 @@ class DashboardWindow: break hostname = self.server_proxy.hostname - job_fetch = self.server_proxy.get_jobs() + job_fetch = self.server_proxy.get_jobs(ignore_token=clear_table) # have to check hostname is still valid because of delay in fetching jobs if hostname == self.server_proxy.hostname: if job_fetch is not None: @@ -285,7 +301,9 @@ class DashboardWindow: job['priority'], display_status, job['time_elapsed'], - job['total_frames']) + job['total_frames'], + job['date_created'], + job['owner']) try: if self.job_tree.exists(job['id']): update_row(self.job_tree, job['id'], new_values=values, tags=tags) diff --git a/lib/server/server_proxy.py b/lib/server/server_proxy.py index 18db6b5..4290f09 100644 --- a/lib/server/server_proxy.py +++ b/lib/server/server_proxy.py @@ -52,8 +52,8 @@ class RenderServerProxy: def request(self, payload, timeout=5): return requests.get(f'http://{self.hostname}:{self.port}/api/{payload}', timeout=timeout) - def get_jobs(self, timeout=5): - url = f'jobs?token={self.__jobs_cache_token}' if self.__jobs_cache_token else 'jobs' + def get_jobs(self, timeout=5, ignore_token=False): + url = f'jobs?token={self.__jobs_cache_token}' if self.__jobs_cache_token and not ignore_token else 'jobs' status_result = self.request_data(url, timeout=timeout) all_jobs = None if status_result is not None: diff --git a/start_client.py b/start_client.py index f4f196b..544ea85 100644 --- a/start_client.py +++ b/start_client.py @@ -1,4 +1,5 @@ +#!/usr/bin/env python3 from lib.client.dashboard_window import start_client if __name__ == '__main__': - start_client() \ No newline at end of file + start_client()