diff --git a/lib/client/client.py b/lib/client/client.py index ae1e9c0..21031b9 100644 --- a/lib/client/client.py +++ b/lib/client/client.py @@ -135,7 +135,11 @@ class ZordonClient: self.server_tree.selection_set(selected_server) except IndexError: pass - self.start_update_thread() + + # start background update + x = threading.Thread(target=self.__background_update) + x.daemon = True + x.start() def populate_server_tree(self): servers = available_servers() @@ -146,24 +150,30 @@ class ZordonClient: def server_picked(self, event): new_hostname = self.server_tree.selection()[0] self.server_proxy.hostname = new_hostname - self.job_cache = [] + self.job_cache.clear() self.update_jobs(clear_table=True) + def selected_job_id(self): + try: + 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] + return job_id + except Exception as e: + return None + def stop_job(self): - 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_id = self.selected_job_id() self.server_proxy.request_data(f'job/{job_id}/cancel?confirm=true') def delete_job(self): - 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_id = self.selected_job_id() 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']) result = messagebox.askyesno("Confirmation", f"Are you sure you want to delete the job:\n{display_name}?") if result: self.server_proxy.request_data(f'job/{job_id}/delete?confirm=true') + self.job_cache.clear() self.update_jobs(clear_table=True) def set_image(self, image): @@ -173,11 +183,8 @@ class ZordonClient: self.photo_label.image = thumb_image def on_row_select(self, event): - 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] - + job_id = self.selected_job_id() + if job_id: # update thumb response = self.server_proxy.request(f'job/{job_id}/thumbnail?size=big') if response.ok: @@ -197,33 +204,20 @@ class ZordonClient: self.set_image(self.default_image) def reveal_in_finder(self): - 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) + job = next((d for d in self.job_cache if d.get('id') == self.selected_job_id()), None) output_dir = os.path.dirname(job['output_path']) subprocess.run(['open', output_dir]) def open_logs(self): - 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) + job = next((d for d in self.job_cache if d.get('id') == self.selected_job_id()), None) subprocess.run(['open', job['log_path']]) def mainloop(self): self.root.mainloop() - def start_update_thread(self): - x = threading.Thread(target=self.__background_update) - x.daemon = True - x.start() - def __background_update(self): while True: - self.update_jobs(clear_table=False) + self.update_jobs() time.sleep(1) def update_jobs(self, clear_table=False): @@ -234,12 +228,13 @@ class ZordonClient: if values[0] == id: tree.item(item, values=new_values, tags=tags) break + job_fetch = self.server_proxy.get_jobs() + if job_fetch is not None: + if len(job_fetch) < len(self.job_cache) or len(job_fetch) == 0: + clear_table = True + self.job_cache = job_fetch # update the cache only if its good data if clear_table: self.job_tree.delete(*self.job_tree.get_children()) - self.job_cache.clear() - job_fetch = self.server_proxy.get_jobs() - if job_fetch: - self.job_cache = job_fetch # update the cache only if its good data for job in self.job_cache: display_status = job['status'] if job['status'] != 'running' else \ ('%.0f%%' % (job['percent_complete'] * 100)) # if running, show percentage, otherwise just show status