From 8bb88f3c9f2a44b1efe7c375d3ae6682866ac855 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sun, 10 Feb 2013 13:29:42 +0100 Subject: [PATCH 01/24] fixed bug 1112587 Fixes: https://launchpad.net/bugs/1112587 --- openlp/core/ui/slidecontroller.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 607ae1dd5..4424081df 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -90,7 +90,6 @@ class SlideController(DisplayController): u'delaySpinBox' ] self.audioList = [ - u'songMenu', u'audioPauseItem', u'audioTimeLabel' ] @@ -293,6 +292,7 @@ class SlideController(DisplayController): self.audioTimeLabel.setObjectName(u'audioTimeLabel') self.toolbar.addToolbarWidget(self.audioTimeLabel) self.toolbar.setWidgetVisible(self.audioList, False) + self.toolbar.setWidgetVisible([u'songMenu'], False) # Screen preview area self.previewFrame = QtGui.QFrame(self.splitter) self.previewFrame.setGeometry(QtCore.QRect(0, 0, 300, 300 * self.ratio)) @@ -650,6 +650,7 @@ class SlideController(DisplayController): self.mediabar.hide() self.songMenu.hide() self.toolbar.setWidgetVisible(self.loopList, False) + self.toolbar.setWidgetVisible([u'songMenu'], False) # Reset the button self.playSlidesOnce.setChecked(False) self.playSlidesOnce.setIcon(build_icon(u':/media/media_time.png')) @@ -657,7 +658,7 @@ class SlideController(DisplayController): self.playSlidesLoop.setIcon(build_icon(u':/media/media_time.png')) if item.is_text(): if Settings().value(self.parent().songsSettingsSection + u'/display songbar') and self.slideList: - self.songMenu.show() + self.toolbar.setWidgetVisible([u'songMenu'], True) if item.is_capable(ItemCapabilities.CanLoop) and len(item.get_frames()) > 1: self.toolbar.setWidgetVisible(self.loopList) if item.is_media(): From 6eba926a70ed98b03201e07eee218ebb2e8fa2b8 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sun, 10 Feb 2013 20:08:37 +0100 Subject: [PATCH 02/24] improved hide menu behaviour --- openlp/core/ui/slidecontroller.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 4424081df..540b1f563 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -602,10 +602,14 @@ class SlideController(DisplayController): Change layout of display control buttons on controller size change """ if self.isLive: - if width > 300 and self.hideMenu.isVisible(): + # Space used by the toolbar. + used_space = self.toolbar.size().width() + self.hideMenu.size().width() + # The + 40 is needed to prevent flickering. This can be considered a "buffer". + if width > used_space + 40 and self.hideMenu.isVisible(): self.toolbar.setWidgetVisible(self.hideMenuList, False) self.toolbar.setWidgetVisible(self.wideMenu) - elif width < 300 and not self.hideMenu.isVisible(): + # The - 40 is needed to prevent flickering. This can be considered a "buffer". + elif width < used_space - 40 and not self.hideMenu.isVisible(): self.toolbar.setWidgetVisible(self.wideMenu, False) self.toolbar.setWidgetVisible(self.hideMenuList) From b119783a2c9b9197f373e9953a50f7959f489685 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 11 Feb 2013 18:08:32 +0000 Subject: [PATCH 03/24] Start of settings tests --- .../openlp_core_lib/test_settings.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 tests/functional/openlp_core_lib/test_settings.py diff --git a/tests/functional/openlp_core_lib/test_settings.py b/tests/functional/openlp_core_lib/test_settings.py new file mode 100644 index 000000000..18158eda1 --- /dev/null +++ b/tests/functional/openlp_core_lib/test_settings.py @@ -0,0 +1,19 @@ +""" + Package to test the openlp.core.lib package. +""" +import os + +from unittest import TestCase +from mock import MagicMock +from openlp.core.lib import Settings + +TESTPATH = os.path.abspath(os.path.join(os.path.dirname(__file__), u'..', u'..', u'resources')) + +class TestSettings(TestCase): + + def settings_basic_test(self): + """ + Test the Settings creation and its usage + """ + # GIVEN: A new Settings + settings = Settings() From b4a3833858293973054019bf90d944eb3268ff45 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 11 Feb 2013 19:20:08 +0000 Subject: [PATCH 04/24] Fix up tests - initial --- openlp/core/lib/settings.py | 2 +- .../openlp_core_lib/test_settings.py | 36 +++++++++++++++++-- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/openlp/core/lib/settings.py b/openlp/core/lib/settings.py index 7e72c6d4c..ce41198c4 100644 --- a/openlp/core/lib/settings.py +++ b/openlp/core/lib/settings.py @@ -343,7 +343,7 @@ class Settings(QtCore.QSettings): """ # On OS X (and probably on other platforms too) empty value from QSettings is represented as type # PyQt4.QtCore.QPyNullVariant. This type has to be converted to proper 'None' Python type. - if isinstance(setting, QtCore.QPyNullVariant) and setting.isNull(): + if setting.isNull() and isinstance(setting, QtCore.QPyNullVariant): setting = None # Handle 'None' type (empty value) properly. if setting is None: diff --git a/tests/functional/openlp_core_lib/test_settings.py b/tests/functional/openlp_core_lib/test_settings.py index 18158eda1..2cc0f2ee4 100644 --- a/tests/functional/openlp_core_lib/test_settings.py +++ b/tests/functional/openlp_core_lib/test_settings.py @@ -7,13 +7,43 @@ from unittest import TestCase from mock import MagicMock from openlp.core.lib import Settings +from PyQt4 import QtGui, QtTest + TESTPATH = os.path.abspath(os.path.join(os.path.dirname(__file__), u'..', u'..', u'resources')) class TestSettings(TestCase): + def setUp(self): + """ + Create the UI + """ + self.application = QtGui.QApplication([]) + self.application.setOrganizationName(u'OpenLP-tests') + self.application.setOrganizationDomain(u'openlp.org') + Settings() + + def tearDown(self): + """ + Delete all the C++ objects at the end so that we don't have a segfault + """ + del self.application + os.remove(Settings().fileName()) + def settings_basic_test(self): """ - Test the Settings creation and its usage + Test the Settings creation and its default usage """ - # GIVEN: A new Settings - settings = Settings() + # GIVEN: A new Settings setup + + # WHEN reading a setting for the first time + default_value = Settings().value(u'general/has run wizard') + + # THEN the default value is returned + assert default_value is False, u'The default value defined is returned' + + # WHEN a new value is saved into config + Settings().setValue(u'general/has run wizard', True) + + # THEN the new value is returned when re-read + assert Settings().value(u'general/has run wizard') is True, u'The saved value is returned' + From 19f9cb8c248534eca8c67d55da22fb404a6ae92c Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 11 Feb 2013 19:48:38 +0000 Subject: [PATCH 05/24] Fix key error in tests --- openlp/core/lib/settings.py | 3 +- .../openlp_core_lib/test_settings.py | 45 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/openlp/core/lib/settings.py b/openlp/core/lib/settings.py index ce41198c4..d75179d9f 100644 --- a/openlp/core/lib/settings.py +++ b/openlp/core/lib/settings.py @@ -322,7 +322,8 @@ class Settings(QtCore.QSettings): """ # if group() is not empty the group has not been specified together with the key. if self.group(): - default_value = Settings.__default_settings__[self.group() + u'/' + key] + qq = self.group() + u'/' + key + default_value = Settings.__default_settings__[unicode(self.group() + u'/' + key)] else: default_value = Settings.__default_settings__[key] setting = super(Settings, self).value(key, default_value) diff --git a/tests/functional/openlp_core_lib/test_settings.py b/tests/functional/openlp_core_lib/test_settings.py index 2cc0f2ee4..dfe6f4974 100644 --- a/tests/functional/openlp_core_lib/test_settings.py +++ b/tests/functional/openlp_core_lib/test_settings.py @@ -47,3 +47,48 @@ class TestSettings(TestCase): # THEN the new value is returned when re-read assert Settings().value(u'general/has run wizard') is True, u'The saved value is returned' + def settings_override_test(self): + """ + Test the Settings creation and its override usage + """ + # GIVEN: an override for the settings + screen_settings = { + u'test/extend': u'very wide', + } + Settings().extend_default_settings(screen_settings) + + # WHEN reading a setting for the first time + extend = Settings().value(u'test/extend') + + # THEN the default value is returned + assert extend == u'very wide', u'The default value defined is returned' + + # WHEN a new value is saved into config + Settings().setValue(u'test/extend', u'very short') + + # THEN the new value is returned when re-read + assert Settings().value(u'test/extend') == u'very short', u'The saved value is returned' + + def settings_override_with_group_test(self): + """ + Test the Settings creation and its override usage - with groups + """ + # GIVEN: an override for the settings + screen_settings = { + u'test/extend': u'very wide', + } + Settings.extend_default_settings(screen_settings) + + # WHEN reading a setting for the first time + settings = Settings() + settings.beginGroup(u'test') + extend = settings.value(u'extend') + + # THEN the default value is returned + assert extend == u'very wide', u'The default value defined is returned' + + # WHEN a new value is saved into config + Settings().setValue(u'test/extend', u'very short') + + # THEN the new value is returned when re-read + assert Settings().value(u'test/extend') == u'very short', u'The saved value is returned' \ No newline at end of file From 5bc10bf1a9f8ef2ea0af271ee8f3a9b9c2eb88a1 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 11 Feb 2013 19:54:18 +0000 Subject: [PATCH 06/24] Fix delete issue --- tests/functional/openlp_core_lib/test_settings.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/functional/openlp_core_lib/test_settings.py b/tests/functional/openlp_core_lib/test_settings.py index dfe6f4974..48cc7fead 100644 --- a/tests/functional/openlp_core_lib/test_settings.py +++ b/tests/functional/openlp_core_lib/test_settings.py @@ -27,7 +27,10 @@ class TestSettings(TestCase): Delete all the C++ objects at the end so that we don't have a segfault """ del self.application - os.remove(Settings().fileName()) + try: + os.remove(Settings().fileName()) + except: + pass def settings_basic_test(self): """ From a73d4cce08ae1f80f8b99bd38e45dedaae1b8f26 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Tue, 12 Feb 2013 16:42:09 +0000 Subject: [PATCH 07/24] Fix review comments --- openlp/core/lib/settings.py | 1 - tests/functional/openlp_core_lib/test_settings.py | 14 +++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/openlp/core/lib/settings.py b/openlp/core/lib/settings.py index d75179d9f..e9085477f 100644 --- a/openlp/core/lib/settings.py +++ b/openlp/core/lib/settings.py @@ -322,7 +322,6 @@ class Settings(QtCore.QSettings): """ # if group() is not empty the group has not been specified together with the key. if self.group(): - qq = self.group() + u'/' + key default_value = Settings.__default_settings__[unicode(self.group() + u'/' + key)] else: default_value = Settings.__default_settings__[key] diff --git a/tests/functional/openlp_core_lib/test_settings.py b/tests/functional/openlp_core_lib/test_settings.py index 48cc7fead..fd43b901e 100644 --- a/tests/functional/openlp_core_lib/test_settings.py +++ b/tests/functional/openlp_core_lib/test_settings.py @@ -4,13 +4,13 @@ import os from unittest import TestCase -from mock import MagicMock from openlp.core.lib import Settings from PyQt4 import QtGui, QtTest TESTPATH = os.path.abspath(os.path.join(os.path.dirname(__file__), u'..', u'..', u'resources')) + class TestSettings(TestCase): def setUp(self): @@ -29,7 +29,7 @@ class TestSettings(TestCase): del self.application try: os.remove(Settings().fileName()) - except: + except OSError: pass def settings_basic_test(self): @@ -42,13 +42,13 @@ class TestSettings(TestCase): default_value = Settings().value(u'general/has run wizard') # THEN the default value is returned - assert default_value is False, u'The default value defined is returned' + assert default_value is False, u'The default value defined has not been returned' # WHEN a new value is saved into config Settings().setValue(u'general/has run wizard', True) # THEN the new value is returned when re-read - assert Settings().value(u'general/has run wizard') is True, u'The saved value is returned' + assert Settings().value(u'general/has run wizard') is True, u'The saved value has not been returned' def settings_override_test(self): """ @@ -79,7 +79,7 @@ class TestSettings(TestCase): # GIVEN: an override for the settings screen_settings = { u'test/extend': u'very wide', - } + } Settings.extend_default_settings(screen_settings) # WHEN reading a setting for the first time @@ -88,10 +88,10 @@ class TestSettings(TestCase): extend = settings.value(u'extend') # THEN the default value is returned - assert extend == u'very wide', u'The default value defined is returned' + assert extend == u'very wide', u'The default value defined has not been returned' # WHEN a new value is saved into config Settings().setValue(u'test/extend', u'very short') # THEN the new value is returned when re-read - assert Settings().value(u'test/extend') == u'very short', u'The saved value is returned' \ No newline at end of file + assert Settings().value(u'test/extend') == u'very short', u'The saved value has not been returned' From 193e96ee5ab02407d72ebc8fb18bc5016ee8ceb3 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Tue, 12 Feb 2013 18:37:51 +0000 Subject: [PATCH 08/24] Unicode madness --- openlp/core/lib/settings.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/openlp/core/lib/settings.py b/openlp/core/lib/settings.py index e9085477f..eff6a36eb 100644 --- a/openlp/core/lib/settings.py +++ b/openlp/core/lib/settings.py @@ -343,8 +343,13 @@ class Settings(QtCore.QSettings): """ # On OS X (and probably on other platforms too) empty value from QSettings is represented as type # PyQt4.QtCore.QPyNullVariant. This type has to be converted to proper 'None' Python type. - if setting.isNull() and isinstance(setting, QtCore.QPyNullVariant): - setting = None + # Python wants the test one way but nose wants it the other way Madness! + try: + if isinstance(setting, QtCore.QPyNullVariant) and setting.isNull(): + setting = None + except AttributeError: + if setting.isNull() and isinstance(setting, QtCore.QPyNullVariant): + setting = None # Handle 'None' type (empty value) properly. if setting is None: # An empty string saved to the settings results in a None type being returned. From 6be6a54d6e56ba7e0770a225ae75bb6a95bdf92c Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Wed, 13 Feb 2013 17:33:37 +0000 Subject: [PATCH 09/24] Fix tests in the correct manner --- openlp/core/lib/settings.py | 11 +++-------- tests/functional/openlp_core_lib/__init__.py | 8 ++++++++ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/openlp/core/lib/settings.py b/openlp/core/lib/settings.py index eff6a36eb..7e72c6d4c 100644 --- a/openlp/core/lib/settings.py +++ b/openlp/core/lib/settings.py @@ -322,7 +322,7 @@ class Settings(QtCore.QSettings): """ # if group() is not empty the group has not been specified together with the key. if self.group(): - default_value = Settings.__default_settings__[unicode(self.group() + u'/' + key)] + default_value = Settings.__default_settings__[self.group() + u'/' + key] else: default_value = Settings.__default_settings__[key] setting = super(Settings, self).value(key, default_value) @@ -343,13 +343,8 @@ class Settings(QtCore.QSettings): """ # On OS X (and probably on other platforms too) empty value from QSettings is represented as type # PyQt4.QtCore.QPyNullVariant. This type has to be converted to proper 'None' Python type. - # Python wants the test one way but nose wants it the other way Madness! - try: - if isinstance(setting, QtCore.QPyNullVariant) and setting.isNull(): - setting = None - except AttributeError: - if setting.isNull() and isinstance(setting, QtCore.QPyNullVariant): - setting = None + if isinstance(setting, QtCore.QPyNullVariant) and setting.isNull(): + setting = None # Handle 'None' type (empty value) properly. if setting is None: # An empty string saved to the settings results in a None type being returned. diff --git a/tests/functional/openlp_core_lib/__init__.py b/tests/functional/openlp_core_lib/__init__.py index e69de29bb..e0da50eb3 100644 --- a/tests/functional/openlp_core_lib/__init__.py +++ b/tests/functional/openlp_core_lib/__init__.py @@ -0,0 +1,8 @@ +import sip +sip.setapi(u'QDate', 2) +sip.setapi(u'QDateTime', 2) +sip.setapi(u'QString', 2) +sip.setapi(u'QTextStream', 2) +sip.setapi(u'QTime', 2) +sip.setapi(u'QUrl', 2) +sip.setapi(u'QVariant', 2) \ No newline at end of file From bd0ff619a9a6fc8ffdede6a5255340964b5ba45e Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Thu, 14 Feb 2013 21:31:17 +0000 Subject: [PATCH 10/24] Clean up settings and alerts --- openlp/core/lib/settings.py | 7 +- openlp/core/ui/exceptionform.py | 11 +- openlp/core/ui/maindisplay.py | 12 +- openlp/core/ui/slidecontroller.py | 41 ++++-- openlp/plugins/alerts/alertsplugin.py | 9 +- openlp/plugins/alerts/forms/alertdialog.py | 116 +++++++-------- openlp/plugins/alerts/forms/alertform.py | 138 +++++++++--------- openlp/plugins/alerts/lib/alertsmanager.py | 17 ++- .../openlp_core_lib/test_settings.py | 2 +- 9 files changed, 192 insertions(+), 161 deletions(-) diff --git a/openlp/core/lib/settings.py b/openlp/core/lib/settings.py index 56821f1d1..e16b41e30 100644 --- a/openlp/core/lib/settings.py +++ b/openlp/core/lib/settings.py @@ -36,9 +36,8 @@ import sys from PyQt4 import QtCore, QtGui -from openlp.core.lib import SlideLimits +from openlp.core.lib import SlideLimits, UiStrings from openlp.core.lib.theme import ThemeLevel -from openlp.core.lib import UiStrings log = logging.getLogger(__name__) @@ -70,7 +69,8 @@ class Settings(QtCore.QSettings): ``__obsolete_settings__`` Each entry is structured in the following way:: - (u'general/enable slide loop', u'advanced/slide limits', [(SlideLimits.Wrap, True), (SlideLimits.End, False)]) + (u'general/enable slide loop', u'advanced/slide limits', + [(SlideLimits.Wrap, True), (SlideLimits.End, False)]) The first entry is the *old key*; it will be removed. @@ -259,7 +259,6 @@ class Settings(QtCore.QSettings): """ Settings.__default_settings__ = dict(default_values.items() + Settings.__default_settings__.items()) - @staticmethod def set_filename(ini_file): """ diff --git a/openlp/core/ui/exceptionform.py b/openlp/core/ui/exceptionform.py index 0d8a7c74f..50885b15b 100644 --- a/openlp/core/ui/exceptionform.py +++ b/openlp/core/ui/exceptionform.py @@ -106,7 +106,7 @@ class ExceptionForm(QtGui.QDialog, Ui_ExceptionDialog): """ QtGui.QDialog.__init__(self, parent) self.setupUi(self) - self.settingsSection = u'crashreport' + self.settings_section = u'crashreport' def exec_(self): """ @@ -159,12 +159,11 @@ class ExceptionForm(QtGui.QDialog, Ui_ExceptionDialog): '--- Library Versions ---\n%s\n') filename = QtGui.QFileDialog.getSaveFileName(self, translate('OpenLP.ExceptionForm', 'Save Crash Report'), - Settings().value(self.settingsSection + u'/last directory'), - translate('OpenLP.ExceptionForm', - 'Text files (*.txt *.log *.text)')) + Settings().value(self.settings_section + u'/last directory'), + translate('OpenLP.ExceptionForm', 'Text files (*.txt *.log *.text)')) if filename: filename = unicode(filename).replace(u'/', os.path.sep) - Settings().setValue(self.settingsSection + u'/last directory', os.path.dirname(filename)) + Settings().setValue(self.settings_section + u'/last directory', os.path.dirname(filename)) report_text = report_text % self._createReport() try: report_file = open(filename, u'w') @@ -230,7 +229,7 @@ class ExceptionForm(QtGui.QDialog, Ui_ExceptionDialog): """ files = QtGui.QFileDialog.getOpenFileName( self, translate('ImagePlugin.ExceptionDialog', 'Select Attachment'), - Settings().value(self.settingsSection + u'/last directory'), u'%s (*.*) (*)' % UiStrings().AllFiles) + Settings().value(self.settings_section + u'/last directory'), u'%s (*.*) (*)' % UiStrings().AllFiles) log.info(u'New files(s) %s', unicode(files)) if files: self.fileAttachment = unicode(files) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 661516e7d..58d832101 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -300,7 +300,7 @@ class MainDisplay(Display): self.image(path) # Update the preview frame. if self.isLive: - self.parent().updatePreview() + self.live_controller.updatePreview() return True def image(self, path): @@ -513,6 +513,16 @@ class MainDisplay(Display): application = property(_get_application) + def _get_live_controller(self): + """ + Adds the live controller to the class dynamically + """ + if not hasattr(self, u'_live_controller'): + self._live_controller = Registry().get(u'live_controller') + return self._live_controller + + live_controller = property(_get_live_controller) + class AudioPlayer(QtCore.QObject): """ diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index e3c42a2f9..3390ff84e 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -230,7 +230,7 @@ class SlideController(DisplayController): self.playSlidesOnce = create_action(self, u'playSlidesOnce', text=UiStrings().PlaySlidesToEnd, icon=u':/media/media_time.png', checked=False, shortcuts=[], category=self.category, triggers=self.onPlaySlidesOnce) - if Settings().value(self.parent().advancedSettingsSection + u'/slide limits') == SlideLimits.Wrap: + if Settings().value(self.main_window.advancedSettingsSection + u'/slide limits') == SlideLimits.Wrap: self.playSlidesMenu.setDefaultAction(self.playSlidesLoop) else: self.playSlidesMenu.setDefaultAction(self.playSlidesOnce) @@ -582,7 +582,7 @@ class SlideController(DisplayController): self.previewListWidget.resizeRowsToContents() else: # Sort out image heights. - width = self.parent().controlSplitter.sizes()[self.split] + width = self.main_window.controlSplitter.sizes()[self.split] for framenumber in range(len(self.serviceItem.get_frames())): self.previewListWidget.setRowHeight(framenumber, width / self.ratio) self.onControllerSizeChanged(self.controller.width(), self.controller.height()) @@ -618,7 +618,7 @@ class SlideController(DisplayController): """ Updates the Slide Limits variable from the settings. """ - self.slide_limits = Settings().value(self.parent().advancedSettingsSection + u'/slide limits') + self.slide_limits = Settings().value(self.main_window.advancedSettingsSection + u'/slide limits') def enableToolBar(self, item): """ @@ -646,7 +646,7 @@ class SlideController(DisplayController): self.playSlidesLoop.setChecked(False) self.playSlidesLoop.setIcon(build_icon(u':/media/media_time.png')) if item.is_text(): - if Settings().value(self.parent().songsSettingsSection + u'/display songbar') and self.slideList: + if Settings().value(self.main_window.songsSettingsSection + u'/display songbar') and self.slideList: self.songMenu.show() if item.is_capable(ItemCapabilities.CanLoop) and len(item.get_frames()) > 1: self.toolbar.setWidgetVisible(self.loopList) @@ -748,7 +748,7 @@ class SlideController(DisplayController): self._resetBlank() Registry().execute(u'%s_start' % serviceItem.name.lower(), [serviceItem, self.isLive, self.hideMode(), slideno]) self.slideList = {} - width = self.parent().controlSplitter.sizes()[self.split] + width = self.main_window.controlSplitter.sizes()[self.split] self.previewListWidget.clear() self.previewListWidget.setRowCount(0) self.previewListWidget.setColumnWidth(0, width) @@ -767,8 +767,8 @@ class SlideController(DisplayController): action.setData(counter) QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered(bool)'), self.onTrackTriggered) self.display.audioPlayer.repeat = Settings().value( - self.parent().generalSettingsSection + u'/audio repeat list') - if Settings().value(self.parent().generalSettingsSection + u'/audio start paused'): + self.main_window.generalSettingsSection + u'/audio repeat list') + if Settings().value(self.main_window.generalSettingsSection + u'/audio start paused'): self.audioPauseItem.setChecked(True) self.display.audioPlayer.pause() else: @@ -877,7 +877,7 @@ class SlideController(DisplayController): Allow the main display to blank the main display at startup time """ log.debug(u'mainDisplaySetBackground live = %s' % self.isLive) - display_type = Settings().value(self.parent().generalSettingsSection + u'/screen blank') + display_type = Settings().value(self.main_window.generalSettingsSection + u'/screen blank') if self.screens.which_screen(self.window()) != self.screens.which_screen(self.display): # Order done to handle initial conversion if display_type == u'themed': @@ -915,9 +915,9 @@ class SlideController(DisplayController): self.themeScreen.setChecked(False) self.desktopScreen.setChecked(False) if checked: - Settings().setValue(self.parent().generalSettingsSection + u'/screen blank', u'blanked') + Settings().setValue(self.main_window.generalSettingsSection + u'/screen blank', u'blanked') else: - Settings().remove(self.parent().generalSettingsSection + u'/screen blank') + Settings().remove(self.main_window.generalSettingsSection + u'/screen blank') self.blankPlugin() self.updatePreview() self.onToggleLoop() @@ -934,9 +934,9 @@ class SlideController(DisplayController): self.themeScreen.setChecked(checked) self.desktopScreen.setChecked(False) if checked: - Settings().setValue(self.parent().generalSettingsSection + u'/screen blank', u'themed') + Settings().setValue(self.main_window.generalSettingsSection + u'/screen blank', u'themed') else: - Settings().remove(self.parent().generalSettingsSection + u'/screen blank') + Settings().remove(self.main_window.generalSettingsSection + u'/screen blank') self.blankPlugin() self.updatePreview() self.onToggleLoop() @@ -953,9 +953,9 @@ class SlideController(DisplayController): self.themeScreen.setChecked(False) self.desktopScreen.setChecked(checked) if checked: - Settings().setValue(self.parent().generalSettingsSection + u'/screen blank', u'hidden') + Settings().setValue(self.main_window.generalSettingsSection + u'/screen blank', u'hidden') else: - Settings().remove(self.parent().generalSettingsSection + u'/screen blank') + Settings().remove(self.main_window.generalSettingsSection + u'/screen blank') self.hidePlugin(checked) self.updatePreview() self.onToggleLoop() @@ -1255,7 +1255,7 @@ class SlideController(DisplayController): def onGoLive(self): """ - If preview copy slide item to live + If preview copy slide item to live controller from Preview Controller """ row = self.previewListWidget.currentRow() if -1 < row < self.previewListWidget.rowCount(): @@ -1384,3 +1384,14 @@ class SlideController(DisplayController): return self._live_controller live_controller = property(_get_live_controller) + + def _get_main_window(self): + """ + Adds the main window to the class dynamically + """ + if not hasattr(self, u'_main_window'): + self._main_window = Registry().get(u'main_window') + return self._main_window + + main_window = property(_get_main_window) + diff --git a/openlp/plugins/alerts/alertsplugin.py b/openlp/plugins/alerts/alertsplugin.py index de2c92f7e..111abf795 100644 --- a/openlp/plugins/alerts/alertsplugin.py +++ b/openlp/plugins/alerts/alertsplugin.py @@ -122,7 +122,7 @@ __default_settings__ = { u'alerts/background color': u'#660000', u'alerts/font color': u'#ffffff', u'alerts/timeout': 5 - } +} class AlertsPlugin(Plugin): @@ -133,7 +133,7 @@ class AlertsPlugin(Plugin): self.weight = -3 self.iconPath = u':/plugins/plugin_alerts.png' self.icon = build_icon(self.iconPath) - self.alertsmanager = AlertsManager(self) + self.alerts_manager = AlertsManager(self) self.manager = Manager(u'alerts', init_schema) self.alertForm = AlertForm(self) @@ -176,7 +176,7 @@ class AlertsPlugin(Plugin): Settings().setValue(self.settingsSection + u'/active', self.alertsActive) def onAlertsTrigger(self): - self.alertForm.loadList() + self.alertForm.load_list() self.alertForm.exec_() def about(self): @@ -194,7 +194,8 @@ class AlertsPlugin(Plugin): u'plural': translate('AlertsPlugin', 'Alerts', 'name plural') } ## Name for MediaDockManager, SettingsManager ## - self.textStrings[StringContent.VisibleName] = {u'title': translate('AlertsPlugin', 'Alerts', 'container title') + self.textStrings[StringContent.VisibleName] = { + u'title': translate('AlertsPlugin', 'Alerts', 'container title') } def getDisplayJavaScript(self): diff --git a/openlp/plugins/alerts/forms/alertdialog.py b/openlp/plugins/alerts/forms/alertdialog.py index 1ca5a1113..1985fdcd1 100644 --- a/openlp/plugins/alerts/forms/alertdialog.py +++ b/openlp/plugins/alerts/forms/alertdialog.py @@ -32,61 +32,63 @@ from PyQt4 import QtGui from openlp.core.lib import build_icon, translate from openlp.core.lib.ui import create_button, create_button_box -class Ui_AlertDialog(object): - def setupUi(self, alertDialog): - alertDialog.setObjectName(u'alertDialog') - alertDialog.resize(400, 300) - alertDialog.setWindowIcon(build_icon(u':/icon/openlp-logo-16x16.png')) - self.alertDialogLayout = QtGui.QGridLayout(alertDialog) - self.alertDialogLayout.setObjectName(u'alertDialogLayout') - self.alertTextLayout = QtGui.QFormLayout() - self.alertTextLayout.setObjectName(u'alertTextLayout') - self.alertEntryLabel = QtGui.QLabel(alertDialog) - self.alertEntryLabel.setObjectName(u'alertEntryLabel') - self.alertTextEdit = QtGui.QLineEdit(alertDialog) - self.alertTextEdit.setObjectName(u'alertTextEdit') - self.alertEntryLabel.setBuddy(self.alertTextEdit) - self.alertTextLayout.addRow(self.alertEntryLabel, self.alertTextEdit) - self.alertParameter = QtGui.QLabel(alertDialog) - self.alertParameter.setObjectName(u'alertParameter') - self.parameterEdit = QtGui.QLineEdit(alertDialog) - self.parameterEdit.setObjectName(u'parameterEdit') - self.alertParameter.setBuddy(self.parameterEdit) - self.alertTextLayout.addRow(self.alertParameter, self.parameterEdit) - self.alertDialogLayout.addLayout(self.alertTextLayout, 0, 0, 1, 2) - self.alertListWidget = QtGui.QListWidget(alertDialog) - self.alertListWidget.setAlternatingRowColors(True) - self.alertListWidget.setObjectName(u'alertListWidget') - self.alertDialogLayout.addWidget(self.alertListWidget, 1, 0) - self.manageButtonLayout = QtGui.QVBoxLayout() - self.manageButtonLayout.setObjectName(u'manageButtonLayout') - self.newButton = QtGui.QPushButton(alertDialog) - self.newButton.setIcon(build_icon(u':/general/general_new.png')) - self.newButton.setObjectName(u'newButton') - self.manageButtonLayout.addWidget(self.newButton) - self.saveButton = QtGui.QPushButton(alertDialog) - self.saveButton.setEnabled(False) - self.saveButton.setIcon(build_icon(u':/general/general_save.png')) - self.saveButton.setObjectName(u'saveButton') - self.manageButtonLayout.addWidget(self.saveButton) - self.deleteButton = create_button(alertDialog, u'deleteButton', role=u'delete', enabled=False, - click=alertDialog.onDeleteButtonClicked) - self.manageButtonLayout.addWidget(self.deleteButton) - self.manageButtonLayout.addStretch() - self.alertDialogLayout.addLayout(self.manageButtonLayout, 1, 1) - displayIcon = build_icon(u':/general/general_live.png') - self.displayButton = create_button(alertDialog, u'displayButton', icon=displayIcon, enabled=False) - self.displayCloseButton = create_button(alertDialog, u'displayCloseButton', icon=displayIcon, enabled=False) - self.button_box = create_button_box(alertDialog, u'button_box', [u'close'], - [self.displayButton, self.displayCloseButton]) - self.alertDialogLayout.addWidget(self.button_box, 2, 0, 1, 2) - self.retranslateUi(alertDialog) - def retranslateUi(self, alertDialog): - alertDialog.setWindowTitle(translate('AlertsPlugin.AlertForm', 'Alert Message')) - self.alertEntryLabel.setText(translate('AlertsPlugin.AlertForm', 'Alert &text:')) - self.alertParameter.setText(translate('AlertsPlugin.AlertForm', '&Parameter:')) - self.newButton.setText(translate('AlertsPlugin.AlertForm', '&New')) - self.saveButton.setText(translate('AlertsPlugin.AlertForm', '&Save')) - self.displayButton.setText(translate('AlertsPlugin.AlertForm', 'Displ&ay')) - self.displayCloseButton.setText(translate('AlertsPlugin.AlertForm', 'Display && Cl&ose')) +class Ui_AlertDialog(object): + def setupUi(self, alert_dialog): + alert_dialog.setObjectName(u'alert_dialog') + alert_dialog.resize(400, 300) + alert_dialog.setWindowIcon(build_icon(u':/icon/openlp-logo-16x16.png')) + self.alert_dialog_layout = QtGui.QGridLayout(alert_dialog) + self.alert_dialog_layout.setObjectName(u'alert_dialog_layout') + self.alert_text_layout = QtGui.QFormLayout() + self.alert_text_layout.setObjectName(u'alert_text_layout') + self.alert_entry_label = QtGui.QLabel(alert_dialog) + self.alert_entry_label.setObjectName(u'alert_entry_label') + self.alert_text_edit = QtGui.QLineEdit(alert_dialog) + self.alert_text_edit.setObjectName(u'alert_text_edit') + self.alert_entry_label.setBuddy(self.alert_text_edit) + self.alert_text_layout.addRow(self.alert_entry_label, self.alert_text_edit) + self.alert_parameter = QtGui.QLabel(alert_dialog) + self.alert_parameter.setObjectName(u'alert_parameter') + self.parameter_edit = QtGui.QLineEdit(alert_dialog) + self.parameter_edit.setObjectName(u'parameter_edit') + self.alert_parameter.setBuddy(self.parameter_edit) + self.alert_text_layout.addRow(self.alert_parameter, self.parameter_edit) + self.alert_dialog_layout.addLayout(self.alert_text_layout, 0, 0, 1, 2) + self.alert_list_widget = QtGui.QListWidget(alert_dialog) + self.alert_list_widget.setAlternatingRowColors(True) + self.alert_list_widget.setObjectName(u'alert_list_widget') + self.alert_dialog_layout.addWidget(self.alert_list_widget, 1, 0) + self.manage_button_layout = QtGui.QVBoxLayout() + self.manage_button_layout.setObjectName(u'manage_button_layout') + self.new_button = QtGui.QPushButton(alert_dialog) + self.new_button.setIcon(build_icon(u':/general/general_new.png')) + self.new_button.setObjectName(u'new_button') + self.manage_button_layout.addWidget(self.new_button) + self.save_button = QtGui.QPushButton(alert_dialog) + self.save_button.setEnabled(False) + self.save_button.setIcon(build_icon(u':/general/general_save.png')) + self.save_button.setObjectName(u'save_button') + self.manage_button_layout.addWidget(self.save_button) + self.delete_button = create_button(alert_dialog, u'delete_button', role=u'delete', enabled=False, + click=alert_dialog.onDeleteButtonClicked) + self.manage_button_layout.addWidget(self.delete_button) + self.manage_button_layout.addStretch() + self.alert_dialog_layout.addLayout(self.manage_button_layout, 1, 1) + displayIcon = build_icon(u':/general/general_live.png') + self.display_button = create_button(alert_dialog, u'display_button', icon=displayIcon, enabled=False) + self.display_close_button = create_button(alert_dialog, u'display_close_button', icon=displayIcon, + enabled=False) + self.button_box = create_button_box(alert_dialog, u'button_box', [u'close'], + [self.display_button, self.display_close_button]) + self.alert_dialog_layout.addWidget(self.button_box, 2, 0, 1, 2) + self.retranslateUi(alert_dialog) + + def retranslateUi(self, alert_dialog): + alert_dialog.setWindowTitle(translate('AlertsPlugin.AlertForm', 'Alert Message')) + self.alert_entry_label.setText(translate('AlertsPlugin.AlertForm', 'Alert &text:')) + self.alert_parameter.setText(translate('AlertsPlugin.AlertForm', '&Parameter:')) + self.new_button.setText(translate('AlertsPlugin.AlertForm', '&New')) + self.save_button.setText(translate('AlertsPlugin.AlertForm', '&Save')) + self.display_button.setText(translate('AlertsPlugin.AlertForm', 'Displ&ay')) + self.display_close_button.setText(translate('AlertsPlugin.AlertForm', 'Display && Cl&ose')) diff --git a/openlp/plugins/alerts/forms/alertform.py b/openlp/plugins/alerts/forms/alertform.py index c09180702..64aca1e26 100644 --- a/openlp/plugins/alerts/forms/alertform.py +++ b/openlp/plugins/alerts/forms/alertform.py @@ -48,131 +48,131 @@ class AlertForm(QtGui.QDialog, Ui_AlertDialog): self.item_id = None super(AlertForm, self).__init__(self.plugin.main_window) self.setupUi(self) - QtCore.QObject.connect(self.displayButton, QtCore.SIGNAL(u'clicked()'), self.onDisplayClicked) - QtCore.QObject.connect(self.displayCloseButton, QtCore.SIGNAL(u'clicked()'), self.onDisplayCloseClicked) - QtCore.QObject.connect(self.alertTextEdit, QtCore.SIGNAL(u'textChanged(const QString&)'), self.onTextChanged) - QtCore.QObject.connect(self.newButton, QtCore.SIGNAL(u'clicked()'), self.onNewClick) - QtCore.QObject.connect(self.saveButton, QtCore.SIGNAL(u'clicked()'), self.onSaveClick) - QtCore.QObject.connect(self.alertListWidget, QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onDoubleClick) - QtCore.QObject.connect(self.alertListWidget, QtCore.SIGNAL(u'clicked(QModelIndex)'), self.onSingleClick) - QtCore.QObject.connect(self.alertListWidget, QtCore.SIGNAL(u'currentRowChanged(int)'), self.onCurrentRowChanged) + self.display_button.clicked.connect(self.on_display_clicked) + self.display_close_button.clicked.connect(self.on_display_close_clicked) + self.alert_text_edit.textChanged.connect(self.on_text_changed) + self.new_button.clicked.connect(self.on_new_click) + self.save_button.clicked.connect(self.on_save_all) + self.alert_list_widget.doubleClicked.connect(self.on_double_click) + self.alert_list_widget.clicked.connect(self.on_single_click) + self.alert_list_widget.currentRowChanged.connect(self.on_current_row_changed) def exec_(self): """ Execute the dialog and return the exit code. """ - self.displayButton.setEnabled(False) - self.displayCloseButton.setEnabled(False) - self.alertTextEdit.setText(u'') + self.display_button.setEnabled(False) + self.display_close_button.setEnabled(False) + self.alert_text_edit.setText(u'') return QtGui.QDialog.exec_(self) - def loadList(self): + def load_list(self): """ Loads the list with alerts. """ - self.alertListWidget.clear() + self.alert_list_widget.clear() alerts = self.manager.get_all_objects(AlertItem, order_by_ref=AlertItem.text) for alert in alerts: item_name = QtGui.QListWidgetItem(alert.text) item_name.setData(QtCore.Qt.UserRole, alert.id) - self.alertListWidget.addItem(item_name) - if alert.text == unicode(self.alertTextEdit.text()): + self.alert_list_widget.addItem(item_name) + if alert.text == unicode(self.alert_text_edit.text()): self.item_id = alert.id - self.alertListWidget.setCurrentRow(self.alertListWidget.row(item_name)) + self.alert_list_widget.setCurrentRow(self.alert_list_widget.row(item_name)) - def onDisplayClicked(self): + def on_display_clicked(self): """ Display the current alert text. """ - self.triggerAlert(self.alertTextEdit.text()) + self.trigger_alert(self.alert_text_edit.text()) - def onDisplayCloseClicked(self): + def on_display_close_clicked(self): """ Close the alert preview. """ - if self.triggerAlert(self.alertTextEdit.text()): + if self.trigger_alert(self.alert_text_edit.text()): self.close() def onDeleteButtonClicked(self): """ Deletes the selected item. """ - item = self.alertListWidget.currentItem() + item = self.alert_list_widget.currentItem() if item: item_id = item.data(QtCore.Qt.UserRole) self.manager.delete_object(AlertItem, item_id) - row = self.alertListWidget.row(item) - self.alertListWidget.takeItem(row) + row = self.alert_list_widget.row(item) + self.alert_list_widget.takeItem(row) self.item_id = None - self.alertTextEdit.setText(u'') + self.alert_text_edit.setText(u'') - def onNewClick(self): + def on_new_click(self): """ Create a new alert. """ - if not self.alertTextEdit.text(): + if not self.alert_text_edit.text(): QtGui.QMessageBox.information(self, translate('AlertsPlugin.AlertForm', 'New Alert'), translate('AlertsPlugin.AlertForm', 'You haven\'t specified any text for your alert. \n' 'Please type in some text before clicking New.')) else: alert = AlertItem() - alert.text = self.alertTextEdit.text() + alert.text = self.alert_text_edit.text() self.manager.save_object(alert) - self.loadList() + self.load_list() - def onSaveClick(self): + def on_save_all(self): """ Save the alert, we are editing. """ if self.item_id: alert = self.manager.get_object(AlertItem, self.item_id) - alert.text = self.alertTextEdit.text() + alert.text = self.alert_text_edit.text() self.manager.save_object(alert) self.item_id = None - self.loadList() - self.saveButton.setEnabled(False) + self.load_list() + self.save_button.setEnabled(False) - def onTextChanged(self): + def on_text_changed(self): """ Enable save button when data has been changed by editing the form. """ # Only enable the button, if we are editing an item. if self.item_id: - self.saveButton.setEnabled(True) - if self.alertTextEdit.text(): - self.displayButton.setEnabled(True) - self.displayCloseButton.setEnabled(True) + self.save_button.setEnabled(True) + if self.alert_text_edit.text(): + self.display_button.setEnabled(True) + self.display_close_button.setEnabled(True) else: - self.displayButton.setEnabled(False) - self.displayCloseButton.setEnabled(False) + self.display_button.setEnabled(False) + self.display_close_button.setEnabled(False) - def onDoubleClick(self): + def on_double_click(self): """ List item has been double clicked to display it. """ - item = self.alertListWidget.selectedIndexes()[0] - bitem = self.alertListWidget.item(item.row()) - self.triggerAlert(bitem.text()) - self.alertTextEdit.setText(bitem.text()) + item = self.alert_list_widget.selectedIndexes()[0] + bitem = self.alert_list_widget.item(item.row()) + self.trigger_alert(bitem.text()) + self.alert_text_edit.setText(bitem.text()) self.item_id = bitem.data(QtCore.Qt.UserRole) - self.saveButton.setEnabled(False) + self.save_button.setEnabled(False) - def onSingleClick(self): + def on_single_click(self): """ List item has been single clicked to add it to the edit field so it can be changed. """ - item = self.alertListWidget.selectedIndexes()[0] - bitem = self.alertListWidget.item(item.row()) - self.alertTextEdit.setText(bitem.text()) + item = self.alert_list_widget.selectedIndexes()[0] + bitem = self.alert_list_widget.item(item.row()) + self.alert_text_edit.setText(bitem.text()) self.item_id = bitem.data(QtCore.Qt.UserRole) # If the alert does not contain '<>' we clear the ParameterEdit field. - if self.alertTextEdit.text().find(u'<>') == -1: - self.parameterEdit.setText(u'') - self.saveButton.setEnabled(False) + if self.alert_text_edit.text().find(u'<>') == -1: + self.parameter_edit.setText(u'') + self.save_button.setEnabled(False) - def triggerAlert(self, text): + def trigger_alert(self, text): """ Prepares the alert text for displaying. @@ -182,42 +182,42 @@ class AlertForm(QtGui.QDialog, Ui_AlertDialog): if not text: return False # We found '<>' in the alert text, but the ParameterEdit field is empty. - if text.find(u'<>') != -1 and not self.parameterEdit.text() and QtGui.QMessageBox.question(self, + if text.find(u'<>') != -1 and not self.parameter_edit.text() and QtGui.QMessageBox.question(self, translate('AlertsPlugin.AlertForm', 'No Parameter Found'), translate('AlertsPlugin.AlertForm', 'You have not entered a parameter to be replaced.\n' 'Do you want to continue anyway?'), QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.No | QtGui.QMessageBox.Yes)) == QtGui.QMessageBox.No: - self.parameterEdit.setFocus() + self.parameter_edit.setFocus() return False # The ParameterEdit field is not empty, but we have not found '<>' # in the alert text. - elif text.find(u'<>') == -1 and self.parameterEdit.text() and QtGui.QMessageBox.question(self, + elif text.find(u'<>') == -1 and self.parameter_edit.text() and QtGui.QMessageBox.question(self, translate('AlertsPlugin.AlertForm', 'No Placeholder Found'), translate('AlertsPlugin.AlertForm', 'The alert text does not contain \'<>\'.\n' 'Do you want to continue anyway?'), QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.No | QtGui.QMessageBox.Yes)) == QtGui.QMessageBox.No: - self.parameterEdit.setFocus() + self.parameter_edit.setFocus() return False - text = text.replace(u'<>', self.parameterEdit.text()) - self.plugin.alertsmanager.displayAlert(text) + text = text.replace(u'<>', self.parameter_edit.text()) + self.plugin.alerts_manager.display_alert(text) return True - def onCurrentRowChanged(self, row): + def on_current_row_changed(self, row): """ - Called when the *alertListWidget*'s current row has been changed. This + Called when the *alert_list_widget*'s current row has been changed. This enables or disables buttons which require an item to act on. ``row`` The row (int). If there is no current row, the value is -1. """ if row == -1: - self.displayButton.setEnabled(False) - self.displayCloseButton.setEnabled(False) - self.saveButton.setEnabled(False) - self.deleteButton.setEnabled(False) + self.display_button.setEnabled(False) + self.display_close_button.setEnabled(False) + self.save_button.setEnabled(False) + self.delete_button.setEnabled(False) else: - self.displayButton.setEnabled(True) - self.displayCloseButton.setEnabled(True) - self.deleteButton.setEnabled(True) + self.display_button.setEnabled(True) + self.display_close_button.setEnabled(True) + self.delete_button.setEnabled(True) # We do not need to enable the save button, as it is only enabled - # when typing text in the "alertTextEdit". + # when typing text in the "alert_text_edit". diff --git a/openlp/plugins/alerts/lib/alertsmanager.py b/openlp/plugins/alerts/lib/alertsmanager.py index 03f36f09e..7cfea701e 100644 --- a/openlp/plugins/alerts/lib/alertsmanager.py +++ b/openlp/plugins/alerts/lib/alertsmanager.py @@ -47,7 +47,6 @@ class AlertsManager(QtCore.QObject): def __init__(self, parent): QtCore.QObject.__init__(self, parent) - self.screen = None self.timer_id = 0 self.alert_list = [] Registry().register_function(u'live_display_active', self.generate_alert) @@ -87,7 +86,7 @@ class AlertsManager(QtCore.QObject): return text = self.alert_list.pop(0) alertTab = self.parent().settingsTab - self.parent().liveController.display.alert(text, alertTab.location) + self.live_controller.display.alert(text, alertTab.location) # Check to see if we have a timer running. if self.timer_id == 0: self.timer_id = self.startTimer(int(alertTab.timeout) * 1000) @@ -103,7 +102,7 @@ class AlertsManager(QtCore.QObject): log.debug(u'timer event') if event.timerId() == self.timer_id: alertTab = self.parent().settingsTab - self.parent().liveController.display.alert(u'', alertTab.location) + self.live_controller.display.alert(u'', alertTab.location) self.killTimer(self.timer_id) self.timer_id = 0 self.generate_alert() @@ -116,4 +115,14 @@ class AlertsManager(QtCore.QObject): self._main_window = Registry().get(u'main_window') return self._main_window - main_window = property(_get_main_window) \ No newline at end of file + main_window = property(_get_main_window) + + def _get_live_controller(self): + """ + Adds the live controller to the class dynamically + """ + if not hasattr(self, u'_live_controller'): + self._live_controller = Registry().get(u'live_controller') + return self._live_controller + + live_controller = property(_get_live_controller) diff --git a/tests/functional/openlp_core_lib/test_settings.py b/tests/functional/openlp_core_lib/test_settings.py index fd43b901e..779a1569d 100644 --- a/tests/functional/openlp_core_lib/test_settings.py +++ b/tests/functional/openlp_core_lib/test_settings.py @@ -42,7 +42,7 @@ class TestSettings(TestCase): default_value = Settings().value(u'general/has run wizard') # THEN the default value is returned - assert default_value is False, u'The default value defined has not been returned' + assert default_value is False, u'The default value should be False' # WHEN a new value is saved into config Settings().setValue(u'general/has run wizard', True) From c6ad115b103d681986bd7210be1e2d22060c14d0 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Thu, 14 Feb 2013 21:50:10 +0000 Subject: [PATCH 11/24] More Signal removals --- openlp/core/lib/ui.py | 9 ++++----- openlp/core/ui/servicemanager.py | 15 +++++---------- openlp/core/ui/thememanager.py | 9 +++------ 3 files changed, 12 insertions(+), 21 deletions(-) diff --git a/openlp/core/lib/ui.py b/openlp/core/lib/ui.py index f4f29c36a..e09f4d164 100644 --- a/openlp/core/lib/ui.py +++ b/openlp/core/lib/ui.py @@ -109,8 +109,8 @@ def create_button_box(dialog, name, standard_buttons, custom_buttons=None): button_box.addButton(button, QtGui.QDialogButtonBox.ActionRole) else: button_box.addButton(*button) - QtCore.QObject.connect(button_box, QtCore.SIGNAL(u'accepted()'), dialog.accept) - QtCore.QObject.connect(button_box, QtCore.SIGNAL(u'rejected()'), dialog.reject) + button_box.accepted.connect(dialog.accept) + button_box.rejected.connect(dialog.reject) return button_box @@ -211,7 +211,7 @@ def create_button(parent, name, **kwargs): if not kwargs.pop(u'enabled', True): button.setEnabled(False) if kwargs.get(u'click'): - QtCore.QObject.connect(button, QtCore.SIGNAL(u'clicked()'), kwargs.pop(u'click')) + button.clicked.connect(kwargs.pop(u'click')) for key in kwargs.keys(): if key not in [u'text', u'icon', u'tooltip', u'click']: log.warn(u'Parameter %s was not consumed in create_button().', key) @@ -297,8 +297,7 @@ def create_action(parent, name, **kwargs): action_list = ActionList.get_instance() action_list.add_action(action, unicode(kwargs.pop(u'category'))) if kwargs.get(u'triggers'): - QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered(bool)'), - kwargs.pop(u'triggers')) + action.triggered.connect(kwargs.pop(u'triggers')) for key in kwargs.keys(): if key not in [u'text', u'icon', u'tooltip', u'statustip', u'checked', u'shortcuts', u'category', u'triggers']: log.warn(u'Parameter %s was not consumed in create_action().', key) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 23315d5e8..7762d72aa 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -142,8 +142,7 @@ class ServiceManagerDialog(object): self.service_manager_list.setHeaderHidden(True) self.service_manager_list.setExpandsOnDoubleClick(False) self.service_manager_list.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) - QtCore.QObject.connect(self.service_manager_list, QtCore.SIGNAL('customContextMenuRequested(QPoint)'), - self.context_menu) + self.service_manager_list.customContextMenuRequested.connect(self.context_menu) self.service_manager_list.setObjectName(u'service_manager_list') # enable drop self.service_manager_list.__class__.dragEnterEvent = self.drag_enter_event @@ -202,14 +201,10 @@ class ServiceManagerDialog(object): triggers=self.make_live) self.layout.addWidget(self.order_toolbar) # Connect up our signals and slots - QtCore.QObject.connect(self.theme_combo_box, QtCore.SIGNAL(u'activated(int)'), - self.on_theme_combo_box_selected) - QtCore.QObject.connect(self.service_manager_list, QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), - self.on_make_live) - QtCore.QObject.connect(self.service_manager_list, QtCore.SIGNAL(u'itemCollapsed(QTreeWidgetItem*)'), - self.collapsed) - QtCore.QObject.connect(self.service_manager_list, QtCore.SIGNAL(u'itemExpanded(QTreeWidgetItem*)'), - self.expanded) + self.theme_combo_box.activated.connect(self.on_theme_combo_box_selected) + self.service_manager_list.doubleClicked.connect(self.on_make_live) + self.service_manager_list.itemCollapsed.connect(self.collapsed) + self.service_manager_list.itemExpanded.connect(self.expanded) Registry().register_function(u'theme_update_list', self.update_theme_list) Registry().register_function(u'config_updated', self.config_updated) Registry().register_function(u'config_screen_changed', self.regenerate_service_Items) diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index c58a8aefd..ed8f5c9fc 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -105,8 +105,7 @@ class ThemeManager(QtGui.QWidget): self.theme_list_widget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.theme_list_widget.setObjectName(u'theme_list_widget') self.layout.addWidget(self.theme_list_widget) - QtCore.QObject.connect(self.theme_list_widget, QtCore.SIGNAL('customContextMenuRequested(QPoint)'), - self.context_menu) + self.theme_list_widget.customContextMenuRequested.connect(self.context_menu) # build the context menu self.menu = QtGui.QMenu() self.edit_action = create_widget_action(self.menu, @@ -130,10 +129,8 @@ class ThemeManager(QtGui.QWidget): text=translate('OpenLP.ThemeManager', '&Export Theme'), icon=u':/general/general_export.png', triggers=self.on_export_theme) # Signals - QtCore.QObject.connect(self.theme_list_widget, - QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.change_global_from_screen) - QtCore.QObject.connect(self.theme_list_widget, - QtCore.SIGNAL(u'currentItemChanged(QListWidgetItem *, QListWidgetItem *)'), self.check_list_state) + self.theme_list_widget.doubleClicked.connect(self.change_global_from_screen) + self.theme_list_widget.currentItemChanged.connect(self.check_list_state) Registry().register_function(u'theme_update_global', self.change_global_from_tab) Registry().register_function(u'config_updated', self.config_updated) # Variables From ab31ffb77598e401edd48fa99fbbac14da496497 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 16 Feb 2013 10:38:02 +0000 Subject: [PATCH 12/24] Cleaning up SongUsage --- .../songusage/forms/songusagedeletedialog.py | 47 +++---- .../songusage/forms/songusagedeleteform.py | 13 +- .../songusage/forms/songusagedetaildialog.py | 88 ++++++------ .../songusage/forms/songusagedetailform.py | 47 +++---- openlp/plugins/songusage/songusageplugin.py | 128 +++++++++--------- 5 files changed, 161 insertions(+), 162 deletions(-) diff --git a/openlp/plugins/songusage/forms/songusagedeletedialog.py b/openlp/plugins/songusage/forms/songusagedeletedialog.py index 349c3258a..a1ad701b2 100644 --- a/openlp/plugins/songusage/forms/songusagedeletedialog.py +++ b/openlp/plugins/songusage/forms/songusagedeletedialog.py @@ -32,29 +32,30 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate from openlp.core.lib.ui import create_button_box -class Ui_SongUsageDeleteDialog(object): - def setupUi(self, songUsageDeleteDialog): - songUsageDeleteDialog.setObjectName(u'songUsageDeleteDialog') - songUsageDeleteDialog.resize(291, 243) - self.verticalLayout = QtGui.QVBoxLayout(songUsageDeleteDialog) - self.verticalLayout.setSpacing(8) - self.verticalLayout.setContentsMargins(8, 8, 8, 8) - self.verticalLayout.setObjectName(u'verticalLayout') - self.deleteLabel = QtGui.QLabel(songUsageDeleteDialog) - self.deleteLabel.setObjectName(u'deleteLabel') - self.verticalLayout.addWidget(self.deleteLabel) - self.deleteCalendar = QtGui.QCalendarWidget(songUsageDeleteDialog) - self.deleteCalendar.setFirstDayOfWeek(QtCore.Qt.Sunday) - self.deleteCalendar.setGridVisible(True) - self.deleteCalendar.setVerticalHeaderFormat(QtGui.QCalendarWidget.NoVerticalHeader) - self.deleteCalendar.setObjectName(u'deleteCalendar') - self.verticalLayout.addWidget(self.deleteCalendar) - self.button_box = create_button_box(songUsageDeleteDialog, u'button_box', [u'cancel', u'ok']) - self.verticalLayout.addWidget(self.button_box) - self.retranslateUi(songUsageDeleteDialog) - def retranslateUi(self, songUsageDeleteDialog): - songUsageDeleteDialog.setWindowTitle(translate('SongUsagePlugin.SongUsageDeleteForm', 'Delete Song Usage Data')) - self.deleteLabel.setText( +class Ui_SongUsageDeleteDialog(object): + def setupUi(self, song_usage_delete_dialog): + song_usage_delete_dialog.setObjectName(u'song_usage_delete_dialog') + song_usage_delete_dialog.resize(291, 243) + self.vertical_layout = QtGui.QVBoxLayout(song_usage_delete_dialog) + self.vertical_layout.setSpacing(8) + self.vertical_layout.setContentsMargins(8, 8, 8, 8) + self.vertical_layout.setObjectName(u'vertical_layout') + self.delete_label = QtGui.QLabel(song_usage_delete_dialog) + self.delete_label.setObjectName(u'delete_label') + self.vertical_layout.addWidget(self.delete_label) + self.delete_calendar = QtGui.QCalendarWidget(song_usage_delete_dialog) + self.delete_calendar.setFirstDayOfWeek(QtCore.Qt.Sunday) + self.delete_calendar.setGridVisible(True) + self.delete_calendar.setVerticalHeaderFormat(QtGui.QCalendarWidget.NoVerticalHeader) + self.delete_calendar.setObjectName(u'delete_calendar') + self.vertical_layout.addWidget(self.delete_calendar) + self.button_box = create_button_box(song_usage_delete_dialog, u'button_box', [u'cancel', u'ok']) + self.vertical_layout.addWidget(self.button_box) + self.retranslateUi(song_usage_delete_dialog) + + def retranslateUi(self, song_usage_delete_dialog): + song_usage_delete_dialog.setWindowTitle(translate('SongUsagePlugin.SongUsageDeleteForm', 'Delete Song Usage Data')) + self.delete_label.setText( translate('SongUsagePlugin.SongUsageDeleteForm', 'Select the date up to which the song usage data ' 'should be deleted. All data recorded before this date will be permanently deleted.')) diff --git a/openlp/plugins/songusage/forms/songusagedeleteform.py b/openlp/plugins/songusage/forms/songusagedeleteform.py index 47e8b9256..8ae2fa020 100644 --- a/openlp/plugins/songusage/forms/songusagedeleteform.py +++ b/openlp/plugins/songusage/forms/songusagedeleteform.py @@ -45,10 +45,9 @@ class SongUsageDeleteForm(QtGui.QDialog, Ui_SongUsageDeleteDialog): self.manager = manager QtGui.QDialog.__init__(self, parent) self.setupUi(self) - QtCore.QObject.connect(self.button_box, QtCore.SIGNAL(u'clicked(QAbstractButton*)'), - self.onButtonBoxClicked) + self.button_box.clicked.connect(self.on_button_box_clicked) - def onButtonBoxClicked(self, button): + def on_button_box_clicked(self, button): if self.button_box.standardButton(button) == QtGui.QDialogButtonBox.Ok: ret = QtGui.QMessageBox.question(self, translate('SongUsagePlugin.SongUsageDeleteForm', 'Delete Selected Song Usage Events?'), @@ -56,12 +55,12 @@ class SongUsageDeleteForm(QtGui.QDialog, Ui_SongUsageDeleteDialog): 'Are you sure you want to delete selected Song Usage data?'), QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes | QtGui.QMessageBox.No), QtGui.QMessageBox.No) if ret == QtGui.QMessageBox.Yes: - deleteDate = self.deleteCalendar.selectedDate().toPyDate() - self.manager.delete_all_objects(SongUsageItem, SongUsageItem.usagedate <= deleteDate) + delete_date = self.delete_calendar.selectedDate().toPyDate() + self.manager.delete_all_objects(SongUsageItem, SongUsageItem.usagedate <= delete_date) self.main_window.information_message( translate('SongUsagePlugin.SongUsageDeleteForm', 'Deletion Successful'), translate( - 'SongUsagePlugin.SongUsageDeleteForm', 'All requested data has been deleted successfully. ') + 'SongUsagePlugin.SongUsageDeleteForm', 'All requested data has been deleted successfully.') ) self.accept() else: @@ -75,4 +74,4 @@ class SongUsageDeleteForm(QtGui.QDialog, Ui_SongUsageDeleteDialog): self._main_window = Registry().get(u'main_window') return self._main_window - main_window = property(_get_main_window) \ No newline at end of file + main_window = property(_get_main_window) diff --git a/openlp/plugins/songusage/forms/songusagedetaildialog.py b/openlp/plugins/songusage/forms/songusagedetaildialog.py index 740771a2b..0cdde6836 100644 --- a/openlp/plugins/songusage/forms/songusagedetaildialog.py +++ b/openlp/plugins/songusage/forms/songusagedetaildialog.py @@ -32,56 +32,56 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import build_icon, translate from openlp.core.lib.ui import create_button_box + class Ui_SongUsageDetailDialog(object): def setupUi(self, songUsageDetailDialog): songUsageDetailDialog.setObjectName(u'songUsageDetailDialog') songUsageDetailDialog.resize(609, 413) - self.verticalLayout = QtGui.QVBoxLayout(songUsageDetailDialog) - self.verticalLayout.setSpacing(8) - self.verticalLayout.setContentsMargins(8, 8, 8, 8) - self.verticalLayout.setObjectName(u'verticalLayout') - self.dateRangeGroupBox = QtGui.QGroupBox(songUsageDetailDialog) - self.dateRangeGroupBox.setObjectName(u'dateRangeGroupBox') - self.dateHorizontalLayout = QtGui.QHBoxLayout(self.dateRangeGroupBox) - self.dateHorizontalLayout.setSpacing(8) - self.dateHorizontalLayout.setContentsMargins(8, 8, 8, 8) - self.dateHorizontalLayout.setObjectName(u'dateHorizontalLayout') - self.fromDate = QtGui.QCalendarWidget(self.dateRangeGroupBox) - self.fromDate.setObjectName(u'fromDate') - self.dateHorizontalLayout.addWidget(self.fromDate) - self.toLabel = QtGui.QLabel(self.dateRangeGroupBox) - self.toLabel.setScaledContents(False) - self.toLabel.setAlignment(QtCore.Qt.AlignCenter) - self.toLabel.setObjectName(u'toLabel') - self.dateHorizontalLayout.addWidget(self.toLabel) - self.toDate = QtGui.QCalendarWidget(self.dateRangeGroupBox) - self.toDate.setObjectName(u'toDate') - self.dateHorizontalLayout.addWidget(self.toDate) - self.verticalLayout.addWidget(self.dateRangeGroupBox) - self.fileGroupBox = QtGui.QGroupBox(self.dateRangeGroupBox) - self.fileGroupBox.setObjectName(u'fileGroupBox') - self.fileHorizontalLayout = QtGui.QHBoxLayout(self.fileGroupBox) - self.fileHorizontalLayout.setSpacing(8) - self.fileHorizontalLayout.setContentsMargins(8, 8, 8, 8) - self.fileHorizontalLayout.setObjectName(u'fileHorizontalLayout') - self.fileLineEdit = QtGui.QLineEdit(self.fileGroupBox) - self.fileLineEdit.setObjectName(u'fileLineEdit') - self.fileLineEdit.setReadOnly(True) - self.fileHorizontalLayout.addWidget(self.fileLineEdit) - self.saveFilePushButton = QtGui.QPushButton(self.fileGroupBox) - self.saveFilePushButton.setMaximumWidth(self.saveFilePushButton.size().height()) - self.saveFilePushButton.setIcon(build_icon(u':/general/general_open.png')) - self.saveFilePushButton.setObjectName(u'saveFilePushButton') - self.fileHorizontalLayout.addWidget(self.saveFilePushButton) - self.verticalLayout.addWidget(self.fileGroupBox) + self.vertical_layout = QtGui.QVBoxLayout(songUsageDetailDialog) + self.vertical_layout.setSpacing(8) + self.vertical_layout.setContentsMargins(8, 8, 8, 8) + self.vertical_layout.setObjectName(u'vertical_layout') + self.date_range_group_box = QtGui.QGroupBox(songUsageDetailDialog) + self.date_range_group_box.setObjectName(u'date_range_group_box') + self.date_horizontal_layout = QtGui.QHBoxLayout(self.date_range_group_box) + self.date_horizontal_layout.setSpacing(8) + self.date_horizontal_layout.setContentsMargins(8, 8, 8, 8) + self.date_horizontal_layout.setObjectName(u'date_horizontal_layout') + self.from_date = QtGui.QCalendarWidget(self.date_range_group_box) + self.from_date.setObjectName(u'from_date') + self.date_horizontal_layout.addWidget(self.from_date) + self.to_label = QtGui.QLabel(self.date_range_group_box) + self.to_label.setScaledContents(False) + self.to_label.setAlignment(QtCore.Qt.AlignCenter) + self.to_label.setObjectName(u'to_label') + self.date_horizontal_layout.addWidget(self.to_label) + self.to_date = QtGui.QCalendarWidget(self.date_range_group_box) + self.to_date.setObjectName(u'to_date') + self.date_horizontal_layout.addWidget(self.to_date) + self.vertical_layout.addWidget(self.date_range_group_box) + self.file_group_box = QtGui.QGroupBox(self.date_range_group_box) + self.file_group_box.setObjectName(u'file_group_box') + self.file_horizontal_layout = QtGui.QHBoxLayout(self.file_group_box) + self.file_horizontal_layout.setSpacing(8) + self.file_horizontal_layout.setContentsMargins(8, 8, 8, 8) + self.file_horizontal_layout.setObjectName(u'file_horizontal_layout') + self.file_line_edit = QtGui.QLineEdit(self.file_group_box) + self.file_line_edit.setObjectName(u'file_line_edit') + self.file_line_edit.setReadOnly(True) + self.file_horizontal_layout.addWidget(self.file_line_edit) + self.save_file_push_button = QtGui.QPushButton(self.file_group_box) + self.save_file_push_button.setMaximumWidth(self.save_file_push_button.size().height()) + self.save_file_push_button.setIcon(build_icon(u':/general/general_open.png')) + self.save_file_push_button.setObjectName(u'save_file_push_button') + self.file_horizontal_layout.addWidget(self.save_file_push_button) + self.vertical_layout.addWidget(self.file_group_box) self.button_box = create_button_box(songUsageDetailDialog, u'button_box', [u'cancel', u'ok']) - self.verticalLayout.addWidget(self.button_box) + self.vertical_layout.addWidget(self.button_box) self.retranslateUi(songUsageDetailDialog) - QtCore.QObject.connect(self.saveFilePushButton, QtCore.SIGNAL(u'clicked()'), - songUsageDetailDialog.defineOutputLocation) + self.save_file_push_button.clicked.connect(songUsageDetailDialog.define_output_location) def retranslateUi(self, songUsageDetailDialog): songUsageDetailDialog.setWindowTitle(translate('SongUsagePlugin.SongUsageDetailForm', 'Song Usage Extraction')) - self.dateRangeGroupBox.setTitle(translate('SongUsagePlugin.SongUsageDetailForm', 'Select Date Range')) - self.toLabel.setText(translate('SongUsagePlugin.SongUsageDetailForm', 'to')) - self.fileGroupBox.setTitle(translate('SongUsagePlugin.SongUsageDetailForm', 'Report Location')) + self.date_range_group_box.setTitle(translate('SongUsagePlugin.SongUsageDetailForm', 'Select Date Range')) + self.to_label.setText(translate('SongUsagePlugin.SongUsageDetailForm', 'to')) + self.file_group_box.setTitle(translate('SongUsagePlugin.SongUsageDetailForm', 'Report Location')) diff --git a/openlp/plugins/songusage/forms/songusagedetailform.py b/openlp/plugins/songusage/forms/songusagedetailform.py index 1f68e1a97..b660b9715 100644 --- a/openlp/plugins/songusage/forms/songusagedetailform.py +++ b/openlp/plugins/songusage/forms/songusagedetailform.py @@ -39,6 +39,7 @@ from songusagedetaildialog import Ui_SongUsageDetailDialog log = logging.getLogger(__name__) + class SongUsageDetailForm(QtGui.QDialog, Ui_SongUsageDetailDialog): """ Class documentation goes here. @@ -57,13 +58,13 @@ class SongUsageDetailForm(QtGui.QDialog, Ui_SongUsageDetailDialog): """ We need to set up the screen """ - toDate = Settings().value(self.plugin.settingsSection + u'/to date') - fromDate = Settings().value(self.plugin.settingsSection + u'/from date') - self.fromDate.setSelectedDate(fromDate) - self.toDate.setSelectedDate(toDate) - self.fileLineEdit.setText(Settings().value(self.plugin.settingsSection + u'/last directory export')) + to_date = Settings().value(self.plugin.settingsSection + u'/to date') + from_date = Settings().value(self.plugin.settingsSection + u'/from date') + self.from_date.setSelectedDate(from_date) + self.to_date.setSelectedDate(to_date) + self.file_line_edit.setText(Settings().value(self.plugin.settingsSection + u'/last directory export')) - def defineOutputLocation(self): + def define_output_location(self): """ Triggered when the Directory selection button is clicked """ @@ -72,14 +73,14 @@ class SongUsageDetailForm(QtGui.QDialog, Ui_SongUsageDetailDialog): Settings().value(self.plugin.settingsSection + u'/last directory export')) if path: Settings().setValue(self.plugin.settingsSection + u'/last directory export', path) - self.fileLineEdit.setText(path) + self.file_line_edit.setText(path) def accept(self): """ Ok was triggered so lets save the data and run the report """ log.debug(u'accept') - path = self.fileLineEdit.text() + path = self.file_line_edit.text() if not path: self.main_window.error_message( translate('SongUsagePlugin.SongUsageDetailForm', 'Output Path Not Selected'), @@ -88,36 +89,36 @@ class SongUsageDetailForm(QtGui.QDialog, Ui_SongUsageDetailDialog): ) return check_directory_exists(path) - filename = translate('SongUsagePlugin.SongUsageDetailForm', 'usage_detail_%s_%s.txt') % ( - self.fromDate.selectedDate().toString(u'ddMMyyyy'), - self.toDate.selectedDate().toString(u'ddMMyyyy')) - Settings().setValue(u'songusage/from date', self.fromDate.selectedDate()) - Settings().setValue(u'songusage/to date', self.toDate.selectedDate()) + file_name = translate('SongUsagePlugin.SongUsageDetailForm', 'usage_detail_%s_%s.txt') % ( + self.from_date.selectedDate().toString(u'ddMMyyyy'), + self.to_date.selectedDate().toString(u'ddMMyyyy')) + Settings().setValue(u'songusage/from date', self.from_date.selectedDate()) + Settings().setValue(u'songusage/to date', self.to_date.selectedDate()) usage = self.plugin.manager.get_all_objects( SongUsageItem, and_( - SongUsageItem.usagedate >= self.fromDate.selectedDate().toPyDate(), - SongUsageItem.usagedate < self.toDate.selectedDate().toPyDate()), + SongUsageItem.usagedate >= self.from_date.selectedDate().toPyDate(), + SongUsageItem.usagedate < self.to_date.selectedDate().toPyDate()), [SongUsageItem.usagedate, SongUsageItem.usagetime]) - outname = os.path.join(path, filename) - fileHandle = None + report_file_name = os.path.join(path, file_name) + file_handle = None try: - fileHandle = open(outname, u'w') + file_handle = open(report_file_name, u'w') for instance in usage: record = u'\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",' \ u'\"%s\",\"%s\"\n' % (instance.usagedate, instance.usagetime, instance.title, instance.copyright, instance.ccl_number, instance.authors, instance.plugin_name, instance.source) - fileHandle.write(record.encode(u'utf-8')) + file_handle.write(record.encode(u'utf-8')) self.main_window.information_message( translate('SongUsagePlugin.SongUsageDetailForm', 'Report Creation'), translate('SongUsagePlugin.SongUsageDetailForm', 'Report \n%s \n' - 'has been successfully created. ') % outname + 'has been successfully created. ') % report_file_name ) except IOError: log.exception(u'Failed to write out song usage records') finally: - if fileHandle: - fileHandle.close() + if file_handle: + file_handle.close() self.close() def _get_main_window(self): @@ -128,4 +129,4 @@ class SongUsageDetailForm(QtGui.QDialog, Ui_SongUsageDetailDialog): self._main_window = Registry().get(u'main_window') return self._main_window - main_window = property(_get_main_window) \ No newline at end of file + main_window = property(_get_main_window) diff --git a/openlp/plugins/songusage/songusageplugin.py b/openlp/plugins/songusage/songusageplugin.py index b91468531..5b56e2563 100644 --- a/openlp/plugins/songusage/songusageplugin.py +++ b/openlp/plugins/songusage/songusageplugin.py @@ -42,7 +42,6 @@ from openlp.plugins.songusage.lib.db import init_schema, SongUsageItem log = logging.getLogger(__name__) - YEAR = QtCore.QDate().currentDate().year() if QtCore.QDate().currentDate().month() < 9: YEAR -= 1 @@ -54,7 +53,7 @@ __default_settings__ = { u'songusage/to date': QtCore.QDate(YEAR, 8, 31), u'songusage/from date': QtCore.QDate(YEAR - 1, 9, 1), u'songusage/last directory export': u'' - } +} class SongUsagePlugin(Plugin): @@ -83,59 +82,59 @@ class SongUsagePlugin(Plugin): """ log.info(u'add tools menu') self.toolsMenu = tools_menu - self.songUsageMenu = QtGui.QMenu(tools_menu) - self.songUsageMenu.setObjectName(u'songUsageMenu') - self.songUsageMenu.setTitle(translate('SongUsagePlugin', '&Song Usage Tracking')) + self.song_usage_menu = QtGui.QMenu(tools_menu) + self.song_usage_menu.setObjectName(u'song_usage_menu') + self.song_usage_menu.setTitle(translate('SongUsagePlugin', '&Song Usage Tracking')) # SongUsage Delete - self.songUsageDelete = create_action(tools_menu, u'songUsageDelete', + self.song_usage_delete = create_action(tools_menu, u'songUsageDelete', text=translate('SongUsagePlugin', '&Delete Tracking Data'), statustip=translate('SongUsagePlugin', 'Delete song usage data up to a specified date.'), - triggers=self.onSongUsageDelete) + triggers=self.on_song_usage_delete) # SongUsage Report - self.songUsageReport = create_action(tools_menu, u'songUsageReport', + self.song_usage_report = create_action(tools_menu, u'songUsageReport', text=translate('SongUsagePlugin', '&Extract Tracking Data'), statustip=translate('SongUsagePlugin', 'Generate a report on song usage.'), - triggers=self.onSongUsageReport) + triggers=self.on_song_usage_report) # SongUsage activation - self.songUsageStatus = create_action(tools_menu, u'songUsageStatus', + self.song_usage_status = create_action(tools_menu, u'songUsageStatus', text=translate('SongUsagePlugin', 'Toggle Tracking'), statustip=translate('SongUsagePlugin', 'Toggle the tracking of song usage.'), checked=False, - shortcuts=[QtCore.Qt.Key_F4], triggers=self.toggleSongUsageState) + shortcuts=[QtCore.Qt.Key_F4], triggers=self.toggle_song_usage_state) # Add Menus together - self.toolsMenu.addAction(self.songUsageMenu.menuAction()) - self.songUsageMenu.addAction(self.songUsageStatus) - self.songUsageMenu.addSeparator() - self.songUsageMenu.addAction(self.songUsageReport) - self.songUsageMenu.addAction(self.songUsageDelete) - self.songUsageActiveButton = QtGui.QToolButton(self.main_window.statusBar) - self.songUsageActiveButton.setCheckable(True) - self.songUsageActiveButton.setAutoRaise(True) - self.songUsageActiveButton.setStatusTip(translate('SongUsagePlugin', 'Toggle the tracking of song usage.')) - self.songUsageActiveButton.setObjectName(u'songUsageActiveButton') - self.main_window.statusBar.insertPermanentWidget(1, self.songUsageActiveButton) - self.songUsageActiveButton.hide() + self.toolsMenu.addAction(self.song_usage_menu.menuAction()) + self.song_usage_menu.addAction(self.song_usage_status) + self.song_usage_menu.addSeparator() + self.song_usage_menu.addAction(self.song_usage_report) + self.song_usage_menu.addAction(self.song_usage_delete) + self.song_usage_active_button = QtGui.QToolButton(self.main_window.statusBar) + self.song_usage_active_button.setCheckable(True) + self.song_usage_active_button.setAutoRaise(True) + self.song_usage_active_button.setStatusTip(translate('SongUsagePlugin', 'Toggle the tracking of song usage.')) + self.song_usage_active_button.setObjectName(u'song_usage_active_button') + self.main_window.statusBar.insertPermanentWidget(1, self.song_usage_active_button) + self.song_usage_active_button.hide() # Signals and slots - QtCore.QObject.connect(self.songUsageStatus, QtCore.SIGNAL(u'visibilityChanged(bool)'), - self.songUsageStatus.setChecked) - QtCore.QObject.connect(self.songUsageActiveButton, QtCore.SIGNAL(u'toggled(bool)'), self.toggleSongUsageState) - self.songUsageMenu.menuAction().setVisible(False) + QtCore.QObject.connect(self.song_usage_status, QtCore.SIGNAL(u'visibilityChanged(bool)'), + self.song_usage_status.setChecked) + self.song_usage_active_button.toggled.connect(self.toggle_song_usage_state) + self.song_usage_menu.menuAction().setVisible(False) def initialise(self): log.info(u'SongUsage Initialising') Plugin.initialise(self) Registry().register_function(u'slidecontroller_live_started', self.display_song_usage) Registry().register_function(u'print_service_started', self.print_song_usage) - self.songUsageActive = Settings().value(self.settingsSection + u'/active') + self.song_usage_active = Settings().value(self.settingsSection + u'/active') # Set the button and checkbox state - self.setButtonState() + self.set_button_state() action_list = ActionList.get_instance() - action_list.add_action(self.songUsageStatus, translate('SongUsagePlugin', 'Song Usage')) - action_list.add_action(self.songUsageDelete, translate('SongUsagePlugin', 'Song Usage')) - action_list.add_action(self.songUsageReport, translate('SongUsagePlugin', 'Song Usage')) - self.songUsageDeleteForm = SongUsageDeleteForm(self.manager, self.main_window) - self.songUsageDetailForm = SongUsageDetailForm(self, self.main_window) - self.songUsageMenu.menuAction().setVisible(True) - self.songUsageActiveButton.show() + action_list.add_action(self.song_usage_status, translate('SongUsagePlugin', 'Song Usage')) + action_list.add_action(self.song_usage_delete, translate('SongUsagePlugin', 'Song Usage')) + action_list.add_action(self.song_usage_report, translate('SongUsagePlugin', 'Song Usage')) + self.song_usage_delete_form = SongUsageDeleteForm(self.manager, self.main_window) + self.song_usage_detail_form = SongUsageDetailForm(self, self.main_window) + self.song_usage_menu.menuAction().setVisible(True) + self.song_usage_active_button.show() def finalise(self): """ @@ -144,44 +143,43 @@ class SongUsagePlugin(Plugin): log.info(u'Plugin Finalise') self.manager.finalise() Plugin.finalise(self) - self.songUsageMenu.menuAction().setVisible(False) + self.song_usage_menu.menuAction().setVisible(False) action_list = ActionList.get_instance() - action_list.remove_action(self.songUsageStatus, translate('SongUsagePlugin', 'Song Usage')) - action_list.remove_action(self.songUsageDelete, translate('SongUsagePlugin', 'Song Usage')) - action_list.remove_action(self.songUsageReport, translate('SongUsagePlugin', 'Song Usage')) - self.songUsageActiveButton.hide() + action_list.remove_action(self.song_usage_status, translate('SongUsagePlugin', 'Song Usage')) + action_list.remove_action(self.song_usage_delete, translate('SongUsagePlugin', 'Song Usage')) + action_list.remove_action(self.song_usage_report, translate('SongUsagePlugin', 'Song Usage')) + self.song_usage_active_button.hide() # stop any events being processed - self.songUsageActive = False + self.song_usage_active = False - def toggleSongUsageState(self): + def toggle_song_usage_state(self): """ Manage the state of the audit collection and amend the UI when necessary, """ - self.songUsageActive = not self.songUsageActive - Settings().setValue(self.settingsSection + u'/active', self.songUsageActive) - self.setButtonState() + self.song_usage_active = not self.song_usage_active + Settings().setValue(self.settingsSection + u'/active', self.song_usage_active) + self.set_button_state() - def setButtonState(self): + def set_button_state(self): """ Keep buttons inline. Turn of signals to stop dead loop but we need the button and check box set correctly. """ - self.songUsageActiveButton.blockSignals(True) - self.songUsageStatus.blockSignals(True) + self.song_usage_active_button.blockSignals(True) + self.song_usage_status.blockSignals(True) if self.songUsageActive: - self.songUsageActiveButton.setIcon(self.activeIcon) - self.songUsageStatus.setChecked(True) - self.songUsageActiveButton.setChecked(True) - self.songUsageActiveButton.setToolTip(translate('SongUsagePlugin', 'Song usage tracking is active.')) + self.song_usage_active_button.setIcon(self.activeIcon) + self.song_usage_status.setChecked(True) + self.song_usage_active_button.setChecked(True) + self.song_usage_active_button.setToolTip(translate('SongUsagePlugin', 'Song usage tracking is active.')) else: - self.songUsageActiveButton.setIcon(self.inactiveIcon) - self.songUsageStatus.setChecked(False) - self.songUsageActiveButton.setChecked(False) - self.songUsageActiveButton.setToolTip(translate('SongUsagePlugin', 'Song usage tracking is inactive.')) - self.songUsageActiveButton.blockSignals(False) - self.songUsageStatus.blockSignals(False) - + self.song_usage_active_button.setIcon(self.inactiveIcon) + self.song_usage_status.setChecked(False) + self.song_usage_active_button.setChecked(False) + self.song_usage_active_button.setToolTip(translate('SongUsagePlugin', 'Song usage tracking is inactive.')) + self.song_usage_active_button.blockSignals(False) + self.song_usage_status.blockSignals(False) def display_song_usage(self, item): """ @@ -209,12 +207,12 @@ class SongUsagePlugin(Plugin): song_usage_item.source = source self.manager.save_object(song_usage_item) - def onSongUsageDelete(self): - self.songUsageDeleteForm.exec_() + def on_song_usage_delete(self): + self.song_usage_delete_form.exec_() - def onSongUsageReport(self): - self.songUsageDetailForm.initialise() - self.songUsageDetailForm.exec_() + def on_song_usage_report(self): + self.song_usage_detail_form.initialise() + self.song_usage_detail_form.exec_() def about(self): about_text = translate('SongUsagePlugin', 'SongUsage Plugin' From 0d6e9389b906ef195f08167d9baa01a20111e79d Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 16 Feb 2013 13:02:20 +0000 Subject: [PATCH 13/24] Clean up Song Usage dialog --- .../songusage/forms/songusagedetaildialog.py | 32 +++++++++---------- .../songusage/forms/songusagedetailform.py | 18 +++++------ openlp/plugins/songusage/songusageplugin.py | 6 ++-- .../openlp_core_lib/test_image_manager.py | 3 +- 4 files changed, 29 insertions(+), 30 deletions(-) diff --git a/openlp/plugins/songusage/forms/songusagedetaildialog.py b/openlp/plugins/songusage/forms/songusagedetaildialog.py index 0cdde6836..47fc9bf27 100644 --- a/openlp/plugins/songusage/forms/songusagedetaildialog.py +++ b/openlp/plugins/songusage/forms/songusagedetaildialog.py @@ -34,30 +34,30 @@ from openlp.core.lib.ui import create_button_box class Ui_SongUsageDetailDialog(object): - def setupUi(self, songUsageDetailDialog): - songUsageDetailDialog.setObjectName(u'songUsageDetailDialog') - songUsageDetailDialog.resize(609, 413) - self.vertical_layout = QtGui.QVBoxLayout(songUsageDetailDialog) + def setupUi(self, song_usage_detail_dialog): + song_usage_detail_dialog.setObjectName(u'song_usage_detail_dialog') + song_usage_detail_dialog.resize(609, 413) + self.vertical_layout = QtGui.QVBoxLayout(song_usage_detail_dialog) self.vertical_layout.setSpacing(8) self.vertical_layout.setContentsMargins(8, 8, 8, 8) self.vertical_layout.setObjectName(u'vertical_layout') - self.date_range_group_box = QtGui.QGroupBox(songUsageDetailDialog) + self.date_range_group_box = QtGui.QGroupBox(song_usage_detail_dialog) self.date_range_group_box.setObjectName(u'date_range_group_box') self.date_horizontal_layout = QtGui.QHBoxLayout(self.date_range_group_box) self.date_horizontal_layout.setSpacing(8) self.date_horizontal_layout.setContentsMargins(8, 8, 8, 8) self.date_horizontal_layout.setObjectName(u'date_horizontal_layout') - self.from_date = QtGui.QCalendarWidget(self.date_range_group_box) - self.from_date.setObjectName(u'from_date') - self.date_horizontal_layout.addWidget(self.from_date) + self.from_date_calendar = QtGui.QCalendarWidget(self.date_range_group_box) + self.from_date_calendar.setObjectName(u'from_date_calendar') + self.date_horizontal_layout.addWidget(self.from_date_calendar) self.to_label = QtGui.QLabel(self.date_range_group_box) self.to_label.setScaledContents(False) self.to_label.setAlignment(QtCore.Qt.AlignCenter) self.to_label.setObjectName(u'to_label') self.date_horizontal_layout.addWidget(self.to_label) - self.to_date = QtGui.QCalendarWidget(self.date_range_group_box) - self.to_date.setObjectName(u'to_date') - self.date_horizontal_layout.addWidget(self.to_date) + self.to_date_calendar = QtGui.QCalendarWidget(self.date_range_group_box) + self.to_date_calendar.setObjectName(u'to_date_calendar') + self.date_horizontal_layout.addWidget(self.to_date_calendar) self.vertical_layout.addWidget(self.date_range_group_box) self.file_group_box = QtGui.QGroupBox(self.date_range_group_box) self.file_group_box.setObjectName(u'file_group_box') @@ -75,13 +75,13 @@ class Ui_SongUsageDetailDialog(object): self.save_file_push_button.setObjectName(u'save_file_push_button') self.file_horizontal_layout.addWidget(self.save_file_push_button) self.vertical_layout.addWidget(self.file_group_box) - self.button_box = create_button_box(songUsageDetailDialog, u'button_box', [u'cancel', u'ok']) + self.button_box = create_button_box(song_usage_detail_dialog, u'button_box', [u'cancel', u'ok']) self.vertical_layout.addWidget(self.button_box) - self.retranslateUi(songUsageDetailDialog) - self.save_file_push_button.clicked.connect(songUsageDetailDialog.define_output_location) + self.retranslateUi(song_usage_detail_dialog) + self.save_file_push_button.clicked.connect(song_usage_detail_dialog.define_output_location) - def retranslateUi(self, songUsageDetailDialog): - songUsageDetailDialog.setWindowTitle(translate('SongUsagePlugin.SongUsageDetailForm', 'Song Usage Extraction')) + def retranslateUi(self, song_usage_detail_dialog): + song_usage_detail_dialog.setWindowTitle(translate('SongUsagePlugin.SongUsageDetailForm', 'Song Usage Extraction')) self.date_range_group_box.setTitle(translate('SongUsagePlugin.SongUsageDetailForm', 'Select Date Range')) self.to_label.setText(translate('SongUsagePlugin.SongUsageDetailForm', 'to')) self.file_group_box.setTitle(translate('SongUsagePlugin.SongUsageDetailForm', 'Report Location')) diff --git a/openlp/plugins/songusage/forms/songusagedetailform.py b/openlp/plugins/songusage/forms/songusagedetailform.py index b660b9715..69611fd69 100644 --- a/openlp/plugins/songusage/forms/songusagedetailform.py +++ b/openlp/plugins/songusage/forms/songusagedetailform.py @@ -58,10 +58,8 @@ class SongUsageDetailForm(QtGui.QDialog, Ui_SongUsageDetailDialog): """ We need to set up the screen """ - to_date = Settings().value(self.plugin.settingsSection + u'/to date') - from_date = Settings().value(self.plugin.settingsSection + u'/from date') - self.from_date.setSelectedDate(from_date) - self.to_date.setSelectedDate(to_date) + self.from_date_calendar.setSelectedDate(Settings().value(self.plugin.settingsSection + u'/from date')) + self.to_date_calendar.setSelectedDate(Settings().value(self.plugin.settingsSection + u'/to date')) self.file_line_edit.setText(Settings().value(self.plugin.settingsSection + u'/last directory export')) def define_output_location(self): @@ -90,14 +88,14 @@ class SongUsageDetailForm(QtGui.QDialog, Ui_SongUsageDetailDialog): return check_directory_exists(path) file_name = translate('SongUsagePlugin.SongUsageDetailForm', 'usage_detail_%s_%s.txt') % ( - self.from_date.selectedDate().toString(u'ddMMyyyy'), - self.to_date.selectedDate().toString(u'ddMMyyyy')) - Settings().setValue(u'songusage/from date', self.from_date.selectedDate()) - Settings().setValue(u'songusage/to date', self.to_date.selectedDate()) + self.from_date_calendar.selectedDate().toString(u'ddMMyyyy'), + self.to_date_calendar.selectedDate().toString(u'ddMMyyyy')) + Settings().setValue(self.plugin.settingsSection + u'/from date', self.from_date_calendar.selectedDate()) + Settings().setValue(self.plugin.settingsSection + u'/to date', self.to_date_calendar.selectedDate()) usage = self.plugin.manager.get_all_objects( SongUsageItem, and_( - SongUsageItem.usagedate >= self.from_date.selectedDate().toPyDate(), - SongUsageItem.usagedate < self.to_date.selectedDate().toPyDate()), + SongUsageItem.usagedate >= self.from_date_calendar.selectedDate().toPyDate(), + SongUsageItem.usagedate < self.to_date_calendar.selectedDate().toPyDate()), [SongUsageItem.usagedate, SongUsageItem.usagetime]) report_file_name = os.path.join(path, file_name) file_handle = None diff --git a/openlp/plugins/songusage/songusageplugin.py b/openlp/plugins/songusage/songusageplugin.py index 5b56e2563..19b56a339 100644 --- a/openlp/plugins/songusage/songusageplugin.py +++ b/openlp/plugins/songusage/songusageplugin.py @@ -66,7 +66,7 @@ class SongUsagePlugin(Plugin): self.icon = build_icon(u':/plugins/plugin_songusage.png') self.activeIcon = build_icon(u':/songusage/song_usage_active.png') self.inactiveIcon = build_icon(u':/songusage/song_usage_inactive.png') - self.songUsageActive = False + self.song_usage_active = False def checkPreConditions(self): return self.manager.session is not None @@ -168,7 +168,7 @@ class SongUsagePlugin(Plugin): """ self.song_usage_active_button.blockSignals(True) self.song_usage_status.blockSignals(True) - if self.songUsageActive: + if self.song_usage_active: self.song_usage_active_button.setIcon(self.activeIcon) self.song_usage_status.setChecked(True) self.song_usage_active_button.setChecked(True) @@ -195,7 +195,7 @@ class SongUsagePlugin(Plugin): def _add_song_usage(self, source, item): audit = item[0].audit - if self.songUsageActive and audit: + if self.song_usage_active and audit: song_usage_item = SongUsageItem() song_usage_item.usagedate = datetime.today() song_usage_item.usagetime = datetime.now().time() diff --git a/tests/functional/openlp_core_lib/test_image_manager.py b/tests/functional/openlp_core_lib/test_image_manager.py index d13c82c04..a257fec20 100644 --- a/tests/functional/openlp_core_lib/test_image_manager.py +++ b/tests/functional/openlp_core_lib/test_image_manager.py @@ -28,7 +28,8 @@ class TestImageManager(TestCase): """ Delete all the C++ objects at the end so that we don't have a segfault """ - del self.app + #del self.app + pass def basic_image_manager_test(self): """ From 310f6032ed8db7300ac6fffe87a76cb047db4a0c Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 16 Feb 2013 13:24:56 +0000 Subject: [PATCH 14/24] tidy ups --- openlp/core/ui/servicemanager.py | 8 ++++---- openlp/core/ui/thememanager.py | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 7762d72aa..8ecc900be 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -205,10 +205,6 @@ class ServiceManagerDialog(object): self.service_manager_list.doubleClicked.connect(self.on_make_live) self.service_manager_list.itemCollapsed.connect(self.collapsed) self.service_manager_list.itemExpanded.connect(self.expanded) - Registry().register_function(u'theme_update_list', self.update_theme_list) - Registry().register_function(u'config_updated', self.config_updated) - Registry().register_function(u'config_screen_changed', self.regenerate_service_Items) - Registry().register_function(u'theme_update_global', self.theme_change) # Last little bits of setting up self.service_theme = Settings().value(self.main_window.serviceManagerSettingsSection + u'/service theme') self.servicePath = AppLocation.get_section_data_path(u'servicemanager') @@ -268,6 +264,10 @@ class ServiceManagerDialog(object): self.service_manager_list.expand, self.service_manager_list.collapse ]) + Registry().register_function(u'theme_update_list', self.update_theme_list) + Registry().register_function(u'config_updated', self.config_updated) + Registry().register_function(u'config_screen_changed', self.regenerate_service_Items) + Registry().register_function(u'theme_update_global', self.theme_change) def drag_enter_event(self, event): """ diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index 99e78d34e..96ebfa694 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -157,7 +157,6 @@ class ThemeManager(QtGui.QWidget): delete_file(theme_file) self.application.set_normal_cursor() - def config_updated(self): """ Triggered when Config dialog is updated. From a14f624a81821718c8bf959b30d39b0b82ef3f6c Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 16 Feb 2013 20:45:15 +0000 Subject: [PATCH 15/24] Fixes --- tests/functional/openlp_core_lib/__init__.py | 8 -------- tests/functional/openlp_core_lib/test_image_manager.py | 3 +-- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/tests/functional/openlp_core_lib/__init__.py b/tests/functional/openlp_core_lib/__init__.py index e0da50eb3..e69de29bb 100644 --- a/tests/functional/openlp_core_lib/__init__.py +++ b/tests/functional/openlp_core_lib/__init__.py @@ -1,8 +0,0 @@ -import sip -sip.setapi(u'QDate', 2) -sip.setapi(u'QDateTime', 2) -sip.setapi(u'QString', 2) -sip.setapi(u'QTextStream', 2) -sip.setapi(u'QTime', 2) -sip.setapi(u'QUrl', 2) -sip.setapi(u'QVariant', 2) \ No newline at end of file diff --git a/tests/functional/openlp_core_lib/test_image_manager.py b/tests/functional/openlp_core_lib/test_image_manager.py index a257fec20..d13c82c04 100644 --- a/tests/functional/openlp_core_lib/test_image_manager.py +++ b/tests/functional/openlp_core_lib/test_image_manager.py @@ -28,8 +28,7 @@ class TestImageManager(TestCase): """ Delete all the C++ objects at the end so that we don't have a segfault """ - #del self.app - pass + del self.app def basic_image_manager_test(self): """ From ba37105bbfcad8fb8dfb83aae5ff68df813517cf Mon Sep 17 00:00:00 2001 From: phill-ridout Date: Sun, 17 Feb 2013 08:29:23 +0000 Subject: [PATCH 16/24] Fixed OpenLP not starting --- openlp/plugins/presentations/lib/pptviewcontroller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/plugins/presentations/lib/pptviewcontroller.py b/openlp/plugins/presentations/lib/pptviewcontroller.py index af66f623d..a2dc56f52 100644 --- a/openlp/plugins/presentations/lib/pptviewcontroller.py +++ b/openlp/plugins/presentations/lib/pptviewcontroller.py @@ -84,7 +84,7 @@ class PptviewController(PresentationController): if self.process: return log.debug(u'start PPTView') - dllpath = os.path.join(self.plugin_manager.basepath, u'presentations', u'lib', u'pptviewlib', + dllpath = os.path.join(self.plugin_manager.base_path, u'presentations', u'lib', u'pptviewlib', u'pptviewlib.dll') self.process = cdll.LoadLibrary(dllpath) if log.isEnabledFor(logging.DEBUG): From 480b666918a56781e1f722af7d399c2dac0ebca8 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sun, 17 Feb 2013 13:57:52 +0100 Subject: [PATCH 17/24] cleaned pluginmanager constructor --- openlp/core/lib/pluginmanager.py | 8 +++----- openlp/core/ui/mainwindow.py | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/openlp/core/lib/pluginmanager.py b/openlp/core/lib/pluginmanager.py index 06f0e36eb..43410b4a7 100644 --- a/openlp/core/lib/pluginmanager.py +++ b/openlp/core/lib/pluginmanager.py @@ -35,6 +35,7 @@ import logging import imp from openlp.core.lib import Plugin, PluginStatus, Registry +from openlp.core.utils import AppLocation log = logging.getLogger(__name__) @@ -46,17 +47,14 @@ class PluginManager(object): """ log.info(u'Plugin manager loaded') - def __init__(self, plugin_dir): + def __init__(self): """ The constructor for the plugin manager. Passes the controllers on to the plugins for them to interact with via their ServiceItems. - - ``plugin_dir`` - The directory to search for plugins. """ log.info(u'Plugin manager Initialising') Registry().register(u'plugin_manager', self) - self.base_path = os.path.abspath(plugin_dir) + self.base_path = os.path.abspath(AppLocation.get_directory(AppLocation.PluginsDir)) log.debug(u'Base path %s ', self.base_path) self.plugins = [] log.info(u'Plugin manager Initialised') diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 695c4073a..a4ff5823b 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -487,7 +487,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): self.timer_id = 0 self.timer_version_id = 0 # Set up the path with plugins - self.plugin_manager = PluginManager(AppLocation.get_directory(AppLocation.PluginsDir)) + self.plugin_manager = PluginManager() self.imageManager = ImageManager() # Set up the interface self.setupUi(self) From b58773cbfe49fbebe4a7a21c163bec6e2e95e4fb Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sun, 17 Feb 2013 14:03:59 +0100 Subject: [PATCH 18/24] fixed tests --- .../openlp_core_lib/test_pluginmanager.py | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/tests/functional/openlp_core_lib/test_pluginmanager.py b/tests/functional/openlp_core_lib/test_pluginmanager.py index bad38d721..fef9b54d6 100644 --- a/tests/functional/openlp_core_lib/test_pluginmanager.py +++ b/tests/functional/openlp_core_lib/test_pluginmanager.py @@ -28,7 +28,7 @@ class TestPluginManager(TestCase): # GIVEN: A PluginManager instance and a list with a mocked up plugin whose status is set to Disabled mocked_plugin = MagicMock() mocked_plugin.status = PluginStatus.Disabled - plugin_manager = PluginManager('') + plugin_manager = PluginManager() plugin_manager.plugins = [mocked_plugin] # WHEN: We run hook_media_manager() @@ -45,7 +45,7 @@ class TestPluginManager(TestCase): # GIVEN: A PluginManager instance and a list with a mocked up plugin whose status is set to Active mocked_plugin = MagicMock() mocked_plugin.status = PluginStatus.Active - plugin_manager = PluginManager('') + plugin_manager = PluginManager() plugin_manager.plugins = [mocked_plugin] # WHEN: We run hook_media_manager() @@ -61,7 +61,7 @@ class TestPluginManager(TestCase): # GIVEN: A PluginManager instance and a list with a mocked up plugin whose status is set to Disabled mocked_plugin = MagicMock() mocked_plugin.status = PluginStatus.Disabled - plugin_manager = PluginManager('') + plugin_manager = PluginManager() plugin_manager.plugins = [mocked_plugin] # WHEN: We run hook_settings_tabs() @@ -79,7 +79,7 @@ class TestPluginManager(TestCase): mocked_plugin = MagicMock() mocked_plugin.status = PluginStatus.Disabled mocked_settings_form = MagicMock() - plugin_manager = PluginManager('') + plugin_manager = PluginManager() plugin_manager.plugins = [mocked_plugin] # WHEN: We run hook_settings_tabs() @@ -98,7 +98,7 @@ class TestPluginManager(TestCase): # GIVEN: A PluginManager instance and a list with a mocked up plugin whose status is set to Active mocked_plugin = MagicMock() mocked_plugin.status = PluginStatus.Active - plugin_manager = PluginManager('') + plugin_manager = PluginManager() plugin_manager.plugins = [mocked_plugin] # WHEN: We run hook_settings_tabs() @@ -115,7 +115,7 @@ class TestPluginManager(TestCase): mocked_plugin = MagicMock() mocked_plugin.status = PluginStatus.Active mocked_settings_form = MagicMock() - plugin_manager = PluginManager('') + plugin_manager = PluginManager() plugin_manager.plugins = [mocked_plugin] # WHEN: We run hook_settings_tabs() @@ -134,7 +134,7 @@ class TestPluginManager(TestCase): mocked_plugin = MagicMock() mocked_plugin.status = PluginStatus.Disabled mocked_import_menu = MagicMock() - plugin_manager = PluginManager('') + plugin_manager = PluginManager() plugin_manager.plugins = [mocked_plugin] # WHEN: We run hook_import_menu() @@ -152,7 +152,7 @@ class TestPluginManager(TestCase): mocked_plugin = MagicMock() mocked_plugin.status = PluginStatus.Active mocked_import_menu = MagicMock() - plugin_manager = PluginManager('') + plugin_manager = PluginManager() plugin_manager.plugins = [mocked_plugin] # WHEN: We run hook_import_menu() @@ -169,7 +169,7 @@ class TestPluginManager(TestCase): mocked_plugin = MagicMock() mocked_plugin.status = PluginStatus.Disabled mocked_export_menu = MagicMock() - plugin_manager = PluginManager('') + plugin_manager = PluginManager() plugin_manager.plugins = [mocked_plugin] # WHEN: We run hook_export_menu() @@ -187,7 +187,7 @@ class TestPluginManager(TestCase): mocked_plugin = MagicMock() mocked_plugin.status = PluginStatus.Active mocked_export_menu = MagicMock() - plugin_manager = PluginManager('') + plugin_manager = PluginManager() plugin_manager.plugins = [mocked_plugin] # WHEN: We run hook_export_menu() @@ -204,7 +204,7 @@ class TestPluginManager(TestCase): mocked_plugin = MagicMock() mocked_plugin.status = PluginStatus.Disabled mocked_tools_menu = MagicMock() - plugin_manager = PluginManager('') + plugin_manager = PluginManager() plugin_manager.plugins = [mocked_plugin] # WHEN: We run hook_tools_menu() @@ -222,7 +222,7 @@ class TestPluginManager(TestCase): mocked_plugin = MagicMock() mocked_plugin.status = PluginStatus.Active mocked_tools_menu = MagicMock() - plugin_manager = PluginManager('') + plugin_manager = PluginManager() plugin_manager.plugins = [mocked_plugin] # WHEN: We run hook_tools_menu() @@ -239,7 +239,7 @@ class TestPluginManager(TestCase): mocked_plugin = MagicMock() mocked_plugin.status = PluginStatus.Disabled mocked_plugin.isActive.return_value = False - plugin_manager = PluginManager('') + plugin_manager = PluginManager() plugin_manager.plugins = [mocked_plugin] # WHEN: We run initialise_plugins() @@ -257,7 +257,7 @@ class TestPluginManager(TestCase): mocked_plugin = MagicMock() mocked_plugin.status = PluginStatus.Active mocked_plugin.isActive.return_value = True - plugin_manager = PluginManager('') + plugin_manager = PluginManager() plugin_manager.plugins = [mocked_plugin] # WHEN: We run initialise_plugins() @@ -275,7 +275,7 @@ class TestPluginManager(TestCase): mocked_plugin = MagicMock() mocked_plugin.status = PluginStatus.Disabled mocked_plugin.isActive.return_value = False - plugin_manager = PluginManager('') + plugin_manager = PluginManager() plugin_manager.plugins = [mocked_plugin] # WHEN: We run finalise_plugins() @@ -293,7 +293,7 @@ class TestPluginManager(TestCase): mocked_plugin = MagicMock() mocked_plugin.status = PluginStatus.Active mocked_plugin.isActive.return_value = True - plugin_manager = PluginManager('') + plugin_manager = PluginManager() plugin_manager.plugins = [mocked_plugin] # WHEN: We run finalise_plugins() @@ -310,7 +310,7 @@ class TestPluginManager(TestCase): # GIVEN: A PluginManager instance and a list with a mocked up plugin whose status is set to Active mocked_plugin = MagicMock() mocked_plugin.name = 'Mocked Plugin' - plugin_manager = PluginManager('') + plugin_manager = PluginManager() plugin_manager.plugins = [mocked_plugin] # WHEN: We run finalise_plugins() @@ -326,7 +326,7 @@ class TestPluginManager(TestCase): # GIVEN: A PluginManager instance and a list with a mocked up plugin whose status is set to Active mocked_plugin = MagicMock() mocked_plugin.name = 'Mocked Plugin' - plugin_manager = PluginManager('') + plugin_manager = PluginManager() plugin_manager.plugins = [mocked_plugin] # WHEN: We run finalise_plugins() @@ -343,7 +343,7 @@ class TestPluginManager(TestCase): mocked_plugin = MagicMock() mocked_plugin.status = PluginStatus.Disabled mocked_plugin.isActive.return_value = False - plugin_manager = PluginManager('') + plugin_manager = PluginManager() plugin_manager.plugins = [mocked_plugin] # WHEN: We run finalise_plugins() @@ -362,7 +362,7 @@ class TestPluginManager(TestCase): mocked_plugin = MagicMock() mocked_plugin.status = PluginStatus.Active mocked_plugin.isActive.return_value = True - plugin_manager = PluginManager('') + plugin_manager = PluginManager() plugin_manager.plugins = [mocked_plugin] # WHEN: We run new_service_created() From 4366d8307da4da36a806370c9e3ee12df84cefab Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Mon, 18 Feb 2013 12:09:09 +0100 Subject: [PATCH 19/24] fixed interface test --- tests/interfaces/openlp_core_lib/test_pluginmanager.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/interfaces/openlp_core_lib/test_pluginmanager.py b/tests/interfaces/openlp_core_lib/test_pluginmanager.py index ca8ed3f07..086543731 100644 --- a/tests/interfaces/openlp_core_lib/test_pluginmanager.py +++ b/tests/interfaces/openlp_core_lib/test_pluginmanager.py @@ -29,7 +29,6 @@ class TestPluginManager(TestCase): self.app = QtGui.QApplication.instance() self.main_window = QtGui.QMainWindow() Registry().register(u'main_window', self.main_window) - self.plugins_dir = os.path.abspath(os.path.join(os.path.basename(__file__), u'..', u'openlp', u'plugins')) def tearDown(self): os.unlink(self.ini_file) @@ -40,7 +39,7 @@ class TestPluginManager(TestCase): Test the find_plugins() method to ensure it imports the correct plugins. """ # GIVEN: A plugin manager - plugin_manager = PluginManager(self.plugins_dir) + plugin_manager = PluginManager() # WHEN: We mock out sys.platform to make it return "darwin" and then find the plugins old_platform = sys.platform From 45ed3bd97eb63a39a1b78c6f04eaf2004f762b96 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 18 Feb 2013 20:44:55 +0000 Subject: [PATCH 20/24] Test messages --- tests/functional/openlp_core_lib/test_settings.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/functional/openlp_core_lib/test_settings.py b/tests/functional/openlp_core_lib/test_settings.py index 779a1569d..634865369 100644 --- a/tests/functional/openlp_core_lib/test_settings.py +++ b/tests/functional/openlp_core_lib/test_settings.py @@ -17,7 +17,7 @@ class TestSettings(TestCase): """ Create the UI """ - self.application = QtGui.QApplication([]) + self.application = QtGui.QApplication.instance() self.application.setOrganizationName(u'OpenLP-tests') self.application.setOrganizationDomain(u'openlp.org') Settings() @@ -48,7 +48,7 @@ class TestSettings(TestCase): Settings().setValue(u'general/has run wizard', True) # THEN the new value is returned when re-read - assert Settings().value(u'general/has run wizard') is True, u'The saved value has not been returned' + assert Settings().value(u'general/has run wizard') is True, u'The saved value should have been returned' def settings_override_test(self): """ @@ -64,13 +64,13 @@ class TestSettings(TestCase): extend = Settings().value(u'test/extend') # THEN the default value is returned - assert extend == u'very wide', u'The default value defined is returned' + assert extend == u'very wide', u'The default value of "very wide" should be returned' # WHEN a new value is saved into config Settings().setValue(u'test/extend', u'very short') # THEN the new value is returned when re-read - assert Settings().value(u'test/extend') == u'very short', u'The saved value is returned' + assert Settings().value(u'test/extend') == u'very short', u'The saved value should be returned' def settings_override_with_group_test(self): """ @@ -88,10 +88,10 @@ class TestSettings(TestCase): extend = settings.value(u'extend') # THEN the default value is returned - assert extend == u'very wide', u'The default value defined has not been returned' + assert extend == u'very wide', u'The default value defined should be returned' # WHEN a new value is saved into config Settings().setValue(u'test/extend', u'very short') # THEN the new value is returned when re-read - assert Settings().value(u'test/extend') == u'very short', u'The saved value has not been returned' + assert Settings().value(u'test/extend') == u'very short', u'The saved value should be returned' From 718a440b8fceba5da05701bb38110fe160200bc4 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Tue, 19 Feb 2013 08:27:55 +0100 Subject: [PATCH 21/24] added another formattingtags test --- .../functional/openlp_core_lib/test_formattingtags.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/functional/openlp_core_lib/test_formattingtags.py b/tests/functional/openlp_core_lib/test_formattingtags.py index 335650112..4c7b00909 100644 --- a/tests/functional/openlp_core_lib/test_formattingtags.py +++ b/tests/functional/openlp_core_lib/test_formattingtags.py @@ -50,7 +50,7 @@ class TestFormattingTags(TestCase): def get_html_tags_with_user_tags_test(self): """ - Test the FormattingTags class' get_html_tags static method in combination with user tags. + FormattingTags class - test the get_html_tags(), add_html_tags() and remove_html_tag() methods. """ with patch(u'openlp.core.lib.translate') as mocked_translate, \ patch(u'openlp.core.lib.settings') as mocked_settings, \ @@ -67,7 +67,7 @@ class TestFormattingTags(TestCase): # WHEN: Add our tag and get the tags again. FormattingTags.load_tags() FormattingTags.add_html_tags([TAG]) - new_tags_list = FormattingTags.get_html_tags() + new_tags_list = copy.deepcopy(FormattingTags.get_html_tags()) # THEN: Lists should not be identically. assert old_tags_list != new_tags_list, u'The lists should be different.' @@ -76,3 +76,9 @@ class TestFormattingTags(TestCase): new_tag = new_tags_list.pop() assert TAG == new_tag, u'Tags should be identically.' + # WHEN: Remove the new tag with the FormattingTags.remove_html_tag() method. + FormattingTags.remove_html_tag(len(new_tags_list)) + + # THEN: The lists should now be identically. + assert old_tags_list == FormattingTags.get_html_tags(), u'The lists should be identically.' + From 03941538e5261ea9c6e996ebb10bbde1119dc262 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Tue, 19 Feb 2013 08:30:41 +0100 Subject: [PATCH 22/24] changed comment --- tests/functional/openlp_core_lib/test_formattingtags.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/functional/openlp_core_lib/test_formattingtags.py b/tests/functional/openlp_core_lib/test_formattingtags.py index 4c7b00909..6c60be5ac 100644 --- a/tests/functional/openlp_core_lib/test_formattingtags.py +++ b/tests/functional/openlp_core_lib/test_formattingtags.py @@ -76,7 +76,7 @@ class TestFormattingTags(TestCase): new_tag = new_tags_list.pop() assert TAG == new_tag, u'Tags should be identically.' - # WHEN: Remove the new tag with the FormattingTags.remove_html_tag() method. + # WHEN: Remove the new tag. FormattingTags.remove_html_tag(len(new_tags_list)) # THEN: The lists should now be identically. From b9a0458200fca43c181346370a46d5861b06d6ca Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Tue, 19 Feb 2013 18:27:17 +0000 Subject: [PATCH 23/24] Minor updates --- tests/functional/openlp_core_lib/test_settings.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tests/functional/openlp_core_lib/test_settings.py b/tests/functional/openlp_core_lib/test_settings.py index 634865369..09e65a1e4 100644 --- a/tests/functional/openlp_core_lib/test_settings.py +++ b/tests/functional/openlp_core_lib/test_settings.py @@ -1,9 +1,11 @@ """ - Package to test the openlp.core.lib package. + Package to test the openlp.core.lib.settings package. """ import os from unittest import TestCase +from tempfile import mkstemp + from openlp.core.lib import Settings from PyQt4 import QtGui, QtTest @@ -17,20 +19,19 @@ class TestSettings(TestCase): """ Create the UI """ + fd, self.ini_file = mkstemp(u'.ini') + Settings().set_filename(self.ini_file) self.application = QtGui.QApplication.instance() self.application.setOrganizationName(u'OpenLP-tests') self.application.setOrganizationDomain(u'openlp.org') - Settings() def tearDown(self): """ Delete all the C++ objects at the end so that we don't have a segfault """ del self.application - try: - os.remove(Settings().fileName()) - except OSError: - pass + os.unlink(self.ini_file) + os.unlink(Settings().fileName()) def settings_basic_test(self): """ From 3da378a7b7f75bfa9ad819f595ce7448b3ffd685 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Thu, 21 Feb 2013 07:33:21 +0000 Subject: [PATCH 24/24] Fixes --- tests/functional/openlp_core_lib/test_settings.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/tests/functional/openlp_core_lib/test_settings.py b/tests/functional/openlp_core_lib/test_settings.py index 09e65a1e4..827bfa156 100644 --- a/tests/functional/openlp_core_lib/test_settings.py +++ b/tests/functional/openlp_core_lib/test_settings.py @@ -2,15 +2,12 @@ Package to test the openlp.core.lib.settings package. """ import os - from unittest import TestCase from tempfile import mkstemp from openlp.core.lib import Settings -from PyQt4 import QtGui, QtTest - -TESTPATH = os.path.abspath(os.path.join(os.path.dirname(__file__), u'..', u'..', u'resources')) +from PyQt4 import QtGui class TestSettings(TestCase): @@ -22,8 +19,6 @@ class TestSettings(TestCase): fd, self.ini_file = mkstemp(u'.ini') Settings().set_filename(self.ini_file) self.application = QtGui.QApplication.instance() - self.application.setOrganizationName(u'OpenLP-tests') - self.application.setOrganizationDomain(u'openlp.org') def tearDown(self): """