mirror of
https://github.com/ynput/ayon-core.git
synced 2026-01-02 00:44:52 +01:00
exception description can be different per instance under title
This commit is contained in:
parent
d6b3865836
commit
28040a2f6a
1 changed files with 64 additions and 19 deletions
|
|
@ -10,6 +10,9 @@ from .widgets import (
|
|||
ClickableFrame,
|
||||
IconValuePixmapLabel
|
||||
)
|
||||
from ..constants import (
|
||||
INSTANCE_ID_ROLE
|
||||
)
|
||||
|
||||
|
||||
class ValidationErrorInstanceList(QtWidgets.QListView):
|
||||
|
|
@ -47,6 +50,7 @@ class ValidationErrorTitleWidget(QtWidgets.QWidget):
|
|||
if there is a list (Valdation error may happen on context).
|
||||
"""
|
||||
selected = QtCore.Signal(int)
|
||||
instance_changed = QtCore.Signal(int)
|
||||
|
||||
def __init__(self, index, error_info, parent):
|
||||
super(ValidationErrorTitleWidget, self).__init__(parent)
|
||||
|
|
@ -72,24 +76,37 @@ class ValidationErrorTitleWidget(QtWidgets.QWidget):
|
|||
title_frame_layout.addWidget(label_widget)
|
||||
|
||||
instances_model = QtGui.QStandardItemModel()
|
||||
instances = error_info["instances"]
|
||||
error_info = error_info["error_info"]
|
||||
|
||||
help_text_by_instance_id = {}
|
||||
context_validation = False
|
||||
if (
|
||||
not instances
|
||||
or (len(instances) == 1 and instances[0] is None)
|
||||
not error_info
|
||||
or (len(error_info) == 1 and error_info[0][0] is None)
|
||||
):
|
||||
context_validation = True
|
||||
toggle_instance_btn.setArrowType(QtCore.Qt.NoArrow)
|
||||
help_text_by_instance_id[None] = error_info[0][1]
|
||||
else:
|
||||
items = []
|
||||
for instance in instances:
|
||||
for instance, exception in error_info:
|
||||
label = instance.data.get("label") or instance.data.get("name")
|
||||
item = QtGui.QStandardItem(label)
|
||||
item.setFlags(
|
||||
QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable
|
||||
)
|
||||
item.setData(instance.id)
|
||||
item.setData(instance.id, INSTANCE_ID_ROLE)
|
||||
items.append(item)
|
||||
dsc = exception.description
|
||||
detail = exception.detail
|
||||
if detail:
|
||||
dsc += "<br/><br/>{}".format(detail)
|
||||
|
||||
help_text = dsc
|
||||
if commonmark:
|
||||
help_text = commonmark.commonmark(dsc)
|
||||
|
||||
help_text_by_instance_id[instance.id] = help_text
|
||||
|
||||
instances_model.invisibleRootItem().appendRows(items)
|
||||
|
||||
|
|
@ -114,6 +131,10 @@ class ValidationErrorTitleWidget(QtWidgets.QWidget):
|
|||
if not context_validation:
|
||||
toggle_instance_btn.clicked.connect(self._on_toggle_btn_click)
|
||||
|
||||
instances_view.selectionModel().selectionChanged.connect(
|
||||
self._on_seleciton_change
|
||||
)
|
||||
|
||||
self._title_frame = title_frame
|
||||
|
||||
self._toggle_instance_btn = toggle_instance_btn
|
||||
|
|
@ -121,6 +142,9 @@ class ValidationErrorTitleWidget(QtWidgets.QWidget):
|
|||
self._instances_model = instances_model
|
||||
self._instances_view = instances_view
|
||||
|
||||
self._context_validation = context_validation
|
||||
self._help_text_by_instance_id = help_text_by_instance_id
|
||||
|
||||
def _mouse_release_callback(self):
|
||||
"""Mark this widget as selected on click."""
|
||||
self.set_selected(True)
|
||||
|
|
@ -145,6 +169,17 @@ class ValidationErrorTitleWidget(QtWidgets.QWidget):
|
|||
self._title_frame.setProperty("selected", value)
|
||||
self._title_frame.style().polish(self._title_frame)
|
||||
|
||||
def current_desctiption_text(self):
|
||||
if self._context_validation:
|
||||
return self._help_text_by_instance_id[None]
|
||||
index = self._instances_view.currentIndex()
|
||||
# TODO make sure instance is selected
|
||||
if not index.isValid():
|
||||
index = self._instances_model.index(0, 0)
|
||||
|
||||
indence_id = index.data(INSTANCE_ID_ROLE)
|
||||
return self._help_text_by_instance_id[indence_id]
|
||||
|
||||
def set_selected(self, selected=None):
|
||||
"""Change selected state of widget."""
|
||||
if selected is None:
|
||||
|
|
@ -167,6 +202,9 @@ class ValidationErrorTitleWidget(QtWidgets.QWidget):
|
|||
else:
|
||||
self._toggle_instance_btn.setArrowType(QtCore.Qt.RightArrow)
|
||||
|
||||
def _on_seleciton_change(self):
|
||||
self.instance_changed.emit(self._index)
|
||||
|
||||
|
||||
class ActionButton(ClickableFrame):
|
||||
"""Plugin's action callback button.
|
||||
|
|
@ -440,28 +478,28 @@ class ValidationsWidget(QtWidgets.QWidget):
|
|||
errors_by_title = []
|
||||
for plugin_info in errors:
|
||||
titles = []
|
||||
exception_by_title = {}
|
||||
instances_by_title = {}
|
||||
error_info_by_title = {}
|
||||
|
||||
for error_info in plugin_info["errors"]:
|
||||
exception = error_info["exception"]
|
||||
title = exception.title
|
||||
if title not in titles:
|
||||
titles.append(title)
|
||||
instances_by_title[title] = []
|
||||
exception_by_title[title] = exception
|
||||
instances_by_title[title].append(error_info["instance"])
|
||||
error_info_by_title[title] = []
|
||||
error_info_by_title[title].append(
|
||||
(error_info["instance"], exception)
|
||||
)
|
||||
|
||||
for title in titles:
|
||||
errors_by_title.append({
|
||||
"plugin": plugin_info["plugin"],
|
||||
"exception": exception_by_title[title],
|
||||
"instances": instances_by_title[title]
|
||||
"error_info": error_info_by_title[title]
|
||||
})
|
||||
|
||||
for idx, item in enumerate(errors_by_title):
|
||||
widget = ValidationErrorTitleWidget(idx, item, self)
|
||||
widget.selected.connect(self._on_select)
|
||||
widget.instance_changed.connect(self._on_instance_change)
|
||||
self._errors_layout.addWidget(widget)
|
||||
self._title_widgets[idx] = widget
|
||||
self._error_info[idx] = item
|
||||
|
|
@ -480,11 +518,18 @@ class ValidationsWidget(QtWidgets.QWidget):
|
|||
self._previous_select = self._title_widgets[index]
|
||||
|
||||
error_item = self._error_info[index]
|
||||
|
||||
dsc = error_item["exception"].description
|
||||
if commonmark:
|
||||
html = commonmark.commonmark(dsc)
|
||||
self._error_details_input.setHtml(html)
|
||||
else:
|
||||
self._error_details_input.setMarkdown(dsc)
|
||||
self._actions_widget.set_plugin(error_item["plugin"])
|
||||
|
||||
self._update_description()
|
||||
|
||||
def _on_instance_change(self, index):
|
||||
if self._previous_select and self._previous_select.index != index:
|
||||
return
|
||||
self._update_description()
|
||||
|
||||
def _update_description(self):
|
||||
description = self._previous_select.current_desctiption_text()
|
||||
if commonmark:
|
||||
self._error_details_input.setHtml(description)
|
||||
else:
|
||||
self._error_details_input.setMarkdown(description)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue