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
"""
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()

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.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. '