From 12494d3982a7f733fe7799bed61d986a78ce99f9 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Sun, 2 Jun 2024 16:00:31 +0200 Subject: [PATCH] initial logic for status icons --- .../tools/loader/ui/products_model.py | 28 +++++++++++++++++++ client/ayon_core/tools/utils/delegates.py | 12 ++++---- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/client/ayon_core/tools/loader/ui/products_model.py b/client/ayon_core/tools/loader/ui/products_model.py index 8035b1f0fe..5c297e3ba8 100644 --- a/client/ayon_core/tools/loader/ui/products_model.py +++ b/client/ayon_core/tools/loader/ui/products_model.py @@ -126,6 +126,7 @@ class ProductsModel(QtGui.QStandardItemModel): self._last_project_name = None self._last_folder_ids = [] self._last_project_statuses = {} + self._last_status_icons_by_name = {} def get_product_item_indexes(self): return [ @@ -181,6 +182,13 @@ class ProductsModel(QtGui.QStandardItemModel): return status_item.color col = index.column() + if col == self.status_col and role == QtCore.Qt.DecorationRole: + role = VERSION_STATUS_ICON_ROLE + + if role == VERSION_STATUS_ICON_ROLE: + status_name = self.data(index, VERSION_STATUS_NAME_ROLE) + return self._get_status_icon(status_name) + if col == 0: return super(ProductsModel, self).data(index, role) @@ -258,6 +266,24 @@ class ProductsModel(QtGui.QStandardItemModel): break yield color + def _get_status_icon(self, status_name): + icon = self._last_status_icons_by_name.get(status_name) + if icon is not None: + return icon + + status_item = self._last_project_statuses.get(status_name) + if status_item is not None: + icon = get_qt_icon({ + "type": "material-symbols", + "name": status_item.icon, + "color": status_item.color, + }) + if icon is None: + icon = QtGui.QIcon() + + self._last_status_icons_by_name[status_name] = icon + return icon + def _clear(self): root_item = self.invisibleRootItem() root_item.removeRows(0, root_item.rowCount()) @@ -331,6 +357,7 @@ class ProductsModel(QtGui.QStandardItemModel): ) model_item.setData(version_item.author, VERSION_AUTHOR_ROLE) model_item.setData(version_item.status, VERSION_STATUS_NAME_ROLE) + model_item.setData(version_item.status_short, VERSION_STATUS_ICON_ROLE) model_item.setData(version_item.frame_range, VERSION_FRAME_RANGE_ROLE) model_item.setData(version_item.duration, VERSION_DURATION_ROLE) model_item.setData(version_item.handles, VERSION_HANDLES_ROLE) @@ -417,6 +444,7 @@ class ProductsModel(QtGui.QStandardItemModel): status_item.name: status_item for status_item in status_items } + self._last_status_icons_by_name = {} active_site_icon_def = self._controller.get_active_site_icon_def( project_name diff --git a/client/ayon_core/tools/utils/delegates.py b/client/ayon_core/tools/utils/delegates.py index b296f952e0..97fcf01b9e 100644 --- a/client/ayon_core/tools/utils/delegates.py +++ b/client/ayon_core/tools/utils/delegates.py @@ -139,22 +139,22 @@ class StatusDelegate(QtWidgets.QStyledItemDelegate): painter.save() - text_rect = style.subElementRect( + content_rect = style.subElementRect( QtWidgets.QCommonStyle.SE_ItemViewItemText, option ) - text_margin = style.proxy().pixelMetric( + content_margin = style.proxy().pixelMetric( QtWidgets.QCommonStyle.PM_FocusFrameHMargin, option, option.widget ) + 1 - padded_text_rect = text_rect.adjusted( - text_margin, 0, - text_margin, 0 + padded_content_rect = content_rect.adjusted( + content_margin, 0, - content_margin, 0 ) fm = QtGui.QFontMetrics(option.font) text = self._get_status_name(index) - if padded_text_rect.width() < fm.width(text): + if padded_content_rect.width() < fm.width(text): text = self._get_status_short_name(index) fg_color = self._get_status_color(index) @@ -163,7 +163,7 @@ class StatusDelegate(QtWidgets.QStyledItemDelegate): painter.setPen(pen) painter.drawText( - padded_text_rect, + padded_content_rect, option.displayAlignment, text )