Prevent the user from closing the display window

This commit is contained in:
Raoul Snyman 2022-02-04 22:06:06 +00:00
parent bc872e0e87
commit 26d3659250
5 changed files with 73 additions and 10 deletions

View File

@ -89,6 +89,7 @@ class DisplayWindow(QtWidgets.QWidget, RegistryProperties, LogMixin):
# Need to import this inline to get around a QtWebEngine issue # Need to import this inline to get around a QtWebEngine issue
from openlp.core.display.webengine import WebEngineView from openlp.core.display.webengine import WebEngineView
self._is_initialised = False self._is_initialised = False
self._is_manual_close = False
self._can_show_startup_screen = can_show_startup_screen self._can_show_startup_screen = can_show_startup_screen
self._fbo = None self._fbo = None
self.setWindowTitle(translate('OpenLP.DisplayWindow', 'Display Window')) self.setWindowTitle(translate('OpenLP.DisplayWindow', 'Display Window'))
@ -130,6 +131,13 @@ class DisplayWindow(QtWidgets.QWidget, RegistryProperties, LogMixin):
if len(ScreenList()) > 1 or self.settings.value('core/display on monitor'): if len(ScreenList()) > 1 or self.settings.value('core/display on monitor'):
self.show() self.show()
def closeEvent(self, event):
"""
Override the closeEvent method to prevent the window from being closed by the user
"""
if not self._is_manual_close:
event.ignore()
def _fix_font_name(self, font_name): def _fix_font_name(self, font_name):
""" """
Do some font machinations to see if we can fix the font name Do some font machinations to see if we can fix the font name
@ -150,6 +158,7 @@ class DisplayWindow(QtWidgets.QWidget, RegistryProperties, LogMixin):
if self.is_display: if self.is_display:
Registry().remove_function('live_display_hide', self.hide_display) Registry().remove_function('live_display_hide', self.hide_display)
Registry().remove_function('live_display_show', self.show_display) Registry().remove_function('live_display_show', self.show_display)
self._is_manual_close = True
@property @property
def is_initialised(self): def is_initialised(self):

View File

@ -1096,9 +1096,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow, LogMixin, RegistryPropert
if self.new_data_path: if self.new_data_path:
self.change_data_directory() self.change_data_directory()
# Close down the display # Close down the display
if self.live_controller.display: self.live_controller.close_displays()
self.live_controller.display.close()
# self.live_controller.display = None
# Clean temporary files used by services # Clean temporary files used by services
self.service_manager_contents.clean_up() self.service_manager_contents.clean_up()
if is_win(): if is_win():

View File

@ -174,13 +174,8 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties):
""" """
if not self.is_live: if not self.is_live:
return return
if self.displays:
# Delete any existing displays # Delete any existing displays
for display in self.displays: self.close_displays()
display.deregister_display()
display.setParent(None)
del display
self.displays = []
for screen in self.screens: for screen in self.screens:
if screen.is_display: if screen.is_display:
display = DisplayWindow(self, screen) display = DisplayWindow(self, screen)
@ -189,6 +184,17 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties):
if self.display: if self.display:
self.__add_actions_to_widget(self.display) self.__add_actions_to_widget(self.display)
def close_displays(self):
"""
Close all open displays
"""
for display in self.displays:
display.deregister_display()
display.setParent(None)
display.close()
del display
self.displays = []
@property @property
def display(self): def display(self):
return self.displays[0] if self.displays else None return self.displays[0] if self.displays else None

View File

@ -666,3 +666,34 @@ def test_display_watcher_please_repaint(display_window_env, mock_settings):
# THEN: Qt update for the webview should have been triggered # THEN: Qt update for the webview should have been triggered
assert display_window.webview.update.call_count == 1 assert display_window.webview.update.call_count == 1
def test_close_event_ignores_event(display_window_env, mock_settings):
"""
Test that when the window receives a close event, it ignores it
"""
# GIVEN: A DisplayWindow instance and a mocked event
display_window = DisplayWindow()
mocked_event = MagicMock()
# WHEN: The closeEvent() method is called
display_window.closeEvent(mocked_event)
# THEN: The event should have been ignored
mocked_event.ignore.assert_called_once()
def test_close_event_accepts_event_manual_close(display_window_env, mock_settings):
"""
Test that when the window receives a close event due to manually being closed, it accepts it
"""
# GIVEN: A DisplayWindow instance and a mocked event
display_window = DisplayWindow()
mocked_event = MagicMock()
# WHEN: The closeEvent() method is called
display_window._is_manual_close = True
display_window.closeEvent(mocked_event)
# THEN: The event should have been ignored
assert mocked_event.ignore.called is False

View File

@ -1552,3 +1552,22 @@ def test_initial_preview_controller(registry):
# WHEN: the default controller is built. # WHEN: the default controller is built.
# THEN: The controller should not be a live controller. # THEN: The controller should not be a live controller.
assert preview_controller.is_live is False, 'The slide controller should be a Preview controller' assert preview_controller.is_live is False, 'The slide controller should be a Preview controller'
def test_close_displays(registry):
"""
Test that closing the displays calls the correct methods
"""
# GIVEN: A Live controller and a mocked display
mocked_display = MagicMock()
live_controller = LiveController(None)
live_controller.displays = [mocked_display]
# WHEN: close_displays() is called
live_controller.close_displays()
# THEN: The display is closed
mocked_display.deregister_display.assert_called_once()
mocked_display.setParent.assert_called_once_with(None)
mocked_display.close.assert_called_once()
assert live_controller.displays == []