mirror of
https://github.com/ynput/ayon-core.git
synced 2026-01-01 16:34:53 +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
|
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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue