redone model and window of subset manager

This commit is contained in:
iLLiCiTiT 2021-11-12 19:37:02 +01:00
parent 5d527e1d27
commit aa91345eff
2 changed files with 60 additions and 74 deletions

View file

@ -1,26 +1,24 @@
import uuid import uuid
from ... import api
from ...vendor.Qt import QtCore
from ..models import TreeModel, Item
InstanceRole = QtCore.Qt.UserRole + 1 from Qt import QtCore, QtGui
InstanceItemId = QtCore.Qt.UserRole + 2
from avalon import api
ITEM_ID_ROLE = QtCore.Qt.UserRole + 1
class InstanceModel(TreeModel): class InstanceModel(QtGui.QStandardItemModel):
column_label_mapping = {
"label": "Instance"
}
Columns = list(column_label_mapping.keys())
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(InstanceModel, self).__init__(*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): def refresh(self):
self.clear() self.clear()
self.items_by_id.clear() self._instances_by_item_id = {}
instances = None instances = None
host = api.registered_host() host = api.registered_host()
@ -31,38 +29,21 @@ class InstanceModel(TreeModel):
if not instances: if not instances:
return return
self.beginResetModel() items = []
for instance_data in instances: for instance_data in instances:
item_id = str(uuid.uuid4()) item_id = str(uuid.uuid4())
item = Item({ label = instance_data.get("label") or instance_data["subset"]
"item_id": item_id, item = QtGui.QStandardItem(label)
"label": instance_data.get("label") or instance_data["subset"], item.setData(item_id, ITEM_ID_ROLE)
"instance": instance_data items.append(item)
}) self._instances_by_item_id[item_id] = instance_data
self.items_by_id[item_id] = item
self.add_child(item)
self.endResetModel() if items:
self.invisibleRootItem().appendRows(items)
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)
def headerData(self, section, orientation, role): def headerData(self, section, orientation, role):
if role == QtCore.Qt.DisplayRole: if role == QtCore.Qt.DisplayRole and section == 0:
if section < len(self.Columns): return "Instance"
return self.column_label_mapping[self.Columns[section]]
return super(InstanceModel, self).headerData( return super(InstanceModel, self).headerData(
section, orientation, role section, orientation, role

View file

@ -1,17 +1,20 @@
import os import os
import sys import sys
from ... import api, style from Qt import QtWidgets, QtCore
from ...vendor import qtawesome from avalon import api
from ...vendor.Qt import QtWidgets, QtCore from avalon.vendor import qtawesome
from .. import lib as tools_lib from openpype import style
from ..models import RecursiveSortFilterProxyModel from openpype.tools.utils.lib import (
iter_model_rows,
qt_app_context
)
from openpype.tools.utils.models import RecursiveSortFilterProxyModel
from .model import ( from .model import (
InstanceModel, InstanceModel,
InstanceRole, ITEM_ID_ROLE
InstanceItemId
) )
from .widgets import InstanceDetail from .widgets import InstanceDetail
@ -41,12 +44,12 @@ class SubsetManagerWindow(QtWidgets.QDialog):
header_widget = QtWidgets.QWidget(left_side_widget) header_widget = QtWidgets.QWidget(left_side_widget)
# Filter input # Filter input
filter_input = QtWidgets.QLineEdit() filter_input = QtWidgets.QLineEdit(header_widget)
filter_input.setPlaceholderText("Filter subsets..") filter_input.setPlaceholderText("Filter subsets..")
# Refresh button # Refresh button
icon = qtawesome.icon("fa.refresh", color="white") icon = qtawesome.icon("fa.refresh", color="white")
refresh_btn = QtWidgets.QPushButton() refresh_btn = QtWidgets.QPushButton(header_widget)
refresh_btn.setIcon(icon) refresh_btn.setIcon(icon)
header_layout = QtWidgets.QHBoxLayout(header_widget) header_layout = QtWidgets.QHBoxLayout(header_widget)
@ -83,11 +86,11 @@ class SubsetManagerWindow(QtWidgets.QDialog):
view.customContextMenuRequested.connect(self.on_context_menu) view.customContextMenuRequested.connect(self.on_context_menu)
details_widget.save_triggered.connect(self._on_save) details_widget.save_triggered.connect(self._on_save)
self.model = model self._model = model
self.proxy = proxy self._proxy = proxy
self.view = view self._view = view
self.details_widget = details_widget self._details_widget = details_widget
self.refresh_btn = refresh_btn self._refresh_btn = refresh_btn
def _on_refresh_clicked(self): def _on_refresh_clicked(self):
self.refresh() self.refresh()
@ -96,10 +99,10 @@ class SubsetManagerWindow(QtWidgets.QDialog):
container = None container = None
item_id = None item_id = None
if index.isValid(): if index.isValid():
container = index.data(InstanceRole) item_id = index.data(ITEM_ID_ROLE)
item_id = index.data(InstanceItemId) 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): def _on_save(self):
host = api.registered_host() host = api.registered_host()
@ -107,29 +110,31 @@ class SubsetManagerWindow(QtWidgets.QDialog):
print("BUG: Host does not have \"save_instances\" method") print("BUG: Host does not have \"save_instances\" method")
return return
current_index = self.view.selectionModel().currentIndex() current_index = self._view.selectionModel().currentIndex()
if not current_index.isValid(): if not current_index.isValid():
return return
item_id = current_index.data(InstanceItemId) item_id = current_index.data(ITEM_ID_ROLE)
if item_id != self.details_widget.item_id(): if item_id != self._details_widget.item_id():
return return
item_data = self.details_widget.instance_data_from_text() item_data = self._details_widget.instance_data_from_text()
new_instances = [] new_instances = []
for index in tools_lib.iter_model_rows(self.model, 0): for index in iter_model_rows(self._model, 0):
_item_id = index.data(InstanceItemId) _item_id = index.data(ITEM_ID_ROLE)
if _item_id == item_id: if _item_id == item_id:
instance_data = item_data instance_data = item_data
else: else:
instance_data = index.data(InstanceRole) instance_data = self._model.get_instance_by_id(item_id)
new_instances.append(instance_data) new_instances.append(instance_data)
host.save_instances(new_instances) host.save_instances(new_instances)
def on_context_menu(self, point): def on_context_menu(self, point):
point_index = self.view.indexAt(point) point_index = self._view.indexAt(point)
if not point_index.isValid(): item_id = point_index.data(ITEM_ID_ROLE)
instance_data = self._model.get_instance_by_id(item_id)
if instance_data is None:
return return
# Prepare menu # Prepare menu
@ -153,7 +158,7 @@ class SubsetManagerWindow(QtWidgets.QDialog):
menu.addAction(action) menu.addAction(action)
# Show menu under mouse # Show menu under mouse
global_point = self.view.mapToGlobal(point) global_point = self._view.mapToGlobal(point)
action = menu.exec_(global_point) action = menu.exec_(global_point)
if not action or not action.data(): if not action or not action.data():
return return
@ -161,26 +166,27 @@ class SubsetManagerWindow(QtWidgets.QDialog):
# Process action # Process action
# TODO catch exceptions # TODO catch exceptions
function = action.data() function = action.data()
function(point_index.data(InstanceRole)) function(instance_data)
# Reset modified data # Reset modified data
self.refresh() self.refresh()
def refresh(self): def refresh(self):
self.details_widget.set_details(None, None) self._details_widget.set_details(None, None)
self.model.refresh() self._model.refresh()
host = api.registered_host() host = api.registered_host()
dev_mode = os.environ.get("AVALON_DEVELOP_MODE") or "" dev_mode = os.environ.get("AVALON_DEVELOP_MODE") or ""
editable = False editable = False
if dev_mode.lower() in ("1", "yes", "true", "on"): if dev_mode.lower() in ("1", "yes", "true", "on"):
editable = hasattr(host, "save_instances") editable = hasattr(host, "save_instances")
self.details_widget.set_editable(editable) self._details_widget.set_editable(editable)
def showEvent(self, *args, **kwargs): def showEvent(self, *args, **kwargs):
super(SubsetManagerWindow, self).showEvent(*args, **kwargs) super(SubsetManagerWindow, self).showEvent(*args, **kwargs)
if self._first_show: if self._first_show:
self._first_show = False self._first_show = False
self.setStyleSheet(style.load_stylesheet())
self.refresh() self.refresh()
@ -201,9 +207,8 @@ def show(root=None, debug=False, parent=None):
except (RuntimeError, AttributeError): except (RuntimeError, AttributeError):
pass pass
with tools_lib.application(): with qt_app_context():
window = Window(parent) window = SubsetManagerWindow(parent)
window.setStyleSheet(style.load_stylesheet())
window.show() window.show()
module.window = window module.window = window