Merge branch 'view_mode_radio_buttons' into 'master'

View mode radio buttons

Closes #483

See merge request openlp/openlp!168
This commit is contained in:
Tomas Groth 2020-05-07 06:51:29 +00:00
commit 63de3d2021
4 changed files with 243 additions and 275 deletions

View File

@ -383,7 +383,8 @@ class Settings(QtCore.QSettings):
('remotes/authentication enabled', 'api/authentication enabled', []), ('remotes/authentication enabled', 'api/authentication enabled', []),
('remotes/ip address', 'api/ip address', []), ('remotes/ip address', 'api/ip address', []),
('remotes/thumbnails', 'api/thumbnails', []), ('remotes/thumbnails', 'api/thumbnails', []),
('shortcuts/escapeItem', 'shortcuts/desktopScreenEnable', []), # Escape item was removed in 2.6. ('shortcuts/escapeItem', '', []), # Escape item was removed in 2.6.
('shortcuts/desktopScreenEnable', '', []),
('shortcuts/offlineHelpItem', 'shortcuts/userManualItem', []), # Online and Offline help were combined in 2.6. ('shortcuts/offlineHelpItem', 'shortcuts/userManualItem', []), # Online and Offline help were combined in 2.6.
('shortcuts/onlineHelpItem', 'shortcuts/userManualItem', []), # Online and Offline help were combined in 2.6. ('shortcuts/onlineHelpItem', 'shortcuts/userManualItem', []), # Online and Offline help were combined in 2.6.
('bibles/advanced bible', '', []), # Common bible search widgets combined in 2.6 ('bibles/advanced bible', '', []), # Common bible search widgets combined in 2.6
@ -477,8 +478,7 @@ class Settings(QtCore.QSettings):
'shortcuts/displayTagItem': [], 'shortcuts/displayTagItem': [],
'shortcuts/blankScreen': [QtGui.QKeySequence(QtCore.Qt.Key_Period)], 'shortcuts/blankScreen': [QtGui.QKeySequence(QtCore.Qt.Key_Period)],
'shortcuts/collapse': [QtGui.QKeySequence(QtCore.Qt.Key_Minus)], 'shortcuts/collapse': [QtGui.QKeySequence(QtCore.Qt.Key_Minus)],
'shortcuts/desktopScreen': [QtGui.QKeySequence(QtCore.Qt.Key_D)], 'shortcuts/desktopScreen': [QtGui.QKeySequence(QtCore.Qt.Key_D), QtGui.QKeySequence(QtCore.Qt.Key_Escape)],
'shortcuts/desktopScreenEnable': [QtGui.QKeySequence(QtCore.Qt.Key_Escape)],
'shortcuts/delete': [QtGui.QKeySequence(QtGui.QKeySequence.Delete)], 'shortcuts/delete': [QtGui.QKeySequence(QtGui.QKeySequence.Delete)],
'shortcuts/down': [QtGui.QKeySequence(QtCore.Qt.Key_Down)], 'shortcuts/down': [QtGui.QKeySequence(QtCore.Qt.Key_Down)],
'shortcuts/editSong': [], 'shortcuts/editSong': [],
@ -589,6 +589,7 @@ class Settings(QtCore.QSettings):
'shortcuts/shortcutAction_7': [QtGui.QKeySequence(QtCore.Qt.Key_7)], 'shortcuts/shortcutAction_7': [QtGui.QKeySequence(QtCore.Qt.Key_7)],
'shortcuts/shortcutAction_8': [QtGui.QKeySequence(QtCore.Qt.Key_8)], 'shortcuts/shortcutAction_8': [QtGui.QKeySequence(QtCore.Qt.Key_8)],
'shortcuts/shortcutAction_9': [QtGui.QKeySequence(QtCore.Qt.Key_9)], 'shortcuts/shortcutAction_9': [QtGui.QKeySequence(QtCore.Qt.Key_9)],
'shortcuts/showScreen': [QtGui.QKeySequence(QtCore.Qt.Key_Space)],
'shortcuts/settingsExportItem': [], 'shortcuts/settingsExportItem': [],
'shortcuts/songUsageReport': [], 'shortcuts/songUsageReport': [],
'shortcuts/songImportItem': [], 'shortcuts/songImportItem': [],

View File

@ -737,7 +737,6 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow, LogMixin, RegistryPropert
""" """
Check and display message if screen blank on setup. Check and display message if screen blank on setup.
""" """
self.live_controller.main_display_set_background()
if self.settings.value('{section}/screen blank'.format(section=self.general_settings_section)): if self.settings.value('{section}/screen blank'.format(section=self.general_settings_section)):
if self.settings.value('{section}/blank warning'.format(section=self.general_settings_section)): if self.settings.value('{section}/blank warning'.format(section=self.general_settings_section)):
QtWidgets.QMessageBox.question(self, translate('OpenLP.MainWindow', 'OpenLP Main Display Blanked'), QtWidgets.QMessageBox.question(self, translate('OpenLP.MainWindow', 'OpenLP Main Display Blanked'),

View File

@ -58,12 +58,14 @@ LOOP_LIST = [
'delay_spin_box' 'delay_spin_box'
] ]
WIDE_MENU = [ WIDE_MENU = [
'show_screen_button',
'blank_screen_button', 'blank_screen_button',
'theme_screen_button', 'theme_screen_button',
'desktop_screen_button' 'desktop_screen_button'
] ]
NON_TEXT_MENU = [ NON_TEXT_MENU = [
'show_screen_button',
'blank_screen_button', 'blank_screen_button',
'desktop_screen_button' 'desktop_screen_button'
] ]
@ -271,36 +273,53 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties):
self.hide_menu.setPopupMode(QtWidgets.QToolButton.MenuButtonPopup) self.hide_menu.setPopupMode(QtWidgets.QToolButton.MenuButtonPopup)
self.hide_menu.setMenu(QtWidgets.QMenu(translate('OpenLP.SlideController', 'Hide'), self.toolbar)) self.hide_menu.setMenu(QtWidgets.QMenu(translate('OpenLP.SlideController', 'Hide'), self.toolbar))
self.toolbar.add_toolbar_widget(self.hide_menu) self.toolbar.add_toolbar_widget(self.hide_menu)
self.toolbar.add_toolbar_action('goPreview', icon=UiIcons().live,
tooltip=translate('OpenLP.SlideController', 'Move to preview.'),
triggers=self.on_go_preview)
# The order of the blank to modes in Shortcuts list comes from here. # The order of the blank to modes in Shortcuts list comes from here.
self.desktop_screen_enable = create_action(self, 'desktopScreenEnable', self.show_screen = create_action(self, 'showScreen',
text=translate('OpenLP.SlideController', 'Show Desktop'), text=translate('OpenLP.SlideController', 'Show Presentation'),
icon=UiIcons().desktop, can_shortcuts=True, icon=UiIcons().live,
context=QtCore.Qt.WidgetWithChildrenShortcut, checked=False, can_shortcuts=True, category=self.category,
category=self.category, triggers=self.on_hide_display_enable) triggers=self.on_show_display)
self.desktop_screen = create_action(self, 'desktopScreen', self.desktop_screen = create_action(self, 'setDesktopScreen',
text=translate('OpenLP.SlideController', 'Toggle Desktop'), text=translate('OpenLP.SlideController', 'Show Desktop'),
icon=UiIcons().desktop, icon=UiIcons().desktop,
checked=False, can_shortcuts=True, category=self.category, checked=False, can_shortcuts=False, category=self.category,
triggers=self.on_hide_display) triggers=self.on_hide_display)
self.theme_screen = create_action(self, 'themeScreen', self.theme_screen = create_action(self, 'setThemeScreen',
text=translate('OpenLP.SlideController', 'Toggle Blank to Theme'), text=translate('OpenLP.SlideController', 'Show Theme'),
icon=UiIcons().blank_theme, icon=UiIcons().blank_theme,
checked=False, can_shortcuts=True, category=self.category, checked=False, can_shortcuts=False, category=self.category,
triggers=self.on_theme_display) triggers=self.on_theme_display)
self.blank_screen = create_action(self, 'blankScreen', self.blank_screen = create_action(self, 'setBlankScreen',
text=translate('OpenLP.SlideController', 'Toggle Blank Screen'), text=translate('OpenLP.SlideController', 'Show Black'),
icon=UiIcons().blank, icon=UiIcons().blank,
checked=False, can_shortcuts=True, category=self.category, checked=False, can_shortcuts=False, category=self.category,
triggers=self.on_blank_display) triggers=self.on_blank_display)
self.hide_menu.setDefaultAction(self.blank_screen) self.hide_menu.setDefaultAction(self.show_screen)
self.hide_menu.menu().addAction(self.show_screen)
self.hide_menu.menu().addAction(self.blank_screen) self.hide_menu.menu().addAction(self.blank_screen)
self.hide_menu.menu().addAction(self.theme_screen) self.hide_menu.menu().addAction(self.theme_screen)
self.hide_menu.menu().addAction(self.desktop_screen) self.hide_menu.menu().addAction(self.desktop_screen)
self.hide_menu.menu().addAction(self.desktop_screen_enable) # Add togglable actions for keyboard shortcuts
self.controller.addAction(create_action(self, 'desktopScreen',
can_shortcuts=True,
context=QtCore.Qt.WidgetWithChildrenShortcut,
category=self.category,
triggers=self.on_toggle_desktop))
self.controller.addAction(create_action(self, 'themeScreen',
can_shortcuts=True,
context=QtCore.Qt.WidgetWithChildrenShortcut,
category=self.category,
triggers=self.on_toggle_theme))
self.controller.addAction(create_action(self, 'blankScreen',
can_shortcuts=True,
context=QtCore.Qt.WidgetWithChildrenShortcut,
category=self.category,
triggers=self.on_toggle_blank))
# Wide menu of display control buttons. # Wide menu of display control buttons.
self.show_screen_button = QtWidgets.QToolButton(self.toolbar)
self.show_screen_button.setObjectName('show_screen_button')
self.toolbar.add_toolbar_widget(self.show_screen_button)
self.show_screen_button.setDefaultAction(self.show_screen)
self.blank_screen_button = QtWidgets.QToolButton(self.toolbar) self.blank_screen_button = QtWidgets.QToolButton(self.toolbar)
self.blank_screen_button.setObjectName('blank_screen_button') self.blank_screen_button.setObjectName('blank_screen_button')
self.toolbar.add_toolbar_widget(self.blank_screen_button) self.toolbar.add_toolbar_widget(self.blank_screen_button)
@ -476,7 +495,7 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties):
Registry().register_function('slidecontroller_{text}_change'.format(text=self.type_prefix), Registry().register_function('slidecontroller_{text}_change'.format(text=self.type_prefix),
self.on_slide_change) self.on_slide_change)
Registry().register_function('slidecontroller_{text}_blank'.format(text=self.type_prefix), Registry().register_function('slidecontroller_{text}_blank'.format(text=self.type_prefix),
self.on_slide_blank) self.on_blank_display)
Registry().register_function('slidecontroller_{text}_unblank'.format(text=self.type_prefix), Registry().register_function('slidecontroller_{text}_unblank'.format(text=self.type_prefix),
self.on_slide_unblank) self.on_slide_unblank)
Registry().register_function('slidecontroller_update_slide_limits', self.update_slide_limits) Registry().register_function('slidecontroller_update_slide_limits', self.update_slide_limits)
@ -600,15 +619,13 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties):
:param action: The blank action to be processed. :param action: The blank action to be processed.
""" """
if action == 'blank' or action == 'hide': if action == 'blank' or action == 'hide':
self.on_blank_display(True) self.set_hide_mode(HideMode.Blank)
elif action == 'theme': elif action == 'theme':
self.on_theme_display(True) self.set_hide_mode(HideMode.Theme)
elif action == 'desktop': elif action == 'desktop':
self.on_hide_display(True) self.set_hide_mode(HideMode.Screen)
elif action == 'show': elif action == 'show':
self.on_blank_display(False) self.set_hide_mode(None)
self.on_theme_display(False)
self.on_hide_display(False)
def service_previous(self): def service_previous(self):
""" """
@ -664,18 +681,18 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties):
widget.addActions([ widget.addActions([
self.previous_item, self.next_item, self.previous_item, self.next_item,
self.previous_service, self.next_service, self.previous_service, self.next_service,
self.desktop_screen_enable, self.show_screen,
self.desktop_screen, self.desktop_screen,
self.theme_screen, self.theme_screen,
self.blank_screen]) self.blank_screen])
def on_controller_size_changed(self, width): def on_controller_size_changed(self):
""" """
Change layout of display control buttons on controller size change Change layout of display control buttons on controller size change
:param width: the new width of the display
""" """
if self.is_live: if self.is_live:
# The new width of the display
width = self.controller.width()
# Space used by the toolbar. # Space used by the toolbar.
used_space = self.toolbar.size().width() + self.hide_menu.size().width() used_space = self.toolbar.size().width() + self.hide_menu.size().width()
# Add the threshold to prevent flickering. # Add the threshold to prevent flickering.
@ -759,7 +776,7 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties):
# The layout of the toolbar is size dependent, so make sure it fits. Reset stored controller_width. # The layout of the toolbar is size dependent, so make sure it fits. Reset stored controller_width.
if self.is_live: if self.is_live:
self.controller_width = -1 self.controller_width = -1
self.on_controller_size_changed(self.controller.width()) self.on_controller_size_changed()
# Work-around for OS X, hide and then show the toolbar # Work-around for OS X, hide and then show the toolbar
# See bug #791050 # See bug #791050
self.toolbar.show() self.toolbar.show()
@ -879,7 +896,7 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties):
if self.service_item.is_command(): if self.service_item.is_command():
Registry().execute( Registry().execute(
'{text}_start'.format(text=self.service_item.name.lower()), '{text}_start'.format(text=self.service_item.name.lower()),
[self.service_item, self.is_live, self.hide_mode(), slide_no]) [self.service_item, self.is_live, self.get_hide_mode(), slide_no])
else: else:
self._set_theme(self.service_item) self._set_theme(self.service_item)
# Reset blanking if needed # Reset blanking if needed
@ -989,36 +1006,29 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties):
ratio = float(size.width()) / display_with ratio = float(size.width()) / display_with
self.preview_display.set_scale(ratio) self.preview_display.set_scale(ratio)
def main_display_set_background(self):
"""
Allow the main display to blank the main display at startup time
"""
# display_type = Settings().value(self.main_window.general_settings_section + '/screen blank')
# if self.screens.which_screen(self.window()) != self.screens.which_screen(self.display):
# # Order done to handle initial conversion
# if display_type == 'themed':
# self.on_theme_display(True)
# elif display_type == 'hidden':
# self.on_hide_display(True)
# elif display_type == 'blanked':
# self.on_blank_display(True)
# else:
# Registry().execute('live_display_show')
# else:
# self.on_hide_display_enable()
def on_slide_blank(self):
"""
Handle the slidecontroller blank event
"""
self.on_blank_display(True)
def on_slide_unblank(self): def on_slide_unblank(self):
""" """
Handle the slidecontroller unblank event. Handle the slidecontroller unblank event.
""" """
if not Registry().get_flag('replace service manager item') is True: if not Registry().get_flag('replace service manager item') is True:
self.on_blank_display(False) self.set_hide_mode(None)
def on_show_display(self, checked=None):
"""
Handle the blank screen button actions
:param checked: the new state of the of the widget
"""
self.set_hide_mode(None)
def on_toggle_blank(self):
"""
Toggle the blank screen
"""
if self.get_hide_mode() == HideMode.Blank:
self.set_hide_mode(None)
else:
self.set_hide_mode(HideMode.Blank)
def on_blank_display(self, checked=None): def on_blank_display(self, checked=None):
""" """
@ -1026,20 +1036,16 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties):
:param checked: the new state of the of the widget :param checked: the new state of the of the widget
""" """
if checked is None: self.set_hide_mode(HideMode.Blank)
checked = self.blank_screen.isChecked()
self.log_debug('on_blank_display {text}'.format(text=checked)) def on_toggle_theme(self):
self.hide_menu.setDefaultAction(self.blank_screen) """
self.blank_screen.setChecked(checked) Toggle the Theme screen
self.theme_screen.setChecked(False) """
self.desktop_screen.setChecked(False) if self.get_hide_mode() == HideMode.Theme:
if checked: self.set_hide_mode(None)
self.settings.setValue(self.main_window.general_settings_section + '/screen blank', 'blanked')
else: else:
self.settings.remove(self.main_window.general_settings_section + '/screen blank') self.set_hide_mode(HideMode.Theme)
self.blank_plugin()
self.update_preview()
self.on_toggle_loop()
def on_theme_display(self, checked=None): def on_theme_display(self, checked=None):
""" """
@ -1047,63 +1053,43 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties):
:param checked: the new state of the of the widget :param checked: the new state of the of the widget
""" """
if checked is None: self.set_hide_mode(HideMode.Theme)
checked = self.theme_screen.isChecked()
self.log_debug('on_theme_display {text}'.format(text=checked)) def on_toggle_desktop(self):
self.hide_menu.setDefaultAction(self.theme_screen) """
self.blank_screen.setChecked(False) Toggle the desktop
self.theme_screen.setChecked(checked) """
self.desktop_screen.setChecked(False) if self.get_hide_mode() == HideMode.Screen:
if checked: self.set_hide_mode(None)
self.settings.setValue(self.main_window.general_settings_section + '/screen blank', 'themed')
else: else:
self.settings.remove(self.main_window.general_settings_section + '/screen blank') self.set_hide_mode(HideMode.Screen)
self.blank_plugin()
self.update_preview()
self.on_toggle_loop()
def on_hide_display(self, checked=None): def on_hide_display(self, checked=None):
""" """
Handle the Hide screen button Handle the Hide screen button
This toggles the desktop screen. This enables the desktop screen.
:param checked: the new state of the of the widget :param checked: the new state of the of the widget
""" """
if checked is None: self.set_hide_mode(HideMode.Screen)
checked = self.desktop_screen.isChecked()
self.log_debug('on_hide_display {text}'.format(text=checked)) def set_hide_mode(self, hide_mode):
self.hide_menu.setDefaultAction(self.desktop_screen) """
self.blank_screen.setChecked(False) Blank/Hide the display screen (within a plugin if required).
self.theme_screen.setChecked(False) """
self.desktop_screen.setChecked(checked) self.log_debug('set_hide_mode {text}'.format(text=hide_mode))
if checked: # Update ui buttons
self.settings.setValue(self.main_window.general_settings_section + '/screen blank', 'hidden') if hide_mode is None:
self.hide_menu.setDefaultAction(self.blank_screen)
self.settings.setValue(self.main_window.general_settings_section + '/screen blank', False)
else: else:
self.settings.remove(self.main_window.general_settings_section + '/screen blank') self.hide_menu.setDefaultAction(self.show_screen)
self.hide_plugin(checked) self.settings.setValue(self.main_window.general_settings_section + '/screen blank', True)
self.update_preview() self.show_screen.setChecked(hide_mode is None)
self.on_toggle_loop() self.blank_screen.setChecked(hide_mode == HideMode.Blank)
self.theme_screen.setChecked(hide_mode == HideMode.Theme)
def on_hide_display_enable(self, checked=None): self.desktop_screen.setChecked(hide_mode == HideMode.Screen)
""" # Update plugin display
Handle the on_hide_display_enable
This only enables the desktop screen.
:param checked: the new state of the of the widget
"""
self.blank_screen.setChecked(False)
self.theme_screen.setChecked(False)
Registry().execute('live_display_hide', HideMode.Screen)
self.desktop_screen.setChecked(True)
self.update_preview()
self.on_toggle_loop()
def blank_plugin(self):
"""
Blank/Hide the display screen within a plugin if required.
"""
hide_mode = self.hide_mode()
self.log_debug('blank_plugin {text}'.format(text=hide_mode))
if self.service_item is not None: if self.service_item is not None:
if hide_mode: if hide_mode:
if not self.service_item.is_command(): if not self.service_item.is_command():
@ -1120,27 +1106,9 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties):
Registry().execute('live_display_hide', hide_mode) Registry().execute('live_display_hide', hide_mode)
else: else:
Registry().execute('live_display_show') Registry().execute('live_display_show')
# Update preview and loop state
def hide_plugin(self, hide): self.update_preview()
""" self.on_toggle_loop()
Tell the plugin to hide the display screen.
"""
self.log_debug('hide_plugin {text}'.format(text=hide))
if self.service_item is not None:
if hide:
Registry().execute('live_display_hide', HideMode.Screen)
Registry().execute('{text}_hide'.format(text=self.service_item.name.lower()),
[self.service_item, self.is_live])
else:
if not self.service_item.is_command():
Registry().execute('live_display_show')
Registry().execute('{text}_unblank'.format(text=self.service_item.name.lower()),
[self.service_item, self.is_live])
else:
if hide:
Registry().execute('live_display_hide', HideMode.Screen)
else:
Registry().execute('live_display_show')
def on_slide_selected(self): def on_slide_selected(self):
""" """
@ -1322,7 +1290,7 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties):
""" """
Toggles the loop state. Toggles the loop state.
""" """
hide_mode = self.hide_mode() hide_mode = self.get_hide_mode()
if hide_mode is None and (self.play_slides_loop.isChecked() or self.play_slides_once.isChecked()): if hide_mode is None and (self.play_slides_loop.isChecked() or self.play_slides_once.isChecked()):
self.on_start_loop() self.on_start_loop()
else: else:
@ -1460,27 +1428,18 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties):
self.live_controller.add_service_manager_item(self.service_item, row) self.live_controller.add_service_manager_item(self.service_item, row)
self.live_controller.preview_widget.setFocus() self.live_controller.preview_widget.setFocus()
def on_go_preview(self, field=None):
"""
If live copy slide item to preview controller from live Controller
"""
row = self.preview_widget.current_slide_number()
if -1 < row < self.preview_widget.slide_count():
self.preview_controller.add_service_manager_item(self.service_item, row)
self.preview_controller.preview_widget.setFocus()
def on_media_start(self, item): def on_media_start(self, item):
""" """
Respond to the arrival of a media service item Respond to the arrival of a media service item
:param item: The service item to be processed :param item: The service item to be processed
""" """
if self.is_live and self.hide_mode() == HideMode.Theme: if self.is_live and self.get_hide_mode() == HideMode.Theme:
self.media_controller.load_video(self.controller_type, item, HideMode.Blank) self.media_controller.load_video(self.controller_type, item, HideMode.Blank)
self.on_blank_display(True) self.set_hide_mode(HideMode.Blank)
elif self.is_live or item.is_media(): elif self.is_live or item.is_media():
# avoid loading the video if this is preview and the media is background # avoid loading the video if this is preview and the media is background
self.media_controller.load_video(self.controller_type, item, self.hide_mode()) self.media_controller.load_video(self.controller_type, item, self.get_hide_mode())
if not self.is_live: if not self.is_live:
self.preview_display.show() self.preview_display.show()
@ -1496,21 +1455,14 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties):
:param no_theme: Does the new item support theme-blanking. :param no_theme: Does the new item support theme-blanking.
""" """
hide_mode = self.hide_mode() hide_mode = self.get_hide_mode()
if hide_mode == HideMode.Blank: if hide_mode == HideMode.Theme and no_theme:
self.on_blank_display(True)
elif hide_mode == HideMode.Theme:
# The new item-type doesn't support theme-blanking, so 'switch' to normal blanking. # The new item-type doesn't support theme-blanking, so 'switch' to normal blanking.
if no_theme: self.set_hide_mode(HideMode.Blank)
self.on_blank_display(True)
else:
self.on_theme_display(True)
elif hide_mode == HideMode.Screen:
self.on_hide_display(True)
else: else:
self.hide_plugin(False) self.set_hide_mode(hide_mode)
def hide_mode(self): def get_hide_mode(self):
""" """
Determine what the hide mode should be according to the blank button Determine what the hide mode should be according to the blank button
""" """

