diff --git a/openlp/core/common/settings.py b/openlp/core/common/settings.py index 8b7e0afb4..84fc6db96 100644 --- a/openlp/core/common/settings.py +++ b/openlp/core/common/settings.py @@ -182,13 +182,15 @@ class Settings(QtCore.QSettings): 'themes/wrap footer': False, 'user interface/live panel': True, 'user interface/live splitter geometry': QtCore.QByteArray(), - 'user interface/lock panel': False, + 'user interface/lock panel': True, 'user interface/main window geometry': QtCore.QByteArray(), 'user interface/main window position': QtCore.QPoint(0, 0), 'user interface/main window splitter geometry': QtCore.QByteArray(), 'user interface/main window state': QtCore.QByteArray(), 'user interface/preview panel': True, 'user interface/preview splitter geometry': QtCore.QByteArray(), + 'user interface/is preset layout': False, + 'projector/show after wizard': False, 'projector/db type': 'sqlite', 'projector/db username': '', 'projector/db password': '', diff --git a/openlp/core/ui/firsttimewizard.py b/openlp/core/ui/firsttimewizard.py index 61b82780b..9f740e5cf 100644 --- a/openlp/core/ui/firsttimewizard.py +++ b/openlp/core/ui/firsttimewizard.py @@ -24,7 +24,7 @@ The UI widgets for the first time wizard. """ from PyQt5 import QtCore, QtGui, QtWidgets -from openlp.core.common import translate, is_macosx, clean_button_text +from openlp.core.common import translate, is_macosx, clean_button_text, Settings from openlp.core.lib import build_icon from openlp.core.lib.ui import add_welcome_page @@ -136,6 +136,13 @@ class UiFirstTimeWizard(object): self.alert_check_box.setChecked(True) self.alert_check_box.setObjectName('alert_check_box') self.plugin_layout.addWidget(self.alert_check_box) + self.projectors_check_box = QtWidgets.QCheckBox(self.plugin_page) + # If visibility setting for projector panel is True, check the box. + if Settings().value('projector/show after wizard'): + self.projectors_check_box.setChecked(True) + self.projectors_check_box.setObjectName('projectors_check_box') + self.projectors_check_box.clicked.connect(self.on_projectors_check_box_clicked) + self.plugin_layout.addWidget(self.projectors_check_box) first_time_wizard.setPage(FirstTimePage.Plugins, self.plugin_page) # The song samples page self.songs_page = QtWidgets.QWizardPage() @@ -232,17 +239,28 @@ class UiFirstTimeWizard(object): 'downloaded.')) self.download_label.setText(translate('OpenLP.FirstTimeWizard', 'Please wait while OpenLP downloads the ' 'resource index file...')) - self.plugin_page.setTitle(translate('OpenLP.FirstTimeWizard', 'Activate required Plugins')) - self.plugin_page.setSubTitle(translate('OpenLP.FirstTimeWizard', 'Select the Plugins you wish to use. ')) + self.plugin_page.setTitle(translate('OpenLP.FirstTimeWizard', 'Select parts of the program you wish to use')) + self.plugin_page.setSubTitle(translate('OpenLP.FirstTimeWizard', + 'You can also change these settings after the Wizard.')) self.songs_check_box.setText(translate('OpenLP.FirstTimeWizard', 'Songs')) - self.custom_check_box.setText(translate('OpenLP.FirstTimeWizard', 'Custom Slides')) - self.bible_check_box.setText(translate('OpenLP.FirstTimeWizard', 'Bible')) - self.image_check_box.setText(translate('OpenLP.FirstTimeWizard', 'Images')) - self.presentation_check_box.setText(translate('OpenLP.FirstTimeWizard', 'Presentations')) - self.media_check_box.setText(translate('OpenLP.FirstTimeWizard', 'Media (Audio and Video)')) - self.remote_check_box.setText(translate('OpenLP.FirstTimeWizard', 'Allow remote access')) - self.song_usage_check_box.setText(translate('OpenLP.FirstTimeWizard', 'Monitor Song Usage')) - self.alert_check_box.setText(translate('OpenLP.FirstTimeWizard', 'Allow Alerts')) + self.custom_check_box.setText(translate('OpenLP.FirstTimeWizard', + 'Custom Slides – Easier to manage than songs and they have their own' + ' list of slides')) + self.bible_check_box.setText(translate('OpenLP.FirstTimeWizard', + 'Bibles – Import and show Bibles')) + self.image_check_box.setText(translate('OpenLP.FirstTimeWizard', + 'Images – Show images or replace background with them')) + self.presentation_check_box.setText(translate('OpenLP.FirstTimeWizard', + 'Presentations – Show .ppt, .odp and .pdf files')) + self.media_check_box.setText(translate('OpenLP.FirstTimeWizard', 'Media – Playback of Audio and Video files')) + self.remote_check_box.setText(translate('OpenLP.FirstTimeWizard', 'Remote – Control OpenLP via browser or smart' + 'phone app')) + self.song_usage_check_box.setText(translate('OpenLP.FirstTimeWizard', 'Song Usage Monitor')) + self.alert_check_box.setText(translate('OpenLP.FirstTimeWizard', + 'Alerts – Display informative messages while showing other slides')) + self.projectors_check_box.setText(translate('OpenLP.FirstTimeWizard', + 'Projectors – Control PJLink compatible projects on your network' + ' from OpenLP')) self.no_internet_page.setTitle(translate('OpenLP.FirstTimeWizard', 'No Internet Connection')) self.no_internet_page.setSubTitle( translate('OpenLP.FirstTimeWizard', 'Unable to detect an Internet connection.')) @@ -277,3 +295,10 @@ class UiFirstTimeWizard(object): clean_button_text(first_time_wizard.buttonText(QtWidgets.QWizard.FinishButton))) first_time_wizard.setButtonText(QtWidgets.QWizard.CustomButton2, clean_button_text(first_time_wizard.buttonText(QtWidgets.QWizard.CancelButton))) + + def on_projectors_check_box_clicked(self): + # When clicking projectors_check box, change the visibility setting for Projectors panel. + if Settings().value('projector/show after wizard'): + Settings().setValue('projector/show after wizard', False) + else: + Settings().setValue('projector/show after wizard', True) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 228969ad1..ac3c19aa4 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -638,13 +638,15 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow, RegistryProperties): self.open_cmd_line_files(self.arguments) elif Settings().value(self.general_settings_section + '/auto open'): self.service_manager_contents.load_last_file() + # This will store currently used layout preset so it remains enabled on next startup. + # If any panel is enabled/disabled after preset is set, this setting is not saved. view_mode = Settings().value('%s/view mode' % self.general_settings_section) - if view_mode == 'default': + if view_mode == 'default' and Settings().value('user interface/is preset layout'): self.mode_default_item.setChecked(True) - elif view_mode == 'setup': + elif view_mode == 'setup' and Settings().value('user interface/is preset layout'): self.set_view_mode(True, True, False, True, False, True) self.mode_setup_item.setChecked(True) - elif view_mode == 'live': + elif view_mode == 'live' and Settings().value('user interface/is preset layout'): self.set_view_mode(False, True, False, False, True, True) self.mode_live_item.setChecked(True) @@ -696,6 +698,11 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow, RegistryProperties): return self.application.set_busy_cursor() self.first_time() + # Check if Projectors panel should be visible or not after wizard. + if Settings().value('projector/show after wizard'): + self.projector_manager_dock.setVisible(True) + else: + self.projector_manager_dock.setVisible(False) for plugin in self.plugin_manager.plugins: self.active_plugin = plugin old_status = self.active_plugin.status @@ -1027,18 +1034,24 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow, RegistryProperties): Put OpenLP into "Default" view mode. """ self.set_view_mode(True, True, True, True, True, True, 'default') + Settings().setValue('user interface/is preset layout', True) + Settings().setValue('projector/show after wizard', True) def on_mode_setup_item_clicked(self): """ Put OpenLP into "Setup" view mode. """ self.set_view_mode(True, True, False, True, False, True, 'setup') + Settings().setValue('user interface/is preset layout', True) + Settings().setValue('projector/show after wizard', True) def on_mode_live_item_clicked(self): """ Put OpenLP into "Live" view mode. """ self.set_view_mode(False, True, False, False, True, True, 'live') + Settings().setValue('user interface/is preset layout', True) + Settings().setValue('projector/show after wizard', True) def set_view_mode(self, media=True, service=True, theme=True, preview=True, live=True, projector=True, mode=''): """ @@ -1176,24 +1189,33 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow, RegistryProperties): Toggle the visibility of the media manager """ self.media_manager_dock.setVisible(not self.media_manager_dock.isVisible()) + Settings().setValue('user interface/is preset layout', False) def toggle_projector_manager(self): """ Toggle visibility of the projector manager """ self.projector_manager_dock.setVisible(not self.projector_manager_dock.isVisible()) + Settings().setValue('user interface/is preset layout', False) + # Check/uncheck checkbox on First time wizard based on visibility of this panel. + if not Settings().value('projector/show after wizard'): + Settings().setValue('projector/show after wizard', True) + else: + Settings().setValue('projector/show after wizard', False) def toggle_service_manager(self): """ Toggle the visibility of the service manager """ self.service_manager_dock.setVisible(not self.service_manager_dock.isVisible()) + Settings().setValue('user interface/is preset layout', False) def toggle_theme_manager(self): """ Toggle the visibility of the theme manager """ self.theme_manager_dock.setVisible(not self.theme_manager_dock.isVisible()) + Settings().setValue('user interface/is preset layout', False) def set_preview_panel_visibility(self, visible): """ @@ -1207,6 +1229,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow, RegistryProperties): self.preview_controller.panel.setVisible(visible) Settings().setValue('user interface/preview panel', visible) self.view_preview_panel.setChecked(visible) + Settings().setValue('user interface/is preset layout', False) def set_lock_panel(self, lock): """ @@ -1217,6 +1240,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow, RegistryProperties): self.service_manager_dock.setFeatures(QtWidgets.QDockWidget.NoDockWidgetFeatures) self.media_manager_dock.setFeatures(QtWidgets.QDockWidget.NoDockWidgetFeatures) self.projector_manager_dock.setFeatures(QtWidgets.QDockWidget.NoDockWidgetFeatures) + self.view_mode_menu.setEnabled(False) self.view_media_manager_item.setEnabled(False) self.view_service_manager_item.setEnabled(False) self.view_theme_manager_item.setEnabled(False) @@ -1228,6 +1252,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow, RegistryProperties): self.service_manager_dock.setFeatures(QtWidgets.QDockWidget.AllDockWidgetFeatures) self.media_manager_dock.setFeatures(QtWidgets.QDockWidget.AllDockWidgetFeatures) self.projector_manager_dock.setFeatures(QtWidgets.QDockWidget.AllDockWidgetFeatures) + self.view_mode_menu.setEnabled(True) self.view_media_manager_item.setEnabled(True) self.view_service_manager_item.setEnabled(True) self.view_theme_manager_item.setEnabled(True) @@ -1248,6 +1273,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow, RegistryProperties): self.live_controller.panel.setVisible(visible) Settings().setValue('user interface/live panel', visible) self.view_live_panel.setChecked(visible) + Settings().setValue('user interface/is preset layout', False) def load_settings(self): """ diff --git a/tests/functional/openlp_core_ui/test_mainwindow.py b/tests/functional/openlp_core_ui/test_mainwindow.py index 8dcfd0518..8a8b2516c 100644 --- a/tests/functional/openlp_core_ui/test_mainwindow.py +++ b/tests/functional/openlp_core_ui/test_mainwindow.py @@ -26,6 +26,8 @@ import os from unittest import TestCase +from PyQt5 import QtWidgets + from openlp.core.ui.mainwindow import MainWindow from openlp.core.lib.ui import UiStrings from openlp.core.common.registry import Registry @@ -189,3 +191,57 @@ class TestMainWindow(TestCase, TestMixin): # THEN: The media manager dock is made visible self.assertEqual(0, mocked_media_manager_dock.setVisible.call_count) mocked_widget.on_focus.assert_called_with() + + @patch('openlp.core.ui.mainwindow.MainWindow.plugin_manager') + @patch('openlp.core.ui.mainwindow.MainWindow.first_time') + @patch('openlp.core.ui.mainwindow.MainWindow.application') + @patch('openlp.core.ui.mainwindow.FirstTimeForm') + @patch('openlp.core.ui.mainwindow.QtWidgets.QMessageBox.warning') + @patch('openlp.core.ui.mainwindow.Settings') + def on_first_time_wizard_clicked_show_projectors_after_test(self, mocked_Settings, mocked_warning, + mocked_FirstTimeForm, mocked_application, + mocked_first_time, + mocked_plugin_manager): + # GIVEN: Main_window, patched things, patched "Yes" as confirmation to re-run wizard, settings to True. + mocked_Settings_obj = MagicMock() + mocked_Settings_obj.value.return_value = True + mocked_Settings.return_value = mocked_Settings_obj + mocked_warning.return_value = QtWidgets.QMessageBox.Yes + mocked_FirstTimeForm_obj = MagicMock() + mocked_FirstTimeForm_obj.was_cancelled = False + mocked_FirstTimeForm.return_value = mocked_FirstTimeForm_obj + mocked_plugin_manager.plugins = [] + self.main_window.projector_manager_dock = MagicMock() + + # WHEN: on_first_time_wizard_clicked is called + self.main_window.on_first_time_wizard_clicked() + + # THEN: projector_manager_dock.setVisible should had been called once + self.main_window.projector_manager_dock.setVisible.assert_called_once_with(True) + + @patch('openlp.core.ui.mainwindow.MainWindow.plugin_manager') + @patch('openlp.core.ui.mainwindow.MainWindow.first_time') + @patch('openlp.core.ui.mainwindow.MainWindow.application') + @patch('openlp.core.ui.mainwindow.FirstTimeForm') + @patch('openlp.core.ui.mainwindow.QtWidgets.QMessageBox.warning') + @patch('openlp.core.ui.mainwindow.Settings') + def on_first_time_wizard_clicked_hide_projectors_after_test(self, mocked_Settings, mocked_warning, + mocked_FirstTimeForm, mocked_application, + mocked_first_time, + mocked_plugin_manager): + # GIVEN: Main_window, patched things, patched "Yes" as confirmation to re-run wizard, settings to False. + mocked_Settings_obj = MagicMock() + mocked_Settings_obj.value.return_value = False + mocked_Settings.return_value = mocked_Settings_obj + mocked_warning.return_value = QtWidgets.QMessageBox.Yes + mocked_FirstTimeForm_obj = MagicMock() + mocked_FirstTimeForm_obj.was_cancelled = False + mocked_FirstTimeForm.return_value = mocked_FirstTimeForm_obj + mocked_plugin_manager.plugins = [] + self.main_window.projector_manager_dock = MagicMock() + + # WHEN: on_first_time_wizard_clicked is called + self.main_window.on_first_time_wizard_clicked() + + # THEN: projector_manager_dock.setVisible should had been called once + self.main_window.projector_manager_dock.setVisible.assert_called_once_with(False)