openlp-core team mailing list archive
-
openlp-core team
-
Mailing list archive
-
Message #25538
[Merge] lp:~raoul-snyman/openlp/bug-1314469 into lp:openlp
Raoul Snyman has proposed merging lp:~raoul-snyman/openlp/bug-1314469 into lp:openlp.
Requested reviews:
OpenLP Core (openlp-core)
Related bugs:
Bug #1314469 in OpenLP: "Glow/Border on KDE in openSUSE 13.1 with Oxygen Theme"
https://bugs.launchpad.net/openlp/+bug/1314469
For more details, see:
https://code.launchpad.net/~raoul-snyman/openlp/bug-1314469/+merge/246060
[bug 1314469] Fix the border seen in the main display on KDE by not overwriting that bit of the stylesheet
--
Your team OpenLP Core is requested to review the proposed merge of lp:~raoul-snyman/openlp/bug-1314469 into lp:openlp.
=== modified file 'openlp/core/ui/maindisplay.py'
--- openlp/core/ui/maindisplay.py 2014-12-31 10:58:13 +0000
+++ openlp/core/ui/maindisplay.py 2015-01-11 15:07:44 +0000
@@ -38,20 +38,37 @@
import cgi
import logging
-import sys
from PyQt4 import QtCore, QtGui, QtWebKit, QtOpenGL
from PyQt4.phonon import Phonon
from openlp.core.common import Registry, RegistryProperties, OpenLPMixin, Settings, translate, is_macosx
-from openlp.core.lib import ServiceItem, ImageSource, build_html, expand_tags, image_to_byte
+from openlp.core.lib import ServiceItem, ImageSource, ScreenList, build_html, expand_tags, image_to_byte
from openlp.core.lib.theme import BackgroundType
-
-from openlp.core.lib import ScreenList
from openlp.core.ui import HideMode, AlertLocation
log = logging.getLogger(__name__)
+OPAQUE_STYLESHEET = """
+QWidget {
+ border: 0px;
+ margin: 0px;
+ padding: 0px;
+}
+QGraphicsView {}
+"""
+TRANSPARENT_STYLESHEET = """
+QWidget {
+ border: 0px;
+ margin: 0px;
+ padding: 0px;
+}
+QGraphicsView {
+ background: transparent;
+ border: 0px;
+}
+"""
+
class Display(QtGui.QGraphicsView):
"""
@@ -135,7 +152,7 @@
self.audio_player = None
self.first_time = True
self.web_loaded = True
- self.setStyleSheet('border: 0px; margin: 0px; padding: 0px;')
+ self.setStyleSheet(OPAQUE_STYLESHEET)
window_flags = QtCore.Qt.FramelessWindowHint | QtCore.Qt.Tool | QtCore.Qt.WindowStaysOnTopHint
if Settings().value('advanced/x11 bypass wm'):
window_flags |= QtCore.Qt.X11BypassWindowManagerHint
@@ -175,10 +192,10 @@
"""
if enabled:
self.setAutoFillBackground(False)
- self.setStyleSheet("QGraphicsView {background: transparent; border: 0px;}")
+ self.setStyleSheet(TRANSPARENT_STYLESHEET)
else:
self.setAttribute(QtCore.Qt.WA_NoSystemBackground, False)
- self.setStyleSheet("QGraphicsView {}")
+ self.setStyleSheet(OPAQUE_STYLESHEET)
self.setAttribute(QtCore.Qt.WA_TranslucentBackground, enabled)
self.repaint()
=== modified file 'tests/functional/openlp_core_ui/test_maindisplay.py'
--- tests/functional/openlp_core_ui/test_maindisplay.py 2014-12-31 10:58:13 +0000
+++ tests/functional/openlp_core_ui/test_maindisplay.py 2015-01-11 15:07:44 +0000
@@ -36,8 +36,10 @@
from openlp.core.common import Registry
from openlp.core.lib import ScreenList
from openlp.core.ui import MainDisplay
+from openlp.core.ui.maindisplay import TRANSPARENT_STYLESHEET, OPAQUE_STYLESHEET
-from tests.interfaces import MagicMock, patch
+from tests.helpers.testmixin import TestMixin
+from tests.interfaces import MagicMock
SCREEN = {
'primary': False,
@@ -46,7 +48,7 @@
}
-class TestMainDisplay(TestCase):
+class TestMainDisplay(TestCase, TestMixin):
def setUp(self):
"""
@@ -59,6 +61,9 @@
self.desktop.screenGeometry.return_value = SCREEN['size']
self.screens = ScreenList.create(self.desktop)
Registry.create()
+ self.registry = Registry()
+ self.setup_application()
+ Registry().register('application', self.app)
def tearDown(self):
"""
@@ -80,30 +85,60 @@
# THEN: The controller should not be a live controller.
self.assertEqual(main_display.is_live, True, 'The main display should be a live controller')
- def set_transparency_test(self):
- """
- Test creating an instance of the MainDisplay class
- """
- # GIVEN: get an instance of MainDisplay
+ def set_transparency_enabled_test(self):
+ """
+ Test setting the display to be transparent
+ """
+ # GIVEN: An instance of MainDisplay
display = MagicMock()
main_display = MainDisplay(display)
- # WHEN: We enable transparency
+ # WHEN: Transparency is enabled
main_display.set_transparency(True)
- # THEN: There should be a Stylesheet
- self.assertEqual('QGraphicsView {background: transparent; border: 0px;}', main_display.styleSheet(),
- 'MainDisplay instance should be transparent')
+ # THEN: The transparent stylesheet should be used
+ self.assertEqual(TRANSPARENT_STYLESHEET, main_display.styleSheet(),
+ 'The MainDisplay should use the transparent stylesheet')
self.assertFalse(main_display.autoFillBackground(),
- 'MainDisplay instance should be without background auto fill')
+ 'The MainDisplay should not have autoFillBackground set')
self.assertTrue(main_display.testAttribute(QtCore.Qt.WA_TranslucentBackground),
- 'MainDisplay hasnt translucent background')
-
- # WHEN: We disable transparency
+ 'The MainDisplay should have a translucent background')
+
+ def set_transparency_disabled_test(self):
+ """
+ Test setting the display to be opaque
+ """
+ # GIVEN: An instance of MainDisplay
+ display = MagicMock()
+ main_display = MainDisplay(display)
+
+ # WHEN: Transparency is disabled
main_display.set_transparency(False)
- # THEN: The Stylesheet should be empty
- self.assertEqual('QGraphicsView {}', main_display.styleSheet(),
- 'MainDisplay instance should not be transparent')
+ # THEN: The opaque stylesheet should be used
+ self.assertEqual(OPAQUE_STYLESHEET, main_display.styleSheet(),
+ 'The MainDisplay should use the opaque stylesheet')
self.assertFalse(main_display.testAttribute(QtCore.Qt.WA_TranslucentBackground),
- 'MainDisplay hasnt translucent background')
+ 'The MainDisplay should not have a translucent background')
+
+ def css_changed_test(self):
+ """
+ Test that when the CSS changes, the plugins are looped over and given an opportunity to update the CSS
+ """
+ # GIVEN: A mocked list of plugins, a mocked display and a MainDisplay
+ mocked_songs_plugin = MagicMock()
+ mocked_bibles_plugin = MagicMock()
+ mocked_plugin_manager = MagicMock()
+ mocked_plugin_manager.plugins = [mocked_songs_plugin, mocked_bibles_plugin]
+ Registry().register('plugin_manager', mocked_plugin_manager)
+ display = MagicMock()
+ main_display = MainDisplay(display)
+ # This is set up dynamically, so we need to mock it out for now
+ main_display.frame = MagicMock()
+
+ # WHEN: The css_changed() method is triggered
+ main_display.css_changed()
+
+ # THEN: The plugins should have each been given an opportunity to add their bit to the CSS
+ mocked_songs_plugin.refresh_css.assert_called_with(main_display.frame)
+ mocked_bibles_plugin.refresh_css.assert_called_with(main_display.frame)
=== modified file 'tests/functional/openlp_core_ui/test_mainwindow.py'
--- tests/functional/openlp_core_ui/test_mainwindow.py 2014-12-31 10:58:13 +0000
+++ tests/functional/openlp_core_ui/test_mainwindow.py 2015-01-11 15:07:44 +0000
@@ -36,9 +36,10 @@
from openlp.core.ui.mainwindow import MainWindow
from openlp.core.lib.ui import UiStrings
from openlp.core.common.registry import Registry
+
+from tests.functional import MagicMock, patch
+from tests.helpers.testmixin import TestMixin
from tests.utils.constants import TEST_RESOURCES_PATH
-from tests.helpers.testmixin import TestMixin
-from tests.functional import MagicMock, patch
class TestMainWindow(TestCase, TestMixin):
=== modified file 'tests/interfaces/openlp_core_common/test_historycombobox.py'
--- tests/interfaces/openlp_core_common/test_historycombobox.py 2014-12-31 10:58:13 +0000
+++ tests/interfaces/openlp_core_common/test_historycombobox.py 2015-01-11 15:07:44 +0000
@@ -42,6 +42,9 @@
class TestHistoryComboBox(TestCase, TestMixin):
def setUp(self):
+ """
+ Some pre-test setup required.
+ """
Registry.create()
self.setup_application()
self.main_window = QtGui.QMainWindow()
@@ -49,9 +52,13 @@
self.combo = HistoryComboBox(self.main_window)
def tearDown(self):
+ """
+ Delete all the C++ objects at the end so that we don't have a segfault
+ """
del self.combo
+ del self.main_window
- def getItems_test(self):
+ def get_items_test(self):
"""
Test the getItems() method
"""
=== modified file 'tests/interfaces/openlp_core_lib/test_pluginmanager.py'
--- tests/interfaces/openlp_core_lib/test_pluginmanager.py 2014-12-31 10:58:13 +0000
+++ tests/interfaces/openlp_core_lib/test_pluginmanager.py 2015-01-11 15:07:44 +0000
@@ -63,9 +63,9 @@
Registry().register('main_window', self.main_window)
def tearDown(self):
- del self.main_window
Settings().remove('advanced/data path')
self.destroy_settings()
+ del self.main_window
# On windows we need to manually garbage collect to close sqlalchemy files
# to avoid errors when temporary files are deleted.
gc.collect()
@@ -86,12 +86,12 @@
# THEN: We should find the "Songs", "Bibles", etc in the plugins list
plugin_names = [plugin.name for plugin in plugin_manager.plugins]
- assert 'songs' in plugin_names, 'There should be a "songs" plugin.'
- assert 'bibles' in plugin_names, 'There should be a "bibles" plugin.'
- assert 'presentations' in plugin_names, 'There should be a "presentations" plugin.'
- assert 'images' in plugin_names, 'There should be a "images" plugin.'
- assert 'media' in plugin_names, 'There should be a "media" plugin.'
- assert 'custom' in plugin_names, 'There should be a "custom" plugin.'
- assert 'songusage' in plugin_names, 'There should be a "songusage" plugin.'
- assert 'alerts' in plugin_names, 'There should be a "alerts" plugin.'
- assert 'remotes' in plugin_names, 'There should be a "remotes" plugin.'
+ self.assertIn('songs', plugin_names, 'There should be a "songs" plugin')
+ self.assertIn('bibles', plugin_names, 'There should be a "bibles" plugin')
+ self.assertIn('presentations', plugin_names, 'There should be a "presentations" plugin')
+ self.assertIn('images', plugin_names, 'There should be a "images" plugin')
+ self.assertIn('media', plugin_names, 'There should be a "media" plugin')
+ self.assertIn('custom', plugin_names, 'There should be a "custom" plugin')
+ self.assertIn('songusage', plugin_names, 'There should be a "songusage" plugin')
+ self.assertIn('alerts', plugin_names, 'There should be a "alerts" plugin')
+ self.assertIn('remotes', plugin_names, 'There should be a "remotes" plugin')
=== modified file 'tests/interfaces/openlp_core_lib/test_searchedit.py'
--- tests/interfaces/openlp_core_lib/test_searchedit.py 2014-12-31 10:58:13 +0000
+++ tests/interfaces/openlp_core_lib/test_searchedit.py 2015-01-11 15:07:44 +0000
@@ -35,10 +35,14 @@
from openlp.core.common import Registry
from openlp.core.lib.searchedit import SearchEdit
+
from tests.helpers.testmixin import TestMixin
class SearchTypes(object):
+ """
+ Types of search
+ """
First = 0
Second = 1
@@ -69,6 +73,7 @@
"""
Delete all the C++ objects at the end so that we don't have a segfault
"""
+ del self.search_edit
del self.main_window
def set_search_types_test(self):
=== modified file 'tests/interfaces/openlp_core_ui/__init__.py'
--- tests/interfaces/openlp_core_ui/__init__.py 2014-12-31 10:58:13 +0000
+++ tests/interfaces/openlp_core_ui/__init__.py 2015-01-11 15:07:44 +0000
@@ -31,14 +31,17 @@
"""
import os
+
+from openlp.core.common import is_win
+
from tests.interfaces import patch
-
-from openlp.core.common import is_win
-
from .test_projectormanager import tmpfile
def setUp():
+ """
+ Set up this module of tests
+ """
if not is_win():
# Wine creates a sharing violation during tests. Ignore.
try:
=== modified file 'tests/interfaces/openlp_core_ui/test_projectormanager.py'
--- tests/interfaces/openlp_core_ui/test_projectormanager.py 2014-12-31 10:58:13 +0000
+++ tests/interfaces/openlp_core_ui/test_projectormanager.py 2015-01-11 15:07:44 +0000
@@ -70,8 +70,8 @@
Delete all the C++ objects at the end so that we don't have a segfault.
"""
self.projectordb.session.close()
+ self.destroy_settings()
del self.projector_manager
- self.destroy_settings()
def bootstrap_initialise_test(self):
"""
=== modified file 'tests/interfaces/openlp_core_ui/test_thememanager.py'
--- tests/interfaces/openlp_core_ui/test_thememanager.py 2014-12-31 10:58:13 +0000
+++ tests/interfaces/openlp_core_ui/test_thememanager.py 2015-01-11 15:07:44 +0000
@@ -54,8 +54,8 @@
"""
Delete all the C++ objects at the end so that we don't have a segfault
"""
-
self.destroy_settings()
+ del self.theme_manager
def initialise_test(self):
"""
=== modified file 'tests/interfaces/openlp_plugins/bibles/test_lib_manager.py'
--- tests/interfaces/openlp_plugins/bibles/test_lib_manager.py 2014-12-31 10:58:13 +0000
+++ tests/interfaces/openlp_plugins/bibles/test_lib_manager.py 2015-01-11 15:07:44 +0000
@@ -73,6 +73,7 @@
"""
Delete all the C++ objects at the end so that we don't have a segfault
"""
+ del self.manager
self.destroy_settings()
def get_books_test(self):
=== modified file 'tests/interfaces/openlp_plugins/bibles/test_lib_parse_reference.py'
--- tests/interfaces/openlp_plugins/bibles/test_lib_parse_reference.py 2014-12-31 10:58:13 +0000
+++ tests/interfaces/openlp_plugins/bibles/test_lib_parse_reference.py 2015-01-11 15:07:44 +0000
@@ -73,6 +73,7 @@
"""
Delete all the C++ objects at the end so that we don't have a segfault
"""
+ del self.manager
self.destroy_settings()
def parse_reference_one_test(self):
=== modified file 'tests/interfaces/openlp_plugins/custom/forms/test_customform.py'
--- tests/interfaces/openlp_plugins/custom/forms/test_customform.py 2014-12-31 10:58:13 +0000
+++ tests/interfaces/openlp_plugins/custom/forms/test_customform.py 2015-01-11 15:07:44 +0000
@@ -34,7 +34,7 @@
from PyQt4 import QtGui, QtTest, QtCore
from openlp.core.common import Registry
-# Import needed due to import problems.
+# TODO: FIXME: Import needed due to horrible bad imports
from openlp.plugins.custom.lib.mediaitem import CustomMediaItem
from openlp.plugins.custom.forms.editcustomform import EditCustomForm
from tests.interfaces import MagicMock, patch
=== modified file 'tests/interfaces/openlp_plugins/media/forms/test_mediaclipselectorform.py'
--- tests/interfaces/openlp_plugins/media/forms/test_mediaclipselectorform.py 2014-12-31 10:58:13 +0000
+++ tests/interfaces/openlp_plugins/media/forms/test_mediaclipselectorform.py 2015-01-11 15:07:44 +0000
@@ -76,8 +76,8 @@
"""
Delete all the C++ objects at the end so that we don't have a segfault
"""
+ del self.form
self.vlc_patcher.stop()
- del self.form
del self.main_window
def basic_test(self):