From 4d7285c5b1db76da02528a47d7f70ff83c3ddeb3 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 18 Feb 2025 19:10:36 +0100 Subject: [PATCH] added folder label to task view --- client/ayon_core/tools/loader/abstract.py | 14 ++++++++ client/ayon_core/tools/loader/control.py | 12 +++++++ .../ayon_core/tools/loader/ui/tasks_widget.py | 34 ++++++++++++++++--- 3 files changed, 56 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/tools/loader/abstract.py b/client/ayon_core/tools/loader/abstract.py index bdd8f057a1..d527428196 100644 --- a/client/ayon_core/tools/loader/abstract.py +++ b/client/ayon_core/tools/loader/abstract.py @@ -556,6 +556,20 @@ class FrontendLoaderController(_BaseLoaderController): """ pass + @abstractmethod + def get_folder_labels(self, project_name, folder_ids): + """Get folder labels for folder ids. + + Args: + project_name (str): Project name. + folder_ids (Iterable[str]): Folder ids. + + Returns: + dict[str, Optional[str]]: Folder labels by folder id. + + """ + pass + @abstractmethod def get_project_status_items(self, project_name, sender=None): """Items for all projects available on server. diff --git a/client/ayon_core/tools/loader/control.py b/client/ayon_core/tools/loader/control.py index 8f8e7c2b15..089435140e 100644 --- a/client/ayon_core/tools/loader/control.py +++ b/client/ayon_core/tools/loader/control.py @@ -206,6 +206,18 @@ class LoaderController(BackendLoaderController, FrontendLoaderController): )) return output + def get_folder_labels(self, project_name, folder_ids): + folder_items_by_id = self._hierarchy_model.get_folder_items_by_id( + project_name, folder_ids + ) + output = {} + for folder_id, folder_item in folder_items_by_id.items(): + label = None + if folder_item is not None: + label = folder_item.label + output[folder_id] = label + return output + def get_product_items(self, project_name, folder_ids, sender=None): return self._products_model.get_product_items( project_name, folder_ids, sender) diff --git a/client/ayon_core/tools/loader/ui/tasks_widget.py b/client/ayon_core/tools/loader/ui/tasks_widget.py index e4fb7d1199..3a48c2fbf7 100644 --- a/client/ayon_core/tools/loader/ui/tasks_widget.py +++ b/client/ayon_core/tools/loader/ui/tasks_widget.py @@ -17,11 +17,15 @@ from ayon_core.tools.utils.tasks_widget import ( ) from ayon_core.tools.utils.lib import RefreshThread +# Role that can't clash with default 'tasks_widget' roles +FOLDER_LABEL_ROLE = QtCore.Qt.UserRole + 100 + class LoaderTasksQtModel(TasksQtModel): column_labels = [ "Task name", "Task type", + "Folder" ] def __init__(self, controller): @@ -93,7 +97,14 @@ class LoaderTasksQtModel(TasksQtModel): task_type_items = self._controller.get_task_type_items( project_name, sender=TASKS_MODEL_SENDER_NAME ) - return task_items, task_type_items + folder_ids = { + task_item.parent_id + for task_item in task_items + } + folder_labels_by_id = self._controller.get_folder_labels( + project_name, folder_ids + ) + return task_items, task_type_items, folder_labels_by_id def _on_refresh_thread(self, thread_id): """Callback when refresh thread is finished. @@ -131,7 +142,7 @@ class LoaderTasksQtModel(TasksQtModel): super()._clear_items() def _fill_data_from_thread(self, thread): - task_items, task_type_items = thread.get_result() + task_items, task_type_items, folder_labels_by_id = thread.get_result() # Task items are refreshed if task_items is None: return @@ -165,11 +176,15 @@ class LoaderTasksQtModel(TasksQtModel): task_type_icon_cache ) name = task_item.name + folder_id = task_item.parent_id + folder_label = folder_labels_by_id.get(folder_id) + item.setData(name, QtCore.Qt.DisplayRole) item.setData(name, ITEM_NAME_ROLE) item.setData(task_item.id, ITEM_ID_ROLE) item.setData(task_item.task_type, TASK_TYPE_ROLE) - item.setData(task_item.parent_id, PARENT_ID_ROLE) + item.setData(folder_id, PARENT_ID_ROLE) + item.setData(folder_label, FOLDER_LABEL_ROLE) item.setData(icon, QtCore.Qt.DecorationRole) items_by_name[name].append(item) @@ -254,6 +269,12 @@ class LoaderTasksQtModel(TasksQtModel): else: return None + if col == 2: + if role == QtCore.Qt.DisplayRole: + role = FOLDER_LABEL_ROLE + else: + return None + return super().data(index, role) @@ -277,7 +298,11 @@ class LoaderTasksWidget(QtWidgets.QWidget): tasks_proxy_model.setSortCaseSensitivity(QtCore.Qt.CaseInsensitive) tasks_view.setModel(tasks_proxy_model) - tasks_view_header.setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch) + # Hide folder column by default + tasks_view.setColumnHidden(2, True) + tasks_view_header.setSectionResizeMode( + 0, QtWidgets.QHeaderView.Stretch + ) main_layout = QtWidgets.QHBoxLayout(self) main_layout.setContentsMargins(0, 0, 0, 0) @@ -326,6 +351,7 @@ class LoaderTasksWidget(QtWidgets.QWidget): def _on_folders_selection_changed(self, event): project_name = event["project_name"] folder_ids = event["folder_ids"] + self._tasks_view.setColumnHidden(2, len(folder_ids) == 1) self._tasks_model.set_context(project_name, folder_ids) def _on_model_refresh(self):