diff --git a/src/ui/add_job_window.py b/src/ui/add_job_window.py index 547c6ef..b8ae036 100644 --- a/src/ui/add_job_window.py +++ b/src/ui/add_job_window.py @@ -52,10 +52,9 @@ class NewRenderJobForm(QWidget): self.priority_input = None self.end_frame_input = None self.start_frame_input = None - self.render_name_input = None + self.job_name_input = None self.scene_file_input = None self.scene_file_browse_button = None - self.job_name_input = None self.tabs = None # Job / Server Data @@ -96,6 +95,17 @@ class NewRenderJobForm(QWidget): load_file_layout.addLayout(progress_layout) # Scene File + job_overview_group = QGroupBox("Project File") + file_group_layout = QVBoxLayout(job_overview_group) + + # Job Name + job_name_layout = QHBoxLayout() + job_name_layout.addWidget(QLabel("Job name:")) + self.job_name_input = QLineEdit() + job_name_layout.addWidget(self.job_name_input) + file_group_layout.addLayout(job_name_layout) + + # Job File scene_file_picker_layout = QHBoxLayout() scene_file_picker_layout.addWidget(QLabel("File:")) self.scene_file_input = QLineEdit() @@ -104,7 +114,10 @@ class NewRenderJobForm(QWidget): self.scene_file_browse_button.clicked.connect(self.browse_scene_file) scene_file_picker_layout.addWidget(self.scene_file_input) scene_file_picker_layout.addWidget(self.scene_file_browse_button) - main_layout.addLayout(scene_file_picker_layout) + file_group_layout.addLayout(scene_file_picker_layout) + + main_layout.addWidget(job_overview_group) + main_layout.addWidget(self.load_file_group) main_layout.addWidget(self.tabs) @@ -141,12 +154,12 @@ class NewRenderJobForm(QWidget): self.output_settings_group = QWidget() output_settings_layout = QVBoxLayout(self.output_settings_group) - # Render Name - render_name_layout = QHBoxLayout() - render_name_layout.addWidget(QLabel("Render name:")) - self.render_name_input = QLineEdit() - render_name_layout.addWidget(self.render_name_input) - output_settings_layout.addLayout(render_name_layout) + # # Render Name + # render_name_layout = QHBoxLayout() + # render_name_layout.addWidget(QLabel("Render name:")) + # self.job_name_input = QLineEdit() + # render_name_layout.addWidget(self.job_name_input) + # output_settings_layout.addLayout(render_name_layout) # File Format file_format_layout = QHBoxLayout() @@ -306,7 +319,7 @@ class NewRenderJobForm(QWidget): output_name, _ = os.path.splitext(os.path.basename(self.scene_file_input.text())) output_name = output_name.replace(' ', '_') - self.render_name_input.setText(output_name) + self.job_name_input.setText(output_name) file_name = self.scene_file_input.text() # setup bg worker @@ -317,7 +330,7 @@ class NewRenderJobForm(QWidget): def browse_output_path(self): directory = QFileDialog.getExistingDirectory(self, "Select Output Directory") if directory: - self.render_name_input.setText(directory) + self.job_name_input.setText(directory) def args_help_button_clicked(self): url = (f'http://{self.server_proxy.hostname}:{self.server_proxy.port}/api/engine/' @@ -480,14 +493,14 @@ class SubmitWorker(QThread): 'engine_version': self.window.engine_version_combo.currentText(), 'args': {'raw': self.window.raw_args.text(), 'export_format': self.window.file_format_combo.currentText()}, - 'output_path': self.window.render_name_input.text(), + 'output_path': self.window.job_name_input.text(), 'start_frame': self.window.start_frame_input.value(), 'end_frame': self.window.end_frame_input.value(), 'priority': self.window.priority_input.currentIndex() + 1, 'notes': self.window.notes_input.toPlainText(), 'enable_split_jobs': self.window.enable_splitjobs.isChecked(), 'split_jobs_same_os': self.window.splitjobs_same_os.isChecked(), - 'name': self.window.render_name_input.text()} + 'name': self.window.job_name_input.text()} # get the dynamic args for i in range(self.window.engine_options_layout.count()): diff --git a/src/ui/main_window.py b/src/ui/main_window.py index d362623..6301e7f 100644 --- a/src/ui/main_window.py +++ b/src/ui/main_window.py @@ -2,7 +2,6 @@ import ast import datetime import io -import json import logging import os import sys @@ -10,6 +9,7 @@ import threading import time import PIL +import humanize from PIL import Image from PyQt6.QtCore import Qt, QByteArray, QBuffer, QIODevice, QThread from PyQt6.QtGui import QPixmap, QImage, QFont, QIcon @@ -18,10 +18,8 @@ from PyQt6.QtWidgets import QMainWindow, QWidget, QHBoxLayout, QListWidget, QTab QFileDialog from src.api.api_server import API_VERSION +from src.api.serverproxy_manager import ServerProxyManager from src.render_queue import RenderQueue -from src.utilities.misc_helper import get_time_elapsed, resources_dir, is_localhost -from src.utilities.status_utils import RenderStatus -from src.utilities.zeroconf_server import ZeroconfServer from src.ui.add_job_window import NewRenderJobForm from src.ui.console_window import ConsoleWindow from src.ui.engine_browser import EngineBrowserWindow @@ -30,8 +28,10 @@ from src.ui.widgets.menubar import MenuBar from src.ui.widgets.proportional_image_label import ProportionalImageLabel from src.ui.widgets.statusbar import StatusBar from src.ui.widgets.toolbar import ToolBar -from src.api.serverproxy_manager import ServerProxyManager -from src.utilities.misc_helper import launch_url, iso_datestring_to_formatted_datestring +from src.utilities.misc_helper import get_time_elapsed, resources_dir, is_localhost +from src.utilities.misc_helper import launch_url +from src.utilities.status_utils import RenderStatus +from src.utilities.zeroconf_server import ZeroconfServer from src.version import APP_NAME logger = logging.getLogger() @@ -310,11 +310,12 @@ class MainWindow(QMainWindow): engine_name = f"{job.get('engine', '')}-{job.get('engine_version')}" priority = str(job.get('priority', '')) total_frames = str(job.get('total_frames', '')) - date_created_string = iso_datestring_to_formatted_datestring(job['date_created']) + converted_time = datetime.datetime.fromisoformat(job['date_created']) + humanized_time = humanize.naturaltime(converted_time) items = [QTableWidgetItem(job['id']), QTableWidgetItem(name), QTableWidgetItem(engine_name), QTableWidgetItem(priority), QTableWidgetItem(display_status), QTableWidgetItem(time_elapsed), - QTableWidgetItem(total_frames), QTableWidgetItem(date_created_string)] + QTableWidgetItem(total_frames), QTableWidgetItem(humanized_time)] for col, item in enumerate(items): self.job_list_view.setItem(row, col, item) diff --git a/src/utilities/misc_helper.py b/src/utilities/misc_helper.py index 9cc69a2..1d622d6 100644 --- a/src/utilities/misc_helper.py +++ b/src/utilities/misc_helper.py @@ -249,20 +249,6 @@ def num_to_alphanumeric(num): return result[::-1] # Reverse the result to get the correct alphanumeric string -def iso_datestring_to_formatted_datestring(iso_date_string): - from dateutil import parser - import pytz - - # Parse the ISO date string into a datetime object and convert timezones - date = parser.isoparse(iso_date_string).astimezone(pytz.UTC) - local_timezone = datetime.now().astimezone().tzinfo - date_local = date.astimezone(local_timezone) - - # Format the date to the desired readable yet sortable format with 12-hour time - formatted_date = date_local.strftime('%Y-%m-%d %I:%M %p') - - return formatted_date - def get_gpu_info(): """Cross-platform GPU information retrieval"""