use asset widget in loader and library loader

This commit is contained in:
iLLiCiTiT 2021-11-17 22:55:34 +01:00
parent d010285800
commit c461592ff7
3 changed files with 56 additions and 119 deletions

View file

@ -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("")

View file

@ -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("")

View file

@ -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()