From 824d9a13f510b918962b7ce71a8681bd81dd4957 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 19 May 2021 12:42:02 +0200 Subject: [PATCH 1/4] rename_task skip removed tasks --- openpype/tools/project_manager/project_manager/model.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/openpype/tools/project_manager/project_manager/model.py b/openpype/tools/project_manager/project_manager/model.py index 6e20dd368f..90b4734a28 100644 --- a/openpype/tools/project_manager/project_manager/model.py +++ b/openpype/tools/project_manager/project_manager/model.py @@ -1810,6 +1810,9 @@ class AssetItem(BaseItem): _item.setData(False, DUPLICATED_ROLE) def _rename_task(self, item): + if item.data(REMOVED_ROLE): + return + new_name = item.data(QtCore.Qt.EditRole, "name").lower() item_id = item.data(IDENTIFIER_ROLE) prev_name = self._task_name_by_item_id[item_id] From 6305a10656585d08cd972383c6448950ee2cb912 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 19 May 2021 12:42:27 +0200 Subject: [PATCH 2/4] AssetItem has callback on task remove state change --- .../project_manager/project_manager/model.py | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/openpype/tools/project_manager/project_manager/model.py b/openpype/tools/project_manager/project_manager/model.py index 90b4734a28..5dae12901e 100644 --- a/openpype/tools/project_manager/project_manager/model.py +++ b/openpype/tools/project_manager/project_manager/model.py @@ -1843,6 +1843,32 @@ class AssetItem(BaseItem): def on_task_name_change(self, task_item): self._rename_task(task_item) + def on_task_remove_state_change(self, task_item): + is_removed = task_item.data(REMOVED_ROLE) + item_id = task_item.data(IDENTIFIER_ROLE) + if is_removed: + name = self._task_name_by_item_id.pop(item_id) + self._task_items_by_name[name].remove(task_item) + + else: + name = task_item.data(QtCore.Qt.EditRole, "name").lower() + self._task_name_by_item_id[item_id] = name + self._task_items_by_name[name].append(task_item) + + # Remove from previous name mapping + if not self._task_items_by_name[name]: + self._task_items_by_name.pop(name) + + elif len(self._task_items_by_name[name]) == 1: + if name in self._duplicated_task_names: + self._duplicated_task_names.remove(name) + task_item.setData(False, DUPLICATED_ROLE) + + else: + self._duplicated_task_names.add(name) + for _item in self._task_items_by_name[name]: + _item.setData(True, DUPLICATED_ROLE) + def add_child(self, item, row=None): if item in self._children: return From 56acc5026e7ab8e6b18291cc935f7168ee0ec42c Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 19 May 2021 12:42:55 +0200 Subject: [PATCH 3/4] task is calling `on_task_remove_state_change` on it's parent when REMOVED_ROLE state has changed --- openpype/tools/project_manager/project_manager/model.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/openpype/tools/project_manager/project_manager/model.py b/openpype/tools/project_manager/project_manager/model.py index 5dae12901e..18dd5bc46d 100644 --- a/openpype/tools/project_manager/project_manager/model.py +++ b/openpype/tools/project_manager/project_manager/model.py @@ -2004,7 +2004,10 @@ class TaskItem(BaseItem): return True if role == REMOVED_ROLE: + if value == self._removed: + return False self._removed = value + self.parent().on_task_remove_state_change(self) return True if ( From 0fc5a542c88b44220d65d49e1004cf0a4f20b4e5 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 19 May 2021 12:43:13 +0200 Subject: [PATCH 4/4] _remove task skip item ids that are not in _task_name_by_item_id --- openpype/tools/project_manager/project_manager/model.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/openpype/tools/project_manager/project_manager/model.py b/openpype/tools/project_manager/project_manager/model.py index 18dd5bc46d..5000729adf 100644 --- a/openpype/tools/project_manager/project_manager/model.py +++ b/openpype/tools/project_manager/project_manager/model.py @@ -1797,7 +1797,11 @@ class AssetItem(BaseItem): item.setData(False, DUPLICATED_ROLE) def _remove_task(self, item): + # This method is probably obsolete with changed logic and added + # `on_task_remove_state_change` method. item_id = item.data(IDENTIFIER_ROLE) + if item_id not in self._task_name_by_item_id: + return name = self._task_name_by_item_id.pop(item_id) self._task_items_by_name[name].remove(item)