← Back to team overview

openlp-core team mailing list archive

[Merge] lp:~raoul-snyman/openlp/mac-niggles into lp:openlp

 

Raoul Snyman has proposed merging lp:~raoul-snyman/openlp/mac-niggles into lp:openlp.

Requested reviews:
  OpenLP Core (openlp-core)
Related bugs:
  Bug #1591749 in OpenLP: "Mediainfo in Windows trunk results in traceback"
  https://bugs.launchpad.net/openlp/+bug/1591749
  Bug #1645867 in OpenLP: "Spinners in Theme Wizard segfault on OS X"
  https://bugs.launchpad.net/openlp/+bug/1645867

For more details, see:
https://code.launchpad.net/~raoul-snyman/openlp/mac-niggles/+merge/313403

Fix segfault on click on a spinner on macOS
Fix spurious traceback on some platforms or configurations of media players
Make the tab style affect only the media library tabs, not everything else too
Hide the splash screen when the backup dialog shows and when the exception form shows


Add this to your merge proposal:
--------------------------------
lp:~raoul-snyman/openlp/mac-niggles (revision 2713)
[SUCCESS] https://ci.openlp.io/job/Branch-01-Pull/1873/
[SUCCESS] https://ci.openlp.io/job/Branch-02-Functional-Tests/1784/
[SUCCESS] https://ci.openlp.io/job/Branch-03-Interface-Tests/1723/
[SUCCESS] https://ci.openlp.io/job/Branch-04a-Windows_Functional_Tests/1462/
[SUCCESS] https://ci.openlp.io/job/Branch-04b-Windows_Interface_Tests/1052/
[SUCCESS] https://ci.openlp.io/job/Branch-05a-Code_Analysis/1120/
[SUCCESS] https://ci.openlp.io/job/Branch-05b-Test_Coverage/988/
[SUCCESS] https://ci.openlp.io/job/Branch-05c-Code_Analysis2/139/

-- 
Your team OpenLP Core is requested to review the proposed merge of lp:~raoul-snyman/openlp/mac-niggles into lp:openlp.
=== modified file 'openlp/core/__init__.py'
--- openlp/core/__init__.py	2016-11-21 20:21:31 +0000
+++ openlp/core/__init__.py	2016-12-15 22:20:16 +0000
@@ -129,21 +129,21 @@
             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')
@@ -224,13 +224,20 @@
             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
 
         :param has_run_wizard: OpenLP has been run before
+        :param can_show_splash: Should OpenLP show the splash screen
         """
         data_version = Settings().value('core/application version')
         openlp_version = get_application_version()['version']
@@ -239,6 +246,8 @@
             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\n'
                                                                   'a backup of the old data folder?'),
@@ -261,6 +270,8 @@
 
             # Update the version in the settings
             Settings().setValue('core/application version', openlp_version)
+            if can_show_splash:
+                self.splash.show()
 
     def process_events(self):
         """
@@ -375,6 +386,7 @@
     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)

=== modified file 'openlp/core/common/settings.py'
--- openlp/core/common/settings.py	2016-10-23 19:24:53 +0000
+++ openlp/core/common/settings.py	2016-12-15 22:20:16 +0000
@@ -216,8 +216,8 @@
         ('advanced/default color', 'core/logo background color', []),  # Default image renamed + moved to general > 2.4.
         ('advanced/default image', 'core/logo file', []),  # Default image renamed + moved to general after 2.4.
         ('shortcuts/escapeItem', 'shortcuts/desktopScreenEnable', []),  # Escape item was removed in 2.6.
-        ('shortcuts/offlineHelpItem', 'shortcuts/HelpItem', []),  # Online and Offline help were combined in 2.6.
-        ('shortcuts/onlineHelpItem', 'shortcuts/HelpItem', [])  # 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.
     ]
 
     @staticmethod
@@ -276,7 +276,7 @@
             'shortcuts/fileSaveItem': [QtGui.QKeySequence(QtGui.QKeySequence.Save)],
             'shortcuts/fileOpenItem': [QtGui.QKeySequence(QtGui.QKeySequence.Open)],
             'shortcuts/goLive': [],
-            'shortcuts/HelpItem': [QtGui.QKeySequence(QtGui.QKeySequence.HelpContents)],
+            'shortcuts/userManualItem': [QtGui.QKeySequence(QtGui.QKeySequence.HelpContents)],
             'shortcuts/importThemeItem': [],
             'shortcuts/importBibleItem': [],
             'shortcuts/listViewBiblesDeleteItem': [QtGui.QKeySequence(QtGui.QKeySequence.Delete)],

=== modified file 'openlp/core/ui/mainwindow.py'
--- openlp/core/ui/mainwindow.py	2016-12-13 06:41:59 +0000
+++ openlp/core/ui/mainwindow.py	2016-12-15 22:20:16 +0000
@@ -52,7 +52,7 @@
 log = logging.getLogger(__name__)
 
 MEDIA_MANAGER_STYLE = """
-::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: 0;
@@ -61,10 +61,8 @@
     margin-bottom: 0;
     text-align: left;
 }
-::tab:selected {
-    border: 1px solid palette(highlight);
-    font-weight: bold;
-}
+/* This is here to make the tabs on KDE with the Breeze theme work */
+::tab:selected {}
 """
 
 PROGRESSBAR_STYLE = """
@@ -310,10 +308,9 @@
         elif is_macosx():
             self.local_help_file = os.path.join(AppLocation.get_directory(AppLocation.AppDir),
                                                 '..', 'Resources', 'OpenLP.help')
-        self.on_help_item = create_action(main_window, 'HelpItem',
-                                          icon=':/system/system_help_contents.png',
-                                          can_shortcuts=True,
-                                          category=UiStrings().Help, triggers=self.on_help_clicked)
+        self.user_manual_item = create_action(main_window, 'userManualItem', icon=':/system/system_help_contents.png',
+                                              can_shortcuts=True, category=UiStrings().Help,
+                                              triggers=self.on_help_clicked)
         self.web_site_item = create_action(main_window, 'webSiteItem', can_shortcuts=True, category=UiStrings().Help)
         # Shortcuts not connected to buttons or menu entries.
         self.search_shortcut_action = create_action(main_window,
@@ -352,7 +349,7 @@
         add_actions(self.tools_menu, (self.tools_open_data_folder, None))
         add_actions(self.tools_menu, (self.tools_first_time_wizard, None))
         add_actions(self.tools_menu, [self.update_theme_images])
-        add_actions(self.help_menu, (self.on_help_item, None, self.web_site_item, self.about_item))
+        add_actions(self.help_menu, (self.user_manual_item, None, self.web_site_item, self.about_item))
         add_actions(self.menu_bar, (self.file_menu.menuAction(), self.view_menu.menuAction(),
                     self.tools_menu.menuAction(), self.settings_menu.menuAction(), self.help_menu.menuAction()))
         add_actions(self, [self.search_shortcut_action])
@@ -448,7 +445,7 @@
                                                                                    'from here.'))
         self.about_item.setText(translate('OpenLP.MainWindow', '&About'))
         self.about_item.setStatusTip(translate('OpenLP.MainWindow', 'More information about OpenLP.'))
-        self.on_help_item.setText(translate('OpenLP.MainWindow', '&User Manual'))
+        self.user_manual_item.setText(translate('OpenLP.MainWindow', '&User Manual'))
         self.search_shortcut_action.setText(UiStrings().Search)
         self.search_shortcut_action.setToolTip(
             translate('OpenLP.MainWindow', 'Jump to the search box of the current active plugin.'))

=== modified file 'openlp/core/ui/themewizard.py'
--- openlp/core/ui/themewizard.py	2016-10-27 17:45:50 +0000
+++ openlp/core/ui/themewizard.py	2016-12-15 22:20:16 +0000
@@ -44,9 +44,9 @@
         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)

=== added file 'tests/functional/openlp_core_ui/test_shortcutlistdialog.py'
--- tests/functional/openlp_core_ui/test_shortcutlistdialog.py	1970-01-01 00:00:00 +0000
+++ tests/functional/openlp_core_ui/test_shortcutlistdialog.py	2016-12-15 22:20:16 +0000
@@ -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.shortcutlistdialog package.
+"""
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+from openlp.core.ui.shortcutlistdialog import CaptureShortcutButton, ShortcutTreeWidget
+
+from tests.interfaces import MagicMock, patch
+
+
+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

=== modified file 'tests/functional/test_init.py'
--- tests/functional/test_init.py	2016-05-31 21:40:13 +0000
+++ tests/functional/test_init.py	2016-12-15 22:20:16 +0000
@@ -102,7 +102,7 @@
             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 @@
             '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()


Follow ups