From c45af6caebd6ad7463f97d9db3a56b1a2458dd64 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 23 Apr 2021 17:23:43 +0200 Subject: [PATCH] init commit asset name duplicity validation --- .../project_manager/constants.py | 2 +- .../project_manager/project_manager/model.py | 59 +++++++++++++++---- 2 files changed, 49 insertions(+), 12 deletions(-) diff --git a/openpype/tools/project_manager/project_manager/constants.py b/openpype/tools/project_manager/project_manager/constants.py index 21db80e5f7..61d1944979 100644 --- a/openpype/tools/project_manager/project_manager/constants.py +++ b/openpype/tools/project_manager/project_manager/constants.py @@ -2,4 +2,4 @@ from Qt import QtCore IDENTIFIER_ROLE = QtCore.Qt.UserRole + 1 -COLUMNS_ROLE = QtCore.Qt.UserRole + 2 +DUPLICATED_ROLE = QtCore.Qt.UserRole + 2 diff --git a/openpype/tools/project_manager/project_manager/model.py b/openpype/tools/project_manager/project_manager/model.py index 867adbaef3..47fc608112 100644 --- a/openpype/tools/project_manager/project_manager/model.py +++ b/openpype/tools/project_manager/project_manager/model.py @@ -4,7 +4,7 @@ from uuid import uuid4 from .constants import ( IDENTIFIER_ROLE, - COLUMNS_ROLE + DUPLICATED_ROLE ) from avalon.api import AvalonMongoDB @@ -39,6 +39,7 @@ class HierarchyModel(QtCore.QAbstractItemModel): super(HierarchyModel, self).__init__(parent) self._root_item = None self._items_by_id = {} + self._asset_items_by_name = collections.defaultdict(list) self.dbcon = AvalonMongoDB() self._hierarchy_mode = True @@ -87,6 +88,12 @@ class HierarchyModel(QtCore.QAbstractItemModel): item = index.internalPointer() column = index.column() key = self.columns[column] + if ( + key == "name" + and role in (QtCore.Qt.EditRole, QtCore.Qt.DisplayRole) + ): + self._rename_asset(item, value) + result = item.setData(key, value, role) if result: self.dataChanged.emit(index, index, [role]) @@ -154,8 +161,13 @@ class HierarchyModel(QtCore.QAbstractItemModel): data = {"name": name} new_child = AssetItem(data) + self._asset_items_by_name[name].append(new_child) - return self.add_item(new_child, parent, new_row) + result = self.add_item(new_child, parent, new_row) + + self._validate_asset_duplicity(name) + + return result def add_new_task(self, parent_index): item_id = parent_index.data(IDENTIFIER_ROLE) @@ -173,12 +185,6 @@ class HierarchyModel(QtCore.QAbstractItemModel): new_child = TaskItem(data) return self.add_item(new_child, parent) - def add_new_item(self, parent): - data = {"name": "Test {}".format(parent.rowCount())} - new_child = AssetItem(data) - - return self.add_item(new_child, parent) - def add_item(self, item, parent=None, row=None): if parent is None: parent = self._root_item @@ -240,12 +246,46 @@ class HierarchyModel(QtCore.QAbstractItemModel): if child_id in all_descendants: continue + if isinstance(child_item, AssetItem): + self._rename_asset(child_item, None) children.pop(child_id) child_item.set_parent(None) self._items_by_id.pop(child_id) self.endRemoveRows() + def _rename_asset(self, asset_item, new_name): + if not isinstance(asset_item, AssetItem): + return + + prev_name = asset_item.data("name", QtCore.Qt.DisplayRole) + print(prev_name) + self._asset_items_by_name[prev_name].remove(asset_item) + + self._validate_asset_duplicity(prev_name) + + if new_name is None: + return + self._asset_items_by_name[new_name].append(asset_item) + + self._validate_asset_duplicity(new_name) + + def _validate_asset_duplicity(self, name): + if name not in self._asset_items_by_name: + return + + items = self._asset_items_by_name[name] + if not items: + self._asset_items_by_name.pop(name) + + elif len(items) == 1: + index = self.index_for_item(items[0]) + self.setData(index, False, DUPLICATED_ROLE) + else: + for item in items: + index = self.index_for_item(item) + self.setData(index, True, DUPLICATED_ROLE) + def move_vertical(self, index, direction): if not index.isValid(): return @@ -456,9 +496,6 @@ class BaseItem: if role == IDENTIFIER_ROLE: return self._id - if role == COLUMNS_ROLE: - return self.columns - if key not in self.columns: return None