Source code for schrodinger.infra.exception_handler_dir.exception_dialog
from schrodinger.infra.exception_handler_dir import exception_dialog_ui
from schrodinger.Qt import QtWidgets
[docs]class ExceptionDialog(QtWidgets.QDialog):
"""
A dialog for showing exceptions to users
"""
[docs] def __init__(self, msg_html, exception_msg, *, show_ignore=True):
"""
:param msg_html: The message formatted as html
:type msg_html: str
:param msg_plaintext: The message formatted as plaintext
:type msg_plaintext: str
:param show_ignore: Whether to show the ignore checkbox
:type show_ignore: bool
"""
super().__init__(parent=None)
self.msg_html = msg_html
self.exception_msg = exception_msg
# Add HTML pre tag so whitespace is preserved
self._plain_html = f"<pre>{self.exception_msg}</pre>"
self.ignore_in_future = False
self.ui = exception_dialog_ui.Ui_Dialog()
self.ui.setupUi(self)
self.ui.ok_button.clicked.connect(self.accept)
self.ui.copy_to_clipboard_button.clicked.connect(self.copyToClipboard)
self.ui.error_text.setHtml(self.msg_html)
self.ui.error_text.setOpenExternalLinks(True)
self.ui.back_button.setVisible(False)
self.ui.back_button.clicked.connect(self.backClicked)
self.ui.error_text.anchorClicked.connect(self.linkFollowed)
if not show_ignore:
self.ui.ignore_checkbox.setVisible(False)
else:
self.ui.ignore_checkbox.toggled.connect(self.ignoreCheckboxChanged)
[docs] def copyToClipboard(self):
"""
Copy the text (as plaintext) currently displayed into the clipboard.
"""
clipboard = QtWidgets.QApplication.clipboard()
clipboard.setText(self.exception_msg)
[docs] def ignoreCheckboxChanged(self, checked):
"""
Callback that synchronizes the selection state of the ignore_checkbox
with the bool, self.ignore_in_future
:param state: whether the checkbox is checked
:type checked: bool
"""
self.ignore_in_future = checked
[docs] def linkFollowed(self, link):
"""
Callback that shows the back_button if the file link is followed
:param link: The link that was clicked
:type link: `QtCore.QUrl`
"""
if str(link.scheme()) == 'file':
self.ui.error_text.setHtml(self._plain_html)
self.ui.back_button.setVisible(True)
[docs] def backClicked(self):
"""
Callback that hides the back_button and resets the error text
"""
self.ui.back_button.setVisible(False)
self.ui.error_text.setHtml(self.msg_html)