mirror of
https://github.com/ynput/ayon-core.git
synced 2025-12-25 05:14:40 +01:00
redone model and window of subset manager
This commit is contained in:
parent
5d527e1d27
commit
aa91345eff
2 changed files with 60 additions and 74 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue