forked from openlp/openlp
Merge branch 'issue-559-prevent-user-closing-display-window' into 'master'
Prevent the user from closing the display window Closes #559 See merge request openlp/openlp!405
This commit is contained in:
commit
aa22652b3e
@ -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):
|
||||||
|
@ -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():
|
||||||
|
@ -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
|
self.close_displays()
|
||||||
for display in self.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
|
||||||
|
@ -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
|
||||||
|
@ -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 == []
|
||||||
|
Loading…
Reference in New Issue
Block a user