View File

@ -27,6 +27,7 @@ from PyQt5 import QtCore, QtGui
from openlp.core.common.registry import Registry from openlp.core.common.registry import Registry
from openlp.core.lib import ServiceItemAction from openlp.core.lib import ServiceItemAction
from openlp.core.ui import HideMode
from openlp.core.ui.slidecontroller import NON_TEXT_MENU, WIDE_MENU, InfoLabel, LiveController, PreviewController, \ from openlp.core.ui.slidecontroller import NON_TEXT_MENU, WIDE_MENU, InfoLabel, LiveController, PreviewController, \
SlideController SlideController
@ -127,139 +128,184 @@ def test_receive_spin_delay(mock_settings):
def test_toggle_display_blank(settings): def test_toggle_display_blank(settings):
""" """
Check that the toggle_display('blank') method calls the on_blank_display() method Check that the toggle_display('blank') method calls set_hide_mode with the correct HideMode
""" """
# GIVEN: A new SlideController instance. # GIVEN: A new SlideController instance.
mocked_on_blank_display = MagicMock() mocked_set_hide_mode = MagicMock()
mocked_on_theme_display = MagicMock()
mocked_on_hide_display = MagicMock()
slide_controller = SlideController(None) slide_controller = SlideController(None)
slide_controller.on_blank_display = mocked_on_blank_display slide_controller.set_hide_mode = mocked_set_hide_mode
slide_controller.on_theme_display = mocked_on_theme_display
slide_controller.on_hide_display = mocked_on_hide_display
# WHEN: toggle_display() is called with an argument of "blank" # WHEN: toggle_display() is called with an argument of "blank"
slide_controller.toggle_display('blank') slide_controller.toggle_display('blank')
# THEN: Only on_blank_display() should have been called with an argument of True # THEN: set_hide_mode should have been called with an argument of HideMode.Blank
mocked_on_blank_display.assert_called_once_with(True) mocked_set_hide_mode.assert_called_once_with(HideMode.Blank)
assert 0 == mocked_on_theme_display.call_count, 'on_theme_display should not have been called'
assert 0 == mocked_on_hide_display.call_count, 'on_hide_display should not have been called'
def test_toggle_display_hide(settings): def test_toggle_display_hide(settings):
""" """
Check that the toggle_display('hide') method calls the on_blank_display() method Check that the toggle_display('hide') method calls set_hide_mode with the correct HideMode
""" """
# GIVEN: A new SlideController instance. # GIVEN: A new SlideController instance.
mocked_on_blank_display = MagicMock() mocked_set_hide_mode = MagicMock()
mocked_on_theme_display = MagicMock()
mocked_on_hide_display = MagicMock()
slide_controller = SlideController(None) slide_controller = SlideController(None)
slide_controller.on_blank_display = mocked_on_blank_display slide_controller.set_hide_mode = mocked_set_hide_mode
slide_controller.on_theme_display = mocked_on_theme_display
slide_controller.on_hide_display = mocked_on_hide_display
# WHEN: toggle_display() is called with an argument of "hide" # WHEN: toggle_display() is called with an argument of "hide"
slide_controller.toggle_display('hide') slide_controller.toggle_display('hide')
# THEN: Only on_blank_display() should have been called with an argument of True # THEN: set_hide_mode should have been called with an argument of HideMode.Blank
mocked_on_blank_display.assert_called_once_with(True) mocked_set_hide_mode.assert_called_once_with(HideMode.Blank)
assert 0 == mocked_on_theme_display.call_count, 'on_theme_display should not have been called'
assert 0 == mocked_on_hide_display.call_count, 'on_hide_display should not have been called'
def test_toggle_display_theme(settings): def test_toggle_display_theme(settings):
""" """
Check that the toggle_display('theme') method calls the on_theme_display() method Check that the toggle_display('theme') method calls set_hide_mode with the correct HideMode
""" """
# GIVEN: A new SlideController instance. # GIVEN: A new SlideController instance.
mocked_on_blank_display = MagicMock() mocked_set_hide_mode = MagicMock()
mocked_on_theme_display = MagicMock()
mocked_on_hide_display = MagicMock()
slide_controller = SlideController(None) slide_controller = SlideController(None)
slide_controller.on_blank_display = mocked_on_blank_display slide_controller.set_hide_mode = mocked_set_hide_mode
slide_controller.on_theme_display = mocked_on_theme_display
slide_controller.on_hide_display = mocked_on_hide_display
# WHEN: toggle_display() is called with an argument of "theme" # WHEN: toggle_display() is called with an argument of "theme"
slide_controller.toggle_display('theme') slide_controller.toggle_display('theme')
# THEN: Only on_theme_display() should have been called with an argument of True # THEN: set_hide_mode should have been called with an argument of HideMode.Theme
mocked_on_theme_display.assert_called_once_with(True) mocked_set_hide_mode.assert_called_once_with(HideMode.Theme)
assert 0 == mocked_on_blank_display.call_count, 'on_blank_display should not have been called'
assert 0 == mocked_on_hide_display.call_count, 'on_hide_display should not have been called'
def test_toggle_display_desktop(settings): def test_toggle_display_desktop(settings):
""" """
Check that the toggle_display('desktop') method calls the on_hide_display() method Check that the toggle_display('desktop') method calls set_hide_mode with the correct HideMode
""" """
# GIVEN: A new SlideController instance. # GIVEN: A new SlideController instance.
mocked_on_blank_display = MagicMock() mocked_set_hide_mode = MagicMock()
mocked_on_theme_display = MagicMock()
mocked_on_hide_display = MagicMock()
slide_controller = SlideController(None) slide_controller = SlideController(None)
slide_controller.on_blank_display = mocked_on_blank_display slide_controller.set_hide_mode = mocked_set_hide_mode
slide_controller.on_theme_display = mocked_on_theme_display
slide_controller.on_hide_display = mocked_on_hide_display
# WHEN: toggle_display() is called with an argument of "desktop" # WHEN: toggle_display() is called with an argument of "desktop"
slide_controller.toggle_display('desktop') slide_controller.toggle_display('desktop')
# THEN: Only on_hide_display() should have been called with an argument of True # THEN: set_hide_mode should have been called with an argument of HideMode.Screen
mocked_on_hide_display.assert_called_once_with(True) mocked_set_hide_mode.assert_called_once_with(HideMode.Screen)
assert 0 == mocked_on_blank_display.call_count, 'on_blank_display should not have been called'
assert 0 == mocked_on_theme_display.call_count, 'on_theme_display should not have been called'
def test_toggle_display_show(settings): def test_toggle_display_show(settings):
""" """
Check that the toggle_display('show') method calls all the on_X_display() methods Check that the toggle_display('show') method calls set_hide_mode with the correct HideMode
""" """
# GIVEN: A new SlideController instance. # GIVEN: A new SlideController instance.
mocked_on_blank_display = MagicMock() mocked_set_hide_mode = MagicMock()
mocked_on_theme_display = MagicMock()
mocked_on_hide_display = MagicMock()
slide_controller = SlideController(None) slide_controller = SlideController(None)
slide_controller.on_blank_display = mocked_on_blank_display slide_controller.set_hide_mode = mocked_set_hide_mode
slide_controller.on_theme_display = mocked_on_theme_display
slide_controller.on_hide_display = mocked_on_hide_display
# WHEN: toggle_display() is called with an argument of "show" # WHEN: toggle_display() is called with an argument of "show"
slide_controller.toggle_display('show') slide_controller.toggle_display('show')
# THEN: All the on_X_display() methods should have been called with an argument of False # THEN: set_hide_mode should have been called with an argument of None
mocked_on_blank_display.assert_called_once_with(False) mocked_set_hide_mode.assert_called_once_with(None)
mocked_on_theme_display.assert_called_once_with(False)
mocked_on_hide_display.assert_called_once_with(False)
def test_on_go_live_preview_controller(registry): def test_on_toggle_blank(settings):
""" """
Test that when the on_go_preview() method is called the message is sent to the preview controller and focus is Check that the on_toggle_blank method calls set_hide_mode with the correct HideMode
set correctly.
""" """
# GIVEN: A new SlideController instance and plugin preview then pressing go live should respond # GIVEN: A new SlideController instance, and get_hide_mode returns none.
mocked_display = MagicMock() mocked_set_hide_mode = MagicMock()
mocked_preview_controller = MagicMock()
mocked_preview_widget = MagicMock()
mocked_service_item = MagicMock()
mocked_service_item.from_service = False
mocked_preview_widget.current_slide_number.return_value = 1
mocked_preview_widget.slide_count = MagicMock(return_value=2)
mocked_preview_controller.preview_widget = MagicMock()
Registry().register('preview_controller', mocked_preview_controller)
slide_controller = SlideController(None) slide_controller = SlideController(None)
slide_controller.service_item = mocked_service_item slide_controller.set_hide_mode = mocked_set_hide_mode
slide_controller.preview_widget = mocked_preview_widget slide_controller.get_hide_mode = MagicMock(return_value=None)
slide_controller.displays = [mocked_display]
# WHEN: on_go_live() is called # WHEN: on_toggle_blank() is called
slide_controller.on_go_preview() slide_controller.on_toggle_blank()
# THEN: the preview controller should have the service item and the focus set to live # THEN: set_hide_mode should have been called with an argument of HideMode.Blank
mocked_preview_controller.preview_widget.setFocus.assert_called_once_with() mocked_set_hide_mode.assert_called_once_with(HideMode.Blank)
def test_on_toggle_blank_off(settings):
"""
Check that the on_toggle_blank method calls set_hide_mode with the correct HideMode
"""
# GIVEN: A new SlideController instance, and get_hide_mode returns blank.
mocked_set_hide_mode = MagicMock()
slide_controller = SlideController(None)
slide_controller.set_hide_mode = mocked_set_hide_mode
slide_controller.get_hide_mode = MagicMock(return_value=HideMode.Blank)
# WHEN: on_toggle_blank() is called
slide_controller.on_toggle_blank()
# THEN: set_hide_mode should have been called with an argument of None
mocked_set_hide_mode.assert_called_once_with(None)
def test_on_toggle_theme(settings):
"""
Check that the on_toggle_theme method calls set_hide_mode with the correct HideMode
"""
# GIVEN: A new SlideController instance, and get_hide_mode returns none.
mocked_set_hide_mode = MagicMock()
slide_controller = SlideController(None)
slide_controller.set_hide_mode = mocked_set_hide_mode
slide_controller.get_hide_mode = MagicMock(return_value=None)
# WHEN: on_toggle_theme() is called
slide_controller.on_toggle_theme()
# THEN: set_hide_mode should have been called with an argument of HideMode.Theme
mocked_set_hide_mode.assert_called_once_with(HideMode.Theme)
def test_on_toggle_theme_off(settings):
"""
Check that the on_toggle_theme method calls set_hide_mode with the correct HideMode
"""
# GIVEN: A new SlideController instance, and get_hide_mode returns Theme.
mocked_set_hide_mode = MagicMock()
slide_controller = SlideController(None)
slide_controller.set_hide_mode = mocked_set_hide_mode
slide_controller.get_hide_mode = MagicMock(return_value=HideMode.Theme)
# WHEN: on_toggle_theme() is called
slide_controller.on_toggle_theme()
# THEN: set_hide_mode should have been called with an argument of None
mocked_set_hide_mode.assert_called_once_with(None)
def test_on_toggle_desktop(settings):
"""
Check that the on_toggle_desktop method calls set_hide_mode with the correct HideMode
"""
# GIVEN: A new SlideController instance, and get_hide_mode returns none.
mocked_set_hide_mode = MagicMock()
slide_controller = SlideController(None)
slide_controller.set_hide_mode = mocked_set_hide_mode
slide_controller.get_hide_mode = MagicMock(return_value=None)
# WHEN: on_toggle_desktop() is called
slide_controller.on_toggle_desktop()
# THEN: set_hide_mode should have been called with an argument of HideMode.Screen
mocked_set_hide_mode.assert_called_once_with(HideMode.Screen)
def test_on_toggle_desktop_off(settings):
"""
Check that the on_toggle_desktop method calls set_hide_mode with the correct HideMode
"""
# GIVEN: A new SlideController instance, and get_hide_mode returns Screen.
mocked_set_hide_mode = MagicMock()
slide_controller = SlideController(None)
slide_controller.set_hide_mode = mocked_set_hide_mode
slide_controller.get_hide_mode = MagicMock(return_value=HideMode.Screen)
# WHEN: on_toggle_desktop() is called
slide_controller.on_toggle_desktop()
# THEN: set_hide_mode should have been called with an argument of None
mocked_set_hide_mode.assert_called_once_with(None)
def test_on_go_live_live_controller(registry): def test_on_go_live_live_controller(registry):
@ -576,36 +622,6 @@ def test_replace_service_manager_item_same_item(settings):
mocked_process_item.assert_called_once_with(mocked_item, 7) mocked_process_item.assert_called_once_with(mocked_item, 7)
def test_on_slide_blank(settings):
"""
Test on_slide_blank
"""
# GIVEN: An instance of SlideController and a mocked on_blank_display
slide_controller = SlideController(None)
slide_controller.on_blank_display = MagicMock()
# WHEN: Calling on_slide_blank
slide_controller.on_slide_blank()
# THEN: on_blank_display should have been called with True
slide_controller.on_blank_display.assert_called_once_with(True)
def test_on_slide_unblank(settings):
"""
Test on_slide_unblank
"""
# GIVEN: An instance of SlideController and a mocked on_blank_display
slide_controller = SlideController(None)
slide_controller.on_blank_display = MagicMock()
# WHEN: Calling on_slide_unblank
slide_controller.on_slide_unblank()
# THEN: on_blank_display should have been called with False
slide_controller.on_blank_display.assert_called_once_with(False)
def test_on_slide_selected_index_no_service_item(settings): def test_on_slide_selected_index_no_service_item(settings):
""" """
Test that when there is no service item, the on_slide_selected_index() method returns immediately Test that when there is no service item, the on_slide_selected_index() method returns immediately
@ -740,7 +756,7 @@ def test_live_stolen_focus_shortcuts(settings):
slide_controller.next_item = MagicMock() slide_controller.next_item = MagicMock()
slide_controller.previous_service = MagicMock() slide_controller.previous_service = MagicMock()
slide_controller.next_service = MagicMock() slide_controller.next_service = MagicMock()
slide_controller.desktop_screen_enable = MagicMock() slide_controller.show_screen = MagicMock()
slide_controller.desktop_screen = MagicMock() slide_controller.desktop_screen = MagicMock()
slide_controller.blank_screen = MagicMock() slide_controller.blank_screen = MagicMock()
slide_controller.theme_screen = MagicMock() slide_controller.theme_screen = MagicMock()
@ -752,7 +768,7 @@ def test_live_stolen_focus_shortcuts(settings):
mocked_widget.addActions.assert_called_with([ mocked_widget.addActions.assert_called_with([
slide_controller.previous_item, slide_controller.next_item, slide_controller.previous_item, slide_controller.next_item,
slide_controller.previous_service, slide_controller.next_service, slide_controller.previous_service, slide_controller.next_service,
slide_controller.desktop_screen_enable, slide_controller.desktop_screen, slide_controller.show_screen, slide_controller.desktop_screen,
slide_controller.theme_screen, slide_controller.blank_screen slide_controller.theme_screen, slide_controller.blank_screen
]) ])