diff --git a/picard/ui/__init__.py b/picard/ui/__init__.py index 03e6ed951..a0ae563b9 100644 --- a/picard/ui/__init__.py +++ b/picard/ui/__init__.py @@ -57,6 +57,28 @@ class PreserveGeometry: config.persist[self.opt_name()] = self.saveGeometry() +class SingletonDialog: + _instance = None + + @classmethod + def get_instance(cls, *args, **kwargs): + if not cls._instance: + cls._instance = cls(*args, **kwargs) + cls._instance.finished.connect(cls._on_dialog_finished) + return cls._instance + + @classmethod + def show_instance(cls, *args, **kwargs): + instance = cls.get_instance(*args, **kwargs) + instance.show() + instance.raise_() + instance.activateWindow() + + @classmethod + def _on_dialog_finished(cls): + cls._instance = None + + class PicardDialog(QtWidgets.QDialog, PreserveGeometry): flags = QtCore.Qt.WindowSystemMenuHint | QtCore.Qt.WindowTitleHint | QtCore.Qt.WindowCloseButtonHint diff --git a/picard/ui/mainwindow.py b/picard/ui/mainwindow.py index cb1a30739..92bb64ce1 100644 --- a/picard/ui/mainwindow.py +++ b/picard/ui/mainwindow.py @@ -164,7 +164,6 @@ class MainWindow(QtWidgets.QMainWindow, PreserveGeometry): self.log_dialog = LogView(self) self.history_dialog = HistoryView(self) - self.optionsDialog = None bottomLayout = QtWidgets.QHBoxLayout() bottomLayout.setContentsMargins(0, 0, 0, 0) @@ -907,15 +906,7 @@ class MainWindow(QtWidgets.QMainWindow, PreserveGeometry): self.show_options("about") def show_options(self, page=None): - if not self.optionsDialog: - self.optionsDialog = OptionsDialog(page, self) - self.optionsDialog.finished.connect(self.on_options_closed) - self.optionsDialog.show() - self.optionsDialog.raise_() - self.optionsDialog.activateWindow() - - def on_options_closed(self): - self.optionsDialog = None + OptionsDialog.show_instance(page, self) def show_help(self): webbrowser2.goto('documentation') diff --git a/picard/ui/options/dialog.py b/picard/ui/options/dialog.py index c3d2e2e60..e8ec5bffb 100644 --- a/picard/ui/options/dialog.py +++ b/picard/ui/options/dialog.py @@ -35,6 +35,7 @@ from picard.util import ( from picard.ui import ( HashableTreeWidgetItem, PicardDialog, + SingletonDialog, ) from picard.ui.options import ( # noqa: F401 # pylint: disable=unused-import OptionsCheckError, @@ -63,7 +64,7 @@ from picard.ui.options import ( # noqa: F401 # pylint: disable=unused-import from picard.ui.util import StandardButton -class OptionsDialog(PicardDialog): +class OptionsDialog(PicardDialog, SingletonDialog): autorestore = False