From c461592ff757201ad3192f156a95f24ef1ceadc3 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 17 Nov 2021 22:55:34 +0100 Subject: [PATCH] use asset widget in loader and library loader --- openpype/tools/libraryloader/app.py | 79 +++++++++-------------------- openpype/tools/loader/app.py | 78 ++++++++-------------------- openpype/tools/loader/widgets.py | 18 ++++--- 3 files changed, 56 insertions(+), 119 deletions(-) diff --git a/openpype/tools/libraryloader/app.py b/openpype/tools/libraryloader/app.py index 710e25bd76..d0d07a316c 100644 --- a/openpype/tools/libraryloader/app.py +++ b/openpype/tools/libraryloader/app.py @@ -11,7 +11,7 @@ from openpype.tools.loader.widgets import ( FamilyListView, RepresentationWidget ) -from openpype.tools.utils.widgets import AssetWidget +from openpype.tools.utils.assets_widget import MultiSelectAssetsWidget from openpype.modules import ModulesManager @@ -76,8 +76,8 @@ class LibraryLoaderWindow(QtWidgets.QDialog): projects_combobox.setItemDelegate(combobox_delegate) # Assets widget - assets_widget = AssetWidget( - dbcon, multiselection=True, parent=left_side_splitter + assets_widget = MultiSelectAssetsWidget( + dbcon, parent=left_side_splitter ) # Families widget @@ -165,7 +165,6 @@ class LibraryLoaderWindow(QtWidgets.QDialog): ) assets_widget.selection_changed.connect(self.on_assetschanged) assets_widget.refresh_triggered.connect(self.on_assetschanged) - assets_widget.view.clicked.connect(self.on_assetview_click) subsets_widget.active_changed.connect(self.on_subsetschanged) subsets_widget.version_changed.connect(self.on_versionschanged) subsets_widget.refreshed.connect(self._on_subset_refresh) @@ -204,11 +203,6 @@ class LibraryLoaderWindow(QtWidgets.QDialog): self._initial_refresh = True self.refresh() - def on_assetview_click(self, *args): - selection_model = self._subsets_widget.view.selectionModel() - if selection_model.selectedIndexes(): - selection_model.clearSelection() - def _set_projects(self): # Store current project old_project_name = self.current_project @@ -348,25 +342,14 @@ class LibraryLoaderWindow(QtWidgets.QDialog): self._families_filter_view.set_enabled_families(set()) self._families_filter_view.refresh() - self._assets_widget.model.stop_fetch_thread() + self._assets_widget.stop_refresh() self._assets_widget.refresh() self._assets_widget.setFocus() def clear_assets_underlines(self): last_asset_ids = self.data["state"]["assetIds"] - if not last_asset_ids: - return - - assets_model = self._assets_widget.model - id_role = assets_model.ObjectIdRole - - for index in tools_lib.iter_model_rows(assets_model, 0): - if index.data(id_role) not in last_asset_ids: - continue - - assets_model.setData( - index, [], assets_model.subsetColorsRole - ) + if last_asset_ids: + self._assets_widget.clear_underlines() def _assetschanged(self): """Selected assets have changed""" @@ -382,12 +365,8 @@ class LibraryLoaderWindow(QtWidgets.QDialog): ) return - # filter None docs they are silo - asset_docs = self._assets_widget.get_selected_assets() - if len(asset_docs) == 0: - return + asset_ids = self._assets_widget.get_selected_asset_ids() - asset_ids = [asset_doc["_id"] for asset_doc in asset_docs] # Start loading self._subsets_widget.set_loading_state( loading=bool(asset_ids), @@ -402,7 +381,7 @@ class LibraryLoaderWindow(QtWidgets.QDialog): # Clear the version information on asset change self._version_info_widget.set_version(None) - self._thumbnail_widget.set_thumbnail(asset_docs) + self._thumbnail_widget.set_thumbnail(asset_ids) self.data["state"]["assetIds"] = asset_ids @@ -421,7 +400,7 @@ class LibraryLoaderWindow(QtWidgets.QDialog): _merged=True, _other=False ) - asset_models = {} + asset_colors = {} asset_ids = [] for subset_node in selected_subsets: asset_ids.extend(subset_node.get("assetIds", [])) @@ -429,30 +408,17 @@ class LibraryLoaderWindow(QtWidgets.QDialog): for subset_node in selected_subsets: for asset_id in asset_ids: - if asset_id not in asset_models: - asset_models[asset_id] = [] + if asset_id not in asset_colors: + asset_colors[asset_id] = [] color = None if asset_id in subset_node.get("assetIds", []): color = subset_node["subsetColor"] - asset_models[asset_id].append(color) + asset_colors[asset_id].append(color) - self.clear_assets_underlines() + self._assets_widget.set_underline_colors(asset_colors) - indexes = self._assets_widget.view.selectionModel().selectedRows() - - assets_model = self._assets_widget.model - for index in indexes: - id = index.data(assets_model.ObjectIdRole) - if id not in asset_models: - continue - - assets_model.setData( - index, asset_models[id], assets_model.subsetColorsRole - ) - # Trigger repaint - self._assets_widget.view.updateGeometries() # Set version in Version Widget self._versionschanged() @@ -489,13 +455,14 @@ class LibraryLoaderWindow(QtWidgets.QDialog): self._version_info_widget.set_version(version_doc) - thumbnail_docs = version_docs - if not thumbnail_docs: - asset_docs = self._assets_widget.get_selected_assets() - if len(asset_docs) > 0: - thumbnail_docs = asset_docs + thumbnail_src_ids = [ + version_doc["_id"] + for version_doc in version_docs + ] + if not thumbnail_src_ids: + thumbnail_src_ids = self._assets_widget.get_selected_asset_ids() - self._thumbnail_widget.set_thumbnail(thumbnail_docs) + self._thumbnail_widget.set_thumbnail(thumbnail_src_ids) version_ids = [doc["_id"] for doc in version_docs or []] if self._repres_widget: @@ -514,8 +481,8 @@ class LibraryLoaderWindow(QtWidgets.QDialog): None """ - asset = context.get("asset", None) - if asset is None: + asset_name = context.get("asset", None) + if asset_name is None: return if refresh: @@ -527,7 +494,7 @@ class LibraryLoaderWindow(QtWidgets.QDialog): # scheduled refresh and the silo tabs are not shown. self._refresh_assets() - self._assets_widget.select_assets(asset) + self._assets_widget.select_asset_by_name(asset_name) def _on_message_timeout(self): self._message_label.setText("") diff --git a/openpype/tools/loader/app.py b/openpype/tools/loader/app.py index 9a4f2f1984..0c7844c4fb 100644 --- a/openpype/tools/loader/app.py +++ b/openpype/tools/loader/app.py @@ -4,8 +4,8 @@ from Qt import QtWidgets, QtCore from avalon import api, io, pipeline from openpype import style -from openpype.tools.utils.widgets import AssetWidget from openpype.tools.utils import lib +from openpype.tools.utils.assets_widget import MultiSelectAssetsWidget from .widgets import ( SubsetWidget, @@ -65,8 +65,8 @@ class LoaderWindow(QtWidgets.QDialog): left_side_splitter.setOrientation(QtCore.Qt.Vertical) # Assets widget - assets_widget = AssetWidget( - io, multiselection=True, parent=left_side_splitter + assets_widget = MultiSelectAssetsWidget( + io, parent=left_side_splitter ) assets_widget.set_current_asset_btn_visibility(True) @@ -156,8 +156,6 @@ class LoaderWindow(QtWidgets.QDialog): ) assets_widget.selection_changed.connect(self.on_assetschanged) assets_widget.refresh_triggered.connect(self.on_assetschanged) - # TODO do not touch view in asset widget - assets_widget.view.clicked.connect(self.on_assetview_click) subsets_widget.active_changed.connect(self.on_subsetschanged) subsets_widget.version_changed.connect(self.on_versionschanged) subsets_widget.refreshed.connect(self._on_subset_refresh) @@ -216,12 +214,6 @@ class LoaderWindow(QtWidgets.QDialog): # Delay calling blocking methods # ------------------------------- - def on_assetview_click(self, *args): - # TODO do not touch inner attributes of subset widget - selection_model = self._subsets_widget.view.selectionModel() - if selection_model.selectedIndexes(): - selection_model.clearSelection() - def refresh(self): self.echo("Fetching results..") lib.schedule(self._refresh, 50, channel="mongo") @@ -271,7 +263,7 @@ class LoaderWindow(QtWidgets.QDialog): # Refresh families config self._families_filter_view.refresh() # Change to context asset on context change - self._assets_widget.select_assets(io.Session["AVALON_ASSET"]) + self._assets_widget.select_asset_by_name(io.Session["AVALON_ASSET"]) def _refresh(self): """Load assets from database""" @@ -292,20 +284,9 @@ class LoaderWindow(QtWidgets.QDialog): on selection change so they match current selection. """ # TODO do not touch inner attributes of asset widget - last_asset_ids = self.data["state"]["assetIds"] or [] - if not last_asset_ids: - return - - assets_widget = self._assets_widget - id_role = assets_widget.model.ObjectIdRole - - for index in lib.iter_model_rows(assets_widget.model, 0): - if index.data(id_role) not in last_asset_ids: - continue - - assets_widget.model.setData( - index, [], assets_widget.model.subsetColorsRole - ) + last_asset_ids = self.data["state"]["assetIds"] + if last_asset_ids: + self._assets_widget.clear_underlines() def _assetschanged(self): """Selected assets have changed""" @@ -317,9 +298,7 @@ class LoaderWindow(QtWidgets.QDialog): self.clear_assets_underlines() # filter None docs they are silo - asset_docs = self._assets_widget.get_selected_assets() - - asset_ids = [asset_doc["_id"] for asset_doc in asset_docs] + asset_ids = self._assets_widget.get_selected_asset_ids() # Start loading subsets_widget.set_loading_state( loading=bool(asset_ids), @@ -333,7 +312,7 @@ class LoaderWindow(QtWidgets.QDialog): ) # Clear the version information on asset change - self._thumbnail_widget.set_thumbnail(asset_docs) + self._thumbnail_widget.set_thumbnail(asset_ids) self._version_info_widget.set_version(None) self.data["state"]["assetIds"] = asset_ids @@ -353,7 +332,7 @@ class LoaderWindow(QtWidgets.QDialog): _merged=True, _other=False ) - asset_models = {} + asset_colors = {} asset_ids = [] for subset_node in selected_subsets: asset_ids.extend(subset_node.get("assetIds", [])) @@ -361,31 +340,17 @@ class LoaderWindow(QtWidgets.QDialog): for subset_node in selected_subsets: for asset_id in asset_ids: - if asset_id not in asset_models: - asset_models[asset_id] = [] + if asset_id not in asset_colors: + asset_colors[asset_id] = [] color = None if asset_id in subset_node.get("assetIds", []): color = subset_node["subsetColor"] - asset_models[asset_id].append(color) + asset_colors[asset_id].append(color) - self.clear_assets_underlines() + self._assets_widget.set_underline_colors(asset_colors) - # TODO do not use inner attributes of asset widget - assets_widget = self._assets_widget - indexes = assets_widget.view.selectionModel().selectedRows() - - for index in indexes: - id = index.data(assets_widget.model.ObjectIdRole) - if id not in asset_models: - continue - - assets_widget.model.setData( - index, asset_models[id], assets_widget.model.subsetColorsRole - ) - # Trigger repaint - assets_widget.view.updateGeometries() # Set version in Version Widget self._versionschanged() @@ -424,13 +389,14 @@ class LoaderWindow(QtWidgets.QDialog): self._version_info_widget.set_version(version_doc) - thumbnail_docs = version_docs - asset_docs = self._assets_widget.get_selected_assets() - if not thumbnail_docs: - if len(asset_docs) > 0: - thumbnail_docs = asset_docs + thumbnail_src_ids = [ + version_doc["_id"] + for version_doc in version_docs + ] + if not thumbnail_src_ids: + thumbnail_src_ids = self._assets_widget.get_selected_asset_ids() - self._thumbnail_widget.set_thumbnail(thumbnail_docs) + self._thumbnail_widget.set_thumbnail(thumbnail_src_ids) if self._repres_widget is not None: version_ids = [doc["_id"] for doc in version_docs or []] @@ -472,7 +438,7 @@ class LoaderWindow(QtWidgets.QDialog): # scheduled refresh and the silo tabs are not shown. self._refresh() - self._assets_widget.select_assets(asset) + self._assets_widget.select_asset_by_name(asset) def _on_message_timeout(self): self._message_label.setText("") diff --git a/openpype/tools/loader/widgets.py b/openpype/tools/loader/widgets.py index 08b58eebbe..f14f58dfb4 100644 --- a/openpype/tools/loader/widgets.py +++ b/openpype/tools/loader/widgets.py @@ -794,19 +794,23 @@ class ThumbnailWidget(QtWidgets.QLabel): QtCore.Qt.SmoothTransformation ) - def set_thumbnail(self, entity=None): - if not entity: + def set_thumbnail(self, doc_id=None): + if not doc_id: self.set_pixmap() return - if isinstance(entity, (list, tuple)): - if len(entity) == 1: - entity = entity[0] - else: + if isinstance(doc_id, (list, tuple)): + if len(doc_id) < 1: self.set_pixmap() return + doc_id = doc_id[0] - thumbnail_id = entity.get("data", {}).get("thumbnail_id") + doc = self.dbcon.find_one( + {"_id": doc_id}, + {"data.thumbnail_id"} + ) + + thumbnail_id = doc.get("data", {}).get("thumbnail_id") if thumbnail_id == self.current_thumb_id: if self.current_thumbnail is None: self.set_pixmap()