creating ConfigScreenChangedEmitter singleton to encapsulate debounced screen change emitter; simplifying main_window's screen_changed warning modal condition

This commit is contained in:
Mateus Meyer Jiacomelli 2022-11-22 15:40:54 -03:00
parent 58a07e5058
commit 4cb5cca85d
2 changed files with 21 additions and 16 deletions

View File

@ -163,7 +163,7 @@ class Screen(object):
Callback function for when the screens geometry changes Callback function for when the screens geometry changes
""" """
self.geometry = geometry self.geometry = geometry
emit_config_screen_changed() ConfigScreenChangedEmitter().emit()
class ScreenList(metaclass=Singleton): class ScreenList(metaclass=Singleton):
@ -396,7 +396,7 @@ class ScreenList(metaclass=Singleton):
is_primary=self.application.primaryScreen() == changed_screen)) is_primary=self.application.primaryScreen() == changed_screen))
self.find_new_display_screen() self.find_new_display_screen()
changed_screen.geometryChanged.connect(self.screens[-1].on_geometry_changed) changed_screen.geometryChanged.connect(self.screens[-1].on_geometry_changed)
emit_config_screen_changed() ConfigScreenChangedEmitter().emit()
def on_screen_removed(self, removed_screen): def on_screen_removed(self, removed_screen):
""" """
@ -417,7 +417,7 @@ class ScreenList(metaclass=Singleton):
self.screens.pop(removed_screen_number) self.screens.pop(removed_screen_number)
if removed_screen_is_display: if removed_screen_is_display:
self.find_new_display_screen() self.find_new_display_screen()
emit_config_screen_changed() ConfigScreenChangedEmitter().emit()
def on_primary_screen_changed(self): def on_primary_screen_changed(self):
""" """
@ -426,21 +426,24 @@ class ScreenList(metaclass=Singleton):
for screen in self.screens: for screen in self.screens:
screen.is_primary = self.application.primaryScreen().geometry() == screen.geometry screen.is_primary = self.application.primaryScreen().geometry() == screen.geometry
self.find_new_display_screen() self.find_new_display_screen()
emit_config_screen_changed() ConfigScreenChangedEmitter().emit()
SCREEN_CHANGED_DEBOUNCE_TIMEOUT = 350 SCREEN_CHANGED_DEBOUNCE_TIMEOUT = 350
def emit_config_screen_changed(): class ConfigScreenChangedEmitter(metaclass=Singleton):
screen_changed_debounce.start() 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(): def __do_emit_config_screen_changed(self):
Registry().execute('config_screen_changed') Registry().execute('config_screen_changed')
def __del__(self):
screen_changed_debounce = QtCore.QTimer(None) self.timer.stop()
screen_changed_debounce.setInterval(SCREEN_CHANGED_DEBOUNCE_TIMEOUT)
screen_changed_debounce.setSingleShot(True)
screen_changed_debounce.timeout.connect(__do_emit_config_screen_changed)

View File

@ -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.platform import is_macosx, is_win
from openlp.core.common.registry import Registry from openlp.core.common.registry import Registry
from openlp.core.common.settings import Settings 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.plugin import PluginStatus
from openlp.core.lib.ui import create_action from openlp.core.lib.ui import create_action
from openlp.core.projectors.manager import ProjectorManager from openlp.core.projectors.manager import ProjectorManager
@ -1021,8 +1021,10 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow, LogMixin, RegistryPropert
self.screen_updating_lock.acquire() self.screen_updating_lock.acquire()
# if a warning has been shown within the last 5 seconds, skip showing again to avoid spamming user, # 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 # also do not show if the settings window is visible
if not self.settings_form.isVisible() and not self.screen_change_timestamp or \ has_shown_messagebox_recently = self.screen_change_timestamp \
self.screen_change_timestamp and (datetime.now() - self.screen_change_timestamp).seconds > 5: 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'), QtWidgets.QMessageBox.warning(self, translate('OpenLP.MainWindow', 'Screen setup has changed'),
translate('OpenLP.MainWindow', translate('OpenLP.MainWindow',
'The screen setup has changed. ' 'The screen setup has changed. '