use new version of error dialog and pass parent to a dialog

This commit is contained in:
Jakub Trllo 2022-03-09 11:34:02 +01:00
parent 7ed2e39db0
commit aef78c3c75

View file

@ -14,6 +14,8 @@ from openpype.pipeline.create import (
SUBSET_NAME_ALLOWED_SYMBOLS
)
from openpype.tools.utils import ErrorMessageBox
from .widgets import IconValuePixmapLabel
from .assets_widget import CreateDialogAssetsWidget
from .tasks_widget import CreateDialogTasksWidget
@ -27,7 +29,7 @@ from ..constants import (
SEPARATORS = ("---separator---", "---")
class CreateErrorMessageBox(QtWidgets.QDialog):
class CreateErrorMessageBox(ErrorMessageBox):
def __init__(
self,
creator_label,
@ -35,24 +37,38 @@ class CreateErrorMessageBox(QtWidgets.QDialog):
asset_name,
exc_msg,
formatted_traceback,
parent=None
parent
):
super(CreateErrorMessageBox, self).__init__(parent)
self.setWindowTitle("Creation failed")
self.setFocusPolicy(QtCore.Qt.StrongFocus)
if not parent:
self.setWindowFlags(
self.windowFlags() | QtCore.Qt.WindowStaysOnTopHint
)
self._creator_label = creator_label
self._subset_name = subset_name
self._asset_name = asset_name
self._exc_msg = exc_msg
self._formatted_traceback = formatted_traceback
super(CreateErrorMessageBox, self).__init__("Creation failed", parent)
body_layout = QtWidgets.QVBoxLayout(self)
main_label = (
def _create_top_widget(self, parent_widget):
label_widget = QtWidgets.QLabel(parent_widget)
label_widget.setText(
"<span style='font-size:18pt;'>Failed to create</span>"
)
main_label_widget = QtWidgets.QLabel(main_label, self)
body_layout.addWidget(main_label_widget)
return label_widget
def _get_report_data(self):
report_message = (
"{creator}: Failed to create Subset: \"{subset}\""
" in Asset: \"{asset}\""
"\n\nError: {message}"
).format(
creator=self._creator_label,
subset=self._subset_name,
asset=self._asset_name,
message=self._exc_msg,
)
if self._formatted_traceback:
report_message += "\n\n{}".format(self._formatted_traceback)
return [report_message]
def _create_content(self, content_layout):
item_name_template = (
"<span style='font-weight:bold;'>Creator:</span> {}<br>"
"<span style='font-weight:bold;'>Subset:</span> {}<br>"
@ -61,48 +77,29 @@ class CreateErrorMessageBox(QtWidgets.QDialog):
exc_msg_template = "<span style='font-weight:bold'>{}</span>"
line = self._create_line()
body_layout.addWidget(line)
content_layout.addWidget(line)
item_name = item_name_template.format(
creator_label, subset_name, asset_name
)
item_name_widget = QtWidgets.QLabel(
item_name.replace("\n", "<br>"), self
)
body_layout.addWidget(item_name_widget)
exc_msg = exc_msg_template.format(exc_msg.replace("\n", "<br>"))
message_label_widget = QtWidgets.QLabel(exc_msg, self)
body_layout.addWidget(message_label_widget)
if formatted_traceback:
tb_widget = QtWidgets.QLabel(
formatted_traceback.replace("\n", "<br>"), self
item_name_widget = QtWidgets.QLabel(self)
item_name_widget.setText(
item_name_template.format(
self._creator_label, self._subset_name, self._asset_name
)
tb_widget.setTextInteractionFlags(
QtCore.Qt.TextBrowserInteraction
)
body_layout.addWidget(tb_widget)
footer_widget = QtWidgets.QWidget(self)
footer_layout = QtWidgets.QHBoxLayout(footer_widget)
button_box = QtWidgets.QDialogButtonBox(QtCore.Qt.Vertical)
button_box.setStandardButtons(
QtWidgets.QDialogButtonBox.StandardButton.Ok
)
button_box.accepted.connect(self._on_accept)
footer_layout.addWidget(button_box, alignment=QtCore.Qt.AlignRight)
body_layout.addWidget(footer_widget)
content_layout.addWidget(item_name_widget)
def _on_accept(self):
self.close()
message_label_widget = QtWidgets.QLabel(self)
message_label_widget.setText(
exc_msg_template.format(self.convert_text_for_html(self._exc_msg))
)
content_layout.addWidget(message_label_widget)
def _create_line(self):
line = QtWidgets.QFrame(self)
line.setFixedHeight(2)
line.setFrameShape(QtWidgets.QFrame.HLine)
line.setFrameShadow(QtWidgets.QFrame.Sunken)
return line
if self._formatted_traceback:
line_widget = self._create_line()
tb_widget = self._create_traceback_widget(
self._formatted_traceback
)
content_layout.addWidget(line_widget)
content_layout.addWidget(tb_widget)
# TODO add creator identifier/label to details
@ -201,7 +198,7 @@ class CreateDialog(QtWidgets.QDialog):
self._prereq_available = False
self.message_dialog = None
self._message_dialog = None
name_pattern = "^[{}]*$".format(SUBSET_NAME_ALLOWED_SYMBOLS)
self._name_pattern = name_pattern
@ -694,14 +691,18 @@ class CreateDialog(QtWidgets.QDialog):
"family": family
}
error_info = None
error_msg = None
formatted_traceback = None
try:
self.controller.create(
creator_identifier, subset_name, instance_data, pre_create_data
creator_identifier,
subset_name,
instance_data,
pre_create_data
)
except CreatorError as exc:
error_info = (str(exc), None)
error_msg = str(exc)
# Use bare except because some hosts raise their exceptions that
# do not inherit from python's `BaseException`
@ -710,12 +711,17 @@ class CreateDialog(QtWidgets.QDialog):
formatted_traceback = "".join(traceback.format_exception(
exc_type, exc_value, exc_traceback
))
error_info = (str(exc_value), formatted_traceback)
error_msg = str(exc_value)
if error_info:
if error_msg is not None:
box = CreateErrorMessageBox(
creator_label, subset_name, asset_name, *error_info
creator_label,
subset_name,
asset_name,
error_msg,
formatted_traceback,
parent=self
)
box.show()
# Store dialog so is not garbage collected before is shown
self.message_dialog = box
self._message_dialog = box