diff --git a/openpype/tools/subsetmanager/model.py b/openpype/tools/subsetmanager/model.py index 4b9fdb9d91..b80c8a29a6 100644 --- a/openpype/tools/subsetmanager/model.py +++ b/openpype/tools/subsetmanager/model.py @@ -1,26 +1,24 @@ import uuid -from ... import api -from ...vendor.Qt import QtCore -from ..models import TreeModel, Item -InstanceRole = QtCore.Qt.UserRole + 1 -InstanceItemId = QtCore.Qt.UserRole + 2 +from Qt import QtCore, QtGui + +from avalon import api + +ITEM_ID_ROLE = QtCore.Qt.UserRole + 1 -class InstanceModel(TreeModel): - column_label_mapping = { - "label": "Instance" - } - Columns = list(column_label_mapping.keys()) - +class InstanceModel(QtGui.QStandardItemModel): def __init__(self, *args, **kwargs): super(InstanceModel, self).__init__(*args, **kwargs) - self.items_by_id = {} + self._instances_by_item_id = {} + + def get_instance_by_id(self, item_id): + return self._instances_by_item_id.get(item_id) def refresh(self): self.clear() - self.items_by_id.clear() + self._instances_by_item_id = {} instances = None host = api.registered_host() @@ -31,38 +29,21 @@ class InstanceModel(TreeModel): if not instances: return - self.beginResetModel() - + items = [] for instance_data in instances: item_id = str(uuid.uuid4()) - item = Item({ - "item_id": item_id, - "label": instance_data.get("label") or instance_data["subset"], - "instance": instance_data - }) - self.items_by_id[item_id] = item - self.add_child(item) + label = instance_data.get("label") or instance_data["subset"] + item = QtGui.QStandardItem(label) + item.setData(item_id, ITEM_ID_ROLE) + items.append(item) + self._instances_by_item_id[item_id] = instance_data - self.endResetModel() - - def data(self, index, role): - if not index.isValid(): - return - - if role == InstanceItemId: - item = index.internalPointer() - return item["item_id"] - - if role == InstanceRole: - item = index.internalPointer() - return item["instance"] - - return super(InstanceModel, self).data(index, role) + if items: + self.invisibleRootItem().appendRows(items) def headerData(self, section, orientation, role): - if role == QtCore.Qt.DisplayRole: - if section < len(self.Columns): - return self.column_label_mapping[self.Columns[section]] + if role == QtCore.Qt.DisplayRole and section == 0: + return "Instance" return super(InstanceModel, self).headerData( section, orientation, role diff --git a/openpype/tools/subsetmanager/window.py b/openpype/tools/subsetmanager/window.py index 658bfbc31c..cb0e3c1c1e 100644 --- a/openpype/tools/subsetmanager/window.py +++ b/openpype/tools/subsetmanager/window.py @@ -1,17 +1,20 @@ import os import sys -from ... import api, style +from Qt import QtWidgets, QtCore -from ...vendor import qtawesome -from ...vendor.Qt import QtWidgets, QtCore +from avalon import api +from avalon.vendor import qtawesome -from .. import lib as tools_lib -from ..models import RecursiveSortFilterProxyModel +from openpype import style +from openpype.tools.utils.lib import ( + iter_model_rows, + qt_app_context +) +from openpype.tools.utils.models import RecursiveSortFilterProxyModel from .model import ( InstanceModel, - InstanceRole, - InstanceItemId + ITEM_ID_ROLE ) from .widgets import InstanceDetail @@ -41,12 +44,12 @@ class SubsetManagerWindow(QtWidgets.QDialog): header_widget = QtWidgets.QWidget(left_side_widget) # Filter input - filter_input = QtWidgets.QLineEdit() + filter_input = QtWidgets.QLineEdit(header_widget) filter_input.setPlaceholderText("Filter subsets..") # Refresh button icon = qtawesome.icon("fa.refresh", color="white") - refresh_btn = QtWidgets.QPushButton() + refresh_btn = QtWidgets.QPushButton(header_widget) refresh_btn.setIcon(icon) header_layout = QtWidgets.QHBoxLayout(header_widget) @@ -83,11 +86,11 @@ class SubsetManagerWindow(QtWidgets.QDialog): view.customContextMenuRequested.connect(self.on_context_menu) details_widget.save_triggered.connect(self._on_save) - self.model = model - self.proxy = proxy - self.view = view - self.details_widget = details_widget - self.refresh_btn = refresh_btn + self._model = model + self._proxy = proxy + self._view = view + self._details_widget = details_widget + self._refresh_btn = refresh_btn def _on_refresh_clicked(self): self.refresh() @@ -96,10 +99,10 @@ class SubsetManagerWindow(QtWidgets.QDialog): container = None item_id = None if index.isValid(): - container = index.data(InstanceRole) - item_id = index.data(InstanceItemId) + item_id = index.data(ITEM_ID_ROLE) + container = self._model.get_instance_by_id(item_id) - self.details_widget.set_details(container, item_id) + self._details_widget.set_details(container, item_id) def _on_save(self): host = api.registered_host() @@ -107,29 +110,31 @@ class SubsetManagerWindow(QtWidgets.QDialog): print("BUG: Host does not have \"save_instances\" method") return - current_index = self.view.selectionModel().currentIndex() + current_index = self._view.selectionModel().currentIndex() if not current_index.isValid(): return - item_id = current_index.data(InstanceItemId) - if item_id != self.details_widget.item_id(): + item_id = current_index.data(ITEM_ID_ROLE) + if item_id != self._details_widget.item_id(): return - item_data = self.details_widget.instance_data_from_text() + item_data = self._details_widget.instance_data_from_text() new_instances = [] - for index in tools_lib.iter_model_rows(self.model, 0): - _item_id = index.data(InstanceItemId) + for index in iter_model_rows(self._model, 0): + _item_id = index.data(ITEM_ID_ROLE) if _item_id == item_id: instance_data = item_data else: - instance_data = index.data(InstanceRole) + instance_data = self._model.get_instance_by_id(item_id) new_instances.append(instance_data) host.save_instances(new_instances) def on_context_menu(self, point): - point_index = self.view.indexAt(point) - if not point_index.isValid(): + point_index = self._view.indexAt(point) + item_id = point_index.data(ITEM_ID_ROLE) + instance_data = self._model.get_instance_by_id(item_id) + if instance_data is None: return # Prepare menu @@ -153,7 +158,7 @@ class SubsetManagerWindow(QtWidgets.QDialog): menu.addAction(action) # Show menu under mouse - global_point = self.view.mapToGlobal(point) + global_point = self._view.mapToGlobal(point) action = menu.exec_(global_point) if not action or not action.data(): return @@ -161,26 +166,27 @@ class SubsetManagerWindow(QtWidgets.QDialog): # Process action # TODO catch exceptions function = action.data() - function(point_index.data(InstanceRole)) + function(instance_data) # Reset modified data self.refresh() def refresh(self): - self.details_widget.set_details(None, None) - self.model.refresh() + self._details_widget.set_details(None, None) + self._model.refresh() host = api.registered_host() dev_mode = os.environ.get("AVALON_DEVELOP_MODE") or "" editable = False if dev_mode.lower() in ("1", "yes", "true", "on"): editable = hasattr(host, "save_instances") - self.details_widget.set_editable(editable) + self._details_widget.set_editable(editable) def showEvent(self, *args, **kwargs): super(SubsetManagerWindow, self).showEvent(*args, **kwargs) if self._first_show: self._first_show = False + self.setStyleSheet(style.load_stylesheet()) self.refresh() @@ -201,9 +207,8 @@ def show(root=None, debug=False, parent=None): except (RuntimeError, AttributeError): pass - with tools_lib.application(): - window = Window(parent) - window.setStyleSheet(style.load_stylesheet()) + with qt_app_context(): + window = SubsetManagerWindow(parent) window.show() module.window = window