diff --git a/openlp/core/display/screens.py b/openlp/core/display/screens.py index 1fa0b250d..53043a08b 100644 --- a/openlp/core/display/screens.py +++ b/openlp/core/display/screens.py @@ -163,7 +163,7 @@ class Screen(object): Callback function for when the screens geometry changes """ self.geometry = geometry - emit_config_screen_changed() + ConfigScreenChangedEmitter().emit() class ScreenList(metaclass=Singleton): @@ -396,7 +396,7 @@ class ScreenList(metaclass=Singleton): is_primary=self.application.primaryScreen() == changed_screen)) self.find_new_display_screen() changed_screen.geometryChanged.connect(self.screens[-1].on_geometry_changed) - emit_config_screen_changed() + ConfigScreenChangedEmitter().emit() def on_screen_removed(self, removed_screen): """ @@ -417,7 +417,7 @@ class ScreenList(metaclass=Singleton): self.screens.pop(removed_screen_number) if removed_screen_is_display: self.find_new_display_screen() - emit_config_screen_changed() + ConfigScreenChangedEmitter().emit() def on_primary_screen_changed(self): """ @@ -426,21 +426,24 @@ class ScreenList(metaclass=Singleton): for screen in self.screens: screen.is_primary = self.application.primaryScreen().geometry() == screen.geometry self.find_new_display_screen() - emit_config_screen_changed() + ConfigScreenChangedEmitter().emit() SCREEN_CHANGED_DEBOUNCE_TIMEOUT = 350 -def emit_config_screen_changed(): - screen_changed_debounce.start() +class ConfigScreenChangedEmitter(metaclass=Singleton): + def __init__(self): + self.timer = QtCore.QTimer(None) + self.timer.setInterval(SCREEN_CHANGED_DEBOUNCE_TIMEOUT) + self.timer.setSingleShot(True) + self.timer.timeout.connect(self.__do_emit_config_screen_changed) + def emit(self): + self.timer.start() -def __do_emit_config_screen_changed(): - Registry().execute('config_screen_changed') + def __do_emit_config_screen_changed(self): + Registry().execute('config_screen_changed') - -screen_changed_debounce = QtCore.QTimer(None) -screen_changed_debounce.setInterval(SCREEN_CHANGED_DEBOUNCE_TIMEOUT) -screen_changed_debounce.setSingleShot(True) -screen_changed_debounce.timeout.connect(__do_emit_config_screen_changed) + def __del__(self): + self.timer.stop() diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index a7e9737b0..06b9bf3e8 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -40,7 +40,7 @@ from openlp.core.common.path import create_paths, resolve from openlp.core.common.platform import is_macosx, is_win from openlp.core.common.registry import Registry from openlp.core.common.settings import Settings -from openlp.core.display.screens import ScreenList +from openlp.core.display.screens import ConfigScreenChangedEmitter, ScreenList from openlp.core.lib.plugin import PluginStatus from openlp.core.lib.ui import create_action from openlp.core.projectors.manager import ProjectorManager @@ -1021,8 +1021,10 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow, LogMixin, RegistryPropert self.screen_updating_lock.acquire() # if a warning has been shown within the last 5 seconds, skip showing again to avoid spamming user, # also do not show if the settings window is visible - if not self.settings_form.isVisible() and not self.screen_change_timestamp or \ - self.screen_change_timestamp and (datetime.now() - self.screen_change_timestamp).seconds > 5: + has_shown_messagebox_recently = self.screen_change_timestamp \ + and (datetime.now() - self.screen_change_timestamp).seconds < 5 + should_show_messagebox = self.settings_form.isHidden() and not has_shown_messagebox_recently + if should_show_messagebox: QtWidgets.QMessageBox.warning(self, translate('OpenLP.MainWindow', 'Screen setup has changed'), translate('OpenLP.MainWindow', 'The screen setup has changed. '