diff --git a/picard/ui/scripteditor.py b/picard/ui/scripteditor.py index 0979643ae..75de0aecd 100644 --- a/picard/ui/scripteditor.py +++ b/picard/ui/scripteditor.py @@ -49,7 +49,6 @@ from picard.util.settingsoverride import SettingsOverride from picard.ui import ( FONT_FAMILY_MONOSPACE, PicardDialog, - SingletonDialog, ) from picard.ui.options import OptionsPage from picard.ui.options.scripting import ( @@ -96,7 +95,6 @@ class ScriptEditorExamples(): parent (QMainWindow or OptionsPage, optional): Parent object. Defaults to None. tagger (object, optional): Object containing the main window tagger object. Defaults to None. """ - self.parent = parent self.tagger = tagger self._sampled_example_files = [] config = get_config() @@ -252,7 +250,7 @@ class ScriptEditorExamples(): return file -class ScriptEditorPage(PicardDialog, SingletonDialog): +class ScriptEditorPage(PicardDialog): """File Naming Script Editor Page """ NAME = "scripteditor" @@ -280,9 +278,10 @@ class ScriptEditorPage(PicardDialog, SingletonDialog): examples (ScriptEditorExamples, required): Object containing examples to display. Defaults to None. """ super().__init__(parent) - self.PARENT = parent self.examples = examples - self.setWindowFlags(QtCore.Qt.Window) + # TODO: Work on making this work properly so that it can be accessed from both the main window and the options window. + # self.setWindowFlags(QtCore.Qt.Window) + self.setWindowModality(QtCore.Qt.WindowModal) self.setWindowTitle(self.TITLE) self.displaying = False self.ui = Ui_ScriptEditor() @@ -294,47 +293,8 @@ class ScriptEditorPage(PicardDialog, SingletonDialog): self.ui.file_naming_format.setEnabled(True) - text = '' + N_('Open Scripting Documentation in your browser') + '' - self.ui.scripting_doc_link.setText(text) - - def process_html(html, function): - if not html: - html = '' - template = '
%s%s
%s
' - if function.module is not None and function.module != 'picard.script.functions': - module = ' [' + function.module + ']' - else: - module = '' - try: - firstline, remaining = html.split("\n", 1) - return template % (firstline, module, remaining) - except ValueError: - return template % ("$%s()" % function.name, module, html) - - funcdoc = script_function_documentation_all( - fmt='html', - postprocessor=process_html, - ) - - if self.ui.textBrowser.layoutDirection() == QtCore.Qt.RightToLeft: - text_direction = 'rtl' - else: - text_direction = 'ltr' - - html = DOCUMENTATION_HTML_TEMPLATE % { - 'html': "
%s
" % funcdoc, - 'script_function_fg': theme.syntax_theme.func.name(), - 'monospace_font': FONT_FAMILY_MONOSPACE, - 'dir': text_direction, - 'inline_start': 'right' if text_direction == 'rtl' else 'left' - } - # Scripting code is always left-to-right. Qt does not support the dir - # attribute on inline tags, insert explicit left-right-marks instead. - html = html.replace('', '‎') - self.ui.textBrowser.setHtml(html) - - self.ui.textBrowser.show() - self.ui.scripting_doc_link.show() + # Add scripting documentation to parent frame. + ScriptingDocumentationWidget(parent=self.ui.documentation_frame) self.ui.show_documentation.stateChanged.connect(self.toggle_documentation) self.ui.file_naming_format.textChanged.connect(self.check_formats) @@ -386,7 +346,6 @@ class ScriptEditorPage(PicardDialog, SingletonDialog): # self.ui.splitter_between_before_and_after.setStyleSheet(stylesheet) self.wordwrap = QtWidgets.QTextEdit.NoWrap - self.override = {} self.current_row = -1 self.load() @@ -583,3 +542,89 @@ class ScriptEditorPage(PicardDialog, SingletonDialog): save_enabled = False self.ui.file_naming_editor_save.setEnabled(save_enabled) self.ui.export_script.setEnabled(save_enabled) + + +class ScriptingDocumentationWidget(QtWidgets.QWidget): + """Custom widget to display the scripting documentation. + """ + def __init__(self, parent, *args, **kwargs): + """Custom widget to display the scripting documentation. + + Args: + parent (QWidget): Frame widget in which the documentation is displayed. + """ + super(ScriptingDocumentationWidget, self).__init__(*args, **kwargs) + self.parent = parent + self.remove_parent_layout() + + def process_html(html, function): + if not html: + html = '' + template = '
%s%s
%s
' + if function.module is not None and function.module != 'picard.script.functions': + module = ' [' + function.module + ']' + else: + module = '' + try: + firstline, remaining = html.split("\n", 1) + return template % (firstline, module, remaining) + except ValueError: + return template % ("$%s()" % function.name, module, html) + + funcdoc = script_function_documentation_all( + fmt='html', + postprocessor=process_html, + ) + + if self.parent.layoutDirection() == QtCore.Qt.RightToLeft: + text_direction = 'rtl' + else: + text_direction = 'ltr' + + html = DOCUMENTATION_HTML_TEMPLATE % { + 'html': "
%s
" % funcdoc, + 'script_function_fg': theme.syntax_theme.func.name(), + 'monospace_font': FONT_FAMILY_MONOSPACE, + 'dir': text_direction, + 'inline_start': 'right' if text_direction == 'rtl' else 'left' + } + # Scripting code is always left-to-right. Qt does not support the dir + # attribute on inline tags, insert explicit left-right-marks instead. + html = html.replace('', '‎') + + link = '' + N_('Open Scripting Documentation in your browser') + '' + + self.verticalLayout = QtWidgets.QVBoxLayout(self.parent) + self.verticalLayout.setContentsMargins(0, 0, 0, 0) + self.verticalLayout.setObjectName("docs_verticalLayout") + self.textBrowser = QtWidgets.QTextBrowser(self.parent) + self.textBrowser.setEnabled(True) + self.textBrowser.setMinimumSize(QtCore.QSize(0, 0)) + self.textBrowser.setObjectName("docs_textBrowser") + self.textBrowser.setHtml(html) + self.textBrowser.show() + self.verticalLayout.addWidget(self.textBrowser) + self.horizontalLayout = QtWidgets.QHBoxLayout() + self.horizontalLayout.setContentsMargins(-1, 0, -1, -1) + self.horizontalLayout.setObjectName("docs_horizontalLayout") + self.scripting_doc_link = QtWidgets.QLabel(self.parent) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.scripting_doc_link.sizePolicy().hasHeightForWidth()) + self.scripting_doc_link.setSizePolicy(sizePolicy) + self.scripting_doc_link.setMinimumSize(QtCore.QSize(0, 20)) + self.scripting_doc_link.setAlignment(QtCore.Qt.AlignCenter) + self.scripting_doc_link.setWordWrap(True) + self.scripting_doc_link.setOpenExternalLinks(True) + self.scripting_doc_link.setObjectName("docs_scripting_doc_link") + self.scripting_doc_link.setText(link) + self.scripting_doc_link.show() + self.horizontalLayout.addWidget(self.scripting_doc_link) + self.verticalLayout.addLayout(self.horizontalLayout) + + def remove_parent_layout(self): + """Remove any existing layout in the parent to allow attaching the new layout. + """ + if self.parent.layout() is not None: + QtWidgets.QWidget().setLayout(self.parent.layout()) diff --git a/picard/ui/ui_scripteditor.py b/picard/ui/ui_scripteditor.py index 312178684..a8b2553ac 100644 --- a/picard/ui/ui_scripteditor.py +++ b/picard/ui/ui_scripteditor.py @@ -112,27 +112,6 @@ class Ui_ScriptEditor(object): self.verticalLayout_7 = QtWidgets.QVBoxLayout(self.documentation_frame) self.verticalLayout_7.setContentsMargins(0, 0, 0, 0) self.verticalLayout_7.setObjectName("verticalLayout_7") - self.textBrowser = QtWidgets.QTextBrowser(self.documentation_frame) - self.textBrowser.setEnabled(True) - self.textBrowser.setMinimumSize(QtCore.QSize(0, 0)) - self.textBrowser.setObjectName("textBrowser") - self.verticalLayout_7.addWidget(self.textBrowser) - self.horizontalLayout_3 = QtWidgets.QHBoxLayout() - self.horizontalLayout_3.setContentsMargins(-1, 0, -1, -1) - self.horizontalLayout_3.setObjectName("horizontalLayout_3") - self.scripting_doc_link = QtWidgets.QLabel(self.documentation_frame) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.scripting_doc_link.sizePolicy().hasHeightForWidth()) - self.scripting_doc_link.setSizePolicy(sizePolicy) - self.scripting_doc_link.setMinimumSize(QtCore.QSize(0, 20)) - self.scripting_doc_link.setAlignment(QtCore.Qt.AlignCenter) - self.scripting_doc_link.setWordWrap(True) - self.scripting_doc_link.setOpenExternalLinks(True) - self.scripting_doc_link.setObjectName("scripting_doc_link") - self.horizontalLayout_3.addWidget(self.scripting_doc_link) - self.verticalLayout_7.addLayout(self.horizontalLayout_3) self.verticalLayout_8.addWidget(self.splitter_between_editor_and_documentation) self.verticalLayout_5.addWidget(self.frame) self.horizontalLayout_5 = QtWidgets.QHBoxLayout() @@ -232,7 +211,6 @@ class Ui_ScriptEditor(object): _translate = QtCore.QCoreApplication.translate self.label.setText(_("File naming scripts:")) self.preset_naming_scripts.setToolTip(_("Select the file naming script to load into the editor")) - self.scripting_doc_link.setText(_("Open documentation in browser")) self.file_naming_word_wrap.setToolTip(_("Word wrap long lines in the editor")) self.file_naming_word_wrap.setText(_("Word wrap script")) self.show_documentation.setToolTip(_("Open the scripting documentation in a sidebar")) diff --git a/ui/scripteditor.ui b/ui/scripteditor.ui index 9f34875a0..b491c3fe8 100644 --- a/ui/scripteditor.ui +++ b/ui/scripteditor.ui @@ -231,54 +231,6 @@ 0 - - - - true - - - - 0 - 0 - - - - - - - - 0 - - - - - - 0 - 0 - - - - - 0 - 20 - - - - Open documentation in browser - - - Qt::AlignCenter - - - true - - - true - - - - -