From a4cb27bfafb13816c89892cab1ccd2434b913564 Mon Sep 17 00:00:00 2001 From: Arda Kutlu Date: Wed, 5 Jun 2024 22:41:25 +0100 Subject: [PATCH 1/3] template methodology wip --- tik_manager4/objects/category.py | 14 ++++++ tik_manager4/objects/main.py | 32 ++++++++++++++ tik_manager4/objects/user.py | 2 +- tik_manager4/ui/dialog/settings_dialog.py | 1 - tik_manager4/ui/dialog/work_dialog.py | 52 +++++++++++++++++++++++ tik_manager4/ui/main.py | 48 ++++++++++++++++++++- 6 files changed, 146 insertions(+), 3 deletions(-) diff --git a/tik_manager4/objects/category.py b/tik_manager4/objects/category.py index f23b5312..6c7de198 100644 --- a/tik_manager4/objects/category.py +++ b/tik_manager4/objects/category.py @@ -92,6 +92,20 @@ def create_work_from_path(self, name, file_path, notes="", ignore_checks=True): work.new_version_from_path(file_path=file_path, notes=notes) return work + def create_work_from_template(self, name, template_file, notes="", ignore_checks=True): + """ Creates a task under the category. + + Args: + name (str): Name of the work + template_file (str): Path to the template file + notes (str): Notes for the work + ignore_checks (bool): Ignore the checks for the work creation + + Returns: + tik_manager4.objects.work: Work object + """ + pass + def create_work(self, name, file_format=None, notes="", ignore_checks=True): """Creates a task under the category""" diff --git a/tik_manager4/objects/main.py b/tik_manager4/objects/main.py index ee7b3e9d..4baf08f7 100644 --- a/tik_manager4/objects/main.py +++ b/tik_manager4/objects/main.py @@ -153,3 +153,35 @@ def set_project(self, absolute_path): self.user.add_recent_project(absolute_path) self.user.last_project = absolute_path self.dcc.set_project(absolute_path) + + def collect_template_paths(self): + """Collect all template files from common, project and user folders.""" + user_templates = list(Path(self.user.settings.get("user_templates_directory")).rglob("*.*")) + project_templates = list((Path(self.project.absolute_path)/"_templates").rglob("*.*")) + print(self.project.absolute_path) + print(Path(self.project.absolute_path)/"_templates") + print(project_templates) + print(project_templates) + print(project_templates) + print(project_templates) + common_templates = list((Path(self.user.common_directory)/"_templates").rglob("*.*")) + + return project_templates + common_templates + user_templates + + def get_template_names(self): + """Get the names of the templates.""" + all_templates = self.collect_template_paths() + return list(set([template.stem for template in all_templates])) + + def get_template_path_by_name(self, name): + """Gets the template file by name. + + Resolution order is project > common > user. + """ + all_templates = self.collect_template_paths() + for template_path in all_templates: + if template_path.stem == name: + return template_path.as_posix() + + return None + diff --git a/tik_manager4/objects/user.py b/tik_manager4/objects/user.py index 8de42002..be73c5f1 100644 --- a/tik_manager4/objects/user.py +++ b/tik_manager4/objects/user.py @@ -176,7 +176,6 @@ def _validate_user_data(self): """Finds or creates user directories and files""" _user_root = utils.get_home_dir() - # self.user_directory = str((Path(_user_root, "TikManager4").mkdir(exist_ok=True))) _user_dir = Path(_user_root, "TikManager4") _user_dir.mkdir(exist_ok=True) self.user_directory = str(_user_dir) @@ -212,6 +211,7 @@ def _validate_user_data(self): else: raise Exception("Commons Directory does not exist. Exiting...") self.settings.edit_property("commonFolder", self.common_directory) + self.settings.add_property("user_templates_directory", self.user_directory, force=False) self.settings.apply_settings() self.commons = Commons(self.common_directory) diff --git a/tik_manager4/ui/dialog/settings_dialog.py b/tik_manager4/ui/dialog/settings_dialog.py index 3de9df6a..e95bc08d 100644 --- a/tik_manager4/ui/dialog/settings_dialog.py +++ b/tik_manager4/ui/dialog/settings_dialog.py @@ -1005,7 +1005,6 @@ def _add_category_item(): horizontal_layout = QtWidgets.QHBoxLayout() dialog_layout.addLayout(horizontal_layout) name_label = QtWidgets.QLabel("Name: ") - # name_line_edit = QtWidgets.QLineEdit(self) name_line_edit = ValidatedString("name") name_line_edit.allow_spaces = False name_line_edit.allow_special_characters = False diff --git a/tik_manager4/ui/dialog/work_dialog.py b/tik_manager4/ui/dialog/work_dialog.py index d2ffbabd..c6c12d16 100644 --- a/tik_manager4/ui/dialog/work_dialog.py +++ b/tik_manager4/ui/dialog/work_dialog.py @@ -431,6 +431,58 @@ def on_format_changed(self, file_format): ) = self.work_object.construct_names(file_format) self.name_label.setText(version_name) +class WorkFromTemplateDialog(NewWorkDialog): + """Dialog to create a work file from a template file.""" + def __init__(self, main_object, template_names=None, *args, **kwargs): + self.template_names = template_names + super().__init__(main_object, *args, **kwargs) + self.setWindowTitle("Create Work From Template") + self.widgets.header_lbl.setText("Create Work From Template") + self.widgets.header_lbl.set_color("green") + + + # check for the available templates. If there isn't any, show a warning and close the dialog + + + def define_primary_ui(self): + + # available_templates = self.main_object.get_template_names() + + _primary_ui = { + "template": { + "display_name": "Template", + "type": "combo", + "items": self.template_names, + "value": self.template_names[0], + "tooltip": "Template file to create the work from", + } + } + _orig_dict = super().define_primary_ui() + # # override the format with the defined file paths extension + # _path_obj = Path(self._file_or_folder_path) + # stem = _path_obj.stem + # # replace all non-alphanumeric characters with underscores + # _name = "".join([x if x.isalnum() else "_" for x in stem]) + # update_dict = { + # "name": { + # "display_name": "Name", + # "type": "validatedString", + # "value": _name, + # "tooltip": "Name of the work file", + # }, + # "file_format": { + # "display_name": "File Format", + # "type": "combo", + # "items": [_path_obj.suffix], + # "value": _path_obj.suffix, + # } + # } + # _primary_ui.update(update_dict) + + _primary_ui.update(_orig_dict) + # _primary_ui.pop("file_format") + return _primary_ui + class SaveAnyFileDialog(NewWorkDialog): """Dialog to save any file or folder to the tik manager 4 project.""" diff --git a/tik_manager4/ui/main.py b/tik_manager4/ui/main.py index 2322bdaa..d8788234 100644 --- a/tik_manager4/ui/main.py +++ b/tik_manager4/ui/main.py @@ -33,7 +33,7 @@ from tik_manager4.ui.dialog.publish_dialog import PublishSceneDialog from tik_manager4.ui.dialog.settings_dialog import SettingsDialog from tik_manager4.ui.dialog.user_dialog import LoginDialog, NewUserDialog -from tik_manager4.ui.dialog.work_dialog import NewWorkDialog, NewVersionDialog, SaveAnyFileDialog +from tik_manager4.ui.dialog.work_dialog import NewWorkDialog, NewVersionDialog, SaveAnyFileDialog, WorkFromTemplateDialog from tik_manager4.ui.mcv.category_mcv import TikCategoryLayout from tik_manager4.ui.mcv.project_mcv import TikProjectLayout from tik_manager4.ui.mcv.subproject_mcv import TikSubProjectLayout @@ -351,6 +351,8 @@ def build_buttons(self): # Work buttons save_new_work_btn = TikButton("Save New Work") save_new_work_btn.setMinimumSize(150, 40) + work_from_template_btn = TikButton("Work from Template") + work_from_template_btn.setMinimumSize(150, 40) save_file_as_work_btn = TikButton("Save File as Work") save_file_as_work_btn.setMinimumSize(150, 40) save_folder_as_work_btn = TikButton("Save Folder as Work") @@ -365,6 +367,7 @@ def build_buttons(self): publish_snapshot_btn.setMinimumSize(150, 40) self.work_buttons_layout.addWidget(save_new_work_btn) + self.work_buttons_layout.addWidget(work_from_template_btn) self.work_buttons_layout.addWidget(save_file_as_work_btn) self.work_buttons_layout.addWidget(save_folder_as_work_btn) self.work_buttons_layout.addWidget(increment_version_btn) @@ -385,6 +388,7 @@ def build_buttons(self): publish_snapshot_btn.hide() save_new_work_btn.clicked.connect(self.on_new_work) + work_from_template_btn.clicked.connect(self.on_work_from_template) save_file_as_work_btn.clicked.connect(lambda: self.on_save_any_file(folder=False)) save_folder_as_work_btn.clicked.connect(lambda: self.on_save_any_file(folder=True)) increment_version_btn.clicked.connect(self.on_new_version) @@ -553,6 +557,48 @@ def _new_work_pre_checks(self, subproject): self.tik.dcc, subproject.metadata): yield msg + def on_work_from_template(self): + """Launch the work from template dialog.""" + if not self._pre_check(level=1): + return + + available_templates = self.tik.get_template_names() + if not available_templates: + self.feedback.pop_info( + title="No Templates", + text="There are no templates available. Please create one.", + critical=True, + ) + return + + # first try to get the active category, and reach the task and subproject + category = self.categories_mcv.get_active_category() + if category: + task = category.parent_task + subproject = task.parent_sub + else: + # get the active task + task = self.tasks_mcv.get_active_task() + if not task: + self.feedback.pop_info( + title="No tasks found.", + text="Selected Sub-object does not have any tasks under it.\n" + "Please create a task before creating a work.", + critical=True, + ) + return + subproject = task.parent_sub + + dialog = WorkFromTemplateDialog( + self.tik, template_names=available_templates, parent=self, subproject=subproject, task_object=task, category_object=category, + ) + state = dialog.exec_() + if state: + self.set_last_state() + self.refresh_versions() + self.status_bar.showMessage("New work created successfully.", 5000) + self.resume_last_state() + def on_save_any_file(self, file_path=None, folder=False): """Launch the save any file dialog.""" if not self._pre_check(level=1): From b76e055a07150a59db802953187154a2db9cd89f Mon Sep 17 00:00:00 2001 From: Arda Kutlu Date: Sat, 8 Jun 2024 10:04:42 +0100 Subject: [PATCH 2/3] template methodology iws --- tik_manager4/dcc/__init__.py | 16 ++++++- tik_manager4/objects/category.py | 33 ++++++++++++-- tik_manager4/objects/main.py | 46 ++++++++++++++------ tik_manager4/objects/work.py | 62 ++++++++++++++++++++++++--- tik_manager4/ui/dialog/work_dialog.py | 11 +++++ 5 files changed, 145 insertions(+), 23 deletions(-) diff --git a/tik_manager4/dcc/__init__.py b/tik_manager4/dcc/__init__.py index 2f8c034e..06361f4c 100644 --- a/tik_manager4/dcc/__init__.py +++ b/tik_manager4/dcc/__init__.py @@ -1,5 +1,19 @@ import os -from importlib import reload + +EXTENSION_DICT = { + "3dsmax": [".max"], + "blender": [".blend"], + "gaffer": [".gfr"], + "houdini": [".hip", ".hipnc", ".hiplc"], + "katana": [".katana"], + "mari": [".mri"], + "maya": [".ma", ".mb"], + "nuke": [".nk"], + "photoshop": [".psd", ".psb"], + "standalone": [".*"], + "substance": [".spp"], + "trigger": [".trg"] +} NAME = os.getenv("TIK_DCC").lower() diff --git a/tik_manager4/objects/category.py b/tik_manager4/objects/category.py index 6c7de198..6538af94 100644 --- a/tik_manager4/objects/category.py +++ b/tik_manager4/objects/category.py @@ -64,7 +64,7 @@ def is_empty(self): def create_work_from_path(self, name, file_path, notes="", ignore_checks=True): """Register a given path (file or folder) as a work""" - + _ignore_checks = ignore_checks constructed_name = self.construct_name(name) # creating work from an arbitrary path is always considered as a 'standalone' process abs_path = self.get_abs_database_path("standalone", f"{constructed_name}.twork") @@ -92,19 +92,46 @@ def create_work_from_path(self, name, file_path, notes="", ignore_checks=True): work.new_version_from_path(file_path=file_path, notes=notes) return work - def create_work_from_template(self, name, template_file, notes="", ignore_checks=True): + def create_work_from_template(self, name, template_file, dcc, notes="", ignore_checks=True): """ Creates a task under the category. Args: name (str): Name of the work template_file (str): Path to the template file + dcc (str): DCC name. notes (str): Notes for the work ignore_checks (bool): Ignore the checks for the work creation Returns: tik_manager4.objects.work: Work object """ - pass + _ignore_checks = ignore_checks + constructed_name = self.construct_name(name) + abs_path = self.get_abs_database_path(dcc, f"{constructed_name}.twork") + + if Path(abs_path).exists(): + # in that case instantiate the work and iterate the version. + work = Work(absolute_path=abs_path, parent_task=self.parent_task) + work.new_version_from_path(file_path=template_file, notes=notes) + return work + + relative_path = self.get_relative_work_path(override_dcc=dcc) + work = Work(abs_path, name=constructed_name, path=relative_path, parent_task=self.parent_task) + + work.add_property("name", constructed_name) + work.add_property("creator", self.guard.user) + work.add_property("category", self.name) + work.add_property("dcc", dcc) + work.add_property("dcc_version", "NA") + work.add_property("versions", []) + work.add_property("work_id", work.generate_id()) + work.add_property("task_name", self.parent_task.name) + work.add_property("task_id", self.parent_task.id) + work.add_property("path", relative_path) + work.add_property("state", "working") + work.init_properties() + work.new_version_from_path(file_path=template_file, notes=notes) + return work def create_work(self, name, file_format=None, notes="", ignore_checks=True): """Creates a task under the category""" diff --git a/tik_manager4/objects/main.py b/tik_manager4/objects/main.py index 4baf08f7..ea8370ce 100644 --- a/tik_manager4/objects/main.py +++ b/tik_manager4/objects/main.py @@ -156,15 +156,21 @@ def set_project(self, absolute_path): def collect_template_paths(self): """Collect all template files from common, project and user folders.""" - user_templates = list(Path(self.user.settings.get("user_templates_directory")).rglob("*.*")) - project_templates = list((Path(self.project.absolute_path)/"_templates").rglob("*.*")) - print(self.project.absolute_path) - print(Path(self.project.absolute_path)/"_templates") - print(project_templates) - print(project_templates) - print(project_templates) - print(project_templates) - common_templates = list((Path(self.user.common_directory)/"_templates").rglob("*.*")) + # if the dcc is standalone, collect all applicable extensions from the extension dictionary + # otherwise, collect the extensions from the dcc object + if self.dcc.name.lower() == "standalone": + extensions = [ext for ext_list in dcc.EXTENSION_DICT.values() for ext in ext_list] + else: + extensions = self.dcc.formats + user_templates = [p for p in Path(self.user.settings.get("user_templates_directory")).rglob("*.*") if + p.suffix in extensions] + project_templates = [p for p in Path(self.project.absolute_path).joinpath("_templates").rglob("*.*") if + p.suffix in extensions] + common_templates = [p for p in Path(self.user.common_directory).joinpath("_templates").rglob("*.*") if + p.suffix in extensions] + # user_templates = list(Path(self.user.settings.get("user_templates_directory")).rglob("*.*")) + # project_templates = list((Path(self.project.absolute_path)/"_templates").rglob("*.*")) + # common_templates = list((Path(self.user.common_directory)/"_templates").rglob("*.*")) return project_templates + common_templates + user_templates @@ -177,11 +183,25 @@ def get_template_path_by_name(self, name): """Gets the template file by name. Resolution order is project > common > user. + + Args: + name (str): Name of the template. + + Returns: + tuple: Dcc Name, Path to the template file. """ all_templates = self.collect_template_paths() for template_path in all_templates: if template_path.stem == name: - return template_path.as_posix() - - return None - + dcc_name = self.__resolve_dcc_name_from_extension(template_path.suffix) + return dcc_name, template_path.as_posix() + + return None, None + + def __resolve_dcc_name_from_extension(self, extension): + """Resolve the DCC name from the extension.""" + for key, value in dcc.EXTENSION_DICT.items(): + if extension in value: + return key + # for anything else, return standalone + return "standalone" \ No newline at end of file diff --git a/tik_manager4/objects/work.py b/tik_manager4/objects/work.py index b380bb1a..06fe8131 100644 --- a/tik_manager4/objects/work.py +++ b/tik_manager4/objects/work.py @@ -152,6 +152,58 @@ def get_version(self, version_number): if version.get("version_number") == version_number: return version + # def new_version_from_template(self, file_path, notes=""): + # """Register a given path as a new version of the work. + # + # Args: + # file_path: + # notes: + # + # Returns: + # + # """ + # state = self.check_permissions(level=1) + # if state != 1: + # return -1 + # + # file_format = Path(file_path).suffix + # version_number, version_name, thumbnail_name = self.construct_names(file_format) + # + # abs_version_path = self.get_abs_project_path(self.name, version_name) + # thumbnail_path = self.get_abs_database_path("thumbnails", thumbnail_name) + # Path(abs_version_path).parent.mkdir(parents=True, exist_ok=True) + # + # # copy the file to the location + # output_path = self._standalone_handler.save_as(abs_version_path, source_path=file_path) + # + # # generate thumbnail + # # create the thumbnail folder if it doesn't exist + # Path(thumbnail_path).parent.mkdir(parents=True, exist_ok=True) + # + # # FIXME: CREATE A THUMBNAIL SPECIFIC TO TEMPLATE + # # # add it to the versions + # # extension = Path(output_path).suffix or "Folder" + # # get the name of the file + # file_name = Path(file_path).name + # self._standalone_handler.text_to_image(file_name, thumbnail_path, 220, 124) + # + # version = { + # "version_number": version_number, + # "workstation": socket.gethostname(), + # "notes": notes, + # "thumbnail": Path("thumbnails", thumbnail_name).as_posix(), + # "scene_path": Path(self.name, str(version_name)).as_posix(), + # "user": self.guard.user, + # "previews": {}, + # "file_format": file_format, + # "dcc_version": "NA", + # } + # + # self._versions.append(version) + # self.edit_property("versions", self._versions) + # self.apply_settings(force=True) + # return version + def new_version_from_path(self, file_path, notes=""): """Register a given path (file or folder) as a new version of the work. @@ -596,7 +648,6 @@ def delete_version(self, version_number): self.apply_settings(force=True) return 1 - def __generate_thumbnail_paths(self, version_obj, override_extension=None): """Return the thumbnail paths of the given version.""" # if there is no previous thumbnail, generate a new one @@ -608,7 +659,6 @@ def __generate_thumbnail_paths(self, version_obj, override_extension=None): Path(abs_path).parent.mkdir(parents=True, exist_ok=True) return relative_path, abs_path - def replace_thumbnail(self, version_number, new_thumbnail_path=None): """Replace the thumbnail of the given version. Args: @@ -647,9 +697,9 @@ def check_dcc_version_mismatch(self): metadata_key = f"{self.guard.dcc.lower()}_version" # if a dcc version defined in metadata, use that. Otherwise use the current dcc version. defined_dcc_version = self.get_metadata(self.parent_task, metadata_key) or self.dcc_version - # compare this against the current dcc version - if defined_dcc_version != current_dcc: - return (defined_dcc_version, current_dcc) - return False + if defined_dcc_version in ["NA", "", current_dcc]: + return False + return defined_dcc_version, current_dcc + diff --git a/tik_manager4/ui/dialog/work_dialog.py b/tik_manager4/ui/dialog/work_dialog.py index c6c12d16..4d20f5fe 100644 --- a/tik_manager4/ui/dialog/work_dialog.py +++ b/tik_manager4/ui/dialog/work_dialog.py @@ -483,6 +483,17 @@ def define_primary_ui(self): # _primary_ui.pop("file_format") return _primary_ui + def on_create_work(self): + """Create the work file.""" + template_name = self.primary_data.get_property("template") + name = self.primary_data.get_property("name") + notes = self.widgets.notes_te.toPlainText() + # + # resolve the template file. + dcc_name, template_path = self.main_object.get_template_path_by_name(template_name) + self.category.create_work_from_template(name, template_path, dcc=dcc_name, ignore_checks=True, notes=notes) + self.accept() + class SaveAnyFileDialog(NewWorkDialog): """Dialog to save any file or folder to the tik manager 4 project.""" From b5cce4686e34bf6806008514245814480868a856 Mon Sep 17 00:00:00 2001 From: Arda Kutlu Date: Sat, 8 Jun 2024 23:44:18 +0100 Subject: [PATCH 3/3] streamlining the template methodology. Adding icon visualisations to the works. --- tik_manager4/ui/dialog/work_dialog.py | 31 +++--------------------- tik_manager4/ui/main.py | 17 +++++++++++++ tik_manager4/ui/mcv/category_mcv.py | 24 ++++++++++++++++++ tik_manager4/ui/theme/rc/3dsmax.png | Bin 0 -> 2201 bytes tik_manager4/ui/theme/rc/blender.png | Bin 0 -> 4931 bytes tik_manager4/ui/theme/rc/gaffer.png | Bin 0 -> 4518 bytes tik_manager4/ui/theme/rc/houdini.png | Bin 3098 -> 5302 bytes tik_manager4/ui/theme/rc/katana.png | Bin 0 -> 4012 bytes tik_manager4/ui/theme/rc/mari.png | Bin 0 -> 5640 bytes tik_manager4/ui/theme/rc/maya.png | Bin 5588 -> 4575 bytes tik_manager4/ui/theme/rc/nuke.png | Bin 5708 -> 5315 bytes tik_manager4/ui/theme/rc/photoshop.png | Bin 4331 -> 4180 bytes tik_manager4/ui/theme/rc/standalone.png | Bin 0 -> 4979 bytes tik_manager4/ui/theme/rc/substance.png | Bin 0 -> 3931 bytes tik_manager4/ui/theme/rc/trigger.png | Bin 0 -> 4359 bytes 15 files changed, 45 insertions(+), 27 deletions(-) create mode 100644 tik_manager4/ui/theme/rc/3dsmax.png create mode 100644 tik_manager4/ui/theme/rc/blender.png create mode 100644 tik_manager4/ui/theme/rc/gaffer.png create mode 100644 tik_manager4/ui/theme/rc/katana.png create mode 100644 tik_manager4/ui/theme/rc/mari.png create mode 100644 tik_manager4/ui/theme/rc/standalone.png create mode 100644 tik_manager4/ui/theme/rc/substance.png create mode 100644 tik_manager4/ui/theme/rc/trigger.png diff --git a/tik_manager4/ui/dialog/work_dialog.py b/tik_manager4/ui/dialog/work_dialog.py index 4d20f5fe..67665757 100644 --- a/tik_manager4/ui/dialog/work_dialog.py +++ b/tik_manager4/ui/dialog/work_dialog.py @@ -159,10 +159,8 @@ def update_labels(self, validation_status): _name = self.primary_content.settings_data.get_property("name") if not _name: self.widgets.resolved_name_lbl.setText("No Name Entered") - # return elif not validation_status: self.widgets.resolved_name_lbl.setText("Invalid name") - # return else: _file_format = self.primary_content.settings_data.get_property( "file_format" @@ -440,9 +438,10 @@ def __init__(self, main_object, template_names=None, *args, **kwargs): self.widgets.header_lbl.setText("Create Work From Template") self.widgets.header_lbl.set_color("green") - - # check for the available templates. If there isn't any, show a warning and close the dialog - + # hide the file_format widget + self.file_format_widget = self.primary_content.find("file_format") + self.file_format_widget.hide() + self.file_format_widget.label.hide() def define_primary_ui(self): @@ -458,29 +457,7 @@ def define_primary_ui(self): } } _orig_dict = super().define_primary_ui() - # # override the format with the defined file paths extension - # _path_obj = Path(self._file_or_folder_path) - # stem = _path_obj.stem - # # replace all non-alphanumeric characters with underscores - # _name = "".join([x if x.isalnum() else "_" for x in stem]) - # update_dict = { - # "name": { - # "display_name": "Name", - # "type": "validatedString", - # "value": _name, - # "tooltip": "Name of the work file", - # }, - # "file_format": { - # "display_name": "File Format", - # "type": "combo", - # "items": [_path_obj.suffix], - # "value": _path_obj.suffix, - # } - # } - # _primary_ui.update(update_dict) - _primary_ui.update(_orig_dict) - # _primary_ui.pop("file_format") return _primary_ui def on_create_work(self): diff --git a/tik_manager4/ui/main.py b/tik_manager4/ui/main.py index d8788234..6f8a33f8 100644 --- a/tik_manager4/ui/main.py +++ b/tik_manager4/ui/main.py @@ -286,6 +286,18 @@ def initialize_mcv(self): self.categories_mcv.work_tree_view.file_dropped.connect(self.on_save_any_file) self.versions_mcv.show_preview_btn.clicked.connect(self.on_show_preview) + if self.tik.dcc.name == "Standalone": + self.categories_mcv.work_tree_view.save_new_work_event.connect( + self.on_save_any_file + ) + else: + self.categories_mcv.work_tree_view.save_new_work_event.connect( + self.on_new_work + ) + self.categories_mcv.work_tree_view.work_from_template_event.connect( + self.on_work_from_template + ) + def set_last_state(self): """Set the last selections for the user""" # get the currently selected subproject @@ -365,6 +377,11 @@ def build_buttons(self): publish_scene_btn.setMinimumSize(150, 40) publish_snapshot_btn = TikButton("Publish Snapshot") publish_snapshot_btn.setMinimumSize(150, 40) + # set the publish icon to the button + publish_snapshot_btn.setIcon(pick.icon("published")) + publish_snapshot_btn.setIconSize(QtCore.QSize(24, 24)) + publish_scene_btn.setIcon(pick.icon("published")) + publish_scene_btn.setIconSize(QtCore.QSize(24, 24)) self.work_buttons_layout.addWidget(save_new_work_btn) self.work_buttons_layout.addWidget(work_from_template_btn) diff --git a/tik_manager4/ui/mcv/category_mcv.py b/tik_manager4/ui/mcv/category_mcv.py index 43bcbad9..78e59dce 100644 --- a/tik_manager4/ui/mcv/category_mcv.py +++ b/tik_manager4/ui/mcv/category_mcv.py @@ -8,6 +8,8 @@ from tik_manager4.ui.dialog.work_dialog import NewVersionDialog from tik_manager4.ui.widgets.common import VerticalSeparator +from tik_manager4.ui import pick + class TikWorkItem(QtGui.QStandardItem): """Custom QStandardItem for the work items in the category view.""" @@ -37,6 +39,8 @@ def __init__(self, work_obj): self.setText(work_obj.name) self.state = None self.refresh() + self.setIcon(pick.icon(self.tik_obj.dcc.lower())) + def refresh(self): """Refresh the item state.""" @@ -96,6 +100,7 @@ def __init__(self, publish_obj): self.setText(str(publish_obj.name)) self.state = None # self.setForeground(QtGui.QColor(*self.state_color_dict["publish"])) + self.setIcon(pick.icon("published")) self.refresh() def refresh(self): @@ -130,6 +135,7 @@ def dcc_check(self): """Check if the dcc of the work matches the dcc of the current session.""" return self.tik_obj.dcc == self.tik_obj.guard.dcc + class TikCategoryColumnItem(QtGui.QStandardItem): """Custom QStandardItem for the category columns in the category view.""" def __init__(self, text): @@ -140,6 +146,7 @@ def __init__(self, text): super(TikCategoryColumnItem, self).__init__(text) self.setEditable(False) + class TikCategoryModel(QtGui.QStandardItemModel): """Custom QStandardItemModel for the category view.""" columns = ["name", "id", "path", "creator", "dcc", "date", "version count"] @@ -232,6 +239,7 @@ def append_work(self, work): return _item + class TikCategoryView(QtWidgets.QTreeView): """Custom QTreeView for the category view.""" item_selected = QtCore.Signal(object) @@ -243,6 +251,8 @@ class TikCategoryView(QtWidgets.QTreeView): import_event = ( QtCore.Signal() ) # the signal for main UI importing the selected version of the selected work + save_new_work_event = QtCore.Signal() + work_from_template_event = QtCore.Signal() def __init__(self, parent=None): """Initialize the view. @@ -280,6 +290,8 @@ def __init__(self, parent=None): self.setAcceptDrops(True) + self.setIconSize(QtCore.QSize(32, 32)) + self.expandAll() def dragEnterEvent(self, event): @@ -461,6 +473,17 @@ def header_right_click_menu(self, position): menu.exec_(self.mapToGlobal(position)) + def _right_click_on_blank(self, right_click_menu, position): + """Create a right click menu for the blank space.""" + # if the dcc is not standalone, add the save new work action + + save_work_act = right_click_menu.addAction(self.tr("Save New Work")) + work_from_template_act = right_click_menu.addAction(self.tr("Create Work From Template")) + save_work_act.triggered.connect(self.save_new_work_event.emit) + work_from_template_act.triggered.connect(self.work_from_template_event.emit) + right_click_menu.exec_(self.sender().viewport().mapToGlobal(position)) + + def right_click_menu(self, position): """Create a right click menu for the view. Args: @@ -470,6 +493,7 @@ def right_click_menu(self, position): index_under_pointer = self.indexAt(position) right_click_menu = QtWidgets.QMenu(self) if not index_under_pointer.isValid(): + self._right_click_on_blank(right_click_menu, position) return # make sure the idx is pointing to the first column index_under_pointer = index_under_pointer.sibling(index_under_pointer.row(), 0) diff --git a/tik_manager4/ui/theme/rc/3dsmax.png b/tik_manager4/ui/theme/rc/3dsmax.png new file mode 100644 index 0000000000000000000000000000000000000000..b2d927b042ee334c9b3c50603c32b1ca609454ba GIT binary patch literal 2201 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 delta 2107 zcma);doi}#Kst*TY3HpSup|s0M|41tsaPC|K%`Rb z5O@Gbu?HyjI06Poq7eZa9$!5v&{B@B*{6|!|Ahs7nn)rQb7Pz>!o*x< z2^axHg-T*1vQSABjp^>bS1J*OMXWZI`Fgk^m<)Fkj!Gh7@L1fx-o$3pn93pu49Umy z2xNf+1;Yo(WQ>qc1Ta(r6^FqKxBv;qr&34)2PIe=jU*C;R6bcC#5nLsR18l@c>IYU{m-($d-BJ!EQpIzsP8OyoIibG zbz0h(^xb|3nkP765q|rP8VPFGooBuzCv8H#>SkZ+*00fNa657fT%xNjc(DnJ=2n(J z-I-K~a41ZA6{zh63S$pw+qLTM^=%1B-3Z-qt|dhqxwd3i(f#~RS!7U&qtc@KSMU;`1Q8se4+E@d2pa z;3?LAA~t6X$tyQw)X!5)bcRvni){*D)`Ruy9PiwmPgU(PE3wrSqjFYiTbnplaWHKD z*}6|naKDHaM?Pvf%qPwN=41q>N{!B1T9}N=k^ki=2RbjC#lLX*p<3>Y^7RR3z-v{N zoSyw%e}(!*whcQOo1uy=WB283E*sZBI(BCA+IEgiSFd*HoJEdt;f(X=1IZQA{FT;& z^Lw^#7M=T~7ph(cpLBWlr1eX{Najr>!-u9nbYj}@*!V66>;!lD(Zk5iIhD4IY{L6q z^oR70nZPq;)oNZ2$goR3-Vx?>V5QcU<=+$J13Z!ITAgE88A?pvn!5IPsA4Yz?b!H@ z9j0A_FWQXbVJQ|pZUfg(OA-vtnWX-^lVD57Y@$qt8HlY zNlwoO(CYyjWEkxFrOpxCVakEM@Rv9*$ofT^(pf)tDe=(W_Y8fc4o_xp%&y$2f{@CsI!i0oQ^MUPg|ufR^KU5J1EWj0xUG!#C}B$FHwshNFv9URQX!5;&J^n4kEK2bD~wXmVKE6 zY~BE8bpp1zIPN57RV?|8O_+^LKEDLX5NJcjzb-!d1ndA*{UL9j^ts)peE;&JChuM6 zuTVRgGcXGMf}utwGYeewhBwR(cS*=oBS8Z!rzVFt6)uxfxF|f=`uxTqxS>z zk<8{fH)WHpJ=Ar&=h?{YEj@*~ol@P6aXEDTGI~}6#WoL;*NkALH88_yL<51}NsPRg zfAg3AUlCQZ+$#F;JlUCq=wDM;7G=EtlC-JZ5@R!@C9KVDm;#>~4!8Wulvck-yG|#| z0~-%+3C?4n3zX5>9+>@NsFuPi>FQCn)6YS0V3RhWH~a=oL{8ne}InWZk*Qi|I`5GKdM=Gf|kOejo2S!QeiQ z9~HM;E=W!|nh`!L54m-yk?fs3;Beh)yw~&X`Me*j?I%4KEO*CcSPMLurv>v5nJw+P zP(@uHefqZV%V?I7rOvLkNY;u$?{;EV=>zXm51Q%Gb0Hl`{x>+L1&QCrGyQACUG2sb z=5ykw6$7WdnwRYCwwyH-h4j&S@=3NDU2kTV(RAFo9^`J1f#4 z=34JAP^qxl^Elj=UdO1qqS&lD&E7>9s{=^$({JG`Yv9(e#pNbCk*oUwh{@PPzv~uq F=AU!Qc&h*a diff --git a/tik_manager4/ui/theme/rc/katana.png b/tik_manager4/ui/theme/rc/katana.png new file mode 100644 index 0000000000000000000000000000000000000000..053843bfe1d8180fa1859b28ba84b98bb4e45284 GIT binary patch literal 4012 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 literal 0 HcmV?d00001 diff --git a/tik_manager4/ui/theme/rc/mari.png b/tik_manager4/ui/theme/rc/mari.png new file mode 100644 index 0000000000000000000000000000000000000000..52d6c216d8011ce183a189b4083d74905318293f GIT binary patch literal 5640 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 Sy;AywM{Kj%NxN*dKmK<@{sCJ6 delta 4258 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 Cen74O diff --git a/tik_manager4/ui/theme/rc/nuke.png b/tik_manager4/ui/theme/rc/nuke.png index c9439d607e38c9270cfb34a55be311a1bf2f1822..443f230656ea62e75148e0c64206b05ba5152142 100644 GIT binary patch delta 3767 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 CDV)Rr diff --git a/tik_manager4/ui/theme/rc/photoshop.png b/tik_manager4/ui/theme/rc/photoshop.png index 380011335ce552c42831954fb39d6d51bbb742ac..baf201718bc87d50dc02197427983aeb2e600bda 100644 GIT binary patch literal 4180 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 N7X$?Hi>F7d_#L%b8%6*C delta 3333 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 yKtl`?g%M#@&CEYmEF{7rwBJ2-4wK`?BngC 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 literal 0 HcmV?d00001