From 41593f73ffad3f1046ee87942e693e04040ccc5c Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Wed, 30 Nov 2016 00:12:46 +0200 Subject: [PATCH 1/6] Fix bug #1645867 by setting an application attribute related to OpenGL Fixes: https://launchpad.net/bugs/1645867 --- openlp/core/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openlp/core/__init__.py b/openlp/core/__init__.py index 196317b06..92511fb1c 100644 --- a/openlp/core/__init__.py +++ b/openlp/core/__init__.py @@ -342,6 +342,7 @@ def main(args=None): application.setOrganizationName('OpenLP') application.setOrganizationDomain('openlp.org') application.setAttribute(QtCore.Qt.AA_UseHighDpiPixmaps, True) + application.setAttribute(QtCore.Qt.AA_DontCreateNativeWidgetSiblings, True) if args and args.portable: application.setApplicationName('OpenLPPortable') Settings.setDefaultFormat(Settings.IniFormat) From df900b3e9e90dee470e3c5cbfef1abcdcf68b52a Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Fri, 16 Dec 2016 22:03:26 +0200 Subject: [PATCH 2/6] Set the width of the Theme wizard so that it doesn't resize by itself --- openlp/core/ui/themewizard.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/ui/themewizard.py b/openlp/core/ui/themewizard.py index b041a0905..b735890e2 100644 --- a/openlp/core/ui/themewizard.py +++ b/openlp/core/ui/themewizard.py @@ -43,9 +43,9 @@ class Ui_ThemeWizard(object): theme_wizard.setModal(True) theme_wizard.setOptions(QtWidgets.QWizard.IndependentPages | QtWidgets.QWizard.NoBackButtonOnStartPage | QtWidgets.QWizard.HaveCustomButton1) + theme_wizard.setFixedWidth(640) if is_macosx(): theme_wizard.setPixmap(QtWidgets.QWizard.BackgroundPixmap, QtGui.QPixmap(':/wizards/openlp-osx-wizard.png')) - theme_wizard.resize(646, 400) else: theme_wizard.setWizardStyle(QtWidgets.QWizard.ModernStyle) self.spacer = QtWidgets.QSpacerItem(10, 0, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) From 5620e73c904bb836b191bf22a68d7d28cb484965 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Fri, 16 Dec 2016 22:06:42 +0200 Subject: [PATCH 3/6] Hide the splash screen when the backup dialog shows and when the exception form shows --- openlp/core/__init__.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/openlp/core/__init__.py b/openlp/core/__init__.py index 92511fb1c..48032c113 100644 --- a/openlp/core/__init__.py +++ b/openlp/core/__init__.py @@ -129,21 +129,21 @@ class OpenLP(OpenLPMixin, QtWidgets.QApplication): application_stylesheet += WIN_REPAIR_STYLESHEET if application_stylesheet: self.setStyleSheet(application_stylesheet) - show_splash = Settings().value('core/show splash') - if show_splash: + can_show_splash = Settings().value('core/show splash') + if can_show_splash: self.splash = SplashScreen() self.splash.show() # make sure Qt really display the splash screen self.processEvents() # Check if OpenLP has been upgrade and if a backup of data should be created - self.backup_on_upgrade(has_run_wizard) + self.backup_on_upgrade(has_run_wizard, can_show_splash) # start the main app window self.main_window = MainWindow() Registry().execute('bootstrap_initialise') Registry().execute('bootstrap_post_set_up') Registry().initialise = False self.main_window.show() - if show_splash: + if can_show_splash: # now kill the splashscreen self.splash.finish(self.main_window) log.debug('Splashscreen closed') @@ -192,9 +192,15 @@ class OpenLP(OpenLPMixin, QtWidgets.QApplication): self.exception_form = ExceptionForm() self.exception_form.exception_text_edit.setPlainText(''.join(format_exception(exc_type, value, traceback))) self.set_normal_cursor() + is_splash_visible = False + if hasattr(self, 'splash') and self.splash.isVisible(): + is_splash_visible = True + self.splash.hide() self.exception_form.exec() + if is_splash_visible: + self.splash.show() - def backup_on_upgrade(self, has_run_wizard): + def backup_on_upgrade(self, has_run_wizard, can_show_splash): """ Check if OpenLP has been upgraded, and ask if a backup of data should be made @@ -207,6 +213,8 @@ class OpenLP(OpenLPMixin, QtWidgets.QApplication): Settings().setValue('core/application version', openlp_version) # If data_version is different from the current version ask if we should backup the data folder elif data_version != openlp_version: + if self.splash.isVisible(): + self.splash.hide() if QtWidgets.QMessageBox.question(None, translate('OpenLP', 'Backup'), translate('OpenLP', 'OpenLP has been upgraded, do you want to create ' 'a backup of OpenLPs data folder?'), @@ -228,6 +236,8 @@ class OpenLP(OpenLPMixin, QtWidgets.QApplication): % data_folder_backup_path) # Update the version in the settings Settings().setValue('core/application version', openlp_version) + if can_show_splash: + self.splash.show() def process_events(self): """ From d47c66f8331cd159a36b339646d1a21ac2207ab9 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Fri, 16 Dec 2016 22:11:24 +0200 Subject: [PATCH 4/6] Add icons back into the media library tabs --- openlp/core/ui/mainwindow.py | 20 ++++++++------------ openlp/core/ui/mediadockmanager.py | 2 +- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 4427de655..46f063974 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -52,21 +52,17 @@ from openlp.core.ui.printserviceform import PrintServiceForm log = logging.getLogger(__name__) MEDIA_MANAGER_STYLE = """ -QToolBox { - padding-bottom: 2px; -} -QToolBox::tab { +::tab#media_tool_box { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 palette(button), stop: 1.0 palette(mid)); - border: 1px solid palette(mid); - border-radius: 3px; -} -QToolBox::tab:selected { - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 palette(light), stop: 1.0 palette(button)); - border: 1px solid palette(mid); - font-weight: bold; + border: 0; + border-radius: 2px; + margin-bottom: 0; + margin-top: 0; + text-align: left; } +/* This is here to make the tabs on KDE with the Breeze theme work */ +::tab:selected {} """ PROGRESSBAR_STYLE = """ diff --git a/openlp/core/ui/mediadockmanager.py b/openlp/core/ui/mediadockmanager.py index ad786b3a0..1a7676465 100644 --- a/openlp/core/ui/mediadockmanager.py +++ b/openlp/core/ui/mediadockmanager.py @@ -54,7 +54,7 @@ class MediaDockManager(object): match = True break if not match: - self.media_dock.addItem(media_item, visible_title['title']) + self.media_dock.addItem(media_item, media_item.plugin.icon, visible_title['title']) def remove_dock(self, media_item): """ From 203ebde628bdee2361093dcf8d1cc525dc4a6074 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Fri, 16 Dec 2016 22:56:38 +0200 Subject: [PATCH 5/6] Move the shortcut test to a better place and add another test for the about form --- .../openlp_core_ui/test_aboutform.py | 41 ++++++++----- .../openlp_core_ui/test_shortcutlistdialog.py | 60 +++++++++++++++++++ tests/functional/test_init.py | 8 ++- 3 files changed, 92 insertions(+), 17 deletions(-) create mode 100644 tests/functional/openlp_core_ui/test_shortcutlistdialog.py diff --git a/tests/functional/openlp_core_ui/test_aboutform.py b/tests/functional/openlp_core_ui/test_aboutform.py index 612c6b887..12af3b770 100644 --- a/tests/functional/openlp_core_ui/test_aboutform.py +++ b/tests/functional/openlp_core_ui/test_aboutform.py @@ -22,26 +22,37 @@ """ Package to test the openlp.core.ui.firsttimeform package. """ -from unittest import TestCase +from unittest.mock import patch from openlp.core.ui.aboutform import AboutForm -from tests.functional import patch -from tests.helpers.testmixin import TestMixin + +@patch('openlp.core.ui.aboutform.get_application_version') +def test_create_about_form(mocked_get_application_version): + """ + Test creating an about form + """ + # GIVEN: An application version with a build number + mocked_get_application_version.return_value = {'version': '3.1.1', 'build': '3000'} + + # WHEN: The about form is created + about_form = AboutForm(None) + + # THEN: The correct version information should be in the dialog + assert 'OpenLP 3.1.1 build 3000' in about_form.about_text_edit.toPlainText() -class TestFirstTimeForm(TestCase, TestMixin): - def test_on_volunteer_button_clicked(self): - """ - Test that clicking on the "Volunteer" button opens a web page. - """ - # GIVEN: A new About dialog and a mocked out webbrowser module - with patch('openlp.core.ui.aboutform.webbrowser') as mocked_webbrowser: - about_form = AboutForm(None) +@patch('openlp.core.ui.aboutform.webbrowser') +def test_on_volunteer_button_clicked(mocked_webbrowser): + """ + Test that clicking on the "Volunteer" button opens a web page. + """ + # GIVEN: A new About dialog and a mocked out webbrowser module + about_form = AboutForm(None) - # WHEN: The "Volunteer" button is "clicked" - about_form.on_volunteer_button_clicked() + # WHEN: The "Volunteer" button is "clicked" + about_form.on_volunteer_button_clicked() - # THEN: A web browser is opened - mocked_webbrowser.open_new.assert_called_with('http://openlp.org/en/contribute') + # THEN: A web browser is opened + mocked_webbrowser.open_new.assert_called_with('http://openlp.org/en/contribute') diff --git a/tests/functional/openlp_core_ui/test_shortcutlistdialog.py b/tests/functional/openlp_core_ui/test_shortcutlistdialog.py new file mode 100644 index 000000000..e79d1920d --- /dev/null +++ b/tests/functional/openlp_core_ui/test_shortcutlistdialog.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2016 OpenLP Developers # +# --------------------------------------------------------------------------- # +# This program is free software; you can redistribute it and/or modify it # +# under the terms of the GNU General Public License as published by the Free # +# Software Foundation; version 2 of the License. # +# # +# This program is distributed in the hope that it will be useful, but WITHOUT # +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # +# more details. # +# # +# You should have received a copy of the GNU General Public License along # +# with this program; if not, write to the Free Software Foundation, Inc., 59 # +# Temple Place, Suite 330, Boston, MA 02111-1307 USA # +############################################################################### +""" +Package to test the openlp.core.ui.shortcutdialog package. +""" +from unittest.mock import MagicMock + +from PyQt5 import QtCore + +from openlp.core.ui.shortcutlistdialog import CaptureShortcutButton, ShortcutTreeWidget + + +def test_key_press_event(): + """ + Test the keyPressEvent method + """ + # GIVEN: A checked button and a mocked event + button = CaptureShortcutButton() + button.setChecked(True) + mocked_event = MagicMock() + mocked_event.key.return_value = QtCore.Qt.Key_Space + + # WHEN: keyPressEvent is called with an event that should be ignored + button.keyPressEvent(mocked_event) + + # THEN: The ignore() method on the event should have been called + mocked_event.ignore.assert_called_once_with() + + +def test_keyboard_search(): + """ + Test the keyboardSearch method of the ShortcutTreeWidget + """ + # GIVEN: A ShortcutTreeWidget + widget = ShortcutTreeWidget() + + # WHEN: keyboardSearch() is called + widget.keyboardSearch('') + + # THEN: Nothing happens + assert True diff --git a/tests/functional/test_init.py b/tests/functional/test_init.py index fcd275d33..863811cbf 100644 --- a/tests/functional/test_init.py +++ b/tests/functional/test_init.py @@ -102,7 +102,7 @@ class TestInit(TestCase, TestMixin): mocked_question.return_value = QtWidgets.QMessageBox.No # WHEN: We check if a backup should be created - self.openlp.backup_on_upgrade(old_install) + self.openlp.backup_on_upgrade(old_install, False) # THEN: It should not ask if we want to create a backup self.assertEqual(Settings().value('core/application version'), '2.2.0', 'Version should be the same!') @@ -120,14 +120,18 @@ class TestInit(TestCase, TestMixin): 'build': 'bzr000' } Settings().setValue('core/application version', '2.0.5') + self.openlp.splash = MagicMock() + self.openlp.splash.isVisible.return_value = True with patch('openlp.core.get_application_version') as mocked_get_application_version,\ patch('openlp.core.QtWidgets.QMessageBox.question') as mocked_question: mocked_get_application_version.return_value = MOCKED_VERSION mocked_question.return_value = QtWidgets.QMessageBox.No # WHEN: We check if a backup should be created - self.openlp.backup_on_upgrade(old_install) + self.openlp.backup_on_upgrade(old_install, True) # THEN: It should ask if we want to create a backup self.assertEqual(Settings().value('core/application version'), '2.2.0', 'Version should be upgraded!') self.assertEqual(mocked_question.call_count, 1, 'A question should have been asked!') + self.openlp.splash.hide.assert_called_once_with() + self.openlp.splash.show.assert_called_once_with() From 36008338b25b5b005ee3febcfe65ce733dfb0825 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Fri, 16 Dec 2016 23:02:11 +0200 Subject: [PATCH 6/6] Too many open lines --- .../openlp_core_ui/test_aboutform.py | 1 - .../openlp_core_ui/test_shortcutlistform.py | 32 ------------------- 2 files changed, 33 deletions(-) diff --git a/tests/functional/openlp_core_ui/test_aboutform.py b/tests/functional/openlp_core_ui/test_aboutform.py index 12af3b770..68d815e81 100644 --- a/tests/functional/openlp_core_ui/test_aboutform.py +++ b/tests/functional/openlp_core_ui/test_aboutform.py @@ -42,7 +42,6 @@ def test_create_about_form(mocked_get_application_version): assert 'OpenLP 3.1.1 build 3000' in about_form.about_text_edit.toPlainText() - @patch('openlp.core.ui.aboutform.webbrowser') def test_on_volunteer_button_clicked(mocked_webbrowser): """ diff --git a/tests/interfaces/openlp_core_ui/test_shortcutlistform.py b/tests/interfaces/openlp_core_ui/test_shortcutlistform.py index e1f249785..095e2caad 100644 --- a/tests/interfaces/openlp_core_ui/test_shortcutlistform.py +++ b/tests/interfaces/openlp_core_ui/test_shortcutlistform.py @@ -28,7 +28,6 @@ from PyQt5 import QtCore, QtGui, QtWidgets from openlp.core.common import Registry from openlp.core.ui.shortcutlistform import ShortcutListForm -from openlp.core.ui.shortcutlistdialog import CaptureShortcutButton, ShortcutTreeWidget from tests.interfaces import MagicMock, patch from tests.helpers.testmixin import TestMixin @@ -228,34 +227,3 @@ class TestShortcutform(TestCase, TestMixin): mocked_action_shortcuts.assert_called_with(mocked_action) mocked_refresh_shortcut_list.assert_called_with() mocked_set_text.assert_called_with('Esc') - - -def test_key_press_event(): - """ - Test the keyPressEvent method - """ - # GIVEN: A checked button and a mocked event - button = CaptureShortcutButton() - button.setChecked(True) - mocked_event = MagicMock() - mocked_event.key.return_value = QtCore.Qt.Key_Space - - # WHEN: keyPressEvent is called with an event that should be ignored - button.keyPressEvent(mocked_event) - - # THEN: The ignore() method on the event should have been called - mocked_event.ignore.assert_called_once_with() - - -def test_keyboard_search(): - """ - Test the keyboardSearch method of the ShortcutTreeWidget - """ - # GIVEN: A ShortcutTreeWidget - widget = ShortcutTreeWidget() - - # WHEN: keyboardSearch() is called - widget.keyboardSearch('') - - # THEN: Nothing happens - assert True