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
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

View file

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