diff --git a/client/ayon_core/tools/loader/ui/products_delegates.py b/client/ayon_core/tools/loader/ui/products_delegates.py index 0ed8fe8fe7..9753da37af 100644 --- a/client/ayon_core/tools/loader/ui/products_delegates.py +++ b/client/ayon_core/tools/loader/ui/products_delegates.py @@ -140,12 +140,6 @@ class VersionComboBox(QtWidgets.QComboBox): self.value_changed.emit(self._product_id, value) -class EditorInfo: - def __init__(self, widget): - self.widget = widget - self.added = False - - class VersionDelegate(QtWidgets.QStyledItemDelegate): """A delegate that display version integer formatted as version string.""" @@ -154,7 +148,7 @@ class VersionDelegate(QtWidgets.QStyledItemDelegate): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self._editor_by_id: Dict[str, EditorInfo] = {} + self._editor_by_id: Dict[str, VersionComboBox] = {} self._statuses_filter = None def displayText(self, value, locale): @@ -164,8 +158,8 @@ class VersionDelegate(QtWidgets.QStyledItemDelegate): def set_statuses_filter(self, status_names): self._statuses_filter = set(status_names) - for info in self._editor_by_id.values(): - info.widget.set_statuses_filter(status_names) + for widget in self._editor_by_id.values(): + widget.set_statuses_filter(status_names) def paint(self, painter, option, index): fg_color = index.data(QtCore.Qt.ForegroundRole) @@ -229,11 +223,11 @@ class VersionDelegate(QtWidgets.QStyledItemDelegate): editor = VersionComboBox(product_id, parent) editor.setProperty("itemId", item_id) - self._editor_by_id[item_id] = EditorInfo(editor) - editor.value_changed.connect(self._on_editor_change) editor.destroyed.connect(self._on_destroy) + self._editor_by_id[item_id] = editor + return editor def setEditorData(self, editor, index): @@ -242,12 +236,10 @@ class VersionDelegate(QtWidgets.QStyledItemDelegate): # Current value of the index versions = index.data(VERSION_NAME_EDIT_ROLE) or [] version_id = index.data(VERSION_ID_ROLE) + editor.update_versions(versions, version_id) editor.set_statuses_filter(self._statuses_filter) - item_id = editor.property("itemId") - self._editor_by_id[item_id].added = True - def setModelData(self, editor, model, index): """Apply the integer version back in the model""" diff --git a/client/ayon_core/tools/loader/ui/products_model.py b/client/ayon_core/tools/loader/ui/products_model.py index 734be5dd90..bc24d4d7f7 100644 --- a/client/ayon_core/tools/loader/ui/products_model.py +++ b/client/ayon_core/tools/loader/ui/products_model.py @@ -132,7 +132,7 @@ class ProductsModel(QtGui.QStandardItemModel): def get_product_item_indexes(self): return [ - item.index() + self.indexFromItem(item) for item in self._items_by_id.values() ] @@ -156,16 +156,18 @@ class ProductsModel(QtGui.QStandardItemModel): if product_item is None: return - self.setData( - product_item.index(), version_id, VERSION_NAME_EDIT_ROLE - ) + index = self.indexFromItem(product_item) + self.setData(index, version_id, VERSION_NAME_EDIT_ROLE) def set_enable_grouping(self, enable_grouping): if enable_grouping is self._grouping_enabled: return self._grouping_enabled = enable_grouping # Ignore change if groups are not available - self.refresh(self._last_project_name, self._last_folder_ids) + self.refresh( + self._last_project_name, + self._last_folder_ids + ) def flags(self, index): # Make the version column editable @@ -454,7 +456,7 @@ class ProductsModel(QtGui.QStandardItemModel): def get_last_project_name(self): return self._last_project_name - def refresh(self, project_name, folder_ids, status_names): + def refresh(self, project_name, folder_ids): self._clear() self._last_project_name = project_name @@ -486,17 +488,9 @@ class ProductsModel(QtGui.QStandardItemModel): } last_version_by_product_id = {} for product_item in product_items: - all_versions = list(product_item.version_items.values()) - all_versions.sort() - versions = [ - version_item - for version_item in all_versions - if status_names is None or version_item.status in status_names - ] - if versions: - last_version = versions[-1] - else: - last_version = all_versions[-1] + versions = list(product_item.version_items.values()) + versions.sort() + last_version = versions[-1] last_version_by_product_id[product_item.product_id] = ( last_version ) @@ -543,10 +537,11 @@ class ProductsModel(QtGui.QStandardItemModel): for product_name, product_items in groups.items(): group_product_types |= {p.product_type for p in product_items} for product_item in product_items: - group_product_types |= { + group_status_names |= { version_item.status for version_item in product_item.version_items.values() } + group_product_types.add(product_item.product_type) if len(product_items) == 1: top_items.append(product_items[0]) @@ -589,13 +584,15 @@ class ProductsModel(QtGui.QStandardItemModel): product_name, product_items = path_info (merged_color_hex, merged_color_qt) = self._get_next_color() merged_color = qtawesome.icon( - "fa.circle", color=merged_color_qt) + "fa.circle", color=merged_color_qt + ) merged_item = self._get_merged_model_item( product_name, len(product_items), merged_color_hex) merged_item.setData(merged_color, QtCore.Qt.DecorationRole) new_items.append(merged_item) merged_product_types = set() + merged_status_names = set() new_merged_items = [] for product_item in product_items: item = self._get_product_model_item( @@ -608,9 +605,21 @@ class ProductsModel(QtGui.QStandardItemModel): ) new_merged_items.append(item) merged_product_types.add(product_item.product_type) + merged_status_names |= { + version_item.status + for version_item in ( + product_item.version_items.values() + ) + } merged_item.setData( - "|".join(merged_product_types), PRODUCT_TYPE_ROLE) + "|".join(merged_product_types), + PRODUCT_TYPE_ROLE + ) + merged_item.setData( + "|".join(merged_status_names), + STATUS_NAME_FILTER_ROLE + ) if new_merged_items: merged_item.appendRows(new_merged_items) diff --git a/client/ayon_core/tools/loader/ui/products_widget.py b/client/ayon_core/tools/loader/ui/products_widget.py index e37c327a17..748a1b5fb8 100644 --- a/client/ayon_core/tools/loader/ui/products_widget.py +++ b/client/ayon_core/tools/loader/ui/products_widget.py @@ -186,11 +186,12 @@ class ProductsWidget(QtWidgets.QWidget): products_proxy_model.rowsInserted.connect(self._on_rows_inserted) products_proxy_model.rowsMoved.connect(self._on_rows_moved) products_model.refreshed.connect(self._on_refresh) + products_model.version_changed.connect(self._on_version_change) products_view.customContextMenuRequested.connect( self._on_context_menu) - products_view.selectionModel().selectionChanged.connect( + products_view_sel_model = products_view.selectionModel() + products_view_sel_model.selectionChanged.connect( self._on_selection_change) - products_model.version_changed.connect(self._on_version_change) version_delegate.version_changed.connect( self._on_version_delegate_change ) @@ -321,8 +322,7 @@ class ProductsWidget(QtWidgets.QWidget): def _refresh_model(self): self._products_model.refresh( self._selected_project_name, - self._selected_folder_ids, - self._products_proxy_model.get_statuses_filter() + self._selected_folder_ids ) def _on_context_menu(self, point):