diff --git a/openlp/core/lib/registry.py b/openlp/core/lib/registry.py index 27c037a27..04bb72f32 100644 --- a/openlp/core/lib/registry.py +++ b/openlp/core/lib/registry.py @@ -98,32 +98,36 @@ class Registry(object): if key in self.service_list: del self.service_list[key] - def register_function(self, occasion, function): + def register_function(self, event, function): """ Register a function and a handler to be called later """ - if self.functions_list.has_key(occasion) == 0: - self.functions_list[occasion] = [function] + if not self.functions_list.has_key(event): + self.functions_list[event] = [function] else: - self.functions_list[occasion].append(function) + self.functions_list[event].append(function) - def remove_function(self, occasion, function): + def remove_function(self, event, function): """ Register a function and a handler to be called later """ if self.running_under_test is False: - log.error(u'Invalid Method call for key %s' % occasion) - raise KeyError(u'Invalid Method call for key %s' % occasion) + log.error(u'Invalid Method call for key %s' % event) + raise KeyError(u'Invalid Method call for key %s' % event) return - if self.functions_list.has_key(occasion): - self.functions_list[occasion].remove(function) + if event in self.functions_list: + self.functions_list[event].remove(function) - def execute(self, occasion, data): + def execute(self, event, *args, **kwargs): """ - Execute all the handlers registered passing the data to the handler + Execute all the handlers registered passing the data to the handler and returning results """ - print self.functions_list, self.functions_list.has_key(occasion) + results = [] + if event in self.functions_list: + for function in self.functions_list[event]: + print event, function, + result = function(*args, **kwargs) + if result: + results.append(result) + return results - if self.functions_list.has_key(occasion): - for function in self.functions_list[occasion]: - function(data) \ No newline at end of file diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 7b7027efd..d54232773 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -80,7 +80,7 @@ class Renderer(object): self.display.setup() self._theme_dimensions = {} self._calculate_default() - QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'theme_update_global'), self.set_global_theme) + Registry().register_function(u'theme_update_global', self.set_global_theme) self.web = QtWebKit.QWebView() self.web.setVisible(False) self.web_frame = self.web.page().mainFrame() diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 8e1be9602..0e858bb25 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -528,7 +528,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): QtCore.QObject.connect(self.modeDefaultItem, QtCore.SIGNAL(u'triggered()'), self.onModeDefaultItemClicked) QtCore.QObject.connect(self.modeSetupItem, QtCore.SIGNAL(u'triggered()'), self.onModeSetupItemClicked) QtCore.QObject.connect(self.modeLiveItem, QtCore.SIGNAL(u'triggered()'), self.onModeLiveItemClicked) - QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'theme_update_global'), self.defaultThemeChanged) + Registry().register_function(u'theme_update_global', self.defaultThemeChanged) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'openlp_version_check'), self.versionNotice) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'live_display_blank_check'), self.blankCheck) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'config_screen_changed'), self.screenChanged) @@ -699,7 +699,8 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): self.activePlugin.toggleStatus(PluginStatus.Inactive) self.themeManagerContents.configUpdated() self.themeManagerContents.load_themes(True) - Receiver.send_message(u'theme_update_global', self.themeManagerContents.global_theme) + #Receiver.send_message(u'theme_update_global', self.themeManagerContents.global_theme) + Registry().execute(u'theme_update_global', self.themeManagerContents.global_theme) # Check if any Bibles downloaded. If there are, they will be # processed. Receiver.send_message(u'bibles_load_list', True) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index b45794556..27d4a2caf 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -214,7 +214,7 @@ class ServiceManagerDialog(object): QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'config_updated'), self.config_updated) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'config_screen_changed'), self.regenerate_service_Items) - QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'theme_update_global'), self.theme_change) + 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') @@ -1243,7 +1243,7 @@ class ServiceManager(QtGui.QWidget, ServiceManagerDialog): Settings().setValue(self.main_window.serviceManagerSettingsSection + u'/service theme', self.service_theme) self.regenerate_service_Items(True) - def theme_change(self): + def theme_change(self, args, **Kwargs): """ The theme may have changed in the settings dialog so make sure the theme combo box is in the correct state. diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index 25b4d5c5e..0c7a0fc60 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -134,8 +134,7 @@ class ThemeManager(QtGui.QWidget): QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.changeGlobalFromScreen) QtCore.QObject.connect(self.theme_list_widget, QtCore.SIGNAL(u'currentItemChanged(QListWidgetItem *, QListWidgetItem *)'), self.check_list_state) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'theme_update_global'), self.change_global_from_tab) + Registry().register_function(u'theme_update_global', self.change_global_from_tab) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'config_updated'), self.config_updated) # Variables self.theme_list = [] @@ -237,7 +236,6 @@ class ThemeManager(QtGui.QWidget): name = translate('OpenLP.ThemeManager', '%s (default)') % self.global_theme self.theme_list_widget.item(count).setText(name) Settings().setValue(self.settingsSection + u'/global theme', self.global_theme) - Receiver.send_message(u'theme_update_global', self.global_theme) Registry().execute(u'theme_update_global', self.global_theme) self._push_themes() diff --git a/openlp/core/ui/themestab.py b/openlp/core/ui/themestab.py index b502d11e0..fddfeb366 100644 --- a/openlp/core/ui/themestab.py +++ b/openlp/core/ui/themestab.py @@ -31,7 +31,7 @@ The Themes configuration tab """ from PyQt4 import QtCore, QtGui -from openlp.core.lib import Receiver, Settings, SettingsTab, translate, UiStrings +from openlp.core.lib import Receiver, Registry, Settings, SettingsTab, translate, UiStrings from openlp.core.lib.theme import ThemeLevel from openlp.core.lib.ui import find_and_set_in_combo_box @@ -104,7 +104,7 @@ class ThemesTab(SettingsTab): QtCore.QObject.connect(self.GlobalLevelRadioButton, QtCore.SIGNAL(u'clicked()'), self.onGlobalLevelButtonClicked) QtCore.QObject.connect(self.DefaultComboBox, QtCore.SIGNAL(u'activated(int)'), self.onDefaultComboBoxChanged) - QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'theme_update_list'), self.updateThemeList) + Registry().register_function(u'theme_update_list', self.updateThemeList) def retranslateUi(self): """ @@ -153,13 +153,15 @@ class ThemesTab(SettingsTab): settings.endGroup() self.renderer.set_global_theme(self.global_theme) self.renderer.set_theme_level(self.theme_level) - Receiver.send_message(u'theme_update_global', self.global_theme) + #Receiver.send_message(u'theme_update_global', self.global_theme) + Registry().execute(u'theme_update_global', self.global_theme) def postSetUp(self): """ After setting things up... """ - Receiver.send_message(u'theme_update_global', self.global_theme) + #Receiver.send_message(u'theme_update_global', self.global_theme) + Registry().execute(u'theme_update_global', self.global_theme) def onSongLevelButtonClicked(self): """ @@ -197,6 +199,7 @@ class ThemesTab(SettingsTab): [u'Bible Theme', u'Song Theme'] """ # Reload as may have been triggered by the ThemeManager. + print theme_list self.global_theme = Settings().value(self.settingsSection + u'/global theme') self.DefaultComboBox.clear() self.DefaultComboBox.addItems(theme_list) diff --git a/openlp/plugins/custom/forms/editcustomform.py b/openlp/plugins/custom/forms/editcustomform.py index a27696171..a308737a2 100644 --- a/openlp/plugins/custom/forms/editcustomform.py +++ b/openlp/plugins/custom/forms/editcustomform.py @@ -64,7 +64,6 @@ class EditCustomForm(QtGui.QDialog, Ui_CustomEditDialog): self.editAllButton.clicked.connect(self.on_edit_all_button_clicked) self.slideListView.currentRowChanged.connect(self.on_current_row_changed) self.slideListView.doubleClicked.connect(self.on_edit_button_clicked) - QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'theme_update_list'), self.loadThemes) Registry().register_function(u'theme_update_list', self.loadThemes) def loadThemes(self, theme_list): diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 6e55c072d..d3fb859f4 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -39,8 +39,8 @@ import shutil from PyQt4 import QtCore, QtGui from openlp.core.lib import PluginStatus, Receiver, MediaType, translate, create_separated_list, \ - check_directory_exists, Registry, UiStrings, Registry -from openlp.core.lib.ui import UiStrings, set_case_insensitive_completer, critical_error_message_box, \ + check_directory_exists, Registry, UiStrings +from openlp.core.lib.ui import set_case_insensitive_completer, critical_error_message_box, \ find_and_set_in_combo_box from openlp.core.utils import AppLocation from openlp.plugins.songs.forms import EditVerseForm, MediaFilesForm @@ -97,7 +97,6 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): QtCore.QObject.connect(self.audioRemoveButton, QtCore.SIGNAL(u'clicked()'), self.onAudioRemoveButtonClicked) QtCore.QObject.connect(self.audioRemoveAllButton, QtCore.SIGNAL(u'clicked()'), self.onAudioRemoveAllButtonClicked) - QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'theme_update_list'), self.loadThemes) Registry().register_function(u'theme_update_list', self.loadThemes) self.previewButton = QtGui.QPushButton() self.previewButton.setObjectName(u'previewButton') diff --git a/tests/functional/openlp_core_lib/test_registry.py b/tests/functional/openlp_core_lib/test_registry.py index f27eef3d8..32ad1b8e4 100644 --- a/tests/functional/openlp_core_lib/test_registry.py +++ b/tests/functional/openlp_core_lib/test_registry.py @@ -11,7 +11,7 @@ TESTPATH = os.path.abspath(os.path.join(os.path.dirname(__file__), u'..', u'..', class TestRegistry(TestCase): - def registry_basic_test(self): + def registry_service_test(self): """ Test the registry creation and its usage """ @@ -46,3 +46,37 @@ class TestRegistry(TestCase): temp = Registry().get(u'test1') self.assertEqual(context.exception[0], u'Service test1 not found in list', u'KeyError exception should have been thrown for deleted service') + + def registry_function_test(self): + """ + Test the registry creation and its usage + """ + # GIVEN: An existing registry register a function + Registry.create() + Registry().register_function(u'test1', self.dummy_function_1) + + # WHEN: I execute the function + return_value = Registry().execute(u'test1') + + # THEN: I expect then function to have been called and a return given + self.assertEqual(return_value[0], u'function_1', u'A return value is provided and matches') + + # WHEN: I execute the a function with the same reference and execute the function + Registry().register_function(u'test1', self.dummy_function_1) + return_value = Registry().execute(u'test1') + + # THEN: I expect then function to have been called and a return given + self.assertEqual(return_value, [u'function_1', u'function_1'], u'A return value list is provided and matches') + + # WHEN: I execute the a 2nd function with the different reference and execute the function + Registry().register_function(u'test2', self.dummy_function_2) + return_value = Registry().execute(u'test2') + + # THEN: I expect then function to have been called and a return given + self.assertEqual(return_value[0], u'function_2', u'A return value is provided and matches') + + def dummy_function_1(self): + return "function_1" + + def dummy_function_2(self): + return "function_2" \ No newline at end of file