diff --git a/client/ayon_core/tools/publisher/abstract.py b/client/ayon_core/tools/publisher/abstract.py index 14da15793d..8f42c82797 100644 --- a/client/ayon_core/tools/publisher/abstract.py +++ b/client/ayon_core/tools/publisher/abstract.py @@ -23,6 +23,7 @@ from ayon_core.tools.common_models import ( TaskItem, FolderTypeItem, TaskTypeItem, + UserItem, ) if TYPE_CHECKING: @@ -295,6 +296,11 @@ class AbstractPublisherFrontend(AbstractPublisherCommon): """Get folder id from folder path.""" pass + @abstractmethod + def get_user_items(self) -> list[UserItem]: + """"Get user items for current project.""" + pass + # --- Create --- @abstractmethod def get_creator_items(self) -> Dict[str, "CreatorItem"]: diff --git a/client/ayon_core/tools/publisher/control.py b/client/ayon_core/tools/publisher/control.py index 038816c6fc..0b5b69907b 100644 --- a/client/ayon_core/tools/publisher/control.py +++ b/client/ayon_core/tools/publisher/control.py @@ -11,7 +11,12 @@ from ayon_core.pipeline import ( registered_host, get_process_id, ) -from ayon_core.tools.common_models import ProjectsModel, HierarchyModel +from ayon_core.tools.common_models import ( + ProjectsModel, + HierarchyModel, + UsersModel, + UserItem, +) from .models import ( PublishModel, @@ -98,7 +103,7 @@ class PublisherController( self._create_model = CreateModel(self) self._publish_model = PublishModel(self) - # Cacher of avalon documents + self._users_model = UsersModel(self) self._projects_model = ProjectsModel(self) self._hierarchy_model = HierarchyModel(self) @@ -562,6 +567,11 @@ class PublisherController( def get_publish_errors_report(self): return self._publish_model.get_publish_errors_report() + def get_user_items(self) -> list[UserItem]: + return self._users_model.get_user_items( + self.get_current_project_name() + ) + def set_comment(self, comment): """Set comment from ui to pyblish context. diff --git a/client/ayon_core/tools/publisher/widgets/comment_input.py b/client/ayon_core/tools/publisher/widgets/comment_input.py index f8fb4f68a3..9efc8db108 100644 --- a/client/ayon_core/tools/publisher/widgets/comment_input.py +++ b/client/ayon_core/tools/publisher/widgets/comment_input.py @@ -4,6 +4,8 @@ from typing import Any, Optional from qtpy import QtCore, QtWidgets from ayon_core.style import load_stylesheet +from ayon_core.tools.common_models import UserItem +from ayon_core.tools.utils.lib import generate_user_avatar from ayon_core.tools.utils import ( BaseClickableFrame, PlaceholderLineEdit, @@ -19,39 +21,29 @@ class ValueItemButton(BaseClickableFrame): def __init__( self, widget_id: str, - value: str, - icon: Optional[dict[str, Any]], + item: UserItem, parent: QtWidgets.QWidget, ): super().__init__(parent) - title_widget = QtWidgets.QLabel(str(value), self) + icon = generate_user_avatar(item) + icon_widget = PixmapLabel(icon, self) + + title_widget = QtWidgets.QLabel(item.full_name, self) main_layout = QtWidgets.QHBoxLayout(self) main_layout.setContentsMargins(5, 5, 5, 5) + main_layout.addWidget(icon_widget, 0) main_layout.addWidget(title_widget, 1) - self._icon_widget = None + self._icon_widget = icon_widget self._title_widget = title_widget self._main_layout = main_layout self._selected = False self._filtered = False - self._value = value + self._item = item self._widget_id = widget_id - if icon: - self.set_icon(icon) - - def set_icon(self, icon: dict[str, Any]) -> None: - """Set the icon for the widget.""" - icon = get_qt_icon(icon) - pixmap = icon.pixmap(64, 64) - if self._icon_widget is None: - self._icon_widget = PixmapLabel(pixmap, self) - self._main_layout.insertWidget(0, self._icon_widget, 0) - else: - self._icon_widget.setPixmap(pixmap) - def is_filtered(self) -> bool: return self._filtered @@ -62,7 +54,7 @@ class ValueItemButton(BaseClickableFrame): self.setVisible(not filtered) def get_value(self) -> str: - return self._value + return self._item.username def set_selected(self, selected: bool) -> None: """Set the selection state of the widget.""" @@ -180,7 +172,7 @@ class ValueItemsView(QtWidgets.QWidget): pos = next_widget.pos() self._scroll_area.ensureVisible(pos.x(), pos.y()) - def set_items(self, items: list[dict[str, Any]]): + def set_items(self, items: list[UserItem]) -> None: while self._content_layout.count() > 0: item = self._content_layout.takeAt(0) widget = item.widget() @@ -191,11 +183,11 @@ class ValueItemsView(QtWidgets.QWidget): self._widgets_by_id = {} self._last_selected_widget = None for item in items: - widget_id = uuid.uuid4().hex - widget = ValueItemButton( + widget_id = item.username + + widget = UserValueItemButton( widget_id, - item["value"], - item.get("icon"), + item, self, ) widget.confirmed.connect(self._on_item_clicked) @@ -414,7 +406,7 @@ class CommentInput(QtWidgets.QWidget): len(self.get_comment()) ) - def set_user_items(self, items): + def set_user_items(self, items: list[UserItem]): self._floating_hints_widget.set_items(items) def eventFilter(self, obj, event): diff --git a/client/ayon_core/tools/publisher/window.py b/client/ayon_core/tools/publisher/window.py index de30cc477b..1318619c35 100644 --- a/client/ayon_core/tools/publisher/window.py +++ b/client/ayon_core/tools/publisher/window.py @@ -881,6 +881,8 @@ class PublisherWindow(QtWidgets.QDialog): self._update_publish_details_widget() def _on_controller_reset(self): + user_items = self._controller.get_user_items() + self._comment_input.set_user_items(user_items) self._first_reset, first_reset = False, self._first_reset if self._tab_on_reset is not None: self._tab_on_reset, new_tab = None, self._tab_on_reset