From 19138cd9e5b42652473e331cd866252cd3e4150b Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Tue, 29 Mar 2011 15:56:49 +0200 Subject: [PATCH 01/89] started reworking shortcuts --- openlp/core/lib/ui.py | 2 + openlp/core/ui/mainwindow.py | 63 ++++++++---------- openlp/core/ui/servicemanager.py | 2 +- openlp/core/ui/shortcutlistform.py | 95 +++++++++++++++++++-------- openlp/core/ui/slidecontroller.py | 3 +- openlp/core/utils/actions.py | 11 ++++ openlp/plugins/alerts/alertsplugin.py | 8 ++- 7 files changed, 116 insertions(+), 68 deletions(-) diff --git a/openlp/core/lib/ui.py b/openlp/core/lib/ui.py index c1a9f8b35..6aa06bfcc 100644 --- a/openlp/core/lib/ui.py +++ b/openlp/core/lib/ui.py @@ -31,6 +31,7 @@ import logging from PyQt4 import QtCore, QtGui from openlp.core.lib import build_icon, Receiver, translate +from openlp.core.utils.actions import actionList log = logging.getLogger(__name__) @@ -265,6 +266,7 @@ def icon_action(parent, name, icon, checked=None): else: action = base_action(parent, name) action.setIcon(build_icon(icon)) + #actionList.add_action(action, name) return action def shortcut_action(parent, text, shortcuts, function): diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 594c6cc91..98144bfa3 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -38,7 +38,8 @@ from openlp.core.ui import AboutForm, SettingsForm, ServiceManager, \ ThemeManager, SlideController, PluginForm, MediaDockManager, \ ShortcutListForm, DisplayTagForm from openlp.core.utils import AppLocation, add_actions, LanguageManager, \ - ActionList, get_application_version + get_application_version +from openlp.core.utils.actions import actionList log = logging.getLogger(__name__) @@ -163,53 +164,52 @@ class Ui_MainWindow(object): # Create the menu items self.FileNewItem = icon_action(mainWindow, u'FileNewItem', u':/general/general_new.png') - mainWindow.actionList.add_action(self.FileNewItem, u'File') + actionList.add_action(self.FileNewItem, u'File') self.FileOpenItem = icon_action(mainWindow, u'FileOpenItem', u':/general/general_open.png') - mainWindow.actionList.add_action(self.FileOpenItem, u'File') + actionList.add_action(self.FileOpenItem, u'File') self.FileSaveItem = icon_action(mainWindow, u'FileSaveItem', u':/general/general_save.png') - mainWindow.actionList.add_action(self.FileSaveItem, u'File') + actionList.add_action(self.FileSaveItem, u'File') self.FileSaveAsItem = base_action(mainWindow, u'FileSaveAsItem') - mainWindow.actionList.add_action(self.FileSaveAsItem, u'File') + actionList.add_action(self.FileSaveAsItem, u'File') self.printServiceOrderItem = base_action( mainWindow, u'printServiceItem') - mainWindow.actionList.add_action( - self.printServiceOrderItem, u'Print Service Order') + actionList.add_action(self.printServiceOrderItem, u'File') self.FileExitItem = icon_action(mainWindow, u'FileExitItem', u':/system/system_exit.png') - mainWindow.actionList.add_action(self.FileExitItem, u'File') + actionList.add_action(self.FileExitItem, u'File') self.ImportThemeItem = base_action(mainWindow, u'ImportThemeItem') - mainWindow.actionList.add_action(self.ImportThemeItem, u'Import') + actionList.add_action(self.ImportThemeItem, u'Import') self.ImportLanguageItem = base_action(mainWindow, u'ImportLanguageItem') - mainWindow.actionList.add_action(self.ImportLanguageItem, u'Import') + actionList.add_action(self.ImportLanguageItem, u'Import') self.ExportThemeItem = base_action(mainWindow, u'ExportThemeItem') - mainWindow.actionList.add_action(self.ExportThemeItem, u'Export') + actionList.add_action(self.ExportThemeItem, u'Export') self.ExportLanguageItem = base_action(mainWindow, u'ExportLanguageItem') - mainWindow.actionList.add_action(self.ExportLanguageItem, u'Export') + actionList.add_action(self.ExportLanguageItem, u'Export') self.ViewMediaManagerItem = icon_action(mainWindow, u'ViewMediaManagerItem', u':/system/system_mediamanager.png', self.mediaManagerDock.isVisible()) self.ViewThemeManagerItem = icon_action(mainWindow, u'ViewThemeManagerItem', u':/system/system_thememanager.png', self.themeManagerDock.isVisible()) - mainWindow.actionList.add_action(self.ViewMediaManagerItem, u'View') + actionList.add_action(self.ViewMediaManagerItem, u'View') self.ViewServiceManagerItem = icon_action(mainWindow, u'ViewServiceManagerItem', u':/system/system_servicemanager.png', self.serviceManagerDock.isVisible()) - mainWindow.actionList.add_action(self.ViewServiceManagerItem, u'View') + actionList.add_action(self.ViewServiceManagerItem, u'View') self.ViewPreviewPanel = checkable_action(mainWindow, u'ViewPreviewPanel', previewVisible) - mainWindow.actionList.add_action(self.ViewPreviewPanel, u'View') + actionList.add_action(self.ViewPreviewPanel, u'View') self.ViewLivePanel = checkable_action(mainWindow, u'ViewLivePanel', liveVisible) - mainWindow.actionList.add_action(self.ViewLivePanel, u'View') + actionList.add_action(self.ViewLivePanel, u'View') self.ModeDefaultItem = checkable_action(mainWindow, u'ModeDefaultItem') - mainWindow.actionList.add_action(self.ModeDefaultItem, u'View Mode') + actionList.add_action(self.ModeDefaultItem, u'View Mode') self.ModeSetupItem = checkable_action(mainWindow, u'ModeLiveItem') - mainWindow.actionList.add_action(self.ModeSetupItem, u'View Mode') + actionList.add_action(self.ModeSetupItem, u'View Mode') self.ModeLiveItem = checkable_action(mainWindow, u'ModeLiveItem', True) - mainWindow.actionList.add_action(self.ModeLiveItem, u'View Mode') + actionList.add_action(self.ModeLiveItem, u'View Mode') self.ModeGroup = QtGui.QActionGroup(mainWindow) self.ModeGroup.addAction(self.ModeDefaultItem) self.ModeGroup.addAction(self.ModeSetupItem) @@ -217,18 +217,18 @@ class Ui_MainWindow(object): self.ModeDefaultItem.setChecked(True) self.ToolsAddToolItem = icon_action(mainWindow, u'ToolsAddToolItem', u':/tools/tools_add.png') - mainWindow.actionList.add_action(self.ToolsAddToolItem, u'Tools') + actionList.add_action(self.ToolsAddToolItem, u'Tools') self.ToolsOpenDataFolder = icon_action(mainWindow, u'ToolsOpenDataFolder', u':/general/general_open.png') - mainWindow.actionList.add_action(self.ToolsOpenDataFolder, u'Tools') + actionList.add_action(self.ToolsOpenDataFolder, u'Tools') self.settingsPluginListItem = icon_action(mainWindow, u'settingsPluginListItem', u':/system/settings_plugin_list.png') - mainWindow.actionList.add_action(self.settingsPluginListItem, + actionList.add_action(self.settingsPluginListItem, u'Settings') # i18n Language Items self.AutoLanguageItem = checkable_action(mainWindow, u'AutoLanguageItem', LanguageManager.auto_language) - mainWindow.actionList.add_action(self.AutoLanguageItem, u'Settings') + actionList.add_action(self.AutoLanguageItem, u'Settings') self.LanguageGroup = QtGui.QActionGroup(mainWindow) self.LanguageGroup.setExclusive(True) self.LanguageGroup.setObjectName(u'LanguageGroup') @@ -246,19 +246,19 @@ class Ui_MainWindow(object): u'DisplayTagItem', u':/system/tag_editor.png') self.SettingsConfigureItem = icon_action(mainWindow, u'SettingsConfigureItem', u':/system/system_settings.png') - mainWindow.actionList.add_action(self.SettingsShortcutsItem, + actionList.add_action(self.SettingsShortcutsItem, u'Settings') self.HelpDocumentationItem = icon_action(mainWindow, u'HelpDocumentationItem', u':/system/system_help_contents.png') self.HelpDocumentationItem.setEnabled(False) - mainWindow.actionList.add_action(self.HelpDocumentationItem, u'Help') + actionList.add_action(self.HelpDocumentationItem, u'Help') self.HelpAboutItem = icon_action(mainWindow, u'HelpAboutItem', u':/system/system_about.png') - mainWindow.actionList.add_action(self.HelpAboutItem, u'Help') + actionList.add_action(self.HelpAboutItem, u'Help') self.HelpOnlineHelpItem = base_action(mainWindow, u'HelpOnlineHelpItem') - mainWindow.actionList.add_action(self.HelpOnlineHelpItem, u'Help') + actionList.add_action(self.HelpOnlineHelpItem, u'Help') self.helpWebSiteItem = base_action(mainWindow, u'helpWebSiteItem') - mainWindow.actionList.add_action(self.helpWebSiteItem, u'Help') + actionList.add_action(self.helpWebSiteItem, u'Help') add_actions(self.FileImportMenu, (self.ImportThemeItem, self.ImportLanguageItem)) add_actions(self.FileExportMenu, @@ -301,7 +301,6 @@ class Ui_MainWindow(object): self.ToolsAddToolItem.setVisible(False) self.ImportLanguageItem.setVisible(False) self.ExportLanguageItem.setVisible(False) - self.SettingsShortcutsItem.setVisible(False) self.HelpDocumentationItem.setVisible(False) def retranslateUi(self, mainWindow): @@ -467,8 +466,6 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): """ log.info(u'MainWindow loaded') - actionList = ActionList() - def __init__(self, screens, application): """ This constructor sets up the interface, the various managers, and the @@ -476,7 +473,6 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): """ QtGui.QMainWindow.__init__(self) self.screens = screens - self.application = application # Set up settings sections for the main application # (not for use by plugins) @@ -485,7 +481,6 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): self.serviceSettingsSection = u'servicemanager' self.songsSettingsSection = u'songs' self.serviceNotSaved = False - self.actionList = ActionList() self.settingsmanager = SettingsManager(screens) self.aboutForm = AboutForm(self) self.settingsForm = SettingsForm(self.screens, self, self) @@ -777,7 +772,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): """ Show the shortcuts dialog """ - self.shortcutForm.exec_(self.actionList) + self.shortcutForm.exec_() def onModeDefaultItemClicked(self): """ diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 168ad8a8c..1d5321e01 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -40,6 +40,7 @@ from openlp.core.ui import ServiceNoteForm, ServiceItemEditForm, StartTimeForm from openlp.core.ui.printserviceform import PrintServiceForm from openlp.core.utils import AppLocation, delete_file, file_is_unicode, \ split_filename +from openlp.core.utils.actions import actionList class ServiceManagerList(QtGui.QTreeWidget): """ @@ -315,7 +316,6 @@ class ServiceManager(QtGui.QWidget): self.configUpdated() def setServiceHotkeys(self): - actionList = self.mainwindow.actionList actionList.add_action(self.serviceManagerList.moveDown, u'Service') actionList.add_action(self.serviceManagerList.moveUp, u'Service') actionList.add_action(self.serviceManagerList.moveTop, u'Service') diff --git a/openlp/core/ui/shortcutlistform.py b/openlp/core/ui/shortcutlistform.py index e87ba3ada..a61dd41ed 100644 --- a/openlp/core/ui/shortcutlistform.py +++ b/openlp/core/ui/shortcutlistform.py @@ -30,6 +30,7 @@ import re from PyQt4 import QtCore, QtGui from openlp.core.utils import translate +from openlp.core.utils.actions import actionList from shortcutlistdialog import Ui_ShortcutListDialog REMOVE_AMPERSAND = re.compile(r'&{1}') @@ -40,21 +41,24 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): """ The shortcut list dialog """ - - def __init__(self, parent): - """ - Do some initialisation stuff - """ +#TODO: do not close on ESC +#TODO: ability to remove actions +#TODO: Save shortcuts +#TODO: doc + def __init__(self, parent=None): QtGui.QDialog.__init__(self, parent) self.setupUi(self) - self.actionList = None - self.captureShortcut = False + self.assingedShortcuts = [] + self.shortcutButton.setText(u'') QtCore.QObject.connect(self.shortcutButton, QtCore.SIGNAL(u'toggled(bool)'), self.onShortcutButtonClicked) + QtCore.QObject.connect(self.treeWidget, + QtCore.SIGNAL(u'itemPressed(QTreeWidgetItem*, int)'), + self.onItemPressed) def keyReleaseEvent(self, event): Qt = QtCore.Qt - if not self.captureShortcut: + if not self.shortcutButton.isChecked(): return key = event.key() if key == Qt.Key_Shift or key == Qt.Key_Control or \ @@ -68,45 +72,80 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): if event.modifiers() & Qt.ShiftModifier == Qt.ShiftModifier: key_string = u'Shift+' + key_string key_sequence = QtGui.QKeySequence(key_string) - existing_key = QtGui.QKeySequence(u'Ctrl+Shift+F8') - if key_sequence == existing_key: - QtGui.QMessageBox.warning( - self, + if key_sequence in self.assingedShortcuts: + QtGui.QMessageBox.warning(self, translate('OpenLP.ShortcutListDialog', 'Duplicate Shortcut'), unicode(translate('OpenLP.ShortcutListDialog', 'The shortcut ' - '"%s" is already assigned to another action, please ' - 'use a different shortcut.')) % key_sequence.toString(), + '"%s" is already assigned to another action, please ' + 'use a different shortcut.')) % key_sequence.toString(), QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok), QtGui.QMessageBox.Ok ) else: self.shortcutButton.setText(key_sequence.toString()) - self.shortcutButton.setChecked(False) - self.captureShortcut = False + self.shortcutButton.setChecked(False) - def exec_(self, actionList): - self.actionList = actionList - self.refreshActions() + def exec_(self): + # The dialog is opened the first time + if self.treeWidget.topLevelItemCount() == 0: + QtCore.QObject.connect(actionList.signal, + QtCore.SIGNAL(u'addedAction()'), self.initialiseActionList) + self.initialiseActionList() + self.refreshActionList() return QtGui.QDialog.exec_(self) - def refreshActions(self): - self.treeWidget.clear() - for category in self.actionList.categories: - item = QtGui.QTreeWidgetItem([category.name]) - for action in category.actions: + def refreshActionList(self): + self.assingedShortcuts = [] + iterator = QtGui.QTreeWidgetItemIterator(self.treeWidget) + while iterator.value(): + treewidgetItem = iterator.value() + action = treewidgetItem.data(0, QtCore.Qt.UserRole).toPyObject() + if action is not None: actionText = REMOVE_AMPERSAND.sub('', unicode(action.text())) - if (len(action.shortcuts()) == 2): + if len(action.shortcuts()) == 2: shortcutText = action.shortcuts()[0].toString() alternateText = action.shortcuts()[1].toString() else: shortcutText = action.shortcut().toString() alternateText = u'' - actionItem = QtGui.QTreeWidgetItem( - [actionText, shortcutText, alternateText]) + self.assingedShortcuts.extend(action.shortcuts()) + treewidgetItem.setText(0, actionText) + treewidgetItem.setText(1, shortcutText) + treewidgetItem.setText(2, alternateText) + iterator += 1 + + def initialiseActionList(self): + for category in actionList.categories: + item = QtGui.QTreeWidgetItem([category.name]) + for action in category.actions: + actionItem = QtGui.QTreeWidgetItem() actionItem.setIcon(0, action.icon()) + actionItem.setData(0, QtCore.Qt.UserRole, QtCore.QVariant(action)) item.addChild(actionItem) item.setExpanded(True) self.treeWidget.addTopLevelItem(item) def onShortcutButtonClicked(self, toggled): - self.captureShortcut = toggled + if toggled: + return + item = self.treeWidget.currentItem() + action = item.data(0, QtCore.Qt.UserRole).toPyObject() + if action is None: + return + # TODO: Sort out which shortcuts should be kept. + action.setShortcuts(QtGui.QKeySequence(self.shortcutButton.text())) + self.refreshActionList() + + def onItemPressed(self, item, column): + item = self.treeWidget.currentItem() + action = item.data(0, QtCore.Qt.UserRole).toPyObject() + if action is None: + text = u'' + else: + if len(action.shortcuts()) == 0: + text = u'' + elif len(action.shortcuts()) == 2 and column == 2: + text = action.shortcuts()[1].toString() + else: + text = action.shortcuts()[0].toString() + self.shortcutButton.setText(text) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 232653326..1ae84e950 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -34,6 +34,7 @@ from openlp.core.lib import OpenLPToolbar, Receiver, resize_image, \ ItemCapabilities, translate from openlp.core.lib.ui import icon_action, UiStrings, shortcut_action from openlp.core.ui import HideMode, MainDisplay +from openlp.core.utils.actions import actionList log = logging.getLogger(__name__) @@ -362,14 +363,12 @@ class SlideController(QtGui.QWidget): QtCore.SIGNAL(u'config_screen_changed'), self.screenSizeChanged) def setPreviewHotkeys(self, parent=None): - actionList = self.parent.actionList self.previousItem.setShortcuts([QtCore.Qt.Key_Up, 0]) actionList.add_action(self.previousItem, u'Preview') self.nextItem.setShortcuts([QtCore.Qt.Key_Down, 0]) actionList.add_action(self.nextItem, u'Preview') def setLiveHotkeys(self, parent=None): - actionList = self.parent.actionList self.previousItem.setShortcuts([QtCore.Qt.Key_Up, QtCore.Qt.Key_PageUp]) self.previousItem.setShortcutContext( QtCore.Qt.WidgetWithChildrenShortcut) diff --git a/openlp/core/utils/actions.py b/openlp/core/utils/actions.py index 41ae41f4b..ba4a7b40d 100644 --- a/openlp/core/utils/actions.py +++ b/openlp/core/utils/actions.py @@ -27,6 +27,8 @@ The :mod:`~openlp.core.utils.actions` module provides action list classes used by the shortcuts system. """ +from PyQt4 import QtCore + class ActionCategory(object): """ The :class:`~openlp.core.utils.ActionCategory` class encapsulates a @@ -173,6 +175,7 @@ class ActionList(object): """ def __init__(self): self.categories = CategoryList() + self.signal = Emit() def add_action(self, action, category=u'Default', weight=None): if category not in self.categories: @@ -181,3 +184,11 @@ class ActionList(object): self.categories[category].actions.append(action) else: self.categories[category].actions.add(action, weight) + self.signal.emit(QtCore.SIGNAL(u'addedAction()')) + + +class Emit(QtCore.QObject): + def __init__(self): + QtCore.QObject.__init__(self) + +actionList = ActionList() diff --git a/openlp/plugins/alerts/alertsplugin.py b/openlp/plugins/alerts/alertsplugin.py index db0ba3b7e..2d22d2d5a 100644 --- a/openlp/plugins/alerts/alertsplugin.py +++ b/openlp/plugins/alerts/alertsplugin.py @@ -30,6 +30,8 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Plugin, StringContent, build_icon, translate from openlp.core.lib.db import Manager +from openlp.core.lib.ui import icon_action +from openlp.core.utils.actions import actionList from openlp.plugins.alerts.lib import AlertsManager, AlertsTab from openlp.plugins.alerts.lib.db import init_schema from openlp.plugins.alerts.forms import AlertForm @@ -58,9 +60,9 @@ class AlertsPlugin(Plugin): use it as their parent. """ log.info(u'add tools menu') - self.toolsAlertItem = QtGui.QAction(tools_menu) - self.toolsAlertItem.setIcon(build_icon(u':/plugins/plugin_alerts.png')) - self.toolsAlertItem.setObjectName(u'toolsAlertItem') + self.toolsAlertItem = icon_action(tools_menu, u'toolsAlertItem', + u':/plugins/plugin_alerts.png') + actionList.add_action(self.toolsAlertItem, u'Extra') self.toolsAlertItem.setText(translate('AlertsPlugin', '&Alert')) self.toolsAlertItem.setStatusTip( translate('AlertsPlugin', 'Show an alert message.')) From d9c2d92c8c4265975c7860bfc7fd5aba26c1bac1 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Tue, 29 Mar 2011 18:44:36 +0200 Subject: [PATCH 02/89] --- openlp/core/lib/ui.py | 24 +++--- openlp/core/ui/mainwindow.py | 104 +++++++++++--------------- openlp/core/ui/shortcutlistform.py | 15 +++- openlp/core/ui/slidecontroller.py | 23 +++--- openlp/core/utils/__init__.py | 6 +- openlp/core/utils/actions.py | 2 +- openlp/plugins/alerts/alertsplugin.py | 3 +- 7 files changed, 90 insertions(+), 87 deletions(-) diff --git a/openlp/core/lib/ui.py b/openlp/core/lib/ui.py index 6aa06bfcc..86def01d8 100644 --- a/openlp/core/lib/ui.py +++ b/openlp/core/lib/ui.py @@ -239,41 +239,47 @@ def create_up_down_push_button_set(parent): QtCore.SIGNAL(u'clicked()'), parent.onDownButtonClicked) return up_button, down_button -def base_action(parent, name): +def base_action(parent, name, category=None): """ Return the most basic action with the object name set. """ action = QtGui.QAction(parent) action.setObjectName(name) + if category is not None: + actionList.add_action(action, category) return action -def checkable_action(parent, name, checked=None): +def checkable_action(parent, name, checked=None, category=None): """ Return a standard action with the checkable attribute set. """ - action = base_action(parent, name) + action = base_action(parent, name, category) action.setCheckable(True) if checked is not None: action.setChecked(checked) return action -def icon_action(parent, name, icon, checked=None): +def icon_action(parent, name, icon, checked=None, category=None): """ Return a standard action with an icon. + + ``category`` + The category the action should be listed in the shortcut dialog. If you + not wish, that this action is added to the shortcut dialog, then do not + state any. """ if checked is not None: - action = checkable_action(parent, name, checked) + action = checkable_action(parent, name, checked, category) else: - action = base_action(parent, name) + action = base_action(parent, name, category) action.setIcon(build_icon(icon)) - #actionList.add_action(action, name) return action -def shortcut_action(parent, text, shortcuts, function): +def shortcut_action(parent, text, shortcuts, function, category=None): """ Return a shortcut enabled action. """ - action = QtGui.QAction(text, parent) + action = base_action(parent, text, category) action.setShortcuts(shortcuts) action.setShortcutContext(QtCore.Qt.WidgetWithChildrenShortcut) QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered()'), function) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index ed06d3931..c37db0b97 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -39,7 +39,7 @@ from openlp.core.ui import AboutForm, SettingsForm, ServiceManager, \ ShortcutListForm, DisplayTagForm from openlp.core.utils import AppLocation, add_actions, LanguageManager, \ get_application_version -from openlp.core.utils.actions import actionList +#from openlp.core.utils.actions import actionList log = logging.getLogger(__name__) @@ -163,72 +163,60 @@ class Ui_MainWindow(object): self.themeManagerDock) # Create the menu items self.FileNewItem = icon_action(mainWindow, u'FileNewItem', - u':/general/general_new.png') - actionList.add_action(self.FileNewItem, u'File') + u':/general/general_new.png', category=u'File') self.FileOpenItem = icon_action(mainWindow, u'FileOpenItem', - u':/general/general_open.png') - actionList.add_action(self.FileOpenItem, u'File') + u':/general/general_open.png', category=u'File') self.FileSaveItem = icon_action(mainWindow, u'FileSaveItem', - u':/general/general_save.png') - actionList.add_action(self.FileSaveItem, u'File') - self.FileSaveAsItem = base_action(mainWindow, u'FileSaveAsItem') - actionList.add_action(self.FileSaveAsItem, u'File') + u':/general/general_save.png', category=u'File') + self.FileSaveAsItem = base_action( + mainWindow, u'FileSaveAsItem', u'File') self.printServiceOrderItem = base_action( - mainWindow, u'printServiceItem') - actionList.add_action(self.printServiceOrderItem, u'File') + mainWindow, u'printServiceItem', u'File') self.FileExitItem = icon_action(mainWindow, u'FileExitItem', - u':/system/system_exit.png') - actionList.add_action(self.FileExitItem, u'File') - self.ImportThemeItem = base_action(mainWindow, u'ImportThemeItem') - actionList.add_action(self.ImportThemeItem, u'Import') - self.ImportLanguageItem = base_action(mainWindow, u'ImportLanguageItem') - actionList.add_action(self.ImportLanguageItem, u'Import') - self.ExportThemeItem = base_action(mainWindow, u'ExportThemeItem') - actionList.add_action(self.ExportThemeItem, u'Export') - self.ExportLanguageItem = base_action(mainWindow, u'ExportLanguageItem') - actionList.add_action(self.ExportLanguageItem, u'Export') + u':/system/system_exit.png', category=u'File') + self.ImportThemeItem = base_action( + mainWindow, u'ImportThemeItem', u'Import') + self.ImportLanguageItem = base_action( + mainWindow, u'ImportLanguageItem', u'Import') + self.ExportThemeItem = base_action( + mainWindow, u'ExportThemeItem', u'Export') + self.ExportLanguageItem = base_action( + mainWindow, u'ExportLanguageItem', u'Export') self.ViewMediaManagerItem = icon_action(mainWindow, u'ViewMediaManagerItem', u':/system/system_mediamanager.png', - self.mediaManagerDock.isVisible()) + self.mediaManagerDock.isVisible(), u'View') self.ViewThemeManagerItem = icon_action(mainWindow, u'ViewThemeManagerItem', u':/system/system_thememanager.png', - self.themeManagerDock.isVisible()) - actionList.add_action(self.ViewMediaManagerItem, u'View') + self.themeManagerDock.isVisible(), u'View') self.ViewServiceManagerItem = icon_action(mainWindow, u'ViewServiceManagerItem', u':/system/system_servicemanager.png', - self.serviceManagerDock.isVisible()) - actionList.add_action(self.ViewServiceManagerItem, u'View') + self.serviceManagerDock.isVisible(), u'View') self.ViewPreviewPanel = checkable_action(mainWindow, - u'ViewPreviewPanel', previewVisible) - actionList.add_action(self.ViewPreviewPanel, u'View') - self.ViewLivePanel = checkable_action(mainWindow, u'ViewLivePanel', - liveVisible) - actionList.add_action(self.ViewLivePanel, u'View') - self.ModeDefaultItem = checkable_action(mainWindow, u'ModeDefaultItem') - actionList.add_action(self.ModeDefaultItem, u'View Mode') - self.ModeSetupItem = checkable_action(mainWindow, u'ModeLiveItem') - actionList.add_action(self.ModeSetupItem, u'View Mode') - self.ModeLiveItem = checkable_action(mainWindow, u'ModeLiveItem', True) - actionList.add_action(self.ModeLiveItem, u'View Mode') + u'ViewPreviewPanel', previewVisible, u'View') + self.ViewLivePanel = checkable_action( + mainWindow, u'ViewLivePanel', liveVisible, u'View') + self.ModeDefaultItem = checkable_action( + mainWindow, u'ModeDefaultItem', category=u'View Mode') + self.ModeSetupItem = checkable_action( + mainWindow, u'ModeLiveItem', category=u'View Mode') + self.ModeLiveItem = checkable_action( + mainWindow, u'ModeLiveItem', True, u'View Mode') self.ModeGroup = QtGui.QActionGroup(mainWindow) self.ModeGroup.addAction(self.ModeDefaultItem) self.ModeGroup.addAction(self.ModeSetupItem) self.ModeGroup.addAction(self.ModeLiveItem) self.ModeDefaultItem.setChecked(True) self.ToolsAddToolItem = icon_action(mainWindow, u'ToolsAddToolItem', - u':/tools/tools_add.png') - actionList.add_action(self.ToolsAddToolItem, u'Tools') - self.ToolsOpenDataFolder = icon_action(mainWindow, - u'ToolsOpenDataFolder', u':/general/general_open.png') - actionList.add_action(self.ToolsOpenDataFolder, u'Tools') + u':/tools/tools_add.png', category=u'Tools') + self.ToolsOpenDataFolder = icon_action(mainWindow, u'ToolsOpenDataFolder', + u':/general/general_open.png', category=u'Tools') self.settingsPluginListItem = icon_action(mainWindow, - u'settingsPluginListItem', u':/system/settings_plugin_list.png') - actionList.add_action(self.settingsPluginListItem, - u'Settings') + u'settingsPluginListItem', u':/system/settings_plugin_list.png', + category=u'Settings') # i18n Language Items self.AutoLanguageItem = checkable_action(mainWindow, u'AutoLanguageItem', LanguageManager.auto_language) - actionList.add_action(self.AutoLanguageItem, u'Settings') + #actionList.add_action(self.AutoLanguageItem, u'Settings') self.LanguageGroup = QtGui.QActionGroup(mainWindow) self.LanguageGroup.setExclusive(True) self.LanguageGroup.setObjectName(u'LanguageGroup') @@ -241,24 +229,22 @@ class Ui_MainWindow(object): add_actions(self.LanguageGroup, [languageItem]) self.SettingsShortcutsItem = icon_action(mainWindow, u'SettingsShortcutsItem', - u':/system/system_configure_shortcuts.png') + u':/system/system_configure_shortcuts.png', category=u'Settings') self.DisplayTagItem = icon_action(mainWindow, - u'DisplayTagItem', u':/system/tag_editor.png') + u'DisplayTagItem', u':/system/tag_editor.png', category=u'Settings') self.SettingsConfigureItem = icon_action(mainWindow, - u'SettingsConfigureItem', u':/system/system_settings.png') - actionList.add_action(self.SettingsShortcutsItem, - u'Settings') + u'SettingsConfigureItem', u':/system/system_settings.png', + category=u'Settings') self.HelpDocumentationItem = icon_action(mainWindow, - u'HelpDocumentationItem', u':/system/system_help_contents.png') + u'HelpDocumentationItem', u':/system/system_help_contents.png', + category=None)#u'Help') self.HelpDocumentationItem.setEnabled(False) - actionList.add_action(self.HelpDocumentationItem, u'Help') self.HelpAboutItem = icon_action(mainWindow, u'HelpAboutItem', - u':/system/system_about.png') - actionList.add_action(self.HelpAboutItem, u'Help') - self.HelpOnlineHelpItem = base_action(mainWindow, u'HelpOnlineHelpItem') - actionList.add_action(self.HelpOnlineHelpItem, u'Help') - self.helpWebSiteItem = base_action(mainWindow, u'helpWebSiteItem') - actionList.add_action(self.helpWebSiteItem, u'Help') + u':/system/system_about.png', category=None)#u'Help') + self.HelpOnlineHelpItem = base_action( + mainWindow, u'HelpOnlineHelpItem', category=u'Help') + self.helpWebSiteItem = base_action( + mainWindow, u'helpWebSiteItem', category=u'Help') add_actions(self.FileImportMenu, (self.ImportThemeItem, self.ImportLanguageItem)) add_actions(self.FileExportMenu, diff --git a/openlp/core/ui/shortcutlistform.py b/openlp/core/ui/shortcutlistform.py index a61dd41ed..071482f95 100644 --- a/openlp/core/ui/shortcutlistform.py +++ b/openlp/core/ui/shortcutlistform.py @@ -45,6 +45,7 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): #TODO: ability to remove actions #TODO: Save shortcuts #TODO: doc +#TODO: Fix Preview/Live controller (have the same shortcut) def __init__(self, parent=None): QtGui.QDialog.__init__(self, parent) self.setupUi(self) @@ -89,7 +90,7 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): # The dialog is opened the first time if self.treeWidget.topLevelItemCount() == 0: QtCore.QObject.connect(actionList.signal, - QtCore.SIGNAL(u'addedAction()'), self.initialiseActionList) + QtCore.SIGNAL(u'addedAction()'), self.asdf) self.initialiseActionList() self.refreshActionList() return QtGui.QDialog.exec_(self) @@ -125,6 +126,18 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): item.setExpanded(True) self.treeWidget.addTopLevelItem(item) + def asdf(self, action, category): + print action + for category in actionList.categories: + item = QtGui.QTreeWidgetItem([category.name]) + for action in category.actions: + actionItem = QtGui.QTreeWidgetItem() + actionItem.setIcon(0, action.icon()) + actionItem.setData(0, QtCore.Qt.UserRole, QtCore.QVariant(action)) + item.addChild(actionItem) + item.setExpanded(True) + self.treeWidget.addTopLevelItem(item) + def onShortcutButtonClicked(self, toggled): if toggled: return diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 1ae84e950..cafbec198 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -156,15 +156,15 @@ class SlideController(QtGui.QWidget): self.hideMenu.setMenu(QtGui.QMenu( translate('OpenLP.SlideController', 'Hide'), self.toolbar)) self.blankScreen = icon_action(self.hideMenu, u'Blank Screen', - u':/slides/slide_blank.png', False) + u':/slides/slide_blank.png', False, u'Live Toolbar') self.blankScreen.setText( translate('OpenLP.SlideController', 'Blank Screen')) self.themeScreen = icon_action(self.hideMenu, u'Blank Theme', - u':/slides/slide_theme.png', False) + u':/slides/slide_theme.png', False, u'Live Toolbar') self.themeScreen.setText( translate('OpenLP.SlideController', 'Blank to Theme')) self.desktopScreen = icon_action(self.hideMenu, u'Desktop Screen', - u':/slides/slide_desktop.png', False) + u':/slides/slide_desktop.png', False, u'Live Toolbar') self.desktopScreen.setText( translate('OpenLP.SlideController', 'Show Desktop')) self.hideMenu.setDefaultAction(self.blankScreen) @@ -364,30 +364,27 @@ class SlideController(QtGui.QWidget): def setPreviewHotkeys(self, parent=None): self.previousItem.setShortcuts([QtCore.Qt.Key_Up, 0]) - actionList.add_action(self.previousItem, u'Preview') + actionList.add_action(self.previousItem, u'Preview Toolbar') self.nextItem.setShortcuts([QtCore.Qt.Key_Down, 0]) - actionList.add_action(self.nextItem, u'Preview') + actionList.add_action(self.nextItem, u'Preview Toolbar') def setLiveHotkeys(self, parent=None): self.previousItem.setShortcuts([QtCore.Qt.Key_Up, QtCore.Qt.Key_PageUp]) self.previousItem.setShortcutContext( QtCore.Qt.WidgetWithChildrenShortcut) - actionList.add_action(self.previousItem, u'Live') + actionList.add_action(self.previousItem, u'Live Toolbar') self.nextItem.setShortcuts([QtCore.Qt.Key_Down, QtCore.Qt.Key_PageDown]) self.nextItem.setShortcutContext(QtCore.Qt.WidgetWithChildrenShortcut) - actionList.add_action(self.nextItem, u'Live') + actionList.add_action(self.nextItem, u'Live Toolbar') self.previousService = shortcut_action(parent, translate('OpenLP.SlideController', 'Previous Service'), - [QtCore.Qt.Key_Left, 0], self.servicePrevious) - actionList.add_action(self.previousService, u'Live') + [QtCore.Qt.Key_Left, 0], self.servicePrevious, u'Live Toolbar') self.nextService = shortcut_action(parent, translate('OpenLP.SlideController', 'Next Service'), - [QtCore.Qt.Key_Right, 0], self.serviceNext) - actionList.add_action(self.nextService, u'Live') + [QtCore.Qt.Key_Right, 0], self.serviceNext, u'Live Toolbar') self.escapeItem = shortcut_action(parent, translate('OpenLP.SlideController', 'Escape Item'), - [QtCore.Qt.Key_Escape, 0], self.liveEscape) - actionList.add_action(self.escapeItem, u'Live') + [QtCore.Qt.Key_Escape, 0], self.liveEscape, u'Live Toolbar') def liveEscape(self): self.display.setVisible(False) diff --git a/openlp/core/utils/__init__.py b/openlp/core/utils/__init__.py index 3c639297e..1bc7037ae 100644 --- a/openlp/core/utils/__init__.py +++ b/openlp/core/utils/__init__.py @@ -495,7 +495,7 @@ def get_uno_instance(resolver): from languagemanager import LanguageManager from actions import ActionList -__all__ = [u'AppLocation', u'check_latest_version', u'add_actions', - u'get_filesystem_encoding', u'LanguageManager', u'ActionList', - u'get_web_page', u'file_is_unicode', u'string_is_unicode', +__all__ = [u'AppLocation', u'get_application_version', u'check_latest_version', + u'add_actions', u'get_filesystem_encoding', u'LanguageManager', + u'ActionList', u'get_web_page', u'file_is_unicode', u'string_is_unicode', u'get_uno_command', u'get_uno_instance', u'delete_file'] diff --git a/openlp/core/utils/actions.py b/openlp/core/utils/actions.py index ba4a7b40d..b592c9a69 100644 --- a/openlp/core/utils/actions.py +++ b/openlp/core/utils/actions.py @@ -184,7 +184,7 @@ class ActionList(object): self.categories[category].actions.append(action) else: self.categories[category].actions.add(action, weight) - self.signal.emit(QtCore.SIGNAL(u'addedAction()')) + self.signal.emit(QtCore.SIGNAL(u'addedAction(QtGui.QAction, QString)'), action, QtCore.QString(category)) class Emit(QtCore.QObject): diff --git a/openlp/plugins/alerts/alertsplugin.py b/openlp/plugins/alerts/alertsplugin.py index 2d22d2d5a..c397fb9c4 100644 --- a/openlp/plugins/alerts/alertsplugin.py +++ b/openlp/plugins/alerts/alertsplugin.py @@ -62,7 +62,6 @@ class AlertsPlugin(Plugin): log.info(u'add tools menu') self.toolsAlertItem = icon_action(tools_menu, u'toolsAlertItem', u':/plugins/plugin_alerts.png') - actionList.add_action(self.toolsAlertItem, u'Extra') self.toolsAlertItem.setText(translate('AlertsPlugin', '&Alert')) self.toolsAlertItem.setStatusTip( translate('AlertsPlugin', 'Show an alert message.')) @@ -76,6 +75,7 @@ class AlertsPlugin(Plugin): log.info(u'Alerts Initialising') Plugin.initialise(self) self.toolsAlertItem.setVisible(True) + actionList.add_action(self.toolsAlertItem, u'Tools') self.liveController.alertTab = self.settings_tab def finalise(self): @@ -86,6 +86,7 @@ class AlertsPlugin(Plugin): self.manager.finalise() Plugin.finalise(self) self.toolsAlertItem.setVisible(False) + #TODO: remove the action from the actionList def toggleAlertsState(self): self.alertsActive = not self.alertsActive From b9b0cbbe9c3492f3aa6403f09cea64631d789455 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Tue, 29 Mar 2011 21:52:21 +0200 Subject: [PATCH 03/89] removed things, as this did not work --- openlp/core/ui/mainwindow.py | 6 +-- openlp/core/ui/shortcutlistdialog.py | 2 + openlp/core/ui/shortcutlistform.py | 58 +++++++++++++++------------- openlp/core/utils/actions.py | 9 ----- openlp/plugins/songs/songsplugin.py | 14 +++---- 5 files changed, 43 insertions(+), 46 deletions(-) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index c37db0b97..cf58dedd8 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -177,11 +177,11 @@ class Ui_MainWindow(object): self.ImportThemeItem = base_action( mainWindow, u'ImportThemeItem', u'Import') self.ImportLanguageItem = base_action( - mainWindow, u'ImportLanguageItem', u'Import') + mainWindow, u'ImportLanguageItem')#, u'Import') self.ExportThemeItem = base_action( mainWindow, u'ExportThemeItem', u'Export') self.ExportLanguageItem = base_action( - mainWindow, u'ExportLanguageItem', u'Export') + mainWindow, u'ExportLanguageItem')#, u'Export') self.ViewMediaManagerItem = icon_action(mainWindow, u'ViewMediaManagerItem', u':/system/system_mediamanager.png', self.mediaManagerDock.isVisible(), u'View') @@ -240,7 +240,7 @@ class Ui_MainWindow(object): category=None)#u'Help') self.HelpDocumentationItem.setEnabled(False) self.HelpAboutItem = icon_action(mainWindow, u'HelpAboutItem', - u':/system/system_about.png', category=None)#u'Help') + u':/system/system_about.png', category=u'Help') self.HelpOnlineHelpItem = base_action( mainWindow, u'HelpOnlineHelpItem', category=u'Help') self.helpWebSiteItem = base_action( diff --git a/openlp/core/ui/shortcutlistdialog.py b/openlp/core/ui/shortcutlistdialog.py index 4e5b9e270..4e0d7d144 100644 --- a/openlp/core/ui/shortcutlistdialog.py +++ b/openlp/core/ui/shortcutlistdialog.py @@ -30,6 +30,7 @@ from openlp.core.lib import translate, build_icon class Ui_ShortcutListDialog(object): def setupUi(self, shortcutListDialog): + shortcutListDialog.resize(440, 450) shortcutListDialog.setObjectName(u'shortcutListDialog') self.dialogLayout = QtGui.QVBoxLayout(shortcutListDialog) self.dialogLayout.setObjectName(u'dialogLayout') @@ -52,6 +53,7 @@ class Ui_ShortcutListDialog(object): build_icon(u':/system/system_configure_shortcuts.png')) self.shortcutButton.setCheckable(True) self.shortcutButton.setObjectName(u'shortcutButton') + self.shortcutButton.setFixedSize(150, 30) self.customLayout.addWidget(self.shortcutButton) self.clearShortcutButton = QtGui.QToolButton(shortcutListDialog) self.clearShortcutButton.setIcon( diff --git a/openlp/core/ui/shortcutlistform.py b/openlp/core/ui/shortcutlistform.py index 83b5de84b..4d785cfc0 100644 --- a/openlp/core/ui/shortcutlistform.py +++ b/openlp/core/ui/shortcutlistform.py @@ -41,10 +41,7 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): """ The shortcut list dialog """ -#TODO: do not close on ESC -#TODO: ability to remove actions -#TODO: Save shortcuts -#TODO: doc +#TODO: do not close on ESC, ability to remove actions, save/load shortcuts, docs #TODO: Fix Preview/Live controller (have the same shortcut) def __init__(self, parent=None): QtGui.QDialog.__init__(self, parent) @@ -87,21 +84,17 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): self.shortcutButton.setChecked(False) def exec_(self): - # The dialog is opened the first time - if self.treeWidget.topLevelItemCount() == 0: - QtCore.QObject.connect(actionList.signal, - QtCore.SIGNAL(u'addedAction()'), self.initialiseActionList) - self.initialiseActionList() self.refreshActionList() return QtGui.QDialog.exec_(self) def refreshActionList(self): + # As refreshing does not work, the check does not work either. self.assingedShortcuts = [] - iterator = QtGui.QTreeWidgetItemIterator(self.treeWidget) - while iterator.value(): - treewidgetItem = iterator.value() - action = treewidgetItem.data(0, QtCore.Qt.UserRole).toPyObject() - if action is not None: + #self.treeWidget.clear() + for category in actionList.categories: + item = QtGui.QTreeWidgetItem([category.name]) + for action in category.actions: + self.assingedShortcuts.extend(action.shortcuts()) actionText = REMOVE_AMPERSAND.sub('', unicode(action.text())) if len(action.shortcuts()) == 2: shortcutText = action.shortcuts()[0].toString() @@ -109,19 +102,11 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): else: shortcutText = action.shortcut().toString() alternateText = u'' - self.assingedShortcuts.extend(action.shortcuts()) - treewidgetItem.setText(0, actionText) - treewidgetItem.setText(1, shortcutText) - treewidgetItem.setText(2, alternateText) - iterator += 1 - - def initialiseActionList(self): - for category in actionList.categories: - item = QtGui.QTreeWidgetItem([category.name]) - for action in category.actions: - actionItem = QtGui.QTreeWidgetItem() + actionItem = QtGui.QTreeWidgetItem( + [actionText, shortcutText, alternateText]) actionItem.setIcon(0, action.icon()) - actionItem.setData(0, QtCore.Qt.UserRole, QtCore.QVariant(action)) + actionItem.setData(0, + QtCore.Qt.UserRole, QtCore.QVariant(action)) item.addChild(actionItem) item.setExpanded(True) self.treeWidget.addTopLevelItem(item) @@ -135,13 +120,16 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): return # TODO: Sort out which shortcuts should be kept. action.setShortcuts(QtGui.QKeySequence(self.shortcutButton.text())) + item.setText(1, self.shortcutButton.text()) self.refreshActionList() def onItemPressed(self, item, column): item = self.treeWidget.currentItem() action = item.data(0, QtCore.Qt.UserRole).toPyObject() + self.shortcutButton.setEnabled(action is not None) if action is None: text = u'' + self.shortcutButton.setChecked(False) else: if len(action.shortcuts()) == 0: text = u'' @@ -150,3 +138,21 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): else: text = action.shortcuts()[0].toString() self.shortcutButton.setText(text) + + def saveShortcuts(self): + """ + Save the shortcuts. + """ + settings = QtCore.QSettings() + settings.beginGroup(u'shortcuts') + # TODO: Save shortcuts + settings.endGroup() + + def loadShortcuts(self): + """ + Load the shortcuts. + """ + settings = QtCore.QSettings() + settings.beginGroup(u'shortcuts') + # TODO: Load shortcuts + settings.endGroup() diff --git a/openlp/core/utils/actions.py b/openlp/core/utils/actions.py index ba4a7b40d..69aeb14b4 100644 --- a/openlp/core/utils/actions.py +++ b/openlp/core/utils/actions.py @@ -27,8 +27,6 @@ The :mod:`~openlp.core.utils.actions` module provides action list classes used by the shortcuts system. """ -from PyQt4 import QtCore - class ActionCategory(object): """ The :class:`~openlp.core.utils.ActionCategory` class encapsulates a @@ -175,7 +173,6 @@ class ActionList(object): """ def __init__(self): self.categories = CategoryList() - self.signal = Emit() def add_action(self, action, category=u'Default', weight=None): if category not in self.categories: @@ -184,11 +181,5 @@ class ActionList(object): self.categories[category].actions.append(action) else: self.categories[category].actions.add(action, weight) - self.signal.emit(QtCore.SIGNAL(u'addedAction()')) - - -class Emit(QtCore.QObject): - def __init__(self): - QtCore.QObject.__init__(self) actionList = ActionList() diff --git a/openlp/plugins/songs/songsplugin.py b/openlp/plugins/songs/songsplugin.py index 1260a832b..e1731bc01 100644 --- a/openlp/plugins/songs/songsplugin.py +++ b/openlp/plugins/songs/songsplugin.py @@ -33,7 +33,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Plugin, StringContent, build_icon, translate, \ Receiver from openlp.core.lib.db import Manager -from openlp.core.lib.ui import UiStrings +from openlp.core.lib.ui import UiStrings, base_action, icon_action from openlp.plugins.songs.lib import clean_song, SongMediaItem, SongsTab from openlp.plugins.songs.lib.db import init_schema, Song from openlp.plugins.songs.lib.importer import SongFormat @@ -78,8 +78,8 @@ class SongsPlugin(Plugin): use it as their parent. """ # Main song import menu item - will eventually be the only one - self.SongImportItem = QtGui.QAction(import_menu) - self.SongImportItem.setObjectName(u'SongImportItem') + self.SongImportItem = base_action( + import_menu, u'SongImportItem', u'Import') self.SongImportItem.setText(translate( 'SongsPlugin', '&Song')) self.SongImportItem.setToolTip(translate('SongsPlugin', @@ -99,8 +99,7 @@ class SongsPlugin(Plugin): use it as their parent. """ # Main song import menu item - will eventually be the only one - self.SongExportItem = QtGui.QAction(export_menu) - self.SongExportItem.setObjectName(u'SongExportItem') + self.SongExportItem = base_action(export_menu, u'SongExportItem', u'Export') self.SongExportItem.setText(translate( 'SongsPlugin', '&Song')) self.SongExportItem.setToolTip(translate('SongsPlugin', @@ -120,9 +119,8 @@ class SongsPlugin(Plugin): use it as their parent. """ log.info(u'add tools menu') - self.toolsReindexItem = QtGui.QAction(tools_menu) - self.toolsReindexItem.setIcon(build_icon(u':/plugins/plugin_songs.png')) - self.toolsReindexItem.setObjectName(u'toolsReindexItem') + self.toolsReindexItem = icon_action(tools_menu, u'toolsReindexItem', + u':/plugins/plugin_songs.png', category=u'Tools') self.toolsReindexItem.setText( translate('SongsPlugin', '&Re-index Songs')) self.toolsReindexItem.setStatusTip( From e20fd7d85d62707d3b6e78858aaa0174fc0ccba4 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Tue, 29 Mar 2011 21:58:04 +0200 Subject: [PATCH 04/89] clean up --- openlp/core/ui/mainwindow.py | 2 -- openlp/core/ui/shortcutlistform.py | 6 ++++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index cf58dedd8..f4cec4ae7 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -39,7 +39,6 @@ from openlp.core.ui import AboutForm, SettingsForm, ServiceManager, \ ShortcutListForm, DisplayTagForm from openlp.core.utils import AppLocation, add_actions, LanguageManager, \ get_application_version -#from openlp.core.utils.actions import actionList log = logging.getLogger(__name__) @@ -216,7 +215,6 @@ class Ui_MainWindow(object): # i18n Language Items self.AutoLanguageItem = checkable_action(mainWindow, u'AutoLanguageItem', LanguageManager.auto_language) - #actionList.add_action(self.AutoLanguageItem, u'Settings') self.LanguageGroup = QtGui.QActionGroup(mainWindow) self.LanguageGroup.setExclusive(True) self.LanguageGroup.setObjectName(u'LanguageGroup') diff --git a/openlp/core/ui/shortcutlistform.py b/openlp/core/ui/shortcutlistform.py index 4d785cfc0..2dbb57f2d 100644 --- a/openlp/core/ui/shortcutlistform.py +++ b/openlp/core/ui/shortcutlistform.py @@ -41,8 +41,10 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): """ The shortcut list dialog """ -#TODO: do not close on ESC, ability to remove actions, save/load shortcuts, docs -#TODO: Fix Preview/Live controller (have the same shortcut) +#TODO: do not close on ESC, ability to remove actions (e. g. reindex tool) +#TODO: save/load shortcuts, docs +#TODO: Fix Preview/Live controller (have the same shortcut), make sure + def __init__(self, parent=None): QtGui.QDialog.__init__(self, parent) self.setupUi(self) From 9b939bb9624eca001999b65b87adcc9987ecf070 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 30 Mar 2011 12:12:39 +0200 Subject: [PATCH 05/89] fixed reloading --- openlp/core/ui/shortcutlistform.py | 5 ++--- openlp/core/utils/actions.py | 12 +++++++----- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/openlp/core/ui/shortcutlistform.py b/openlp/core/ui/shortcutlistform.py index 2dbb57f2d..b524c5d06 100644 --- a/openlp/core/ui/shortcutlistform.py +++ b/openlp/core/ui/shortcutlistform.py @@ -90,12 +90,11 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): return QtGui.QDialog.exec_(self) def refreshActionList(self): - # As refreshing does not work, the check does not work either. self.assingedShortcuts = [] - #self.treeWidget.clear() + self.treeWidget.clear() for category in actionList.categories: item = QtGui.QTreeWidgetItem([category.name]) - for action in category.actions: + for action, default in category.actions: self.assingedShortcuts.extend(action.shortcuts()) actionText = REMOVE_AMPERSAND.sub('', unicode(action.text())) if len(action.shortcuts()) == 2: diff --git a/openlp/core/utils/actions.py b/openlp/core/utils/actions.py index 69aeb14b4..cbfa3a488 100644 --- a/openlp/core/utils/actions.py +++ b/openlp/core/utils/actions.py @@ -27,9 +27,9 @@ The :mod:`~openlp.core.utils.actions` module provides action list classes used by the shortcuts system. """ -class ActionCategory(object): +class Category(object): """ - The :class:`~openlp.core.utils.ActionCategory` class encapsulates a + The :class:`~openlp.core.utils.Category` class encapsulates a category for the :class:`~openlp.core.utils.CategoryList` class. """ def __init__(self, name, weight=0): @@ -67,10 +67,11 @@ class CategoryActionList(object): Python 3 "next" method. """ if self.index >= len(self.actions): + self.index = 0 raise StopIteration else: self.index += 1 - return self.actions[self.index - 1][1] + return self.actions[self.index - 1][1:] def next(self): """ @@ -91,7 +92,7 @@ class CategoryActionList(object): self.add(name, weight) def add(self, action, weight=0): - self.actions.append((weight, action)) + self.actions.append((weight, action, action.shortcuts())) self.actions.sort(key=lambda act: act[0]) @@ -126,6 +127,7 @@ class CategoryList(object): Python 3 "next" method for iterator. """ if self.index >= len(self.categories): + self.index = 0 raise StopIteration else: self.index += 1 @@ -153,7 +155,7 @@ class CategoryList(object): self.add(name, weight) def add(self, name, weight=0, actions=None): - category = ActionCategory(name, weight) + category = Category(name, weight) if actions: for action in actions: if isinstance(action, tuple): From fe92842c6b656610190791221b99c87d31898f1a Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 30 Mar 2011 12:27:27 +0200 Subject: [PATCH 06/89] added ability to remove actions --- openlp/core/ui/shortcutlistform.py | 4 ++-- openlp/core/utils/actions.py | 17 ++++++++++++++--- openlp/plugins/alerts/alertsplugin.py | 2 +- openlp/plugins/songs/songsplugin.py | 14 ++++++++++---- 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/openlp/core/ui/shortcutlistform.py b/openlp/core/ui/shortcutlistform.py index b524c5d06..fd5a53813 100644 --- a/openlp/core/ui/shortcutlistform.py +++ b/openlp/core/ui/shortcutlistform.py @@ -41,7 +41,7 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): """ The shortcut list dialog """ -#TODO: do not close on ESC, ability to remove actions (e. g. reindex tool) +#TODO: do not close on ESC #TODO: save/load shortcuts, docs #TODO: Fix Preview/Live controller (have the same shortcut), make sure @@ -94,7 +94,7 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): self.treeWidget.clear() for category in actionList.categories: item = QtGui.QTreeWidgetItem([category.name]) - for action, default in category.actions: + for action in category.actions: self.assingedShortcuts.extend(action.shortcuts()) actionText = REMOVE_AMPERSAND.sub('', unicode(action.text())) if len(action.shortcuts()) == 2: diff --git a/openlp/core/utils/actions.py b/openlp/core/utils/actions.py index cbfa3a488..8887a7e30 100644 --- a/openlp/core/utils/actions.py +++ b/openlp/core/utils/actions.py @@ -71,7 +71,7 @@ class CategoryActionList(object): raise StopIteration else: self.index += 1 - return self.actions[self.index - 1][1:] + return self.actions[self.index - 1][1] def next(self): """ @@ -92,9 +92,15 @@ class CategoryActionList(object): self.add(name, weight) def add(self, action, weight=0): - self.actions.append((weight, action, action.shortcuts())) + self.actions.append((weight, action)) self.actions.sort(key=lambda act: act[0]) + def remove(self, remove_action): + for action in self.actions: + if action[1] == remove_action: + self.actions.remove(action) + return + class CategoryList(object): """ @@ -176,7 +182,7 @@ class ActionList(object): def __init__(self): self.categories = CategoryList() - def add_action(self, action, category=u'Default', weight=None): + def add_action(self, action, category, weight=None): if category not in self.categories: self.categories.append(category) if weight is None: @@ -184,4 +190,9 @@ class ActionList(object): else: self.categories[category].actions.add(action, weight) + def remove_action(self, action, category): + if category not in self.categories: + return + self.categories[category].actions.remove(action) + actionList = ActionList() diff --git a/openlp/plugins/alerts/alertsplugin.py b/openlp/plugins/alerts/alertsplugin.py index c397fb9c4..a10d56a20 100644 --- a/openlp/plugins/alerts/alertsplugin.py +++ b/openlp/plugins/alerts/alertsplugin.py @@ -86,7 +86,7 @@ class AlertsPlugin(Plugin): self.manager.finalise() Plugin.finalise(self) self.toolsAlertItem.setVisible(False) - #TODO: remove the action from the actionList + actionList.remove_action(self.toolsAlertItem, u'Tools') def toggleAlertsState(self): self.alertsActive = not self.alertsActive diff --git a/openlp/plugins/songs/songsplugin.py b/openlp/plugins/songs/songsplugin.py index e1731bc01..e5ce25906 100644 --- a/openlp/plugins/songs/songsplugin.py +++ b/openlp/plugins/songs/songsplugin.py @@ -34,6 +34,7 @@ from openlp.core.lib import Plugin, StringContent, build_icon, translate, \ Receiver from openlp.core.lib.db import Manager from openlp.core.lib.ui import UiStrings, base_action, icon_action +from openlp.core.utils.actions import actionList from openlp.plugins.songs.lib import clean_song, SongMediaItem, SongsTab from openlp.plugins.songs.lib.db import init_schema, Song from openlp.plugins.songs.lib.importer import SongFormat @@ -65,6 +66,9 @@ class SongsPlugin(Plugin): log.info(u'Songs Initialising') Plugin.initialise(self) self.toolsReindexItem.setVisible(True) + actionList.add_action(self.SongImportItem, u'Import') + actionList.add_action(self.SongExportItem, u'Export') + actionList.add_action(self.toolsReindexItem, u'Tools') self.mediaItem.displayResultsSong( self.manager.get_all_objects(Song, order_by_ref=Song.search_title)) @@ -78,8 +82,7 @@ class SongsPlugin(Plugin): use it as their parent. """ # Main song import menu item - will eventually be the only one - self.SongImportItem = base_action( - import_menu, u'SongImportItem', u'Import') + self.SongImportItem = base_action(import_menu, u'SongImportItem') self.SongImportItem.setText(translate( 'SongsPlugin', '&Song')) self.SongImportItem.setToolTip(translate('SongsPlugin', @@ -99,7 +102,7 @@ class SongsPlugin(Plugin): use it as their parent. """ # Main song import menu item - will eventually be the only one - self.SongExportItem = base_action(export_menu, u'SongExportItem', u'Export') + self.SongExportItem = base_action(export_menu, u'SongExportItem') self.SongExportItem.setText(translate( 'SongsPlugin', '&Song')) self.SongExportItem.setToolTip(translate('SongsPlugin', @@ -120,7 +123,7 @@ class SongsPlugin(Plugin): """ log.info(u'add tools menu') self.toolsReindexItem = icon_action(tools_menu, u'toolsReindexItem', - u':/plugins/plugin_songs.png', category=u'Tools') + u':/plugins/plugin_songs.png') self.toolsReindexItem.setText( translate('SongsPlugin', '&Re-index Songs')) self.toolsReindexItem.setStatusTip( @@ -257,4 +260,7 @@ class SongsPlugin(Plugin): log.info(u'Songs Finalising') self.manager.finalise() self.toolsReindexItem.setVisible(False) + actionList.remove_action(self.SongImportItem, u'Import') + actionList.remove_action(self.SongExportItem, u'Export') + actionList.remove_action(self.toolsReindexItem, u'Tools') Plugin.finalise(self) From 5ef0cc12c09cf523b8fa3563d41fc9f3261e692a Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 30 Mar 2011 18:34:40 +0200 Subject: [PATCH 07/89] started working on saving/loading shortcuts --- openlp/core/ui/mainwindow.py | 3 +- openlp/core/ui/shortcutlistdialog.py | 11 ------ openlp/core/ui/shortcutlistform.py | 55 ++++++++++++++++++++-------- openlp/core/utils/actions.py | 7 ++-- 4 files changed, 45 insertions(+), 31 deletions(-) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index f4cec4ae7..d0f6338e3 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -761,7 +761,8 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): """ Show the shortcuts dialog """ - self.shortcutForm.exec_() + if self.shortcutForm.exec_(): + self.shortcutForm.saveShortcuts() def onModeDefaultItemClicked(self): """ diff --git a/openlp/core/ui/shortcutlistdialog.py b/openlp/core/ui/shortcutlistdialog.py index 4e0d7d144..467fb0534 100644 --- a/openlp/core/ui/shortcutlistdialog.py +++ b/openlp/core/ui/shortcutlistdialog.py @@ -39,15 +39,8 @@ class Ui_ShortcutListDialog(object): self.treeWidget.setObjectName(u'treeWidget') self.treeWidget.setColumnCount(3) self.dialogLayout.addWidget(self.treeWidget) - self.defaultButton = QtGui.QRadioButton(shortcutListDialog) - self.defaultButton.setChecked(True) - self.defaultButton.setObjectName(u'defaultButton') - self.dialogLayout.addWidget(self.defaultButton) self.customLayout = QtGui.QHBoxLayout() self.customLayout.setObjectName(u'customLayout') - self.customButton = QtGui.QRadioButton(shortcutListDialog) - self.customButton.setObjectName(u'customButton') - self.customLayout.addWidget(self.customButton) self.shortcutButton = QtGui.QPushButton(shortcutListDialog) self.shortcutButton.setIcon( build_icon(u':/system/system_configure_shortcuts.png')) @@ -82,9 +75,5 @@ class Ui_ShortcutListDialog(object): translate('OpenLP.ShortcutListDialog', 'Action'), translate('OpenLP.ShortcutListDialog', 'Shortcut'), translate('OpenLP.ShortcutListDialog', 'Alternate')]) - self.defaultButton.setText( - translate('OpenLP.ShortcutListDialog', 'Default: %s')) - self.customButton.setText( - translate('OpenLP.ShortcutListDialog', 'Custom:')) self.shortcutButton.setText( translate('OpenLP.ShortcutListDialog', 'None')) diff --git a/openlp/core/ui/shortcutlistform.py b/openlp/core/ui/shortcutlistform.py index fd5a53813..127569f24 100644 --- a/openlp/core/ui/shortcutlistform.py +++ b/openlp/core/ui/shortcutlistform.py @@ -49,6 +49,7 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): QtGui.QDialog.__init__(self, parent) self.setupUi(self) self.assingedShortcuts = [] + self.column = -1 self.shortcutButton.setText(u'') QtCore.QObject.connect(self.shortcutButton, QtCore.SIGNAL(u'toggled(bool)'), self.onShortcutButtonClicked) @@ -119,25 +120,40 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): action = item.data(0, QtCore.Qt.UserRole).toPyObject() if action is None: return - # TODO: Sort out which shortcuts should be kept. - action.setShortcuts(QtGui.QKeySequence(self.shortcutButton.text())) - item.setText(1, self.shortcutButton.text()) - self.refreshActionList() + shortcuts = [] + if self.column == 1: + # We are changing the primary shortcut. + shortcuts.append(QtGui.QKeySequence(self.shortcutButton.text())) + if len(action.shortcuts()) == 2: + shortcuts.append(action.shortcuts()[1]) + else: + shortcuts.append(0) + item.setText(1, self.shortcutButton.text()) + elif self.column == 2: + # We are changing the secondary shortcut. + if len(action.shortcuts()) == 1: + shortcuts.append(action.shortcuts()[0]) + else: + shortcuts.append(0) + shortcuts.append(QtGui.QKeySequence(self.shortcutButton.text())) + item.setText(2, self.shortcutButton.text()) + else: + return + action.setShortcuts(shortcuts) def onItemPressed(self, item, column): + self.column = column item = self.treeWidget.currentItem() action = item.data(0, QtCore.Qt.UserRole).toPyObject() - self.shortcutButton.setEnabled(action is not None) - if action is None: - text = u'' - self.shortcutButton.setChecked(False) - else: - if len(action.shortcuts()) == 0: - text = u'' - elif len(action.shortcuts()) == 2 and column == 2: - text = action.shortcuts()[1].toString() - else: - text = action.shortcuts()[0].toString() + self.shortcutButton.setEnabled(True) + text = u'' + if action is None or column not in [1, 2] or \ + len(action.shortcuts()) == 0: + self.shortcutButton.setEnabled(False) + elif column == 1: + text = action.shortcuts()[0].toString() + elif len(action.shortcuts()) == 2: + text = action.shortcuts()[1].toString() self.shortcutButton.setText(text) def saveShortcuts(self): @@ -146,7 +162,12 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): """ settings = QtCore.QSettings() settings.beginGroup(u'shortcuts') - # TODO: Save shortcuts + for category in actionList.categories: + break + for action in category.actions: + if action.defaultShortcuts != action.shortcuts(): + settings.setValue(action.text(), + QtCore.QVariant(action.shortcuts())) settings.endGroup() def loadShortcuts(self): @@ -155,5 +176,7 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): """ settings = QtCore.QSettings() settings.beginGroup(u'shortcuts') + for shortcut in settings.allKeys(): + pass # TODO: Load shortcuts settings.endGroup() diff --git a/openlp/core/utils/actions.py b/openlp/core/utils/actions.py index 8887a7e30..d94ee1511 100644 --- a/openlp/core/utils/actions.py +++ b/openlp/core/utils/actions.py @@ -27,9 +27,9 @@ The :mod:`~openlp.core.utils.actions` module provides action list classes used by the shortcuts system. """ -class Category(object): +class ActionCategory(object): """ - The :class:`~openlp.core.utils.Category` class encapsulates a + The :class:`~openlp.core.utils.ActionCategory` class encapsulates a category for the :class:`~openlp.core.utils.CategoryList` class. """ def __init__(self, name, weight=0): @@ -161,7 +161,7 @@ class CategoryList(object): self.add(name, weight) def add(self, name, weight=0, actions=None): - category = Category(name, weight) + category = ActionCategory(name, weight) if actions: for action in actions: if isinstance(action, tuple): @@ -185,6 +185,7 @@ class ActionList(object): def add_action(self, action, category, weight=None): if category not in self.categories: self.categories.append(category) + action.defaultShortcuts = action.shortcuts() if weight is None: self.categories[category].actions.append(action) else: From 772bd8eb66daa57a0c9b8759cbad4b11e22f9282 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 30 Mar 2011 19:50:36 +0200 Subject: [PATCH 08/89] basic saving and loading of shortcuts --- openlp/core/ui/mainwindow.py | 2 +- openlp/core/ui/shortcutlistform.py | 33 +++++++++--------------------- openlp/core/utils/actions.py | 12 +++++++++++ 3 files changed, 23 insertions(+), 24 deletions(-) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index d0f6338e3..1fdf0fd76 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -762,7 +762,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): Show the shortcuts dialog """ if self.shortcutForm.exec_(): - self.shortcutForm.saveShortcuts() + self.shortcutForm.save() def onModeDefaultItemClicked(self): """ diff --git a/openlp/core/ui/shortcutlistform.py b/openlp/core/ui/shortcutlistform.py index 127569f24..15c6c53e5 100644 --- a/openlp/core/ui/shortcutlistform.py +++ b/openlp/core/ui/shortcutlistform.py @@ -87,10 +87,10 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): self.shortcutButton.setChecked(False) def exec_(self): - self.refreshActionList() + self.reloadActionList() return QtGui.QDialog.exec_(self) - def refreshActionList(self): + def reloadActionList(self): self.assingedShortcuts = [] self.treeWidget.clear() for category in actionList.categories: @@ -147,36 +147,23 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): action = item.data(0, QtCore.Qt.UserRole).toPyObject() self.shortcutButton.setEnabled(True) text = u'' - if action is None or column not in [1, 2] or \ - len(action.shortcuts()) == 0: + if action is None or column not in [1, 2]: self.shortcutButton.setEnabled(False) - elif column == 1: + elif column == 1 and len(action.shortcuts()) != 0: text = action.shortcuts()[0].toString() - elif len(action.shortcuts()) == 2: + elif len(action.shortcuts()) == 2 and len(action.shortcuts()) != 0: text = action.shortcuts()[1].toString() self.shortcutButton.setText(text) - def saveShortcuts(self): + def save(self): """ - Save the shortcuts. + Save the shortcuts. **Note**, that we do not have to load the shortcuts, + as they are loaded in :class:`~openlp.core.utils.ActionList`. """ settings = QtCore.QSettings() settings.beginGroup(u'shortcuts') for category in actionList.categories: - break for action in category.actions: - if action.defaultShortcuts != action.shortcuts(): - settings.setValue(action.text(), - QtCore.QVariant(action.shortcuts())) - settings.endGroup() - - def loadShortcuts(self): - """ - Load the shortcuts. - """ - settings = QtCore.QSettings() - settings.beginGroup(u'shortcuts') - for shortcut in settings.allKeys(): - pass - # TODO: Load shortcuts + settings.setValue( + action.objectName(), QtCore.QVariant(action.shortcuts())) settings.endGroup() diff --git a/openlp/core/utils/actions.py b/openlp/core/utils/actions.py index d94ee1511..6b7df6817 100644 --- a/openlp/core/utils/actions.py +++ b/openlp/core/utils/actions.py @@ -27,6 +27,10 @@ The :mod:`~openlp.core.utils.actions` module provides action list classes used by the shortcuts system. """ +from PyQt4 import QtCore, QtGui + +from openlp.core.lib import translate + class ActionCategory(object): """ The :class:`~openlp.core.utils.ActionCategory` class encapsulates a @@ -190,6 +194,14 @@ class ActionList(object): self.categories[category].actions.append(action) else: self.categories[category].actions.add(action, weight) + # Load the shortcut from the config. + settings = QtCore.QSettings() + settings.beginGroup(u'shortcuts') + shortcuts = settings.value(action.objectName(), + QtCore.QVariant(action.shortcuts())).toStringList() + action.setShortcuts( + [QtGui.QKeySequence(shortcut) for shortcut in shortcuts]) + settings.endGroup() def remove_action(self, action, category): if category not in self.categories: From bf2a9d338b25dbce73ed0c3f4ec2a2724e9a2b96 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 30 Mar 2011 20:12:05 +0200 Subject: [PATCH 09/89] clean up --- openlp/core/lib/ui.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/openlp/core/lib/ui.py b/openlp/core/lib/ui.py index 86def01d8..44bf7c0dd 100644 --- a/openlp/core/lib/ui.py +++ b/openlp/core/lib/ui.py @@ -242,6 +242,11 @@ def create_up_down_push_button_set(parent): def base_action(parent, name, category=None): """ Return the most basic action with the object name set. + + ``category`` + The category the action should be listed in the shortcut dialog. If you + not wish, that this action is added to the shortcut dialog, then do not + state any. """ action = QtGui.QAction(parent) action.setObjectName(name) @@ -262,11 +267,6 @@ def checkable_action(parent, name, checked=None, category=None): def icon_action(parent, name, icon, checked=None, category=None): """ Return a standard action with an icon. - - ``category`` - The category the action should be listed in the shortcut dialog. If you - not wish, that this action is added to the shortcut dialog, then do not - state any. """ if checked is not None: action = checkable_action(parent, name, checked, category) From fb78350a44f421e3bb8b4b3184e51eeb2194fc61 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 30 Mar 2011 20:27:33 +0200 Subject: [PATCH 10/89] added bible actions --- openlp/plugins/bibles/bibleplugin.py | 16 +++++++++------- openlp/plugins/songs/songsplugin.py | 6 ++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/openlp/plugins/bibles/bibleplugin.py b/openlp/plugins/bibles/bibleplugin.py index 4f677f211..86d751e9a 100644 --- a/openlp/plugins/bibles/bibleplugin.py +++ b/openlp/plugins/bibles/bibleplugin.py @@ -29,6 +29,8 @@ import logging from PyQt4 import QtCore, QtGui from openlp.core.lib import Plugin, StringContent, build_icon, translate +from openlp.core.lib.ui import base_action +from openlp.core.utils.actions import actionList from openlp.plugins.bibles.lib import BibleManager, BiblesTab, BibleMediaItem log = logging.getLogger(__name__) @@ -50,6 +52,9 @@ class BiblePlugin(Plugin): self.manager = BibleManager(self) Plugin.initialise(self) self.importBibleItem.setVisible(True) + actionList.add_action(self.importBibleItem, u'Import') + # Do not add the action to the list yet. + #actionList.add_action(self.exportBibleItem, u'Export') # Set to invisible until we can export bibles self.exportBibleItem.setVisible(False) @@ -64,21 +69,18 @@ class BiblePlugin(Plugin): self.exportBibleItem.setVisible(False) def addImportMenuItem(self, import_menu): - self.importBibleItem = QtGui.QAction(import_menu) - self.importBibleItem.setObjectName(u'importBibleItem') + self.importBibleItem = base_action(import_menu, u'importBibleItem') + self.importBibleItem.setText(translate('BiblesPlugin', '&Bible')) import_menu.addAction(self.importBibleItem) - self.importBibleItem.setText( - translate('BiblesPlugin', '&Bible')) # signals and slots QtCore.QObject.connect(self.importBibleItem, QtCore.SIGNAL(u'triggered()'), self.onBibleImportClick) self.importBibleItem.setVisible(False) def addExportMenuItem(self, export_menu): - self.exportBibleItem = QtGui.QAction(export_menu) - self.exportBibleItem.setObjectName(u'exportBibleItem') - export_menu.addAction(self.exportBibleItem) + self.exportBibleItem = base_action(export_menu, u'exportBibleItem') self.exportBibleItem.setText(translate('BiblesPlugin', '&Bible')) + export_menu.addAction(self.exportBibleItem) self.exportBibleItem.setVisible(False) def onBibleImportClick(self): diff --git a/openlp/plugins/songs/songsplugin.py b/openlp/plugins/songs/songsplugin.py index e5ce25906..12462428e 100644 --- a/openlp/plugins/songs/songsplugin.py +++ b/openlp/plugins/songs/songsplugin.py @@ -83,8 +83,7 @@ class SongsPlugin(Plugin): """ # Main song import menu item - will eventually be the only one self.SongImportItem = base_action(import_menu, u'SongImportItem') - self.SongImportItem.setText(translate( - 'SongsPlugin', '&Song')) + self.SongImportItem.setText(translate('SongsPlugin', '&Song')) self.SongImportItem.setToolTip(translate('SongsPlugin', 'Import songs using the import wizard.')) import_menu.addAction(self.SongImportItem) @@ -103,8 +102,7 @@ class SongsPlugin(Plugin): """ # Main song import menu item - will eventually be the only one self.SongExportItem = base_action(export_menu, u'SongExportItem') - self.SongExportItem.setText(translate( - 'SongsPlugin', '&Song')) + self.SongExportItem.setText(translate('SongsPlugin', '&Song')) self.SongExportItem.setToolTip(translate('SongsPlugin', 'Exports songs using the export wizard.')) export_menu.addAction(self.SongExportItem) From bba2f2c604245e959dd27d336950624e095454e9 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 30 Mar 2011 20:52:21 +0200 Subject: [PATCH 11/89] docs --- openlp/core/ui/shortcutlistform.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/openlp/core/ui/shortcutlistform.py b/openlp/core/ui/shortcutlistform.py index 15c6c53e5..97d21bebf 100644 --- a/openlp/core/ui/shortcutlistform.py +++ b/openlp/core/ui/shortcutlistform.py @@ -42,9 +42,9 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): The shortcut list dialog """ #TODO: do not close on ESC -#TODO: save/load shortcuts, docs -#TODO: Fix Preview/Live controller (have the same shortcut), make sure - +#TODO: Fix Preview/Live controller (have the same shortcut) +#TODO: double click event +#TODO: refresh self.assingedShortcuts def __init__(self, parent=None): QtGui.QDialog.__init__(self, parent) self.setupUi(self) @@ -91,6 +91,9 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): return QtGui.QDialog.exec_(self) def reloadActionList(self): + """ + Reload the ``treeWidget`` list to add new and remove old actions. + """ self.assingedShortcuts = [] self.treeWidget.clear() for category in actionList.categories: @@ -114,6 +117,9 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): self.treeWidget.addTopLevelItem(item) def onShortcutButtonClicked(self, toggled): + """ + Save the new shortcut to the action if the button is unchanged. + """ if toggled: return item = self.treeWidget.currentItem() @@ -142,6 +148,10 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): action.setShortcuts(shortcuts) def onItemPressed(self, item, column): + """ + A item has been pressed. We adjust the button's text to the action's + shortcut which is encapsulate in the item. + """ self.column = column item = self.treeWidget.currentItem() action = item.data(0, QtCore.Qt.UserRole).toPyObject() From 4ca738e9b3bfd8753a8d78a31c86ea5d182ff1d8 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 31 Mar 2011 10:43:19 +0200 Subject: [PATCH 12/89] staticmethod for adding/removing actions --- openlp/core/lib/ui.py | 4 ++-- openlp/core/ui/servicemanager.py | 20 ++++++++++---------- openlp/core/ui/shortcutlistform.py | 6 +++--- openlp/core/ui/slidecontroller.py | 10 +++++----- openlp/core/utils/actions.py | 23 +++++++++++------------ openlp/plugins/alerts/alertsplugin.py | 6 +++--- openlp/plugins/bibles/bibleplugin.py | 6 +++--- openlp/plugins/songs/songsplugin.py | 14 +++++++------- 8 files changed, 44 insertions(+), 45 deletions(-) diff --git a/openlp/core/lib/ui.py b/openlp/core/lib/ui.py index 44bf7c0dd..a298d803b 100644 --- a/openlp/core/lib/ui.py +++ b/openlp/core/lib/ui.py @@ -31,7 +31,7 @@ import logging from PyQt4 import QtCore, QtGui from openlp.core.lib import build_icon, Receiver, translate -from openlp.core.utils.actions import actionList +from openlp.core.utils.actions import ActionList log = logging.getLogger(__name__) @@ -251,7 +251,7 @@ def base_action(parent, name, category=None): action = QtGui.QAction(parent) action.setObjectName(name) if category is not None: - actionList.add_action(action, category) + ActionList.add_action(action, category) return action def checkable_action(parent, name, checked=None, category=None): diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 1d5321e01..4bdd647ed 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -40,7 +40,7 @@ from openlp.core.ui import ServiceNoteForm, ServiceItemEditForm, StartTimeForm from openlp.core.ui.printserviceform import PrintServiceForm from openlp.core.utils import AppLocation, delete_file, file_is_unicode, \ split_filename -from openlp.core.utils.actions import actionList +from openlp.core.utils.actions import ActionList class ServiceManagerList(QtGui.QTreeWidget): """ @@ -316,15 +316,15 @@ class ServiceManager(QtGui.QWidget): self.configUpdated() def setServiceHotkeys(self): - actionList.add_action(self.serviceManagerList.moveDown, u'Service') - actionList.add_action(self.serviceManagerList.moveUp, u'Service') - actionList.add_action(self.serviceManagerList.moveTop, u'Service') - actionList.add_action(self.serviceManagerList.moveBottom, u'Service') - actionList.add_action(self.serviceManagerList.makeLive, u'Service') - actionList.add_action(self.serviceManagerList.up, u'Service') - actionList.add_action(self.serviceManagerList.down, u'Service') - actionList.add_action(self.serviceManagerList.expand, u'Service') - actionList.add_action(self.serviceManagerList.collapse, u'Service') + ActionList.add_action(self.serviceManagerList.moveDown, u'Service') + ActionList.add_action(self.serviceManagerList.moveUp, u'Service') + ActionList.add_action(self.serviceManagerList.moveTop, u'Service') + ActionList.add_action(self.serviceManagerList.moveBottom, u'Service') + ActionList.add_action(self.serviceManagerList.makeLive, u'Service') + ActionList.add_action(self.serviceManagerList.up, u'Service') + ActionList.add_action(self.serviceManagerList.down, u'Service') + ActionList.add_action(self.serviceManagerList.expand, u'Service') + ActionList.add_action(self.serviceManagerList.collapse, u'Service') def setModified(self, modified=True): diff --git a/openlp/core/ui/shortcutlistform.py b/openlp/core/ui/shortcutlistform.py index 97d21bebf..8ba78a876 100644 --- a/openlp/core/ui/shortcutlistform.py +++ b/openlp/core/ui/shortcutlistform.py @@ -30,7 +30,7 @@ import re from PyQt4 import QtCore, QtGui from openlp.core.utils import translate -from openlp.core.utils.actions import actionList +from openlp.core.utils.actions import ActionList from shortcutlistdialog import Ui_ShortcutListDialog REMOVE_AMPERSAND = re.compile(r'&{1}') @@ -96,7 +96,7 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): """ self.assingedShortcuts = [] self.treeWidget.clear() - for category in actionList.categories: + for category in ActionList.categories: item = QtGui.QTreeWidgetItem([category.name]) for action in category.actions: self.assingedShortcuts.extend(action.shortcuts()) @@ -172,7 +172,7 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): """ settings = QtCore.QSettings() settings.beginGroup(u'shortcuts') - for category in actionList.categories: + for category in ActionList.categories: for action in category.actions: settings.setValue( action.objectName(), QtCore.QVariant(action.shortcuts())) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index cafbec198..bc478463c 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -34,7 +34,7 @@ from openlp.core.lib import OpenLPToolbar, Receiver, resize_image, \ ItemCapabilities, translate from openlp.core.lib.ui import icon_action, UiStrings, shortcut_action from openlp.core.ui import HideMode, MainDisplay -from openlp.core.utils.actions import actionList +from openlp.core.utils.actions import ActionList log = logging.getLogger(__name__) @@ -364,18 +364,18 @@ class SlideController(QtGui.QWidget): def setPreviewHotkeys(self, parent=None): self.previousItem.setShortcuts([QtCore.Qt.Key_Up, 0]) - actionList.add_action(self.previousItem, u'Preview Toolbar') + ActionList.add_action(self.previousItem, u'Preview Toolbar') self.nextItem.setShortcuts([QtCore.Qt.Key_Down, 0]) - actionList.add_action(self.nextItem, u'Preview Toolbar') + ActionList.add_action(self.nextItem, u'Preview Toolbar') def setLiveHotkeys(self, parent=None): self.previousItem.setShortcuts([QtCore.Qt.Key_Up, QtCore.Qt.Key_PageUp]) self.previousItem.setShortcutContext( QtCore.Qt.WidgetWithChildrenShortcut) - actionList.add_action(self.previousItem, u'Live Toolbar') + ActionList.add_action(self.previousItem, u'Live Toolbar') self.nextItem.setShortcuts([QtCore.Qt.Key_Down, QtCore.Qt.Key_PageDown]) self.nextItem.setShortcutContext(QtCore.Qt.WidgetWithChildrenShortcut) - actionList.add_action(self.nextItem, u'Live Toolbar') + ActionList.add_action(self.nextItem, u'Live Toolbar') self.previousService = shortcut_action(parent, translate('OpenLP.SlideController', 'Previous Service'), [QtCore.Qt.Key_Left, 0], self.servicePrevious, u'Live Toolbar') diff --git a/openlp/core/utils/actions.py b/openlp/core/utils/actions.py index 6b7df6817..e71aee672 100644 --- a/openlp/core/utils/actions.py +++ b/openlp/core/utils/actions.py @@ -183,17 +183,17 @@ class ActionList(object): has a weight by which it is sorted when iterating through the list of actions or categories. """ - def __init__(self): - self.categories = CategoryList() + categories = CategoryList() - def add_action(self, action, category, weight=None): - if category not in self.categories: - self.categories.append(category) + @staticmethod + def add_action(action, category, weight=None): + if category not in ActionList.categories: + ActionList.categories.append(category) action.defaultShortcuts = action.shortcuts() if weight is None: - self.categories[category].actions.append(action) + ActionList.categories[category].actions.append(action) else: - self.categories[category].actions.add(action, weight) + ActionList.categories[category].actions.add(action, weight) # Load the shortcut from the config. settings = QtCore.QSettings() settings.beginGroup(u'shortcuts') @@ -203,9 +203,8 @@ class ActionList(object): [QtGui.QKeySequence(shortcut) for shortcut in shortcuts]) settings.endGroup() - def remove_action(self, action, category): - if category not in self.categories: + @staticmethod + def remove_action(action, category): + if category not in ActionList.categories: return - self.categories[category].actions.remove(action) - -actionList = ActionList() + ActionList.categories[category].actions.remove(action) diff --git a/openlp/plugins/alerts/alertsplugin.py b/openlp/plugins/alerts/alertsplugin.py index a10d56a20..45e1969f4 100644 --- a/openlp/plugins/alerts/alertsplugin.py +++ b/openlp/plugins/alerts/alertsplugin.py @@ -31,7 +31,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Plugin, StringContent, build_icon, translate from openlp.core.lib.db import Manager from openlp.core.lib.ui import icon_action -from openlp.core.utils.actions import actionList +from openlp.core.utils.actions import ActionList from openlp.plugins.alerts.lib import AlertsManager, AlertsTab from openlp.plugins.alerts.lib.db import init_schema from openlp.plugins.alerts.forms import AlertForm @@ -75,7 +75,7 @@ class AlertsPlugin(Plugin): log.info(u'Alerts Initialising') Plugin.initialise(self) self.toolsAlertItem.setVisible(True) - actionList.add_action(self.toolsAlertItem, u'Tools') + ActionList.add_action(self.toolsAlertItem, u'Tools') self.liveController.alertTab = self.settings_tab def finalise(self): @@ -86,7 +86,7 @@ class AlertsPlugin(Plugin): self.manager.finalise() Plugin.finalise(self) self.toolsAlertItem.setVisible(False) - actionList.remove_action(self.toolsAlertItem, u'Tools') + ActionList.remove_action(self.toolsAlertItem, u'Tools') def toggleAlertsState(self): self.alertsActive = not self.alertsActive diff --git a/openlp/plugins/bibles/bibleplugin.py b/openlp/plugins/bibles/bibleplugin.py index 86d751e9a..1396d4550 100644 --- a/openlp/plugins/bibles/bibleplugin.py +++ b/openlp/plugins/bibles/bibleplugin.py @@ -30,7 +30,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Plugin, StringContent, build_icon, translate from openlp.core.lib.ui import base_action -from openlp.core.utils.actions import actionList +from openlp.core.utils.actions import ActionList from openlp.plugins.bibles.lib import BibleManager, BiblesTab, BibleMediaItem log = logging.getLogger(__name__) @@ -52,9 +52,9 @@ class BiblePlugin(Plugin): self.manager = BibleManager(self) Plugin.initialise(self) self.importBibleItem.setVisible(True) - actionList.add_action(self.importBibleItem, u'Import') + ActionList.add_action(self.importBibleItem, u'Import') # Do not add the action to the list yet. - #actionList.add_action(self.exportBibleItem, u'Export') + #ActionList.add_action(self.exportBibleItem, u'Export') # Set to invisible until we can export bibles self.exportBibleItem.setVisible(False) diff --git a/openlp/plugins/songs/songsplugin.py b/openlp/plugins/songs/songsplugin.py index 12462428e..de0714d5e 100644 --- a/openlp/plugins/songs/songsplugin.py +++ b/openlp/plugins/songs/songsplugin.py @@ -34,7 +34,7 @@ from openlp.core.lib import Plugin, StringContent, build_icon, translate, \ Receiver from openlp.core.lib.db import Manager from openlp.core.lib.ui import UiStrings, base_action, icon_action -from openlp.core.utils.actions import actionList +from openlp.core.utils.actions import ActionList from openlp.plugins.songs.lib import clean_song, SongMediaItem, SongsTab from openlp.plugins.songs.lib.db import init_schema, Song from openlp.plugins.songs.lib.importer import SongFormat @@ -66,9 +66,9 @@ class SongsPlugin(Plugin): log.info(u'Songs Initialising') Plugin.initialise(self) self.toolsReindexItem.setVisible(True) - actionList.add_action(self.SongImportItem, u'Import') - actionList.add_action(self.SongExportItem, u'Export') - actionList.add_action(self.toolsReindexItem, u'Tools') + ActionList.add_action(self.SongImportItem, u'Import') + ActionList.add_action(self.SongExportItem, u'Export') + ActionList.add_action(self.toolsReindexItem, u'Tools') self.mediaItem.displayResultsSong( self.manager.get_all_objects(Song, order_by_ref=Song.search_title)) @@ -258,7 +258,7 @@ class SongsPlugin(Plugin): log.info(u'Songs Finalising') self.manager.finalise() self.toolsReindexItem.setVisible(False) - actionList.remove_action(self.SongImportItem, u'Import') - actionList.remove_action(self.SongExportItem, u'Export') - actionList.remove_action(self.toolsReindexItem, u'Tools') + ActionList.remove_action(self.SongImportItem, u'Import') + ActionList.remove_action(self.SongExportItem, u'Export') + ActionList.remove_action(self.toolsReindexItem, u'Tools') Plugin.finalise(self) From 0c9b839e916e1b310be7e78e150be48f16bfdd52 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 31 Mar 2011 14:50:38 +0200 Subject: [PATCH 13/89] check if shortcut is already assigned, refreshing list, double click event, started resetting the selected action --- openlp/core/ui/shortcutlistform.py | 86 ++++++++++++++++++++++-------- 1 file changed, 63 insertions(+), 23 deletions(-) diff --git a/openlp/core/ui/shortcutlistform.py b/openlp/core/ui/shortcutlistform.py index 8ba78a876..4746ae3f7 100644 --- a/openlp/core/ui/shortcutlistform.py +++ b/openlp/core/ui/shortcutlistform.py @@ -42,9 +42,7 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): The shortcut list dialog """ #TODO: do not close on ESC -#TODO: Fix Preview/Live controller (have the same shortcut) -#TODO: double click event -#TODO: refresh self.assingedShortcuts +#TODO: Fix Preview/Live controller (have the same shortcut def __init__(self, parent=None): QtGui.QDialog.__init__(self, parent) self.setupUi(self) @@ -56,6 +54,11 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): QtCore.QObject.connect(self.treeWidget, QtCore.SIGNAL(u'itemPressed(QTreeWidgetItem*, int)'), self.onItemPressed) + QtCore.QObject.connect(self.treeWidget, + QtCore.SIGNAL(u'itemDoubleClicked(QTreeWidgetItem*, int)'), + self.onItemDoubleClicked) + QtCore.QObject.connect(self.clearShortcutButton, + QtCore.SIGNAL(u'clicked(bool)'), self.onClearShortcutButtonClicked) def keyReleaseEvent(self, event): Qt = QtCore.Qt @@ -87,34 +90,50 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): self.shortcutButton.setChecked(False) def exec_(self): - self.reloadActionList() + self.reloadShortcutList() return QtGui.QDialog.exec_(self) - def reloadActionList(self): + def reloadShortcutList(self): """ Reload the ``treeWidget`` list to add new and remove old actions. """ - self.assingedShortcuts = [] self.treeWidget.clear() for category in ActionList.categories: item = QtGui.QTreeWidgetItem([category.name]) for action in category.actions: - self.assingedShortcuts.extend(action.shortcuts()) actionText = REMOVE_AMPERSAND.sub('', unicode(action.text())) - if len(action.shortcuts()) == 2: - shortcutText = action.shortcuts()[0].toString() - alternateText = action.shortcuts()[1].toString() - else: - shortcutText = action.shortcut().toString() - alternateText = u'' - actionItem = QtGui.QTreeWidgetItem( - [actionText, shortcutText, alternateText]) + actionItem = QtGui.QTreeWidgetItem([actionText]) actionItem.setIcon(0, action.icon()) actionItem.setData(0, QtCore.Qt.UserRole, QtCore.QVariant(action)) item.addChild(actionItem) item.setExpanded(True) self.treeWidget.addTopLevelItem(item) + self.refreshShortcutList() + + def refreshShortcutList(self): + """ + This refreshes the item's shortcuts shown in the list. Note, this + neither adds new actions nor removes old actions. + """ + self.assingedShortcuts = [] + iterator = QtGui.QTreeWidgetItemIterator(self.treeWidget) + while iterator.value(): + item = iterator.value() + iterator += 1 + action = item.data(0, QtCore.Qt.UserRole).toPyObject() + if action is None: + continue + self.assingedShortcuts.extend(action.shortcuts()) + if len(action.shortcuts()) == 0: + item.setText(1, u'') + item.setText(2, u'') + elif len(action.shortcuts()) == 1: + item.setText(1, action.shortcuts()[0].toString()) + item.setText(2, u'') + else: + item.setText(1, action.shortcuts()[0].toString()) + item.setText(2, action.shortcuts()[1].toString()) def onShortcutButtonClicked(self, toggled): """ @@ -127,25 +146,30 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): if action is None: return shortcuts = [] + # We are changing the primary shortcut. if self.column == 1: - # We are changing the primary shortcut. shortcuts.append(QtGui.QKeySequence(self.shortcutButton.text())) if len(action.shortcuts()) == 2: shortcuts.append(action.shortcuts()[1]) - else: - shortcuts.append(0) - item.setText(1, self.shortcutButton.text()) + # We are changing the secondary shortcut. elif self.column == 2: - # We are changing the secondary shortcut. if len(action.shortcuts()) == 1: shortcuts.append(action.shortcuts()[0]) - else: - shortcuts.append(0) shortcuts.append(QtGui.QKeySequence(self.shortcutButton.text())) - item.setText(2, self.shortcutButton.text()) else: return action.setShortcuts(shortcuts) + self.refreshShortcutList() + + def onItemDoubleClicked(self, item, column): + """ + """ + item = self.treeWidget.currentItem() + action = item.data(0, QtCore.Qt.UserRole).toPyObject() + self.shortcutButton.setChecked(True) + if action is None or column not in [1, 2]: + self.shortcutButton.setChecked(False) + self.onItemPressed(item, column) def onItemPressed(self, item, column): """ @@ -165,6 +189,22 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): text = action.shortcuts()[1].toString() self.shortcutButton.setText(text) + def onClearShortcutButtonClicked(self, toggled): + """ + Restore the defaults of this + """ + item = self.treeWidget.currentItem() + if item is None: + return + action = item.data(0, QtCore.Qt.UserRole).toPyObject() + if action is None: + return + #FIXME: defaultShortcuts + action.setShortcuts(action.defaultShortcuts) + self.shortcutButton.setChecked(False) + self.shortcutButton.setText(u'') + self.refreshShortcutList() + def save(self): """ Save the shortcuts. **Note**, that we do not have to load the shortcuts, From b17ad266728d9032af9ae42529d6007b86a6f063 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 31 Mar 2011 20:53:50 +0200 Subject: [PATCH 14/89] make sure we save the default shortcut --- openlp/core/lib/toolbar.py | 15 ++--- openlp/core/lib/ui.py | 17 ++++- openlp/core/ui/mainwindow.py | 103 ++++++++++++------------------ openlp/core/ui/servicemanager.py | 53 +++++++-------- openlp/core/ui/slidecontroller.py | 27 ++++---- openlp/core/utils/actions.py | 2 - 6 files changed, 107 insertions(+), 110 deletions(-) diff --git a/openlp/core/lib/toolbar.py b/openlp/core/lib/toolbar.py index d5d2fa4f8..44149cd85 100644 --- a/openlp/core/lib/toolbar.py +++ b/openlp/core/lib/toolbar.py @@ -51,8 +51,7 @@ class OpenLPToolbar(QtGui.QToolBar): log.debug(u'Init done for %s' % parent.__class__.__name__) def addToolbarButton(self, title, icon, tooltip=None, slot=None, - checkable=False, shortcut=0, alternate=0, - context=QtCore.Qt.WidgetShortcut): + checkable=False, shortcuts=None, context=QtCore.Qt.WidgetShortcut): """ A method to help developers easily add a button to the toolbar. @@ -74,11 +73,8 @@ class OpenLPToolbar(QtGui.QToolBar): If *True* the button has two, *off* and *on*, states. Default is *False*, which means the buttons has only one state. - ``shortcut`` - The primary shortcut for this action - - ``alternate`` - The alternate shortcut for this action + ``shortcuts`` + The list of shortcuts for this action ``context`` Specify the context in which this shortcut is valid @@ -103,8 +99,9 @@ class OpenLPToolbar(QtGui.QToolBar): QtCore.QObject.connect(newAction, QtCore.SIGNAL(u'toggled(bool)'), slot) self.actions[title] = newAction - newAction.setShortcuts([shortcut, alternate]) - newAction.setShortcutContext(context) + if shortcuts is not None: + newAction.setShortcuts(shortcuts) + newAction.setShortcutContext(context) return newAction def addToolbarSeparator(self, handle): diff --git a/openlp/core/lib/ui.py b/openlp/core/lib/ui.py index a298d803b..c6f7dd070 100644 --- a/openlp/core/lib/ui.py +++ b/openlp/core/lib/ui.py @@ -275,13 +275,26 @@ def icon_action(parent, name, icon, checked=None, category=None): action.setIcon(build_icon(icon)) return action -def shortcut_action(parent, text, shortcuts, function, category=None): +def shortcut_action(parent, name, shortcuts, function, icon=None, checked=None, + category=None): """ Return a shortcut enabled action. """ - action = base_action(parent, text, category) + # We cannot use the base_action, icon_action and the like, as we must not + # add the action to the actionList before the shortcut has been set + # (when we add the action to the list, the default shortcut is saved, to be + # able restore the shortcut). + action = QtGui.QAction(parent) + action.setObjectName(name) + if icon is not None: + action.setIcon(build_icon(icon)) + if checked is not None: + action.setCheckable(True) + action.setChecked(checked) action.setShortcuts(shortcuts) action.setShortcutContext(QtCore.Qt.WidgetWithChildrenShortcut) + if category is not None: + ActionList.add_action(action, category) QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered()'), function) return action diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 1fdf0fd76..14bed4712 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -33,7 +33,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import RenderManager, build_icon, OpenLPDockWidget, \ SettingsManager, PluginManager, Receiver, translate from openlp.core.lib.ui import UiStrings, base_action, checkable_action, \ - icon_action + icon_action, shortcut_action from openlp.core.ui import AboutForm, SettingsForm, ServiceManager, \ ThemeManager, SlideController, PluginForm, MediaDockManager, \ ShortcutListForm, DisplayTagForm @@ -161,18 +161,32 @@ class Ui_MainWindow(object): mainWindow.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.themeManagerDock) # Create the menu items - self.FileNewItem = icon_action(mainWindow, u'FileNewItem', + self.FileNewItem = shortcut_action(mainWindow, u'FileNewItem', + [QtGui.QKeySequence(u'Ctrl+N')], + self.ServiceManagerContents.onNewServiceClicked, u':/general/general_new.png', category=u'File') - self.FileOpenItem = icon_action(mainWindow, u'FileOpenItem', + self.FileNewItem.setShortcutContext(QtCore.Qt.WindowShortcut) + self.FileOpenItem = shortcut_action(mainWindow, u'FileOpenItem', + [QtGui.QKeySequence(u'Ctrl+O')], + self.ServiceManagerContents.onLoadServiceClicked, u':/general/general_open.png', category=u'File') - self.FileSaveItem = icon_action(mainWindow, u'FileSaveItem', + self.FileOpenItem.setShortcutContext(QtCore.Qt.WindowShortcut) + self.FileSaveItem = shortcut_action(mainWindow, u'FileSaveItem', + [QtGui.QKeySequence(u'Ctrl+S')], + self.ServiceManagerContents.saveFile, u':/general/general_save.png', category=u'File') - self.FileSaveAsItem = base_action( - mainWindow, u'FileSaveAsItem', u'File') - self.printServiceOrderItem = base_action( - mainWindow, u'printServiceItem', u'File') - self.FileExitItem = icon_action(mainWindow, u'FileExitItem', + self.FileSaveItem.setShortcutContext(QtCore.Qt.WindowShortcut) + self.FileSaveAsItem = shortcut_action(mainWindow, u'FileSaveAsItem', + [QtGui.QKeySequence(u'Ctrl+Shift+S')], + self.ServiceManagerContents.saveFileAs, category=u'File') + self.FileSaveAsItem.setShortcutContext(QtCore.Qt.WindowShortcut) + self.printServiceOrderItem = shortcut_action(mainWindow, + u'printServiceItem', [QtGui.QKeySequence(u'Ctrl+P')], + self.ServiceManagerContents.printServiceOrder, category=u'File') + self.FileExitItem = shortcut_action(mainWindow, u'FileExitItem', + [QtGui.QKeySequence(u'Alt+F4')], mainWindow.close, u':/system/system_exit.png', category=u'File') + self.FileSaveAsItem.setShortcutContext(QtCore.Qt.WindowShortcut) self.ImportThemeItem = base_action( mainWindow, u'ImportThemeItem', u'Import') self.ImportLanguageItem = base_action( @@ -181,15 +195,21 @@ class Ui_MainWindow(object): mainWindow, u'ExportThemeItem', u'Export') self.ExportLanguageItem = base_action( mainWindow, u'ExportLanguageItem')#, u'Export') - self.ViewMediaManagerItem = icon_action(mainWindow, - u'ViewMediaManagerItem', u':/system/system_mediamanager.png', + self.ViewMediaManagerItem = shortcut_action(mainWindow, + u'ViewMediaManagerItem', [QtGui.QKeySequence(u'F8')], + self.toggleMediaManager, u':/system/system_mediamanager.png', self.mediaManagerDock.isVisible(), u'View') - self.ViewThemeManagerItem = icon_action(mainWindow, - u'ViewThemeManagerItem', u':/system/system_thememanager.png', + self.FileSaveAsItem.setShortcutContext(QtCore.Qt.WindowShortcut) + self.ViewThemeManagerItem = shortcut_action(mainWindow, + u'ViewThemeManagerItem', [QtGui.QKeySequence(u'F9')], + self.toggleThemeManager, u':/system/system_thememanager.png', self.themeManagerDock.isVisible(), u'View') - self.ViewServiceManagerItem = icon_action(mainWindow, - u'ViewServiceManagerItem', u':/system/system_servicemanager.png', + self.FileSaveAsItem.setShortcutContext(QtCore.Qt.WindowShortcut) + self.ViewServiceManagerItem = shortcut_action(mainWindow, + u'ViewServiceManagerItem', [QtGui.QKeySequence(u'F10')], + self.toggleServiceManager, u':/system/system_servicemanager.png', self.serviceManagerDock.isVisible(), u'View') + self.FileSaveAsItem.setShortcutContext(QtCore.Qt.WindowShortcut) self.ViewPreviewPanel = checkable_action(mainWindow, u'ViewPreviewPanel', previewVisible, u'View') self.ViewLivePanel = checkable_action( @@ -278,8 +298,6 @@ class Ui_MainWindow(object): # Connect up some signals and slots QtCore.QObject.connect(self.FileMenu, QtCore.SIGNAL(u'aboutToShow()'), self.updateFileMenu) - QtCore.QObject.connect(self.FileExitItem, - QtCore.SIGNAL(u'triggered()'), mainWindow.close) QtCore.QMetaObject.connectSlotsByName(mainWindow) # Hide the entry, as it does not have any functionality yet. self.ToolsAddToolItem.setVisible(False) @@ -312,36 +330,27 @@ class Ui_MainWindow(object): self.FileNewItem.setText(translate('OpenLP.MainWindow', '&New')) self.FileNewItem.setToolTip(UiStrings.NewService) self.FileNewItem.setStatusTip(UiStrings.CreateService) - self.FileNewItem.setShortcut(translate('OpenLP.MainWindow', 'Ctrl+N')) self.FileOpenItem.setText(translate('OpenLP.MainWindow', '&Open')) self.FileOpenItem.setToolTip(UiStrings.OpenService) self.FileOpenItem.setStatusTip( translate('OpenLP.MainWindow', 'Open an existing service.')) - self.FileOpenItem.setShortcut(translate('OpenLP.MainWindow', 'Ctrl+O')) self.FileSaveItem.setText(translate('OpenLP.MainWindow', '&Save')) self.FileSaveItem.setToolTip(UiStrings.SaveService) self.FileSaveItem.setStatusTip( translate('OpenLP.MainWindow', 'Save the current service to disk.')) - self.FileSaveItem.setShortcut(translate('OpenLP.MainWindow', 'Ctrl+S')) self.FileSaveAsItem.setText( translate('OpenLP.MainWindow', 'Save &As...')) self.FileSaveAsItem.setToolTip( translate('OpenLP.MainWindow', 'Save Service As')) self.FileSaveAsItem.setStatusTip(translate('OpenLP.MainWindow', 'Save the current service under a new name.')) - self.FileSaveAsItem.setShortcut( - translate('OpenLP.MainWindow', 'Ctrl+Shift+S')) self.printServiceOrderItem.setText(UiStrings.PrintServiceOrder) self.printServiceOrderItem.setStatusTip(translate('OpenLP.MainWindow', 'Print the current Service Order.')) - self.printServiceOrderItem.setShortcut( - translate('OpenLP.MainWindow', 'Ctrl+P')) self.FileExitItem.setText( translate('OpenLP.MainWindow', 'E&xit')) self.FileExitItem.setStatusTip( translate('OpenLP.MainWindow', 'Quit OpenLP')) - self.FileExitItem.setShortcut( - translate('OpenLP.MainWindow', 'Alt+F4')) self.ImportThemeItem.setText( translate('OpenLP.MainWindow', '&Theme')) self.ImportLanguageItem.setText( @@ -362,24 +371,18 @@ class Ui_MainWindow(object): translate('OpenLP.MainWindow', 'Toggle Media Manager')) self.ViewMediaManagerItem.setStatusTip(translate('OpenLP.MainWindow', 'Toggle the visibility of the media manager.')) - self.ViewMediaManagerItem.setShortcut( - translate('OpenLP.MainWindow', 'F8')) self.ViewThemeManagerItem.setText( translate('OpenLP.MainWindow', '&Theme Manager')) self.ViewThemeManagerItem.setToolTip( translate('OpenLP.MainWindow', 'Toggle Theme Manager')) self.ViewThemeManagerItem.setStatusTip(translate('OpenLP.MainWindow', 'Toggle the visibility of the theme manager.')) - self.ViewThemeManagerItem.setShortcut( - translate('OpenLP.MainWindow', 'F10')) self.ViewServiceManagerItem.setText( translate('OpenLP.MainWindow', '&Service Manager')) self.ViewServiceManagerItem.setToolTip( translate('OpenLP.MainWindow', 'Toggle Service Manager')) self.ViewServiceManagerItem.setStatusTip(translate('OpenLP.MainWindow', 'Toggle the visibility of the service manager.')) - self.ViewServiceManagerItem.setShortcut( - translate('OpenLP.MainWindow', 'F9')) self.ViewPreviewPanel.setText( translate('OpenLP.MainWindow', '&Preview Panel')) self.ViewPreviewPanel.setToolTip( @@ -409,6 +412,7 @@ class Ui_MainWindow(object): translate('OpenLP.MainWindow', 'More information about OpenLP')) self.HelpAboutItem.setShortcut( translate('OpenLP.MainWindow', 'Ctrl+F1')) + print self.HelpAboutItem.shortcuts() self.HelpOnlineHelpItem.setText( translate('OpenLP.MainWindow', '&Online Help')) # Uncomment after 1.9.5 beta string freeze @@ -490,12 +494,6 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): QtCore.QObject.connect(self.ExportThemeItem, QtCore.SIGNAL(u'triggered()'), self.themeManagerContents.onExportTheme) - QtCore.QObject.connect(self.ViewMediaManagerItem, - QtCore.SIGNAL(u'triggered(bool)'), self.toggleMediaManager) - QtCore.QObject.connect(self.ViewServiceManagerItem, - QtCore.SIGNAL(u'triggered(bool)'), self.toggleServiceManager) - QtCore.QObject.connect(self.ViewThemeManagerItem, - QtCore.SIGNAL(u'triggered(bool)'), self.toggleThemeManager) QtCore.QObject.connect(self.ViewPreviewPanel, QtCore.SIGNAL(u'toggled(bool)'), self.setPreviewPanelVisibility) QtCore.QObject.connect(self.ViewLivePanel, @@ -525,20 +523,6 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): QtCore.SIGNAL(u'triggered()'), self.onSettingsConfigureItemClicked) QtCore.QObject.connect(self.SettingsShortcutsItem, QtCore.SIGNAL(u'triggered()'), self.onSettingsShortcutsItemClicked) - QtCore.QObject.connect(self.FileNewItem, QtCore.SIGNAL(u'triggered()'), - self.ServiceManagerContents.onNewServiceClicked) - QtCore.QObject.connect(self.FileOpenItem, - QtCore.SIGNAL(u'triggered()'), - self.ServiceManagerContents.onLoadServiceClicked) - QtCore.QObject.connect(self.FileSaveItem, - QtCore.SIGNAL(u'triggered()'), - self.ServiceManagerContents.saveFile) - QtCore.QObject.connect(self.FileSaveAsItem, - QtCore.SIGNAL(u'triggered()'), - self.ServiceManagerContents.saveFileAs) - QtCore.QObject.connect(self.printServiceOrderItem, - QtCore.SIGNAL(u'triggered()'), - self.ServiceManagerContents.printServiceOrder) # i18n set signals for languages self.LanguageGroup.triggered.connect(LanguageManager.set_language) QtCore.QObject.connect(self.ModeDefaultItem, @@ -909,17 +893,14 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): unicode(translate('OpenLP.MainWindow', 'Default Theme: %s')) % theme) - def toggleMediaManager(self, visible): - if self.mediaManagerDock.isVisible() != visible: - self.mediaManagerDock.setVisible(visible) + def toggleMediaManager(self): + self.mediaManagerDock.setVisible(not self.mediaManagerDock.isVisible()) - def toggleServiceManager(self, visible): - if self.serviceManagerDock.isVisible() != visible: - self.serviceManagerDock.setVisible(visible) + def toggleServiceManager(self): + self.serviceManagerDock.setVisible(not self.serviceManagerDock.isVisible()) - def toggleThemeManager(self, visible): - if self.themeManagerDock.isVisible() != visible: - self.themeManagerDock.setVisible(visible) + def toggleThemeManager(self): + self.themeManagerDock.setVisible(not self.themeManagerDock.isVisible()) def setPreviewPanelVisibility(self, visible): """ diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 4bdd647ed..3ed477485 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -165,38 +165,50 @@ class ServiceManager(QtGui.QWidget): u':/services/service_top.png', translate('OpenLP.ServiceManager', 'Move item to the top of the service.'), - self.onServiceTop, shortcut=QtCore.Qt.Key_Home) + self.onServiceTop, shortcuts=[QtCore.Qt.Key_Home]) + self.serviceManagerList.moveTop.setObjectName(u'moveTop') + ActionList.add_action(self.serviceManagerList.moveTop, u'Service') self.serviceManagerList.moveUp = self.orderToolbar.addToolbarButton( translate('OpenLP.ServiceManager', 'Move &up'), u':/services/service_up.png', translate('OpenLP.ServiceManager', 'Move item up one position in the service.'), - self.onServiceUp, shortcut=QtCore.Qt.Key_PageUp) + self.onServiceUp, shortcuts=[QtCore.Qt.Key_PageUp]) + self.serviceManagerList.moveUp.setObjectName(u'moveUp') + ActionList.add_action(self.serviceManagerList.moveUp, u'Service') self.serviceManagerList.moveDown = self.orderToolbar.addToolbarButton( translate('OpenLP.ServiceManager', 'Move &down'), u':/services/service_down.png', translate('OpenLP.ServiceManager', 'Move item down one position in the service.'), - self.onServiceDown, shortcut=QtCore.Qt.Key_PageDown) + self.onServiceDown, shortcuts=[QtCore.Qt.Key_PageDown]) + self.serviceManagerList.moveDown.setObjectName(u'moveDown') + ActionList.add_action(self.serviceManagerList.moveDown, u'Service') self.serviceManagerList.moveBottom = self.orderToolbar.addToolbarButton( translate('OpenLP.ServiceManager', 'Move to &bottom'), u':/services/service_bottom.png', translate('OpenLP.ServiceManager', 'Move item to the end of the service.'), - self.onServiceEnd, shortcut=QtCore.Qt.Key_End) + self.onServiceEnd, shortcuts=[QtCore.Qt.Key_End]) + self.serviceManagerList.moveBottom.setObjectName(u'moveBottom') + ActionList.add_action(self.serviceManagerList.moveBottom, u'Service') self.serviceManagerList.down = self.orderToolbar.addToolbarButton( translate('OpenLP.ServiceManager', 'Move &down'), None, translate('OpenLP.ServiceManager', 'Moves the selection down the window.'), - self.onMoveSelectionDown, shortcut=QtCore.Qt.Key_Down) + self.onMoveSelectionDown, shortcuts=[QtCore.Qt.Key_Down]) + self.serviceManagerList.down.setObjectName(u'down') + ActionList.add_action(self.serviceManagerList.down, u'Service') self.serviceManagerList.down.setVisible(False) self.serviceManagerList.up = self.orderToolbar.addToolbarButton( translate('OpenLP.ServiceManager', 'Move up'), None, translate('OpenLP.ServiceManager', 'Moves the selection up the window.'), - self.onMoveSelectionUp, shortcut=QtCore.Qt.Key_Up) + self.onMoveSelectionUp, shortcuts=[QtCore.Qt.Key_Up]) + self.serviceManagerList.up.setObjectName(u'up') + ActionList.add_action(self.serviceManagerList.up, u'Service') self.serviceManagerList.up.setVisible(False) self.orderToolbar.addSeparator() self.serviceManagerList.delete = self.orderToolbar.addToolbarButton( @@ -211,22 +223,26 @@ class ServiceManager(QtGui.QWidget): u':/services/service_expand_all.png', translate('OpenLP.ServiceManager', 'Expand all the service items.'), - self.onExpandAll, shortcut=QtCore.Qt.Key_Plus) + self.onExpandAll, shortcuts=[QtCore.Qt.Key_Plus]) + self.serviceManagerList.expand.setObjectName(u'expand') + ActionList.add_action(self.serviceManagerList.expand, u'Service') self.serviceManagerList.collapse = self.orderToolbar.addToolbarButton( translate('OpenLP.ServiceManager', '&Collapse all'), u':/services/service_collapse_all.png', translate('OpenLP.ServiceManager', 'Collapse all the service items.'), - self.onCollapseAll, shortcut=QtCore.Qt.Key_Minus) + self.onCollapseAll, shortcuts=[QtCore.Qt.Key_Minus]) + self.serviceManagerList.collapse.setObjectName(u'collapse') + ActionList.add_action(self.serviceManagerList.collapse, u'Service') self.orderToolbar.addSeparator() self.serviceManagerList.makeLive = self.orderToolbar.addToolbarButton( translate('OpenLP.ServiceManager', 'Go Live'), u':/general/general_live.png', translate('OpenLP.ServiceManager', - 'Send the selected item to Live.'), - self.makeLive, shortcut=QtCore.Qt.Key_Enter, - alternate=QtCore.Qt.Key_Return) - self.orderToolbar.setObjectName(u'orderToolbar') + 'Send the selected item to Live.'), self.makeLive, + shortcuts=[QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return]) + self.serviceManagerList.makeLive.setObjectName(u'orderToolbar') + ActionList.add_action(self.serviceManagerList.makeLive, u'Service') self.layout.addWidget(self.orderToolbar) # Connect up our signals and slots QtCore.QObject.connect(self.themeComboBox, @@ -301,7 +317,6 @@ class ServiceManager(QtGui.QWidget): self.themeMenu = QtGui.QMenu( translate('OpenLP.ServiceManager', '&Change Item Theme')) self.menu.addMenu(self.themeMenu) - self.setServiceHotkeys() self.serviceManagerList.addActions( [self.serviceManagerList.moveDown, self.serviceManagerList.moveUp, @@ -315,18 +330,6 @@ class ServiceManager(QtGui.QWidget): ]) self.configUpdated() - def setServiceHotkeys(self): - ActionList.add_action(self.serviceManagerList.moveDown, u'Service') - ActionList.add_action(self.serviceManagerList.moveUp, u'Service') - ActionList.add_action(self.serviceManagerList.moveTop, u'Service') - ActionList.add_action(self.serviceManagerList.moveBottom, u'Service') - ActionList.add_action(self.serviceManagerList.makeLive, u'Service') - ActionList.add_action(self.serviceManagerList.up, u'Service') - ActionList.add_action(self.serviceManagerList.down, u'Service') - ActionList.add_action(self.serviceManagerList.expand, u'Service') - ActionList.add_action(self.serviceManagerList.collapse, u'Service') - - def setModified(self, modified=True): """ Setter for property "modified". Sets whether or not the current service diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index bc478463c..e9d748ad5 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -142,11 +142,13 @@ class SlideController(QtGui.QWidget): u':/slides/slide_previous.png', translate('OpenLP.SlideController', 'Move to previous'), self.onSlideSelectedPrevious) + self.previousItem.setObjectName(u'previousItem') self.nextItem = self.toolbar.addToolbarButton( translate('OpenLP.SlideController', 'Next Slide'), u':/slides/slide_next.png', translate('OpenLP.SlideController', 'Move to next'), self.onSlideSelectedNext) + self.nextItem.setObjectName(u'nextItem') self.toolbar.addToolbarSeparator(u'Close Separator') if self.isLive: self.hideMenu = QtGui.QToolButton(self.toolbar) @@ -363,9 +365,9 @@ class SlideController(QtGui.QWidget): QtCore.SIGNAL(u'config_screen_changed'), self.screenSizeChanged) def setPreviewHotkeys(self, parent=None): - self.previousItem.setShortcuts([QtCore.Qt.Key_Up, 0]) + self.previousItem.setShortcuts([QtCore.Qt.Key_Up]) ActionList.add_action(self.previousItem, u'Preview Toolbar') - self.nextItem.setShortcuts([QtCore.Qt.Key_Down, 0]) + self.nextItem.setShortcuts([QtCore.Qt.Key_Down]) ActionList.add_action(self.nextItem, u'Preview Toolbar') def setLiveHotkeys(self, parent=None): @@ -376,15 +378,18 @@ class SlideController(QtGui.QWidget): self.nextItem.setShortcuts([QtCore.Qt.Key_Down, QtCore.Qt.Key_PageDown]) self.nextItem.setShortcutContext(QtCore.Qt.WidgetWithChildrenShortcut) ActionList.add_action(self.nextItem, u'Live Toolbar') - self.previousService = shortcut_action(parent, - translate('OpenLP.SlideController', 'Previous Service'), - [QtCore.Qt.Key_Left, 0], self.servicePrevious, u'Live Toolbar') - self.nextService = shortcut_action(parent, - translate('OpenLP.SlideController', 'Next Service'), - [QtCore.Qt.Key_Right, 0], self.serviceNext, u'Live Toolbar') - self.escapeItem = shortcut_action(parent, - translate('OpenLP.SlideController', 'Escape Item'), - [QtCore.Qt.Key_Escape, 0], self.liveEscape, u'Live Toolbar') + self.previousService = shortcut_action(parent, u'previousService', + [QtCore.Qt.Key_Left], self.servicePrevious, u'Live Toolbar') + self.previousService.setText( + translate('OpenLP.SlideController', 'Previous Service')) + self.nextService = shortcut_action(parent, 'nextService', + [QtCore.Qt.Key_Right], self.serviceNext, u'Live Toolbar') + self.nextService.setText( + translate('OpenLP.SlideController', 'Next Service')) + self.escapeItem = shortcut_action(parent, 'escapeItem', + [QtCore.Qt.Key_Escape], self.liveEscape, u'Live Toolbar') + self.escapeItem.setText( + translate('OpenLP.SlideController', 'Escape Item')) def liveEscape(self): self.display.setVisible(False) diff --git a/openlp/core/utils/actions.py b/openlp/core/utils/actions.py index e71aee672..34bc72173 100644 --- a/openlp/core/utils/actions.py +++ b/openlp/core/utils/actions.py @@ -29,8 +29,6 @@ by the shortcuts system. """ from PyQt4 import QtCore, QtGui -from openlp.core.lib import translate - class ActionCategory(object): """ The :class:`~openlp.core.utils.ActionCategory` class encapsulates a From df4de23df09486908a5daf69b454f48be0fe3395 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 1 Apr 2011 16:28:25 +0200 Subject: [PATCH 15/89] Added Theme, Blank, Desktop shortcuts, further clean ups Fixes: https://launchpad.net/bugs/739779 --- openlp/core/lib/searchedit.py | 3 +- openlp/core/lib/ui.py | 22 ++++---- openlp/core/ui/mainwindow.py | 59 ++++++++------------- openlp/core/ui/shortcutlistform.py | 47 +++++++++++----- openlp/core/ui/slidecontroller.py | 39 ++++++++------ openlp/core/utils/actions.py | 8 +++ openlp/plugins/songusage/songusageplugin.py | 30 +++++------ 7 files changed, 113 insertions(+), 95 deletions(-) diff --git a/openlp/core/lib/searchedit.py b/openlp/core/lib/searchedit.py index 4841d76dc..41699256f 100644 --- a/openlp/core/lib/searchedit.py +++ b/openlp/core/lib/searchedit.py @@ -29,6 +29,7 @@ import logging from PyQt4 import QtCore, QtGui from openlp.core.lib import build_icon +from openlp.core.lib.ui import icon_action log = logging.getLogger(__name__) @@ -132,7 +133,7 @@ class SearchEdit(QtGui.QLineEdit): menu = QtGui.QMenu(self) first = None for identifier, icon, title in items: - action = QtGui.QAction(build_icon(icon), title, menu) + action = icon_action(menu, title, icon) action.setData(QtCore.QVariant(identifier)) menu.addAction(action) QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered(bool)'), diff --git a/openlp/core/lib/ui.py b/openlp/core/lib/ui.py index c6f7dd070..a02041cad 100644 --- a/openlp/core/lib/ui.py +++ b/openlp/core/lib/ui.py @@ -280,21 +280,17 @@ def shortcut_action(parent, name, shortcuts, function, icon=None, checked=None, """ Return a shortcut enabled action. """ - # We cannot use the base_action, icon_action and the like, as we must not - # add the action to the actionList before the shortcut has been set - # (when we add the action to the list, the default shortcut is saved, to be - # able restore the shortcut). - action = QtGui.QAction(parent) - action.setObjectName(name) if icon is not None: - action.setIcon(build_icon(icon)) - if checked is not None: - action.setCheckable(True) - action.setChecked(checked) + action = icon_action(parent, name, icon, checked, category) + elif checked is not None: + action = checkable_action(parent, name, checked, category) + else: + action = base_action(parent, name, category) action.setShortcuts(shortcuts) - action.setShortcutContext(QtCore.Qt.WidgetWithChildrenShortcut) - if category is not None: - ActionList.add_action(action, category) + action.setShortcutContext(QtCore.Qt.WindowShortcut) + # We have to save the default shortcut again, as the action's shortcut was + # set after adding the shortcut to the action list. + action.defaultShortcuts = action.shortcuts() QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered()'), function) return action diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 14bed4712..458e8814f 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -165,28 +165,23 @@ class Ui_MainWindow(object): [QtGui.QKeySequence(u'Ctrl+N')], self.ServiceManagerContents.onNewServiceClicked, u':/general/general_new.png', category=u'File') - self.FileNewItem.setShortcutContext(QtCore.Qt.WindowShortcut) self.FileOpenItem = shortcut_action(mainWindow, u'FileOpenItem', [QtGui.QKeySequence(u'Ctrl+O')], self.ServiceManagerContents.onLoadServiceClicked, u':/general/general_open.png', category=u'File') - self.FileOpenItem.setShortcutContext(QtCore.Qt.WindowShortcut) self.FileSaveItem = shortcut_action(mainWindow, u'FileSaveItem', [QtGui.QKeySequence(u'Ctrl+S')], self.ServiceManagerContents.saveFile, u':/general/general_save.png', category=u'File') - self.FileSaveItem.setShortcutContext(QtCore.Qt.WindowShortcut) self.FileSaveAsItem = shortcut_action(mainWindow, u'FileSaveAsItem', [QtGui.QKeySequence(u'Ctrl+Shift+S')], self.ServiceManagerContents.saveFileAs, category=u'File') - self.FileSaveAsItem.setShortcutContext(QtCore.Qt.WindowShortcut) self.printServiceOrderItem = shortcut_action(mainWindow, u'printServiceItem', [QtGui.QKeySequence(u'Ctrl+P')], self.ServiceManagerContents.printServiceOrder, category=u'File') self.FileExitItem = shortcut_action(mainWindow, u'FileExitItem', [QtGui.QKeySequence(u'Alt+F4')], mainWindow.close, u':/system/system_exit.png', category=u'File') - self.FileSaveAsItem.setShortcutContext(QtCore.Qt.WindowShortcut) self.ImportThemeItem = base_action( mainWindow, u'ImportThemeItem', u'Import') self.ImportLanguageItem = base_action( @@ -199,21 +194,20 @@ class Ui_MainWindow(object): u'ViewMediaManagerItem', [QtGui.QKeySequence(u'F8')], self.toggleMediaManager, u':/system/system_mediamanager.png', self.mediaManagerDock.isVisible(), u'View') - self.FileSaveAsItem.setShortcutContext(QtCore.Qt.WindowShortcut) self.ViewThemeManagerItem = shortcut_action(mainWindow, - u'ViewThemeManagerItem', [QtGui.QKeySequence(u'F9')], + u'ViewThemeManagerItem', [QtGui.QKeySequence(u'F10')], self.toggleThemeManager, u':/system/system_thememanager.png', self.themeManagerDock.isVisible(), u'View') - self.FileSaveAsItem.setShortcutContext(QtCore.Qt.WindowShortcut) self.ViewServiceManagerItem = shortcut_action(mainWindow, - u'ViewServiceManagerItem', [QtGui.QKeySequence(u'F10')], + u'ViewServiceManagerItem', [QtGui.QKeySequence(u'F9')], self.toggleServiceManager, u':/system/system_servicemanager.png', self.serviceManagerDock.isVisible(), u'View') - self.FileSaveAsItem.setShortcutContext(QtCore.Qt.WindowShortcut) - self.ViewPreviewPanel = checkable_action(mainWindow, - u'ViewPreviewPanel', previewVisible, u'View') - self.ViewLivePanel = checkable_action( - mainWindow, u'ViewLivePanel', liveVisible, u'View') + self.ViewPreviewPanel = shortcut_action(mainWindow, + u'ViewPreviewPanel', [QtGui.QKeySequence(u'F11')], + self.setPreviewPanelVisibility, checked=previewVisible, category=u'View') + self.ViewLivePanel = shortcut_action(mainWindow, u'ViewLivePanel', + [QtGui.QKeySequence(u'F12')], self.setLivePanelVisibility, + checked=liveVisible, category=u'View') self.ModeDefaultItem = checkable_action( mainWindow, u'ModeDefaultItem', category=u'View Mode') self.ModeSetupItem = checkable_action( @@ -229,8 +223,9 @@ class Ui_MainWindow(object): u':/tools/tools_add.png', category=u'Tools') self.ToolsOpenDataFolder = icon_action(mainWindow, u'ToolsOpenDataFolder', u':/general/general_open.png', category=u'Tools') - self.settingsPluginListItem = icon_action(mainWindow, - u'settingsPluginListItem', u':/system/settings_plugin_list.png', + self.settingsPluginListItem = shortcut_action(mainWindow, + u'settingsPluginListItem', [QtGui.QKeySequence(u'Alt+F7')], + self.onPluginItemClicked, u':/system/settings_plugin_list.png', category=u'Settings') # i18n Language Items self.AutoLanguageItem = checkable_action(mainWindow, @@ -257,7 +252,8 @@ class Ui_MainWindow(object): u'HelpDocumentationItem', u':/system/system_help_contents.png', category=None)#u'Help') self.HelpDocumentationItem.setEnabled(False) - self.HelpAboutItem = icon_action(mainWindow, u'HelpAboutItem', + self.HelpAboutItem = shortcut_action(mainWindow, u'HelpAboutItem', + [QtGui.QKeySequence(u'Ctrl+F1')], self.onHelpAboutItemClicked, u':/system/system_about.png', category=u'Help') self.HelpOnlineHelpItem = base_action( mainWindow, u'HelpOnlineHelpItem', category=u'Help') @@ -389,30 +385,21 @@ class Ui_MainWindow(object): translate('OpenLP.MainWindow', 'Toggle Preview Panel')) self.ViewPreviewPanel.setStatusTip(translate('OpenLP.MainWindow', 'Toggle the visibility of the preview panel.')) - self.ViewPreviewPanel.setShortcut( - translate('OpenLP.MainWindow', 'F11')) self.ViewLivePanel.setText( translate('OpenLP.MainWindow', '&Live Panel')) self.ViewLivePanel.setToolTip( translate('OpenLP.MainWindow', 'Toggle Live Panel')) self.ViewLivePanel.setStatusTip(translate('OpenLP.MainWindow', 'Toggle the visibility of the live panel.')) - self.ViewLivePanel.setShortcut( - translate('OpenLP.MainWindow', 'F12')) self.settingsPluginListItem.setText(translate('OpenLP.MainWindow', '&Plugin List')) self.settingsPluginListItem.setStatusTip( translate('OpenLP.MainWindow', 'List the Plugins')) - self.settingsPluginListItem.setShortcut( - translate('OpenLP.MainWindow', 'Alt+F7')) self.HelpDocumentationItem.setText( translate('OpenLP.MainWindow', '&User Guide')) self.HelpAboutItem.setText(translate('OpenLP.MainWindow', '&About')) self.HelpAboutItem.setStatusTip( translate('OpenLP.MainWindow', 'More information about OpenLP')) - self.HelpAboutItem.setShortcut( - translate('OpenLP.MainWindow', 'Ctrl+F1')) - print self.HelpAboutItem.shortcuts() self.HelpOnlineHelpItem.setText( translate('OpenLP.MainWindow', '&Online Help')) # Uncomment after 1.9.5 beta string freeze @@ -494,10 +481,6 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): QtCore.QObject.connect(self.ExportThemeItem, QtCore.SIGNAL(u'triggered()'), self.themeManagerContents.onExportTheme) - QtCore.QObject.connect(self.ViewPreviewPanel, - QtCore.SIGNAL(u'toggled(bool)'), self.setPreviewPanelVisibility) - QtCore.QObject.connect(self.ViewLivePanel, - QtCore.SIGNAL(u'toggled(bool)'), self.setLivePanelVisibility) QtCore.QObject.connect(self.mediaManagerDock, QtCore.SIGNAL(u'visibilityChanged(bool)'), self.ViewMediaManagerItem.setChecked) @@ -511,12 +494,8 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): QtCore.SIGNAL(u'triggered()'), self.onHelpWebSiteClicked) QtCore.QObject.connect(self.HelpOnlineHelpItem, QtCore.SIGNAL(u'triggered()'), self.onHelpOnLineHelpClicked) - QtCore.QObject.connect(self.HelpAboutItem, - QtCore.SIGNAL(u'triggered()'), self.onHelpAboutItemClicked) QtCore.QObject.connect(self.ToolsOpenDataFolder, QtCore.SIGNAL(u'triggered()'), self.onToolsOpenDataFolderClicked) - QtCore.QObject.connect(self.settingsPluginListItem, - QtCore.SIGNAL(u'triggered()'), self.onPluginItemClicked) QtCore.QObject.connect(self.DisplayTagItem, QtCore.SIGNAL(u'triggered()'), self.onDisplayTagItemClicked) QtCore.QObject.connect(self.SettingsConfigureItem, @@ -902,7 +881,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): def toggleThemeManager(self): self.themeManagerDock.setVisible(not self.themeManagerDock.isVisible()) - def setPreviewPanelVisibility(self, visible): + def setPreviewPanelVisibility(self, visible=None): """ Sets the visibility of the preview panel including saving the setting and updating the menu. @@ -912,12 +891,14 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): True - Visible False - Hidden """ + if visible is None: + visible = self.ViewPreviewPanel.isVisible() self.previewController.panel.setVisible(visible) QtCore.QSettings().setValue(u'user interface/preview panel', QtCore.QVariant(visible)) self.ViewPreviewPanel.setChecked(visible) - def setLivePanelVisibility(self, visible): + def setLivePanelVisibility(self, visible=None): """ Sets the visibility of the live panel including saving the setting and updating the menu. @@ -927,6 +908,8 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): True - Visible False - Hidden """ + if visible is None: + visible = self.ViewLivePanel.isVisible() self.liveController.panel.setVisible(visible) QtCore.QSettings().setValue(u'user interface/live panel', QtCore.QVariant(visible)) @@ -984,8 +967,8 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): self.FileMenu.addSeparator() for fileId, filename in enumerate(recentFilesToDisplay): log.debug('Recent file name: %s', filename) - action = QtGui.QAction(u'&%d %s' % (fileId + 1, - QtCore.QFileInfo(filename).fileName()), self) + action = base_action(self, u'&%d %s' % (fileId + 1, + QtCore.QFileInfo(filename).fileName())) action.setData(QtCore.QVariant(filename)) self.connect(action, QtCore.SIGNAL(u'triggered()'), self.ServiceManagerContents.onRecentServiceClicked) diff --git a/openlp/core/ui/shortcutlistform.py b/openlp/core/ui/shortcutlistform.py index 4746ae3f7..e350009cd 100644 --- a/openlp/core/ui/shortcutlistform.py +++ b/openlp/core/ui/shortcutlistform.py @@ -42,13 +42,13 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): The shortcut list dialog """ #TODO: do not close on ESC -#TODO: Fix Preview/Live controller (have the same shortcut +#TODO: Fix Preview/Live controller (have the same shortcut) def __init__(self, parent=None): QtGui.QDialog.__init__(self, parent) self.setupUi(self) - self.assingedShortcuts = [] self.column = -1 self.shortcutButton.setText(u'') + self.shortcutButton.setEnabled(False) QtCore.QObject.connect(self.shortcutButton, QtCore.SIGNAL(u'toggled(bool)'), self.onShortcutButtonClicked) QtCore.QObject.connect(self.treeWidget, @@ -76,7 +76,27 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): if event.modifiers() & Qt.ShiftModifier == Qt.ShiftModifier: key_string = u'Shift+' + key_string key_sequence = QtGui.QKeySequence(key_string) - if key_sequence in self.assingedShortcuts: + # The item/action we are attempting to change. + changing_item = self.treeWidget.currentItem() + changing_action = changing_item.data(0, QtCore.Qt.UserRole).toPyObject() + shortcut_valid = True + for category in ActionList.categories: + for action in category.actions: + shortcuts = action.shortcuts() + if key_sequence not in shortcuts: + continue + if action is changing_action: + continue + # Have the same parentWidget, thus they cannot have the same + # shortcut. + #TODO: Does not fully work right now. + if action.parentWidget() is changing_action.parentWidget(): + shortcut_valid = False + if action.shortcutContext() == QtCore.Qt.WindowShortcut: + shortcut_valid = False + if changing_action.shortcutContext() == QtCore.Qt.WindowShortcut: + shortcut_valid = False + if not shortcut_valid: QtGui.QMessageBox.warning(self, translate('OpenLP.ShortcutListDialog', 'Duplicate Shortcut'), unicode(translate('OpenLP.ShortcutListDialog', 'The shortcut ' @@ -91,6 +111,9 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): def exec_(self): self.reloadShortcutList() + self.shortcutButton.setChecked(False) + self.shortcutButton.setEnabled(False) + self.shortcutButton.setText(u'') return QtGui.QDialog.exec_(self) def reloadShortcutList(self): @@ -116,7 +139,6 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): This refreshes the item's shortcuts shown in the list. Note, this neither adds new actions nor removes old actions. """ - self.assingedShortcuts = [] iterator = QtGui.QTreeWidgetItemIterator(self.treeWidget) while iterator.value(): item = iterator.value() @@ -124,7 +146,6 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): action = item.data(0, QtCore.Qt.UserRole).toPyObject() if action is None: continue - self.assingedShortcuts.extend(action.shortcuts()) if len(action.shortcuts()) == 0: item.setText(1, u'') item.setText(2, u'') @@ -142,6 +163,8 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): if toggled: return item = self.treeWidget.currentItem() + if item is None: + return action = item.data(0, QtCore.Qt.UserRole).toPyObject() if action is None: return @@ -163,12 +186,13 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): def onItemDoubleClicked(self, item, column): """ + A item has been double clicked. ``The shortcutButton`` will be checked + and the item's shortcut will be displayed. """ - item = self.treeWidget.currentItem() action = item.data(0, QtCore.Qt.UserRole).toPyObject() + if action is None: + return self.shortcutButton.setChecked(True) - if action is None or column not in [1, 2]: - self.shortcutButton.setChecked(False) self.onItemPressed(item, column) def onItemPressed(self, item, column): @@ -177,11 +201,11 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): shortcut which is encapsulate in the item. """ self.column = column - item = self.treeWidget.currentItem() action = item.data(0, QtCore.Qt.UserRole).toPyObject() self.shortcutButton.setEnabled(True) text = u'' if action is None or column not in [1, 2]: + self.shortcutButton.setChecked(False) self.shortcutButton.setEnabled(False) elif column == 1 and len(action.shortcuts()) != 0: text = action.shortcuts()[0].toString() @@ -194,16 +218,15 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): Restore the defaults of this """ item = self.treeWidget.currentItem() + self.shortcutButton.setChecked(False) if item is None: return action = item.data(0, QtCore.Qt.UserRole).toPyObject() if action is None: return - #FIXME: defaultShortcuts action.setShortcuts(action.defaultShortcuts) - self.shortcutButton.setChecked(False) - self.shortcutButton.setText(u'') self.refreshShortcutList() + self.onItemPressed(item, self.column) def save(self): """ diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index e9d748ad5..750ada7cd 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -157,16 +157,20 @@ class SlideController(QtGui.QWidget): self.toolbar.addToolbarWidget(u'Hide Menu', self.hideMenu) self.hideMenu.setMenu(QtGui.QMenu( translate('OpenLP.SlideController', 'Hide'), self.toolbar)) - self.blankScreen = icon_action(self.hideMenu, u'Blank Screen', + self.blankScreen = shortcut_action(self.hideMenu, u'blankScreen', + [QtCore.Qt.Key_Period], self.onBlankDisplay, u':/slides/slide_blank.png', False, u'Live Toolbar') self.blankScreen.setText( translate('OpenLP.SlideController', 'Blank Screen')) - self.themeScreen = icon_action(self.hideMenu, u'Blank Theme', + self.themeScreen = shortcut_action(self.hideMenu, u'themeScreen', + [QtGui.QKeySequence(u'T')], self.onThemeDisplay, u':/slides/slide_theme.png', False, u'Live Toolbar') self.themeScreen.setText( translate('OpenLP.SlideController', 'Blank to Theme')) - self.desktopScreen = icon_action(self.hideMenu, u'Desktop Screen', - u':/slides/slide_desktop.png', False, u'Live Toolbar') + self.desktopScreen = shortcut_action(self.hideMenu, + u'desktopScreen', [QtGui.QKeySequence(u'D')], + self.onHideDisplay, u':/slides/slide_desktop.png', False, + u'Live Toolbar') self.desktopScreen.setText( translate('OpenLP.SlideController', 'Show Desktop')) self.hideMenu.setDefaultAction(self.blankScreen) @@ -294,12 +298,6 @@ class SlideController(QtGui.QWidget): QtCore.QObject.connect(self.previewListWidget, QtCore.SIGNAL(u'clicked(QModelIndex)'), self.onSlideSelected) if self.isLive: - QtCore.QObject.connect(self.blankScreen, - QtCore.SIGNAL(u'triggered(bool)'), self.onBlankDisplay) - QtCore.QObject.connect(self.themeScreen, - QtCore.SIGNAL(u'triggered(bool)'), self.onThemeDisplay) - QtCore.QObject.connect(self.desktopScreen, - QtCore.SIGNAL(u'triggered(bool)'), self.onHideDisplay) QtCore.QObject.connect(self.volumeSlider, QtCore.SIGNAL(u'sliderReleased()'), self.mediaVolume) QtCore.QObject.connect(Receiver.get_receiver(), @@ -380,14 +378,17 @@ class SlideController(QtGui.QWidget): ActionList.add_action(self.nextItem, u'Live Toolbar') self.previousService = shortcut_action(parent, u'previousService', [QtCore.Qt.Key_Left], self.servicePrevious, u'Live Toolbar') + self.previousService.setShortcutContext(QtCore.Qt.WidgetWithChildrenShortcut) self.previousService.setText( translate('OpenLP.SlideController', 'Previous Service')) self.nextService = shortcut_action(parent, 'nextService', [QtCore.Qt.Key_Right], self.serviceNext, u'Live Toolbar') + self.nextService.setShortcutContext(QtCore.Qt.WidgetWithChildrenShortcut) self.nextService.setText( translate('OpenLP.SlideController', 'Next Service')) self.escapeItem = shortcut_action(parent, 'escapeItem', [QtCore.Qt.Key_Escape], self.liveEscape, u'Live Toolbar') + self.escapeItem.setShortcutContext(QtCore.Qt.WidgetWithChildrenShortcut) self.escapeItem.setText( translate('OpenLP.SlideController', 'Escape Item')) @@ -742,10 +743,12 @@ class SlideController(QtGui.QWidget): """ self.onBlankDisplay(False) - def onBlankDisplay(self, checked): + def onBlankDisplay(self, checked=None): """ Handle the blank screen button actions """ + if checked is None: + checked = self.blankScreen.isChecked() log.debug(u'onBlankDisplay %s' % checked) self.hideMenu.setDefaultAction(self.blankScreen) self.blankScreen.setChecked(checked) @@ -763,10 +766,12 @@ class SlideController(QtGui.QWidget): self.blankPlugin(checked) self.updatePreview() - def onThemeDisplay(self, checked): + def onThemeDisplay(self, checked=None): """ Handle the Theme screen button """ + if checked is None: + checked = self.themeScreen.isChecked() log.debug(u'onThemeDisplay %s' % checked) self.hideMenu.setDefaultAction(self.themeScreen) self.blankScreen.setChecked(False) @@ -784,10 +789,12 @@ class SlideController(QtGui.QWidget): self.blankPlugin(checked) self.updatePreview() - def onHideDisplay(self, checked): + def onHideDisplay(self, checked=None): """ Handle the Hide screen button """ + if checked is None: + checked = self.desktopScreen.isChecked() log.debug(u'onHideDisplay %s' % checked) self.hideMenu.setDefaultAction(self.desktopScreen) self.blankScreen.setChecked(False) @@ -1102,11 +1109,11 @@ class SlideController(QtGui.QWidget): screen hide attributes """ blank = None - if self.blankScreen.isChecked: + if self.blankScreen.isChecked(): blank = self.blankScreen - if self.themeScreen.isChecked: + if self.themeScreen.isChecked(): blank = self.themeScreen - if self.desktopScreen.isChecked: + if self.desktopScreen.isChecked(): blank = self.desktopScreen if blank: blank.setChecked(False) diff --git a/openlp/core/utils/actions.py b/openlp/core/utils/actions.py index 34bc72173..7421db30e 100644 --- a/openlp/core/utils/actions.py +++ b/openlp/core/utils/actions.py @@ -173,6 +173,11 @@ class CategoryList(object): self.categories.append(category) self.categories.sort(key=lambda cat: cat.weight) + def remove(self, name): + for category in self.categories: + if category.name == name: + self.categories.remove(category) + class ActionList(object): """ @@ -206,3 +211,6 @@ class ActionList(object): if category not in ActionList.categories: return ActionList.categories[category].actions.remove(action) + # Remove empty categories. + if len(ActionList.categories[category].actions) == 0: + ActionList.categories.remove(category) diff --git a/openlp/plugins/songusage/songusageplugin.py b/openlp/plugins/songusage/songusageplugin.py index 8ff40373a..2e55a23c0 100644 --- a/openlp/plugins/songusage/songusageplugin.py +++ b/openlp/plugins/songusage/songusageplugin.py @@ -32,6 +32,8 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Plugin, StringContent, Receiver, build_icon, \ translate from openlp.core.lib.db import Manager +from openlp.core.lib.ui import base_action, shortcut_action +from openlp.core.utils.actions import ActionList from openlp.plugins.songusage.forms import SongUsageDetailForm, \ SongUsageDeleteForm from openlp.plugins.songusage.lib.db import init_schema, SongUsageItem @@ -63,30 +65,25 @@ class SongUsagePlugin(Plugin): self.SongUsageMenu.setObjectName(u'SongUsageMenu') self.SongUsageMenu.setTitle(translate( 'SongUsagePlugin', '&Song Usage Tracking')) - #SongUsage Delete - self.SongUsageDelete = QtGui.QAction(tools_menu) + # SongUsage Delete + self.SongUsageDelete = base_action(tools_menu, u'SongUsageDelete') self.SongUsageDelete.setText(translate('SongUsagePlugin', '&Delete Tracking Data')) self.SongUsageDelete.setStatusTip(translate('SongUsagePlugin', 'Delete song usage data up to a specified date.')) - self.SongUsageDelete.setObjectName(u'SongUsageDelete') - #SongUsage Report - self.SongUsageReport = QtGui.QAction(tools_menu) + # SongUsage Report + self.SongUsageReport = base_action(tools_menu, u'SongUsageReport') self.SongUsageReport.setText( translate('SongUsagePlugin', '&Extract Tracking Data')) self.SongUsageReport.setStatusTip( translate('SongUsagePlugin', 'Generate a report on song usage.')) - self.SongUsageReport.setObjectName(u'SongUsageReport') - #SongUsage activation - self.SongUsageStatus = QtGui.QAction(tools_menu) - self.SongUsageStatus.setCheckable(True) - self.SongUsageStatus.setChecked(False) + # SongUsage activation + self.SongUsageStatus = shortcut_action(tools_menu, u'SongUsageStatus', + [QtCore.Qt.Key_F4], self.toggleSongUsageState, checked=False) self.SongUsageStatus.setText(translate( 'SongUsagePlugin', 'Toggle Tracking')) self.SongUsageStatus.setStatusTip(translate('SongUsagePlugin', 'Toggle the tracking of song usage.')) - self.SongUsageStatus.setShortcut(u'F4') - self.SongUsageStatus.setObjectName(u'SongUsageStatus') #Add Menus together self.toolsMenu.addAction(self.SongUsageMenu.menuAction()) self.SongUsageMenu.addAction(self.SongUsageStatus) @@ -97,9 +94,6 @@ class SongUsagePlugin(Plugin): QtCore.QObject.connect(self.SongUsageStatus, QtCore.SIGNAL(u'visibilityChanged(bool)'), self.SongUsageStatus.setChecked) - QtCore.QObject.connect(self.SongUsageStatus, - QtCore.SIGNAL(u'triggered(bool)'), - self.toggleSongUsageState) QtCore.QObject.connect(self.SongUsageDelete, QtCore.SIGNAL(u'triggered()'), self.onSongUsageDelete) QtCore.QObject.connect(self.SongUsageReport, @@ -116,6 +110,9 @@ class SongUsagePlugin(Plugin): self.settingsSection + u'/active', QtCore.QVariant(False)).toBool() self.SongUsageStatus.setChecked(self.SongUsageActive) + ActionList.add_action(self.SongUsageDelete, u'Song Usage') + ActionList.add_action(self.SongUsageReport, u'Song Usage') + ActionList.add_action(self.SongUsageStatus, u'Song Usage') if self.manager is None: self.manager = Manager(u'songusage', init_schema) self.SongUsagedeleteform = SongUsageDeleteForm(self.manager, @@ -131,6 +128,9 @@ class SongUsagePlugin(Plugin): self.manager.finalise() Plugin.finalise(self) self.SongUsageMenu.menuAction().setVisible(False) + ActionList.remove_action(self.SongUsageDelete, u'Song Usage') + ActionList.remove_action(self.SongUsageReport, u'Song Usage') + ActionList.remove_action(self.SongUsageStatus, u'Song Usage') #stop any events being processed self.SongUsageActive = False From 1a493b1fc8da490d0cd7783188f79c02caeb83cd Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 1 Apr 2011 18:53:39 +0200 Subject: [PATCH 16/89] possible fix for not working 'move selection down' --- openlp/core/ui/slidecontroller.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 750ada7cd..9f486518b 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -32,7 +32,7 @@ from PyQt4.phonon import Phonon from openlp.core.lib import OpenLPToolbar, Receiver, resize_image, \ ItemCapabilities, translate -from openlp.core.lib.ui import icon_action, UiStrings, shortcut_action +from openlp.core.lib.ui import UiStrings, shortcut_action from openlp.core.ui import HideMode, MainDisplay from openlp.core.utils.actions import ActionList @@ -143,12 +143,17 @@ class SlideController(QtGui.QWidget): translate('OpenLP.SlideController', 'Move to previous'), self.onSlideSelectedPrevious) self.previousItem.setObjectName(u'previousItem') + self.previousItem.setShortcuts([QtCore.Qt.Key_Up, QtCore.Qt.Key_PageUp]) + self.previousItem.setShortcutContext( + QtCore.Qt.WidgetWithChildrenShortcut) self.nextItem = self.toolbar.addToolbarButton( translate('OpenLP.SlideController', 'Next Slide'), u':/slides/slide_next.png', translate('OpenLP.SlideController', 'Move to next'), self.onSlideSelectedNext) self.nextItem.setObjectName(u'nextItem') + self.nextItem.setShortcuts([QtCore.Qt.Key_Down, QtCore.Qt.Key_PageDown]) + self.nextItem.setShortcutContext(QtCore.Qt.WidgetWithChildrenShortcut) self.toolbar.addToolbarSeparator(u'Close Separator') if self.isLive: self.hideMenu = QtGui.QToolButton(self.toolbar) @@ -363,18 +368,11 @@ class SlideController(QtGui.QWidget): QtCore.SIGNAL(u'config_screen_changed'), self.screenSizeChanged) def setPreviewHotkeys(self, parent=None): - self.previousItem.setShortcuts([QtCore.Qt.Key_Up]) ActionList.add_action(self.previousItem, u'Preview Toolbar') - self.nextItem.setShortcuts([QtCore.Qt.Key_Down]) ActionList.add_action(self.nextItem, u'Preview Toolbar') def setLiveHotkeys(self, parent=None): - self.previousItem.setShortcuts([QtCore.Qt.Key_Up, QtCore.Qt.Key_PageUp]) - self.previousItem.setShortcutContext( - QtCore.Qt.WidgetWithChildrenShortcut) ActionList.add_action(self.previousItem, u'Live Toolbar') - self.nextItem.setShortcuts([QtCore.Qt.Key_Down, QtCore.Qt.Key_PageDown]) - self.nextItem.setShortcutContext(QtCore.Qt.WidgetWithChildrenShortcut) ActionList.add_action(self.nextItem, u'Live Toolbar') self.previousService = shortcut_action(parent, u'previousService', [QtCore.Qt.Key_Left], self.servicePrevious, u'Live Toolbar') From 4badce0205e1f29d69f2074bbd2bb30d934cf9d7 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sat, 2 Apr 2011 15:08:54 +0200 Subject: [PATCH 17/89] fixed actions which did not have a parent which caused the check to fail --- openlp/core/lib/toolbar.py | 3 +-- openlp/core/ui/shortcutlistform.py | 11 ++++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/openlp/core/lib/toolbar.py b/openlp/core/lib/toolbar.py index 44149cd85..d2b37df51 100644 --- a/openlp/core/lib/toolbar.py +++ b/openlp/core/lib/toolbar.py @@ -79,7 +79,6 @@ class OpenLPToolbar(QtGui.QToolBar): ``context`` Specify the context in which this shortcut is valid """ - newAction = None if icon: actionIcon = build_icon(icon) if slot and not checkable: @@ -88,7 +87,7 @@ class OpenLPToolbar(QtGui.QToolBar): newAction = self.addAction(actionIcon, title) self.icons[title] = actionIcon else: - newAction = QtGui.QAction(title, newAction) + newAction = QtGui.QAction(title, self) self.addAction(newAction) QtCore.QObject.connect(newAction, QtCore.SIGNAL(u'triggered()'), slot) diff --git a/openlp/core/ui/shortcutlistform.py b/openlp/core/ui/shortcutlistform.py index e350009cd..bd4fb8ab6 100644 --- a/openlp/core/ui/shortcutlistform.py +++ b/openlp/core/ui/shortcutlistform.py @@ -42,7 +42,6 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): The shortcut list dialog """ #TODO: do not close on ESC -#TODO: Fix Preview/Live controller (have the same shortcut) def __init__(self, parent=None): QtGui.QDialog.__init__(self, parent) self.setupUi(self) @@ -89,12 +88,13 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): continue # Have the same parentWidget, thus they cannot have the same # shortcut. - #TODO: Does not fully work right now. - if action.parentWidget() is changing_action.parentWidget(): + if action.parent() is changing_action.parent(): shortcut_valid = False - if action.shortcutContext() == QtCore.Qt.WindowShortcut: + if action.shortcutContext() in [QtCore.Qt.WindowShortcut, + QtCore.Qt.ApplicationShortcut]: shortcut_valid = False - if changing_action.shortcutContext() == QtCore.Qt.WindowShortcut: + if changing_action.shortcutContext() in \ + [QtCore.Qt.WindowShortcut, QtCore.Qt.ApplicationShortcut]: shortcut_valid = False if not shortcut_valid: QtGui.QMessageBox.warning(self, @@ -193,6 +193,7 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): if action is None: return self.shortcutButton.setChecked(True) + self.shortcutButton.setFocus(QtCore.Qt.OtherFocusReason) self.onItemPressed(item, column) def onItemPressed(self, item, column): From 7260f91825cd8a9c8bf2567dcd7d88b789b9fc1c Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sat, 2 Apr 2011 16:22:08 +0200 Subject: [PATCH 18/89] restore butto nnow works --- openlp/core/ui/shortcutlistdialog.py | 2 +- openlp/core/ui/shortcutlistform.py | 32 +++++++++++++++++++++++++++- openlp/core/ui/slidecontroller.py | 15 ++++++------- 3 files changed, 39 insertions(+), 10 deletions(-) diff --git a/openlp/core/ui/shortcutlistdialog.py b/openlp/core/ui/shortcutlistdialog.py index 467fb0534..5f8936628 100644 --- a/openlp/core/ui/shortcutlistdialog.py +++ b/openlp/core/ui/shortcutlistdialog.py @@ -58,7 +58,7 @@ class Ui_ShortcutListDialog(object): self.dialogLayout.addLayout(self.customLayout) self.buttonBox = QtGui.QDialogButtonBox(shortcutListDialog) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel | - QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Reset) + QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.RestoreDefaults) self.buttonBox.setObjectName(u'buttonBox') self.dialogLayout.addWidget(self.buttonBox) self.retranslateUi(shortcutListDialog) diff --git a/openlp/core/ui/shortcutlistform.py b/openlp/core/ui/shortcutlistform.py index bd4fb8ab6..14aa1d009 100644 --- a/openlp/core/ui/shortcutlistform.py +++ b/openlp/core/ui/shortcutlistform.py @@ -41,7 +41,7 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): """ The shortcut list dialog """ -#TODO: do not close on ESC + def __init__(self, parent=None): QtGui.QDialog.__init__(self, parent) self.setupUi(self) @@ -58,6 +58,16 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): self.onItemDoubleClicked) QtCore.QObject.connect(self.clearShortcutButton, QtCore.SIGNAL(u'clicked(bool)'), self.onClearShortcutButtonClicked) + QtCore.QObject.connect(self.buttonBox, + QtCore.SIGNAL(u'clicked(QAbstractButton*)'), + self.onRestoreDefaultsClicked) + + def keyPressEvent(self, event): + if self.shortcutButton.isChecked(): + event.ignore() + elif event.key() == QtCore.Qt.Key_Escape: + event.accept() + self.close() def keyReleaseEvent(self, event): Qt = QtCore.Qt @@ -229,6 +239,26 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): self.refreshShortcutList() self.onItemPressed(item, self.column) + def onRestoreDefaultsClicked(self, button): + """ + Restores all default shortcuts. + """ + if self.buttonBox.buttonRole(button) != QtGui.QDialogButtonBox.ResetRole: + return + if QtGui.QMessageBox.question(self, + translate('OpenLP.ShortcutListDialog', 'Restore Default Shortcuts'), + translate('OpenLP.ShortcutListDialog', 'Do you want to restore all ' + 'shortcuts to their defaults?'), QtGui.QMessageBox.StandardButtons( + QtGui.QMessageBox.Yes | + QtGui.QMessageBox.No)) == QtGui.QMessageBox.No: + return + self.shortcutButton.setChecked(False) + self.shortcutButton.setText(u'') + for category in ActionList.categories: + for action in category.actions: + action.setShortcuts(action.defaultShortcuts) + self.refreshShortcutList() + def save(self): """ Save the shortcuts. **Note**, that we do not have to load the shortcuts, diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 9f486518b..1ec2e1772 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -141,19 +141,18 @@ class SlideController(QtGui.QWidget): translate('OpenLP.SlideController', 'Previous Slide'), u':/slides/slide_previous.png', translate('OpenLP.SlideController', 'Move to previous'), - self.onSlideSelectedPrevious) - self.previousItem.setObjectName(u'previousItem') - self.previousItem.setShortcuts([QtCore.Qt.Key_Up, QtCore.Qt.Key_PageUp]) - self.previousItem.setShortcutContext( - QtCore.Qt.WidgetWithChildrenShortcut) + self.onSlideSelectedPrevious, + shortcuts=[QtCore.Qt.Key_Up, QtCore.Qt.Key_PageUp], + context=QtCore.Qt.WidgetWithChildrenShortcut) + self.previousItem.setObjectName(u'previousItem') self.nextItem = self.toolbar.addToolbarButton( translate('OpenLP.SlideController', 'Next Slide'), u':/slides/slide_next.png', translate('OpenLP.SlideController', 'Move to next'), - self.onSlideSelectedNext) + self.onSlideSelectedNext, + shortcuts=[QtCore.Qt.Key_Down, QtCore.Qt.Key_PageDown], + context=QtCore.Qt.WidgetWithChildrenShortcut) self.nextItem.setObjectName(u'nextItem') - self.nextItem.setShortcuts([QtCore.Qt.Key_Down, QtCore.Qt.Key_PageDown]) - self.nextItem.setShortcutContext(QtCore.Qt.WidgetWithChildrenShortcut) self.toolbar.addToolbarSeparator(u'Close Separator') if self.isLive: self.hideMenu = QtGui.QToolButton(self.toolbar) From e3d822f07ad30f72b99f21410039438639faf56a Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sat, 2 Apr 2011 17:37:14 +0200 Subject: [PATCH 19/89] fixed strange save bug --- openlp/core/lib/ui.py | 17 +++++++++-------- openlp/core/ui/slidecontroller.py | 6 ++++-- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/openlp/core/lib/ui.py b/openlp/core/lib/ui.py index a02041cad..9f24da96c 100644 --- a/openlp/core/lib/ui.py +++ b/openlp/core/lib/ui.py @@ -280,17 +280,18 @@ def shortcut_action(parent, name, shortcuts, function, icon=None, checked=None, """ Return a shortcut enabled action. """ + action = QtGui.QAction(parent) + action.setObjectName(name) if icon is not None: - action = icon_action(parent, name, icon, checked, category) - elif checked is not None: - action = checkable_action(parent, name, checked, category) - else: - action = base_action(parent, name, category) + action.setIcon(build_icon(icon)) + if checked is not None: + action.setCheckable(True) + action.setChecked(checked) + action.setCheckable(True) action.setShortcuts(shortcuts) action.setShortcutContext(QtCore.Qt.WindowShortcut) - # We have to save the default shortcut again, as the action's shortcut was - # set after adding the shortcut to the action list. - action.defaultShortcuts = action.shortcuts() + if category is not None: + ActionList.add_action(action, category) QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered()'), function) return action diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 1ec2e1772..3fe27f4d9 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -144,7 +144,6 @@ class SlideController(QtGui.QWidget): self.onSlideSelectedPrevious, shortcuts=[QtCore.Qt.Key_Up, QtCore.Qt.Key_PageUp], context=QtCore.Qt.WidgetWithChildrenShortcut) - self.previousItem.setObjectName(u'previousItem') self.nextItem = self.toolbar.addToolbarButton( translate('OpenLP.SlideController', 'Next Slide'), u':/slides/slide_next.png', @@ -152,7 +151,6 @@ class SlideController(QtGui.QWidget): self.onSlideSelectedNext, shortcuts=[QtCore.Qt.Key_Down, QtCore.Qt.Key_PageDown], context=QtCore.Qt.WidgetWithChildrenShortcut) - self.nextItem.setObjectName(u'nextItem') self.toolbar.addToolbarSeparator(u'Close Separator') if self.isLive: self.hideMenu = QtGui.QToolButton(self.toolbar) @@ -367,10 +365,14 @@ class SlideController(QtGui.QWidget): QtCore.SIGNAL(u'config_screen_changed'), self.screenSizeChanged) def setPreviewHotkeys(self, parent=None): + self.previousItem.setObjectName(u'previousItemPreview') + self.nextItem.setObjectName(u'nextItemPreview') ActionList.add_action(self.previousItem, u'Preview Toolbar') ActionList.add_action(self.nextItem, u'Preview Toolbar') def setLiveHotkeys(self, parent=None): + self.previousItem.setObjectName(u'previousItemLive') + self.nextItem.setObjectName(u'nextItemLive') ActionList.add_action(self.previousItem, u'Live Toolbar') ActionList.add_action(self.nextItem, u'Live Toolbar') self.previousService = shortcut_action(parent, u'previousService', From 958155e7d75d8a86a90f0e4de1e33f9641520c37 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sat, 2 Apr 2011 17:45:00 +0200 Subject: [PATCH 20/89] fixed alternate shortcut --- openlp/core/ui/shortcutlistform.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/ui/shortcutlistform.py b/openlp/core/ui/shortcutlistform.py index 14aa1d009..80b9652a0 100644 --- a/openlp/core/ui/shortcutlistform.py +++ b/openlp/core/ui/shortcutlistform.py @@ -186,7 +186,7 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): shortcuts.append(action.shortcuts()[1]) # We are changing the secondary shortcut. elif self.column == 2: - if len(action.shortcuts()) == 1: + if len(action.shortcuts()) != 0: shortcuts.append(action.shortcuts()[0]) shortcuts.append(QtGui.QKeySequence(self.shortcutButton.text())) else: From 61068e26a6dce8bc7f577b716777cf3c56ef23eb Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sat, 2 Apr 2011 18:14:43 +0200 Subject: [PATCH 21/89] removed cancel button --- openlp/core/ui/shortcutlistdialog.py | 4 ++-- openlp/core/ui/shortcutlistform.py | 6 +----- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/openlp/core/ui/shortcutlistdialog.py b/openlp/core/ui/shortcutlistdialog.py index 5f8936628..a4bcc359e 100644 --- a/openlp/core/ui/shortcutlistdialog.py +++ b/openlp/core/ui/shortcutlistdialog.py @@ -57,8 +57,8 @@ class Ui_ShortcutListDialog(object): self.customLayout.addStretch() self.dialogLayout.addLayout(self.customLayout) self.buttonBox = QtGui.QDialogButtonBox(shortcutListDialog) - self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel | - QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.RestoreDefaults) + self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Ok | + QtGui.QDialogButtonBox.RestoreDefaults) self.buttonBox.setObjectName(u'buttonBox') self.dialogLayout.addWidget(self.buttonBox) self.retranslateUi(shortcutListDialog) diff --git a/openlp/core/ui/shortcutlistform.py b/openlp/core/ui/shortcutlistform.py index 80b9652a0..84aea006a 100644 --- a/openlp/core/ui/shortcutlistform.py +++ b/openlp/core/ui/shortcutlistform.py @@ -63,11 +63,7 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): self.onRestoreDefaultsClicked) def keyPressEvent(self, event): - if self.shortcutButton.isChecked(): - event.ignore() - elif event.key() == QtCore.Qt.Key_Escape: - event.accept() - self.close() + event.ignore() def keyReleaseEvent(self, event): Qt = QtCore.Qt From 28b83aadaed1c66eecb628152956414a379f0f19 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sun, 3 Apr 2011 13:36:43 +0200 Subject: [PATCH 22/89] translate categories --- openlp/core/lib/ui.py | 8 +++ openlp/core/ui/mainwindow.py | 63 +++++++++++---------- openlp/core/ui/servicemanager.py | 23 +++++--- openlp/core/ui/slidecontroller.py | 20 +++---- openlp/core/utils/actions.py | 2 + openlp/plugins/alerts/alertsplugin.py | 4 +- openlp/plugins/bibles/bibleplugin.py | 8 ++- openlp/plugins/songs/songsplugin.py | 12 ++-- openlp/plugins/songusage/songusageplugin.py | 20 ++++--- 9 files changed, 94 insertions(+), 66 deletions(-) diff --git a/openlp/core/lib/ui.py b/openlp/core/lib/ui.py index 9f24da96c..15309edc9 100644 --- a/openlp/core/lib/ui.py +++ b/openlp/core/lib/ui.py @@ -56,8 +56,10 @@ class UiStrings(object): EmptyField = translate('OpenLP.Ui', 'Empty Field') Error = translate('OpenLP.Ui', 'Error') Export = translate('OpenLP.Ui', 'Export') + File = translate('OpenLP.Ui', 'File') FontSizePtUnit = translate('OpenLP.Ui', 'pt', 'Abbreviated font pointsize unit') + Help = translate('OpenLP.Ui', 'Help') Hours = translate('OpenLP.Ui', 'h', 'The abbreviated unit for hours') Image = translate('OpenLP.Ui', 'Image') Import = translate('OpenLP.Ui', 'Import') @@ -65,6 +67,7 @@ class UiStrings(object): Live = translate('OpenLP.Ui', 'Live') LiveBGError = translate('OpenLP.Ui', 'Live Background Error') LivePanel = translate('OpenLP.Ui', 'Live Panel') + LiveToolbar = translate('OpenLP.Ui', 'Live Toolbar') Load = translate('OpenLP.Ui', 'Load') Minutes = translate('OpenLP.Ui', 'm', 'The abbreviated unit for minutes') Middle = translate('OpenLP.Ui', 'Middle') @@ -82,6 +85,7 @@ class UiStrings(object): OpenService = translate('OpenLP.Ui', 'Open Service') Preview = translate('OpenLP.Ui', 'Preview') PreviewPanel = translate('OpenLP.Ui', 'Preview Panel') + PreviewToolbar = translate('OpenLP.Ui', 'Preview Toolbar') PrintServiceOrder = translate('OpenLP.Ui', 'Print Service Order') ReplaceBG = translate('OpenLP.Ui', 'Replace Background') ReplaceLiveBG = translate('OpenLP.Ui', 'Replace Live Background') @@ -92,13 +96,17 @@ class UiStrings(object): Search = translate('OpenLP.Ui', 'Search') SelectDelete = translate('OpenLP.Ui', 'You must select an item to delete.') SelectEdit = translate('OpenLP.Ui', 'You must select an item to edit.') + Settings = translate('OpenLP.Ui', 'Settings') SaveService = translate('OpenLP.Ui', 'Save Service') Service = translate('OpenLP.Ui', 'Service') StartTimeCode = unicode(translate('OpenLP.Ui', 'Start %s')) Theme = translate('OpenLP.Ui', 'Theme', 'Singular') Themes = translate('OpenLP.Ui', 'Themes', 'Plural') + Tools = translate('OpenLP.Ui', 'Tools') Top = translate('OpenLP.Ui', 'Top') Version = translate('OpenLP.Ui', 'Version') + View = translate('OpenLP.Ui', 'View') + ViewMode = translate('OpenLP.Ui', 'View Model') def add_welcome_page(parent, image): """ diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 458e8814f..bb6d105b9 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -164,69 +164,72 @@ class Ui_MainWindow(object): self.FileNewItem = shortcut_action(mainWindow, u'FileNewItem', [QtGui.QKeySequence(u'Ctrl+N')], self.ServiceManagerContents.onNewServiceClicked, - u':/general/general_new.png', category=u'File') + u':/general/general_new.png', category=UiStrings.File) self.FileOpenItem = shortcut_action(mainWindow, u'FileOpenItem', [QtGui.QKeySequence(u'Ctrl+O')], self.ServiceManagerContents.onLoadServiceClicked, - u':/general/general_open.png', category=u'File') + u':/general/general_open.png', category=UiStrings.File) self.FileSaveItem = shortcut_action(mainWindow, u'FileSaveItem', [QtGui.QKeySequence(u'Ctrl+S')], self.ServiceManagerContents.saveFile, - u':/general/general_save.png', category=u'File') + u':/general/general_save.png', category=UiStrings.File) self.FileSaveAsItem = shortcut_action(mainWindow, u'FileSaveAsItem', [QtGui.QKeySequence(u'Ctrl+Shift+S')], - self.ServiceManagerContents.saveFileAs, category=u'File') + self.ServiceManagerContents.saveFileAs, category=UiStrings.File) self.printServiceOrderItem = shortcut_action(mainWindow, u'printServiceItem', [QtGui.QKeySequence(u'Ctrl+P')], - self.ServiceManagerContents.printServiceOrder, category=u'File') + self.ServiceManagerContents.printServiceOrder, + category=UiStrings.File) self.FileExitItem = shortcut_action(mainWindow, u'FileExitItem', [QtGui.QKeySequence(u'Alt+F4')], mainWindow.close, - u':/system/system_exit.png', category=u'File') + u':/system/system_exit.png', category=UiStrings.File) self.ImportThemeItem = base_action( - mainWindow, u'ImportThemeItem', u'Import') + mainWindow, u'ImportThemeItem', UiStrings.Import) self.ImportLanguageItem = base_action( - mainWindow, u'ImportLanguageItem')#, u'Import') + mainWindow, u'ImportLanguageItem')#, UiStrings.Import) self.ExportThemeItem = base_action( - mainWindow, u'ExportThemeItem', u'Export') + mainWindow, u'ExportThemeItem', UiStrings.Export) self.ExportLanguageItem = base_action( - mainWindow, u'ExportLanguageItem')#, u'Export') + mainWindow, u'ExportLanguageItem')#, UiStrings.Export) self.ViewMediaManagerItem = shortcut_action(mainWindow, u'ViewMediaManagerItem', [QtGui.QKeySequence(u'F8')], self.toggleMediaManager, u':/system/system_mediamanager.png', - self.mediaManagerDock.isVisible(), u'View') + self.mediaManagerDock.isVisible(), UiStrings.View) self.ViewThemeManagerItem = shortcut_action(mainWindow, u'ViewThemeManagerItem', [QtGui.QKeySequence(u'F10')], self.toggleThemeManager, u':/system/system_thememanager.png', - self.themeManagerDock.isVisible(), u'View') + self.themeManagerDock.isVisible(), UiStrings.View) self.ViewServiceManagerItem = shortcut_action(mainWindow, u'ViewServiceManagerItem', [QtGui.QKeySequence(u'F9')], self.toggleServiceManager, u':/system/system_servicemanager.png', - self.serviceManagerDock.isVisible(), u'View') + self.serviceManagerDock.isVisible(), UiStrings.View) self.ViewPreviewPanel = shortcut_action(mainWindow, u'ViewPreviewPanel', [QtGui.QKeySequence(u'F11')], - self.setPreviewPanelVisibility, checked=previewVisible, category=u'View') + self.setPreviewPanelVisibility, checked=previewVisible, + category=UiStrings.View) self.ViewLivePanel = shortcut_action(mainWindow, u'ViewLivePanel', [QtGui.QKeySequence(u'F12')], self.setLivePanelVisibility, - checked=liveVisible, category=u'View') + checked=liveVisible, category=UiStrings.View) self.ModeDefaultItem = checkable_action( - mainWindow, u'ModeDefaultItem', category=u'View Mode') + mainWindow, u'ModeDefaultItem', category=UiStrings.ViewMode) self.ModeSetupItem = checkable_action( - mainWindow, u'ModeLiveItem', category=u'View Mode') + mainWindow, u'ModeLiveItem', category=UiStrings.ViewMode) self.ModeLiveItem = checkable_action( - mainWindow, u'ModeLiveItem', True, u'View Mode') + mainWindow, u'ModeLiveItem', True, UiStrings.ViewMode) self.ModeGroup = QtGui.QActionGroup(mainWindow) self.ModeGroup.addAction(self.ModeDefaultItem) self.ModeGroup.addAction(self.ModeSetupItem) self.ModeGroup.addAction(self.ModeLiveItem) self.ModeDefaultItem.setChecked(True) self.ToolsAddToolItem = icon_action(mainWindow, u'ToolsAddToolItem', - u':/tools/tools_add.png', category=u'Tools') - self.ToolsOpenDataFolder = icon_action(mainWindow, u'ToolsOpenDataFolder', - u':/general/general_open.png', category=u'Tools') + u':/tools/tools_add.png', category=UiStrings.Tools) + self.ToolsOpenDataFolder = icon_action(mainWindow, + u'ToolsOpenDataFolder', u':/general/general_open.png', + category=UiStrings.Tools) self.settingsPluginListItem = shortcut_action(mainWindow, u'settingsPluginListItem', [QtGui.QKeySequence(u'Alt+F7')], self.onPluginItemClicked, u':/system/settings_plugin_list.png', - category=u'Settings') + category=UiStrings.Settings) # i18n Language Items self.AutoLanguageItem = checkable_action(mainWindow, u'AutoLanguageItem', LanguageManager.auto_language) @@ -242,23 +245,25 @@ class Ui_MainWindow(object): add_actions(self.LanguageGroup, [languageItem]) self.SettingsShortcutsItem = icon_action(mainWindow, u'SettingsShortcutsItem', - u':/system/system_configure_shortcuts.png', category=u'Settings') + u':/system/system_configure_shortcuts.png', + category=UiStrings.Settings) self.DisplayTagItem = icon_action(mainWindow, - u'DisplayTagItem', u':/system/tag_editor.png', category=u'Settings') + u'DisplayTagItem', u':/system/tag_editor.png', + category=UiStrings.Settings) self.SettingsConfigureItem = icon_action(mainWindow, u'SettingsConfigureItem', u':/system/system_settings.png', - category=u'Settings') + category=UiStrings.Settings) self.HelpDocumentationItem = icon_action(mainWindow, u'HelpDocumentationItem', u':/system/system_help_contents.png', - category=None)#u'Help') + category=None)#UiStrings.Help) self.HelpDocumentationItem.setEnabled(False) self.HelpAboutItem = shortcut_action(mainWindow, u'HelpAboutItem', [QtGui.QKeySequence(u'Ctrl+F1')], self.onHelpAboutItemClicked, - u':/system/system_about.png', category=u'Help') + u':/system/system_about.png', category=UiStrings.Help) self.HelpOnlineHelpItem = base_action( - mainWindow, u'HelpOnlineHelpItem', category=u'Help') + mainWindow, u'HelpOnlineHelpItem', category=UiStrings.Help) self.helpWebSiteItem = base_action( - mainWindow, u'helpWebSiteItem', category=u'Help') + mainWindow, u'helpWebSiteItem', category=UiStrings.Help) add_actions(self.FileImportMenu, (self.ImportThemeItem, self.ImportLanguageItem)) add_actions(self.FileExportMenu, diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 8d6062ab1..9daa1d8a2 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -167,7 +167,8 @@ class ServiceManager(QtGui.QWidget): 'Move item to the top of the service.'), self.onServiceTop, shortcuts=[QtCore.Qt.Key_Home]) self.serviceManagerList.moveTop.setObjectName(u'moveTop') - ActionList.add_action(self.serviceManagerList.moveTop, u'Service') + ActionList.add_action( + self.serviceManagerList.moveTop, UiStrings.Service) self.serviceManagerList.moveUp = self.orderToolbar.addToolbarButton( translate('OpenLP.ServiceManager', 'Move &up'), u':/services/service_up.png', @@ -175,7 +176,7 @@ class ServiceManager(QtGui.QWidget): 'Move item up one position in the service.'), self.onServiceUp, shortcuts=[QtCore.Qt.Key_PageUp]) self.serviceManagerList.moveUp.setObjectName(u'moveUp') - ActionList.add_action(self.serviceManagerList.moveUp, u'Service') + ActionList.add_action(self.serviceManagerList.moveUp, UiStrings.Service) self.serviceManagerList.moveDown = self.orderToolbar.addToolbarButton( translate('OpenLP.ServiceManager', 'Move &down'), u':/services/service_down.png', @@ -183,7 +184,8 @@ class ServiceManager(QtGui.QWidget): 'Move item down one position in the service.'), self.onServiceDown, shortcuts=[QtCore.Qt.Key_PageDown]) self.serviceManagerList.moveDown.setObjectName(u'moveDown') - ActionList.add_action(self.serviceManagerList.moveDown, u'Service') + ActionList.add_action( + self.serviceManagerList.moveDown, UiStrings.Service) self.serviceManagerList.moveBottom = self.orderToolbar.addToolbarButton( translate('OpenLP.ServiceManager', 'Move to &bottom'), u':/services/service_bottom.png', @@ -191,7 +193,8 @@ class ServiceManager(QtGui.QWidget): 'Move item to the end of the service.'), self.onServiceEnd, shortcuts=[QtCore.Qt.Key_End]) self.serviceManagerList.moveBottom.setObjectName(u'moveBottom') - ActionList.add_action(self.serviceManagerList.moveBottom, u'Service') + ActionList.add_action( + self.serviceManagerList.moveBottom, UiStrings.Service) self.serviceManagerList.down = self.orderToolbar.addToolbarButton( translate('OpenLP.ServiceManager', 'Move &down'), None, @@ -199,7 +202,7 @@ class ServiceManager(QtGui.QWidget): 'Moves the selection down the window.'), self.onMoveSelectionDown, shortcuts=[QtCore.Qt.Key_Down]) self.serviceManagerList.down.setObjectName(u'down') - ActionList.add_action(self.serviceManagerList.down, u'Service') + ActionList.add_action(self.serviceManagerList.down, UiStrings.Service) self.serviceManagerList.down.setVisible(False) self.serviceManagerList.up = self.orderToolbar.addToolbarButton( translate('OpenLP.ServiceManager', 'Move up'), @@ -208,7 +211,7 @@ class ServiceManager(QtGui.QWidget): 'Moves the selection up the window.'), self.onMoveSelectionUp, shortcuts=[QtCore.Qt.Key_Up]) self.serviceManagerList.up.setObjectName(u'up') - ActionList.add_action(self.serviceManagerList.up, u'Service') + ActionList.add_action(self.serviceManagerList.up, UiStrings.Service) self.serviceManagerList.up.setVisible(False) self.orderToolbar.addSeparator() self.serviceManagerList.delete = self.orderToolbar.addToolbarButton( @@ -225,7 +228,7 @@ class ServiceManager(QtGui.QWidget): 'Expand all the service items.'), self.onExpandAll, shortcuts=[QtCore.Qt.Key_Plus]) self.serviceManagerList.expand.setObjectName(u'expand') - ActionList.add_action(self.serviceManagerList.expand, u'Service') + ActionList.add_action(self.serviceManagerList.expand, UiStrings.Service) self.serviceManagerList.collapse = self.orderToolbar.addToolbarButton( translate('OpenLP.ServiceManager', '&Collapse all'), u':/services/service_collapse_all.png', @@ -233,7 +236,8 @@ class ServiceManager(QtGui.QWidget): 'Collapse all the service items.'), self.onCollapseAll, shortcuts=[QtCore.Qt.Key_Minus]) self.serviceManagerList.collapse.setObjectName(u'collapse') - ActionList.add_action(self.serviceManagerList.collapse, u'Service') + ActionList.add_action( + self.serviceManagerList.collapse, UiStrings.Service) self.orderToolbar.addSeparator() self.serviceManagerList.makeLive = self.orderToolbar.addToolbarButton( translate('OpenLP.ServiceManager', 'Go Live'), @@ -242,7 +246,8 @@ class ServiceManager(QtGui.QWidget): 'Send the selected item to Live.'), self.makeLive, shortcuts=[QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return]) self.serviceManagerList.makeLive.setObjectName(u'orderToolbar') - ActionList.add_action(self.serviceManagerList.makeLive, u'Service') + ActionList.add_action( + self.serviceManagerList.makeLive, UiStrings.Service) self.layout.addWidget(self.orderToolbar) # Connect up our signals and slots QtCore.QObject.connect(self.themeComboBox, diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 3fe27f4d9..af94eb425 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -161,18 +161,18 @@ class SlideController(QtGui.QWidget): translate('OpenLP.SlideController', 'Hide'), self.toolbar)) self.blankScreen = shortcut_action(self.hideMenu, u'blankScreen', [QtCore.Qt.Key_Period], self.onBlankDisplay, - u':/slides/slide_blank.png', False, u'Live Toolbar') + u':/slides/slide_blank.png', False, UiStrings.LiveToolbar) self.blankScreen.setText( translate('OpenLP.SlideController', 'Blank Screen')) self.themeScreen = shortcut_action(self.hideMenu, u'themeScreen', [QtGui.QKeySequence(u'T')], self.onThemeDisplay, - u':/slides/slide_theme.png', False, u'Live Toolbar') + u':/slides/slide_theme.png', False, UiStrings.LiveToolbar) self.themeScreen.setText( translate('OpenLP.SlideController', 'Blank to Theme')) self.desktopScreen = shortcut_action(self.hideMenu, u'desktopScreen', [QtGui.QKeySequence(u'D')], self.onHideDisplay, u':/slides/slide_desktop.png', False, - u'Live Toolbar') + UiStrings.LiveToolbar) self.desktopScreen.setText( translate('OpenLP.SlideController', 'Show Desktop')) self.hideMenu.setDefaultAction(self.blankScreen) @@ -367,26 +367,26 @@ class SlideController(QtGui.QWidget): def setPreviewHotkeys(self, parent=None): self.previousItem.setObjectName(u'previousItemPreview') self.nextItem.setObjectName(u'nextItemPreview') - ActionList.add_action(self.previousItem, u'Preview Toolbar') - ActionList.add_action(self.nextItem, u'Preview Toolbar') + ActionList.add_action(self.previousItem, UiStrings.PreviewToolbar) + ActionList.add_action(self.nextItem, UiStrings.PreviewToolbar) def setLiveHotkeys(self, parent=None): self.previousItem.setObjectName(u'previousItemLive') self.nextItem.setObjectName(u'nextItemLive') - ActionList.add_action(self.previousItem, u'Live Toolbar') - ActionList.add_action(self.nextItem, u'Live Toolbar') + ActionList.add_action(self.previousItem, UiStrings.LiveToolbar) + ActionList.add_action(self.nextItem, UiStrings.LiveToolbar) self.previousService = shortcut_action(parent, u'previousService', - [QtCore.Qt.Key_Left], self.servicePrevious, u'Live Toolbar') + [QtCore.Qt.Key_Left], self.servicePrevious, UiStrings.LiveToolbar) self.previousService.setShortcutContext(QtCore.Qt.WidgetWithChildrenShortcut) self.previousService.setText( translate('OpenLP.SlideController', 'Previous Service')) self.nextService = shortcut_action(parent, 'nextService', - [QtCore.Qt.Key_Right], self.serviceNext, u'Live Toolbar') + [QtCore.Qt.Key_Right], self.serviceNext, UiStrings.LiveToolbar) self.nextService.setShortcutContext(QtCore.Qt.WidgetWithChildrenShortcut) self.nextService.setText( translate('OpenLP.SlideController', 'Next Service')) self.escapeItem = shortcut_action(parent, 'escapeItem', - [QtCore.Qt.Key_Escape], self.liveEscape, u'Live Toolbar') + [QtCore.Qt.Key_Escape], self.liveEscape, UiStrings.LiveToolbar) self.escapeItem.setShortcutContext(QtCore.Qt.WidgetWithChildrenShortcut) self.escapeItem.setText( translate('OpenLP.SlideController', 'Escape Item')) diff --git a/openlp/core/utils/actions.py b/openlp/core/utils/actions.py index 7421db30e..04cb1f091 100644 --- a/openlp/core/utils/actions.py +++ b/openlp/core/utils/actions.py @@ -190,6 +190,7 @@ class ActionList(object): @staticmethod def add_action(action, category, weight=None): + category = unicode(category) if category not in ActionList.categories: ActionList.categories.append(category) action.defaultShortcuts = action.shortcuts() @@ -208,6 +209,7 @@ class ActionList(object): @staticmethod def remove_action(action, category): + category = unicode(category) if category not in ActionList.categories: return ActionList.categories[category].actions.remove(action) diff --git a/openlp/plugins/alerts/alertsplugin.py b/openlp/plugins/alerts/alertsplugin.py index 45e1969f4..d564a9754 100644 --- a/openlp/plugins/alerts/alertsplugin.py +++ b/openlp/plugins/alerts/alertsplugin.py @@ -30,7 +30,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Plugin, StringContent, build_icon, translate from openlp.core.lib.db import Manager -from openlp.core.lib.ui import icon_action +from openlp.core.lib.ui import icon_action, UiStrings from openlp.core.utils.actions import ActionList from openlp.plugins.alerts.lib import AlertsManager, AlertsTab from openlp.plugins.alerts.lib.db import init_schema @@ -75,7 +75,7 @@ class AlertsPlugin(Plugin): log.info(u'Alerts Initialising') Plugin.initialise(self) self.toolsAlertItem.setVisible(True) - ActionList.add_action(self.toolsAlertItem, u'Tools') + ActionList.add_action(self.toolsAlertItem, UiStrings.Tools) self.liveController.alertTab = self.settings_tab def finalise(self): diff --git a/openlp/plugins/bibles/bibleplugin.py b/openlp/plugins/bibles/bibleplugin.py index 1396d4550..60be388ba 100644 --- a/openlp/plugins/bibles/bibleplugin.py +++ b/openlp/plugins/bibles/bibleplugin.py @@ -29,7 +29,7 @@ import logging from PyQt4 import QtCore, QtGui from openlp.core.lib import Plugin, StringContent, build_icon, translate -from openlp.core.lib.ui import base_action +from openlp.core.lib.ui import base_action, UiStrings from openlp.core.utils.actions import ActionList from openlp.plugins.bibles.lib import BibleManager, BiblesTab, BibleMediaItem @@ -52,9 +52,9 @@ class BiblePlugin(Plugin): self.manager = BibleManager(self) Plugin.initialise(self) self.importBibleItem.setVisible(True) - ActionList.add_action(self.importBibleItem, u'Import') + ActionList.add_action(self.importBibleItem, UiStrings.Import) # Do not add the action to the list yet. - #ActionList.add_action(self.exportBibleItem, u'Export') + #ActionList.add_action(self.exportBibleItem, UiStrings.Export) # Set to invisible until we can export bibles self.exportBibleItem.setVisible(False) @@ -65,7 +65,9 @@ class BiblePlugin(Plugin): log.info(u'Plugin Finalise') self.manager.finalise() Plugin.finalise(self) + ActionList.remove_action(self.importBibleItem, UiStrings.Import) self.importBibleItem.setVisible(False) + #ActionList.remove_action(self.exportBibleItem, UiStrings.Export) self.exportBibleItem.setVisible(False) def addImportMenuItem(self, import_menu): diff --git a/openlp/plugins/songs/songsplugin.py b/openlp/plugins/songs/songsplugin.py index de0714d5e..a3230ff7f 100644 --- a/openlp/plugins/songs/songsplugin.py +++ b/openlp/plugins/songs/songsplugin.py @@ -66,9 +66,9 @@ class SongsPlugin(Plugin): log.info(u'Songs Initialising') Plugin.initialise(self) self.toolsReindexItem.setVisible(True) - ActionList.add_action(self.SongImportItem, u'Import') - ActionList.add_action(self.SongExportItem, u'Export') - ActionList.add_action(self.toolsReindexItem, u'Tools') + ActionList.add_action(self.SongImportItem, UiStrings.Import) + ActionList.add_action(self.SongExportItem, UiStrings.Export) + ActionList.add_action(self.toolsReindexItem, UiStrings.Tools) self.mediaItem.displayResultsSong( self.manager.get_all_objects(Song, order_by_ref=Song.search_title)) @@ -258,7 +258,7 @@ class SongsPlugin(Plugin): log.info(u'Songs Finalising') self.manager.finalise() self.toolsReindexItem.setVisible(False) - ActionList.remove_action(self.SongImportItem, u'Import') - ActionList.remove_action(self.SongExportItem, u'Export') - ActionList.remove_action(self.toolsReindexItem, u'Tools') + ActionList.remove_action(self.SongImportItem, UiStrings.Import) + ActionList.remove_action(self.SongExportItem, UiStrings.Export) + ActionList.remove_action(self.toolsReindexItem, UiStrings.Tools) Plugin.finalise(self) diff --git a/openlp/plugins/songusage/songusageplugin.py b/openlp/plugins/songusage/songusageplugin.py index 2e55a23c0..b0a545ad8 100644 --- a/openlp/plugins/songusage/songusageplugin.py +++ b/openlp/plugins/songusage/songusageplugin.py @@ -32,7 +32,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Plugin, StringContent, Receiver, build_icon, \ translate from openlp.core.lib.db import Manager -from openlp.core.lib.ui import base_action, shortcut_action +from openlp.core.lib.ui import base_action, shortcut_action, UiStrings from openlp.core.utils.actions import ActionList from openlp.plugins.songusage.forms import SongUsageDetailForm, \ SongUsageDeleteForm @@ -110,9 +110,12 @@ class SongUsagePlugin(Plugin): self.settingsSection + u'/active', QtCore.QVariant(False)).toBool() self.SongUsageStatus.setChecked(self.SongUsageActive) - ActionList.add_action(self.SongUsageDelete, u'Song Usage') - ActionList.add_action(self.SongUsageReport, u'Song Usage') - ActionList.add_action(self.SongUsageStatus, u'Song Usage') + ActionList.add_action(self.SongUsageDelete, + translate('SongUsagePlugin', 'Song Usage')) + ActionList.add_action(self.SongUsageReport, + translate('SongUsagePlugin', 'Song Usage')) + ActionList.add_action(self.SongUsageStatus, + translate('SongUsagePlugin', 'Song Usage')) if self.manager is None: self.manager = Manager(u'songusage', init_schema) self.SongUsagedeleteform = SongUsageDeleteForm(self.manager, @@ -128,9 +131,12 @@ class SongUsagePlugin(Plugin): self.manager.finalise() Plugin.finalise(self) self.SongUsageMenu.menuAction().setVisible(False) - ActionList.remove_action(self.SongUsageDelete, u'Song Usage') - ActionList.remove_action(self.SongUsageReport, u'Song Usage') - ActionList.remove_action(self.SongUsageStatus, u'Song Usage') + ActionList.remove_action(self.SongUsageDelete, + translate('SongUsagePlugin', 'Song Usage')) + ActionList.remove_action(self.SongUsageReport, + translate('SongUsagePlugin', 'Song Usage')) + ActionList.remove_action(self.SongUsageStatus, + translate('SongUsagePlugin', 'Song Usage')) #stop any events being processed self.SongUsageActive = False From 0a5b3b2c2d460f06eacd6bb3debbc17fc3b4f5fc Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sun, 3 Apr 2011 15:24:51 +0200 Subject: [PATCH 23/89] --- openlp/core/lib/ui.py | 1 - openlp/core/ui/shortcutlistdialog.py | 17 +++++-- openlp/core/ui/shortcutlistform.py | 70 ++++++++++++++++++---------- 3 files changed, 59 insertions(+), 29 deletions(-) diff --git a/openlp/core/lib/ui.py b/openlp/core/lib/ui.py index 15309edc9..029bb34df 100644 --- a/openlp/core/lib/ui.py +++ b/openlp/core/lib/ui.py @@ -295,7 +295,6 @@ def shortcut_action(parent, name, shortcuts, function, icon=None, checked=None, if checked is not None: action.setCheckable(True) action.setChecked(checked) - action.setCheckable(True) action.setShortcuts(shortcuts) action.setShortcutContext(QtCore.Qt.WindowShortcut) if category is not None: diff --git a/openlp/core/ui/shortcutlistdialog.py b/openlp/core/ui/shortcutlistdialog.py index a4bcc359e..1004014d6 100644 --- a/openlp/core/ui/shortcutlistdialog.py +++ b/openlp/core/ui/shortcutlistdialog.py @@ -34,6 +34,9 @@ class Ui_ShortcutListDialog(object): shortcutListDialog.setObjectName(u'shortcutListDialog') self.dialogLayout = QtGui.QVBoxLayout(shortcutListDialog) self.dialogLayout.setObjectName(u'dialogLayout') + self.descriptionLabel = QtGui.QLabel(shortcutListDialog); + self.descriptionLabel.setObjectName(u'descriptionLabel') + self.dialogLayout.addWidget(self.descriptionLabel) self.treeWidget = QtGui.QTreeWidget(shortcutListDialog) self.treeWidget.setAlternatingRowColors(True) self.treeWidget.setObjectName(u'treeWidget') @@ -57,8 +60,8 @@ class Ui_ShortcutListDialog(object): self.customLayout.addStretch() self.dialogLayout.addLayout(self.customLayout) self.buttonBox = QtGui.QDialogButtonBox(shortcutListDialog) - self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Ok | - QtGui.QDialogButtonBox.RestoreDefaults) + self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel | + QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.RestoreDefaults) self.buttonBox.setObjectName(u'buttonBox') self.dialogLayout.addWidget(self.buttonBox) self.retranslateUi(shortcutListDialog) @@ -71,9 +74,15 @@ class Ui_ShortcutListDialog(object): def retranslateUi(self, shortcutListDialog): shortcutListDialog.setWindowTitle( translate('OpenLP.ShortcutListDialog', 'Customize Shortcuts')) + self.descriptionLabel.setText(translate('OpenLP.ShortcutListDialog', + 'Select an action and click the button below to start capturing ' + 'a new shortcut.')) self.treeWidget.setHeaderLabels([ translate('OpenLP.ShortcutListDialog', 'Action'), translate('OpenLP.ShortcutListDialog', 'Shortcut'), translate('OpenLP.ShortcutListDialog', 'Alternate')]) - self.shortcutButton.setText( - translate('OpenLP.ShortcutListDialog', 'None')) + self.shortcutButton.setToolTip( + translate('OpenLP.ShortcutListDialog', 'Capture shortcut.')) + self.clearShortcutButton.setToolTip( + translate('OpenLP.ShortcutListDialog', + 'Restore the default shortcut(s) of this action.')) diff --git a/openlp/core/ui/shortcutlistform.py b/openlp/core/ui/shortcutlistform.py index 84aea006a..58b42a351 100644 --- a/openlp/core/ui/shortcutlistform.py +++ b/openlp/core/ui/shortcutlistform.py @@ -46,6 +46,7 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): QtGui.QDialog.__init__(self, parent) self.setupUi(self) self.column = -1 + self.changedActions = {} self.shortcutButton.setText(u'') self.shortcutButton.setEnabled(False) QtCore.QObject.connect(self.shortcutButton, @@ -63,7 +64,11 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): self.onRestoreDefaultsClicked) def keyPressEvent(self, event): - event.ignore() + if self.shortcutButton.isChecked(): + event.ignore() + elif event.key() == QtCore.Qt.Key_Escape: + event.accept() + self.close() def keyReleaseEvent(self, event): Qt = QtCore.Qt @@ -87,7 +92,7 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): shortcut_valid = True for category in ActionList.categories: for action in category.actions: - shortcuts = action.shortcuts() + shortcuts = self._actionShortcuts(action) if key_sequence not in shortcuts: continue if action is changing_action: @@ -116,6 +121,7 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): self.shortcutButton.setChecked(False) def exec_(self): + self.changedActions = {} self.reloadShortcutList() self.shortcutButton.setChecked(False) self.shortcutButton.setEnabled(False) @@ -152,15 +158,16 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): action = item.data(0, QtCore.Qt.UserRole).toPyObject() if action is None: continue - if len(action.shortcuts()) == 0: + shortcuts = self._actionShortcuts(action) + if len(shortcuts) == 0: item.setText(1, u'') item.setText(2, u'') - elif len(action.shortcuts()) == 1: - item.setText(1, action.shortcuts()[0].toString()) + elif len(shortcuts) == 1: + item.setText(1, shortcuts[0].toString()) item.setText(2, u'') else: - item.setText(1, action.shortcuts()[0].toString()) - item.setText(2, action.shortcuts()[1].toString()) + item.setText(1, shortcuts[0].toString()) + item.setText(2, shortcuts[1].toString()) def onShortcutButtonClicked(self, toggled): """ @@ -174,20 +181,21 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): action = item.data(0, QtCore.Qt.UserRole).toPyObject() if action is None: return - shortcuts = [] + shortcuts = self._actionShortcuts(action) + new_shortcuts = [] # We are changing the primary shortcut. - if self.column == 1: - shortcuts.append(QtGui.QKeySequence(self.shortcutButton.text())) - if len(action.shortcuts()) == 2: - shortcuts.append(action.shortcuts()[1]) + if self.column in [0, 1]: + new_shortcuts.append(QtGui.QKeySequence(self.shortcutButton.text())) + if len(shortcuts) == 2: + new_shortcuts.append(shortcuts[1]) # We are changing the secondary shortcut. elif self.column == 2: - if len(action.shortcuts()) != 0: - shortcuts.append(action.shortcuts()[0]) - shortcuts.append(QtGui.QKeySequence(self.shortcutButton.text())) + if len(shortcuts) != 0: + new_shortcuts.append(shortcuts[0]) + new_shortcuts.append(QtGui.QKeySequence(self.shortcutButton.text())) else: return - action.setShortcuts(shortcuts) + self.changedActions[action] = new_shortcuts self.refreshShortcutList() def onItemDoubleClicked(self, item, column): @@ -209,15 +217,17 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): """ self.column = column action = item.data(0, QtCore.Qt.UserRole).toPyObject() - self.shortcutButton.setEnabled(True) text = u'' - if action is None or column not in [1, 2]: + if action is None:# or column not in [1, 2]: self.shortcutButton.setChecked(False) self.shortcutButton.setEnabled(False) - elif column == 1 and len(action.shortcuts()) != 0: - text = action.shortcuts()[0].toString() - elif len(action.shortcuts()) == 2 and len(action.shortcuts()) != 0: - text = action.shortcuts()[1].toString() + else: + self.shortcutButton.setEnabled(True) + shortcuts = self._actionShortcuts(action) + if column != 2 and len(shortcuts) != 0: + text = shortcuts[0].toString() + elif len(shortcuts) == 2: + text = shortcuts[1].toString() self.shortcutButton.setText(text) def onClearShortcutButtonClicked(self, toggled): @@ -231,7 +241,7 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): action = item.data(0, QtCore.Qt.UserRole).toPyObject() if action is None: return - action.setShortcuts(action.defaultShortcuts) + self.changedActions[action] = action.defaultShortcuts self.refreshShortcutList() self.onItemPressed(item, self.column) @@ -252,7 +262,7 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): self.shortcutButton.setText(u'') for category in ActionList.categories: for action in category.actions: - action.setShortcuts(action.defaultShortcuts) + self.changedActions[action] = action.defaultShortcuts self.refreshShortcutList() def save(self): @@ -264,6 +274,18 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): settings.beginGroup(u'shortcuts') for category in ActionList.categories: for action in category.actions: + if self.changedActions .has_key(action): + action.setShortcuts(self.changedActions[action]) settings.setValue( action.objectName(), QtCore.QVariant(action.shortcuts())) settings.endGroup() + + def _actionShortcuts(self, action): + """ + This returns the shortcuts for the given ``action``, which also includes + those shortcuts which are not yet assigned to an action (as changes are + applied when closing the dialog). + """ + if self.changedActions.has_key(action): + return self.changedActions[action] + return action.shortcuts() From 65f134ab1b6ce8993359b2346a8fe1d5c7d46c06 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sun, 3 Apr 2011 15:36:59 +0200 Subject: [PATCH 24/89] removed fix (I'll deal with this in another branch) --- openlp/core/ui/slidecontroller.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index af94eb425..66c26da3b 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -1108,11 +1108,11 @@ class SlideController(QtGui.QWidget): screen hide attributes """ blank = None - if self.blankScreen.isChecked(): + if self.blankScreen.isChecked: blank = self.blankScreen - if self.themeScreen.isChecked(): + if self.themeScreen.isChecked: blank = self.themeScreen - if self.desktopScreen.isChecked(): + if self.desktopScreen.isChecked: blank = self.desktopScreen if blank: blank.setChecked(False) From dfc2eed1f4206fd57529351574188445c85c3317 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sun, 3 Apr 2011 16:20:55 +0200 Subject: [PATCH 25/89] adapted latest merge --- openlp/core/lib/__init__.py | 4 +++- openlp/core/ui/servicemanager.py | 4 ++-- openlp/core/ui/shortcutlistform.py | 8 +++++++- openlp/core/utils/actions.py | 30 ++++++++++++++++++++++++++---- 4 files changed, 38 insertions(+), 8 deletions(-) diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index e62cb3e44..0f0fcca5e 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -186,8 +186,9 @@ def context_menu_action(base, icon, text, slot, shortcuts=None): if icon: action.setIcon(build_icon(icon)) QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered()'), slot) - if shortcuts: + if shortcuts is not None: action.setShortcuts(shortcuts) + ActionList.add_action(action) return action def context_menu(base, icon, text): @@ -343,3 +344,4 @@ from dockwidget import OpenLPDockWidget from renderer import Renderer from rendermanager import RenderManager from mediamanageritem import MediaManagerItem +from openlp.core.utils.actions import ActionList diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 3ea3f1a6b..fc20d0f2d 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -202,7 +202,7 @@ class ServiceManager(QtGui.QWidget): 'Moves the selection down the window.'), self.onMoveSelectionDown, shortcuts=[QtCore.Qt.Key_Down]) self.serviceManagerList.down.setObjectName(u'down') - ActionList.add_action(self.serviceManagerList.down, UiStrings.Service) + ActionList.add_action(self.serviceManagerList.down) self.serviceManagerList.down.setVisible(False) self.serviceManagerList.up = self.orderToolbar.addToolbarButton( translate('OpenLP.ServiceManager', 'Move up'), @@ -211,7 +211,7 @@ class ServiceManager(QtGui.QWidget): 'Moves the selection up the window.'), self.onMoveSelectionUp, shortcuts=[QtCore.Qt.Key_Up]) self.serviceManagerList.up.setObjectName(u'up') - ActionList.add_action(self.serviceManagerList.up, UiStrings.Service) + ActionList.add_action(self.serviceManagerList.up) self.serviceManagerList.up.setVisible(False) self.orderToolbar.addSeparator() self.serviceManagerList.delete = self.orderToolbar.addToolbarButton( diff --git a/openlp/core/ui/shortcutlistform.py b/openlp/core/ui/shortcutlistform.py index 58b42a351..5251ac314 100644 --- a/openlp/core/ui/shortcutlistform.py +++ b/openlp/core/ui/shortcutlistform.py @@ -134,6 +134,9 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): """ self.treeWidget.clear() for category in ActionList.categories: + # Check if the category is for internal use only. + if category.name is None: + continue item = QtGui.QTreeWidgetItem([category.name]) for action in category.actions: actionText = REMOVE_AMPERSAND.sub('', unicode(action.text())) @@ -218,7 +221,7 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): self.column = column action = item.data(0, QtCore.Qt.UserRole).toPyObject() text = u'' - if action is None:# or column not in [1, 2]: + if action is None: self.shortcutButton.setChecked(False) self.shortcutButton.setEnabled(False) else: @@ -273,6 +276,9 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): settings = QtCore.QSettings() settings.beginGroup(u'shortcuts') for category in ActionList.categories: + # Check if the category is for internal use only. + if category.name is None: + continue for action in category.actions: if self.changedActions .has_key(action): action.setShortcuts(self.changedActions[action]) diff --git a/openlp/core/utils/actions.py b/openlp/core/utils/actions.py index 04cb1f091..efac7b1bd 100644 --- a/openlp/core/utils/actions.py +++ b/openlp/core/utils/actions.py @@ -189,8 +189,26 @@ class ActionList(object): categories = CategoryList() @staticmethod - def add_action(action, category, weight=None): - category = unicode(category) + def add_action(action, category=None, weight=None): + """ + Add an action to the list of actions. + + ``action`` + The action to add (QAction). + + ``category`` + The category this action belongs to. The category can be a QString + or python unicode string. **Note**, if the category is ``None``, the + category and its actions are being hidden in the shortcut dialog. + However, if they are added, it is possible to avoid assigning + shortcuts twice, which is important. + + ``weight`` + The weight specifies how important a category is. However, this only + has an impact on the order the categories are displayed. + """ + if category is not None: + category = unicode(category) if category not in ActionList.categories: ActionList.categories.append(category) action.defaultShortcuts = action.shortcuts() @@ -198,6 +216,9 @@ class ActionList(object): ActionList.categories[category].actions.append(action) else: ActionList.categories[category].actions.add(action, weight) + if category is None: + # Stop here, as this action is not configurable. + return # Load the shortcut from the config. settings = QtCore.QSettings() settings.beginGroup(u'shortcuts') @@ -208,8 +229,9 @@ class ActionList(object): settings.endGroup() @staticmethod - def remove_action(action, category): - category = unicode(category) + def remove_action(action, category=None): + if category is not None: + category = unicode(category) if category not in ActionList.categories: return ActionList.categories[category].actions.remove(action) From 84605fb43054fadcd4c9690147bf8b62f9f8d9bd Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Mon, 4 Apr 2011 16:38:17 +0200 Subject: [PATCH 26/89] fixed wrong context of shortcuts; moved functions --- openlp/core/lib/__init__.py | 53 --------------------- openlp/core/lib/mediamanageritem.py | 23 +++++---- openlp/core/lib/ui.py | 72 +++++++++++++++++++++++++++-- openlp/core/ui/servicemanager.py | 8 ++-- 4 files changed, 85 insertions(+), 71 deletions(-) diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index 0f0fcca5e..491f3e652 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -166,59 +166,6 @@ def build_icon(icon): QtGui.QIcon.Normal, QtGui.QIcon.Off) return button_icon -def context_menu_action(base, icon, text, slot, shortcuts=None): - """ - Utility method to help build context menus for plugins - - ``base`` - The parent menu to add this menu item to - - ``icon`` - An icon for this action - - ``text`` - The text to display for this action - - ``slot`` - The code to run when this action is triggered - """ - action = QtGui.QAction(text, base) - if icon: - action.setIcon(build_icon(icon)) - QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered()'), slot) - if shortcuts is not None: - action.setShortcuts(shortcuts) - ActionList.add_action(action) - return action - -def context_menu(base, icon, text): - """ - Utility method to help build context menus for plugins - - ``base`` - The parent object to add this menu to - - ``icon`` - An icon for this menu - - ``text`` - The text to display for this menu - """ - action = QtGui.QMenu(text, base) - action.setIcon(build_icon(icon)) - return action - -def context_menu_separator(base): - """ - Add a separator to a context menu - - ``base`` - The menu object to add the separator to - """ - action = QtGui.QAction(u'', base) - action.setSeparator(True) - return action - def image_to_byte(image): """ Resize an image to fit on the current screen for the web and returns diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 63132b141..13277876d 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -31,10 +31,10 @@ import os from PyQt4 import QtCore, QtGui -from openlp.core.lib import context_menu_action, context_menu_separator, \ - SettingsManager, OpenLPToolbar, ServiceItem, StringContent, build_icon, \ - translate, Receiver, ListWidgetWithDnD -from openlp.core.lib.ui import UiStrings +from openlp.core.lib import SettingsManager, OpenLPToolbar, ServiceItem, \ + StringContent, build_icon, translate, Receiver, ListWidgetWithDnD +from openlp.core.lib.ui import UiStrings, context_menu_action, \ + context_menu_separator log = logging.getLogger(__name__) @@ -260,39 +260,42 @@ class MediaManagerItem(QtGui.QWidget): context_menu_action( self.listView, u':/general/general_edit.png', self.plugin.getString(StringContent.Edit)[u'title'], - self.onEditClick)) + self.onEditClick, context=QtCore.Qt.WidgetShortcut)) self.listView.addAction(context_menu_separator(self.listView)) if self.hasDeleteIcon: self.listView.addAction( context_menu_action( self.listView, u':/general/general_delete.png', self.plugin.getString(StringContent.Delete)[u'title'], - self.onDeleteClick, [QtCore.Qt.Key_Delete])) + self.onDeleteClick, [QtCore.Qt.Key_Delete], + context=QtCore.Qt.WidgetShortcut)) self.listView.addAction(context_menu_separator(self.listView)) self.listView.addAction( context_menu_action( self.listView, u':/general/general_preview.png', self.plugin.getString(StringContent.Preview)[u'title'], - self.onPreviewClick, [QtCore.Qt.Key_Enter])) + self.onPreviewClick, [QtCore.Qt.Key_Enter], + context=QtCore.Qt.WidgetShortcut)) self.listView.addAction( context_menu_action( self.listView, u':/general/general_live.png', self.plugin.getString(StringContent.Live)[u'title'], self.onLiveClick, [QtCore.Qt.ShiftModifier + \ QtCore.Qt.Key_Enter, QtCore.Qt.ShiftModifier + \ - QtCore.Qt.Key_Return])) + QtCore.Qt.Key_Return], context=QtCore.Qt.WidgetShortcut)) self.listView.addAction( context_menu_action( self.listView, u':/general/general_add.png', self.plugin.getString(StringContent.Service)[u'title'], - self.onAddClick, [QtCore.Qt.Key_Plus, QtCore.Qt.Key_Equal])) + self.onAddClick, [QtCore.Qt.Key_Plus, QtCore.Qt.Key_Equal], + context=QtCore.Qt.WidgetShortcut)) if self.addToServiceItem: self.listView.addAction( context_menu_action( self.listView, u':/general/general_add.png', translate('OpenLP.MediaManagerItem', '&Add to selected Service Item'), - self.onAddEditClick)) + self.onAddEditClick, context=QtCore.Qt.WidgetShortcut)) QtCore.QObject.connect(self.listView, QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onClickPressed) diff --git a/openlp/core/lib/ui.py b/openlp/core/lib/ui.py index 029bb34df..35ea23497 100644 --- a/openlp/core/lib/ui.py +++ b/openlp/core/lib/ui.py @@ -284,7 +284,7 @@ def icon_action(parent, name, icon, checked=None, category=None): return action def shortcut_action(parent, name, shortcuts, function, icon=None, checked=None, - category=None): + category=None, context=QtCore.Qt.WindowShortcut): """ Return a shortcut enabled action. """ @@ -296,12 +296,76 @@ def shortcut_action(parent, name, shortcuts, function, icon=None, checked=None, action.setCheckable(True) action.setChecked(checked) action.setShortcuts(shortcuts) - action.setShortcutContext(QtCore.Qt.WindowShortcut) - if category is not None: - ActionList.add_action(action, category) + action.setShortcutContext(context) + ActionList.add_action(action, category) QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered()'), function) return action +def context_menu_action(base, icon, text, slot, shortcuts=None, category=None, + context=QtCore.Qt.WindowShortcut): + """ + Utility method to help build context menus for plugins + + ``base`` + The parent menu to add this menu item to + + ``icon`` + An icon for this action + + ``text`` + The text to display for this action + + ``slot`` + The code to run when this action is triggered + + ``shortcuts`` + The action's shortcuts. + + ``category`` + The category the shortcut should be listed in the shortcut dialog. If + left to None, then the action will be hidden in the shortcut dialog. + + ``context`` + The context the shortcut is valid. + """ + action = QtGui.QAction(text, base) + if icon: + action.setIcon(build_icon(icon)) + QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered()'), slot) + if shortcuts is not None: + action.setShortcuts(shortcuts) + action.setShortcutContext(context) + ActionList.add_action(action) + return action + +def context_menu(base, icon, text): + """ + Utility method to help build context menus for plugins + + ``base`` + The parent object to add this menu to + + ``icon`` + An icon for this menu + + ``text`` + The text to display for this menu + """ + action = QtGui.QMenu(text, base) + action.setIcon(build_icon(icon)) + return action + +def context_menu_separator(base): + """ + Add a separator to a context menu + + ``base`` + The menu object to add the separator to + """ + action = QtGui.QAction(u'', base) + action.setSeparator(True) + return action + def add_widget_completer(cache, widget): """ Adds a text autocompleter to a widget. diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index fc20d0f2d..caecaca50 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -32,10 +32,10 @@ log = logging.getLogger(__name__) from PyQt4 import QtCore, QtGui -from openlp.core.lib import OpenLPToolbar, ServiceItem, context_menu_action, \ - Receiver, build_icon, ItemCapabilities, SettingsManager, translate +from openlp.core.lib import OpenLPToolbar, ServiceItem, Receiver, build_icon, \ + ItemCapabilities, SettingsManager, translate from openlp.core.lib.theme import ThemeLevel -from openlp.core.lib.ui import UiStrings, critical_error_message_box +from openlp.core.lib.ui import UiStrings, critical_error_message_box, context_menu_action from openlp.core.ui import ServiceNoteForm, ServiceItemEditForm, StartTimeForm from openlp.core.ui.printserviceform import PrintServiceForm from openlp.core.utils import AppLocation, delete_file, file_is_unicode, \ @@ -1267,7 +1267,7 @@ class ServiceManager(QtGui.QWidget): for theme in theme_list: self.themeComboBox.addItem(theme) action = context_menu_action(self.serviceManagerList, None, theme, - self.onThemeChangeAction) + self.onThemeChangeAction, context=QtCore.Qt.WidgetShortcut) self.themeMenu.addAction(action) index = self.themeComboBox.findText(self.service_theme, QtCore.Qt.MatchExactly) From 4a6be382ff3689cd52da8c330536293055ec5be5 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Mon, 4 Apr 2011 18:15:38 +0200 Subject: [PATCH 27/89] fixed empty texts --- openlp/core/lib/searchedit.py | 3 ++- openlp/core/ui/mainwindow.py | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/openlp/core/lib/searchedit.py b/openlp/core/lib/searchedit.py index 41699256f..d32961ef9 100644 --- a/openlp/core/lib/searchedit.py +++ b/openlp/core/lib/searchedit.py @@ -133,7 +133,8 @@ class SearchEdit(QtGui.QLineEdit): menu = QtGui.QMenu(self) first = None for identifier, icon, title in items: - action = icon_action(menu, title, icon) + action = icon_action(menu, u'', icon) + action.setText(title) action.setData(QtCore.QVariant(identifier)) menu.addAction(action) QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered(bool)'), diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index bb6d105b9..ab712a57d 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -972,8 +972,9 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): self.FileMenu.addSeparator() for fileId, filename in enumerate(recentFilesToDisplay): log.debug('Recent file name: %s', filename) - action = base_action(self, u'&%d %s' % (fileId + 1, - QtCore.QFileInfo(filename).fileName())) + action = base_action(self, u'') + action.setText(u'&%d %s' % + (fileId + 1, QtCore.QFileInfo(filename).fileName())) action.setData(QtCore.QVariant(filename)) self.connect(action, QtCore.SIGNAL(u'triggered()'), self.ServiceManagerContents.onRecentServiceClicked) From 38c939362455d330663da881762f6b94198ea3bf Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Mon, 4 Apr 2011 19:33:42 +0200 Subject: [PATCH 28/89] expand categories --- openlp/core/ui/shortcutlistform.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/ui/shortcutlistform.py b/openlp/core/ui/shortcutlistform.py index 5251ac314..a99b7c3bb 100644 --- a/openlp/core/ui/shortcutlistform.py +++ b/openlp/core/ui/shortcutlistform.py @@ -145,8 +145,8 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): actionItem.setData(0, QtCore.Qt.UserRole, QtCore.QVariant(action)) item.addChild(actionItem) - item.setExpanded(True) self.treeWidget.addTopLevelItem(item) + item.setExpanded(True) self.refreshShortcutList() def refreshShortcutList(self): From 3bfe9ec77c8e430018d2dcafa34b20ff1eb1e9aa Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 6 Apr 2011 21:14:02 +0200 Subject: [PATCH 29/89] --- openlp/core/ui/printservicedialog.py | 4 + openlp/core/ui/printserviceform.py | 107 ++++++++++++++++++--------- 2 files changed, 77 insertions(+), 34 deletions(-) diff --git a/openlp/core/ui/printservicedialog.py b/openlp/core/ui/printservicedialog.py index 97f4b4060..b669c83ec 100644 --- a/openlp/core/ui/printservicedialog.py +++ b/openlp/core/ui/printservicedialog.py @@ -132,6 +132,8 @@ class Ui_PrintServiceDialog(object): self.groupLayout = QtGui.QVBoxLayout() self.slideTextCheckBox = QtGui.QCheckBox() self.groupLayout.addWidget(self.slideTextCheckBox) + self.pageBreakAfterText = QtGui.QCheckBox() + self.groupLayout.addWidget(self.pageBreakAfterText) self.notesCheckBox = QtGui.QCheckBox() self.groupLayout.addWidget(self.notesCheckBox) self.metaDataCheckBox = QtGui.QCheckBox() @@ -149,6 +151,8 @@ class Ui_PrintServiceDialog(object): printServiceDialog.setWindowTitle(UiStrings.PrintServiceOrder) self.slideTextCheckBox.setText(translate('OpenLP.PrintServiceForm', 'Include slide text if available')) + self.pageBreakAfterText.setText(translate('OpenLP.PrintServiceForm', + 'break')) self.notesCheckBox.setText(translate('OpenLP.PrintServiceForm', 'Include service item notes')) self.metaDataCheckBox.setText(translate('OpenLP.PrintServiceForm', diff --git a/openlp/core/ui/printserviceform.py b/openlp/core/ui/printserviceform.py index 4e0f018a4..03febc067 100644 --- a/openlp/core/ui/printserviceform.py +++ b/openlp/core/ui/printserviceform.py @@ -26,6 +26,7 @@ import datetime from PyQt4 import QtCore, QtGui +from lxml import html from openlp.core.lib import translate from openlp.core.lib.ui import UiStrings @@ -50,6 +51,10 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog): settings.beginGroup(u'advanced') self.slideTextCheckBox.setChecked(settings.value( u'print slide text', QtCore.QVariant(False)).toBool()) + self.pageBreakAfterText.setChecked(settings.value( + u'enable page break', QtCore.QVariant(False)).toBool()) + if not self.slideTextCheckBox.isChecked(): + self.pageBreakAfterText.setDisabled(True) self.metaDataCheckBox.setChecked(settings.value( u'print file meta data', QtCore.QVariant(False)).toBool()) self.notesCheckBox.setChecked(settings.value( @@ -76,6 +81,9 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog): QtCore.SIGNAL(u'triggered()'), self.copyText) QtCore.QObject.connect(self.htmlCopy, QtCore.SIGNAL(u'triggered()'), self.copyHtmlText) + QtCore.QObject.connect(self.slideTextCheckBox, + QtCore.SIGNAL(u'stateChanged(int)'), + self.onSlideTextCheckBoxChanged) self.updatePreviewText() def toggleOptions(self, checked): @@ -93,57 +101,80 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog): """ Creates the html text and updates the html of *self.document*. """ - text = u'' - if self.titleLineEdit.text(): - text += u'

%s

' % unicode(self.titleLineEdit.text()) - for item in self.serviceManager.serviceItems: + html_data = html.fromstring( + u'%s' % unicode(self.titleLineEdit.text())) + html_data.append(html.Element(u'body')) + html_data.body.append(html.fromstring( + u'

%s

' % unicode(self.titleLineEdit.text()))) + for index, item in enumerate(self.serviceManager.serviceItems): item = item[u'service_item'] + div = html.Element(u'div') # Add the title of the service item. - text += u'

%s

' % (item.icon, - item.get_display_title()) - # Add slide text of the service item. + item_title = html.Element(u'h3') + icon = html.Element(u'img') + icon.set(u'src', item.icon) + item_title.append(icon) + item_title.append( + html.fromstring(u' %s' % item.get_display_title())) + div.append(item_title) if self.slideTextCheckBox.isChecked(): + # Add the text of the service item. if item.is_text(): - # Add the text of the service item. - verse = None + verse_def = None for slide in item.get_frames(): - if not verse: - text += u'

' + slide[u'html'] - verse = slide[u'verseTag'] - elif verse != slide[u'verseTag']: - text += u'<\p>

' + slide[u'html'] - verse = slide[u'verseTag'] + if not verse_def or verse_def != slide[u'verseTag']: + p = html.Element(u'p') + div.append(p) else: - text += u'
' + slide[u'html'] - text += u'

' + p.append(html.Element(u'br')) + p.append(html.fromstring( + u'%s' % slide[u'html'])) + verse_def = slide[u'verseTag'] + # Break the page before the div element. + if index != 0 and self.pageBreakAfterText.isChecked(): + div.set(u'style', u'page-break-before:always') + # Add the image names of the service item. elif item.is_image(): - # Add the image names of the service item. - text += u'
    ' + ol = html.Element(u'ol') for slide in range(len(item.get_frames())): - text += u'
  1. %s

  2. ' % \ - item.get_frame_title(slide) - text += u'
' + li = html.Element(u'li') + li.text = item.get_frame_title(slide) + ol.append(li) + div.append(ol) + # add footer if item.foot_text: - # add footer - text += u'

%s

' % item.foot_text + div.append(html.fromstring(item.foot_text)) # Add service items' notes. if self.notesCheckBox.isChecked(): if item.notes: - text += u'

%s

%s' % (translate( - 'OpenLP.ServiceManager', 'Notes:'), - item.notes.replace(u'\n', u'
')) + p = html.Element(u'p') + strong = html.Element(u'strong') + strong.text = unicode( + translate('OpenLP.ServiceManager', 'Notes:')) + p.append(strong) + p.append(html.fromstring(u'%s' % + item.notes.replace(u'\n', u'
'))) + div.append(p) # Add play length of media files. if item.is_media() and self.metaDataCheckBox.isChecked(): tme = item.media_length if item.end_time > 0: tme = item.end_time - item.start_time - text += u'

%s %s

' % (translate( - 'OpenLP.ServiceManager', u'Playing time:'), - unicode(datetime.timedelta(seconds=tme))) - if self.footerTextEdit.toPlainText(): - text += u'

%s

%s' % (translate('OpenLP.ServiceManager', - u'Custom Service Notes:'), self.footerTextEdit.toPlainText()) - self.document.setHtml(text) + p = html.fromstring(u'

%s

' % + translate('OpenLP.ServiceManager', 'Playing time:')) + p.append(html.fromstring(u'%s' % + unicode(datetime.timedelta(seconds=tme)))) + div.append(p) + html_data.body.append(div) + # Add the custom service notes: + if self.footerTextEdit.toPlainText(): + html_data.append(html.fromstring(u'

%

' % + translate('OpenLP.ServiceManager', u'Custom Service Notes:'))) + html_data.append(html.fromstring( + u'%s' % self.footerTextEdit.toPlainText())) + for div in html_data.body: + print len(div), html.tostring(div), u'\n' + self.document.setHtml(html.tostring(html_data)) self.previewWidget.updatePreview() def paintRequested(self, printer): @@ -232,6 +263,12 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog): else: self.copyTextButton.setText(UiStrings.CopyToText) + def onSlideTextCheckBoxChanged(self, state): + """ + The ``slideTextCheckBox`` checkbox was either checked or unchecked. + """ + self.pageBreakAfterText.setDisabled(state == QtCore.Qt.Unchecked) + def saveOptions(self): """ Save the settings and close the dialog. @@ -241,6 +278,8 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog): settings.beginGroup(u'advanced') settings.setValue(u'print slide text', QtCore.QVariant(self.slideTextCheckBox.isChecked())) + settings.setValue(u'enable page break', + QtCore.QVariant(self.pageBreakAfterText.isChecked())) settings.setValue(u'print file meta data', QtCore.QVariant(self.metaDataCheckBox.isChecked())) settings.setValue(u'print notes', From 9b04385f347bed26d50d61586679b10cf5185bf7 Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Wed, 6 Apr 2011 23:54:47 +0100 Subject: [PATCH 30/89] Blanking and switching between song and ppt and back --- openlp/core/ui/slidecontroller.py | 39 ++++++++----------- openlp/plugins/bibles/lib/mediaitem.py | 1 + .../presentations/lib/messagelistener.py | 18 ++++++--- 3 files changed, 30 insertions(+), 28 deletions(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 232653326..eec5d3a19 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -569,19 +569,18 @@ class SlideController(QtGui.QWidget): self.onStopLoop() # If old item was a command tell it to stop if self.serviceItem: - if self.serviceItem.is_command(): + oldItem = self.serviceItem + self.serviceItem = None + if oldItem.is_command(): Receiver.send_message(u'%s_stop' % - self.serviceItem.name.lower(), [serviceItem, self.isLive]) - if self.serviceItem.is_media(): + oldItem.name.lower(), [oldItem, self.isLive]) + if oldItem.is_media(): self.onMediaClose() - if self.isLive: - if serviceItem.is_capable(ItemCapabilities.ProvidesOwnDisplay): - self._forceUnblank() - blanked = self.blankScreen.isChecked() - else: - blanked = False + if self.isLive and oldItem.is_capable( + ItemCapabilities.ProvidesOwnDisplay): + self._resetBlank() Receiver.send_message(u'%s_start' % serviceItem.name.lower(), - [serviceItem, self.isLive, blanked, slideno]) + [serviceItem, self.isLive, self.display.hideMode, slideno]) self.slideList = {} width = self.parent.controlSplitter.sizes()[self.split] self.serviceItem = serviceItem @@ -1095,20 +1094,14 @@ class SlideController(QtGui.QWidget): self.slidePreview.clear() self.slidePreview.show() - def _forceUnblank(self): + def _resetBlank(self): """ Used by command items which provide their own displays to reset the screen hide attributes """ - blank = None - if self.blankScreen.isChecked: - blank = self.blankScreen - if self.themeScreen.isChecked: - blank = self.themeScreen - if self.desktopScreen.isChecked: - blank = self.desktopScreen - if blank: - blank.setChecked(False) - self.hideMenu.setDefaultAction(blank) - QtCore.QSettings().remove( - self.parent.generalSettingsSection + u'/screen blank') + if self.blankScreen.isChecked(): + self.onBlankDisplay(True) + elif self.themeScreen.isChecked(): + self.onThemeDisplay(True) + elif self.desktopScreen.isChecked(): + self.onHideDisplay(True) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index a9694fd0c..9c45b85f8 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -58,6 +58,7 @@ class BibleMediaItem(MediaManagerItem): MediaManagerItem.__init__(self, parent, plugin, icon) # Place to store the search results for both bibles. self.settings = self.parent.settings_tab + self.quickPreviewAllowed = True self.search_results = {} self.second_search_results = {} QtCore.QObject.connect(Receiver.get_receiver(), diff --git a/openlp/plugins/presentations/lib/messagelistener.py b/openlp/plugins/presentations/lib/messagelistener.py index b86219f42..728a154f8 100644 --- a/openlp/plugins/presentations/lib/messagelistener.py +++ b/openlp/plugins/presentations/lib/messagelistener.py @@ -49,7 +49,7 @@ class Controller(object): self.doc = None log.info(u'%s controller loaded' % live) - def add_handler(self, controller, file, is_blank): + def add_handler(self, controller, file, hide_mode): """ Add a handler, which is an instance of a presentation and slidecontroller combination. If the slidecontroller has a display @@ -66,9 +66,17 @@ class Controller(object): return if self.is_live: self.doc.start_presentation() - if is_blank: + if hide_mode == HideMode.Screen: + Receiver.send_message(u'maindisplay_hide', HideMode.Screen) + self.stop() + elif hide_mode == HideMode.Theme: + Receiver.send_message(u'maindisplay_hide', HideMode.Theme) self.blank() - Receiver.send_message(u'maindisplay_hide', HideMode.Screen) + elif hide_mode == HideMode.Blank: + Receiver.send_message(u'maindisplay_hide', HideMode.Screen) + self.blank() + else: + Receiver.send_message(u'maindisplay_hide', HideMode.Screen) self.doc.slidenumber = 0 def activate(self): @@ -261,7 +269,7 @@ class MessageListener(object): is_live = message[1] item = message[0] log.debug(u'Startup called with message %s' % message) - is_blank = message[2] + hide_mode = message[2] file = os.path.join(item.get_frame_path(), item.get_frame_title()) self.handler = item.title @@ -273,7 +281,7 @@ class MessageListener(object): controller = self.live_handler else: controller = self.preview_handler - controller.add_handler(self.controllers[self.handler], file, is_blank) + controller.add_handler(self.controllers[self.handler], file, hide_mode) def slide(self, message): """ From 9b84319c249cf09b66e90d7f28c7eb38c5afe134 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 7 Apr 2011 16:26:29 +0200 Subject: [PATCH 31/89] added new dialog from superfly + few own changes --- openlp/core/ui/shortcutlistdialog.py | 109 ++++++++++++++++---------- openlp/core/ui/shortcutlistform.py | 62 ++++++++------- resources/forms/shortcutlistdialog.ui | 80 +++++++++++++------ 3 files changed, 158 insertions(+), 93 deletions(-) diff --git a/openlp/core/ui/shortcutlistdialog.py b/openlp/core/ui/shortcutlistdialog.py index 83f897bd8..6531a1a19 100644 --- a/openlp/core/ui/shortcutlistdialog.py +++ b/openlp/core/ui/shortcutlistdialog.py @@ -30,44 +30,71 @@ from openlp.core.lib import translate, build_icon class Ui_ShortcutListDialog(object): def setupUi(self, shortcutListDialog): - shortcutListDialog.resize(440, 450) - shortcutListDialog.setObjectName(u'shortcutListDialog') - self.dialogLayout = QtGui.QVBoxLayout(shortcutListDialog) - self.dialogLayout.setObjectName(u'dialogLayout') - self.descriptionLabel = QtGui.QLabel(shortcutListDialog) - self.descriptionLabel.setObjectName(u'descriptionLabel') - self.descriptionLabel.setWordWrap(True) - self.dialogLayout.addWidget(self.descriptionLabel) + shortcutListDialog.setObjectName("shortcutListDialog") + shortcutListDialog.resize(500, 438) + self.shortcutListLayout = QtGui.QVBoxLayout(shortcutListDialog) + self.shortcutListLayout.setSpacing(8) + self.shortcutListLayout.setMargin(8) + self.shortcutListLayout.setObjectName("shortcutListLayout") self.treeWidget = QtGui.QTreeWidget(shortcutListDialog) self.treeWidget.setAlternatingRowColors(True) - self.treeWidget.setObjectName(u'treeWidget') + self.treeWidget.setObjectName("treeWidget") self.treeWidget.setColumnCount(3) - self.dialogLayout.addWidget(self.treeWidget) - self.customLayout = QtGui.QHBoxLayout() - self.customLayout.setObjectName(u'customLayout') - self.shortcutButtonLabel = QtGui.QLabel(shortcutListDialog) - self.shortcutButtonLabel.setObjectName(u'descriptionLabel') - self.customLayout.addWidget(self.shortcutButtonLabel) - self.shortcutButton = QtGui.QPushButton(shortcutListDialog) - self.shortcutButton.setIcon( - build_icon(u':/system/system_configure_shortcuts.png')) - self.shortcutButton.setCheckable(True) - self.shortcutButton.setObjectName(u'shortcutButton') - self.shortcutButton.setFixedSize(150, 30) - self.customLayout.addWidget(self.shortcutButton) - self.clearShortcutButton = QtGui.QToolButton(shortcutListDialog) - self.clearShortcutButton.setIcon( - build_icon(u':/system/clear_shortcut.png')) - self.clearShortcutButton.setAutoRaise(True) - self.clearShortcutButton.setObjectName(u'clearShortcutButton') - self.customLayout.addWidget(self.clearShortcutButton) - self.customLayout.addStretch() - self.dialogLayout.addLayout(self.customLayout) + self.shortcutListLayout.addWidget(self.treeWidget) + self.detailsLayout = QtGui.QGridLayout() + self.detailsLayout.setSpacing(8) + self.detailsLayout.setContentsMargins(-1, 0, -1, -1) + self.detailsLayout.setObjectName("detailsLayout") + self.defaultRadioButton = QtGui.QRadioButton(shortcutListDialog) + self.defaultRadioButton.setChecked(True) + self.defaultRadioButton.setObjectName("defaultRadioButton") + self.detailsLayout.addWidget(self.defaultRadioButton, 0, 0, 1, 1) + self.customRadioButton = QtGui.QRadioButton(shortcutListDialog) + self.customRadioButton.setObjectName("customRadioButton") + self.detailsLayout.addWidget(self.customRadioButton, 1, 0, 1, 1) + self.primaryLayout = QtGui.QHBoxLayout() + self.primaryLayout.setSpacing(8) + self.primaryLayout.setObjectName("primaryLayout") + self.primaryPushButton = QtGui.QPushButton(shortcutListDialog) + self.primaryPushButton.setMinimumSize(QtCore.QSize(84, 0)) + self.primaryPushButton.setIcon(build_icon(u':/system/system_configure_shortcuts.png')) + self.primaryPushButton.setCheckable(True) + self.primaryPushButton.setChecked(False) + self.primaryPushButton.setObjectName("primaryPushButton") + self.primaryLayout.addWidget(self.primaryPushButton) + self.clearPrimaryButton = QtGui.QToolButton(shortcutListDialog) + self.clearPrimaryButton.setMinimumSize(QtCore.QSize(0, 16)) + self.clearPrimaryButton.setText("") + self.clearPrimaryButton.setIcon(build_icon(u':/system/clear_shortcut.png')) + self.clearPrimaryButton.setObjectName("clearPrimaryButton") + self.primaryLayout.addWidget(self.clearPrimaryButton) + self.detailsLayout.addLayout(self.primaryLayout, 1, 1, 1, 1) + self.alternateLayout = QtGui.QHBoxLayout() + self.alternateLayout.setSpacing(8) + self.alternateLayout.setObjectName("alternateLayout") + self.alternatePushButton = QtGui.QPushButton(shortcutListDialog) + self.alternatePushButton.setIcon(build_icon(u':/system/system_configure_shortcuts.png')) + self.alternatePushButton.setObjectName("alternatePushButton") + self.alternateLayout.addWidget(self.alternatePushButton) + self.clearAlternateButton = QtGui.QToolButton(shortcutListDialog) + self.clearAlternateButton.setText("") + self.clearAlternateButton.setIcon(build_icon(u':/system/clear_shortcut.png')) + self.clearAlternateButton.setObjectName("clearAlternateButton") + self.alternateLayout.addWidget(self.clearAlternateButton) + self.detailsLayout.addLayout(self.alternateLayout, 1, 2, 1, 1) + self.primaryLabel = QtGui.QLabel(shortcutListDialog) + self.primaryLabel.setObjectName("primaryLabel") + self.detailsLayout.addWidget(self.primaryLabel, 0, 1, 1, 1) + self.alternateLabel = QtGui.QLabel(shortcutListDialog) + self.alternateLabel.setObjectName("alternateLabel") + self.detailsLayout.addWidget(self.alternateLabel, 0, 2, 1, 1) + self.shortcutListLayout.addLayout(self.detailsLayout) self.buttonBox = QtGui.QDialogButtonBox(shortcutListDialog) + self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel | - QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.RestoreDefaults) - self.buttonBox.setObjectName(u'buttonBox') - self.dialogLayout.addWidget(self.buttonBox) + QtGui.QDialogButtonBox.Ok|QtGui.QDialogButtonBox.Reset) + self.buttonBox.setObjectName("buttonBox") + self.shortcutListLayout.addWidget(self.buttonBox) self.retranslateUi(shortcutListDialog) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'accepted()'), shortcutListDialog.accept) @@ -78,15 +105,17 @@ class Ui_ShortcutListDialog(object): def retranslateUi(self, shortcutListDialog): shortcutListDialog.setWindowTitle( translate('OpenLP.ShortcutListDialog', 'Customize Shortcuts')) - self.descriptionLabel.setText(translate('OpenLP.ShortcutListDialog', - 'Select an action and click the button below to start capturing ' - 'a new shortcut.')) + #self.descriptionLabel.setText(translate('OpenLP.ShortcutListDialog', + #'Select an action and click the button below to start capturing ' + #'a new shortcut.')) self.treeWidget.setHeaderLabels([ translate('OpenLP.ShortcutListDialog', 'Action'), translate('OpenLP.ShortcutListDialog', 'Shortcut'), translate('OpenLP.ShortcutListDialog', 'Alternate')]) - self.shortcutButtonLabel.setText( + self.primaryPushButton.setText( translate('OpenLP.ShortcutListDialog', 'Capture shortcut:')) - self.clearShortcutButton.setToolTip( - translate('OpenLP.ShortcutListDialog', - 'Restore the default shortcut(s) of this action.')) + self.alternatePushButton.setText( + translate('OpenLP.ShortcutListDialog', 'Capture shortcut:')) + #self.clearShortcutButton.setToolTip( + #translate('OpenLP.ShortcutListDialog', + #'Restore the default shortcut(s) of this action.')) diff --git a/openlp/core/ui/shortcutlistform.py b/openlp/core/ui/shortcutlistform.py index a99b7c3bb..00e216c2a 100644 --- a/openlp/core/ui/shortcutlistform.py +++ b/openlp/core/ui/shortcutlistform.py @@ -47,24 +47,28 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): self.setupUi(self) self.column = -1 self.changedActions = {} - self.shortcutButton.setText(u'') - self.shortcutButton.setEnabled(False) - QtCore.QObject.connect(self.shortcutButton, - QtCore.SIGNAL(u'toggled(bool)'), self.onShortcutButtonClicked) + self.primaryPushButton.setText(u'') + self.alternatePushButton.setText(u'') + self.primaryPushButton.setEnabled(False) + self.alternatePushButton.setEnabled(False) + QtCore.QObject.connect(self.primaryPushButton, + QtCore.SIGNAL(u'toggled(bool)'), self.onPrimaryPushButtonClicked) QtCore.QObject.connect(self.treeWidget, QtCore.SIGNAL(u'itemPressed(QTreeWidgetItem*, int)'), self.onItemPressed) QtCore.QObject.connect(self.treeWidget, QtCore.SIGNAL(u'itemDoubleClicked(QTreeWidgetItem*, int)'), self.onItemDoubleClicked) - QtCore.QObject.connect(self.clearShortcutButton, - QtCore.SIGNAL(u'clicked(bool)'), self.onClearShortcutButtonClicked) + QtCore.QObject.connect(self.clearPrimaryButton, + QtCore.SIGNAL(u'clicked(bool)'), self.onClearPrimaryButtonClicked) +# QtCore.QObject.connect(self.clearShortcutButton, +# QtCore.SIGNAL(u'clicked(bool)'), self.onClearPrimaryButtonClicked) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'clicked(QAbstractButton*)'), self.onRestoreDefaultsClicked) def keyPressEvent(self, event): - if self.shortcutButton.isChecked(): + if self.primaryPushButton.isChecked(): event.ignore() elif event.key() == QtCore.Qt.Key_Escape: event.accept() @@ -72,7 +76,7 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): def keyReleaseEvent(self, event): Qt = QtCore.Qt - if not self.shortcutButton.isChecked(): + if not self.primaryPushButton.isChecked(): return key = event.key() if key == Qt.Key_Shift or key == Qt.Key_Control or \ @@ -117,15 +121,15 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): QtGui.QMessageBox.Ok ) else: - self.shortcutButton.setText(key_sequence.toString()) - self.shortcutButton.setChecked(False) + self.primaryPushButton.setText(key_sequence.toString()) + self.primaryPushButton.setChecked(False) def exec_(self): self.changedActions = {} self.reloadShortcutList() - self.shortcutButton.setChecked(False) - self.shortcutButton.setEnabled(False) - self.shortcutButton.setText(u'') + self.primaryPushButton.setChecked(False) + self.primaryPushButton.setEnabled(False) + self.primaryPushButton.setText(u'') return QtGui.QDialog.exec_(self) def reloadShortcutList(self): @@ -172,7 +176,7 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): item.setText(1, shortcuts[0].toString()) item.setText(2, shortcuts[1].toString()) - def onShortcutButtonClicked(self, toggled): + def onPrimaryPushButtonClicked(self, toggled): """ Save the new shortcut to the action if the button is unchanged. """ @@ -188,14 +192,16 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): new_shortcuts = [] # We are changing the primary shortcut. if self.column in [0, 1]: - new_shortcuts.append(QtGui.QKeySequence(self.shortcutButton.text())) + new_shortcuts.append( + QtGui.QKeySequence(self.primaryPushButton.text())) if len(shortcuts) == 2: new_shortcuts.append(shortcuts[1]) # We are changing the secondary shortcut. elif self.column == 2: if len(shortcuts) != 0: new_shortcuts.append(shortcuts[0]) - new_shortcuts.append(QtGui.QKeySequence(self.shortcutButton.text())) + new_shortcuts.append( + QtGui.QKeySequence(self.primaryPushButton.text())) else: return self.changedActions[action] = new_shortcuts @@ -203,14 +209,14 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): def onItemDoubleClicked(self, item, column): """ - A item has been double clicked. ``The shortcutButton`` will be checked - and the item's shortcut will be displayed. + A item has been double clicked. ``The primaryPushButton`` will be + checked and the item's shortcut will be displayed. """ action = item.data(0, QtCore.Qt.UserRole).toPyObject() if action is None: return - self.shortcutButton.setChecked(True) - self.shortcutButton.setFocus(QtCore.Qt.OtherFocusReason) + self.primaryPushButton.setChecked(True) + self.primaryPushButton.setFocus(QtCore.Qt.OtherFocusReason) self.onItemPressed(item, column) def onItemPressed(self, item, column): @@ -222,23 +228,23 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): action = item.data(0, QtCore.Qt.UserRole).toPyObject() text = u'' if action is None: - self.shortcutButton.setChecked(False) - self.shortcutButton.setEnabled(False) + self.primaryPushButton.setChecked(False) + self.primaryPushButton.setEnabled(False) else: - self.shortcutButton.setEnabled(True) + self.primaryPushButton.setEnabled(True) shortcuts = self._actionShortcuts(action) if column != 2 and len(shortcuts) != 0: text = shortcuts[0].toString() elif len(shortcuts) == 2: text = shortcuts[1].toString() - self.shortcutButton.setText(text) + self.primaryPushButton.setText(text) - def onClearShortcutButtonClicked(self, toggled): + def onClearPrimaryButtonClicked(self, toggled): """ Restore the defaults of this """ item = self.treeWidget.currentItem() - self.shortcutButton.setChecked(False) + self.primaryPushButton.setChecked(False) if item is None: return action = item.data(0, QtCore.Qt.UserRole).toPyObject() @@ -261,8 +267,8 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)) == QtGui.QMessageBox.No: return - self.shortcutButton.setChecked(False) - self.shortcutButton.setText(u'') + self.primaryPushButton.setChecked(False) + self.primaryPushButton.setText(u'') for category in ActionList.categories: for action in category.actions: self.changedActions[action] = action.defaultShortcuts diff --git a/resources/forms/shortcutlistdialog.ui b/resources/forms/shortcutlistdialog.ui index 519925560..9a5c599d1 100644 --- a/resources/forms/shortcutlistdialog.ui +++ b/resources/forms/shortcutlistdialog.ui @@ -41,35 +41,35 @@ - + + + 0 + 8 - - 0 - - + - Default: None + Default: true - - + + + + Custom: + + + + + 8 - - - - Custom: - - - @@ -83,7 +83,7 @@ - :/system/system_settings.png:/system/system_settings.png + :/system/system_configure_shortcuts.png:/system/system_configure_shortcuts.png true @@ -110,21 +110,51 @@ + + + + + + 8 + - - - Qt::Horizontal + + + None - - - 40 - 20 - + + + :/system/system_configure_shortcuts.png:/system/system_configure_shortcuts.png - + + + + + + + + + + :/system/clear_shortcut.png:/system/clear_shortcut.png + + + + + + Ctrl+V + + + + + + + Shift+Ins + + + From dab699371cea47a8cbc2f6fb4ec9c926e4ac195c Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 7 Apr 2011 17:37:07 +0200 Subject: [PATCH 32/89] integrated second button(s), clean ups --- openlp/core/ui/shortcutlistdialog.py | 74 +++++------ openlp/core/ui/shortcutlistform.py | 175 +++++++++++++++++---------- 2 files changed, 150 insertions(+), 99 deletions(-) diff --git a/openlp/core/ui/shortcutlistdialog.py b/openlp/core/ui/shortcutlistdialog.py index 6531a1a19..b5dffd936 100644 --- a/openlp/core/ui/shortcutlistdialog.py +++ b/openlp/core/ui/shortcutlistdialog.py @@ -30,70 +30,67 @@ from openlp.core.lib import translate, build_icon class Ui_ShortcutListDialog(object): def setupUi(self, shortcutListDialog): - shortcutListDialog.setObjectName("shortcutListDialog") + shortcutListDialog.setObjectName(u'shortcutListDialog') shortcutListDialog.resize(500, 438) self.shortcutListLayout = QtGui.QVBoxLayout(shortcutListDialog) - self.shortcutListLayout.setSpacing(8) - self.shortcutListLayout.setMargin(8) - self.shortcutListLayout.setObjectName("shortcutListLayout") + self.shortcutListLayout.setObjectName(u'shortcutListLayout') self.treeWidget = QtGui.QTreeWidget(shortcutListDialog) + self.treeWidget.setObjectName(u'treeWidget') self.treeWidget.setAlternatingRowColors(True) - self.treeWidget.setObjectName("treeWidget") self.treeWidget.setColumnCount(3) self.shortcutListLayout.addWidget(self.treeWidget) self.detailsLayout = QtGui.QGridLayout() - self.detailsLayout.setSpacing(8) + self.detailsLayout.setObjectName(u'detailsLayout') self.detailsLayout.setContentsMargins(-1, 0, -1, -1) - self.detailsLayout.setObjectName("detailsLayout") self.defaultRadioButton = QtGui.QRadioButton(shortcutListDialog) + self.defaultRadioButton.setObjectName(u'defaultRadioButton') self.defaultRadioButton.setChecked(True) - self.defaultRadioButton.setObjectName("defaultRadioButton") self.detailsLayout.addWidget(self.defaultRadioButton, 0, 0, 1, 1) self.customRadioButton = QtGui.QRadioButton(shortcutListDialog) - self.customRadioButton.setObjectName("customRadioButton") + self.customRadioButton.setObjectName(u'customRadioButton') self.detailsLayout.addWidget(self.customRadioButton, 1, 0, 1, 1) self.primaryLayout = QtGui.QHBoxLayout() - self.primaryLayout.setSpacing(8) - self.primaryLayout.setObjectName("primaryLayout") + self.primaryLayout.setObjectName(u'primaryLayout') self.primaryPushButton = QtGui.QPushButton(shortcutListDialog) + self.primaryPushButton.setObjectName(u'primaryPushButton') self.primaryPushButton.setMinimumSize(QtCore.QSize(84, 0)) - self.primaryPushButton.setIcon(build_icon(u':/system/system_configure_shortcuts.png')) + self.primaryPushButton.setIcon( + build_icon(u':/system/system_configure_shortcuts.png')) self.primaryPushButton.setCheckable(True) - self.primaryPushButton.setChecked(False) - self.primaryPushButton.setObjectName("primaryPushButton") self.primaryLayout.addWidget(self.primaryPushButton) self.clearPrimaryButton = QtGui.QToolButton(shortcutListDialog) + self.clearPrimaryButton.setObjectName(u'clearPrimaryButton') self.clearPrimaryButton.setMinimumSize(QtCore.QSize(0, 16)) - self.clearPrimaryButton.setText("") - self.clearPrimaryButton.setIcon(build_icon(u':/system/clear_shortcut.png')) - self.clearPrimaryButton.setObjectName("clearPrimaryButton") + self.clearPrimaryButton.setIcon( + build_icon(u':/system/clear_shortcut.png')) self.primaryLayout.addWidget(self.clearPrimaryButton) self.detailsLayout.addLayout(self.primaryLayout, 1, 1, 1, 1) self.alternateLayout = QtGui.QHBoxLayout() - self.alternateLayout.setSpacing(8) - self.alternateLayout.setObjectName("alternateLayout") + self.alternateLayout.setObjectName(u'alternateLayout') self.alternatePushButton = QtGui.QPushButton(shortcutListDialog) - self.alternatePushButton.setIcon(build_icon(u':/system/system_configure_shortcuts.png')) - self.alternatePushButton.setObjectName("alternatePushButton") + self.alternatePushButton.setObjectName(u'alternatePushButton') + self.alternatePushButton.setCheckable(True) + self.alternatePushButton.setIcon( + build_icon(u':/system/system_configure_shortcuts.png')) self.alternateLayout.addWidget(self.alternatePushButton) self.clearAlternateButton = QtGui.QToolButton(shortcutListDialog) - self.clearAlternateButton.setText("") - self.clearAlternateButton.setIcon(build_icon(u':/system/clear_shortcut.png')) - self.clearAlternateButton.setObjectName("clearAlternateButton") + self.clearAlternateButton.setObjectName(u'clearAlternateButton') + self.clearAlternateButton.setIcon( + build_icon(u':/system/clear_shortcut.png')) self.alternateLayout.addWidget(self.clearAlternateButton) self.detailsLayout.addLayout(self.alternateLayout, 1, 2, 1, 1) self.primaryLabel = QtGui.QLabel(shortcutListDialog) - self.primaryLabel.setObjectName("primaryLabel") + self.primaryLabel.setObjectName(u'primaryLabel') self.detailsLayout.addWidget(self.primaryLabel, 0, 1, 1, 1) self.alternateLabel = QtGui.QLabel(shortcutListDialog) - self.alternateLabel.setObjectName("alternateLabel") + self.alternateLabel.setObjectName(u'alternateLabel') self.detailsLayout.addWidget(self.alternateLabel, 0, 2, 1, 1) self.shortcutListLayout.addLayout(self.detailsLayout) self.buttonBox = QtGui.QDialogButtonBox(shortcutListDialog) + self.buttonBox.setObjectName(u'buttonBox') self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel | - QtGui.QDialogButtonBox.Ok|QtGui.QDialogButtonBox.Reset) - self.buttonBox.setObjectName("buttonBox") + QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.RestoreDefaults) self.shortcutListLayout.addWidget(self.buttonBox) self.retranslateUi(shortcutListDialog) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'accepted()'), @@ -112,10 +109,17 @@ class Ui_ShortcutListDialog(object): translate('OpenLP.ShortcutListDialog', 'Action'), translate('OpenLP.ShortcutListDialog', 'Shortcut'), translate('OpenLP.ShortcutListDialog', 'Alternate')]) - self.primaryPushButton.setText( - translate('OpenLP.ShortcutListDialog', 'Capture shortcut:')) - self.alternatePushButton.setText( - translate('OpenLP.ShortcutListDialog', 'Capture shortcut:')) - #self.clearShortcutButton.setToolTip( - #translate('OpenLP.ShortcutListDialog', - #'Restore the default shortcut(s) of this action.')) + self.defaultRadioButton.setText( + translate('OpenLP.ShortcutListDialog', 'Default')) + self.customRadioButton.setText( + translate('OpenLP.ShortcutListDialog', 'Custom')) + self.primaryPushButton.setToolTip( + translate('OpenLP.ShortcutListDialog', 'Capture shortcut.')) + self.alternatePushButton.setToolTip( + translate('OpenLP.ShortcutListDialog', 'Capture shortcut.')) + self.clearPrimaryButton.setToolTip( + translate('OpenLP.ShortcutListDialog', + 'Restore the default shortcut(s) of this action.')) + self.clearAlternateButton.setToolTip( + translate('OpenLP.ShortcutListDialog', + 'Restore the default shortcut(s) of this action.')) diff --git a/openlp/core/ui/shortcutlistform.py b/openlp/core/ui/shortcutlistform.py index 00e216c2a..cda8cfc5d 100644 --- a/openlp/core/ui/shortcutlistform.py +++ b/openlp/core/ui/shortcutlistform.py @@ -45,14 +45,11 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): def __init__(self, parent=None): QtGui.QDialog.__init__(self, parent) self.setupUi(self) - self.column = -1 self.changedActions = {} - self.primaryPushButton.setText(u'') - self.alternatePushButton.setText(u'') - self.primaryPushButton.setEnabled(False) - self.alternatePushButton.setEnabled(False) QtCore.QObject.connect(self.primaryPushButton, QtCore.SIGNAL(u'toggled(bool)'), self.onPrimaryPushButtonClicked) + QtCore.QObject.connect(self.alternatePushButton, + QtCore.SIGNAL(u'toggled(bool)'), self.onAlternatePushButtonClicked) QtCore.QObject.connect(self.treeWidget, QtCore.SIGNAL(u'itemPressed(QTreeWidgetItem*, int)'), self.onItemPressed) @@ -61,14 +58,15 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): self.onItemDoubleClicked) QtCore.QObject.connect(self.clearPrimaryButton, QtCore.SIGNAL(u'clicked(bool)'), self.onClearPrimaryButtonClicked) -# QtCore.QObject.connect(self.clearShortcutButton, -# QtCore.SIGNAL(u'clicked(bool)'), self.onClearPrimaryButtonClicked) + QtCore.QObject.connect(self.clearAlternateButton, + QtCore.SIGNAL(u'clicked(bool)'), self.onClearAlternateButtonClicked) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'clicked(QAbstractButton*)'), self.onRestoreDefaultsClicked) def keyPressEvent(self, event): - if self.primaryPushButton.isChecked(): + if self.primaryPushButton.isChecked() or \ + self.alternatePushButton.isChecked(): event.ignore() elif event.key() == QtCore.Qt.Key_Escape: event.accept() @@ -76,7 +74,8 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): def keyReleaseEvent(self, event): Qt = QtCore.Qt - if not self.primaryPushButton.isChecked(): + if not self.primaryPushButton.isChecked() and \ + not self.alternatePushButton.isChecked(): return key = event.key() if key == Qt.Key_Shift or key == Qt.Key_Control or \ @@ -90,9 +89,8 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): if event.modifiers() & Qt.ShiftModifier == Qt.ShiftModifier: key_string = u'Shift+' + key_string key_sequence = QtGui.QKeySequence(key_string) - # The item/action we are attempting to change. - changing_item = self.treeWidget.currentItem() - changing_action = changing_item.data(0, QtCore.Qt.UserRole).toPyObject() + # The action we are attempting to change. + changing_action = self._currentItemAction() shortcut_valid = True for category in ActionList.categories: for action in category.actions: @@ -100,11 +98,18 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): if key_sequence not in shortcuts: continue if action is changing_action: - continue - # Have the same parentWidget, thus they cannot have the same - # shortcut. + if self.primaryPushButton.isChecked() and \ + shortcuts.index(key_sequence) == 0: + continue + if self.alternatePushButton.isChecked() and \ + shortcuts.index(key_sequence) == 1: + continue + # Have the same parent, thus they cannot have the same shortcut. if action.parent() is changing_action.parent(): shortcut_valid = False + # The new shortcut is already assigned, but if both shortcuts + # are only valid in a different widget the new shortcut is + # vaild, because they will not interfere. if action.shortcutContext() in [QtCore.Qt.WindowShortcut, QtCore.Qt.ApplicationShortcut]: shortcut_valid = False @@ -121,8 +126,12 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): QtGui.QMessageBox.Ok ) else: - self.primaryPushButton.setText(key_sequence.toString()) - self.primaryPushButton.setChecked(False) + if self.primaryPushButton.isChecked(): + self.primaryPushButton.setText(key_sequence.toString()) + self.primaryPushButton.setChecked(False) + elif self.alternatePushButton.isChecked(): + self.alternatePushButton.setText(key_sequence.toString()) + self.alternatePushButton.setChecked(False) def exec_(self): self.changedActions = {} @@ -130,6 +139,9 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): self.primaryPushButton.setChecked(False) self.primaryPushButton.setEnabled(False) self.primaryPushButton.setText(u'') + self.alternatePushButton.setChecked(False) + self.alternatePushButton.setEnabled(False) + self.alternatePushButton.setText(u'') return QtGui.QDialog.exec_(self) def reloadShortcutList(self): @@ -162,7 +174,7 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): while iterator.value(): item = iterator.value() iterator += 1 - action = item.data(0, QtCore.Qt.UserRole).toPyObject() + action = self._currentItemAction(item) if action is None: continue shortcuts = self._actionShortcuts(action) @@ -181,29 +193,35 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): Save the new shortcut to the action if the button is unchanged. """ if toggled: + self.alternatePushButton.setChecked(False) return - item = self.treeWidget.currentItem() - if item is None: - return - action = item.data(0, QtCore.Qt.UserRole).toPyObject() + action = self._currentItemAction() if action is None: return shortcuts = self._actionShortcuts(action) new_shortcuts = [] - # We are changing the primary shortcut. - if self.column in [0, 1]: - new_shortcuts.append( - QtGui.QKeySequence(self.primaryPushButton.text())) - if len(shortcuts) == 2: - new_shortcuts.append(shortcuts[1]) - # We are changing the secondary shortcut. - elif self.column == 2: - if len(shortcuts) != 0: - new_shortcuts.append(shortcuts[0]) - new_shortcuts.append( - QtGui.QKeySequence(self.primaryPushButton.text())) - else: + new_shortcuts.append( + QtGui.QKeySequence(self.primaryPushButton.text())) + if len(shortcuts) == 2: + new_shortcuts.append(shortcuts[1]) + self.changedActions[action] = new_shortcuts + self.refreshShortcutList() + + def onAlternatePushButtonClicked(self, toggled): + """ + """ + if toggled: + self.primaryPushButton.setChecked(False) return + action = self._currentItemAction() + if action is None: + return + shortcuts = self._actionShortcuts(action) + new_shortcuts = [] + if len(shortcuts) != 0: + new_shortcuts.append(shortcuts[0]) + new_shortcuts.append( + QtGui.QKeySequence(self.alternatePushButton.text())) self.changedActions[action] = new_shortcuts self.refreshShortcutList() @@ -212,47 +230,39 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): A item has been double clicked. ``The primaryPushButton`` will be checked and the item's shortcut will be displayed. """ - action = item.data(0, QtCore.Qt.UserRole).toPyObject() + action = self._currentItemAction(item) if action is None: return - self.primaryPushButton.setChecked(True) - self.primaryPushButton.setFocus(QtCore.Qt.OtherFocusReason) - self.onItemPressed(item, column) + self.primaryPushButton.setChecked(column in [0, 1]) + self.alternatePushButton.setChecked(column not in [0, 1]) + if column in [0, 1]: + self.primaryPushButton.setFocus(QtCore.Qt.OtherFocusReason) + else: + self.alternatePushButton.setFocus(QtCore.Qt.OtherFocusReason) + self.onItemPressed() - def onItemPressed(self, item, column): + def onItemPressed(self, item=None, column=-1): """ A item has been pressed. We adjust the button's text to the action's shortcut which is encapsulate in the item. """ - self.column = column - action = item.data(0, QtCore.Qt.UserRole).toPyObject() - text = u'' + action = self._currentItemAction(item) + self.primaryPushButton.setEnabled(action is not None) + self.alternatePushButton.setEnabled(action is not None) + primary_text = u'' + alternate_text = u'' if action is None: self.primaryPushButton.setChecked(False) - self.primaryPushButton.setEnabled(False) + self.alternatePushButton.setChecked(False) else: - self.primaryPushButton.setEnabled(True) shortcuts = self._actionShortcuts(action) - if column != 2 and len(shortcuts) != 0: - text = shortcuts[0].toString() + if len(shortcuts) == 1: + primary_text = shortcuts[0].toString() elif len(shortcuts) == 2: - text = shortcuts[1].toString() - self.primaryPushButton.setText(text) - - def onClearPrimaryButtonClicked(self, toggled): - """ - Restore the defaults of this - """ - item = self.treeWidget.currentItem() - self.primaryPushButton.setChecked(False) - if item is None: - return - action = item.data(0, QtCore.Qt.UserRole).toPyObject() - if action is None: - return - self.changedActions[action] = action.defaultShortcuts - self.refreshShortcutList() - self.onItemPressed(item, self.column) + primary_text = shortcuts[0].toString() + alternate_text = shortcuts[1].toString() + self.primaryPushButton.setText(primary_text) + self.alternatePushButton.setText(alternate_text) def onRestoreDefaultsClicked(self, button): """ @@ -269,6 +279,8 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): return self.primaryPushButton.setChecked(False) self.primaryPushButton.setText(u'') + self.alternatePushButton.setChecked(False) + self.alternatePushButton.setText(u'') for category in ActionList.categories: for action in category.actions: self.changedActions[action] = action.defaultShortcuts @@ -292,6 +304,30 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): action.objectName(), QtCore.QVariant(action.shortcuts())) settings.endGroup() + def onClearPrimaryButtonClicked(self, toggled): + """ + Restore the defaults of this action. + """ + self._clearButtonClicked(self.primaryPushButton) + + def onClearAlternateButtonClicked(self, toggled): + """ + Restore the defaults of this action. + """ + self._clearButtonClicked(self.alternatePushButton) + + def _clearButtonClicked(self, button): + """ + Restore the defaults of this action. The given button will be unchecked. + """ + button.setChecked(False) + action = self._currentItemAction() + if action is None: + return + self.changedActions[action] = action.defaultShortcuts + self.refreshShortcutList() + self.onItemPressed() + def _actionShortcuts(self, action): """ This returns the shortcuts for the given ``action``, which also includes @@ -301,3 +337,14 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): if self.changedActions.has_key(action): return self.changedActions[action] return action.shortcuts() + + def _currentItemAction(self, item=None): + """ + Returns the action of the current item if no item is given, otherwise + we return the action of the given item. + """ + if item is None: + item = self.treeWidget.currentItem() + if item is None: + return + return item.data(0, QtCore.Qt.UserRole).toPyObject() From 37583022bf3f806a22fa58ae4271915ca2aa5eee Mon Sep 17 00:00:00 2001 From: Wesley Stout Date: Thu, 7 Apr 2011 13:29:36 -0500 Subject: [PATCH 33/89] corrections to troubleshooting.rst --- documentation/manual/source/troubleshooting.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/manual/source/troubleshooting.rst b/documentation/manual/source/troubleshooting.rst index 60e1a2f10..a14e95867 100644 --- a/documentation/manual/source/troubleshooting.rst +++ b/documentation/manual/source/troubleshooting.rst @@ -173,4 +173,4 @@ I chose to use a web Bible but it did not download the entire Bible Due to copyright restrictions OpenLP cannot download an entire Bible. It can only download the section you search for. If you do not have an internet connection where you intend to use OpenLP you will need another scripture -source. For more information about acquiring bibles please see :ref:`bibleimporter`. \ No newline at end of file +source. For more information about acquiring Bibles please see :ref:`bibleimporter`. From 9211efd91d7f9d593b229874f5b67872df91997c Mon Sep 17 00:00:00 2001 From: Wesley Stout Date: Thu, 7 Apr 2011 14:36:50 -0500 Subject: [PATCH 34/89] further corrections --- documentation/manual/source/faq.rst | 31 +------------------ .../manual/source/troubleshooting.rst | 1 + 2 files changed, 2 insertions(+), 30 deletions(-) diff --git a/documentation/manual/source/faq.rst b/documentation/manual/source/faq.rst index 4cf511d74..abba7a553 100644 --- a/documentation/manual/source/faq.rst +++ b/documentation/manual/source/faq.rst @@ -5,35 +5,6 @@ Frequently Asked Questions General Questions ================= -What is OpenLP? ---------------- - -OpenLP stands for "Open Source Lyrics Projection" and is presentation software -developed for churches to provide a single easy to use interface for the -projection needs of a typical worship service. First created in 2004, it has -steadily grown in features and maturity such that it is now a mainstay in -hundreds of churches around the world. - -OpenLP has searchable databases of songs and Bible verses allowing them to be -projected instantly or saved in a pre-prepared order of service file. Themes -allow for a variety of presentation options and allow you to add attractive -visuals to enhance your presentations. PowerPoint and OpenOffice presentations, -videos and audio files can be run from within the program removing the need to -switch between different programs. Alert messages can be displayed so the -nursery or car park stewards can notify the congregation easily. Remote -capability allows the worship leader to change songs, or for alert messages to -be sent from anywhere on the network, even via a smart phone or tablet. - -Being free, this software can be installed on as many PCs as required, -including the home PCs of worship leader(s) at no additional cost. Compared to -the expensive site licenses and restrictions of commercial software we believe -OpenLP is the perfect choice for quality and value. Still in active development -by a growing team of enthusiastic developers, features are being added all the -time resulting in continual improvement of the software. - -OpenLP is licensed under the GNU Generic Public License, which means -that it is free to use, distribute, modify, and it stays free. - When is the release date for OpenLP 2.0? ---------------------------------------- @@ -598,4 +569,4 @@ First of all check it isn't on the `Feature Requests `_ -and post the idea there. \ No newline at end of file +and post the idea there. diff --git a/documentation/manual/source/troubleshooting.rst b/documentation/manual/source/troubleshooting.rst index a14e95867..1d200ed8e 100644 --- a/documentation/manual/source/troubleshooting.rst +++ b/documentation/manual/source/troubleshooting.rst @@ -174,3 +174,4 @@ Due to copyright restrictions OpenLP cannot download an entire Bible. It can only download the section you search for. If you do not have an internet connection where you intend to use OpenLP you will need another scripture source. For more information about acquiring Bibles please see :ref:`bibleimporter`. + From 78a9c89025d09cb4fbca38ae5a75266d6dff74e2 Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Thu, 7 Apr 2011 23:57:12 +0100 Subject: [PATCH 35/89] Fix stuttering powerpoint start --- openlp/core/ui/slidecontroller.py | 6 +++--- .../plugins/presentations/lib/messagelistener.py | 14 +++++++++----- .../presentations/lib/powerpointcontroller.py | 11 +++++------ 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index eec5d3a19..ccdb1f17c 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -646,7 +646,7 @@ class SlideController(QtGui.QWidget): self.display.buildHtml(self.serviceItem) if serviceItem.is_media(): self.onMediaStart(serviceItem) - self.onSlideSelected() + self.onSlideSelected(True) self.previewListWidget.setFocus() Receiver.send_message(u'slidecontroller_%s_started' % self.typePrefix, [serviceItem]) @@ -833,7 +833,7 @@ class SlideController(QtGui.QWidget): % self.serviceItem.name.lower(), [self.serviceItem, self.isLive]) - def onSlideSelected(self): + def onSlideSelected(self, start=False): """ Generate the preview when you click on a slide. if this is the Live Controller also display on the screen @@ -842,7 +842,7 @@ class SlideController(QtGui.QWidget): self.selectedRow = 0 if row > -1 and row < self.previewListWidget.rowCount(): if self.serviceItem.is_command(): - if self.isLive: + if self.isLive and not start: Receiver.send_message( u'%s_slide' % self.serviceItem.name.lower(), [self.serviceItem, self.isLive, row]) diff --git a/openlp/plugins/presentations/lib/messagelistener.py b/openlp/plugins/presentations/lib/messagelistener.py index 728a154f8..4f9268b3e 100644 --- a/openlp/plugins/presentations/lib/messagelistener.py +++ b/openlp/plugins/presentations/lib/messagelistener.py @@ -49,7 +49,7 @@ class Controller(object): self.doc = None log.info(u'%s controller loaded' % live) - def add_handler(self, controller, file, hide_mode): + def add_handler(self, controller, file, hide_mode, slide_no): """ Add a handler, which is an instance of a presentation and slidecontroller combination. If the slidecontroller has a display @@ -64,8 +64,8 @@ class Controller(object): # Display error message to user # Inform slidecontroller that the action failed? return + self.doc.slidenumber = slide_no if self.is_live: - self.doc.start_presentation() if hide_mode == HideMode.Screen: Receiver.send_message(u'maindisplay_hide', HideMode.Screen) self.stop() @@ -73,11 +73,14 @@ class Controller(object): Receiver.send_message(u'maindisplay_hide', HideMode.Theme) self.blank() elif hide_mode == HideMode.Blank: - Receiver.send_message(u'maindisplay_hide', HideMode.Screen) + Receiver.send_message(u'maindisplay_hide', HideMode.Blank) self.blank() else: + self.doc.start_presentation() Receiver.send_message(u'maindisplay_hide', HideMode.Screen) - self.doc.slidenumber = 0 + self.doc.slidenumber = 0 + if slide_no > 1: + self.slide(slide_no) def activate(self): """ @@ -281,7 +284,8 @@ class MessageListener(object): controller = self.live_handler else: controller = self.preview_handler - controller.add_handler(self.controllers[self.handler], file, hide_mode) + controller.add_handler(self.controllers[self.handler], file, hide_mode, + message[3]) def slide(self, message): """ diff --git a/openlp/plugins/presentations/lib/powerpointcontroller.py b/openlp/plugins/presentations/lib/powerpointcontroller.py index 793b0b75d..a02bc841a 100644 --- a/openlp/plugins/presentations/lib/powerpointcontroller.py +++ b/openlp/plugins/presentations/lib/powerpointcontroller.py @@ -251,14 +251,13 @@ class PowerpointDocument(PresentationDocument): win32ui.GetForegroundWindow().GetDC().GetDeviceCaps(88) except win32ui.error: dpi = 96 - self.presentation.SlideShowSettings.Run() - self.presentation.SlideShowWindow.View.GotoSlide(1) rendermanager = self.controller.plugin.renderManager rect = rendermanager.screens.current[u'size'] - self.presentation.SlideShowWindow.Top = rect.y() * 72 / dpi - self.presentation.SlideShowWindow.Height = rect.height() * 72 / dpi - self.presentation.SlideShowWindow.Left = rect.x() * 72 / dpi - self.presentation.SlideShowWindow.Width = rect.width() * 72 / dpi + ppt_window = self.presentation.SlideShowSettings.Run() + ppt_window.Top = rect.y() * 72 / dpi + ppt_window.Height = rect.height() * 72 / dpi + ppt_window.Left = rect.x() * 72 / dpi + ppt_window.Width = rect.width() * 72 / dpi def get_slide_number(self): """ From ea5e0d65cc5209db530012416f867e1920d8d879 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 8 Apr 2011 08:25:02 +0200 Subject: [PATCH 36/89] --- openlp/core/ui/shortcutlistdialog.py | 4 +- openlp/core/ui/shortcutlistform.py | 68 ++++++++++++++++++---------- 2 files changed, 45 insertions(+), 27 deletions(-) diff --git a/openlp/core/ui/shortcutlistdialog.py b/openlp/core/ui/shortcutlistdialog.py index b5dffd936..a5050ab25 100644 --- a/openlp/core/ui/shortcutlistdialog.py +++ b/openlp/core/ui/shortcutlistdialog.py @@ -119,7 +119,7 @@ class Ui_ShortcutListDialog(object): translate('OpenLP.ShortcutListDialog', 'Capture shortcut.')) self.clearPrimaryButton.setToolTip( translate('OpenLP.ShortcutListDialog', - 'Restore the default shortcut(s) of this action.')) + 'Restore the default shortcut of this action.')) self.clearAlternateButton.setToolTip( translate('OpenLP.ShortcutListDialog', - 'Restore the default shortcut(s) of this action.')) + 'Restore the default shortcut of this action.')) diff --git a/openlp/core/ui/shortcutlistform.py b/openlp/core/ui/shortcutlistform.py index cda8cfc5d..9b20fd9d2 100644 --- a/openlp/core/ui/shortcutlistform.py +++ b/openlp/core/ui/shortcutlistform.py @@ -127,21 +127,17 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): ) else: if self.primaryPushButton.isChecked(): - self.primaryPushButton.setText(key_sequence.toString()) - self.primaryPushButton.setChecked(False) + self._adjustButton(self.primaryPushButton, + checked=False, text=key_sequence.toString()) elif self.alternatePushButton.isChecked(): - self.alternatePushButton.setText(key_sequence.toString()) - self.alternatePushButton.setChecked(False) + self._adjustButton(self.alternatePushButton, + checked=False, text=key_sequence.toString()) def exec_(self): self.changedActions = {} self.reloadShortcutList() - self.primaryPushButton.setChecked(False) - self.primaryPushButton.setEnabled(False) - self.primaryPushButton.setText(u'') - self.alternatePushButton.setChecked(False) - self.alternatePushButton.setEnabled(False) - self.alternatePushButton.setText(u'') + self._adjustButton(self.primaryPushButton, False, False, u'') + self._adjustButton(self.alternatePushButton, False, False, u'') return QtGui.QDialog.exec_(self) def reloadShortcutList(self): @@ -227,7 +223,7 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): def onItemDoubleClicked(self, item, column): """ - A item has been double clicked. ``The primaryPushButton`` will be + A item has been double clicked. The ``primaryPushButton`` will be checked and the item's shortcut will be displayed. """ action = self._currentItemAction(item) @@ -251,18 +247,30 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): self.alternatePushButton.setEnabled(action is not None) primary_text = u'' alternate_text = u'' + primary_label_text = u'' + alternate_label_text = u'' if action is None: self.primaryPushButton.setChecked(False) self.alternatePushButton.setChecked(False) else: + if len(action.defaultShortcuts) != 0: + primary_label_text = action.defaultShortcuts[0].toString() + if len(action.defaultShortcuts) == 2: + alternate_label_text = action.defaultShortcuts[1].toString() shortcuts = self._actionShortcuts(action) - if len(shortcuts) == 1: - primary_text = shortcuts[0].toString() - elif len(shortcuts) == 2: - primary_text = shortcuts[0].toString() - alternate_text = shortcuts[1].toString() + if shortcuts != action.defaultShortcuts: + self.customRadioButton.setChecked(True) + if len(shortcuts) == 1: + primary_text = shortcuts[0].toString() + elif len(shortcuts) == 2: + primary_text = shortcuts[0].toString() + alternate_text = shortcuts[1].toString() + else: + self.defaultRadioButton.setChecked(True) self.primaryPushButton.setText(primary_text) self.alternatePushButton.setText(alternate_text) + self.primaryLabel.setText(primary_label_text) + self.alternateLabel.setText(alternate_label_text) def onRestoreDefaultsClicked(self, button): """ @@ -277,10 +285,8 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)) == QtGui.QMessageBox.No: return - self.primaryPushButton.setChecked(False) - self.primaryPushButton.setText(u'') - self.alternatePushButton.setChecked(False) - self.alternatePushButton.setText(u'') + self._adjustButton(self.primaryPushButton, False, text=u'') + self._adjustButton(self.alternatePushButton, False, text=u'') for category in ActionList.categories: for action in category.actions: self.changedActions[action] = action.defaultShortcuts @@ -318,7 +324,8 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): def _clearButtonClicked(self, button): """ - Restore the defaults of this action. The given button will be unchecked. + Restore the defaults of this action. The given ``button`` will be + unchecked. """ button.setChecked(False) action = self._currentItemAction() @@ -331,8 +338,8 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): def _actionShortcuts(self, action): """ This returns the shortcuts for the given ``action``, which also includes - those shortcuts which are not yet assigned to an action (as changes are - applied when closing the dialog). + those shortcuts which are not saved yet but already assigned (as changes + are applied when closing the dialog). """ if self.changedActions.has_key(action): return self.changedActions[action] @@ -340,11 +347,22 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): def _currentItemAction(self, item=None): """ - Returns the action of the current item if no item is given, otherwise - we return the action of the given item. + Returns the action of the given ``item``. If no item is given, we return + the action of the current item of the ``treeWidget``. """ if item is None: item = self.treeWidget.currentItem() if item is None: return return item.data(0, QtCore.Qt.UserRole).toPyObject() + + def _adjustButton(self, button, checked=None, enabled=None, text=None): + """ + Can be called to adjust more properties of the given ``button`` at once. + """ + if checked is not None: + button.setChecked(checked) + if enabled is not None: + button.setEnabled(enabled) + if text is not None: + button.setText(text) From 6d712bd2770ce054c506b132dc320180eed889c2 Mon Sep 17 00:00:00 2001 From: Wesley Stout Date: Fri, 8 Apr 2011 22:20:17 -0500 Subject: [PATCH 37/89] added files that were delted in last merge that should not have been --- .../source/pics/001-first-time-language.png | Bin 0 -> 15035 bytes .../pics/002-first-time-wizard-welcome.png | Bin 0 -> 114048 bytes .../pics/003-first-time-wizard-plugins.png | Bin 0 -> 30678 bytes .../pics/004-first-time-wizard-songs.png | Bin 0 -> 17669 bytes .../pics/005-first-time-wizard-bibles.png | Bin 0 -> 35453 bytes .../pics/006-first-time-wizard-themes.png | Bin 0 -> 116123 bytes .../pics/007-first-time-wizard-settings.png | Bin 0 -> 24160 bytes .../pics/009-first-time-wizard-progress.png | Bin 0 -> 18413 bytes .../pics/010-first-time-wizard-finished.png | Bin 0 -> 19140 bytes .../pics/011-first-time-wizard-song-import.png | Bin 0 -> 5481 bytes .../source/pics/012-openlp-main-window.png | Bin 0 -> 140777 bytes documentation/manual/source/pics/alert.png | Bin 0 -> 17527 bytes 12 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 documentation/manual/source/pics/001-first-time-language.png create mode 100644 documentation/manual/source/pics/002-first-time-wizard-welcome.png create mode 100644 documentation/manual/source/pics/003-first-time-wizard-plugins.png create mode 100644 documentation/manual/source/pics/004-first-time-wizard-songs.png create mode 100644 documentation/manual/source/pics/005-first-time-wizard-bibles.png create mode 100644 documentation/manual/source/pics/006-first-time-wizard-themes.png create mode 100644 documentation/manual/source/pics/007-first-time-wizard-settings.png create mode 100644 documentation/manual/source/pics/009-first-time-wizard-progress.png create mode 100644 documentation/manual/source/pics/010-first-time-wizard-finished.png create mode 100644 documentation/manual/source/pics/011-first-time-wizard-song-import.png create mode 100644 documentation/manual/source/pics/012-openlp-main-window.png create mode 100644 documentation/manual/source/pics/alert.png diff --git a/documentation/manual/source/pics/001-first-time-language.png b/documentation/manual/source/pics/001-first-time-language.png new file mode 100644 index 0000000000000000000000000000000000000000..52e12e1b168f0efba8f639aae5c618a3055ab87e GIT binary patch literal 15035 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

O6;d&)JzU-}Bex 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 a`i#bi{d>~{>2VV9@{^NRlB$$23j7}z31U|O literal 0 HcmV?d00001 diff --git a/documentation/manual/source/pics/003-first-time-wizard-plugins.png b/documentation/manual/source/pics/003-first-time-wizard-plugins.png new file mode 100644 index 0000000000000000000000000000000000000000..bf0dc9ec3d5681cb989484a57c75c7b9d1359bf1 GIT binary patch literal 30678 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 UD)TeILwC_+q!c7eUKqUpKeJ?aLI3~& literal 0 HcmV?d00001 diff --git a/documentation/manual/source/pics/004-first-time-wizard-songs.png b/documentation/manual/source/pics/004-first-time-wizard-songs.png new file mode 100644 index 0000000000000000000000000000000000000000..7a6822fa5f8b1601bb171f6c64e703ac0f5a5f50 GIT binary patch literal 17669 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 X@Q{y85K-87l)!;L%ZXQr>G}U3Oe?GD literal 0 HcmV?d00001 diff --git a/documentation/manual/source/pics/005-first-time-wizard-bibles.png b/documentation/manual/source/pics/005-first-time-wizard-bibles.png new file mode 100644 index 0000000000000000000000000000000000000000..235d24f4e4b1a9aff8e126fbceb02c85fd4f61e5 GIT binary patch literal 35453 zcmb4q1#}!s)1APQEVjigidJoL*!+}5aDp(z`(!|CB%gl!N4GR!N9MeNSIE*eR{J z#oRF6({{Wq8E!Q-433xjy8>0zYJC~A%kF2e926E{LI7xJSA!^u%uFexzzo?Eg`IsP z_)bST4#tz6EV`WUm3>lCEal$+Y#z^yk zyf(G=1ncdwN>WxBkj^t7&pm>H3FxUMYHlFo4;>Z}aYbGNaipyxz2j+TD>|$OvbD_16pyA9lUxggNu>Uq0P+NV2*%}m2 zJizx?)N(lKU4wHoFlI~H6gH9Uy#+>zZkiloxDYtCd&ftRtQJe?WE@hB+{^O0nqzBu0TS;p`jaC9PzLbBi5tKn<^^~B2ENOgeD?2 zI(0mphyqA>;i4quu^~U+JoU$QxcX>ub%KBDIW8&S31CZRi;Z)s<*KMan#!({&y6RV z+_hG^|6%!=%={BprasR~!?g5T)^>bzzbNd_VQ9*9v?k&zEZ5sWf*$ccLV0Ghc+z;J zUq9PrmEte1^b!jCuLfY2nJKJAMnTX4w^28E$YcHOiugE91@_Oq8}jXGDWq4|7ikic zisd%=#ax9zaCn7J&Ka^_Yo2`cmzq94gRL#I(cCw+-cS)ssbhZT>0eEKw)x_bM?e5( zNkhY`iHMMXiwsz@>NjG~o-1U+3V$%fpY9>)?dcxBa6NVNeFvjPV}ISRK+v!q zOM8MWMDY$(pvk!`(P~C^RuW}(jj3b3VR7Img~hx8DdPC%e3STcJFnmRxQGn?$O~b> z$J2PfI}Q)})gwes)F@mL;h+T^CbJM`#-!NU$4RQU@8c#1(p4RcJXOW)R9DdCAA6`a*FN4x7gN_jO*8~nD@|Yk% zLsIIij;d>E@;Uhk218UJ>)`SDhLBTDa9|6;H7@2|-KCH$9#z|4--)K;j}6Ua=kX*I z!d3hKw*~71G+@mw)%mgnt+>%&zWUBlkyj zMYt_I5f);AEKrP@TJn(Z;Wv$AR#~lj;|d_H3msND{e>XA#=O0olu_YT+zFEH$BR@o{$lWfaqj>ranOKY?LePF)^|#lNiuDHAVxqfL|z%ng1- zc)@ShQUYK+ zvGt`|=d@~&tAJ7yo{dTaNt$4pvH^x9PMijLJzW57W7Dy8V3Ut=I0UQMH&CGfoBcJ!>PXgKI1&h((*Wih*07TuFBlAt`Vx8G5*f`W)01CSqI zXqMPDrDx;N2Sji=lo)i`FKZdmBaqBu^{xG?l5*lQohL@18x6q<~ZUsx)!-u08YP<%3VKMAx4Pa-V!Qr_{I4vxpTFqi=2? z&_=0WUir{N;cABdz{)>CO}?HYCfLdn4Fln7JRg7hJ|Q?Fk?G$Sjz03UVaH-kygHi} zvgZ^0S~8&3bqrXU-@B@ochF0|C)*gc;-F?~02lboeD6HRS z!P@MQ(AQGJ2n?g}&amy9>p6Hd%f&Q&d73IJ5P0El?joac&6lf?!uRGJNzf%O^};uC z_6=22bh%QkH~Xv~UOk4$Z@s-FE>H!-uoB79rK?`4oN6@FD&>XX zJaVqZo~91x=qydm4$0XnMGMdY1PBH{?@k1IJML>mC|Q8-DW3#h(!pV%G^U*2f( zIW~Hy%e-jnCJWiUL>Hf17yB-yc!?Ze^kXxktwZB`7>Zm#V=qHl+u>{>9+GLy zAoWi2%t&rkj|ApWh+E|!fX69 z>tE^V_(enZe}G&}ci5P-OVPBtxDY-*%FLwIkGX4D)hr>BOg}xTLloF}sZI?2?`7XT zBAn$X<2~VgzwJFZzG7Jf;owqY{#2ntiAtg4Ok%)11P2F) zqM{<@$o8w zvEYt|xO8S=2as>>ZOvE1;7#C5z1ylLP&-T0%Np&eGET|&3THZzO>gm@NLwUoVtN*F*CJ7myI{f1R}W7|WExub&_FiuLPnltKzwE~B*D z5|SX3=9JAPfZS)^Mp+Yd3pyhpHkh4Vov?%q*_8edZ%jHa0q7xowe_7pl*;dhZUhLl zs2Dc6Ht8wIr|ZoE<@@ViaUI)O8QVw*78~U%M6j{}xw#~fNV11c(B;}qp;JbJ7uv}F z&P&}LTyR9^eF0t-U+U2BWg{1N^YKJ7AEW#X`lIkf?&*G9Nph9T7(WUH4*Nb>}`Pu{e+B$UK?A{W^7U@31nbn&^f4g z)_``Q1oX|Zc)1A%l{MV2C(|m=kAFewmvQ8>fNuQFl@ME{nTC&Uqbm_0X*2tYc|sJ$ z_~<)2-01}eSvE4lcDyKi6xwK)u;+0c%w%i=oajhe=$yKS(tHCk{t9O<#3`T7W&O>l*_<3fp4M=EC1xjNw2-gS^5mzhQ|F@zkEfK-J_2{cGpEf0%Es&L-r zn_llR{t00zrV{iFS3C1#y}|?fc11zs)wF{zeqWHKcmw#=t{3Xz>e^uHzb2}?FUB0C z@b$e|gChv9HIDzbX41DdnYbdwsdLEQ*bH2x=m&eISsC9`xV7gMY{cm z#>7Tj`p4O6XtVw%6HVh&(|%gSXdgg9==B_`Csyx$FsLJA$4?J(x!$S^rY`5v;HIL~ zd?hA(4u_Hd9NL}b8%Ft~I&_Vj6lH~T#rKULVA!K*Xgps#2e|# z0S}k6g$ixL6MO%_GaL_DqDatz$q@`9p^%-jVmmmJgczf7{Ofi$bYdWum6wqeyn^Dh zTe)ro`O37vUon9?CNChJDC9(qc(C?9zqtcfwIAZ61gs`w_fVWTc6ut+!9%qaFYW67 zs&@%uI@i{bhaR_P80BGDh0;`OaOgTty1RUpyvr<1PoFHUj!e5f=Er3`4{3?^WyQHa zKKIY^jc<~!zWn{SoZTcl665UPIHmY&msAJ8gbegL&>*ik%D-kHs(UJ|ZQ#?OQzk2D zwiP_!@!jN{j$~qo_FKzhry~!uLVe8NSpWTt zrs&JEEJ}1voqTBLroKtrN0Z^!+9V^^qn&m>zO<94`e$zeA|DPzFNRpb4 z1fB<%1{Cr3ysxFgGVI-+HQ)Xy;E0J{UPMNRtXVjV~z7F_=oeLbHz_&+Kv8#NYQlrCNP07EO=izIhZuazt?X!MO3+kZ@d+%E0Yt~H^m&kMVoWc4 zTf8&2jD{OpJ;+iRm5*(@Zbj(dM*-NRL)|RNQlyNl5^m;2Qcbst3Rp8~Fk?foFNr`I2NOtG6IK-*wAazAcH8s*O z!Jc}FmQLsI@@5S5izF-c%s@Z!7J!H!ey76L0SvT3kVvng1V_M*H?UKPLlH) zp|F+RZL*R1TsR-9Kr<0z0bMsRfG)H3Knq((yYTD^{a75k{M2JWFo1PBL!} ze0oqsP7zratkG&7f9=T)aoaFB6DI5k#CfEi%@+n_D{$ z75i%VZV#D*ED@0A+(vM1tLWq24PlcxC~}W*&oFbjx^2&_HY|St6B_cSyI$n;H8kza zyf2sYG;ih`cTgsB#o(k4ZoYO$!*SM~2zj~!Lqj9cg(n^T*_&FgwxVNcSrj0h<;|`I zxL#3P(YWr!@2$CsFh!v`WbC|fRPVO2ow}Vs4YP80Yj5bg&?OC3x2Z`CqcWqBO%RPm zu5(&|)gdCO`Wb7imMUk}_fJt%P-2a__q);u)nI)0Zz~|N_(sPb@#+~RohJ+g`%+g8 zAFsBLo!25=i$smC>UqxR_VCsoR|D1;C3rbe;%3_?uNg$U)fvhUVpY+Ni#KheYb4S} znzEp$cO=#F^M)^~cklFdpNwEKTbupmz<4u$4j+uTHx-4wlFI$7kwp8Oiu^BE%=K^k z*OKs<+OIg1?!w=UZBFwCIGD6y<@TrRuSQqULq2BH@zRxHdd7Wb2^>!Wbe!kpSJ0FN zOfgt7e%N-mPNW}9y*O#!Y2cSQ)uC)8)N31LK<7Md1sJ6jwQTd2d*zzZw~hcF3U)-3 zg%5T+rV?c9Flwc4d=$r#IJ|@;C31#>>G+{>?3Jn!F2;Ug%|j7cyw?O*lQP4paNEN= zUt$&7ye<&M7}a^xP*aCwywE=;Y|S-tx8-f7y&hOvX=tU63v=w@RAwBsWjFq{JMfm% zCUbqTA&em#Y>0#2f#=7EnSc&psWVOFE_wD_hOIywgxh4Zp-3rbqA4kx%~&Qdxeq(? zwKh37T~v|9n~>1E5m#y8$%}2K*4w@M*+_#~C z`q*>dOED4lZu`;Y%DB^?9sjj*+X{B%mLLAO{l`W$%w_T;tgXvkUtK8&eS)7qsw%bl z=|7g87XwM=pwc;l;=<>Z52jsvP!2B3IbSjM$Edq8d5)V5J3|llr-$Cm3xX_d;N8H_`-t-enieGOYa}a{r z(H7gCz!ZGR0k7mAT)+7j@3sXlLY9kiuW&}ogS)EdKqPuFMfmN%PzVae{{rOyik9!p z&y#DdA6_uWFpo;WYQpyRIrrn_C9BrtyGa&ST>r$WdPTMN2==#V6uXy!x>r2I*RTcF z2yaO08MpHQ6m9f2)}41IUs?QwoL5P1(|uQptTcu@(Nof{SIjc?eS7kS%dP>6iLnkQ zzI?B-C)OLt6J2e-S2kymL$Eyr%NvMGi_4#aIF7n>`@&|k4!3{bM<;#1*cF#eXwUR= zA+Fu9ba};$^uG5?Y}e|>?%ujhcn=`!;Gx2?dR=D&Rda1hFD(^|o){7w{Ee9S56wz} zlFi3S>+O)SlVANSBRjsH7$I_m73M#C0CQTzk!kvO=Q!PE&6tKvgb>&p#_85&eu#1d zG-I^esgh`YiP#vobD>5H*F<|qCd`e5{SI~rA7`d%DwJYfv4G0S!)6^F(P4OYDLzwh zAIJISo#PqS^&CC|vQGzv#RT3n6qG#OH?R-CZ_i_IA!a04LTXdll4=+gX+w_Q%~R#} zGRJ&x7%12yza5W6yizcE%A=DYZ?LCZG1x2?fU0AnynJt- zz7|o@$z(o(rt7aU3 zjkj+3gn&b?7Zc3o$TcCWOUdOISHrDV@L71Xp|qN#KC6M4`he~pfZ=ycXx3`7EfYMC zPOSQr_8$|~T=zD7hmCh{M%)~wKlb3z%_n{NgHUD2Y)zZ>*~bol7Sx7SZ7RZFHgSy~LQ*AvkEhw9 z8Qz-gEm?pMM>#jd(bnW(ZQs*Wu$C6z>R^@|t!Wh37A=ZsU>ei9@apV(>?If9#Zh@0 zqWS++jPXe=`=oN3Q;NV&DS6CqtiKmHoO)0VN0-B84`42}VB2ewi4Ogt5LaqB5>Jl~ z5f3Xijc)j80W@5ymOOcoqbf2HQE*y_186DBFVnZ>8m()TJ6&2Aj`F6JCZW~DJiiD6 z+vGHWTWL3vF29ViLa{mcwzYt^dnv<%ggxkOIh6UkB*R)`Uhx?4veYjFa|$W@;|wPc z$&xoFeDV3#>q_)TXd*+rWv$DV?aXgR`$EI+9Y}~G^e3S)I?{Ytl2zrQ=hfFfv7wTg z_(NPP9A0(PRi%LG{V}~bH^ZwHEwxcbp{_k6JSB1{)y4)q5hltZ%npT&3LP=*CK_2L zs?eWBJ**9qU!vX<;@vHG?{YbOP4|kMR56iF^r$2Nw2WgA7;>m?y;B z^(7RDSlc5^deN4$P$?C?F*T`telQxPBqh`v_WdivZ^+SL$h*kFp+k={lP@1rja-}H%@G+ ztHIjpT(Q^Mi*=30_{786g&u?7ntD$(l@Fx2mLF`xQ}Z9s+z!+wmIdDlN(@OL9RXWc zWR*Jz^w2T}+Kvm|Ei!C-M|?SS>zeXBv)OtdlB9V2f_d4bXQ!m*k?V^TnffF7LfWBI z2711{dR|;1n(WtzGM|Yg=P^I@^6m3H9zsSh_`fp7;5dY)kC-Yh zm}$iNjgrrONxzCE5vU&c%f|9BxpYaR6{wOECU?{?3;wR#IlbtUvr}}4v zack8JorD9AuR319OX|DVpWp9v<}A=dm&8Q{arRqBW*3$E+ba!4r2E2CYjjOuZ1FDY zAQ0~f?xQf^>pbPzJRlEHTB1A{!=7zxvy^%T`FRq>gLXfn)jc8D&VJ423@3Atp*56Z zDc(s4qiZ7XE0$U+Sa%X2dm`#n`|yZjtYIk1Y?gap0%wf++}WKSA<)99IF=gBSl?QL zu6oWjX1(;COov;{F3u!eE-U>9a@h6yh${Ex-D_%<#}K};vaK&dG>5w zE@5V;b|*mvfff5DmZ99$%vV0d7LFdJ)SBYRb{Q;IM`#|Oq|U7`km+qYmG?fs5Q7fn z2bw!?yGG7^InlW?1h*rF%oKCQ*&s0dVnjyE?84XMuc+$(z)8I1Grt<5+MX_sY*Moq zI$5H7ELJ z@(uWqur+ftJhmv5`4hU{;~g~gelET*0mQ;dy5QN_k6d?qRTg^4C;rq4JCPhI3JbCx z$XOPYz{qmGF6ap+di1IL&DT{SKU1%NFHOQe_Gve8tP!E|p;J}}c3Gpm-Y{vy1>q)w zN_*{|d_opmEZ~_3YpW#Qm6_;|+abl2ugZQ4CBW{#*8*rH$Y2jk5uWe3XpVPf=ih!o zDt`<|U4E`DG4fZ+{q+g>F?ij!#RY?Q(zEz9FK%)cK3u~isxs;}wYYF0^){+gx`-dB z%M|VPD)j73FcGQFk|ipIA#v0%2npcl0#ElQgJ`vur%GOZwCD09Mm(IZX2QJLI@T`1 zM@MzJ=@}v&O%msSLbR+%k&g%E&twrZvlZrT+8_1CpHol(HTy4i#kW>M8Z-&9#@F_*NM5^b;OfLE@{10L)*w&s(`6exTY;*O@?h4L`|ei>j@2szzuC z&;lD0p(9KgFnq6gH3*%7su3x(g)9Dm+>@D-Ce!xvitYXy+7-Y=0uuS1zl(C2dWc7E z)tX z3Wy;dr*>*puf%gs#A#}9^W z4`}@9+Nh~0@fCRJo{>PQ`Gea+rS#6u@5hMivYV$O2*p`Yj=V6Ky(kR!z14 z@GtNG<);e%ADq#DF8Ytu&Hp>Q^FR0f9|@psLUFB_XrJXe9Scd2OZ)|(Q&2AV;r#1B z!Ib{*5U%9pb2?*_zA&(nflh;c>9_*_uf!42zueOQ!_)ugOa3!&_5Up&1wYl|EH|Ed zn`p_u6DT-ZuW@bv5c=)U<^7CiZ*SixTQFs2=j@pK;|==p`AI?~A?Efnu5%Jo_j$&a z=_zc-CAxi8J{M zm7K}u^-~~%dnEMTiR12|0qB;!o~AhE0A5ojkbm*EJ&_Ot5+Wb3Rs-6y_(w1l;i%~| z4NKk~EKx72$yg%I&E2I}-7!243|qFw4MvhQ`6xLmC`(nd6rPhbb>#H$G0`UAdXJ!1 zuD$j2m4W~24*M%X|1dg@`t?(F`*)0}WY3Yo8&3Ga1cHo#@7<9gioqSji}B;v0fHz= z#P8n@kdcZxPoL%se|4F~!O@Yy@_s~#GW-oYUaCtd;Sv&5fhhpdTsnJB6co32`v_f- zE_f}C;r=1+?j~In-+W?V_aJFVtnV2pfZ&@KjjE_olsFiDJ^vJU16&VICryHv#%>L- zk8i%VuBF;A1S!%-J3~uoj@{O)#&{-APgyDl>8<#t`>QgwN{DR`5B6=i@RY7?= zhYQ=_OZ8|%YBPw?!R7zB{t;I%mIJZ%8=lC?JSD=%P4-8j!3*unm z-J@Aw!xFu&a!tBZBE!II>fIYjlN`a7S7elXCYT#wNNi#Y*Cly_ z+Yra`=ZvYz`5uFL+QR7MrTas7oLu8W z-K6t^4&;#d9QQ}5*iTojZ(XU(Db$-pdZb!xQNMn*zi_!*$>{ZIi!5pW2`b>onv65P zY~FY*zrf!Qe+>`Q0Q=YT+i~-tTNz;xAl&Vg8^Jy`yoxeF&aTe!T45UfFd;Ox)iD`h zwRMrk9%#sRP^1Md;PXg1h$&-0<~uq%>I+PNjaZjn{opsvbas7K8}Z$y3VQZ8kFJVV zDVUMe`(lkGX5#($Z3V;gp=OF*KIYQu8fVdD}*J$7TpS{xNf7M94wn zTX!jXJV6mH^~$oe_7(R)bGU)WBtQQJYwXm?08{0Z?68}gg6E|4I-z$!wk_h%_umUx z8e0*9fr$FW#lBy``+r~a4NUJ{p4=ARa6{L@^(_M;YcQD#f3wno1n_9=3bMD}juMl2)f5{k4-1yEzBeHeZD!FDofv8{^&ubtS9^^DGUf~ap;O0}`$8(%sz zYNhIr!*;!jQ*U~CvSCm4wxx#RIeYiMFrWBOTI)lyx#YEyKj6OS7`57khA5D?2O%17 z**iY;;`Cs1JF;=#(irZz+F!lRmP@Y1@_jEp3%He&tKIArB9%C9f7${Y_qK;m&d?F4 zs~P-nk1lZL6dfjs`Iv^fcw#HHGG4x9Jf=}haTgTfTP2KqnClmE6Xq`=$T~t7fsjv5 zQ=c`VoDbIc^q5L}DC-9>Pl1dmZJs#RsU3sMsY{etAxj_NJv^VLI4Oezf8b-aZ-Q0z zr`d<$m>}p$WkN%$SM6JiBIAo!+{;Z_OnUjqF#h6?J9C7dDK|$=VMol7XfaK$A))2S zN)qS3gHrOS+b&9=b1xQA6ZL+Dx9^V$AcXn2zb!Wv+CKYq+pph#s*-p}*2GxFD2g#bJ{CZTfP-oXy@F94{^ow1e& zLfcB@Vv50*;SjX1xq3!4rtQvE>lv(q!UE7!O2bZPItCL+c-+hCowJFkj|O2{A8lA6 z6MegDR7#1SF!$T*VN)emI2~R&JG^=Rl-AWe9!ir-GW96qz|SsWE=AA!2b6Ri4Cq*5 zrQOpJ+Jt@E+YM^<>;!OmM%vvTD%{gq2yM%?G$teFH}bV|pTk!NmhN{>bX?v5DimB^ zSo1&B^%Hfn!}E04h8|4M%;s9S>zA*c@D=?B$F!Q_SJn)}xd#E+b6B%LUJS5j+*72B z&H_(>-SObUZKzgXNhZjnOL7>D1erNdHuRmmzY@Q+Ng?QKdh66ri9R18D&K2Mq(00W z`%*folMF<=Ika`dIC}#wLp?sB7rBJ%pNKpl6ly{z#9tfuNDRo@y{Vi3UEOViT{X>|I45nbj)ajb z1!)UinvJMZov%*#s@a#K!1|uG@?fvBj$R4|JyFx8xOIa02c<@;G(~`T=$%$&i zJwHaYE}BfVIm?G97gG1dm_Trx`7>k&hWQvfi-~>jO7aL2lG59M`t`MRnK53od<<*4 zyL0qnf{AQ0>}};|5l1uEIgW#e1*_~Mr{%f#gPmQ2f2rH{&ro`?VyCNrxcjRGrD?eu zlc2!tlL^M$z`eGE8Q)aVh6WA?!^sh428*96UneYE4;x-BH81eHdZ|hZ>s(mp%Fttw z$4pk4QD-_fggZj#3vUxOCY>2OgsOT%fz`bQeekVI+feJQ`3{B?FX3Kq=)-gGkv19Q z>hAm_YAt%ed=+y`(SZ3Xl(HaRp(k6l8UZJWx?--$&8A4R0o%>dy6-Ne&`iLhkv9v* z0@Oqs2v)!3+ed`To6eb*LkCdKIYtzev<7^4F%MB>jJ>=`#H&6Rmh&C)5;{G(&6U_! zozIYAc(Yw4yvneUc7QzS~9C6GlT25bMbbEOSEArG}6#d@}_%c z<6wC&A(4JtyoeqysV?do6j9>38)aR$s!WEmE?|5eI0`pwz;tz$v$##~#+}eJJ$+4l zG#WPwj89b?to%BvdPhrqtG+p7{OJtP)>A{b-j$`At*(+acI$eiB^xF>7w?`ae7WBO zY4%=^9g)*lvShbzrkEd$DGAy>5AO}#H7*qSWp45HuD)Tm8X@a%ZR%Cu05mCwckLl%XS(K~4jR6WH$P z3r$h--Mv*Vf(2#RD5CVtLB}uK0&*U1lATLS8q_~P`|S}kmf)YtmjA&byibiTQ5mHI z2|(%qY6ZkHMN65MJGjYmc(i@+9QhuPBCcxQK}@t(M@QX$@!?7RmPiir8bIv8>zg!e z$JNnpvi9jK`ONd+ly}x|G=xOO0zoN|8*>N$Kk?4zrh8qx;_V2oX^m z2J0Yz9F#|C1m)CS9^9A{sNh7ah-O1HRg&$LfGlF>!Zl~x?+-mep1-DVhNK=uK2B0cv{bXRp-5$wL(3h4VxA)zjDwA<@9#{IE z2yf_b-3{sGYs7yHMH>(QFnPfcR1Jn3cB{qjAMbC3hh1DwhhN@a9!x=1Ey%DuCW_-; zLo_q(`-@kWc}W)ngbj||Gxh!Y!w;Mtx2R!BA4;_3-wA#ER0vypc;GvXHp&ptz-Sn# zQ!Bm(;I0d!6Sz4oEHx5^E(@(}xi{qY;SIDKcPO0qbtyYqc1l5(Ej4XZQZ;D^0qX=~ z-6M6HuU;>vD_Zwl|16Mu2c3ocYd3qu!>@=&H60tT^CWw^!>_5-2e|B&7$!E_o0ClR z`t-!IIueJVmvcHH;c+(bh{7u};P;AvbogVJLb?x&GD{U=W*)-cWw(oH z(k?cO>vVs!Kn1*sSZW$d{R0WJl|~4DKvuqg*H7-yd?sH8Hgc(H1Y+a;Mtx1-pd(y~ zs`g9+z!qhzHqpw~gp5O*t=FYd$f{nH>sIjtk={^dPnO}*p@Prr+RCuKog;=vh}*1C zsRS|Jnn0JD?CcXwgPEK8gY|l`we!VOZRWuAcAc{}{yq2Hg(>}aBJ&O9Kwqov2z*a$ z?LO%Ea|lN*-m#&Uo#g3Y85Z!AG&|Hp@Oy&AH6B%sh_(Wjlvzr}2tTMSqpyxMc)6~| zUZ;61ihmuN3}5L(2|2le@$vKM{07TMj1FxaA!WG5-OKoSNvs=BiWF}(LpqEKd<-*`Je_&R%GoV3krV;WyH^yy4B z6C{@ZQtde@L+c&dxJKeq^$}7=S<05R{jRQqL-9u9bMi&y&xcPI5A;&|SI9>kyJ~@_ zD?^2$7V_00VS~L@RV*0Os~~uY`|V}@9?NI3*wn&Rn$~vZEVcbORdbp&4@i7Csf5!S zI|cX~IdOrj!?_l#Q^8CrDIhWV);t^PHBc1;IrhdT}AV;x4Y8w=rZzaI5#ho;Z zysS|7lk7NxTe9Y91WT8R18BUyxhW%M!AeijQu7!4kS99Qna&Yj<~Mee0S(hr?X>kr zKWYolf@!Mo-V7jL0E7pZT|J+8T#c?VwXm0Z?*L?KCB?TV7h}tFFCjH|HB{-7$`LpWmi?{CMe(9Ns^FX>dpEcb-i>yx&;~#9pjS z&>Ahl6&1|ee_utJI%XS;@0H<1Ia)@X1uEoclnvS6w6%J&+DuITyI zYPlk{ZyQy|t)WOLo9_o8{+(N|!}aq=qASX7R*Wby$X+NLB_<4-e=fIne~CrHOMQp- zH2g47TUDIqY%@dIco{Re%7TlT2GJRDDPAtYo=XeBz7;&qS7h3h;a|`!_jbbUe~WBk zd41D&ca4fZfi~xVQT^`-sT^J(osQPrcX6T7|J0(sy51fMe5uhO(z5NfQe{j=A2q2_ z2G!9jVClGEENN(v5$FLGw+>H<(f^jtfudCos0=H5-PX=6Jzt;0Mx2Pie7U+Tr33oB z0#orl5TR~J+EPn;8LTLe7LY53bThwlQ(0Z@VaDmFyoQrc&Q7ouwjSnx93_6Fm3gVYpNL zG?VJmBhpdboNFkHCDA@y?<#t=ObP#5-yuj>(y`gM8*8d_+W?}+EUUdeua&Xs4u!5i zK+L{Kl#Zq^;?dSuU@l-wvNpluEJd-4yx_^~^zDerm83-#kXKBe#Nasxe5uyLI+ry> zFqFykxP9D4S~9RaT(kR@NssfRBw|V_hbgO~o>di$;41lLjWo>CBW{km#U&JGVZe z_6J`$%#%^a-J$9k^__ib$DIjNu=LqkY5nlU{hht&j4sGK^n6PwUeOMD`0Av`?Q$a2 zLf-~d1ZhD>Iw(Qu;~%v!GVT@2rC!q zJ+tj4GBU?wk@G!$O@;&(99*an{L|6rY1pf?2^u>;O>cS_ubxa|K zsH6HAq`$c*SZNGxR%iG|JP3Oa40eTG9yg@Xtu);9U`|9a+I}WH4;gTGA@kSO5iDQm zS!{NM*=W}b920`RbQV5F{cYaNShZ=wW|yHicH(UkbvcU1ZuJ}~BLx#nVFd=6n6ZC7 zZXdqd5e!|Ro%dwwcVCas{eq=<6 zFg&l>)P`GDcX)Q3?Q`4J#pLfr#ln){V9LwEj`jf~60=8#gw~Z$7aIwT^=gj4ht@T;R`i3Dj5sHoo6l& z5n%5m@ntJMkllPtcFTF7HE>M`bSg|h#l?7~M%2H`Pv%YMU<(Qwr3tDfAKh_#@1Gqr zCGl8*aB*V?y54-}4bdXu`0up<2$g$UzGdxvn+Lr!Ytv4Ldsb?)({( zu`vtP$y(qk0nl3)(1ET7#c1{v&%$Wt*l7|)<@xu_U!$E0hCao(sOp8Xop)9C^MS!I zef8Afu|%^KSU_GW#{RQgKF-1x>%LQxd8o(Cagvys>s9g1L9+`=|BAfe0l&JQB{UN= zd}n4)z@C07bga^G|4({%epn-XqP@F-V1gwB%j)IOaYDB!_u^a!4zTWQCZOP8aU&S9Q1Yc+$c?P=iw#&H zg^#YUb%#Nne*WF3(3W|0>F*2vm|qn(qkW@yx^>x4E0x+6jLS#c>b6olh|hG-2A0YE z7cmSdNIMfLGOhod0ijNx%1CMGRkD5SPC0yoaT@^L!U4#@2{a1G4ozWkA~}Q?@P6o^ zYFu~?hbMy&E~#)-JIGPtaYDX;9)T!7+612SWe!=*c4r;__od6ri{4UO-GbY6a>j+z z{>qd!to_E(?754now1MTiqk|V=|op)NoVx0(H;Is<`T=j7l!kxZATnbX}MKuvShCP zB9-pr2tKv(xh|XWx0@>4=9Kl0+PwNL?^wK z9_Fni|W$tYqeH-?>BTA%DzS%D1^tDviejHRgEH%$C!kLq5a`QdEjm z%W&%S)O&Uy#r|7mZynZFv#$-)(n9g#4n+#Zp}0R3ic5jw?!`Sg6ezC6ol;zbySt|l z+}+)sZ_(%Mv(G-e`@PPWKZcNNWo2bDnYryZ8DZ2Rm{?Z}jjNhhU0@G1rnro>fi4Pu zf9qF|iqewxi-J6A_~5K+w)illX)j$G*hV4*m*fUcz03lEVYV7#GwZ=k8|BfmXD}N# z#6?6Sms>S$@foe)V~1!M^mr75k+H<%dmLszi<7N&aP9UG6?wV)@$;mbn_afkhxDRs z%aCr(aJlA(kbaeiru+CfF#kg!7=E_eQtxgcjO6Bm&xPD)8=Awi45ius`r^&Q4#R=} zEy7ovd4r=?i!I%!^|A*^1=Z>-lKe4au_|L&FeT#oAEQ1caA zkWRPbQeEBVyBS+HOv26ff|A$h=r2k7H2L1$&nS4h%P^3UlRpwCRnn7_lP9K$IxCQA zR9l$608WA|O~D5|2z;pj)}GpgEDqCUpG0vUrdkcD*&IADy1x2X8;84FcaX9#Zt#tE zTP83cMb?%x(bM2dZC6F@HU|5E!&zibt7pR?i~M_Y$*Wh7BS&Sr0*McBkZMcO`~Ga2 zMSU(pMy|Hd)z+f4F-Gmc6}ivZ+XIS;#}*Q_XtzP%2nPZagd1p6Ro#aXB*fI%^4`Wu z#{DqtTZzdV3!cO!?eOI9tK(|fV3<*6k}7-tl4jQK1tAmH`0~?xKV>dZ%tb}Qq5t7= zd+{wGVDU`T*_ms9w#KB*=Or2z2nM;3Fz#Ers$D*DI-`2u%}~fT27ib=5`{PyUqEw* zlcK?m73$vn;GVG;vw<+1D#M)R9Svxf7gzWN8ryD)68 zG2_vk^y~drjG6T0zF8!SUqX!Nz&s_tRY&4FN&+IX*p)x2=H~mDrX@F6^>GdnS|Fq5 zj?&8i^}Qco5T9pI$nAvfRLe_ZI+GqBl*gN2b z1{0~4z^%~CS7%a3MxS;~pSGO2 z{rQ?DSn05}^sQHv4Z~Zt#@@JfuvUkDm2SPXV`X5Vp=uJ4Sjxx+f(K}PCe#cr;{!}c zom%7zE>)bw-%|n`d)lZweDBU(S#z|lySaXH*Sh1S-dtw<<%jJsLIMom#7I%+QSP(O z?(PR+y-mr>>(~;RW~d(hG^uZpul=%Of<1FKLN{vo@PV|=;zuH>_ib^ptx;Xhog1Cm zj99?nlw90|Cf3wkdNl6r5T(tMIOQ&w2(sQDH?)j4O`W>`vZnT!5o}Z8J~>rQ9d;;L z>kGxI=kqGWHLbsvQIB(rHU#8_m^gyK?+-7#w#j9K{Jol9M!3L z*;;33kf%4T&`W9i@g=WLldE!^OPU|UV)xK2@nx&F1=rl}jsoWbSaK16ciSyjX9(rG9fZ@XC0;Ejd}H+8Q0SY{2q$sjB&jl?_u%a3FVKkQZN2o zC?DM|lY~J?nA;8b>cG5$Ck-{+jT=Jta$_SQA-O~rvyQ-%T&0p3w*g*=#uQbKYQur& z5FZ4?$H#BWlWIyo-!_t1OrumlpK&U;dIi6;$|Vq@yv|#ClyXXHE_@qgeZ7@kJ(jQV zotlnMsLoEwbY@>Gj#Of;|9o|yNQ*t4bU4=usS{(N={ZU_N$Z1C%qmycUAWvQw@#}S zYmcDa=X4D!Kg=Ev136fYTY`W$DSji)(>r;ZX?mpjGJHs*yKJq+&5tUMk2tZyik87n z{V|b;iqsgCKB>Af>C3&$du4m64SGDnZ?Y>{9$H90F~`sq>@M%Cn7&KDV&=5X=J+vX z2mPVph@m`W)WeY9ZEJ>N54s-tX>N2E3aR^3@k9Sun>W+U#?| z=kJn^AMoqmuk5_@_pR7n%$4e({am8p7pz1uYP1J8%w1xs0iQGEk*uAXp5y3CFm}M@ zf5@~zRyqYa*~KS}m;{SH1JhY!7s|=2himp0aPz-2=5M=;PdAxaHgKPAVCQe)5hs2u7k=t9w>`%i(*7srsPMP_ePJ^g|5S^+T zd&B9?JLOV}jJIsuQ8Dn7OShMkhPgS1OqD8f%q~Xyz3uD%sEsqIlZ9<>H zYRNwc&bPTNSiGo`Om_*NM&0#n9V3Q-8@x*z%5s@l|43aiy!qzd+Q~RXsbk0g?Xe06 zKIEv+B;-{x^m_v2mi6SbhCoWg*HR`|11*8?>(oSC5b(yi0IRsOF)AU4M^8?+ZyzSd zS8pk~)p8eInJYiXi%qq1qqn{TuG)()Hm75eT^$kXw9yQ9hl$;9J@Glv@LMO*Q3vx5 z@wlDQweRC9jBY`mS1b4!8z{>i{KqOa`?$&?)oZ@oI%N*ynjZ|Bb>~i^Ye?fxX@wd@ z)qstMRN!P1AUFJCftAU4X?4AahrUB`5xD|*5{{5Lhm^*c{EU}n^PBaU6dR{ETl}A| zzrZGQ7U>(~P9231V=9zD7%bV|XiRAh)P*^zrI~I*7Pt$!Y>Q8V;ICbm@%tT3KQ82r zUCQX(Qi@u>GVI)8u$ZrpbzI%GGaaIR5N~ve4QCy|yXt@5c+02@y-dD3NWOg6VnBIs zeCJKU;6d?(0lYZHIuSQWXvHqOpH121eiAnUc2NSlhOjxP0XxgH=`TK*%ejcv!-se5 z1bpE&&#L$QXqH?OqvNB47OK7yr^#&3^SwrcwcsvzJwru(8+TZT@#AlTLsGWD*Y4l~ z!2p?yUJe%06TEOi%d2~M?KKTd+RWe zXGK!`-@_RA3Qwm_d@n+Bn=b8;y%vq_Gio>i9S`Yz2Z1jP_M?O>LP{|ePBzd(^Nw!S zYOo;|+IY6#J9TbtoJ8z-W)g4Shq=Yt{ziZ>Q;7RO#RIc?FXS&#ZY3IT(Ypx(}LfB?b|2OF0&vJ#;qu>}B zt&${aO$^kr9b2~X)9uJUhv{@THkFyagZvNbB@S2m59WnqA_=CO^szhMO*q|`*vpCD zBBdUAyXIBIeMrg8gVEshrt6NMW$*Pu?5o=3d(Ottihw81hT+RwvzzBN~TbD|Nq7vAm{y~Tf;=+ztKEul~_Af2Dm zaLRazY*}G#&>m31rMbeb{<1#1%$kVkv7D0_&JSIWvu#7lyC)=aey7p$wmi;S=K7oU zHT@kuYAgOVg${$j$Bd<<7hAjWfnUCf9R!S(?w}QBK(0c*BwMxTdP&)rg7t zL0l-YQ)pYJx}r-UF@-sTIvT0i7a=DL&-?9ihd1-P;I}5SUXoS25DhJ_%`TRCe6vbP z$E~s_9!l?PySkX!F(}Z<^Q@568=HW2>G1}-Cr`%}JW^gw2-^U6Y#)#~=ym-tv9J6t zM&9F+`G*_>t;_lwuddhX6TST^vb}0d=SB-nM7U1;_H#|I_R|myXYxA6(x+g&%++tZ zMHh1BO-uKQdB)uXo^YZ3*ZL=}nT|qkwZ-|k(I_b3lVOnd^WcjOHy_Q6J{x8|RyW8t zccJp+*U5S1GMkKaJW?(~&Oj%0$j3B^ON&#`s-W&*Ahr3b?%bm+{ythFy3XOaU3l>? zx;TamquC35s|F^qkL8B|ESoLI51?45N#{ro+YzezGL=`x2++F|PW5KzXG0oQbq`LD zauW+qYO6X{XTNGT`!La^(>cNr(q&EIDPfLPtZg~x8IV3)IPhYoTp zCy*6cBmLZ>OJvj^*D*9tT*!WoISsN}%;}b*c$p?GoyiU$N|i68<^PHz5vR+I6e*rC zr7poTI&gbQ0yN)4WdkbT=WpeS|0JhSY--fQyMkY9>*x>;qy7z(yl)bgkaSGyYkPs&GeR>)M>L3QlCrIx zn@}b9oyl7JWMfEbA=0|G$O`9gWbyW4IE6&+xXcnJ#MmLbHr|`z(Vl+hf!mU_D(7~` zop5Ngvrm|Q|0>X*`lE=5x7dTH@u=R$xfz73LJ$e;PYfg0Ni?Ih-ML~fOVsli;UDqx zwC{}5x!RI-M}<-58mD90rVYWE2;TTS3v~Pe%j+ktj80mAsEL$<%aj~tj;Rz;iZ;Jb zByE>VqqA)=4){ZFFMEoujpMz{wav<3X{OLXv+Vv~4qKAd!?&c6O4AQvc1C%EHg8Rc zU}PCBlf@%$)@ig#h_VOZMz)*IQygLbNP$b{|9ZOk_bj*Q8!cnumr>frZ76!1%Kqah zQtfi|bz|XjxW$I|8(j`TXNpd*hr^z{Uc{)5NhxV416A8sDKJ;0XUqK zCe_28i$3wC>Rd5%@k~tDB+MM_JH_7U-qrZpT5IBfdyQXZb|CtxBk*GKa2I`o=^O!t z8*I+rO!r#cvnd!zYtq;-CS*kMSf$^NP9$3NSGh6NIC?~r$7xD;+Q!b%#QS%v*-b(s zloY?%Uez(xX~-Cj7fxT_B;xSh>U%a{x5&PzUt~~rTUx!IObF`&7HgtTtjTWm*K+SXbxn1pYA ze|KX4JQXDRZQsFa57HxNY)9Mt)|E1ea%h26_-BY>_0oF$%N0iS!^V1Q9&&DUmw;t* z)-*w7kD+R@BxspBV^IPZ2C?egJTr5U<|ToafZfSNaMd?~4ZrV|5#QN0N?Bzb%U1{^ zi6LLD=%@I6?9!Z6vj9RrwmXC;#s(jcmZ|tCfR$J3bMW$<0|WgU3?*Z5c{4$D?(DYk z>4eeK+e#5FQa8tQ@{~?1**&*IwOkMm6MnNjmw9uESk{P>zVjeuaF@xe^+r*Gl0*lx zx!7~+Jpa>KPd}nwJW5V47~WYg;h0FBCw4qHN+MXIGj=Bl?@GxviMC8CvHs#kAI!xo zWz@sA$k?811CWW&E#r!66hd{;i#Ymj3Jw#3eq2CTyDY3XTwvC(ii$}H49GPJ9sr24 ze#QJ_$&!2}9n^#(%*E_q!5yC8#141x9wm(k zjAwN2EGEeri!j@WGaJD*lqOlN<&Q^?2wlHhbN!x^yqINF$0<>bmyqVoM!=I6{_+e5 z1HJFn0o!fsA4JU5hNj5n>f5UkiaXCOCk{)^h>q_kMf%A@qVqQ>`AQ9_9LckS4H-E| z(AxhJD(G07hs`*eFSrg|y@JK5Se-T;l4{KCp(fIa;01c2GLRG4xtM+NJNBEiw2N9@s|rWMK9`+-N5V~0YFE*fi0>-*x^hhi}e`u z{;jtp`Vn3yg&9gzd^bZxN59qpU^lSZ^qsM_MiP}3L0i>qX(2vYgD4_#on}HlZC1(o{*4`)4qT3YKw_% zX3?X9jI?HscUNtCqkX7Rv`MsTY3y@ATDddXj+}sfg@i;Q7EWX_SBnm1vu?1QtNl*I zZ8t};mqqoNh}uHr-Fcx>wt5xq=iiv8EsPQDp|X>U{e#T=E*T+{gbv147OF}4@wb7eZ5TkE2r-PTSf+;aW>O+G^2kVk+<)}9u+ zG(nIt(h@uTWfsd!w{=gxq3AA+LTmrU_xtgj_s<_bRhKncsnjFtGNOme+ zqr{4I|Lo>T!_@rclN{ezkLo3fbM$6M1dCHAV1Df+joI_W>aWfEXSL7bisXJZTMCd* zSZ;(0--ZAKicKTpt>@JX&X5dA^@q>2%7Iisx z>4OT-ua%INh;vu}p{OAw)@5?sVNrvY(#Xx-lIDex914=mBW_0Crq&f1*~7xbN&GGd zQup!pNjg`&MVIjuw|%?pvboq#WT!^{hom(FRb=VOV!|ED19vt?Qedglah?yBlO+x0 zmkX7;4gTGk!M~tCKZd}kSJ=~aq&BiQuoM|{`g1ede>rzMb3XN2qq}`82U`os_q#8O zzJ^R8l`W+rJ$|)tzH-u^-~=n)#D(PY%6WNIS-?c+9c7#)t{5(nczZ$5BHOwz`6~E{Z#@`}JO2dwM(PYbW;kPWtuK0;5M*O>H?ZJ%8WC@F-U_~zD25@DMU(iij{U6wB5z}7ygQruv2p7AZahr zV*ZfR9LEGoF){s1)U1RSYX8L6<=6@}FDiUD3yc!Cy${M5LBaMgaB2fJIqvN>?l_(} z@Jpe0-@!QPKR?;X*wJZ+1opOwkP2K2%4H9TG$Xk0@1H5+V5^H z5xSexqe5CV8@^qoz~kAV*$Ib>?}+}%Aj+B{wM+*q008<&AKv?uV2wpww`svdwnQmh zCcZP2O8sdJ^=iw<^m&1vW3@{2sw9(1ccI=)<^2)h8F~Y_Og~%-IXFGKV`wx`Ih~w} zCdM8~o9%C_llxs%Q~A)_&P<^RN82%=zn;JLI>&M9xPS3RKA;kis41a}OHcGbTF&12 zy(>JgAvdf-@<>BmdOG5m5u!R z?;Lj~6gz?f#dET_`4SVL+tTA?v}kg20H@eN4EtBptHo2ofj1z2*Z`^~HlyR3TaQ~T zJ@8O*eZ7;tL@bv332eixlVZEz@Ti=x1(1``08!_)W>9hg)YDj=wZ+Tyo{ACLsy`>U zz&+>_krVle>)XsjHGENn?*M%K(TyVb=tFq0J7*Rf$#uHH$OWqNdTIOd=Q!t8a}kj> z>kM=f39mn5c~q{46!Fw{6ny>?CbA&{#ljCX1rE;Xq>S9psN<_;vc&FBVi;AzN6lY9 zT>K*oVC1`Xw%|I<(`swMgA&ZK>N`UGPNxxv;-cHe_59U`0<6vBl`b0fMnp1-Nt^Cx z;j52g9X&qRhBt(Kvp{tWU3`vv$g%~OeT>UI?@3<<#h_=k0A!Ho!+X?WU`IDrA)|Ln z7YO|^B_bi-I>&B4i3LZ|RnCe$pZnXp1c!CANtP za^K$go|3F{`eqg|A`$scB7){GP=zP3jQ8U1iMVXO?kf`7>2)c1O2HIy&`ZF-3h{_j zqnkLIuU_XPWlfClK6rbvXQzGeKIq#)$W+xO^@SA>3Hr!1YVshV$$?gMELcXn{kD1j zk-r1BhPiez-Vnd?`#n5bxwVVa%HyHZ!aRO}o?}PU5vCMl)hhHOomz_vi`GvQ7Bd>Y z`)yS-m-UPRlikG0s@L85FVD7F&vOa@6*^FUpINt*n?aY zTZHi&5AhyQ%kP|-E2{T5e?9o|Ia*;bd0nw0IME$@R|6v(%bAjxduk$c&C=dEn6DuX zuXO|WPprbxQa9_3B@drB_*pG(mR@1Ih}C?%_fUF8SH)X!B~57Vv+5KfhyBQqCL|{e zqvzG`Y+rN|iIkbkId%I>ETygRzoHx=7fI~%9TV|mM<6UICn#I?Yio(Y7$Le~xbQ`- zCGY5AG?}9dx^k}jiMrUr(tBdNY;5}wX&0d(Jq3 z#lE7@H?O}k)kz3RuCbxLmPJ~GTm%M+n|(ozn47eUULi`e6ISJ8MZ+`+%YpX7c5a~j zgtj`lG&!Qr!4#?W?VC5H)m0c?wuiQ~UPI+6Qy+c8<@~i4S!BeBx(!T%K(5~70b(8{ z&BOS8X^_R`4nILVs%ih^@16OppkQs@6NBT{o>Q=dz>_sue_k3HJyjuJ>kixNdY`J> zwJA>;$UR`RnYuv6IWgafehVh7RsU=}#}xW-d?1z;>5JR+ixwfi*~vPlRCIsc{eM z4?-jm=~AmVU5$>HV0VTRKaKmo??UZ+42-%1_Ih^*?+L|;llh!53su(GUyW9#bD!v% z>necc2w)`XkZql84@9!Vw73nEag<(TXX{;>ymNMVTNtsh{3Dvx-=1@v9o3zrYu0tM zX4TgcK$$?)NU*bQWI7e$pdrvef@-Q9L$w?)Vk$*bP;cHg^sUYT<>*V}IZqrWz7Hio zcCf$?Y)bm^?;ZDp=mOIA(2Ix`e97qK>`&QrFx|#JM!6#@^0gv$gl_&C%`Xy&l~#}@ z2Nt>$4vfH1M;JIy?DU@s?VN*G7i_4lE~dQpEj(=o#XC{d*qJmX-=goB50N|pccYFs z^?aSH|0e`IehwprL)_K^a(q5_K=gye!3~(jhR<}qP#OPDjC6KDS-aMwFfhxeN6YCn zQ+w=YR}aQ+_e_jy{>W`CY>;idQbYxGPApO%hy*tj5P*9boDM3!R$2j{PgZxTXJ6<4m5EuX{0}BJ zyLel+1LP}2&*M(-;+Q|!@8X38@@Z}ir^ucvTUykyP z^8AMciKz2?n#ZqvYkl!dGVvj$s#t*ZLus$D)R*NjZvR`QyRHG%{`RA#P@d8u?^3hh z0?TmXBT`M$(!$T5KgV7H|KcZzIsM1O9$~ z=vY_|lU8|L4{jT5{WoYL+bj)&PH_ z0G{RcE%kFL>Hj}kWdpjubud-+>sKoHR3<50A3ER44bKG`-pmgslTP9dUVu1eIcB~w z6XZ{l!7XV#xVt2UvT_CPu$yCk&J-XHVAz0&D5f$#tx{;oKYqM1hNQ`ei@#c4UgqS- zB_WXo?pK&VJWESqJNJot@=&}(Rh#^ZHEPPO+_e~s)w)Q7zK#cXJrJ6&@Gu___!X(% zazna@SG+Ji$;ftiMNzfCskE$HOgE>JHaq)&a}mC>k>m3phc#~pyW5u_971lQvI_-r zrB+lzwcJBH|1;N_|9y#w{Fk^OqP-oReIQMO?dl;$uRE|4;dExD?0?_db_!}75P!2AvlP8(I`1Bvo}T&IW`d6AIRg@R*IzUR9AK8LocYEjrO6%D>0{c)McNjy%WEr1sSGQ@#>@jZUawS=x;N4`mPI0AVVz zfJz{vlEUZm-lGE*HQZ}D8P&HvuryisG`n^6W3QE?9lt9VxoX`PG=x5%6~9j)~XBAKZ;PUj=YlN8Hjp2;Nh2~ zbzdmIQ{6M4&%N$O#lA1=YkBx9e}k7&16exa`4}-*FzDLi^|M+*QLV#|XI9r#)Waex z$_FpI&lqKZ?OlM)%JxCnBcjyDTRw>(7DxZ2`AryOx5x1w7X@6&&_-8yu*Du`d_g|ZuJF=z&s^9LiQx< z$Ujj9^u8?zak@;WAE+z<-hX$L6<{%4o{tX9N$;77M=^d+WkB6h^;cqL?4Ci;y+w$xrNVAzNI?32+SDE*N{U2{EEaVAdjano6D*ckoR|@ zC7+JXlNTIAE8Y-0;=Vwz_sDj~)(0z=qTNs5 z`YA5I$7p}-w%&|YaOq3Fl&#sI=Zg2lHFqRR{m|6j=5E`KFvZ>IK$1Mnb0&)ZJ-`Pb z5-rr%uNCXh^o4-EiD%|RKd8}j8K9Os+lbvbU926WSSxh1@+%vzyhow$Zh7P=;@LOB zVL!bkoYd3ryCe#!c50;yz}^c`JsQEnKn(aayBPOuR$7G85&${dy=~j$6tD6XQhGvg zbH5zZehby?z=w}?i23NNu8?ntAQ?w58zfom>~YMp=R`}jjogxAmuVQC^uoBVJVf0i z1oJ(JJsG!28Uf-~H1MBdc~b^Z(@&N7q@f3YU9VK(m2pz}*{yJM)o?mW;$(mBB4FF+ z4olY`Ix99e%Ti7AwI}TPmG3GMj7=w5hRA^5xP~Y3bv3RYRZYMTq{LHpwI;vec-TuF z5YBu%eZ$AP`^vT@f;#UP3WcOGrJg0CqQ{=l3Ut(XTg&OUtpjGEm}LDU))(8WcET&q zVK%7Q+idlQwMd_dM52p3(P$?|>{m$oW$bCO1x;%<*erA1OxG+=#?yYlLO$vOML2S! zLNX4I=EoA6lVROBSsSKF2d7@6C?nw{!%tkLtHz#TEFL_jEqiMmXb+dUG~P`xnn^Eq zHESg&E+S3b#e7RlbCmIm>9O4jS~fmC_PZKB`yv zq2ZZ!?Lc4Ec=Bt#;(Tyd{naJbgmqTN&}hTKZ-SI=U})VMqcxi__a26D312mO#$|=u zm6oJX2Sz}iSGD|I%DqYSQT`DItMNr<=w#|e|K6C37saCI*z-eJ9oCa+^%$BnE+IJ- z{o#XmnlvSJ;dvgrTziW?;jtA4ZT?>O3l5CN*X9Qi45TPCDpUdIBa*fqV1G+Xe#r%nfZX1S-JoX{P7DxA*U8DfGt?aWA+a(&GL5Q?qFL7T z&68QH!d+MirQ~_J`HvzG_(>fU+dY3m_eo3gRIk zCQ~Alb zzP~-{I-Z4K*rm*N^=E5b?Ya0tWQ}xAmbKDZ{Fg~Ss9;;dn{%C^)tsm_Tzqr)uEThDov`KFkespUCNWs8l-Mg(`r)Yu!J3HuCbvDa#!K8Cb!MeDGyZ3L_TwD4Cr;&EZZh0F^ORATJH z_8Xf^5cVZs>by_b3vvVS3-m%A0XqVdtLv-SK8_$Sf0oC|HD1GPhdmR(eu)HBC!GzdZl#sxOk1Mu6S+fAhK=*Re&wp+55ZS!&%zR{x~K)OY+Kfbksen zbZJ}!lAyEyngr!_-`bSSNSVy_YO8(R|0x%5hjrTjv8^EE+t`Iccr=!Fe0BXo75_7v z-a(vNviN7>L&jc7gnrl(_tug%vGq?Nh1UJu1~Uo00B-2yW-eo z+E8xs^HNgH!4z1}&mI)u_VB=7VM%Z5Xx9X=tCb;mp!8B5>ZD36iTu7bDfx$IG`_;L z7_a}6o+oa+EZS^Lp*CufmGnVG1m?WL<~X#tS0d+S*b*w$$XYEQM*i zF=UVQAzbXNCn`s+h=ho!513ouzI}U5LgERv2e=DxpV{qVZ!92{aQbAFxe_@@uw)e? z@*gXxx)VR(?+gA*bn)=dY-fqDAxa3$NH)2vXE9&rYrV+Su|WoVbu;r$ag?-(U%|Ib zZ?VE)*QB!kh}$4OT?D@F=^{7DkonPwKrqZl?v(Hc$MJzqNg{{pt*DTkGb@t7fM?Z2 zO0O)Vqdf*LUt8voi5Z>u@Vau+b$Bil>4mlY*b1*h3ohkQ2rQFtC(A6!r+}gBryjR3F6|MxX+JI@(ww48ej?Ztg{g* zoxJ1!T8C-Jx_WwiMs!P9_Dsoi(diZV#U}MZyOHKXMC7_UGRISu6P%3^R^L%4WEUK2 zp~{fJc;51xo;dubC#K02_M8`)-#m`#)O@wGOLJolAOD9%>HD!VB$trX(IJ^ zfenUhsLPUNe|n{e#791sZ8Z7=A$3Xv=zmj|l;4zPCVk;L|5FRABCcbOdI_DD;qM9` zx%U>I;e8fBdhC{KB@2Ev1sm-{HH_eM)$Z2j;;C59ubO^lpK8iUk)nu~ewX*)O|b{2 z^A4`<#y3E9XL%h8u2K7NV4;~Xj_~0>wFC&2Gv6BY5E~rjO?)QN@99AuDySGI zW4%~xDS1l-4(gX(qG=QbvQ5AXh@pR;JI%fUO5>W&hFzUaoo0f{qa)Dfgk)u9@d{9z z=5qhDASY^MJ5rg}a3D_RDZ}s8U^Ea1XeHm$(-+Ts0EuR*(S=nenN1#+A13T6*MBEg zq*md-!Jz&cA0Oc_Lqn|nS-~!U6vA;X#HVv6b^!JvjYc&+V1F1L5nBJMmB5sYXB@gc zjF4aDdqX_hpY=17JgEK#g^V4!qZRP)fpotaAFw0`b?NJkb_O+0<)TGXc}RZw@@`cC z59w=uMFkM?l=Y?#77p+U2W-iXW3&`iJQGPNgZ7;IG`D zbVt4O2{{s1-RD5{z!|@oB_Ia6xOINo87qErY_21|rTzL9KIs)8Hku(b{vt8{pXSW) zXKg$FC)(97wb1BP&u-GjjT@e+n5V*(z%Gt)7OQy@JIt@ z^>-u={^YVI5LNl)&J8jnV_;y6UU@aZb})}Qn`WVt)Pd)7{;Nuf(VL=a(qyGPU3b3x z9_!kMT2GGu294SgGu~8p_A(e&)?5l_UpGL>xn+&us{aTj*l+gMre#L!FT2eW^fu_qAhN}6n@&bGSmGH21Z z_NkW_8P!@{(!C(P@&h`*W7#I_ZhU}^+x`GqESx06)~1wzDa_&cmz!#tMbHI6lO;Gg zwfV4?rbaUN7Vare>@*t zl=&Z4+`kHdPv+deKZ5mJFZ{o^zdgQxKh3{CvW8PVMqg=vt6UZHG}Lzq;A@sfyO6x( zmQ0D}J}^9$w&5!mJcry<(md$_kBCG6j3fRXO8kGff2$4ur8(4Em_0|ormjtqC6c91 z$RVI8MusgM_ZfFRd@Ps2WbCZ3#oFvV_@t3rmS|f+U^t+^EU!c7pK*WFQm#XH6e#W= znUXRX6o|RE*bqVgJI&z+hg=oHTH=9y)cT8~Aq`J!;Vz+VFJ zSX|fSnrAB!lE)<(-?)-Q@ajsH1qzw}CulU8oTr>;z$-Ja~+a(`)(B3HFh zkJQS_%J95j6qU5_V%N*1MR^J6FzdtS)y%w8!SEK42`43G)@y~Y;z&Q@pjU!u@*^V4e~qQQY!t?Nd4`I#zV{Wy)F<*y6jfxoCCJmu z5EiM$0)s4T{`T5=&>()#*yJ=3jrZ_+m@^Ts%_PZUp)yG7_A%{(SV1Xrv3J{HH2)Nz zi%6EENJC8j!*g_bd29hra4%$op`p&Swa&pRzG&rsL!EbPq7Fs2p>5W@g_?tk$8bqr zXHr{d66>QEI(HR)NPGM9nM%uC^^|Wh&>5SfC9ty$>zRCoX<18Y!Wa|-_>Ht*WtJGX zNFhf_aX0lOXO1!e#S2Wa^K2pQU@m1VJM9!KB1V;lc9!48?)$RHjNh!8Tk0k~&~B0y zg3WWm=E1)e@vM=*jcif5+)9xwW!1Rs46kwZsyLoZbP{yayWmL{o)Pa3^vX_$ABPFZ z%{b2m&snOX;EXjBU|IKZ`b_t(~S;G z5#T+5>$>Fn(yHj2 zotQVP`IEmh9d?=*I`eyTzP_pv8cf^{1D=edps0mnkM*@rbvW#t4~xtoOEVD_`Pc`bknZCoDf~} zJ;!F!A4$BLt%*$p%A))*Z@&|)c5Z}bpBg!RKR;A)`SQt}Na?K5X_C)XG?(QxKS*;P zjJD|@PQLDAT6EW?;=&X#=h<`VGC!^kOlS`cS7;R;=M~a*JM=R-_d!Y*h0YtN^A_rM zoVaY@;hv<3_95`;oYzl0u5x(!udyvr5}7#Y*GE*SYwM?{^+8zt_H>seOznf7e&2<4 zver|E)^Ko2PrFW49cN|euUMQ#+T|8na_rY*n&uvc6{u3Cu`~<{>Wr4T3^2SJFw=-m z*%nop>5UIG+8MSZ6nRWh8p`c^7g8b%?qOgMh9pFUKC{JhfRRl)r39hIgX9|yYW>9# z?(JpJxx|u+co7j_p;UWb+Iu+75Kk0 zC~zYZy9kr*jycLF7^llatKRb0-AC+mJ?JB$r-C=D3Ej}GKQDke8Zh1Z;v18ALyOo6 zr_S!-L+J*W(u(G5X}8yZ&03>{EgNQ1F@%WwDqc-gIgqNg*ACJ*YfMCcGt=_#>6szK zjF=9ptg|AKVltHnt>HexYfo1ZvzBwCwvJ>7##c2*pjCvt<2u41OvommV zbe)6~oke!)rLOH(NRK#ai}zXfAxox7MK?C6e>!Q@a^^!fLtRQ)qSso7U=^yY2v*T8 zA?e4t)>~m7bUj!MCcTwj%3&`T*q539%zM|lsw11m{+^cQ+16C)+Ka(EI-zYsrxnn| z<~OOP_SNMl)A(}}n@S*$`UhWqBs$|&+BdTIORGaWizmPskO&BX(F>< zsfxF!X;LthG)@VOgs-uBw1Zg}s z6n?O#@+Om^d9Z|7!MM7+2oLv zd8^^0xX5&kuhVSd%;`uqyv#el#)8%zmyeyxGPYqgi+fEuk-GV{+zZqyP; zaIJb0rH5)0v$qX;iArNia{P?yZ5u-RAdIc&10UcjwOlDx)feT<58)xQM;g3gs zxt!eN`xMGs6vg$$e@BIrF#>mB;ad&}&8mjf#^AZ94#G?B4A;8geHDE@z2);-n+C!S z_6`S0DG@V?q102fT`r&8h1>A`!iT}Smtf}lo^4I$6|!=HzP5Gnk{g#NDjJtQkNx_U zyu;P8%))}24>8iDhk=z`KdPEk^txH-l9D#03vr!P~r$Ka|;>&`9Jal5QsVCqE~ z@8=3bCQ=5?!MMPZGieSR?6u{f1Mzs}HZSS& z0~#tEm5H$QjLi*^tFO!99!;|I-c1naAxT@M5x28cv+==HuIYP^XRMD-&!QV6SX~b| zjd&d`@RSj*18CDi?{;q$6H1*0=S>>B&=yO`4R+Wa%n$N#qvOo$CptAdeIqm_FEV}c zIChDfc|ZB|D78+E+v5o=F$z@HQ0E7=M0qlFtvv=r+m(^IO&7V}#s=iU5jp=JH8jUp zWp}w-uH1TkStxb!m1OIMJXZXkNJnL!A{sv<+*wkTn?_yMNLlfx=1^4xT04u%kax;c zIL{GIr-}X%l1)tG)ZN^=C6KROi{BAHV>(bgio(c!WNFx|5PpDHd-|ZnHgHczu#gWkI>`( z;?XCPR?8eUQ~~Y#!jsBQF}sZHYn$j)zE>_kSnq)HXg{2YTt^fdU`1j^e~LKwU{QZkfB8bGoHUICli zCag5Q5NJSUU`>ICj=|pk>XGvtZLfs$w%y+Ug?fSB@&h4tez+Mzp6&j^QicXS+h{p^V1@5w*+9hTl80Y2|>=v&)7yve_Ab5%F2%=1hcl)8v z%Q$}1xjVUKHU)E|4osq1X=StfSlHNlc>ck*KGM*la!(FIJpa_6KlPD?TfVuiR9zV0 zfh;)A9X+<5z_lr!1;>iMe&5gl1q+$bIhWA&wM%Cgdyg>^v0;jT*jlZ)ogG?q)Rgo` zULo$f0EzGr^1;%4@UGBrsPC&gg)+PY;z+kpg&dBKeiCm7nNyft;%_U9E zPmmn0&1%XtaW1$-3t|lI26MS@G3S^TFpr~z`U^>0&}%_b~;Yvg>?n{J5kO}mE(wX%AuQMB0EL&iRnwink6l<)q z4wVazQjepBfnWomfWiu;HJ>l>1M;{pqA*vElf0!6#o67e_9}HXvr@mk6ZX)OyLrMn z1QY0~9YWB&ci2C1Kr;wK$QVhcslMsJgoZ?*;Dz)@^3v|DjirCUi=i&}jcL|&Oa{|1XLRI`5B0UN=q zqyrqC53kpQQu|!WRM+<9e7$hkk*c?$A>3#bF0;?`DD10x;3VQ&Coi8z5FXh$ROY&8 z_4owKnW_nS_u#(bSy*ikm%u*tdZM^yz-BnGdObsBxi#S_6NuRA{bEjouk~{IUIB)5 z;8^xa(FzKpz`_rr)qtI_qt95N#x0c@Kq<;Ph~322`6PNhM8VglN9`;dq4k^W?no>l z48LouX)*nld)I8MIaQY54Ukubo}wSWR?!f-+oI!&3p}L?`R=B;cvdhQpZa9XaS1{D r4tp&jGNVg*NaKm%-n@3DZMqkfab}!7Q+8;90d5i>WkpIp==%JBV;2R; literal 0 HcmV?d00001 diff --git a/documentation/manual/source/pics/006-first-time-wizard-themes.png b/documentation/manual/source/pics/006-first-time-wizard-themes.png new file mode 100644 index 0000000000000000000000000000000000000000..ea6debdd25e23686d713a2b470fee0318500c7e0 GIT binary patch literal 116123 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 z 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 XOEiKB)`HggS)#kz?=N{-m`c2 zuDyNdojEgey85fnyXvc7S9hp_oCF#&0Wu5>44UNEFN!cQaC|T@uuZQKp)IKBDV@+i zSVu((5ty=3qJ8KAqM@|J7nqknpA1lbG_>W7-B%4q7#I|+KVMjwq!c`8Ba)M(tQZm) z9{V*pvBb>;GYrfJ7|Acf%7DeAWmmxa8G^p^Q!DAy9~5+CWE7b0r?UGX+K{XdVPOb_ zbH!?)n=mxG*EC`31vIjl!pb@1pt)C*9%HkOJ`_Uls***r`n?1N+$aW4hCN1867P=_ z7tmgl1z?K&)6cV<6oO#+-pgNSd^l^fUgB}JW6r<%PfM?wg*_+E7G~2tQA2x%v`s}c zIlqSyqYh&dHRa#>_Hn7e7c~5$A~X|Q&m;yS3S{xPRna+QTkn|Q&xsF&$~v!q*lMP? zFc`EaxpDzMf5HLb3c`>Ry&ejt@?{Y|kn!ueYy44eCN3@(IAcvsw>MA2_)4rx}MEsri^M z3oY1ht~vEO#9|-Qp#BMY;iL?YHS*w?D1P}0*RuR|gr?-m5x!+P#AY@4PjlrQ=JW>L z`suOwCFR>KS@(zbAV$3dnTaF0g^KLly?3}jPu5|j#!h0cZkla%? zkK9t`y+ST2F|v5s`}VSY`QwdvF|bTw)r?S@z5p`BK5_2A@EW3=N0`a>wG-VOK~N58 z4F`P_D_Ghbxq16_3$<} zTz`dH69A01j`sLL&7QL+8^LidK1uWP&k-BZ{2Bd9b;dp(;~b!OF)uHbc@|R(U^d)>YBFjn{A$iQJ)9tdPp5OZ2fW z&P`NDyB#0nJ$qmumTS)s>~1}CAqsG$y%pH^ygT3+Ww#I-ouCkZ^5BE#C)=)12LSY5 zPb9JCupJL!+p@iwPhhBN{%_UU_TX z^TTwR5u9*&_Zo&IrS`Wlrwje9>G$}}57G@WZ+PQ2DzXcgP=WrwSrcY<_UsvR`xE;$ zX0@7ZVTwd9N9uGq3LRyO_UsMH4SZx@5}&$aI+Ir44SYVA>iv!2ZNu%^YDY_wC*s*D zGLB7IWhqbBxRS{>P3gcfl^T~ykSQO!-W}-VFhcX0hY#M*d}-W&9)949JjrNxhSJf3 zgRc^awb@Q7?A0BThlA54?8VaiarbeM{3|qe1gmAwFjmTT&98`wxpR6^{bhni1J^b} zSU_btsx6}_k9P#vKjn8ce)jGf%rsz4HZVuRUwtl6uZre!qx==ahf-wN&Y1%{vF@$? z@CB_WP^g~IC9RezD-wg)kN#+MuzO24ekV-~qYw)}Z~i37Lfn8b40>L6N}+tk1ot!}W@=-cMPZ|MPOg|eJ0EQs$s=lTc`CWReE4?% z!h44jWJFNfPQ0!{k=V-svs_4+DPV9xeuq!M56QH&<-H3Lzp9ewr$VBKjg0KiH|8*?UQjruVL*f@At8x3_1V(@5D?w& zc+WaMAZxN5hll*cH-YPw_n8M2R079H(h4#g$amLozc1q(#G%lYJRcU2Iucp^^=F&^HlwA@> zaz0Th)my$o@eH29xNT8x)oMvL zI&QAC3lb#Rk(p&&8LZk0`eL@hWq@ovI8Eln*_2hg?PzwWYho+=u|#rtV?28eXKnD8 zsJS}$71qMMf9ER8M4*IG_wfFE;z+-PiLc88WZ|6I{=N|7o1DXb$8+Ng_@3(#eo1YA zbUHT>$%A4v>zkIdPVWu>4|7z0i5Ryzf$2CU_e3kLKyIHD%J_EL$LpR_ZL`I&-SiVt za!%fXKHz0|>lG;6Ap)yYcx^)4O|n?8d^A@?ZlL0Ftt9s9aHes3yF7fT@WgwE?JR-5 zZjzRUIX7p@eB!|QbC`&?uz*SRz2bvnjph+SEYAND!JrXZC*ODFtbH|Hlr--=^XL>u$!3W43Z#n)PonBFsCy z_6u8{XLOU6=Hg5OcN0NppG~zz-^>>GJmw*CzBDx~T=vV$GG2EM)XV8Wj?Hso-8b|6 zmQCoJ$SVx6cu1D}j!4PfjO{Ru@~(E~kUePI|~vS5&W`ihT@z zn5z642?}%$aX`4Nf2z(qZ-{`4UyRpnNg(tx$6(*NPUiEg1GD>?ZL+a%g=~9eVEd~d~ z+@^Muq^)oF++Wq~?6-?oU=)7xu+!%Q;sET;iuy4HQkcVGrktSg8_*i3{h? z;E=|tC^v@z%Q1ey{%B}w;`u8W-qeXEp4oS&o8NN1(_7s5F|4mYKbB-g#gL9cuuZ?7 zyOOD$OTYtOAxyGSq(7Nr*u5w=+?3!Lo zboB>*I&H*m5*?9#k@ysio&1j5WNfFtbv@$dlKkrc6+g}IS)Q+8mw?D!7Un+Uoq9q) z{P{`&T@TjJ1z5^#L)q8ueecIcl|xDhMMUe33E0O)4T+HCJ$?rW%91aijlTYf$L0N* zxH+Cws<0V!4FCY5QWHDxiAYJB7cgWE_^NSxgaBM`ON8G@OpErR@k$ zvo>Y&YBlLagOp{io3Rj#pBmFojdad9NY|2G)`wp=H#{kG_r6*GY-J|B(&c#XTWvY^ zOv_-T)6z0i>2)YAIAy`s6HTLEJJX2@%s!lOX(oNy@Dm~{o}U2QbM*Ub*eMN(CA0mQwfC%!PawAH`7ww zsmCCP%RL1f#C}P`bIxYy)X<@$#4D)x5#cso=5Ii z)UltN@2|#b`>Ob!&ohjH0pW_MeKPG6@Js8f`FBiU6>T;c#1?*;BVLvMZidzxjB?Qg zL5dSua(?=FBLvxfZ2YfN+Ik<7iA_7^^h8y46Cd6aCKfVXl*vISBBNu7&e4s{7b9!3 z%5xWY)WhCA6M>kPxdvrYQ`290w>@K@!mUoT79CmX&G??q2jt10pHdGRNG%bf&z{Dz+n&{F+%+9$Y#;&K!!jC{rUT!B(>@Md^oX+H9} zrOc6(!anh26s!xe@uw=mRrvCzD2<1&Vh{TO0@VGnFXSoekGv?+Pp{t$e_|JSGiLMD z2nyuI<*?FU%yV+0f2^=GOr-@ItBvnveCUJojcd`k(59qf|@V-tF+hs5U+>d$yOKZ`20$V6NVk`;A-&7))r(NGd~#A^{}nvZyw= zu@3L4)x9q#3dD@x5GmyUvgwx(3_L1< zWDThYnheiZ&cmEGIaw2poum*s@blZx@eDBcP&qVf+P8O@f0#7naSrmYgVE%`$nIIk zO0h5P3wX}l10HXercy46I>ieNh}d5TCS0ae&E<>L2+l_@#Fli;X>CtWScSaKK!|E% zOnc>z`zxk##dfHDsf6|AU=I<0_wLhj^lT=Ki9=O~#peU{(s0`AP6C!SalQBLto=Yt z4C~ND66~I3TrC+osy7rx)`Y#OJl$_j>tqV_c-{}n4vBER=G$(e2Ynyf;p4L0&h-Hw zSu_gLHm7JdnlDVS&|dC-YJD+4kPMYnhb$VhOv7`dzy9`ZgZkDqcC{XxEzQ{;$U6+7 zN2GK<9JTaqw@JZl4)#BF1+*I__%-B|b}N4*ibsHo)C1Wo)@%#?nu7$8Pg9 zwildEV!RkaDFb4CkAQ;vGi@!pG!TG@ltJCd5J}ithhin|heIYL1($!ka_6oY!ksL` zBXDQ5yOl}D*7|HVh)B{bCDhGAi2PW1syiCIU3i}&=pMvY%)37F@oYxL;mLwz_h;HC zrE~J4!nYVQ6scU2e)|^=C5_bDA@ZN9#}Uo!uhHAp+Zc4WK@dgyoHV}CK#_L#guHJ* z8a`+2P}yxM6X3jW=}a2$mr#@Q@>buJvtwCy?=cw5H(*<5;7$?5m3Pl1M%4|#ga7v1 zC}d2@9s^ZKRyH@oxGhUD!R1Hw8;yh`0__&~H_DSCLyBj%(+P+q7n%MdTpOpyqfIkI zdow;1iH!&ya>)q19uu|aZOLF_|?q|4ZPq+?QooUF9*D1CJkK6~nPs=ST&@h@iuMT-0FN~Oth zf0pcIG_+LZFc_S;59lOay`*Y(nPFq6yZ}_n>ev>)DxahB3m;x_=mZa?w9v8fCWCEF zLnUNy9UNoVD9JT(Vdx>w?S%tcefWblOh-&dED`AFVqeJJ|Dal=jXj-vVbBu)quN}J zS-CQYGUpi#@3Ii(1DhVeRv1RKh>n|<9-Ahg*o?f#NO?ST72Ks~K^+uw+;7&9yl7iYJ#uCpxl12?5x+lR#k7TQ^H}d5R_%&#yuJ8}S(AI7wc^B>9 zC=~7i*qInu;{d^{_kzxSinf%~OQ9NT2t>1+Ms1Uh7+O~*sOa# zgCEPpn!M}8SYT%?ute$y2e764iW0MVi|}VmLPDXo2Z^ZyE4jFlXp>A**9lSWg|nXK z^RDOPw0;snjV&G4v{)on9++lnVaKKd;d zK5qs;83Xd{-S!gaGk0tFaeMfxwf@4CEEm^{&B?Q77qO#WMl|{v;V5`Wt}Ax1Mj%e4z;zP@dwK8P1^I+for!J1fl`W%jsPp59wy7L^|wyhvcc#`@={c`LU z<^9g!H@t_i9IeAbix?zZQEgXL&7pM<^$1M7-YNYd@|BW84v3t5w-?MY%A z(5g9gTCZ)*6)Rxr3X{{-LVONPVxXKc_-yObLGU)T4c+d|$0k|c#rn`Dh}U7>v?HUV zh*DS^2EnKg35nS057&#c5STSM561Vu?{}qc3fBa8G)M?N$l*^te@cMkye+N?G$C6L z^=Eql=wH}~`{8eE;S}c~Q}{C5d_8G5yeJ$ynUX3{h@1md)l8kao`RWpNirr3|Z z?e;GQ4^d@Tt=EElv#kWqbA+8;N=U4GKRxy=U}{Dhe0uR7el~`GyZ(_Qn!;F6keVOz z=qzCA_(301%*S7e0Sa2_lLpqq$W;OM-^hd^BD9y2GPXXyj;2D*H45*ybo_IH-$_h7 zfr{1aY}sOby!c{#3UOEr(JPELS$0~gqGraHB~yR4u~3tt_y*kjo3pibE6GZHWvee( zv3L?WpTgeecNKK~fRb!M#>w5hH@6PE2V0XiUA~L%K}`QuD+W)6w(gx;m~t^bp|2`1 zZ%cBfUZAxpYu63YEgRP1w__NIR#@bgEXv(7YF(;4bH$}nywCL%+;jilh`vwmorB%a_2-!XuutfZ)A*4n*;jzob4B(0TMZGu_A;6%hH^_90Q~l|CYv$6)j7?LxI&F zvQuIBr~F@NT@e%pmY*nD1r~?>MyOGVlyUZHQ)1jpVSpg=5pLW*69C)8%J0*~@n=H%k>A_c+*{?cfc&l%+!s1vwDz{Y2ObH~A zS>8Ya&f*MsK1?WCJ$b^1lG}bN@LOPQyCFC0Vz{CA`E~2gCl1aj2Y9UN{W2c1G$oH% zcV+Fiq_T_?7%5Io&uV*w-5KM7lai)fUc$q@iJwA!(rc21mIvDD&$AwYmL`EQ3=~tA zs@lNP^pTC8U0vf@+~#qY#=zZpMq`Hr^we{c9q*@CqHuK=kepu;pi`9J1V0UXYkmSe zYSwPRn(JjGCZizW<#&-y#Z^Wg>mtnuOFP0-5KqeMV}YH~gx(?EtcL9PKrITv~j!Bnj8JFTy{OX0sJGEVMO*l}r|F$r|$>02%rUw>rtxp;nZz39BjTjE^8 zs8H0en_CHT9+#6{(_eYE!Krud-#C=8*^Kj8G4y#d;A;fDz5Q}PoU?)BbNnYY>~&~P z2Y)J$QE^3RdsclPI>D8etnUrjRincmGz=e+!)Bw8D1 zE)7XqKQ^rreBiDtYfENYzFu&hv*5Kf`fI>=)E=g?#~o$$S>fC9`fFKB-=Y^Isq@53p#yW22$eGEEt&N^-~ zbJ)L0;J$qN=q+2NJHujakAjak0hBi^m78-_@hZfzb2+9v!CwsR?E%wNJ?Wo#dtv8a z%xIF38${?ttCXH^w!FL`vsXvH@Niq~I5$?e z@R~8%=%%Wl^m!oQqiX33%4SXha`*P$Qf<`Uz#_^d3{`ge^xhRFJ{Jsf7u?jJUyJsX zJwN>=Iv!YBTY*v zNl3leR!ULgk!GKoZT^l}R@uq47gUkRF@L$x>_+(V&LloUbisk)fP%K{c?IZX~TLZC6k5YoEsI zS#M5RfZO5tUd!u4o>0!VRIz;W>buiLwbhj5(Q!zUc$U?3 znlnZBG_7F?(GvCYQNnKXF~3s(llj!)(rosp5v|(H@8LgD)9>l2kd^bThk=RmZ3UUb z?#_JH*&gSRRzH?qd(&%fGsniKldU@iQKOu#%diJeCfhc_Xs|d&hUH}(s<#Om80RS* zdYI*L7G1De>@E3JHGtpD#0gobLi!45Ijc-1`=g?DYR4Ke}rWEG%x@1qdSy(KR~EeGYP&sIr~XkP%uhOy_zx|2Ew}Ig}Y5 zfl8xoE-=lXoSCa|`<>V4dapZ5(9!|({ZJ%b(j=xA``j*^0w853-~FeogdycoT8e|4wZRbPjT37uTEV^akY$hY29?KhwP&{`D zzKLCmy?l$&(g@V1I;^(5HbcI-)Ok=B&~6Qi)KX>QwuEJ5O4=ri(ru$n0QYxzVaK z7`kCeGTV@@?odYU8i6VrsyFyFg|p7=Nc@O?Wb{H>y^ z8Vy7<6@vFFT>XA>7gkzE4gfg4Dns6b^I-b!Nqj>O7R$30+&Nhpl^_=xhb>#@-`8PG zcRas0^Ab55UK(&6;&kL12rz9%y4$M8uW>5YPt3jX#z?}j6&sB^rqHDCes035e_KD5 zUV8Mk%8>ho7EG6lx6+N)GiFc!N`GvWD zUjM+PoV!f3GpsCgB78?U_y#i!_C;Tw&fNU{Vz^vHc3*vmG%TvY6)C=OZ(S+Tf?~(R z)!PW7<)S+`vKp&BDRHZyu6EVybEQ$Ms4n|&v3;t!jK!?m8oE9<hD@bU_x}`SjH#pl~vxRYMu&z_|jtF|hG%zLF>h%GarTI(^X>ldXLkpYC z3C&1&6YvD-=t~@A5ec=)N8opGuk@ja7R4v9HkZ*)rai z`DW^}ilBB}ku1HJM{s)n7SR0NUSMj&nAdiDuMYWPMsk&#B%U{PL2Kcdp;Ca!e@owxx}E+ks+!!7N`)KSk9DehTE^(~53g z@Rx9Okl{yxS(zAQhSGGC9@A@pPe<|6L+4wENd5-r9a@Noa>C{J#SdqSr?h~2V&Tp1 z+#`8XnHxrg8jm_E_)U}Zj%TL_(`Om?VkGnRH}fp>hZ%8$=`TeUtyV&tLFJFzRwWY_ z3dAdz2IY#)IuL)mp>XnCA%t6&ObPbrxTtXHWu6A}Nufj8iufBvRo7cb(GmGipE}MT zs;q1>>^r8eFRIuHdL*A>Nd-q6c!+Q#?UZO9=aGA(W-bq0fDVtWsh(PiV-m?g$CkwZ!1v5QmTiC0&K7No4KIL`yor3aNZ8Xt*CTYoia5>`qk&VxkG zW_8fNraAMIQH2sEyCPU$<=8YH)^L}X(>!V*097pXBeWL`5SJKRzbddn^;s5kG;dRU zkFDZdml}RU*!Q$JZvH10=M)rb-pwe`+88l;?)wUC9L9B_UDgn7H^y8PuSV0hn`U#I zH+yuY4U7M3?fKC`dIH{lkReY$3V(1lijX~7&6roq%C3NJy@|cmwol{ruSfH78}@8s zhUye#2rnz$75l99i~mt~-V#2xQ1tV9icY=1;N+$mUm3ALm{f02U&2vAT#?MNiiMZ5 z5y7H{p6)>Dz8w!C$y#+SE*>9s&6OL68+o|P;r@jS3Lh6@oz*)>E8n`$>bYBfrkEY# zeTUUO^bnL@dAG#L^M(Y?o3Va1SJZ8YwlEqpGR=*&#`Kq;1G-s`gNI{0F#?<_uEXZ` zmyQwxwCD=%?Maf_dH&S+J;`!P!I|k7*v&s{jKwrv(~kCmZ~%nItO3anV9gdHD`P5S zf7jP551zZ$-QPCsRP|IAJ+c4F`x(2M)oI7ca?M?@-6KF^)kglHtt;8H$OSiFk4LS1 z-y5gVr!=5XlY&!WmuDLLnC#|0`}vk>p20=L2cB*;v60=aTheNV6+ddKc-HjQ(I}*N zEF(qXU0FbN@7)c3swWHIP5tI8uoZwDv zyw_qT-_T)k=Qp%MdoCQrYg}C4({I~9XwW;{FXL0uwyCc6;(IG^3SLg@nqXh8I?z`g zsaJy5!LcdJ7z8~>@_7npH<+3nw!)VjY}XvVfJ z?VZMnI8_zAM@TGgrq0GG_Y!uLNqRno>xya6a5qkgdIkxS zS0tGKA@Bcd4MqOt_P~GWtpADl|LZ{f?==izxu|#aQ6`3iWAq99a;rZ~PI_+Ha?eQH zgCU?QESW0iC|tn z!4WHizpK#(`S7dy*1>F@$*+r6&7-uYGVdX;?%^Owt1N6;dBRbaDBXh~ppawu*2^ynzBAX7Y`1r#)dX zMjn5tB|~~y$E+xH5GsD(T@EcR6~6f;n>5j2PlzaR!QMCJdReY2+wfSwl(oAH=}cXB z4r%eBb?d37OU`4iK@z#*qw%oqv#AyEI@=bQ{a?9fRZsVH`$!t9OgzVmZzs0)} zeeP=#ok-5J4Z>SyLm^V0dNY}1=JE><&4ruAuizV!Xb*NOnkMRRvOJDc(u7~>BDTZ9 zwj0M-rgu)Bj5g0(s3sD?((Ze)k@?|EMr*2v?e8surBrBMsAj0GUvAu@GsPY4gOm1sP9%s-y?CEQ=`KRdN~(1-3a%-J}z+(^|WtR5cx)vCPza zp!I$aSD?}GQH_m*w$evqkWg*(rm;pW#G^Rt$gKUPuir$AM4k4 zd{(8EAw09`>_cv1Q1mHpUlgCamN*bRXV(H#VjrH!@trJ9-e#-+oSX=JPnKFYymfO= z1K(tEf4R$=;M<9H$gP}@)%wV3Ka2W4Wvx$8XOEu^S*;XZwnHE;H`3_2=-O(b@pm(e z;C5qAWelGWxAxqTQNpB;$4V64)ZgWBf|B=Qip!6CwA=lI z7{WyCy<|z_Dz$*q7U7ZSEqXSj#f9Y<_v8pZyA*Z3yyp&|y4I@UVM9RDC{OI|oN24D z-d3*Km0v%Ua`wFsG2-j%(R3@&uM9;%7NZ?v!hd(5ZLk$?4yZ+BO>;2X>c;kAoE5c>;L{Ya}rg z01>2eEA1`TeIeYSus4#IZZ7t8d4qLot5Jn|-aS`LxJ{r(Lhud-Sw^>Rxw6C2wvAVs zPq}q>bF-Y?!?fg$H&4_Ssj3}h1JO~zwDB?{FWVEBH=_I|WeqZLni$2F{J65DW&w^* zwAi@$?d7-{xulX;&W8PSMC$Wws3ju zRA^MYW2BND8fte`yhxesC&%4)E*_}cE5g^zFa)dUOZJv{%*8Hif;DK|ZPw%+7L+^j z#|^-wPMBwXk1TA*Ba^xWUe=;QtqDW4NIcduc3ous0*S-dxGaW~(nJa=rIuLdy6|^b z?IZ&DDr|)7ixr%lvqPI!o+KI`a}J$8OjtY*S;8H~Bc(Dng|w~@e2%;IM`uL6F)PA* z<7;zI+}`{UVkLsTlrq6lWW0}fJO$82x-@8Knl->~vtkE8lYtWQafv_t62B+^n-13| zWlfJ36mLK!mu+d&P#l8^GsSY}uqR`s zjNB?VJB>XoFgyA&O7&{21bP>yDbzodvV~_@e?1;JIXI$`y1yMPYyEjM?>ak;gl)w- zfhqH?dE1k)XKne%!dSfI?fMCK?4d|T$GY+gpcIK1g!s7pUX1a})ipj>E6R_>FtE+w z*N&~X5pB}k*;4i$g56lsnlynf5|7KIL=PapbLGHQp(qCvUQdw`5U>DkmmzwBW5i4F$o@ixPC$sq#wz-Mdm2?_&dkEx)j+CpFSv0Ib= zz&STtTON2;&Zrd=M0)-oC0X#%@rT=3W#ZWxi!+Lc&MjpWRrL7XKKFdKbPHmB8o|2M z6au|6Ml<4a7JpX$45?$aX|LR3T`6jRC8uaSREELY>cQ(fw|Z-dDxd=J!qN-Ogp@Ws z-m`@b=2Du2-rTe{e4sz^J}J20-vS@RS(H<6Lqi2wpBxUi7!VDWq8K93XtK!%1`2_q zQ``GO;_pA~R$HwVmRmw~oZ z-=_lk?W`Y(ig5|tZlmKH_7}Rg2t4c`mC7%N6Z*68gB=c?qFS8110MDntUbz`(xTGE z(?*Ju9&<|H8C7p^sJb<}&@4-+8Ix!sdJHb>Q6uvaFd{vgaWl5V`PmOO3pxBiKKU*J zwD?FbfE(W=3`J9jj$ElJ`grl>IqEHLNPS~Vm9kzpT!E0#Y+Ircq)Dn6OdDG~?+r)gl0w^t_XJ`k5{fLa!E{8Z(?~<5H?O`V12_0OH zIlScs<)hDu&r}Mwnz7jc+}dhPb?K%|_HnVeJ`aJC-)uhT!SjLLn0UuGPELRRju&6) zfv;f?M@ifUaZGLCZv|5pck@icy^~Mv(=7iLeI2}}Gy}cuM#y9zkPhnzAs8E zg*a8{5Z!7}2*YTSN8|X6WvCb>u(_dI&k3lW6h9Zq4C~5z6mwSYi}-tEoVm0i0l-NE z6Q}9xc}S;ZEnV(;s_f*84qq8+j~zRz8PXO--b)1-HixEk4jvINCJ`scYM0g5U3jsL zlwZk6Jh)3dTFx}GlZtUZ@ek`c|1gLal_s9HmK40am*ZbHt?%|HN55&-7dhZ1k*`BR zDLZ&SW!>>j740_GG58KV@TpX)I?Bxgx~YIWF8*Ec#iEkVnMgU@}j;n5JM2BrON!QOYrcfLUMK;|MxA#4ucYUgV*CMvXQ zHS(lcN6~MW+?5c~+1^Cv@5yI2?7l&TmiHzSJT6woN05{;;QU}?N!A*8osws(e7%c( zm${IGrLL_bMBw&9^!KuxRXXGj->))m+Pk&B zOEFH1q_OIQeO@=i?|iCa{y*U+9ZRqUXVbdYRrD^Oe#jhcUzga*r@5UVZs-zr5m(RJ zv(;jTbNfdNwhhIszwB_zatSlY)rEHn&T{xZjvu- z%b61uIv;Z!lHfw;f)$F3C3+=fhN%25VNcKbou-6LmIU2kp^y)BaGjx%(YzcKsUlPBe<$uE&H0e30 z>fZYF##L-DwN6EEri}dyYyTlFrIV$!)6`o}>?ypP-qdhvLJI$ETxahb$!2ct8+4nhX)J+#X>TnyY~Z#0 zxFAo=ntSB_ZMTUZ=}Q_~`Ep2GG=GmqdMuA^WBtyrv9#Rhjb^v4;4ftWpmZX~HZS3y zh@xP1pot6ipZRg4hS_|{?*E*$d<8#}mfn?9L1W{VjNL3P-8*w1r`1&Zsp(fTORoP)2?q2wn8d?B-Gv6+Y7wuE{qvtP?hbV%}WwNvWj|H<}jYap8z)#%2Pca zMqHcciV6j8b_#9jte%1W>=STS<;OzYr{Da{0M`T>W2BFj>#a(X`(HkdZWi?_4Qv{p zt383|6E>}glxyUXzoB5wY!g3`{wwH0!%t!1U3PSYv^2iyak32hDM@yribiJKhLz>M z!H{D5+~PKTZ+G&Kn-CRD{@RXbzx)SG`STE3T8p$aWcv#3bQjq0m`ffI^&}V47V!sy zfu8=aHuPDQ!fF!T*lX!*Z{Ja7#-w3!Gj=8kQY@dQy_N#a znSgjo{iN-*ZjPQ~GrNL@B(>n=uXA&A-@VK2GAtdaFe(g89r2Yb@6t_e)1-&?_^abH z`60WON{uEl{skxFr!#H(pj zj2N;0yyIG%4h8+aAxIrq&gcb3z}(LjuGHjmr3po&LjJ4}?mgG$1@ksd^L=tG3UeY9 zVg8aSEI<0nO#)k9E7b7cjUW5%oS>^>qdwqz7cPolOf`$Wh!QKeHrOK*Yd!Q7w z<1_y+Vq105GOY>5SLx%YxM?E88Sjf=cwF6G-*jJ2yX~aWbf27ztPvheFh0^1|JG@! zwEUpUOidS7tMBT#+bj2c)i1k&5y?4GN7u@0+{;_Uu6rP zX9@J$Ix-|wVx(pia#LlY>XldNCKqKb9;?%FlzcAGL?}^3rsJUNp+drK4%5jNF3!Aj zRUO8aCo;wQmV|R|-wKS#=Oi{K_XocJMcL0;e9q zDZ;A;yc#nrRpb#GGj=oSBYA>Szg`n6#!u0!Pw@ClBZQVNh+3rrSGU6kBV>faI`0*K zYF27uZ(P*WxT?+nHu-)20eV4*z{y7qF)Y9kZ!x;T8ve8p^%17QquZ*iNsys*P4N#xfPg-D9W1p)L20msYxuEO>(Me7oG8-MC8@ zV!Dzp(vo6(l4LcupV2cuP$wct=K7e74DB?hPyTVC;;Ei;`Kz>-({3dTAq_g5k~qx< zVY%}1+Q0JjuOSd5cNp7F{v$sx1~T=omK(rc%N9xV_W@A1?Rs$c?CV(6z`u{R9y)Wyiz+n^q(JC2f{ls!HO~T}8N0YgantrW+TZ{0WLnGa z*F5x^JwdiY87URe(L42qnCI-W4ut2KoN3RQkuj~EZ|Q7ixsJtBs!Gcvh7y#dQ}_4I z9>>$ga6CO>{Pv8;%}!BRbx=`QL_{K|Hzqg7tCHgGJRHfTy>X>*wbvTSwakswe>Xv& zblnsN2AS^9djWKLuPtgdTOd#7%dPZ(=B>`ScE@WG!hpAnA7ps`;QV*NQ(tla+d1_= z#K!;Aee{rW5HIjoHQgH5b8?~$Mia=a9*MqAy=a=?S4QSL%=5K^4{s2KLxTik0*dgm zL!x|r2xUT~P+$4|c*SkVWEl7=rr-k!9xN~mjz9CgheB>{YHH%`HE?v28swstzZ^G4 z<;DU|HC=Vxy*F)hTXE%qc})TX(*Y0j0RRK@3ghp8zH6{Bn9$cQ_#wdvox%K_=HHV3 zJDPt>`ZsoeqxpBF|G?*8CI2(cKS=(!?Ea|r&)WS14b+f-X7_h1|5K5EeeeFg#sAMd zp{D+SFykK__|K;P?*j3^jy)z{9L#?njel_9KS!+PQzYJS4%N#UFD(KLk%K8Ck02pu z$*J5~3TV%h78Qo54iTI0Q3?7Akgh-vXny|Zk^7f4C2AE{hl9aus*;(tWvH^3rhOWj z^g|WS{e3k}lL$~|SL&NlEQI7V)R+C+cDssfHk@fPS zhMK#q{E_=307gHA!^-CSa_`GlVeXLQfCkm~m81Q_nWaxG>XG8CV+?xHkEBnQ?(Xg^ z-oxE8C#7$o%;liMFNUjWFA^Q)Ml1VdWPNBQiz}G?RYzL5s~yfIEbkYLq*?7d0Z?5hy^_~X9dps*ff{hkfhFF+M!QlO2hUHZ4BN^#UuJ&qp^T`K?>#4xB5S|nrGeLn}g zS9JQA;{}prhiryBsq=S6*-JqrdCdK8r8D(g{z@zH$!bK2w-gKOu)gq)r_RmEvb5Azv?Z&2P46t3w?`O#)psh2wP6iZiU3r zxzD*Zy2`RX4cQKwd*$y0CAa<#ALXGZ}Cc4uMT00*LN_vhX(-mQ=`#Hy}qqG2e0?1$cQZb z;d8nFyotM>dwC;eS*F>)E%jD2MP+2h)cRAe7fI@AB`F*A)cbeLt1P%a_un}!-@o;` zTy*WZd$5#6D@9RB(%POY?dP`7t7PT{ zU&=YZxjLU%a8(-BYRWNl^0Di`my3_BrdYGLW3*CqW%(+C2LOh}9HS_^ z5XKWn_!6ImcDT{i*Xq6Sy}*q-~j*-JOBWK2LM3u000Oc006-Q03dh(0Ko$Q zAb0=(1P=g!-~j+QRQCGep)b9-+6n;xM{e+3`Nb=&4ghdCXe4R2M=MFu9%Xx^vWEy7 zm1K01F&&QsUyp7--(!6NfMF0j^(5QcV{3bC>v*j1X@{q5mr<)-ON}J8jzB8g-vqma&%oEUH^olH8Up}_SlJOhMMvax-n3lq>s?v{@l(l;9iPqt w0C1>-r*jm$>6kr6OJ$Ic006@wdiMJGKXY2iv479%h5!Hn07*qoM6N<$g0IQ{%>V!Z literal 0 HcmV?d00001 diff --git a/documentation/manual/source/pics/011-first-time-wizard-song-import.png b/documentation/manual/source/pics/011-first-time-wizard-song-import.png new file mode 100644 index 0000000000000000000000000000000000000000..30d29b2e5303d68c1eb16ecb97e0c8af922530f9 GIT binary patch literal 5481 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 literal 0 HcmV?d00001 diff --git a/documentation/manual/source/pics/012-openlp-main-window.png b/documentation/manual/source/pics/012-openlp-main-window.png new file mode 100644 index 0000000000000000000000000000000000000000..7e7fb9fa69e37dc1f810323ac2ad088d3ad7de08 GIT binary patch literal 140777 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 z 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�vH+Izq=g{R+(Njce=py0F!qMSzzZIL7 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�TFf4J%SBsZUqI7j6N)a6lOY(dL~hR!(Ax~3;3QP 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 Date: Sat, 9 Apr 2011 16:50:44 +0200 Subject: [PATCH 38/89] use weight to sort categories --- openlp/core/ui/mainwindow.py | 9 +++++++ openlp/core/ui/servicemanager.py | 1 + openlp/core/ui/slidecontroller.py | 2 ++ openlp/core/utils/actions.py | 42 ++++++++++++++++++++++++++----- 4 files changed, 48 insertions(+), 6 deletions(-) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index ab712a57d..63c5aa777 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -39,6 +39,7 @@ from openlp.core.ui import AboutForm, SettingsForm, ServiceManager, \ ShortcutListForm, DisplayTagForm from openlp.core.utils import AppLocation, add_actions, LanguageManager, \ get_application_version +from openlp.core.utils.actions import ActionList log = logging.getLogger(__name__) @@ -161,6 +162,7 @@ class Ui_MainWindow(object): mainWindow.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.themeManagerDock) # Create the menu items + ActionList.add_category(UiStrings.File, 100) self.FileNewItem = shortcut_action(mainWindow, u'FileNewItem', [QtGui.QKeySequence(u'Ctrl+N')], self.ServiceManagerContents.onNewServiceClicked, @@ -183,14 +185,17 @@ class Ui_MainWindow(object): self.FileExitItem = shortcut_action(mainWindow, u'FileExitItem', [QtGui.QKeySequence(u'Alt+F4')], mainWindow.close, u':/system/system_exit.png', category=UiStrings.File) + ActionList.add_category(UiStrings.Import, 95) self.ImportThemeItem = base_action( mainWindow, u'ImportThemeItem', UiStrings.Import) self.ImportLanguageItem = base_action( mainWindow, u'ImportLanguageItem')#, UiStrings.Import) + ActionList.add_category(UiStrings.Export, 90) self.ExportThemeItem = base_action( mainWindow, u'ExportThemeItem', UiStrings.Export) self.ExportLanguageItem = base_action( mainWindow, u'ExportLanguageItem')#, UiStrings.Export) + ActionList.add_category(UiStrings.View, 85) self.ViewMediaManagerItem = shortcut_action(mainWindow, u'ViewMediaManagerItem', [QtGui.QKeySequence(u'F8')], self.toggleMediaManager, u':/system/system_mediamanager.png', @@ -210,6 +215,7 @@ class Ui_MainWindow(object): self.ViewLivePanel = shortcut_action(mainWindow, u'ViewLivePanel', [QtGui.QKeySequence(u'F12')], self.setLivePanelVisibility, checked=liveVisible, category=UiStrings.View) + ActionList.add_category(UiStrings.ViewMode, 80) self.ModeDefaultItem = checkable_action( mainWindow, u'ModeDefaultItem', category=UiStrings.ViewMode) self.ModeSetupItem = checkable_action( @@ -221,11 +227,13 @@ class Ui_MainWindow(object): self.ModeGroup.addAction(self.ModeSetupItem) self.ModeGroup.addAction(self.ModeLiveItem) self.ModeDefaultItem.setChecked(True) + ActionList.add_category(UiStrings.Tools, 75) self.ToolsAddToolItem = icon_action(mainWindow, u'ToolsAddToolItem', u':/tools/tools_add.png', category=UiStrings.Tools) self.ToolsOpenDataFolder = icon_action(mainWindow, u'ToolsOpenDataFolder', u':/general/general_open.png', category=UiStrings.Tools) + ActionList.add_category(UiStrings.Settings, 70) self.settingsPluginListItem = shortcut_action(mainWindow, u'settingsPluginListItem', [QtGui.QKeySequence(u'Alt+F7')], self.onPluginItemClicked, u':/system/settings_plugin_list.png', @@ -253,6 +261,7 @@ class Ui_MainWindow(object): self.SettingsConfigureItem = icon_action(mainWindow, u'SettingsConfigureItem', u':/system/system_settings.png', category=UiStrings.Settings) + ActionList.add_category(UiStrings.Help, 65) self.HelpDocumentationItem = icon_action(mainWindow, u'HelpDocumentationItem', u':/system/system_help_contents.png', category=None)#UiStrings.Help) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index caecaca50..528b642ce 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -167,6 +167,7 @@ class ServiceManager(QtGui.QWidget): 'Move item to the top of the service.'), self.onServiceTop, shortcuts=[QtCore.Qt.Key_Home]) self.serviceManagerList.moveTop.setObjectName(u'moveTop') + ActionList.add_category(UiStrings.Service, 45) ActionList.add_action( self.serviceManagerList.moveTop, UiStrings.Service) self.serviceManagerList.moveUp = self.orderToolbar.addToolbarButton( diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 66c26da3b..204dada75 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -367,12 +367,14 @@ class SlideController(QtGui.QWidget): def setPreviewHotkeys(self, parent=None): self.previousItem.setObjectName(u'previousItemPreview') self.nextItem.setObjectName(u'nextItemPreview') + ActionList.add_category(UiStrings.PreviewToolbar, 55) ActionList.add_action(self.previousItem, UiStrings.PreviewToolbar) ActionList.add_action(self.nextItem, UiStrings.PreviewToolbar) def setLiveHotkeys(self, parent=None): self.previousItem.setObjectName(u'previousItemLive') self.nextItem.setObjectName(u'nextItemLive') + ActionList.add_category(UiStrings.LiveToolbar, 60) ActionList.add_action(self.previousItem, UiStrings.LiveToolbar) ActionList.add_action(self.nextItem, UiStrings.LiveToolbar) self.previousService = shortcut_action(parent, u'previousService', diff --git a/openlp/core/utils/actions.py b/openlp/core/utils/actions.py index efac7b1bd..214a42249 100644 --- a/openlp/core/utils/actions.py +++ b/openlp/core/utils/actions.py @@ -154,13 +154,10 @@ class CategoryList(object): return False def append(self, name, actions=None): - weight = 0 - if len(self.categories) > 0: - weight = self.categories[-1].weight + 1 if actions: - self.add(name, weight, actions) + self.add(name, actions=actions) else: - self.add(name, weight) + self.add(name) def add(self, name, weight=0, actions=None): category = ActionCategory(name, weight) @@ -171,7 +168,7 @@ class CategoryList(object): else: category.actions.append(action) self.categories.append(category) - self.categories.sort(key=lambda cat: cat.weight) + self.categories.sort(key=lambda cat: cat.weight, reverse=True) def remove(self, name): for category in self.categories: @@ -230,6 +227,17 @@ class ActionList(object): @staticmethod def remove_action(action, category=None): + """ + This removes an action from its category. Empty categories are + automatically removed. + + ``action`` + The QAction object to be removed. + + ``category`` + The name (unicode string) of the category, which contains the + action. Defaults to None. + """ if category is not None: category = unicode(category) if category not in ActionList.categories: @@ -238,3 +246,25 @@ class ActionList(object): # Remove empty categories. if len(ActionList.categories[category].actions) == 0: ActionList.categories.remove(category) + + @staticmethod + def add_category(name, weight): + """ + Add an empty category to the list of categories. This is ony convenient + for categories with a given weight. + + ``name`` + The category's name. + + ``weight`` + The category's weight (int). + """ + if name in ActionList.categories: + # Only change the weight and resort the categories again. + for category in ActionList.categories: + if category.name == name: + category.weight = weight + ActionList.categories.categories.sort( + key=lambda cat: cat.weight, reverse=True) + return + ActionList.categories.add(name, weight) From 9011c85a6beedb1ba623374b34029c7cdc122556 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sat, 9 Apr 2011 18:11:02 +0200 Subject: [PATCH 39/89] removed static methods --- openlp/core/lib/ui.py | 9 ++-- openlp/core/ui/mainwindow.py | 19 ++++---- openlp/core/ui/servicemanager.py | 23 +++++----- openlp/core/ui/shortcutlistform.py | 9 ++-- openlp/core/ui/slidecontroller.py | 18 +++++--- openlp/core/utils/actions.py | 50 +++++++++++++-------- openlp/plugins/alerts/alertsplugin.py | 6 ++- openlp/plugins/bibles/bibleplugin.py | 10 +++-- openlp/plugins/songs/songsplugin.py | 14 +++--- openlp/plugins/songusage/songusageplugin.py | 14 +++--- 10 files changed, 102 insertions(+), 70 deletions(-) diff --git a/openlp/core/lib/ui.py b/openlp/core/lib/ui.py index 35ea23497..20aca9c6a 100644 --- a/openlp/core/lib/ui.py +++ b/openlp/core/lib/ui.py @@ -259,7 +259,8 @@ def base_action(parent, name, category=None): action = QtGui.QAction(parent) action.setObjectName(name) if category is not None: - ActionList.add_action(action, category) + action_list = ActionList.get_instance() + action_list.add_action(action, category) return action def checkable_action(parent, name, checked=None, category=None): @@ -297,7 +298,8 @@ def shortcut_action(parent, name, shortcuts, function, icon=None, checked=None, action.setChecked(checked) action.setShortcuts(shortcuts) action.setShortcutContext(context) - ActionList.add_action(action, category) + action_list = ActionList.get_instance() + action_list.add_action(action, category) QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered()'), function) return action @@ -335,7 +337,8 @@ def context_menu_action(base, icon, text, slot, shortcuts=None, category=None, if shortcuts is not None: action.setShortcuts(shortcuts) action.setShortcutContext(context) - ActionList.add_action(action) + action_list = ActionList.get_instance() + action_list.add_action(action) return action def context_menu(base, icon, text): diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 63c5aa777..2038e1972 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -39,7 +39,7 @@ from openlp.core.ui import AboutForm, SettingsForm, ServiceManager, \ ShortcutListForm, DisplayTagForm from openlp.core.utils import AppLocation, add_actions, LanguageManager, \ get_application_version -from openlp.core.utils.actions import ActionList +from openlp.core.utils.actions import ActionList, CategoryOrder log = logging.getLogger(__name__) @@ -162,7 +162,8 @@ class Ui_MainWindow(object): mainWindow.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.themeManagerDock) # Create the menu items - ActionList.add_category(UiStrings.File, 100) + action_list = ActionList.get_instance() + action_list.add_category(UiStrings.File, CategoryOrder.standardMenu) self.FileNewItem = shortcut_action(mainWindow, u'FileNewItem', [QtGui.QKeySequence(u'Ctrl+N')], self.ServiceManagerContents.onNewServiceClicked, @@ -185,17 +186,17 @@ class Ui_MainWindow(object): self.FileExitItem = shortcut_action(mainWindow, u'FileExitItem', [QtGui.QKeySequence(u'Alt+F4')], mainWindow.close, u':/system/system_exit.png', category=UiStrings.File) - ActionList.add_category(UiStrings.Import, 95) + action_list.add_category(UiStrings.Import, CategoryOrder.standardMenu) self.ImportThemeItem = base_action( mainWindow, u'ImportThemeItem', UiStrings.Import) self.ImportLanguageItem = base_action( mainWindow, u'ImportLanguageItem')#, UiStrings.Import) - ActionList.add_category(UiStrings.Export, 90) + action_list.add_category(UiStrings.Export, CategoryOrder.standardMenu) self.ExportThemeItem = base_action( mainWindow, u'ExportThemeItem', UiStrings.Export) self.ExportLanguageItem = base_action( mainWindow, u'ExportLanguageItem')#, UiStrings.Export) - ActionList.add_category(UiStrings.View, 85) + action_list.add_category(UiStrings.View, CategoryOrder.standardMenu) self.ViewMediaManagerItem = shortcut_action(mainWindow, u'ViewMediaManagerItem', [QtGui.QKeySequence(u'F8')], self.toggleMediaManager, u':/system/system_mediamanager.png', @@ -215,7 +216,7 @@ class Ui_MainWindow(object): self.ViewLivePanel = shortcut_action(mainWindow, u'ViewLivePanel', [QtGui.QKeySequence(u'F12')], self.setLivePanelVisibility, checked=liveVisible, category=UiStrings.View) - ActionList.add_category(UiStrings.ViewMode, 80) + action_list.add_category(UiStrings.ViewMode, CategoryOrder.standardMenu) self.ModeDefaultItem = checkable_action( mainWindow, u'ModeDefaultItem', category=UiStrings.ViewMode) self.ModeSetupItem = checkable_action( @@ -227,13 +228,13 @@ class Ui_MainWindow(object): self.ModeGroup.addAction(self.ModeSetupItem) self.ModeGroup.addAction(self.ModeLiveItem) self.ModeDefaultItem.setChecked(True) - ActionList.add_category(UiStrings.Tools, 75) + action_list.add_category(UiStrings.Tools, CategoryOrder.standardMenu) self.ToolsAddToolItem = icon_action(mainWindow, u'ToolsAddToolItem', u':/tools/tools_add.png', category=UiStrings.Tools) self.ToolsOpenDataFolder = icon_action(mainWindow, u'ToolsOpenDataFolder', u':/general/general_open.png', category=UiStrings.Tools) - ActionList.add_category(UiStrings.Settings, 70) + action_list.add_category(UiStrings.Settings, CategoryOrder.standardMenu) self.settingsPluginListItem = shortcut_action(mainWindow, u'settingsPluginListItem', [QtGui.QKeySequence(u'Alt+F7')], self.onPluginItemClicked, u':/system/settings_plugin_list.png', @@ -261,7 +262,7 @@ class Ui_MainWindow(object): self.SettingsConfigureItem = icon_action(mainWindow, u'SettingsConfigureItem', u':/system/system_settings.png', category=UiStrings.Settings) - ActionList.add_category(UiStrings.Help, 65) + action_list.add_category(UiStrings.Help, CategoryOrder.standardMenu) self.HelpDocumentationItem = icon_action(mainWindow, u'HelpDocumentationItem', u':/system/system_help_contents.png', category=None)#UiStrings.Help) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 528b642ce..864acc138 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -40,7 +40,7 @@ from openlp.core.ui import ServiceNoteForm, ServiceItemEditForm, StartTimeForm from openlp.core.ui.printserviceform import PrintServiceForm from openlp.core.utils import AppLocation, delete_file, file_is_unicode, \ split_filename -from openlp.core.utils.actions import ActionList +from openlp.core.utils.actions import ActionList, CategoryOrder class ServiceManagerList(QtGui.QTreeWidget): """ @@ -167,8 +167,9 @@ class ServiceManager(QtGui.QWidget): 'Move item to the top of the service.'), self.onServiceTop, shortcuts=[QtCore.Qt.Key_Home]) self.serviceManagerList.moveTop.setObjectName(u'moveTop') - ActionList.add_category(UiStrings.Service, 45) - ActionList.add_action( + action_list = ActionList.get_instance() + action_list.add_category(UiStrings.Service, CategoryOrder.standardToolbar) + action_list.add_action( self.serviceManagerList.moveTop, UiStrings.Service) self.serviceManagerList.moveUp = self.orderToolbar.addToolbarButton( translate('OpenLP.ServiceManager', 'Move &up'), @@ -177,7 +178,7 @@ class ServiceManager(QtGui.QWidget): 'Move item up one position in the service.'), self.onServiceUp, shortcuts=[QtCore.Qt.Key_PageUp]) self.serviceManagerList.moveUp.setObjectName(u'moveUp') - ActionList.add_action(self.serviceManagerList.moveUp, UiStrings.Service) + action_list.add_action(self.serviceManagerList.moveUp, UiStrings.Service) self.serviceManagerList.moveDown = self.orderToolbar.addToolbarButton( translate('OpenLP.ServiceManager', 'Move &down'), u':/services/service_down.png', @@ -185,7 +186,7 @@ class ServiceManager(QtGui.QWidget): 'Move item down one position in the service.'), self.onServiceDown, shortcuts=[QtCore.Qt.Key_PageDown]) self.serviceManagerList.moveDown.setObjectName(u'moveDown') - ActionList.add_action( + action_list.add_action( self.serviceManagerList.moveDown, UiStrings.Service) self.serviceManagerList.moveBottom = self.orderToolbar.addToolbarButton( translate('OpenLP.ServiceManager', 'Move to &bottom'), @@ -194,7 +195,7 @@ class ServiceManager(QtGui.QWidget): 'Move item to the end of the service.'), self.onServiceEnd, shortcuts=[QtCore.Qt.Key_End]) self.serviceManagerList.moveBottom.setObjectName(u'moveBottom') - ActionList.add_action( + action_list.add_action( self.serviceManagerList.moveBottom, UiStrings.Service) self.serviceManagerList.down = self.orderToolbar.addToolbarButton( translate('OpenLP.ServiceManager', 'Move &down'), @@ -203,7 +204,7 @@ class ServiceManager(QtGui.QWidget): 'Moves the selection down the window.'), self.onMoveSelectionDown, shortcuts=[QtCore.Qt.Key_Down]) self.serviceManagerList.down.setObjectName(u'down') - ActionList.add_action(self.serviceManagerList.down) + action_list.add_action(self.serviceManagerList.down) self.serviceManagerList.down.setVisible(False) self.serviceManagerList.up = self.orderToolbar.addToolbarButton( translate('OpenLP.ServiceManager', 'Move up'), @@ -212,7 +213,7 @@ class ServiceManager(QtGui.QWidget): 'Moves the selection up the window.'), self.onMoveSelectionUp, shortcuts=[QtCore.Qt.Key_Up]) self.serviceManagerList.up.setObjectName(u'up') - ActionList.add_action(self.serviceManagerList.up) + action_list.add_action(self.serviceManagerList.up) self.serviceManagerList.up.setVisible(False) self.orderToolbar.addSeparator() self.serviceManagerList.delete = self.orderToolbar.addToolbarButton( @@ -229,7 +230,7 @@ class ServiceManager(QtGui.QWidget): 'Expand all the service items.'), self.onExpandAll, shortcuts=[QtCore.Qt.Key_Plus]) self.serviceManagerList.expand.setObjectName(u'expand') - ActionList.add_action(self.serviceManagerList.expand, UiStrings.Service) + action_list.add_action(self.serviceManagerList.expand, UiStrings.Service) self.serviceManagerList.collapse = self.orderToolbar.addToolbarButton( translate('OpenLP.ServiceManager', '&Collapse all'), u':/services/service_collapse_all.png', @@ -237,7 +238,7 @@ class ServiceManager(QtGui.QWidget): 'Collapse all the service items.'), self.onCollapseAll, shortcuts=[QtCore.Qt.Key_Minus]) self.serviceManagerList.collapse.setObjectName(u'collapse') - ActionList.add_action( + action_list.add_action( self.serviceManagerList.collapse, UiStrings.Service) self.orderToolbar.addSeparator() self.serviceManagerList.makeLive = self.orderToolbar.addToolbarButton( @@ -247,7 +248,7 @@ class ServiceManager(QtGui.QWidget): 'Send the selected item to Live.'), self.makeLive, shortcuts=[QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return]) self.serviceManagerList.makeLive.setObjectName(u'orderToolbar') - ActionList.add_action( + action_list.add_action( self.serviceManagerList.makeLive, UiStrings.Service) self.layout.addWidget(self.orderToolbar) # Connect up our signals and slots diff --git a/openlp/core/ui/shortcutlistform.py b/openlp/core/ui/shortcutlistform.py index 336e160b1..ddf84fdd6 100644 --- a/openlp/core/ui/shortcutlistform.py +++ b/openlp/core/ui/shortcutlistform.py @@ -46,6 +46,7 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): QtGui.QDialog.__init__(self, parent) self.setupUi(self) self.changedActions = {} + self.action_list = ActionList.get_instance() QtCore.QObject.connect(self.primaryPushButton, QtCore.SIGNAL(u'toggled(bool)'), self.onPrimaryPushButtonClicked) QtCore.QObject.connect(self.alternatePushButton, @@ -96,7 +97,7 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): # The action we are attempting to change. changing_action = self._currentItemAction() shortcut_valid = True - for category in ActionList.categories: + for category in self.action_list.categories: for action in category.actions: shortcuts = self._actionShortcuts(action) if key_sequence not in shortcuts: @@ -149,7 +150,7 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): Reload the ``treeWidget`` list to add new and remove old actions. """ self.treeWidget.clear() - for category in ActionList.categories: + for category in self.action_list.categories: # Check if the category is for internal use only. if category.name is None: continue @@ -303,7 +304,7 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): return self._adjustButton(self.primaryPushButton, False, text=u'') self._adjustButton(self.alternatePushButton, False, text=u'') - for category in ActionList.categories: + for category in self.action_list.categories: for action in category.actions: self.changedActions[action] = action.defaultShortcuts self.refreshShortcutList() @@ -349,7 +350,7 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): """ settings = QtCore.QSettings() settings.beginGroup(u'shortcuts') - for category in ActionList.categories: + for category in self.action_list.categories: # Check if the category is for internal use only. if category.name is None: continue diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 204dada75..4f5ed1ea7 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -34,7 +34,7 @@ from openlp.core.lib import OpenLPToolbar, Receiver, resize_image, \ ItemCapabilities, translate from openlp.core.lib.ui import UiStrings, shortcut_action from openlp.core.ui import HideMode, MainDisplay -from openlp.core.utils.actions import ActionList +from openlp.core.utils.actions import ActionList, CategoryOrder log = logging.getLogger(__name__) @@ -367,16 +367,20 @@ class SlideController(QtGui.QWidget): def setPreviewHotkeys(self, parent=None): self.previousItem.setObjectName(u'previousItemPreview') self.nextItem.setObjectName(u'nextItemPreview') - ActionList.add_category(UiStrings.PreviewToolbar, 55) - ActionList.add_action(self.previousItem, UiStrings.PreviewToolbar) - ActionList.add_action(self.nextItem, UiStrings.PreviewToolbar) + action_list = ActionList.get_instance() + action_list.add_category( + UiStrings.PreviewToolbar, CategoryOrder.standardToolbar) + action_list.add_action(self.previousItem, UiStrings.PreviewToolbar) + action_list.add_action(self.nextItem, UiStrings.PreviewToolbar) def setLiveHotkeys(self, parent=None): self.previousItem.setObjectName(u'previousItemLive') self.nextItem.setObjectName(u'nextItemLive') - ActionList.add_category(UiStrings.LiveToolbar, 60) - ActionList.add_action(self.previousItem, UiStrings.LiveToolbar) - ActionList.add_action(self.nextItem, UiStrings.LiveToolbar) + action_list = ActionList.get_instance() + action_list.add_category( + UiStrings.LiveToolbar, CategoryOrder.standardToolbar) + action_list.add_action(self.previousItem, UiStrings.LiveToolbar) + action_list.add_action(self.nextItem, UiStrings.LiveToolbar) self.previousService = shortcut_action(parent, u'previousService', [QtCore.Qt.Key_Left], self.servicePrevious, UiStrings.LiveToolbar) self.previousService.setShortcutContext(QtCore.Qt.WidgetWithChildrenShortcut) diff --git a/openlp/core/utils/actions.py b/openlp/core/utils/actions.py index 214a42249..76b72c55c 100644 --- a/openlp/core/utils/actions.py +++ b/openlp/core/utils/actions.py @@ -183,10 +183,18 @@ class ActionList(object): has a weight by which it is sorted when iterating through the list of actions or categories. """ - categories = CategoryList() + instance = None + + def __init__(self): + self.categories = CategoryList() @staticmethod - def add_action(action, category=None, weight=None): + def get_instance(): + if ActionList.instance is None: + ActionList.instance = ActionList() + return ActionList.instance + + def add_action(self, action, category=None, weight=None): """ Add an action to the list of actions. @@ -206,13 +214,13 @@ class ActionList(object): """ if category is not None: category = unicode(category) - if category not in ActionList.categories: - ActionList.categories.append(category) + if category not in self.categories: + self.categories.append(category) action.defaultShortcuts = action.shortcuts() if weight is None: - ActionList.categories[category].actions.append(action) + self.categories[category].actions.append(action) else: - ActionList.categories[category].actions.add(action, weight) + self.categories[category].actions.add(action, weight) if category is None: # Stop here, as this action is not configurable. return @@ -225,8 +233,7 @@ class ActionList(object): [QtGui.QKeySequence(shortcut) for shortcut in shortcuts]) settings.endGroup() - @staticmethod - def remove_action(action, category=None): + def remove_action(self, action, category=None): """ This removes an action from its category. Empty categories are automatically removed. @@ -240,15 +247,14 @@ class ActionList(object): """ if category is not None: category = unicode(category) - if category not in ActionList.categories: + if category not in self.categories: return - ActionList.categories[category].actions.remove(action) + self.categories[category].actions.remove(action) # Remove empty categories. - if len(ActionList.categories[category].actions) == 0: - ActionList.categories.remove(category) + if len(self.categories[category].actions) == 0: + self.categories.remove(category) - @staticmethod - def add_category(name, weight): + def add_category(self, name, weight): """ Add an empty category to the list of categories. This is ony convenient for categories with a given weight. @@ -259,12 +265,20 @@ class ActionList(object): ``weight`` The category's weight (int). """ - if name in ActionList.categories: + if name in self.categories: # Only change the weight and resort the categories again. - for category in ActionList.categories: + for category in self.categories: if category.name == name: category.weight = weight - ActionList.categories.categories.sort( + self.categories.categories.sort( key=lambda cat: cat.weight, reverse=True) return - ActionList.categories.add(name, weight) + self.categories.add(name, weight) + + +class CategoryOrder(object): + """ + An enumeration class for category weights. + """ + standardMenu = 100 + standardToolbar = 90 diff --git a/openlp/plugins/alerts/alertsplugin.py b/openlp/plugins/alerts/alertsplugin.py index d564a9754..7d6eac6e2 100644 --- a/openlp/plugins/alerts/alertsplugin.py +++ b/openlp/plugins/alerts/alertsplugin.py @@ -75,7 +75,8 @@ class AlertsPlugin(Plugin): log.info(u'Alerts Initialising') Plugin.initialise(self) self.toolsAlertItem.setVisible(True) - ActionList.add_action(self.toolsAlertItem, UiStrings.Tools) + action_list = ActionList.get_instance() + action_list.add_action(self.toolsAlertItem, UiStrings.Tools) self.liveController.alertTab = self.settings_tab def finalise(self): @@ -86,7 +87,8 @@ class AlertsPlugin(Plugin): self.manager.finalise() Plugin.finalise(self) self.toolsAlertItem.setVisible(False) - ActionList.remove_action(self.toolsAlertItem, u'Tools') + action_list = ActionList.get_instance() + action_list.remove_action(self.toolsAlertItem, u'Tools') def toggleAlertsState(self): self.alertsActive = not self.alertsActive diff --git a/openlp/plugins/bibles/bibleplugin.py b/openlp/plugins/bibles/bibleplugin.py index 60be388ba..aea732688 100644 --- a/openlp/plugins/bibles/bibleplugin.py +++ b/openlp/plugins/bibles/bibleplugin.py @@ -52,9 +52,10 @@ class BiblePlugin(Plugin): self.manager = BibleManager(self) Plugin.initialise(self) self.importBibleItem.setVisible(True) - ActionList.add_action(self.importBibleItem, UiStrings.Import) + action_list = ActionList.get_instance() + action_list.add_action(self.importBibleItem, UiStrings.Import) # Do not add the action to the list yet. - #ActionList.add_action(self.exportBibleItem, UiStrings.Export) + #action_list.add_action(self.exportBibleItem, UiStrings.Export) # Set to invisible until we can export bibles self.exportBibleItem.setVisible(False) @@ -65,9 +66,10 @@ class BiblePlugin(Plugin): log.info(u'Plugin Finalise') self.manager.finalise() Plugin.finalise(self) - ActionList.remove_action(self.importBibleItem, UiStrings.Import) + action_list = ActionList.get_instance() + action_list.remove_action(self.importBibleItem, UiStrings.Import) self.importBibleItem.setVisible(False) - #ActionList.remove_action(self.exportBibleItem, UiStrings.Export) + #action_list.remove_action(self.exportBibleItem, UiStrings.Export) self.exportBibleItem.setVisible(False) def addImportMenuItem(self, import_menu): diff --git a/openlp/plugins/songs/songsplugin.py b/openlp/plugins/songs/songsplugin.py index a3230ff7f..af50f3f94 100644 --- a/openlp/plugins/songs/songsplugin.py +++ b/openlp/plugins/songs/songsplugin.py @@ -66,9 +66,10 @@ class SongsPlugin(Plugin): log.info(u'Songs Initialising') Plugin.initialise(self) self.toolsReindexItem.setVisible(True) - ActionList.add_action(self.SongImportItem, UiStrings.Import) - ActionList.add_action(self.SongExportItem, UiStrings.Export) - ActionList.add_action(self.toolsReindexItem, UiStrings.Tools) + action_list = ActionList.get_instance() + action_list.add_action(self.SongImportItem, UiStrings.Import) + action_list.add_action(self.SongExportItem, UiStrings.Export) + action_list.add_action(self.toolsReindexItem, UiStrings.Tools) self.mediaItem.displayResultsSong( self.manager.get_all_objects(Song, order_by_ref=Song.search_title)) @@ -258,7 +259,8 @@ class SongsPlugin(Plugin): log.info(u'Songs Finalising') self.manager.finalise() self.toolsReindexItem.setVisible(False) - ActionList.remove_action(self.SongImportItem, UiStrings.Import) - ActionList.remove_action(self.SongExportItem, UiStrings.Export) - ActionList.remove_action(self.toolsReindexItem, UiStrings.Tools) + action_list = ActionList.get_instance() + action_list.remove_action(self.SongImportItem, UiStrings.Import) + action_list.remove_action(self.SongExportItem, UiStrings.Export) + action_list.remove_action(self.toolsReindexItem, UiStrings.Tools) Plugin.finalise(self) diff --git a/openlp/plugins/songusage/songusageplugin.py b/openlp/plugins/songusage/songusageplugin.py index b0a545ad8..5f21451b6 100644 --- a/openlp/plugins/songusage/songusageplugin.py +++ b/openlp/plugins/songusage/songusageplugin.py @@ -110,11 +110,12 @@ class SongUsagePlugin(Plugin): self.settingsSection + u'/active', QtCore.QVariant(False)).toBool() self.SongUsageStatus.setChecked(self.SongUsageActive) - ActionList.add_action(self.SongUsageDelete, + action_list = ActionList.get_instance() + action_list.add_action(self.SongUsageDelete, translate('SongUsagePlugin', 'Song Usage')) - ActionList.add_action(self.SongUsageReport, + action_list.add_action(self.SongUsageReport, translate('SongUsagePlugin', 'Song Usage')) - ActionList.add_action(self.SongUsageStatus, + action_list.add_action(self.SongUsageStatus, translate('SongUsagePlugin', 'Song Usage')) if self.manager is None: self.manager = Manager(u'songusage', init_schema) @@ -131,11 +132,12 @@ class SongUsagePlugin(Plugin): self.manager.finalise() Plugin.finalise(self) self.SongUsageMenu.menuAction().setVisible(False) - ActionList.remove_action(self.SongUsageDelete, + action_list = ActionList.get_instance() + action_list.remove_action(self.SongUsageDelete, translate('SongUsagePlugin', 'Song Usage')) - ActionList.remove_action(self.SongUsageReport, + action_list.remove_action(self.SongUsageReport, translate('SongUsagePlugin', 'Song Usage')) - ActionList.remove_action(self.SongUsageStatus, + action_list.remove_action(self.SongUsageStatus, translate('SongUsagePlugin', 'Song Usage')) #stop any events being processed self.SongUsageActive = False From a54a3eb79255727b3027973eec3b2151244fda41 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sat, 9 Apr 2011 20:14:51 +0200 Subject: [PATCH 40/89] make first column wider; added description label back; removed Qt = Qt.QCore; fixed litte bug which left the shortcut text on the buttons --- openlp/core/ui/shortcutlistdialog.py | 13 +++++++++---- openlp/core/ui/shortcutlistform.py | 15 +++++++++------ 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/openlp/core/ui/shortcutlistdialog.py b/openlp/core/ui/shortcutlistdialog.py index a5050ab25..32fe68b95 100644 --- a/openlp/core/ui/shortcutlistdialog.py +++ b/openlp/core/ui/shortcutlistdialog.py @@ -33,11 +33,16 @@ class Ui_ShortcutListDialog(object): shortcutListDialog.setObjectName(u'shortcutListDialog') shortcutListDialog.resize(500, 438) self.shortcutListLayout = QtGui.QVBoxLayout(shortcutListDialog) - self.shortcutListLayout.setObjectName(u'shortcutListLayout') + self.shortcutListLayout.setObjectName(u'shortcutLitLayout') + self.descriptionLabel = QtGui.QLabel(shortcutListDialog) + self.descriptionLabel.setObjectName(u'descriptionLabel') + self.descriptionLabel.setWordWrap(True) + self.shortcutListLayout.addWidget(self.descriptionLabel) self.treeWidget = QtGui.QTreeWidget(shortcutListDialog) self.treeWidget.setObjectName(u'treeWidget') self.treeWidget.setAlternatingRowColors(True) self.treeWidget.setColumnCount(3) + self.treeWidget.setColumnWidth(0, 250) self.shortcutListLayout.addWidget(self.treeWidget) self.detailsLayout = QtGui.QGridLayout() self.detailsLayout.setObjectName(u'detailsLayout') @@ -102,9 +107,9 @@ class Ui_ShortcutListDialog(object): def retranslateUi(self, shortcutListDialog): shortcutListDialog.setWindowTitle( translate('OpenLP.ShortcutListDialog', 'Customize Shortcuts')) - #self.descriptionLabel.setText(translate('OpenLP.ShortcutListDialog', - #'Select an action and click the button below to start capturing ' - #'a new shortcut.')) + self.descriptionLabel.setText(translate('OpenLP.ShortcutListDialog', + 'Select an action and click one of the buttons below to start ' + 'capturing a new primary or alternate shortcut, respectively.')) self.treeWidget.setHeaderLabels([ translate('OpenLP.ShortcutListDialog', 'Action'), translate('OpenLP.ShortcutListDialog', 'Shortcut'), diff --git a/openlp/core/ui/shortcutlistform.py b/openlp/core/ui/shortcutlistform.py index ddf84fdd6..26bfddadd 100644 --- a/openlp/core/ui/shortcutlistform.py +++ b/openlp/core/ui/shortcutlistform.py @@ -78,20 +78,21 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): self.close() def keyReleaseEvent(self, event): - Qt = QtCore.Qt if not self.primaryPushButton.isChecked() and \ not self.alternatePushButton.isChecked(): return key = event.key() - if key == Qt.Key_Shift or key == Qt.Key_Control or \ - key == Qt.Key_Meta or key == Qt.Key_Alt: + if key == QtCore.Qt.Key_Shift or key == QtCore.Qt.Key_Control or \ + key == QtCore.Qt.Key_Meta or key == QtCore.Qt.Key_Alt: return key_string = QtGui.QKeySequence(key).toString() - if event.modifiers() & Qt.ControlModifier == Qt.ControlModifier: + if event.modifiers() & QtCore.Qt.ControlModifier == \ + QtCore.Qt.ControlModifier: key_string = u'Ctrl+' + key_string - if event.modifiers() & Qt.AltModifier == Qt.AltModifier: + if event.modifiers() & QtCore.Qt.AltModifier == QtCore.Qt.AltModifier: key_string = u'Alt+' + key_string - if event.modifiers() & Qt.ShiftModifier == Qt.ShiftModifier: + if event.modifiers() & QtCore.Qt.ShiftModifier == \ + QtCore.Qt.ShiftModifier: key_string = u'Shift+' + key_string key_sequence = QtGui.QKeySequence(key_string) # The action we are attempting to change. @@ -377,6 +378,7 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): new_shortcuts.append(shortcuts[1]) self.changedActions[action] = new_shortcuts self.refreshShortcutList() + self.onCurrentItemChanged(self.treeWidget.currentItem()) def onClearAlternateButtonClicked(self, toggled): """ @@ -394,6 +396,7 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): new_shortcuts.append(action.defaultShortcuts[1]) self.changedActions[action] = new_shortcuts self.refreshShortcutList() + self.onCurrentItemChanged(self.treeWidget.currentItem()) def _actionShortcuts(self, action): """ From 29ef34b569d9f9c1561201f8a1bb7d8d559fd3ef Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 10 Apr 2011 07:18:31 +0100 Subject: [PATCH 41/89] Add saving of selected Bible names in Quick and Advanced. Clean up combo box selection code (General) Fixes: https://launchpad.net/bugs/755687 --- openlp/core/lib/ui.py | 17 ++++++++++ openlp/core/ui/servicemanager.py | 11 ++----- openlp/core/ui/themestab.py | 9 ++---- openlp/plugins/bibles/lib/biblestab.py | 9 ++---- openlp/plugins/bibles/lib/mediaitem.py | 32 +++++++++++++------ openlp/plugins/custom/forms/editcustomform.py | 8 ++--- openlp/plugins/songs/forms/editsongform.py | 17 ++-------- 7 files changed, 51 insertions(+), 52 deletions(-) diff --git a/openlp/core/lib/ui.py b/openlp/core/lib/ui.py index c1a9f8b35..ffcc32414 100644 --- a/openlp/core/lib/ui.py +++ b/openlp/core/lib/ui.py @@ -315,3 +315,20 @@ def create_valign_combo(form, parent, layout): form.verticalComboBox.addItem(UiStrings.Bottom) verticalLabel.setBuddy(form.verticalComboBox) layout.addRow(verticalLabel, form.verticalComboBox) + +def find_in_combo_box(combo_box, value_to_find): + """ + Find a string in a combo box and set it as the selected item if present + + ``combo_box`` + The combo box to check for selected items + + ``value_to_find`` + The value to find + """ + index = combo_box.findText(value_to_find, + QtCore.Qt.MatchExactly) + if index == -1: + # Not Found. + index = 0 + combo_box.setCurrentIndex(index) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 9c1c63917..a07d7f970 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -35,7 +35,8 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import OpenLPToolbar, ServiceItem, context_menu_action, \ Receiver, build_icon, ItemCapabilities, SettingsManager, translate from openlp.core.lib.theme import ThemeLevel -from openlp.core.lib.ui import UiStrings, critical_error_message_box +from openlp.core.lib.ui import UiStrings, critical_error_message_box, \ + find_in_combo_box from openlp.core.ui import ServiceNoteForm, ServiceItemEditForm, StartTimeForm from openlp.core.ui.printserviceform import PrintServiceForm from openlp.core.utils import AppLocation, delete_file, file_is_unicode, \ @@ -1261,13 +1262,7 @@ class ServiceManager(QtGui.QWidget): action = context_menu_action(self.serviceManagerList, None, theme, self.onThemeChangeAction) self.themeMenu.addAction(action) - index = self.themeComboBox.findText(self.service_theme, - QtCore.Qt.MatchExactly) - # Not Found - if index == -1: - index = 0 - self.service_theme = u'' - self.themeComboBox.setCurrentIndex(index) + find_in_combo_box(self.themeComboBox, self.service_theme) self.mainwindow.renderManager.set_service_theme(self.service_theme) self.regenerateServiceItems() diff --git a/openlp/core/ui/themestab.py b/openlp/core/ui/themestab.py index 1b76d2198..3307b94fe 100644 --- a/openlp/core/ui/themestab.py +++ b/openlp/core/ui/themestab.py @@ -28,7 +28,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import SettingsTab, Receiver, translate from openlp.core.lib.theme import ThemeLevel -from openlp.core.lib.ui import UiStrings +from openlp.core.lib.ui import UiStrings, find_in_combo_box class ThemesTab(SettingsTab): """ @@ -185,12 +185,7 @@ class ThemesTab(SettingsTab): self.DefaultComboBox.clear() for theme in theme_list: self.DefaultComboBox.addItem(theme) - id = self.DefaultComboBox.findText( - self.global_theme, QtCore.Qt.MatchExactly) - if id == -1: - id = 0 # Not Found - self.global_theme = u'' - self.DefaultComboBox.setCurrentIndex(id) + find_in_combo_box(self.DefaultComboBox, self.global_theme) self.parent.renderManager.set_global_theme( self.global_theme, self.theme_level) if self.global_theme is not u'': diff --git a/openlp/plugins/bibles/lib/biblestab.py b/openlp/plugins/bibles/lib/biblestab.py index 7a631ad09..d2e6ad8d9 100644 --- a/openlp/plugins/bibles/lib/biblestab.py +++ b/openlp/plugins/bibles/lib/biblestab.py @@ -30,6 +30,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Receiver, SettingsTab, translate from openlp.plugins.bibles.lib import LayoutStyle, DisplayStyle +from openlp.core.lib.ui import find_in_combo_box log = logging.getLogger(__name__) @@ -208,10 +209,4 @@ class BiblesTab(SettingsTab): self.BibleThemeComboBox.addItem(u'') for theme in theme_list: self.BibleThemeComboBox.addItem(theme) - index = self.BibleThemeComboBox.findText( - unicode(self.bible_theme), QtCore.Qt.MatchExactly) - if index == -1: - # Not Found. - index = 0 - self.bible_theme = u'' - self.BibleThemeComboBox.setCurrentIndex(index) + find_in_combo_box(self.BibleThemeComboBox, self.bible_theme) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index a9694fd0c..5c77a75d7 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -32,7 +32,7 @@ from openlp.core.lib import MediaManagerItem, Receiver, ItemCapabilities, \ translate from openlp.core.lib.searchedit import SearchEdit from openlp.core.lib.ui import UiStrings, add_widget_completer, \ - media_item_combo_box, critical_error_message_box + media_item_combo_box, critical_error_message_box, find_in_combo_box from openlp.plugins.bibles.forms import BibleImportForm from openlp.plugins.bibles.lib import LayoutStyle, DisplayStyle, \ VerseReferenceList, get_reference_match @@ -274,7 +274,7 @@ class BibleMediaItem(MediaManagerItem): log.debug(u'bible manager initialise') self.parent.manager.media = self self.loadBibles() - self.updateAutoCompleter() + self.updateAutoCompleter(False) self.configUpdated() log.debug(u'bible manager initialise complete') @@ -298,23 +298,25 @@ class BibleMediaItem(MediaManagerItem): bibles = self.parent.manager.get_bibles().keys() bibles.sort() # Load the bibles into the combo boxes. - first = True for bible in bibles: if bible: self.quickVersionComboBox.addItem(bible) self.quickSecondComboBox.addItem(bible) self.advancedVersionComboBox.addItem(bible) self.advancedSecondComboBox.addItem(bible) - if first: - first = False - self.initialiseBible(bible) + # set the default value + book = QtCore.QSettings().value( + self.settingsSection + u'/advanced bible', + QtCore.QVariant(u'')).toString() + find_in_combo_box(self.advancedVersionComboBox, book) + self.initialiseAdvancedBible(unicode(book)) def reloadBibles(self): log.debug(u'Reloading Bibles') self.parent.manager.reload_bibles() self.loadBibles() - def initialiseBible(self, bible): + def initialiseAdvancedBible(self, bible): """ This initialises the given bible, which means that its book names and their chapter numbers is added to the combo boxes on the @@ -324,7 +326,7 @@ class BibleMediaItem(MediaManagerItem): ``bible`` The bible to initialise (unicode). """ - log.debug(u'initialiseBible %s', bible) + log.debug(u'initialiseAdvancedBible %s', bible) book_data = self.parent.manager.get_books(bible) self.advancedBookComboBox.clear() first = True @@ -354,12 +356,20 @@ class BibleMediaItem(MediaManagerItem): self.adjustComboBox(1, verse_count, self.advancedFromVerse) self.adjustComboBox(1, verse_count, self.advancedToVerse) - def updateAutoCompleter(self): + def updateAutoCompleter(self, updateConfig=True): """ This updates the bible book completion list for the search field. The completion depends on the bible. It is only updated when we are doing a reference search, otherwise the auto completion list is removed. """ + if updateConfig: + QtCore.QSettings().setValue(self.settingsSection + u'/quick bible', + QtCore.QVariant(self.quickVersionComboBox.currentText())) + else: + book = QtCore.QSettings().value( + self.settingsSection + u'/quick bible', + QtCore.QVariant(u'')).toString() + find_in_combo_box(self.quickVersionComboBox, book) books = [] # We have to do a 'Reference Search'. if self.quickSearchEdit.currentSearchType() == BibleSearch.Reference: @@ -372,7 +382,9 @@ class BibleMediaItem(MediaManagerItem): add_widget_completer(books, self.quickSearchEdit) def onAdvancedVersionComboBox(self): - self.initialiseBible( + QtCore.QSettings().setValue(self.settingsSection + u'/advanced bible', + QtCore.QVariant(self.advancedVersionComboBox.currentText())) + self.initialiseAdvancedBible( unicode(self.advancedVersionComboBox.currentText())) def onAdvancedBookComboBox(self): diff --git a/openlp/plugins/custom/forms/editcustomform.py b/openlp/plugins/custom/forms/editcustomform.py index f81bd4c7d..3ebd5f984 100644 --- a/openlp/plugins/custom/forms/editcustomform.py +++ b/openlp/plugins/custom/forms/editcustomform.py @@ -29,7 +29,7 @@ import logging from PyQt4 import QtCore, QtGui from openlp.core.lib import Receiver, translate -from openlp.core.lib.ui import critical_error_message_box +from openlp.core.lib.ui import critical_error_message_box, find_in_combo_box from openlp.plugins.custom.lib import CustomXMLBuilder, CustomXMLParser from openlp.plugins.custom.lib.db import CustomSlide from editcustomdialog import Ui_CustomEditDialog @@ -98,11 +98,7 @@ class EditCustomForm(QtGui.QDialog, Ui_CustomEditDialog): for slide in slideList: self.slideListView.addItem(slide[1]) theme = self.customSlide.theme_name - id = self.themeComboBox.findText(theme, QtCore.Qt.MatchExactly) - # No theme match - if id == -1: - id = 0 - self.themeComboBox.setCurrentIndex(id) + find_in_combo_box(self.themeComboBox, theme) # If not preview hide the preview button. self.previewButton.setVisible(False) if preview: diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 2f21e57cd..8dfae1736 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -31,7 +31,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Receiver, translate from openlp.core.lib.ui import UiStrings, add_widget_completer, \ - critical_error_message_box + critical_error_message_box, find_in_combo_box from openlp.plugins.songs.forms import EditVerseForm from openlp.plugins.songs.lib import SongXML, VerseType, clean_song from openlp.plugins.songs.lib.db import Book, Song, Author, Topic @@ -208,20 +208,9 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.alternativeEdit.setText(u'') if self.song.song_book_id != 0: book_name = self.manager.get_object(Book, self.song.song_book_id) - id = self.songBookComboBox.findText( - unicode(book_name.name), QtCore.Qt.MatchExactly) - if id == -1: - # Not Found - id = 0 - self.songBookComboBox.setCurrentIndex(id) + find_in_combo_box(self.songBookComboBox, unicode(book_name.name)) if self.song.theme_name: - id = self.themeComboBox.findText( - unicode(self.song.theme_name), QtCore.Qt.MatchExactly) - if id == -1: - # Not Found - id = 0 - self.song.theme_name = None - self.themeComboBox.setCurrentIndex(id) + find_in_combo_box(self.themeComboBox, unicode(self.song.theme_name)) if self.song.copyright: self.copyrightEdit.setText(self.song.copyright) else: From c55df2583a2c3fc558b0c5d52079589f59dbe956 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 10 Apr 2011 07:27:23 +0100 Subject: [PATCH 42/89] Remove trailing comma Fixes: https://launchpad.net/bugs/748960 --- openlp/plugins/bibles/lib/versereferencelist.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/openlp/plugins/bibles/lib/versereferencelist.py b/openlp/plugins/bibles/lib/versereferencelist.py index bc28f2570..bab6d7e11 100644 --- a/openlp/plugins/bibles/lib/versereferencelist.py +++ b/openlp/plugins/bibles/lib/versereferencelist.py @@ -96,4 +96,7 @@ class VerseReferenceList(object): version[u'copyright']) if version[u'permission'].strip(): result = result + u', ' + version[u'permission'] + result = result.rstrip() + if result.endswith(u','): + return result[:len(result)-1] return result From b7a1554abda5e718744261006240f97210d11f38 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sun, 10 Apr 2011 09:07:02 +0200 Subject: [PATCH 43/89] fixed objectName --- openlp/core/ui/shortcutlistdialog.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/ui/shortcutlistdialog.py b/openlp/core/ui/shortcutlistdialog.py index 32fe68b95..288086cba 100644 --- a/openlp/core/ui/shortcutlistdialog.py +++ b/openlp/core/ui/shortcutlistdialog.py @@ -33,7 +33,7 @@ class Ui_ShortcutListDialog(object): shortcutListDialog.setObjectName(u'shortcutListDialog') shortcutListDialog.resize(500, 438) self.shortcutListLayout = QtGui.QVBoxLayout(shortcutListDialog) - self.shortcutListLayout.setObjectName(u'shortcutLitLayout') + self.shortcutListLayout.setObjectName(u'shortcutListLayout') self.descriptionLabel = QtGui.QLabel(shortcutListDialog) self.descriptionLabel.setObjectName(u'descriptionLabel') self.descriptionLabel.setWordWrap(True) From c8d2baff7ce25635474903c478e7be54687827fa Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 10 Apr 2011 08:32:15 +0100 Subject: [PATCH 44/89] Add bible verse layout to Quick tab. Not moved to Advanced tab as no real estate. Fixes: https://launchpad.net/bugs/745218 --- openlp/core/lib/ui.py | 4 + openlp/plugins/bibles/lib/biblestab.py | 161 ++++++++++++------------- openlp/plugins/bibles/lib/mediaitem.py | 25 ++++ 3 files changed, 109 insertions(+), 81 deletions(-) diff --git a/openlp/core/lib/ui.py b/openlp/core/lib/ui.py index ffcc32414..9b03cce03 100644 --- a/openlp/core/lib/ui.py +++ b/openlp/core/lib/ui.py @@ -49,8 +49,10 @@ class UiStrings(object): Cancel = translate('OpenLP.Ui', 'Cancel') CCLINumberLabel = translate('OpenLP.Ui', 'CCLI number:') CreateService = translate('OpenLP.Ui', 'Create a new service.') + Continuous = translate('OpenLP.Ui', 'Continuous') Default = unicode(translate('OpenLP.Ui', 'Default')) Delete = translate('OpenLP.Ui', '&Delete') + DisplayStyle = translate('OpenLP.Ui', 'Display style:') Edit = translate('OpenLP.Ui', '&Edit') EmptyField = translate('OpenLP.Ui', 'Empty Field') Error = translate('OpenLP.Ui', 'Error') @@ -97,6 +99,8 @@ class UiStrings(object): Theme = translate('OpenLP.Ui', 'Theme', 'Singular') Themes = translate('OpenLP.Ui', 'Themes', 'Plural') Top = translate('OpenLP.Ui', 'Top') + VersePerSlide = translate('OpenLP.Ui', 'Verse Per Slide') + VersePerLine = translate('OpenLP.Ui', 'Verse Per Line') Version = translate('OpenLP.Ui', 'Version') def add_welcome_page(parent, image): diff --git a/openlp/plugins/bibles/lib/biblestab.py b/openlp/plugins/bibles/lib/biblestab.py index d2e6ad8d9..5133587b3 100644 --- a/openlp/plugins/bibles/lib/biblestab.py +++ b/openlp/plugins/bibles/lib/biblestab.py @@ -30,7 +30,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Receiver, SettingsTab, translate from openlp.plugins.bibles.lib import LayoutStyle, DisplayStyle -from openlp.core.lib.ui import find_in_combo_box +from openlp.core.lib.ui import UiStrings, find_in_combo_box log = logging.getLogger(__name__) @@ -49,116 +49,115 @@ class BiblesTab(SettingsTab): def setupUi(self): self.setObjectName(u'BiblesTab') SettingsTab.setupUi(self) - self.VerseDisplayGroupBox = QtGui.QGroupBox(self.leftColumn) - self.VerseDisplayGroupBox.setObjectName(u'VerseDisplayGroupBox') - self.VerseDisplayLayout = QtGui.QFormLayout(self.VerseDisplayGroupBox) - self.VerseDisplayLayout.setObjectName(u'VerseDisplayLayout') - self.NewChaptersCheckBox = QtGui.QCheckBox(self.VerseDisplayGroupBox) - self.NewChaptersCheckBox.setObjectName(u'NewChaptersCheckBox') - self.VerseDisplayLayout.addRow(self.NewChaptersCheckBox) - self.DisplayStyleLabel = QtGui.QLabel(self.VerseDisplayGroupBox) - self.DisplayStyleLabel.setObjectName(u'DisplayStyleLabel') - self.DisplayStyleComboBox = QtGui.QComboBox(self.VerseDisplayGroupBox) - self.DisplayStyleComboBox.addItems([u'', u'', u'', u'']) - self.DisplayStyleComboBox.setObjectName(u'DisplayStyleComboBox') - self.VerseDisplayLayout.addRow(self.DisplayStyleLabel, - self.DisplayStyleComboBox) - self.LayoutStyleLabel = QtGui.QLabel(self.VerseDisplayGroupBox) - self.LayoutStyleLabel.setObjectName(u'LayoutStyleLabel') - self.LayoutStyleComboBox = QtGui.QComboBox(self.VerseDisplayGroupBox) - self.LayoutStyleComboBox.setObjectName(u'LayoutStyleComboBox') - self.LayoutStyleComboBox.addItems([u'', u'', u'']) - self.VerseDisplayLayout.addRow(self.LayoutStyleLabel, - self.LayoutStyleComboBox) - self.BibleSecondCheckBox = QtGui.QCheckBox(self.VerseDisplayGroupBox) - self.BibleSecondCheckBox.setObjectName(u'BibleSecondCheckBox') - self.VerseDisplayLayout.addRow(self.BibleSecondCheckBox) - self.BibleThemeLabel = QtGui.QLabel(self.VerseDisplayGroupBox) - self.BibleThemeLabel.setObjectName(u'BibleThemeLabel') - self.BibleThemeComboBox = QtGui.QComboBox(self.VerseDisplayGroupBox) - self.BibleThemeComboBox.setSizeAdjustPolicy( + self.verseDisplayGroupBox = QtGui.QGroupBox(self.leftColumn) + self.verseDisplayGroupBox.setObjectName(u'verseDisplayGroupBox') + self.verseDisplayLayout = QtGui.QFormLayout(self.verseDisplayGroupBox) + self.verseDisplayLayout.setObjectName(u'verseDisplayLayout') + self.newChaptersCheckBox = QtGui.QCheckBox(self.verseDisplayGroupBox) + self.newChaptersCheckBox.setObjectName(u'newChaptersCheckBox') + self.verseDisplayLayout.addRow(self.newChaptersCheckBox) + self.displayStyleLabel = QtGui.QLabel(self.verseDisplayGroupBox) + self.displayStyleLabel.setObjectName(u'displayStyleLabel') + self.displayStyleComboBox = QtGui.QComboBox(self.verseDisplayGroupBox) + self.displayStyleComboBox.addItems([u'', u'', u'', u'']) + self.displayStyleComboBox.setObjectName(u'displayStyleComboBox') + self.verseDisplayLayout.addRow(self.displayStyleLabel, + self.displayStyleComboBox) + self.layoutStyleLabel = QtGui.QLabel(self.verseDisplayGroupBox) + self.layoutStyleLabel.setObjectName(u'layoutStyleLabel') + self.layoutStyleComboBox = QtGui.QComboBox(self.verseDisplayGroupBox) + self.layoutStyleComboBox.setObjectName(u'layoutStyleComboBox') + self.layoutStyleComboBox.addItems([u'', u'', u'']) + self.verseDisplayLayout.addRow(self.layoutStyleLabel, + self.layoutStyleComboBox) + self.bibleSecondCheckBox = QtGui.QCheckBox(self.verseDisplayGroupBox) + self.bibleSecondCheckBox.setObjectName(u'bibleSecondCheckBox') + self.verseDisplayLayout.addRow(self.bibleSecondCheckBox) + self.bibleThemeLabel = QtGui.QLabel(self.verseDisplayGroupBox) + self.bibleThemeLabel.setObjectName(u'BibleThemeLabel') + self.bibleThemeComboBox = QtGui.QComboBox(self.verseDisplayGroupBox) + self.bibleThemeComboBox.setSizeAdjustPolicy( QtGui.QComboBox.AdjustToMinimumContentsLength) - self.BibleThemeComboBox.setSizePolicy( + self.bibleThemeComboBox.setSizePolicy( QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed) - self.BibleThemeComboBox.addItem(u'') - self.BibleThemeComboBox.setObjectName(u'BibleThemeComboBox') - self.VerseDisplayLayout.addRow(self.BibleThemeLabel, - self.BibleThemeComboBox) - self.ChangeNoteLabel = QtGui.QLabel(self.VerseDisplayGroupBox) - self.ChangeNoteLabel.setWordWrap(True) - self.ChangeNoteLabel.setObjectName(u'ChangeNoteLabel') - self.VerseDisplayLayout.addRow(self.ChangeNoteLabel) - self.leftLayout.addWidget(self.VerseDisplayGroupBox) + self.bibleThemeComboBox.addItem(u'') + self.bibleThemeComboBox.setObjectName(u'BibleThemeComboBox') + self.verseDisplayLayout.addRow(self.bibleThemeLabel, + self.bibleThemeComboBox) + self.changeNoteLabel = QtGui.QLabel(self.verseDisplayGroupBox) + self.changeNoteLabel.setWordWrap(True) + self.changeNoteLabel.setObjectName(u'changeNoteLabel') + self.verseDisplayLayout.addRow(self.changeNoteLabel) + self.leftLayout.addWidget(self.verseDisplayGroupBox) self.leftLayout.addStretch() self.rightColumn.setSizePolicy( QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred) self.rightLayout.addStretch() # Signals and slots QtCore.QObject.connect( - self.NewChaptersCheckBox, QtCore.SIGNAL(u'stateChanged(int)'), - self.onNewChaptersCheckBoxChanged) + self.newChaptersCheckBox, QtCore.SIGNAL(u'stateChanged(int)'), + self.onnewChaptersCheckBoxChanged) QtCore.QObject.connect( - self.DisplayStyleComboBox, QtCore.SIGNAL(u'activated(int)'), - self.onDisplayStyleComboBoxChanged) + self.displayStyleComboBox, QtCore.SIGNAL(u'activated(int)'), + self.ondisplayStyleComboBoxChanged) QtCore.QObject.connect( - self.BibleThemeComboBox, QtCore.SIGNAL(u'activated(int)'), + self.bibleThemeComboBox, QtCore.SIGNAL(u'activated(int)'), self.onBibleThemeComboBoxChanged) QtCore.QObject.connect( - self.LayoutStyleComboBox, QtCore.SIGNAL(u'activated(int)'), - self.onLayoutStyleComboBoxChanged) + self.layoutStyleComboBox, QtCore.SIGNAL(u'activated(int)'), + self.onlayoutStyleComboBoxChanged) QtCore.QObject.connect( - self.BibleSecondCheckBox, QtCore.SIGNAL(u'stateChanged(int)'), - self.onBibleSecondCheckBox) + self.bibleSecondCheckBox, QtCore.SIGNAL(u'stateChanged(int)'), + self.onbibleSecondCheckBox) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'theme_update_list'), self.updateThemeList) def retranslateUi(self): - self.VerseDisplayGroupBox.setTitle( + self.verseDisplayGroupBox.setTitle( translate('BiblesPlugin.BiblesTab', 'Verse Display')) - self.NewChaptersCheckBox.setText( + self.newChaptersCheckBox.setText( translate('BiblesPlugin.BiblesTab', 'Only show new chapter numbers')) - self.LayoutStyleLabel.setText( + self.layoutStyleLabel.setText( translate('BiblesPlugin.BiblesTab', 'Layout style:')) - self.DisplayStyleLabel.setText( - translate('BiblesPlugin.BiblesTab', 'Display style:')) - self.BibleThemeLabel.setText( + self.displayStyleLabel.setText(UiStrings.DisplayStyle) + self.bibleThemeLabel.setText( translate('BiblesPlugin.BiblesTab', 'Bible theme:')) - self.LayoutStyleComboBox.setItemText(LayoutStyle.VersePerSlide, - translate('BiblesPlugin.BiblesTab', 'Verse Per Slide')) - self.LayoutStyleComboBox.setItemText(LayoutStyle.VersePerLine, - translate('BiblesPlugin.BiblesTab', 'Verse Per Line')) - self.LayoutStyleComboBox.setItemText(LayoutStyle.Continuous, - translate('BiblesPlugin.BiblesTab', 'Continuous')) - self.DisplayStyleComboBox.setItemText(DisplayStyle.NoBrackets, + self.layoutStyleComboBox.setItemText(LayoutStyle.VersePerSlide, + UiStrings.VersePerSlide) + self.layoutStyleComboBox.setItemText(LayoutStyle.VersePerLine, + UiStrings.VersePerLine) + self.layoutStyleComboBox.setItemText(LayoutStyle.Continuous, + UiStrings.Continuous) + self.displayStyleComboBox.setItemText(DisplayStyle.NoBrackets, translate('BiblesPlugin.BiblesTab', 'No Brackets')) - self.DisplayStyleComboBox.setItemText(DisplayStyle.Round, + self.displayStyleComboBox.setItemText(DisplayStyle.Round, translate('BiblesPlugin.BiblesTab', '( And )')) - self.DisplayStyleComboBox.setItemText(DisplayStyle.Curly, + self.displayStyleComboBox.setItemText(DisplayStyle.Curly, translate('BiblesPlugin.BiblesTab', '{ And }')) - self.DisplayStyleComboBox.setItemText(DisplayStyle.Square, + self.displayStyleComboBox.setItemText(DisplayStyle.Square, translate('BiblesPlugin.BiblesTab', '[ And ]')) - self.ChangeNoteLabel.setText(translate('BiblesPlugin.BiblesTab', + self.changeNoteLabel.setText(translate('BiblesPlugin.BiblesTab', 'Note:\nChanges do not affect verses already in the service.')) - self.BibleSecondCheckBox.setText( + self.bibleSecondCheckBox.setText( translate('BiblesPlugin.BiblesTab', 'Display second Bible verses')) def onBibleThemeComboBoxChanged(self): - self.bible_theme = self.BibleThemeComboBox.currentText() + self.bible_theme = self.bibleThemeComboBox.currentText() - def onDisplayStyleComboBoxChanged(self): - self.display_style = self.DisplayStyleComboBox.currentIndex() + def ondisplayStyleComboBoxChanged(self): + self.display_style = self.displayStyleComboBox.currentIndex() - def onLayoutStyleComboBoxChanged(self): - self.layout_style = self.LayoutStyleComboBox.currentIndex() + def onlayoutStyleComboBoxChanged(self): + self.layout_style = self.layoutStyleComboBox.currentIndex() - def onNewChaptersCheckBoxChanged(self, check_state): + def onnewChaptersCheckBoxChanged(self, check_state): self.show_new_chapters = False # We have a set value convert to True/False. if check_state == QtCore.Qt.Checked: self.show_new_chapters = True - def onBibleSecondCheckBox(self, check_state): + def onbibleSecondCheckBox(self, check_state): self.second_bibles = False # We have a set value convert to True/False. if check_state == QtCore.Qt.Checked: @@ -177,10 +176,10 @@ class BiblesTab(SettingsTab): settings.value(u'bible theme', QtCore.QVariant(u'')).toString()) self.second_bibles = settings.value( u'second bibles', QtCore.QVariant(True)).toBool() - self.NewChaptersCheckBox.setChecked(self.show_new_chapters) - self.DisplayStyleComboBox.setCurrentIndex(self.display_style) - self.LayoutStyleComboBox.setCurrentIndex(self.layout_style) - self.BibleSecondCheckBox.setChecked(self.second_bibles) + self.newChaptersCheckBox.setChecked(self.show_new_chapters) + self.displayStyleComboBox.setCurrentIndex(self.display_style) + self.layoutStyleComboBox.setCurrentIndex(self.layout_style) + self.bibleSecondCheckBox.setChecked(self.second_bibles) settings.endGroup() def save(self): @@ -205,8 +204,8 @@ class BiblesTab(SettingsTab): [u'Bible Theme', u'Song Theme'] """ - self.BibleThemeComboBox.clear() - self.BibleThemeComboBox.addItem(u'') + self.bibleThemeComboBox.clear() + self.bibleThemeComboBox.addItem(u'') for theme in theme_list: - self.BibleThemeComboBox.addItem(theme) - find_in_combo_box(self.BibleThemeComboBox, self.bible_theme) + self.bibleThemeComboBox.addItem(theme) + find_in_combo_box(self.bibleThemeComboBox, self.bible_theme) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 5c77a75d7..84275f3fc 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -106,6 +106,12 @@ class BibleMediaItem(MediaManagerItem): translate('BiblesPlugin.MediaItem', 'Text Search')) ]) self.quickLayout.addRow(self.quickSearchLabel, self.quickSearchEdit) + self.quickLayoutLabel = QtGui.QLabel(self.quickTab) + self.quickLayoutLabel.setObjectName(u'quickClearLabel') + self.quickLayoutComboBox = media_item_combo_box(self.quickTab, + u'quickLayoutComboBox') + self.quickLayoutComboBox.addItems([u'', u'', u'']) + self.quickLayout.addRow(self.quickLayoutLabel, self.quickLayoutComboBox) self.quickClearLabel = QtGui.QLabel(self.quickTab) self.quickClearLabel.setObjectName(u'quickClearLabel') self.quickClearComboBox = media_item_combo_box(self.quickTab, @@ -210,6 +216,9 @@ class BibleMediaItem(MediaManagerItem): QtCore.SIGNAL(u'searchTypeChanged(int)'), self.updateAutoCompleter) QtCore.QObject.connect(self.quickVersionComboBox, QtCore.SIGNAL(u'activated(int)'), self.updateAutoCompleter) + QtCore.QObject.connect( + self.quickLayoutComboBox, QtCore.SIGNAL(u'activated(int)'), + self.onlayoutStyleComboBoxChanged) # Buttons QtCore.QObject.connect(self.advancedSearchButton, QtCore.SIGNAL(u'pressed()'), self.onAdvancedSearchButton) @@ -234,6 +243,7 @@ class BibleMediaItem(MediaManagerItem): self.advancedSecondComboBox.setVisible(False) self.quickSecondLabel.setVisible(False) self.quickSecondComboBox.setVisible(False) + self.quickLayoutComboBox.setCurrentIndex(self.settings.layout_style) def retranslateUi(self): log.debug(u'retranslateUi') @@ -269,6 +279,13 @@ class BibleMediaItem(MediaManagerItem): translate('BiblesPlugin.MediaItem', 'Clear')) self.advancedClearComboBox.addItem( translate('BiblesPlugin.MediaItem', 'Keep')) + self.quickLayoutLabel.setText(UiStrings.DisplayStyle) + self.quickLayoutComboBox.setItemText(LayoutStyle.VersePerSlide, + UiStrings.VersePerSlide) + self.quickLayoutComboBox.setItemText(LayoutStyle.VersePerLine, + UiStrings.VersePerLine) + self.quickLayoutComboBox.setItemText(LayoutStyle.Continuous, + UiStrings.Continuous) def initialise(self): log.debug(u'bible manager initialise') @@ -816,3 +833,11 @@ class BibleMediaItem(MediaManagerItem): if self.settings.display_style == DisplayStyle.Square: return u'{su}[%s]{/su}' % verse_text return u'{su}%s{/su}' % verse_text + + def onlayoutStyleComboBoxChanged(self): + self.settings.layout_style = self.quickLayoutComboBox.currentIndex() + self.settings.layoutStyleComboBox.setCurrentIndex( + self.settings.layout_style) + QtCore.QSettings().setValue( + self.settingsSection + u'/verse layout style', + QtCore.QVariant(self.settings.layout_style)) From 9dbd54bf8f6396c1121ca13b0dec77f07809862c Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sun, 10 Apr 2011 20:44:27 +0200 Subject: [PATCH 45/89] more fixes --- openlp/core/ui/servicemanager.py | 4 ++-- openlp/plugins/songs/lib/mediaitem.py | 15 ++++++++------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index adafe5fd6..5e14ec637 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -691,9 +691,9 @@ class ServiceManager(QtGui.QWidget): Called by the SlideController to request a preview item be made live and allows the next preview to be updated if relevent. """ - id, row = message.split(u':') + uuid, row = message.split(u':') for sitem in self.serviceItems: - if sitem[u'service_item']._uuid == id: + if sitem[u'service_item']._uuid == uuid: item = self.serviceManagerList.topLevelItem(sitem[u'order'] - 1) self.serviceManagerList.setCurrentItem(item) self.makeLive(int(row)) diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index f4803d653..e2882ed29 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -283,19 +283,20 @@ class SongMediaItem(MediaManagerItem): self.remoteTriggered = None self.remoteSong = -1 - def onRemoteEdit(self, songid): + def onRemoteEdit(self, message): """ Called by ServiceManager or SlideController by event passing the Song Id in the payload along with an indicator to say which type of display is required. """ - log.debug(u'onRemoteEdit %s' % songid) - fields = songid.split(u':') - valid = self.parent.manager.get_object(Song, fields[1]) + log.debug(u'onRemoteEdit %s' % message) + remote_type, song_id = message.split(u':') + song_id = int(song_id) + valid = self.parent.manager.get_object(Song, song_id) if valid: - self.remoteSong = fields[1] - self.remoteTriggered = fields[0] - self.edit_song_form.loadSong(fields[1], (fields[0] == u'P')) + self.remoteSong = song_id + self.remoteTriggered = remote_type + self.edit_song_form.loadSong(song_id, (remote_type == u'P')) self.edit_song_form.exec_() def onEditClick(self): From 1882c5366d4b7456acb966016282cacf0f3a2bb0 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 10 Apr 2011 19:54:26 +0100 Subject: [PATCH 46/89] Review fixes --- openlp/core/lib/ui.py | 4 ++-- openlp/core/ui/servicemanager.py | 6 +++--- openlp/core/ui/themestab.py | 6 +++--- openlp/plugins/bibles/lib/biblestab.py | 20 +++++++++---------- openlp/plugins/bibles/lib/mediaitem.py | 8 ++++---- openlp/plugins/custom/forms/editcustomform.py | 6 +++--- openlp/plugins/songs/forms/editsongform.py | 8 ++++---- 7 files changed, 29 insertions(+), 29 deletions(-) diff --git a/openlp/core/lib/ui.py b/openlp/core/lib/ui.py index 9b03cce03..4f6951d13 100644 --- a/openlp/core/lib/ui.py +++ b/openlp/core/lib/ui.py @@ -320,7 +320,7 @@ def create_valign_combo(form, parent, layout): verticalLabel.setBuddy(form.verticalComboBox) layout.addRow(verticalLabel, form.verticalComboBox) -def find_in_combo_box(combo_box, value_to_find): +def find_and_set_in_combo_box(combo_box, value_to_find): """ Find a string in a combo box and set it as the selected item if present @@ -335,4 +335,4 @@ def find_in_combo_box(combo_box, value_to_find): if index == -1: # Not Found. index = 0 - combo_box.setCurrentIndex(index) + combo_box.setCurrentIndex(index) \ No newline at end of file diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index a07d7f970..4c4837676 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -36,7 +36,7 @@ from openlp.core.lib import OpenLPToolbar, ServiceItem, context_menu_action, \ Receiver, build_icon, ItemCapabilities, SettingsManager, translate from openlp.core.lib.theme import ThemeLevel from openlp.core.lib.ui import UiStrings, critical_error_message_box, \ - find_in_combo_box + find_and_set_in_combo_box from openlp.core.ui import ServiceNoteForm, ServiceItemEditForm, StartTimeForm from openlp.core.ui.printserviceform import PrintServiceForm from openlp.core.utils import AppLocation, delete_file, file_is_unicode, \ @@ -1262,7 +1262,7 @@ class ServiceManager(QtGui.QWidget): action = context_menu_action(self.serviceManagerList, None, theme, self.onThemeChangeAction) self.themeMenu.addAction(action) - find_in_combo_box(self.themeComboBox, self.service_theme) + find_and_set_in_combo_box(self.themeComboBox, self.service_theme) self.mainwindow.renderManager.set_service_theme(self.service_theme) self.regenerateServiceItems() @@ -1301,4 +1301,4 @@ class ServiceManager(QtGui.QWidget): Print a Service Order Sheet. """ settingDialog = PrintServiceForm(self.mainwindow, self) - settingDialog.exec_() + settingDialog.exec_() \ No newline at end of file diff --git a/openlp/core/ui/themestab.py b/openlp/core/ui/themestab.py index 3307b94fe..1415c6810 100644 --- a/openlp/core/ui/themestab.py +++ b/openlp/core/ui/themestab.py @@ -28,7 +28,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import SettingsTab, Receiver, translate from openlp.core.lib.theme import ThemeLevel -from openlp.core.lib.ui import UiStrings, find_in_combo_box +from openlp.core.lib.ui import UiStrings, find_and_set_in_combo_box class ThemesTab(SettingsTab): """ @@ -185,7 +185,7 @@ class ThemesTab(SettingsTab): self.DefaultComboBox.clear() for theme in theme_list: self.DefaultComboBox.addItem(theme) - find_in_combo_box(self.DefaultComboBox, self.global_theme) + find_and_set_in_combo_box(self.DefaultComboBox, self.global_theme) self.parent.renderManager.set_global_theme( self.global_theme, self.theme_level) if self.global_theme is not u'': @@ -201,4 +201,4 @@ class ThemesTab(SettingsTab): if not preview.isNull(): preview = preview.scaled(300, 255, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation) - self.DefaultListView.setPixmap(preview) + self.DefaultListView.setPixmap(preview) \ No newline at end of file diff --git a/openlp/plugins/bibles/lib/biblestab.py b/openlp/plugins/bibles/lib/biblestab.py index 5133587b3..914377e35 100644 --- a/openlp/plugins/bibles/lib/biblestab.py +++ b/openlp/plugins/bibles/lib/biblestab.py @@ -30,7 +30,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Receiver, SettingsTab, translate from openlp.plugins.bibles.lib import LayoutStyle, DisplayStyle -from openlp.core.lib.ui import UiStrings, find_in_combo_box +from openlp.core.lib.ui import UiStrings, find_and_set_in_combo_box log = logging.getLogger(__name__) @@ -96,19 +96,19 @@ class BiblesTab(SettingsTab): # Signals and slots QtCore.QObject.connect( self.newChaptersCheckBox, QtCore.SIGNAL(u'stateChanged(int)'), - self.onnewChaptersCheckBoxChanged) + self.onNewChaptersCheckBoxChanged) QtCore.QObject.connect( self.displayStyleComboBox, QtCore.SIGNAL(u'activated(int)'), - self.ondisplayStyleComboBoxChanged) + self.onDisplayStyleComboBoxChanged) QtCore.QObject.connect( self.bibleThemeComboBox, QtCore.SIGNAL(u'activated(int)'), self.onBibleThemeComboBoxChanged) QtCore.QObject.connect( self.layoutStyleComboBox, QtCore.SIGNAL(u'activated(int)'), - self.onlayoutStyleComboBoxChanged) + self.onLayoutStyleComboBoxChanged) QtCore.QObject.connect( self.bibleSecondCheckBox, QtCore.SIGNAL(u'stateChanged(int)'), - self.onbibleSecondCheckBox) + self.onBibleSecondCheckBox) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'theme_update_list'), self.updateThemeList) @@ -145,19 +145,19 @@ class BiblesTab(SettingsTab): def onBibleThemeComboBoxChanged(self): self.bible_theme = self.bibleThemeComboBox.currentText() - def ondisplayStyleComboBoxChanged(self): + def onDisplayStyleComboBoxChanged(self): self.display_style = self.displayStyleComboBox.currentIndex() - def onlayoutStyleComboBoxChanged(self): + def onLayoutStyleComboBoxChanged(self): self.layout_style = self.layoutStyleComboBox.currentIndex() - def onnewChaptersCheckBoxChanged(self, check_state): + def onNewChaptersCheckBoxChanged(self, check_state): self.show_new_chapters = False # We have a set value convert to True/False. if check_state == QtCore.Qt.Checked: self.show_new_chapters = True - def onbibleSecondCheckBox(self, check_state): + def onBibleSecondCheckBox(self, check_state): self.second_bibles = False # We have a set value convert to True/False. if check_state == QtCore.Qt.Checked: @@ -208,4 +208,4 @@ class BiblesTab(SettingsTab): self.bibleThemeComboBox.addItem(u'') for theme in theme_list: self.bibleThemeComboBox.addItem(theme) - find_in_combo_box(self.bibleThemeComboBox, self.bible_theme) + find_and_set_in_combo_box(self.bibleThemeComboBox, self.bible_theme) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 84275f3fc..73ed0c9bd 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -32,7 +32,7 @@ from openlp.core.lib import MediaManagerItem, Receiver, ItemCapabilities, \ translate from openlp.core.lib.searchedit import SearchEdit from openlp.core.lib.ui import UiStrings, add_widget_completer, \ - media_item_combo_box, critical_error_message_box, find_in_combo_box + media_item_combo_box, critical_error_message_box, find_and_set_in_combo_box from openlp.plugins.bibles.forms import BibleImportForm from openlp.plugins.bibles.lib import LayoutStyle, DisplayStyle, \ VerseReferenceList, get_reference_match @@ -325,7 +325,7 @@ class BibleMediaItem(MediaManagerItem): book = QtCore.QSettings().value( self.settingsSection + u'/advanced bible', QtCore.QVariant(u'')).toString() - find_in_combo_box(self.advancedVersionComboBox, book) + find_and_set_in_combo_box(self.advancedVersionComboBox, book) self.initialiseAdvancedBible(unicode(book)) def reloadBibles(self): @@ -386,7 +386,7 @@ class BibleMediaItem(MediaManagerItem): book = QtCore.QSettings().value( self.settingsSection + u'/quick bible', QtCore.QVariant(u'')).toString() - find_in_combo_box(self.quickVersionComboBox, book) + find_and_set_in_combo_box(self.quickVersionComboBox, book) books = [] # We have to do a 'Reference Search'. if self.quickSearchEdit.currentSearchType() == BibleSearch.Reference: @@ -840,4 +840,4 @@ class BibleMediaItem(MediaManagerItem): self.settings.layout_style) QtCore.QSettings().setValue( self.settingsSection + u'/verse layout style', - QtCore.QVariant(self.settings.layout_style)) + QtCore.QVariant(self.settings.layout_style)) \ No newline at end of file diff --git a/openlp/plugins/custom/forms/editcustomform.py b/openlp/plugins/custom/forms/editcustomform.py index 3ebd5f984..9312b5ddd 100644 --- a/openlp/plugins/custom/forms/editcustomform.py +++ b/openlp/plugins/custom/forms/editcustomform.py @@ -29,7 +29,7 @@ import logging from PyQt4 import QtCore, QtGui from openlp.core.lib import Receiver, translate -from openlp.core.lib.ui import critical_error_message_box, find_in_combo_box +from openlp.core.lib.ui import critical_error_message_box, find_and_set_in_combo_box from openlp.plugins.custom.lib import CustomXMLBuilder, CustomXMLParser from openlp.plugins.custom.lib.db import CustomSlide from editcustomdialog import Ui_CustomEditDialog @@ -98,7 +98,7 @@ class EditCustomForm(QtGui.QDialog, Ui_CustomEditDialog): for slide in slideList: self.slideListView.addItem(slide[1]) theme = self.customSlide.theme_name - find_in_combo_box(self.themeComboBox, theme) + find_and_set_in_combo_box(self.themeComboBox, theme) # If not preview hide the preview button. self.previewButton.setVisible(False) if preview: @@ -261,4 +261,4 @@ class EditCustomForm(QtGui.QDialog, Ui_CustomEditDialog): message=translate('CustomPlugin.EditCustomForm', 'You need to add at least one slide')) return False - return True + return True \ No newline at end of file diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 8dfae1736..85294d92b 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -31,7 +31,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Receiver, translate from openlp.core.lib.ui import UiStrings, add_widget_completer, \ - critical_error_message_box, find_in_combo_box + critical_error_message_box, find_and_set_in_combo_box from openlp.plugins.songs.forms import EditVerseForm from openlp.plugins.songs.lib import SongXML, VerseType, clean_song from openlp.plugins.songs.lib.db import Book, Song, Author, Topic @@ -208,9 +208,9 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.alternativeEdit.setText(u'') if self.song.song_book_id != 0: book_name = self.manager.get_object(Book, self.song.song_book_id) - find_in_combo_box(self.songBookComboBox, unicode(book_name.name)) + find_and_set_in_combo_box(self.songBookComboBox, unicode(book_name.name)) if self.song.theme_name: - find_in_combo_box(self.themeComboBox, unicode(self.song.theme_name)) + find_and_set_in_combo_box(self.themeComboBox, unicode(self.song.theme_name)) if self.song.copyright: self.copyrightEdit.setText(self.song.copyright) else: @@ -779,4 +779,4 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.song.verse_order) except: log.exception(u'Problem processing song Lyrics \n%s', - sxml.dump_xml()) + sxml.dump_xml()) \ No newline at end of file From 20dc7846ce0c9f74415ff53430fbc6f3b07e16db Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 10 Apr 2011 19:59:29 +0100 Subject: [PATCH 47/89] Take new count after loading files works better Fixes: https://launchpad.net/bugs/756545 --- openlp/core/ui/thememanager.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index d033daeb3..81da6e021 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -445,6 +445,7 @@ class ThemeManager(QtGui.QWidget): files = SettingsManager.get_files(self.settingsSection, u'.png') if firstTime: self.firstTime() + files = SettingsManager.get_files(self.settingsSection, u'.png') # No themes have been found so create one if len(files) == 0: theme = ThemeXML() From 1ce94d1c2080bc608cde241c856305022595c4d3 Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Sun, 10 Apr 2011 23:10:23 +0100 Subject: [PATCH 48/89] Fix theme image appearing between media images. Try and do same for ppt, but not yet. Broken the blank button... (it'll get worse before it gets better!) --- openlp/core/lib/htmlbuilder.py | 20 +++++++--- openlp/core/ui/maindisplay.py | 8 +++- openlp/core/ui/slidecontroller.py | 63 +++++++++++++++++++++---------- 3 files changed, 64 insertions(+), 27 deletions(-) diff --git a/openlp/core/lib/htmlbuilder.py b/openlp/core/lib/htmlbuilder.py index c4361a421..c874c9ff2 100644 --- a/openlp/core/lib/htmlbuilder.py +++ b/openlp/core/lib/htmlbuilder.py @@ -307,7 +307,7 @@ sup { - +

%s

' % - translate('OpenLP.ServiceManager', 'Playing time:')) - p.append(html.fromstring(u'%s' % - unicode(datetime.timedelta(seconds=tme)))) - div.append(p) - html_data.body.append(div) + title = self._fromstring(u'

%s

' % + translate('OpenLP.ServiceManager', 'Playing time:'), div) + self._fromstring(u'%s' % + unicode(datetime.timedelta(seconds=tme)), title) # Add the custom service notes: - if self.footerTextEdit.toPlainText(): - title = html.Element(u'span') - title.set(u'class', u'customNotesTitle') - title.text = unicode( - translate('OpenLP.ServiceManager', u'Custom Service Notes:')) - div.append(title) - text = html.Element(u'span') - text.set(u'class', u'customNotesText') - text.text = u' %s' % self.footerTextEdit.toPlainText() - div.append(text) + if self.footerTextEdit.toPlainText(): + footer_title = self._addChildToParent(u'span', translate( + 'OpenLP.ServiceManager', u'Custom Service Notes:'), div) + footer_title.set(u'class', u'customNotesTitle') + footer_text = self._addChildToParent(u'span', + u' %s' % self.footerTextEdit.toPlainText(), div) + footer_text.set(u'class', u'customNotesText') self.document.setHtml(html.tostring(html_data)) self.previewWidget.updatePreview() + def _addChildToParent(self, tag, text=None, parent=None): + """ + Creates a html element. If ``text`` is given, the element's text will + set and if a ``parent`` is given, the element is appended. + """ + element = html.Element(tag) + if text is not None: + element.text = text + if parent is not None: + parent.append(element) + return element + + def _fromstring(self, string, parent): + """ + This is used to create a child html element from a string. + """ + element = html.fromstring(string) + parent.append(element) + return element + def paintRequested(self, printer): """ Paint the preview of the *self.document*. From 7d2719288a601256315ca0b607bdf2e8739ee684 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 13 Apr 2011 11:42:18 +0200 Subject: [PATCH 66/89] extended helper methods --- openlp/core/ui/printserviceform.py | 68 ++++++++++++++++++------------ 1 file changed, 42 insertions(+), 26 deletions(-) diff --git a/openlp/core/ui/printserviceform.py b/openlp/core/ui/printserviceform.py index 25a631ef3..5de12d78e 100644 --- a/openlp/core/ui/printserviceform.py +++ b/openlp/core/ui/printserviceform.py @@ -163,20 +163,19 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog): css_file.write(DEFAULT_CSS) css_file.close() custom_css = get_text_file_string(css_path) - style = self._addChildToParent(u'style', custom_css, html_data.head) - style.set(u'type', u'text/css') + self._addChildToParent( + u'style', custom_css, html_data.head, u'type', u'text/css') self._addChildToParent(u'body', parent=html_data) - service_title = self._addChildToParent( - u'span', unicode(self.titleLineEdit.text()), html_data.body) - service_title.set(u'class', u'serviceTitle') + self._addChildToParent(u'span', unicode(self.titleLineEdit.text()), + html_data.body, u'class', u'serviceTitle') for index, item in enumerate(self.serviceManager.serviceItems): item = item[u'service_item'] div = self._addChildToParent(u'div', parent=html_data.body) # Add the title of the service item. - item_title = self._addChildToParent(u'h2', parent=div) - item_title.set(u'class', u'itemTitle') - icon = self._addChildToParent(u'img', parent=item_title) - icon.set(u'src', item.icon) + item_title = self._addChildToParent( + u'h2', parent=div, attribute=u'class', value=u'itemTitle') + self._addChildToParent( + u'img', parent=item_title, attribute=u'src', value=item.icon) self._fromstring( u' %s' % item.get_display_title(), item_title) if self.slideTextCheckBox.isChecked(): @@ -185,8 +184,8 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog): verse_def = None for slide in item.get_frames(): if not verse_def or verse_def != slide[u'verseTag']: - p = self._addChildToParent(u'p', parent=div) - p.set(u'class', u'itemText') + p = self._addChildToParent(u'p', parent=div, + attribute=u'class', value=u'itemText') else: self._addChildToParent(u'br', parent=p) self._fromstring(u'%s' % slide[u'html'], p) @@ -201,18 +200,17 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog): self._addChildToParent(u'li', item.get_frame_title(slide), ol) # add footer if item.foot_text: - p = self._fromstring(item.foot_text, div) - p.set(u'class', u'itemFooter') + self._fromstring( + item.foot_text, div, u'class', u'itemFooter') # Add service items' notes. if self.notesCheckBox.isChecked(): if item.notes: p = self._addChildToParent(u'p', parent=div) - title = self._addChildToParent(u'span', unicode( - translate('OpenLP.ServiceManager', 'Notes:')), p) - title.set(u'class', u'itemNotesTitle') - text = self._fromstring(u' %s' % - item.notes.replace(u'\n', u'
'), p) - text.set(u'class', u'itemNotesText') + self._addChildToParent(u'span', unicode( + translate('OpenLP.ServiceManager', 'Notes:')), p, + u'class', u'itemNotesTitle') + self._fromstring(u' %s' % item.notes.replace( + u'\n', u'
'), p, u'class', u'itemNotesText') # Add play length of media files. if item.is_media() and self.metaDataCheckBox.isChecked(): tme = item.media_length @@ -224,25 +222,43 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog): unicode(datetime.timedelta(seconds=tme)), title) # Add the custom service notes: if self.footerTextEdit.toPlainText(): - footer_title = self._addChildToParent(u'span', translate( - 'OpenLP.ServiceManager', u'Custom Service Notes:'), div) - footer_title.set(u'class', u'customNotesTitle') - footer_text = self._addChildToParent(u'span', - u' %s' % self.footerTextEdit.toPlainText(), div) - footer_text.set(u'class', u'customNotesText') + self._addChildToParent(u'span', translate('OpenLP.ServiceManager', + u'Custom Service Notes:'), div, u'class', u'customNotesTitle') + self._addChildToParent( + u'span', u' %s' % self.footerTextEdit.toPlainText(), div, + u'class', u'customNotesText') self.document.setHtml(html.tostring(html_data)) self.previewWidget.updatePreview() - def _addChildToParent(self, tag, text=None, parent=None): + def _addChildToParent(self, tag, text=None, parent=None, attribute=None, + value=None): """ Creates a html element. If ``text`` is given, the element's text will set and if a ``parent`` is given, the element is appended. + + ``tag`` + The html tag, e. g. ``u'span'``. Defaults to ``None``. + + ``text`` + The text for the tag. Defaults to ``None``. + + ``parent`` + The parent element. Defaults to ``None``. + + ``attribute`` + An optional attribute, for instance ``u'class``. + + ``value`` + The value for the given ``attribute``. It does not have and meaning, + if the attribute is left to its default. """ element = html.Element(tag) if text is not None: element.text = text if parent is not None: parent.append(element) + if attribute is not None: + element.set(attribute, value if value is not None else u'') return element def _fromstring(self, string, parent): From 7d5ee8adf636cb3fc06a4fbd15facd63ec64a9cf Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 13 Apr 2011 11:53:57 +0200 Subject: [PATCH 67/89] spelling --- openlp/core/ui/printserviceform.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/ui/printserviceform.py b/openlp/core/ui/printserviceform.py index 5de12d78e..c41084b2f 100644 --- a/openlp/core/ui/printserviceform.py +++ b/openlp/core/ui/printserviceform.py @@ -249,7 +249,7 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog): An optional attribute, for instance ``u'class``. ``value`` - The value for the given ``attribute``. It does not have and meaning, + The value for the given ``attribute``. It does not have a meaning, if the attribute is left to its default. """ element = html.Element(tag) From 8451d52f27c0042e67dba88356a5d076f4601b9a Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 13 Apr 2011 12:22:26 +0200 Subject: [PATCH 68/89] fixed _fromstring; changed setting name in config --- openlp/core/ui/printserviceform.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/openlp/core/ui/printserviceform.py b/openlp/core/ui/printserviceform.py index c41084b2f..5348396d7 100644 --- a/openlp/core/ui/printserviceform.py +++ b/openlp/core/ui/printserviceform.py @@ -104,7 +104,7 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog): self.slideTextCheckBox.setChecked(settings.value( u'print slide text', QtCore.QVariant(False)).toBool()) self.pageBreakAfterText.setChecked(settings.value( - u'enable page break', QtCore.QVariant(False)).toBool()) + u'add page break', QtCore.QVariant(False)).toBool()) if not self.slideTextCheckBox.isChecked(): self.pageBreakAfterText.setDisabled(True) self.metaDataCheckBox.setChecked(settings.value( @@ -261,11 +261,13 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog): element.set(attribute, value if value is not None else u'') return element - def _fromstring(self, string, parent): + def _fromstring(self, string, parent, attribute=None, value=None): """ This is used to create a child html element from a string. """ element = html.fromstring(string) + if attribute is not None: + element.set(attribute, value if value is not None else u'') parent.append(element) return element @@ -371,7 +373,7 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog): settings.beginGroup(u'advanced') settings.setValue(u'print slide text', QtCore.QVariant(self.slideTextCheckBox.isChecked())) - settings.setValue(u'enable page break', + settings.setValue(u'add page break', QtCore.QVariant(self.pageBreakAfterText.isChecked())) settings.setValue(u'print file meta data', QtCore.QVariant(self.metaDataCheckBox.isChecked())) From 2dc2304a2c8b01a62ffc99f67a047f0322b9f1f8 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 13 Apr 2011 15:31:23 +0200 Subject: [PATCH 69/89] fixed advanced bible book initialisation; append a space to completion suggestions --- openlp/plugins/bibles/lib/mediaitem.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index b0d4c8bca..fbafcd725 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -328,6 +328,8 @@ class BibleMediaItem(MediaManagerItem): if bible in bibles: find_and_set_in_combo_box(self.advancedVersionComboBox, bible) self.initialiseAdvancedBible(unicode(bible)) + elif len(bibles): + self.initialiseAdvancedBible(bibles[0]) def reloadBibles(self): log.debug(u'Reloading Bibles') @@ -395,7 +397,7 @@ class BibleMediaItem(MediaManagerItem): bible = unicode(self.quickVersionComboBox.currentText()) if bible: book_data = bibles[bible].get_books() - books = [book.name for book in book_data] + books = [book.name + u' ' for book in book_data] books.sort() add_widget_completer(books, self.quickSearchEdit) From 6082785b3eb2304f434395608545dc2d8ba41bdb Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 13 Apr 2011 16:28:31 +0200 Subject: [PATCH 70/89] use map; fixed changing quickBible --- openlp/plugins/bibles/lib/mediaitem.py | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index fbafcd725..3f1c2b612 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -291,7 +291,11 @@ class BibleMediaItem(MediaManagerItem): log.debug(u'bible manager initialise') self.parent.manager.media = self self.loadBibles() - self.updateAutoCompleter(False) + bible = QtCore.QSettings().value( + self.settingsSection + u'/quick bible', QtCore.QVariant( + self.quickVersionComboBox.currentText())).toString() + find_and_set_in_combo_box(self.quickVersionComboBox, bible) + self.updateAutoCompleter() self.configUpdated() log.debug(u'bible manager initialise complete') @@ -376,20 +380,14 @@ class BibleMediaItem(MediaManagerItem): self.adjustComboBox(1, verse_count, self.advancedFromVerse) self.adjustComboBox(1, verse_count, self.advancedToVerse) - def updateAutoCompleter(self, updateConfig=True): + def updateAutoCompleter(self): """ This updates the bible book completion list for the search field. The completion depends on the bible. It is only updated when we are doing a reference search, otherwise the auto completion list is removed. """ - if updateConfig: - QtCore.QSettings().setValue(self.settingsSection + u'/quick bible', - QtCore.QVariant(self.quickVersionComboBox.currentText())) - else: - book = QtCore.QSettings().value( - self.settingsSection + u'/quick bible', - QtCore.QVariant(u'')).toString() - find_and_set_in_combo_box(self.quickVersionComboBox, book) + QtCore.QSettings().setValue(self.settingsSection + u'/quick bible', + QtCore.QVariant(self.quickVersionComboBox.currentText())) books = [] # We have to do a 'Reference Search'. if self.quickSearchEdit.currentSearchType() == BibleSearch.Reference: @@ -397,7 +395,7 @@ class BibleMediaItem(MediaManagerItem): bible = unicode(self.quickVersionComboBox.currentText()) if bible: book_data = bibles[bible].get_books() - books = [book.name + u' ' for book in book_data] + books = map(lambda x: x.name + u' ', book_data) books.sort() add_widget_completer(books, self.quickSearchEdit) From 01c286e50ef4ad6d30ea9b6f9f54b2da652e688f Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 13 Apr 2011 20:01:28 +0200 Subject: [PATCH 71/89] fixed crash --- openlp/core/ui/printserviceform.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/ui/printserviceform.py b/openlp/core/ui/printserviceform.py index 5348396d7..01b937d61 100644 --- a/openlp/core/ui/printserviceform.py +++ b/openlp/core/ui/printserviceform.py @@ -254,7 +254,7 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog): """ element = html.Element(tag) if text is not None: - element.text = text + element.text = unicode(text) if parent is not None: parent.append(element) if attribute is not None: From a22bb2e0bc4ebbc9f21ddb990d9e4079b5b93f6f Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Wed, 13 Apr 2011 19:14:38 +0100 Subject: [PATCH 72/89] Active/inactive fixes --- openlp/core/lib/pluginmanager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/lib/pluginmanager.py b/openlp/core/lib/pluginmanager.py index 3b73750fe..6854cb53c 100644 --- a/openlp/core/lib/pluginmanager.py +++ b/openlp/core/lib/pluginmanager.py @@ -150,7 +150,7 @@ class PluginManager(object): if plugin.status is not PluginStatus.Disabled: plugin.settings_tab = plugin.getSettingsTab() visible_title = plugin.getString(StringContent.VisibleName) - if plugin.settings_tab: + if plugin.settings_tab and plugin.isActive(): log.debug(u'Inserting settings tab item from %s' % visible_title[u'title']) settingsform.insertTab(plugin.settings_tab, plugin.weight) From 606287bda10665592a1971b64e62474094587f98 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 13 Apr 2011 20:18:25 +0200 Subject: [PATCH 73/89] reverted change --- openlp/plugins/bibles/lib/mediaitem.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 3f1c2b612..118bdfc66 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -395,7 +395,7 @@ class BibleMediaItem(MediaManagerItem): bible = unicode(self.quickVersionComboBox.currentText()) if bible: book_data = bibles[bible].get_books() - books = map(lambda x: x.name + u' ', book_data) + books = [book.name + u' ' for book in book_data] books.sort() add_widget_completer(books, self.quickSearchEdit) From 79ed96648faa71539e85297edfbade42de4d66c4 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Wed, 13 Apr 2011 19:40:09 +0100 Subject: [PATCH 74/89] More cleanups --- openlp/core/ui/settingsdialog.py | 12 ++++++------ openlp/core/ui/settingsform.py | 6 ++---- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/openlp/core/ui/settingsdialog.py b/openlp/core/ui/settingsdialog.py index 45a68c321..3f5f12bd2 100644 --- a/openlp/core/ui/settingsdialog.py +++ b/openlp/core/ui/settingsdialog.py @@ -35,20 +35,20 @@ class Ui_SettingsDialog(object): settingsDialog.resize(800, 500) settingsDialog.setWindowIcon( build_icon(u':/system/system_settings.png')) - self.settingsLayout = QtGui.QGridLayout(settingsDialog) - self.settingsLayout.setObjectName(u'settingsLayout') - self.settingsLayout.setMargin(0) + self.dialogLayout = QtGui.QGridLayout(settingsDialog) + self.dialogLayout.setObjectName(u'dialogLayout') + self.dialogLayout.setMargin(0) self.settingListWidget = QtGui.QListWidget(settingsDialog) self.settingListWidget.setMinimumSize(QtCore.QSize(150, 0)) self.settingListWidget.setHorizontalScrollBarPolicy( QtCore.Qt.ScrollBarAlwaysOff) self.settingListWidget.setObjectName(u'settingListWidget') - self.settingsLayout.addWidget(self.settingListWidget, 0, 0, 1, 1) + self.dialogLayout.addWidget(self.settingListWidget, 0, 0, 1, 1) self.stackedLayout = QtGui.QStackedLayout() self.stackedLayout.setObjectName(u'stackedLayout') - self.settingsLayout.addLayout(self.stackedLayout, 0, 1, 1, 1) + self.dialogLayout.addLayout(self.stackedLayout, 0, 1, 1, 1) self.buttonBox = create_accept_reject_button_box(settingsDialog, True) - self.settingsLayout.addWidget(self.buttonBox, 1, 1, 1, 1) + self.dialogLayout.addWidget(self.buttonBox, 1, 1, 1, 1) self.retranslateUi(settingsDialog) QtCore.QMetaObject.connectSlotsByName(settingsDialog) QtCore.QObject.connect(self.settingListWidget, diff --git a/openlp/core/ui/settingsform.py b/openlp/core/ui/settingsform.py index 1e71bc985..3415f3ec8 100644 --- a/openlp/core/ui/settingsform.py +++ b/openlp/core/ui/settingsform.py @@ -60,9 +60,9 @@ class SettingsForm(QtGui.QDialog, Ui_SettingsDialog): # load all the settings for tabIndex in range(0, self.stackedLayout.count()): self.stackedLayout.widget(tabIndex).load() + self.settingListWidget.setCurrentRow(0) return QtGui.QDialog.exec_(self) - def insertTab(self, tab, location): """ Add a tab to the form at a specific location @@ -78,13 +78,11 @@ class SettingsForm(QtGui.QDialog, Ui_SettingsDialog): match = True break if not match: - self.stackedLayout.addWidget(tab) + pos = self.stackedLayout.addWidget(tab) item_name = QtGui.QListWidgetItem(tab.tabTitleVisible) icon = build_icon(tab.icon_path) item_name.setIcon(icon) self.settingListWidget.insertItem(14 + location, item_name) - self.stackedLayout.addWidget(tab) - self.stackedLayout.setCurrentIndex(0) def removeTab(self, tab): """ From 9e88d0bff4c3a3a761ea974acc5e1a2e9aa2b0da Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 13 Apr 2011 20:53:05 +0200 Subject: [PATCH 75/89] clean ups --- openlp/plugins/bibles/lib/db.py | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index 85ab98de1..ec63dc02f 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -177,10 +177,7 @@ class BibleDB(QtCore.QObject, Manager): Returns the version name of the Bible. """ version_name = self.get_object(BibleMeta, u'Version') - if version_name: - self.name = version_name.value - else: - self.name = None + self.name = version_name.value if version_name else None return self.name def clean_filename(self, old_filename): @@ -256,10 +253,10 @@ class BibleDB(QtCore.QObject, Manager): # Text list has book and chapter as first two elements of the array. for verse_number, verse_text in textlist.iteritems(): verse = Verse.populate( - book_id = book_id, - chapter = chapter, - verse = verse_number, - text = verse_text + book_id=book_id, + chapter=chapter, + verse=verse_number, + text=verse_text ) self.session.add(verse) self.session.commit() @@ -383,15 +380,13 @@ class BibleDB(QtCore.QObject, Manager): log.debug(u'BibleDB.verse_search("%s")', text) verses = self.session.query(Verse) if text.find(u',') > -1: - or_clause = [] - keywords = [u'%%%s%%' % keyword.strip() - for keyword in text.split(u',')] - for keyword in keywords: - or_clause.append(Verse.text.like(keyword)) + keywords = \ + [u'%%%s%%' % keyword.strip() for keyword in text.split(u',')] + or_clause = [Verse.text.like(keyword) for keyword in keywords] verses = verses.filter(or_(*or_clause)) else: - keywords = [u'%%%s%%' % keyword.strip() - for keyword in text.split(u' ')] + keywords = \ + [u'%%%s%%' % keyword.strip() for keyword in text.split(u' ')] for keyword in keywords: verses = verses.filter(Verse.text.like(keyword)) verses = verses.all() From 6454b88a83aea140d4c19bad077768d4b93443e2 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Wed, 13 Apr 2011 20:12:47 +0100 Subject: [PATCH 76/89] Fix Tab parentage --- openlp/core/lib/plugin.py | 4 ++-- openlp/core/lib/pluginmanager.py | 2 +- openlp/core/lib/settingstab.py | 4 ++-- openlp/core/ui/advancedtab.py | 4 ++-- openlp/core/ui/generaltab.py | 4 ++-- openlp/core/ui/settingsdialog.py | 1 + openlp/core/ui/settingsform.py | 6 +++--- openlp/core/ui/themestab.py | 14 +++++++------- openlp/plugins/alerts/lib/alertstab.py | 4 ++-- openlp/plugins/bibles/lib/biblestab.py | 4 ++-- openlp/plugins/custom/lib/customtab.py | 4 ++-- openlp/plugins/media/lib/mediatab.py | 4 ++-- .../plugins/presentations/lib/presentationtab.py | 4 ++-- openlp/plugins/presentations/presentationplugin.py | 4 ++-- openlp/plugins/remotes/lib/remotetab.py | 4 ++-- openlp/plugins/songs/lib/songstab.py | 4 ++-- 16 files changed, 36 insertions(+), 35 deletions(-) diff --git a/openlp/core/lib/plugin.py b/openlp/core/lib/plugin.py index ef89e6424..e4359f6b0 100644 --- a/openlp/core/lib/plugin.py +++ b/openlp/core/lib/plugin.py @@ -244,13 +244,13 @@ class Plugin(QtCore.QObject): """ pass - def getSettingsTab(self): + def getSettingsTab(self, parent): """ Create a tab for the settings window to display the configurable options for this plugin to the user. """ if self.settings_tab_class: - return self.settings_tab_class(self.name, + return self.settings_tab_class(parent, self.name, self.getString(StringContent.VisibleName)[u'title'], self.icon_path) return None diff --git a/openlp/core/lib/pluginmanager.py b/openlp/core/lib/pluginmanager.py index 6854cb53c..6f1222276 100644 --- a/openlp/core/lib/pluginmanager.py +++ b/openlp/core/lib/pluginmanager.py @@ -148,7 +148,7 @@ class PluginManager(object): """ for plugin in self.plugins: if plugin.status is not PluginStatus.Disabled: - plugin.settings_tab = plugin.getSettingsTab() + plugin.settings_tab = plugin.getSettingsTab(settingsform) visible_title = plugin.getString(StringContent.VisibleName) if plugin.settings_tab and plugin.isActive(): log.debug(u'Inserting settings tab item from %s' % diff --git a/openlp/core/lib/settingstab.py b/openlp/core/lib/settingstab.py index 32d7dc912..e1396d984 100644 --- a/openlp/core/lib/settingstab.py +++ b/openlp/core/lib/settingstab.py @@ -31,7 +31,7 @@ class SettingsTab(QtGui.QWidget): SettingsTab is a helper widget for plugins to define Tabs for the settings dialog. """ - def __init__(self, title, visible_title=None, icon_path=None): + def __init__(self, parent, title, visible_title=None, icon_path=None): """ Constructor to create the Settings tab item. @@ -41,7 +41,7 @@ class SettingsTab(QtGui.QWidget): ``visible_title`` The title of the tab, which is usually displayed on the tab. """ - QtGui.QWidget.__init__(self) + QtGui.QWidget.__init__(self, parent) self.tabTitle = title self.tabTitleVisible = visible_title self.settingsSection = self.tabTitle.lower() diff --git a/openlp/core/ui/advancedtab.py b/openlp/core/ui/advancedtab.py index 6041382b8..3d9321fe1 100644 --- a/openlp/core/ui/advancedtab.py +++ b/openlp/core/ui/advancedtab.py @@ -37,12 +37,12 @@ class AdvancedTab(SettingsTab): The :class:`AdvancedTab` manages the advanced settings tab including the UI and the loading and saving of the displayed settings. """ - def __init__(self): + def __init__(self, parent): """ Initialise the settings tab """ generalTranslated = translate('AdvancedTab', 'Advanced') - SettingsTab.__init__(self, u'Advanced', generalTranslated) + SettingsTab.__init__(self, parent ,u'Advanced', generalTranslated) self.default_image = u':/graphics/openlp-splash-screen.png' self.default_color = u'#ffffff' self.icon_path = u':/icon/openlp-logo-16x16.png' diff --git a/openlp/core/ui/generaltab.py b/openlp/core/ui/generaltab.py index d566244b8..cfde7810c 100644 --- a/openlp/core/ui/generaltab.py +++ b/openlp/core/ui/generaltab.py @@ -36,7 +36,7 @@ class GeneralTab(SettingsTab): """ GeneralTab is the general settings tab in the settings dialog. """ - def __init__(self, screens): + def __init__(self, parent, screens): """ Initialise the general settings tab """ @@ -46,7 +46,7 @@ class GeneralTab(SettingsTab): self.overrideChanged = True self.icon_path = u':/icon/openlp-logo-16x16.png' generalTranslated = translate('GeneralTab', 'General') - SettingsTab.__init__(self, u'General', generalTranslated) + SettingsTab.__init__(self, parent, u'General', generalTranslated) def preLoad(self): """ diff --git a/openlp/core/ui/settingsdialog.py b/openlp/core/ui/settingsdialog.py index 3f5f12bd2..485cb9c5f 100644 --- a/openlp/core/ui/settingsdialog.py +++ b/openlp/core/ui/settingsdialog.py @@ -39,6 +39,7 @@ class Ui_SettingsDialog(object): self.dialogLayout.setObjectName(u'dialogLayout') self.dialogLayout.setMargin(0) self.settingListWidget = QtGui.QListWidget(settingsDialog) + self.settingListWidget.setUniformItemSizes(True) self.settingListWidget.setMinimumSize(QtCore.QSize(150, 0)) self.settingListWidget.setHorizontalScrollBarPolicy( QtCore.Qt.ScrollBarAlwaysOff) diff --git a/openlp/core/ui/settingsform.py b/openlp/core/ui/settingsform.py index 3415f3ec8..72e1b7fa4 100644 --- a/openlp/core/ui/settingsform.py +++ b/openlp/core/ui/settingsform.py @@ -47,13 +47,13 @@ class SettingsForm(QtGui.QDialog, Ui_SettingsDialog): QtGui.QDialog.__init__(self, parent) self.setupUi(self) # General tab - generalTab = GeneralTab(screens) + generalTab = GeneralTab(self, screens) self.insertTab(generalTab, 1) # Themes tab - themesTab = ThemesTab(mainWindow) + themesTab = ThemesTab(self, mainWindow) self.insertTab(themesTab, 2) # Advanced tab - advancedTab = AdvancedTab() + advancedTab = AdvancedTab(self, ) self.insertTab(advancedTab, 3) def exec_(self): diff --git a/openlp/core/ui/themestab.py b/openlp/core/ui/themestab.py index b5fcce1ec..372ee0cc8 100644 --- a/openlp/core/ui/themestab.py +++ b/openlp/core/ui/themestab.py @@ -34,10 +34,10 @@ class ThemesTab(SettingsTab): """ ThemesTab is the theme settings tab in the settings dialog. """ - def __init__(self, parent): - self.parent = parent + def __init__(self, parent, mainwindow): + self.mainwindow = mainwindow generalTranslated = translate('ThemeTab', 'Themes') - SettingsTab.__init__(self, u'Themes', generalTranslated) + SettingsTab.__init__(self, parent, u'Themes', generalTranslated) self.icon_path = u':/themes/theme_new.png' def setupUi(self): @@ -149,7 +149,7 @@ class ThemesTab(SettingsTab): settings.setValue(u'global theme', QtCore.QVariant(self.global_theme)) settings.endGroup() - self.parent.renderManager.set_global_theme( + self.mainwindow.renderManager.set_global_theme( self.global_theme, self.theme_level) Receiver.send_message(u'theme_update_global', self.global_theme) @@ -167,7 +167,7 @@ class ThemesTab(SettingsTab): def onDefaultComboBoxChanged(self, value): self.global_theme = unicode(self.DefaultComboBox.currentText()) - self.parent.renderManager.set_global_theme( + self.mainwindow.renderManager.set_global_theme( self.global_theme, self.theme_level) self.__previewGlobalTheme() @@ -188,7 +188,7 @@ class ThemesTab(SettingsTab): for theme in theme_list: self.DefaultComboBox.addItem(theme) find_and_set_in_combo_box(self.DefaultComboBox, self.global_theme) - self.parent.renderManager.set_global_theme( + self.mainwindow.renderManager.set_global_theme( self.global_theme, self.theme_level) if self.global_theme is not u'': self.__previewGlobalTheme() @@ -197,7 +197,7 @@ class ThemesTab(SettingsTab): """ Utility method to update the global theme preview image. """ - image = self.parent.themeManagerContents.getPreviewImage( + image = self.mainwindow.themeManagerContents.getPreviewImage( self.global_theme) preview = QtGui.QPixmap(unicode(image)) if not preview.isNull(): diff --git a/openlp/plugins/alerts/lib/alertstab.py b/openlp/plugins/alerts/lib/alertstab.py index 2e97d27d3..3b6c50a10 100644 --- a/openlp/plugins/alerts/lib/alertstab.py +++ b/openlp/plugins/alerts/lib/alertstab.py @@ -33,8 +33,8 @@ class AlertsTab(SettingsTab): """ AlertsTab is the alerts settings tab in the settings dialog. """ - def __init__(self, name, visible_title, icon_path): - SettingsTab.__init__(self, name, visible_title, icon_path) + def __init__(self, parent, name, visible_title, icon_path): + SettingsTab.__init__(self, parent, name, visible_title, icon_path) def setupUi(self): self.setObjectName(u'AlertsTab') diff --git a/openlp/plugins/bibles/lib/biblestab.py b/openlp/plugins/bibles/lib/biblestab.py index 1d87d20cb..b013c402a 100644 --- a/openlp/plugins/bibles/lib/biblestab.py +++ b/openlp/plugins/bibles/lib/biblestab.py @@ -40,11 +40,11 @@ class BiblesTab(SettingsTab): """ log.info(u'Bible Tab loaded') - def __init__(self, title, visible_title, icon_path): + def __init__(self, parent, title, visible_title, icon_path): self.paragraph_style = True self.show_new_chapters = False self.display_style = 0 - SettingsTab.__init__(self, title, visible_title, icon_path) + SettingsTab.__init__(self, parent, title, visible_title, icon_path) def setupUi(self): self.setObjectName(u'BiblesTab') diff --git a/openlp/plugins/custom/lib/customtab.py b/openlp/plugins/custom/lib/customtab.py index 006295410..9de294418 100644 --- a/openlp/plugins/custom/lib/customtab.py +++ b/openlp/plugins/custom/lib/customtab.py @@ -32,8 +32,8 @@ class CustomTab(SettingsTab): """ CustomTab is the Custom settings tab in the settings dialog. """ - def __init__(self, title, visible_title, icon_path): - SettingsTab.__init__(self, title, visible_title, icon_path) + def __init__(self, parent, title, visible_title, icon_path): + SettingsTab.__init__(self, parent, title, visible_title, icon_path) def setupUi(self): self.setObjectName(u'CustomTab') diff --git a/openlp/plugins/media/lib/mediatab.py b/openlp/plugins/media/lib/mediatab.py index 72085158c..f54aa02fa 100644 --- a/openlp/plugins/media/lib/mediatab.py +++ b/openlp/plugins/media/lib/mediatab.py @@ -32,8 +32,8 @@ class MediaTab(SettingsTab): """ MediaTab is the Media settings tab in the settings dialog. """ - def __init__(self, title, visible_title, icon_path): - SettingsTab.__init__(self, title, visible_title, icon_path) + def __init__(self, parent, title, visible_title, icon_path): + SettingsTab.__init__(self, parent, title, visible_title, icon_path) def setupUi(self): self.setObjectName(u'MediaTab') diff --git a/openlp/plugins/presentations/lib/presentationtab.py b/openlp/plugins/presentations/lib/presentationtab.py index c7a143006..8e3a98031 100644 --- a/openlp/plugins/presentations/lib/presentationtab.py +++ b/openlp/plugins/presentations/lib/presentationtab.py @@ -33,12 +33,12 @@ class PresentationTab(SettingsTab): """ PresentationsTab is the Presentations settings tab in the settings dialog. """ - def __init__(self, title, visible_title, controllers, icon_path): + def __init__(self, parent, title, visible_title, controllers, icon_path): """ Constructor """ self.controllers = controllers - SettingsTab.__init__(self, title, visible_title, icon_path) + SettingsTab.__init__(self, parent, title, visible_title, icon_path) def setupUi(self): """ diff --git a/openlp/plugins/presentations/presentationplugin.py b/openlp/plugins/presentations/presentationplugin.py index 1da9fe511..f217e6023 100644 --- a/openlp/plugins/presentations/presentationplugin.py +++ b/openlp/plugins/presentations/presentationplugin.py @@ -56,12 +56,12 @@ class PresentationPlugin(Plugin): self.icon_path = u':/plugins/plugin_presentations.png' self.icon = build_icon(self.icon_path) - def getSettingsTab(self): + def getSettingsTab(self, parent): """ Create the settings Tab """ visible_name = self.getString(StringContent.VisibleName) - return PresentationTab(self.name, visible_name[u'title'], + return PresentationTab(parent, self.name, visible_name[u'title'], self.controllers, self.icon_path) def initialise(self): diff --git a/openlp/plugins/remotes/lib/remotetab.py b/openlp/plugins/remotes/lib/remotetab.py index 97aedc9cd..297437d93 100644 --- a/openlp/plugins/remotes/lib/remotetab.py +++ b/openlp/plugins/remotes/lib/remotetab.py @@ -32,8 +32,8 @@ class RemoteTab(SettingsTab): """ RemoteTab is the Remotes settings tab in the settings dialog. """ - def __init__(self, title, visible_title, icon_path): - SettingsTab.__init__(self, title, visible_title, icon_path) + def __init__(self, parent, title, visible_title, icon_path): + SettingsTab.__init__(self, parent, title, visible_title, icon_path) def setupUi(self): self.setObjectName(u'RemoteTab') diff --git a/openlp/plugins/songs/lib/songstab.py b/openlp/plugins/songs/lib/songstab.py index 092c6af29..e39c22be7 100644 --- a/openlp/plugins/songs/lib/songstab.py +++ b/openlp/plugins/songs/lib/songstab.py @@ -32,8 +32,8 @@ class SongsTab(SettingsTab): """ SongsTab is the Songs settings tab in the settings dialog. """ - def __init__(self, title, visible_title, icon_path): - SettingsTab.__init__(self, title, visible_title, icon_path) + def __init__(self, parent, title, visible_title, icon_path): + SettingsTab.__init__(self, parent, title, visible_title, icon_path) def setupUi(self): self.setObjectName(u'SongsTab') From 5f93ff657ef7f5e84e2ae5b067259db316268ade Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Wed, 13 Apr 2011 23:10:41 +0100 Subject: [PATCH 77/89] PPT's are getting there. Going from blank ppt to song broken now --- openlp/core/ui/slidecontroller.py | 50 +++++++++++-------- .../presentations/lib/messagelistener.py | 13 ++--- 2 files changed, 36 insertions(+), 27 deletions(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 0261b5782..00202d8cc 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -460,7 +460,7 @@ class SlideController(QtGui.QWidget): request = unicode(self.sender().text()) slideno = self.slideList[request] self.__updatePreviewSelection(slideno) - self.onSlideSelected() + self.slideSelected() def receiveSpinDelay(self, value): """ @@ -556,7 +556,7 @@ class SlideController(QtGui.QWidget): # If service item is the same as the current on only change slide if item.__eq__(self.serviceItem): self.__checkUpdateSelectedSlide(slideno) - self.onSlideSelected() + self.slideSelected() return self._processItem(item, slideno) @@ -641,7 +641,7 @@ class SlideController(QtGui.QWidget): self.display.buildHtml(self.serviceItem) if serviceItem.is_media(): self.onMediaStart(serviceItem) - self.onSlideSelected(True) + self.slideSelected(True) self.previewListWidget.setFocus() if old_item: # Close the old item after the new one is opened @@ -699,7 +699,7 @@ class SlideController(QtGui.QWidget): self.updatePreview() else: self.previewListWidget.selectRow(0) - self.onSlideSelected() + self.slideSelected() def onSlideSelectedIndex(self, message): """ @@ -714,7 +714,7 @@ class SlideController(QtGui.QWidget): self.updatePreview() else: self.__checkUpdateSelectedSlide(index) - self.onSlideSelected() + self.slideSelected() def mainDisplaySetBackground(self): """ @@ -755,15 +755,13 @@ class SlideController(QtGui.QWidget): self.themeScreen.setChecked(False) self.desktopScreen.setChecked(False) if checked: - Receiver.send_message(u'maindisplay_hide', HideMode.Blank) QtCore.QSettings().setValue( self.parent.generalSettingsSection + u'/screen blank', QtCore.QVariant(u'blanked')) else: - Receiver.send_message(u'maindisplay_show') QtCore.QSettings().remove( self.parent.generalSettingsSection + u'/screen blank') - self.blankPlugin(checked) + self.blankPlugin() self.updatePreview() def onThemeDisplay(self, checked): @@ -776,15 +774,13 @@ class SlideController(QtGui.QWidget): self.themeScreen.setChecked(checked) self.desktopScreen.setChecked(False) if checked: - Receiver.send_message(u'maindisplay_hide', HideMode.Theme) QtCore.QSettings().setValue( self.parent.generalSettingsSection + u'/screen blank', QtCore.QVariant(u'themed')) else: - Receiver.send_message(u'maindisplay_show') QtCore.QSettings().remove( self.parent.generalSettingsSection + u'/screen blank') - self.blankPlugin(checked) + self.blankPlugin() self.updatePreview() def onHideDisplay(self, checked): @@ -797,28 +793,31 @@ class SlideController(QtGui.QWidget): self.themeScreen.setChecked(False) self.desktopScreen.setChecked(checked) if checked: - Receiver.send_message(u'maindisplay_hide', HideMode.Screen) QtCore.QSettings().setValue( self.parent.generalSettingsSection + u'/screen blank', QtCore.QVariant(u'hidden')) else: - Receiver.send_message(u'maindisplay_show') QtCore.QSettings().remove( self.parent.generalSettingsSection + u'/screen blank') self.hidePlugin(checked) self.updatePreview() - def blankPlugin(self, blank): + def blankPlugin(self): """ - Blank the display screen within a plugin if required. + Blank/Hide the display screen within a plugin if required. """ - log.debug(u'blankPlugin %s ', blank) + hide_mode = self.hideMode() + log.debug(u'blankPlugin %s ', hide_mode) if self.serviceItem is not None: - if blank: + if hide_mode: + if not self.serviceItem.is_command(): + Receiver.send_message(u'maindisplay_hide', hide_mode) Receiver.send_message(u'%s_blank' % self.serviceItem.name.lower(), - [self.serviceItem, self.isLive]) + [self.serviceItem, self.isLive, hide_mode]) else: + if not self.serviceItem.is_command(): + Receiver.send_message(u'maindisplay_show') Receiver.send_message(u'%s_unblank' % self.serviceItem.name.lower(), [self.serviceItem, self.isLive]) @@ -830,15 +829,24 @@ class SlideController(QtGui.QWidget): log.debug(u'hidePlugin %s ', hide) if self.serviceItem is not None: if hide: + Receiver.send_message(u'maindisplay_hide', HideMode.Screen) Receiver.send_message(u'%s_hide' % self.serviceItem.name.lower(), [self.serviceItem, self.isLive]) else: + if not self.serviceItem.is_command(): + Receiver.send_message(u'maindisplay_show') Receiver.send_message(u'%s_unblank' % self.serviceItem.name.lower(), [self.serviceItem, self.isLive]) def onSlideSelected(self, start=False): + """ + Slide selected in controller + """ + self.slideSelected() + + def slideSelected(self, start=False): """ Generate the preview when you click on a slide. if this is the Live Controller also display on the screen @@ -927,7 +935,7 @@ class SlideController(QtGui.QWidget): Receiver.send_message('servicemanager_next_item') return self.__checkUpdateSelectedSlide(row) - self.onSlideSelected() + self.slideSelected() def onSlideSelectedPreviousNoloop(self): self.onSlideSelectedPrevious(False) @@ -950,7 +958,7 @@ class SlideController(QtGui.QWidget): else: row = 0 self.__checkUpdateSelectedSlide(row) - self.onSlideSelected() + self.slideSelected() def __checkUpdateSelectedSlide(self, row): if row + 1 < self.previewListWidget.rowCount(): @@ -971,7 +979,7 @@ class SlideController(QtGui.QWidget): else: self.previewListWidget.selectRow( self.previewListWidget.rowCount() - 1) - self.onSlideSelected() + self.slideSelected() def onStartLoop(self): """ diff --git a/openlp/plugins/presentations/lib/messagelistener.py b/openlp/plugins/presentations/lib/messagelistener.py index 4f9268b3e..b76fd7d4c 100644 --- a/openlp/plugins/presentations/lib/messagelistener.py +++ b/openlp/plugins/presentations/lib/messagelistener.py @@ -70,11 +70,9 @@ class Controller(object): Receiver.send_message(u'maindisplay_hide', HideMode.Screen) self.stop() elif hide_mode == HideMode.Theme: - Receiver.send_message(u'maindisplay_hide', HideMode.Theme) - self.blank() + self.blank(hide_mode) elif hide_mode == HideMode.Blank: - Receiver.send_message(u'maindisplay_hide', HideMode.Blank) - self.blank() + self.blank(hide_mode) else: self.doc.start_presentation() Receiver.send_message(u'maindisplay_hide', HideMode.Screen) @@ -182,7 +180,7 @@ class Controller(object): #self.doc.slidenumber = 0 #self.timer.stop() - def blank(self): + def blank(self, hide_mode): """ Instruct the controller to blank the presentation """ @@ -193,6 +191,8 @@ class Controller(object): return if not self.doc.is_active(): return + if hide_mode == HideMode.Theme: + Receiver.send_message(u'maindisplay_hide', HideMode.Theme) self.doc.blank_screen() def stop(self): @@ -363,8 +363,9 @@ class MessageListener(object): React to the message to blank the display """ is_live = message[1] + hide_mode = message[2] if is_live: - self.live_handler.blank() + self.live_handler.blank(hide_mode) def unblank(self, message): """ From f2f49acd399e0780b3cbd85e2af0fd36148a6e62 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 14 Apr 2011 15:53:02 +0200 Subject: [PATCH 78/89] added ability to change language in a spelledit --- openlp/core/lib/__init__.py | 2 +- openlp/core/lib/spelltextedit.py | 32 +++++++++++++++++++++++++++++--- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index 491f3e652..89eeb6ad4 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -274,8 +274,8 @@ def check_directory_exists(dir): from listwidgetwithdnd import ListWidgetWithDnD from displaytags import DisplayTags -from spelltextedit import SpellTextEdit from eventreceiver import Receiver +from spelltextedit import SpellTextEdit from imagemanager import ImageManager from settingsmanager import SettingsManager from plugin import PluginStatus, StringContent, Plugin diff --git a/openlp/core/lib/spelltextedit.py b/openlp/core/lib/spelltextedit.py index 95befad09..a99539775 100644 --- a/openlp/core/lib/spelltextedit.py +++ b/openlp/core/lib/spelltextedit.py @@ -36,7 +36,9 @@ except ImportError: # http://john.nachtimwald.com/2009/08/22/qplaintextedit-with-in-line-spell-check from PyQt4 import QtCore, QtGui + from openlp.core.lib import translate, DisplayTags +from openlp.core.lib.ui import checkable_action log = logging.getLogger(__name__) @@ -80,6 +82,19 @@ class SpellTextEdit(QtGui.QPlainTextEdit): if not cursor.hasSelection(): cursor.select(QtGui.QTextCursor.WordUnderCursor) self.setTextCursor(cursor) + # Add menu with available languages. + if ENCHANT_AVAILABLE: + lang_menu = QtGui.QMenu( + translate('OpenLP.SpellTextEdit', 'Language:')) + for lang in enchant.list_languages(): + action = checkable_action( + lang_menu, lang, lang == self.dictionary.tag) + action.setText(lang) + lang_menu.addAction(action) + popupMenu.insertSeparator(popupMenu.actions()[0]) + popupMenu.insertMenu(popupMenu.actions()[0], lang_menu) + QtCore.QObject.connect(lang_menu, + QtCore.SIGNAL(u'triggered(QAction*)'), self.setLanguage) # Check if the selected word is misspelled and offer spelling # suggestions if it is. if ENCHANT_AVAILABLE and self.textCursor().hasSelection(): @@ -93,19 +108,30 @@ class SpellTextEdit(QtGui.QPlainTextEdit): spell_menu.addAction(action) # Only add the spelling suggests to the menu if there are # suggestions. - if len(spell_menu.actions()) != 0: - popupMenu.insertSeparator(popupMenu.actions()[0]) + if len(spell_menu.actions()): popupMenu.insertMenu(popupMenu.actions()[0], spell_menu) tagMenu = QtGui.QMenu(translate('OpenLP.SpellTextEdit', 'Formatting Tags')) for html in DisplayTags.get_html_tags(): - action = SpellAction( html[u'desc'], tagMenu) + action = SpellAction(html[u'desc'], tagMenu) action.correct.connect(self.htmlTag) tagMenu.addAction(action) popupMenu.insertSeparator(popupMenu.actions()[0]) popupMenu.insertMenu(popupMenu.actions()[0], tagMenu) popupMenu.exec_(event.globalPos()) + def setLanguage(self, action): + """ + Changes the language for this spelltextedit. + + ``action`` + The action. + """ + self.dictionary = enchant.Dict(action.text()) + self.highlighter.spellingDictionary = self.dictionary + self.highlighter.highlightBlock(self.toPlainText()) + self.highlighter.rehighlight() + def correctWord(self, word): """ Replaces the selected text with word. From 27e9edad517fa75d09c9bafa7b42b296bdc3d1ea Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 14 Apr 2011 16:51:05 +0200 Subject: [PATCH 79/89] fixed wrong parentage --- openlp/core/ui/printserviceform.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openlp/core/ui/printserviceform.py b/openlp/core/ui/printserviceform.py index 01b937d61..0de20d8a9 100644 --- a/openlp/core/ui/printserviceform.py +++ b/openlp/core/ui/printserviceform.py @@ -222,6 +222,7 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog): unicode(datetime.timedelta(seconds=tme)), title) # Add the custom service notes: if self.footerTextEdit.toPlainText(): + div = self._addChildToParent(u'div', parent=html_data.body) self._addChildToParent(u'span', translate('OpenLP.ServiceManager', u'Custom Service Notes:'), div, u'class', u'customNotesTitle') self._addChildToParent( From 83e06b6eb1e08e83b0f7b96c44d5e214575b71ef Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 14 Apr 2011 20:05:00 +0200 Subject: [PATCH 80/89] don't allow to change the up/down shortcuts in the slidecontrollers --- openlp/core/lib/ui.py | 3 +-- openlp/core/ui/slidecontroller.py | 10 ++++------ 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/openlp/core/lib/ui.py b/openlp/core/lib/ui.py index 3365b32a0..d54135937 100644 --- a/openlp/core/lib/ui.py +++ b/openlp/core/lib/ui.py @@ -87,7 +87,6 @@ class UiStrings(object): OpenService = translate('OpenLP.Ui', 'Open Service') Preview = translate('OpenLP.Ui', 'Preview') PreviewPanel = translate('OpenLP.Ui', 'Preview Panel') - PreviewToolbar = translate('OpenLP.Ui', 'Preview Toolbar') PrintServiceOrder = translate('OpenLP.Ui', 'Print Service Order') ReplaceBG = translate('OpenLP.Ui', 'Replace Background') ReplaceLiveBG = translate('OpenLP.Ui', 'Replace Live Background') @@ -427,4 +426,4 @@ def find_and_set_in_combo_box(combo_box, value_to_find): if index == -1: # Not Found. index = 0 - combo_box.setCurrentIndex(index) \ No newline at end of file + combo_box.setCurrentIndex(index) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 4f5ed1ea7..7a26bea19 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -368,10 +368,8 @@ class SlideController(QtGui.QWidget): self.previousItem.setObjectName(u'previousItemPreview') self.nextItem.setObjectName(u'nextItemPreview') action_list = ActionList.get_instance() - action_list.add_category( - UiStrings.PreviewToolbar, CategoryOrder.standardToolbar) - action_list.add_action(self.previousItem, UiStrings.PreviewToolbar) - action_list.add_action(self.nextItem, UiStrings.PreviewToolbar) + action_list.add_action(self.previousItem) + action_list.add_action(self.nextItem) def setLiveHotkeys(self, parent=None): self.previousItem.setObjectName(u'previousItemLive') @@ -379,8 +377,8 @@ class SlideController(QtGui.QWidget): action_list = ActionList.get_instance() action_list.add_category( UiStrings.LiveToolbar, CategoryOrder.standardToolbar) - action_list.add_action(self.previousItem, UiStrings.LiveToolbar) - action_list.add_action(self.nextItem, UiStrings.LiveToolbar) + action_list.add_action(self.previousItem) + action_list.add_action(self.nextItem) self.previousService = shortcut_action(parent, u'previousService', [QtCore.Qt.Key_Left], self.servicePrevious, UiStrings.LiveToolbar) self.previousService.setShortcutContext(QtCore.Qt.WidgetWithChildrenShortcut) From 206cd90639eac949f23198347f482c1e3b718b2d Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Thu, 14 Apr 2011 19:30:53 +0100 Subject: [PATCH 81/89] Finished --- openlp/core/lib/plugin.py | 4 -- openlp/core/lib/pluginmanager.py | 13 ++---- openlp/core/ui/settingsform.py | 55 +++++++++++--------------- openlp/plugins/bibles/lib/mediaitem.py | 3 ++ 4 files changed, 28 insertions(+), 47 deletions(-) diff --git a/openlp/core/lib/plugin.py b/openlp/core/lib/plugin.py index e4359f6b0..a6cc5df63 100644 --- a/openlp/core/lib/plugin.py +++ b/openlp/core/lib/plugin.py @@ -290,8 +290,6 @@ class Plugin(QtCore.QObject): if self.mediaItem: self.mediaItem.initialise() self.mediadock.insert_dock(self.mediaItem, self.icon, self.weight) - if self.settings_tab: - self.settingsForm.insertTab(self.settings_tab, self.weight) def finalise(self): """ @@ -299,8 +297,6 @@ class Plugin(QtCore.QObject): """ if self.mediaItem: self.mediadock.remove_dock(self.mediaItem) - if self.settings_tab: - self.settingsForm.removeTab(self.settings_tab) def usesTheme(self, theme): """ diff --git a/openlp/core/lib/pluginmanager.py b/openlp/core/lib/pluginmanager.py index 6f1222276..0fddc75c4 100644 --- a/openlp/core/lib/pluginmanager.py +++ b/openlp/core/lib/pluginmanager.py @@ -137,7 +137,7 @@ class PluginManager(object): if plugin.status is not PluginStatus.Disabled: plugin.mediaItem = plugin.getMediaManagerItem() - def hook_settings_tabs(self, settingsform=None): + def hook_settings_tabs(self, settings_form=None): """ Loop through all the plugins. If a plugin has a valid settings tab item, add it to the settings tab. @@ -148,15 +148,8 @@ class PluginManager(object): """ for plugin in self.plugins: if plugin.status is not PluginStatus.Disabled: - plugin.settings_tab = plugin.getSettingsTab(settingsform) - visible_title = plugin.getString(StringContent.VisibleName) - if plugin.settings_tab and plugin.isActive(): - log.debug(u'Inserting settings tab item from %s' % - visible_title[u'title']) - settingsform.insertTab(plugin.settings_tab, plugin.weight) - else: - log.debug( - u'No tab settings in %s' % visible_title[u'title']) + plugin.settings_tab = plugin.getSettingsTab(settings_form) + settings_form.plugins = self.plugins def hook_import_menu(self, import_menu): """ diff --git a/openlp/core/ui/settingsform.py b/openlp/core/ui/settingsform.py index 72e1b7fa4..6d1680b53 100644 --- a/openlp/core/ui/settingsform.py +++ b/openlp/core/ui/settingsform.py @@ -30,7 +30,7 @@ import logging from PyQt4 import QtGui, QtCore -from openlp.core.lib import Receiver, build_icon +from openlp.core.lib import Receiver, build_icon, PluginStatus from openlp.core.ui import AdvancedTab, GeneralTab, ThemesTab from settingsdialog import Ui_SettingsDialog @@ -47,53 +47,42 @@ class SettingsForm(QtGui.QDialog, Ui_SettingsDialog): QtGui.QDialog.__init__(self, parent) self.setupUi(self) # General tab - generalTab = GeneralTab(self, screens) - self.insertTab(generalTab, 1) + self.generalTab = GeneralTab(self, screens) # Themes tab - themesTab = ThemesTab(self, mainWindow) - self.insertTab(themesTab, 2) + self.themesTab = ThemesTab(self, mainWindow) # Advanced tab - advancedTab = AdvancedTab(self, ) - self.insertTab(advancedTab, 3) + self.advancedTab = AdvancedTab(self) def exec_(self): # load all the settings - for tabIndex in range(0, self.stackedLayout.count()): - self.stackedLayout.widget(tabIndex).load() + self.settingListWidget.clear() + for tabIndex in range(0, self.stackedLayout.count() + 1): + # take at 0 and the rest shuffell up. + self.stackedLayout.takeAt(0) + self.insertTab(self.generalTab, 0, PluginStatus.Active) + self.insertTab(self.themesTab, 1, PluginStatus.Active) + self.insertTab(self.advancedTab, 2, PluginStatus.Active) + count = 3 + for plugin in self.plugins: + if plugin.settings_tab: + self.insertTab(plugin.settings_tab, count, plugin.status) + count += 1 self.settingListWidget.setCurrentRow(0) return QtGui.QDialog.exec_(self) - def insertTab(self, tab, location): + def insertTab(self, tab, location, is_active): """ Add a tab to the form at a specific location """ log.debug(u'Inserting %s tab' % tab.tabTitle) - # 14 : There are 3 tables currently and locations starts at -10 - match = False - for tabIndex in range(0, self.stackedLayout.count()): - if self.stackedLayout.widget(tabIndex): - if self.stackedLayout.widget(tabIndex).tabTitleVisible == \ - tab.tabTitleVisible: - self.stackedLayout.widget(tabIndex).setHidden(False) - match = True - break - if not match: - pos = self.stackedLayout.addWidget(tab) + pos = self.stackedLayout.addWidget(tab) + if is_active: item_name = QtGui.QListWidgetItem(tab.tabTitleVisible) icon = build_icon(tab.icon_path) item_name.setIcon(icon) - self.settingListWidget.insertItem(14 + location, item_name) - - def removeTab(self, tab): - """ - Remove a tab from the form - """ - log.debug(u'remove %s tab' % tab.tabTitleVisible) - for tabIndex in range(0, self.stackedLayout.count()): - if self.stackedLayout.widget(tabIndex): - if self.stackedLayout.widget(tabIndex).tabTitleVisible == \ - tab.tabTitleVisible: - self.settingListWidget.item(tabIndex).setHidden(True) + self.settingListWidget.insertItem(location, item_name) + else: + self.stackedLayout.takeAt(location) def accept(self): """ diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index b3ffff87c..736d3d82e 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -836,6 +836,9 @@ class BibleMediaItem(MediaManagerItem): return u'{su}%s{/su}' % verse_text def onlayoutStyleComboBoxChanged(self): + self.settings.layout_style = self.quickLayoutComboBox.currentIndex() + self.settings.layoutStyleComboBox.setCurrentIndex( + self.settings.layout_style) QtCore.QSettings().setValue( self.settingsSection + u'/verse layout style', QtCore.QVariant(self.settings.layout_style)) From 4dd70d454ff6c097f0afd002cfcd465c08bfcabe Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Thu, 14 Apr 2011 19:55:41 +0100 Subject: [PATCH 82/89] Fix Postsetup --- openlp/core/ui/settingsform.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/openlp/core/ui/settingsform.py b/openlp/core/ui/settingsform.py index 6d1680b53..949d907b4 100644 --- a/openlp/core/ui/settingsform.py +++ b/openlp/core/ui/settingsform.py @@ -106,5 +106,9 @@ class SettingsForm(QtGui.QDialog, Ui_SettingsDialog): """ Run any post-setup code for the tabs on the form """ - for tabIndex in range(0, self.stackedLayout.count()): - self.stackedLayout.widget(tabIndex).postSetUp() + self.generalTab.postSetUp() + self.themesTab.postSetUp() + self.advancedTab.postSetUp() + for plugin in self.plugins: + if plugin.settings_tab: + plugin.settings_tab.postSetUp() From 77559e021071bef7bae19337ac2edbc7d58d8813 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 14 Apr 2011 23:32:21 +0200 Subject: [PATCH 83/89] started to implement #746243 Fixes: https://launchpad.net/bugs/746243 --- openlp/core/lib/searchedit.py | 14 ++++++++++++++ openlp/plugins/songs/lib/mediaitem.py | 9 +++++++++ 2 files changed, 23 insertions(+) diff --git a/openlp/core/lib/searchedit.py b/openlp/core/lib/searchedit.py index d32961ef9..00e0f3ed3 100644 --- a/openlp/core/lib/searchedit.py +++ b/openlp/core/lib/searchedit.py @@ -110,6 +110,20 @@ class SearchEdit(QtGui.QLineEdit): """ return self._currentSearchType + def setCurrentSearchType(self, identifier): + """ + Set a new current search type. + + ``identifier`` + The search type identifier (int). + """ + menu = self.menuButton.menu() + for action in menu.actions(): + if identifier == action.data().toInt()[0]: + self.menuButton.setDefaultAction(action) + self._currentSearchType = identifier + return True + def setSearchTypes(self, items): """ A list of tuples to be used in the search type menu. The first item in diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index e2882ed29..2ce2478cb 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -156,8 +156,17 @@ class SongMediaItem(MediaManagerItem): (SongSearch.Themes, u':/slides/slide_theme.png', UiStrings.Themes) ]) self.configUpdated() + # FIXME: Saved search type need to be considered when loading the list. + self.searchTextEdit.setCurrentSearchType(QtCore.QSettings().value( + u'%s/last search type' % self.settingsSection, + QtCore.QVariant(SongSearch.Entire)).toInt()[0]) def onSearchTextButtonClick(self): + # Save the current search type to the config. so it can be restored. + QtCore.QSettings().setValue(u'%s/last search type' % + self.settingsSection, + QtCore.QVariant(self.searchTextEdit.currentSearchType())) + # Reload the list considering the new search type. search_keywords = unicode(self.searchTextEdit.displayText()) search_results = [] search_type = self.searchTextEdit.currentSearchType() From 4286f6389dda9888a90b61857e34ea7765c43d81 Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Thu, 14 Apr 2011 22:34:01 +0100 Subject: [PATCH 84/89] Switching from ppt to songs now fine --- openlp/core/lib/htmlbuilder.py | 8 ++++---- openlp/core/ui/slidecontroller.py | 10 ++++++---- openlp/plugins/presentations/lib/messagelistener.py | 5 ----- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/openlp/core/lib/htmlbuilder.py b/openlp/core/lib/htmlbuilder.py index 2ba235265..1f2d2498d 100644 --- a/openlp/core/lib/htmlbuilder.py +++ b/openlp/core/lib/htmlbuilder.py @@ -343,11 +343,11 @@ def build_html(item, screen, alert, islive, background, image=None): webkitvers = webkit_version() # Image generated and poked in if background: - bgimage = u'src="data:image/png;base64,%s"' % background + bgimage_src = u'src="data:image/png;base64,%s"' % background elif item.bg_image_bytes: - bgimage = u'src="data:image/png;base64,%s"' % item.bg_image_bytes + bgimage_src = u'src="data:image/png;base64,%s"' % item.bg_image_bytes else: - bgimage = u'style="display:none;"' + bgimage_src = u'style="display:none;"' if image: image_src = u'src="data:image/png;base64,%s"' % image else: @@ -359,7 +359,7 @@ def build_html(item, screen, alert, islive, background, image=None): build_lyrics_css(item, webkitvers), u'true' if theme and theme.display_slide_transition and islive \ else u'false', - bgimage, image_src, + bgimage_src, image_src, build_lyrics_html(item, webkitvers)) return html diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index b940b1e73..7110ddf02 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -365,7 +365,7 @@ class SlideController(QtGui.QWidget): QtCore.SIGNAL(u'config_screen_changed'), self.screenSizeChanged) def setPreviewHotkeys(self, parent=None): - self.previousItem.setObjectName(u'previousItemPreview') + self.previousItem.setObjectName(u'previousItemPreview') self.nextItem.setObjectName(u'nextItemPreview') action_list = ActionList.get_instance() action_list.add_category( @@ -374,7 +374,7 @@ class SlideController(QtGui.QWidget): action_list.add_action(self.nextItem, UiStrings.PreviewToolbar) def setLiveHotkeys(self, parent=None): - self.previousItem.setObjectName(u'previousItemLive') + self.previousItem.setObjectName(u'previousItemLive') self.nextItem.setObjectName(u'nextItemLive') action_list = ActionList.get_instance() action_list.add_category( @@ -575,6 +575,7 @@ class SlideController(QtGui.QWidget): log.debug(u'processManagerItem live = %s' % self.isLive) self.onStopLoop() old_item = self.serviceItem + self.serviceItem = serviceItem if old_item and self.isLive and old_item.is_capable( ItemCapabilities.ProvidesOwnDisplay): self._resetBlank() @@ -582,7 +583,6 @@ class SlideController(QtGui.QWidget): [serviceItem, self.isLive, self.hideMode(), slideno]) self.slideList = {} width = self.parent.controlSplitter.sizes()[self.split] - self.serviceItem = serviceItem self.previewListWidget.clear() self.previewListWidget.setRowCount(0) self.previewListWidget.setColumnWidth(0, width) @@ -642,7 +642,7 @@ class SlideController(QtGui.QWidget): self.__updatePreviewSelection(slideno) self.enableToolBar(serviceItem) # Pass to display for viewing. - # Postpone image build, we need to do this later to avoid theme + # Postpone image build, we need to do this later to avoid the theme # flashing on the screen if not self.serviceItem.is_image(): self.display.buildHtml(self.serviceItem) @@ -1136,6 +1136,8 @@ class SlideController(QtGui.QWidget): self.onThemeDisplay(True) elif hide_mode == HideMode.Screen: self.onHideDisplay(True) + else: + self.hidePlugin(False) def hideMode(self): """ diff --git a/openlp/plugins/presentations/lib/messagelistener.py b/openlp/plugins/presentations/lib/messagelistener.py index b76fd7d4c..94cd2bfa4 100644 --- a/openlp/plugins/presentations/lib/messagelistener.py +++ b/openlp/plugins/presentations/lib/messagelistener.py @@ -173,12 +173,8 @@ class Controller(object): Based on the handler passed at startup triggers slide show to shut down """ log.debug(u'Live = %s, shutdown' % self.is_live) - if self.is_live: - Receiver.send_message(u'maindisplay_show') self.doc.close_presentation() self.doc = None - #self.doc.slidenumber = 0 - #self.timer.stop() def blank(self, hide_mode): """ @@ -345,7 +341,6 @@ class MessageListener(object): """ is_live = message[1] if is_live: - Receiver.send_message(u'maindisplay_show') self.live_handler.shutdown() else: self.preview_handler.shutdown() From 14a2e8e4c2c332984bafe52a2a63ccfd52cfe914 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 15 Apr 2011 14:55:56 +0200 Subject: [PATCH 85/89] finished work on restoring current search methods --- openlp/core/lib/searchedit.py | 1 + openlp/plugins/bibles/lib/mediaitem.py | 21 ++++++++++++++------- openlp/plugins/songs/lib/mediaitem.py | 5 ++--- openlp/plugins/songs/songsplugin.py | 2 -- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/openlp/core/lib/searchedit.py b/openlp/core/lib/searchedit.py index 00e0f3ed3..94152ef2f 100644 --- a/openlp/core/lib/searchedit.py +++ b/openlp/core/lib/searchedit.py @@ -122,6 +122,7 @@ class SearchEdit(QtGui.QLineEdit): if identifier == action.data().toInt()[0]: self.menuButton.setDefaultAction(action) self._currentSearchType = identifier + self.emit(QtCore.SIGNAL(u'searchTypeChanged(int)'), identifier) return True def setSearchTypes(self, items): diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 118bdfc66..241854985 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -99,12 +99,6 @@ class BibleMediaItem(MediaManagerItem): self.quickSearchEdit = SearchEdit(self.quickTab) self.quickSearchEdit.setObjectName(u'quickSearchEdit') self.quickSearchLabel.setBuddy(self.quickSearchEdit) - self.quickSearchEdit.setSearchTypes([ - (BibleSearch.Reference, u':/bibles/bibles_search_reference.png', - translate('BiblesPlugin.MediaItem', 'Scripture Reference')), - (BibleSearch.Text, u':/bibles/bibles_search_text.png', - translate('BiblesPlugin.MediaItem', 'Text Search')) - ]) self.quickLayout.addRow(self.quickSearchLabel, self.quickSearchEdit) self.quickLayoutLabel = QtGui.QLabel(self.quickTab) self.quickLayoutLabel.setObjectName(u'quickClearLabel') @@ -295,7 +289,15 @@ class BibleMediaItem(MediaManagerItem): self.settingsSection + u'/quick bible', QtCore.QVariant( self.quickVersionComboBox.currentText())).toString() find_and_set_in_combo_box(self.quickVersionComboBox, bible) - self.updateAutoCompleter() + self.quickSearchEdit.setSearchTypes([ + (BibleSearch.Reference, u':/bibles/bibles_search_reference.png', + translate('BiblesPlugin.MediaItem', 'Scripture Reference')), + (BibleSearch.Text, u':/bibles/bibles_search_text.png', + translate('BiblesPlugin.MediaItem', 'Text Search')) + ]) + self.quickSearchEdit.setCurrentSearchType(QtCore.QSettings().value( + u'%s/last search type' % self.settingsSection, + QtCore.QVariant(BibleSearch.Reference)).toInt()[0]) self.configUpdated() log.debug(u'bible manager initialise complete') @@ -386,6 +388,11 @@ class BibleMediaItem(MediaManagerItem): completion depends on the bible. It is only updated when we are doing a reference search, otherwise the auto completion list is removed. """ + # Save the current search type to the configuration. + QtCore.QSettings().setValue(u'%s/last search type' % + self.settingsSection, + QtCore.QVariant(self.quickSearchEdit.currentSearchType())) + # Save the current bible to the configuration. QtCore.QSettings().setValue(self.settingsSection + u'/quick bible', QtCore.QVariant(self.quickVersionComboBox.currentText())) books = [] diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 2ce2478cb..5890fc76d 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -155,14 +155,13 @@ class SongMediaItem(MediaManagerItem): SongStrings.Authors), (SongSearch.Themes, u':/slides/slide_theme.png', UiStrings.Themes) ]) - self.configUpdated() - # FIXME: Saved search type need to be considered when loading the list. self.searchTextEdit.setCurrentSearchType(QtCore.QSettings().value( u'%s/last search type' % self.settingsSection, QtCore.QVariant(SongSearch.Entire)).toInt()[0]) + self.configUpdated() def onSearchTextButtonClick(self): - # Save the current search type to the config. so it can be restored. + # Save the current search type to the configuration. QtCore.QSettings().setValue(u'%s/last search type' % self.settingsSection, QtCore.QVariant(self.searchTextEdit.currentSearchType())) diff --git a/openlp/plugins/songs/songsplugin.py b/openlp/plugins/songs/songsplugin.py index af50f3f94..4fc098949 100644 --- a/openlp/plugins/songs/songsplugin.py +++ b/openlp/plugins/songs/songsplugin.py @@ -70,8 +70,6 @@ class SongsPlugin(Plugin): action_list.add_action(self.SongImportItem, UiStrings.Import) action_list.add_action(self.SongExportItem, UiStrings.Export) action_list.add_action(self.toolsReindexItem, UiStrings.Tools) - self.mediaItem.displayResultsSong( - self.manager.get_all_objects(Song, order_by_ref=Song.search_title)) def addImportMenuItem(self, import_menu): """ From 269c4fa044ef9093793027f0371aed005ab06336 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 15 Apr 2011 18:17:51 +0100 Subject: [PATCH 86/89] Fixups --- openlp/core/lib/plugin.py | 28 ++++++++++++++-------------- openlp/core/ui/advancedtab.py | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/openlp/core/lib/plugin.py b/openlp/core/lib/plugin.py index a6cc5df63..2ec1045bb 100644 --- a/openlp/core/lib/plugin.py +++ b/openlp/core/lib/plugin.py @@ -115,7 +115,7 @@ class Plugin(QtCore.QObject): """ log.info(u'loaded') - def __init__(self, name, pluginHelpers=None, mediaItemClass=None, + def __init__(self, name, plugin_helpers=None, media_item_class=None, settings_tab_class=None, version=None): """ This is the constructor for the plugin object. This provides an easy @@ -132,10 +132,10 @@ class Plugin(QtCore.QObject): ``version`` Defaults to *None*. The version of the plugin. - ``pluginHelpers`` + ``plugin_helpers`` Defaults to *None*. A list of helper objects. - ``mediaItemClass`` + ``media_item_class`` The class name of the plugin's media item. ``settings_tab_class`` @@ -153,20 +153,20 @@ class Plugin(QtCore.QObject): self.version = get_application_version()[u'version'] self.settingsSection = self.name.lower() self.icon = None - self.mediaItemClass = mediaItemClass + self.media_item_class = media_item_class self.settings_tab_class = settings_tab_class self.weight = 0 self.status = PluginStatus.Inactive # Set up logging self.log = logging.getLogger(self.name) - self.previewController = pluginHelpers[u'preview'] - self.liveController = pluginHelpers[u'live'] - self.renderManager = pluginHelpers[u'render'] - self.serviceManager = pluginHelpers[u'service'] - self.settingsForm = pluginHelpers[u'settings form'] - self.mediadock = pluginHelpers[u'toolbox'] - self.pluginManager = pluginHelpers[u'pluginmanager'] - self.formparent = pluginHelpers[u'formparent'] + self.previewController = plugin_helpers[u'preview'] + self.liveController = plugin_helpers[u'live'] + self.renderManager = plugin_helpers[u'render'] + self.serviceManager = plugin_helpers[u'service'] + self.settingsForm = plugin_helpers[u'settings form'] + self.mediadock = plugin_helpers[u'toolbox'] + self.pluginManager = plugin_helpers[u'pluginmanager'] + self.formparent = plugin_helpers[u'formparent'] QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'%s_add_service_item' % self.name), self.processAddServiceEvent) @@ -213,8 +213,8 @@ class Plugin(QtCore.QObject): Construct a MediaManagerItem object with all the buttons and things you need, and return it for integration into openlp.org. """ - if self.mediaItemClass: - return self.mediaItemClass(self, self, self.icon) + if self.media_item_class: + return self.media_item_class(self, self, self.icon) return None def addImportMenuItem(self, importMenu): diff --git a/openlp/core/ui/advancedtab.py b/openlp/core/ui/advancedtab.py index 3d9321fe1..199ebff60 100644 --- a/openlp/core/ui/advancedtab.py +++ b/openlp/core/ui/advancedtab.py @@ -45,7 +45,7 @@ class AdvancedTab(SettingsTab): SettingsTab.__init__(self, parent ,u'Advanced', generalTranslated) self.default_image = u':/graphics/openlp-splash-screen.png' self.default_color = u'#ffffff' - self.icon_path = u':/icon/openlp-logo-16x16.png' + self.icon_path = u':/system/system_settings.png' def setupUi(self): """ From 8090adf1bc4167ede05e137f2c68efd763b05936 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Fri, 15 Apr 2011 23:43:59 +0200 Subject: [PATCH 87/89] Made UiStrings a Singleton, and updated all usage of it. --- openlp.pyw | 4 +- openlp/core/lib/mediamanageritem.py | 12 +- openlp/core/lib/plugin.py | 18 +- openlp/core/lib/serviceitem.py | 6 +- openlp/core/lib/theme.py | 4 +- openlp/core/lib/ui.py | 176 ++++++++++-------- openlp/core/ui/aboutdialog.py | 6 +- openlp/core/ui/advancedtab.py | 6 +- openlp/core/ui/displaytagdialog.py | 6 +- openlp/core/ui/exceptionform.py | 4 +- openlp/core/ui/generaltab.py | 4 +- openlp/core/ui/mainwindow.py | 86 ++++----- openlp/core/ui/plugindialog.py | 6 +- openlp/core/ui/printservicedialog.py | 4 +- openlp/core/ui/printserviceform.py | 6 +- openlp/core/ui/servicemanager.py | 30 +-- openlp/core/ui/slidecontroller.py | 22 +-- openlp/core/ui/starttimedialog.py | 14 +- openlp/core/ui/starttimeform.py | 8 +- openlp/core/ui/themeform.py | 6 +- openlp/core/ui/thememanager.py | 6 +- openlp/core/ui/themestab.py | 4 +- openlp/core/ui/themewizard.py | 16 +- openlp/core/ui/wizard.py | 4 +- openlp/plugins/alerts/alertsplugin.py | 4 +- openlp/plugins/alerts/lib/alertstab.py | 10 +- openlp/plugins/bibles/bibleplugin.py | 10 +- .../plugins/bibles/forms/bibleimportform.py | 24 +-- openlp/plugins/bibles/lib/biblestab.py | 12 +- openlp/plugins/bibles/lib/mediaitem.py | 20 +- .../plugins/custom/forms/editcustomdialog.py | 6 +- openlp/plugins/custom/lib/mediaitem.py | 6 +- openlp/plugins/images/lib/mediaitem.py | 14 +- openlp/plugins/media/lib/mediaitem.py | 14 +- openlp/plugins/presentations/lib/mediaitem.py | 4 +- .../presentations/lib/presentationtab.py | 4 +- openlp/plugins/songs/forms/editsongdialog.py | 12 +- openlp/plugins/songs/forms/editsongform.py | 6 +- openlp/plugins/songs/forms/songexportform.py | 6 +- openlp/plugins/songs/forms/songimportform.py | 52 +++--- .../songs/forms/songmaintenancedialog.py | 20 +- .../songs/forms/songmaintenanceform.py | 4 +- openlp/plugins/songs/lib/mediaitem.py | 12 +- openlp/plugins/songs/songsplugin.py | 16 +- 44 files changed, 366 insertions(+), 348 deletions(-) diff --git a/openlp.pyw b/openlp.pyw index 5c3b8ca77..425d3c874 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -140,7 +140,7 @@ class OpenLP(QtGui.QApplication): self.sharedMemory = QtCore.QSharedMemory('OpenLP') if self.sharedMemory.attach(): status = QtGui.QMessageBox.critical(None, - UiStrings.Error, UiStrings.OpenLPStart, + UiStrings().Error, UiStrings().OpenLPStart, QtGui.QMessageBox.StandardButtons( QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)) if status == QtGui.QMessageBox.No: @@ -250,4 +250,4 @@ if __name__ == u'__main__': """ Instantiate and run the application. """ - main() + main() \ No newline at end of file diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 7671064df..e7d7bc4ec 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -435,7 +435,7 @@ class MediaManagerItem(QtGui.QWidget): item to the preview slide controller. """ if not self.listView.selectedIndexes() and not self.remoteTriggered: - QtGui.QMessageBox.information(self, UiStrings.NISp, + QtGui.QMessageBox.information(self, UiStrings().NISp, translate('OpenLP.MediaManagerItem', 'You must select one or more items to preview.')) else: @@ -453,7 +453,7 @@ class MediaManagerItem(QtGui.QWidget): item to the live slide controller. """ if not self.listView.selectedIndexes(): - QtGui.QMessageBox.information(self, UiStrings.NISp, + QtGui.QMessageBox.information(self, UiStrings().NISp, translate('OpenLP.MediaManagerItem', 'You must select one or more items to send live.')) else: @@ -468,7 +468,7 @@ class MediaManagerItem(QtGui.QWidget): Add a selected item to the current service """ if not self.listView.selectedIndexes() and not self.remoteTriggered: - QtGui.QMessageBox.information(self, UiStrings.NISp, + QtGui.QMessageBox.information(self, UiStrings().NISp, translate('OpenLP.MediaManagerItem', 'You must select one or more items.')) else: @@ -494,14 +494,14 @@ class MediaManagerItem(QtGui.QWidget): Add a selected item to an existing item in the current service. """ if not self.listView.selectedIndexes() and not self.remoteTriggered: - QtGui.QMessageBox.information(self, UiStrings.NISp, + QtGui.QMessageBox.information(self, UiStrings().NISp, translate('OpenLP.MediaManagerItem', 'You must select one or more items.')) else: log.debug(u'%s Add requested', self.plugin.name) serviceItem = self.parent.serviceManager.getServiceItem() if not serviceItem: - QtGui.QMessageBox.information(self, UiStrings.NISs, + QtGui.QMessageBox.information(self, UiStrings().NISs, translate('OpenLP.MediaManagerItem', 'You must select an existing service item to add to.')) elif self.plugin.name.lower() == serviceItem.name.lower(): @@ -554,4 +554,4 @@ class MediaManagerItem(QtGui.QWidget): item_id = remoteItem else: item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0] - return item_id + return item_id \ No newline at end of file diff --git a/openlp/core/lib/plugin.py b/openlp/core/lib/plugin.py index 2ec1045bb..08be86541 100644 --- a/openlp/core/lib/plugin.py +++ b/openlp/core/lib/plugin.py @@ -330,28 +330,28 @@ class Plugin(QtCore.QObject): """ ## Load Action ## self.__setNameTextString(StringContent.Load, - UiStrings.Load, tooltips[u'load']) + UiStrings().Load, tooltips[u'load']) ## Import Action ## self.__setNameTextString(StringContent.Import, - UiStrings.Import, tooltips[u'import']) + UiStrings().Import, tooltips[u'import']) ## New Action ## self.__setNameTextString(StringContent.New, - UiStrings.Add, tooltips[u'new']) + UiStrings().Add, tooltips[u'new']) ## Edit Action ## self.__setNameTextString(StringContent.Edit, - UiStrings.Edit, tooltips[u'edit']) + UiStrings().Edit, tooltips[u'edit']) ## Delete Action ## self.__setNameTextString(StringContent.Delete, - UiStrings.Delete, tooltips[u'delete']) + UiStrings().Delete, tooltips[u'delete']) ## Preview Action ## self.__setNameTextString(StringContent.Preview, - UiStrings.Preview, tooltips[u'preview']) + UiStrings().Preview, tooltips[u'preview']) ## Send Live Action ## self.__setNameTextString(StringContent.Live, - UiStrings.Live, tooltips[u'live']) + UiStrings().Live, tooltips[u'live']) ## Add to Service Action ## self.__setNameTextString(StringContent.Service, - UiStrings.Service, tooltips[u'service']) + UiStrings().Service, tooltips[u'service']) def __setNameTextString(self, name, title, tooltip): """ @@ -359,4 +359,4 @@ class Plugin(QtCore.QObject): use of the singular name of the plugin object so must only be called after this has been set. """ - self.textStrings[name] = {u'title': title, u'tooltip': tooltip} + self.textStrings[name] = {u'title': title, u'tooltip': tooltip} \ No newline at end of file diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index 48a277633..5de25f6aa 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -441,10 +441,10 @@ class ServiceItem(object): start = None end = None if self.start_time != 0: - start = UiStrings.StartTimeCode % \ + start = UiStrings().StartTimeCode % \ unicode(datetime.timedelta(seconds=self.start_time)) if self.media_length != 0: - end = UiStrings.LengthTime % \ + end = UiStrings().LengthTime % \ unicode(datetime.timedelta(seconds=self.media_length)) if not start and not end: return None @@ -453,4 +453,4 @@ class ServiceItem(object): elif not start and end: return end else: - return u'%s : %s' % (start, end) + return u'%s : %s' % (start, end) \ No newline at end of file diff --git a/openlp/core/lib/theme.py b/openlp/core/lib/theme.py index 134df7652..698f0d644 100644 --- a/openlp/core/lib/theme.py +++ b/openlp/core/lib/theme.py @@ -192,7 +192,7 @@ class VerticalType(object): Bottom = 2 Names = [u'top', u'middle', u'bottom'] - TranslatedNames = [UiStrings.Top, UiStrings.Middle, UiStrings.Bottom] + TranslatedNames = [UiStrings().Top, UiStrings().Middle, UiStrings().Bottom] BOOLEAN_LIST = [u'bold', u'italics', u'override', u'outline', u'shadow', @@ -637,4 +637,4 @@ class ThemeXML(object): self.font_footer_shadow_size) self.add_display(self.display_horizontal_align, self.display_vertical_align, - self.display_slide_transition) + self.display_slide_transition) \ No newline at end of file diff --git a/openlp/core/lib/ui.py b/openlp/core/lib/ui.py index bd47ee627..013231b8c 100644 --- a/openlp/core/lib/ui.py +++ b/openlp/core/lib/ui.py @@ -39,78 +39,96 @@ class UiStrings(object): """ Provide standard strings for objects to use. """ - # These strings should need a good reason to be retranslated elsewhere. - # Should some/more/less of these have an & attached? - About = translate('OpenLP.Ui', 'About') - Add = translate('OpenLP.Ui', '&Add') - Advanced = translate('OpenLP.Ui', 'Advanced') - AllFiles = translate('OpenLP.Ui', 'All Files') - Bottom = translate('OpenLP.Ui', 'Bottom') - Browse = translate('OpenLP.Ui', 'Browse...') - Cancel = translate('OpenLP.Ui', 'Cancel') - CCLINumberLabel = translate('OpenLP.Ui', 'CCLI number:') - CreateService = translate('OpenLP.Ui', 'Create a new service.') - Continuous = translate('OpenLP.Ui', 'Continuous') - Default = unicode(translate('OpenLP.Ui', 'Default')) - Delete = translate('OpenLP.Ui', '&Delete') - DisplayStyle = translate('OpenLP.Ui', 'Display style:') - Edit = translate('OpenLP.Ui', '&Edit') - EmptyField = translate('OpenLP.Ui', 'Empty Field') - Error = translate('OpenLP.Ui', 'Error') - Export = translate('OpenLP.Ui', 'Export') - File = translate('OpenLP.Ui', 'File') - FontSizePtUnit = translate('OpenLP.Ui', 'pt', - 'Abbreviated font pointsize unit') - Help = translate('OpenLP.Ui', 'Help') - Hours = translate('OpenLP.Ui', 'h', 'The abbreviated unit for hours') - Image = translate('OpenLP.Ui', 'Image') - Import = translate('OpenLP.Ui', 'Import') - LayoutStyle = translate('OpenLP.Ui', 'Layout style:') - LengthTime = unicode(translate('OpenLP.Ui', 'Length %s')) - Live = translate('OpenLP.Ui', 'Live') - LiveBGError = translate('OpenLP.Ui', 'Live Background Error') - LivePanel = translate('OpenLP.Ui', 'Live Panel') - LiveToolbar = translate('OpenLP.Ui', 'Live Toolbar') - Load = translate('OpenLP.Ui', 'Load') - Minutes = translate('OpenLP.Ui', 'm', 'The abbreviated unit for minutes') - Middle = translate('OpenLP.Ui', 'Middle') - New = translate('OpenLP.Ui', 'New') - NewService = translate('OpenLP.Ui', 'New Service') - NewTheme = translate('OpenLP.Ui', 'New Theme') - NFSs = translate('OpenLP.Ui', 'No File Selected', 'Singular') - NFSp = translate('OpenLP.Ui', 'No Files Selected', 'Plural') - NISs = translate('OpenLP.Ui', 'No Item Selected', 'Singular') - NISp = translate('OpenLP.Ui', 'No Items Selected', 'Plural') - OLPV1 = translate('OpenLP.Ui', 'openlp.org 1.x') - OLPV2 = translate('OpenLP.Ui', 'OpenLP 2.0') - OpenLPStart = translate('OpenLP.Ui', 'OpenLP is already running. Do you ' - 'wish to continue?') - OpenService = translate('OpenLP.Ui', 'Open Service') - Preview = translate('OpenLP.Ui', 'Preview') - PreviewPanel = translate('OpenLP.Ui', 'Preview Panel') - PrintServiceOrder = translate('OpenLP.Ui', 'Print Service Order') - ReplaceBG = translate('OpenLP.Ui', 'Replace Background') - ReplaceLiveBG = translate('OpenLP.Ui', 'Replace Live Background') - ResetBG = translate('OpenLP.Ui', 'Reset Background') - ResetLiveBG = translate('OpenLP.Ui', 'Reset Live Background') - Seconds = translate('OpenLP.Ui', 's', 'The abbreviated unit for seconds') - SaveAndPreview = translate('OpenLP.Ui', 'Save && Preview') - Search = translate('OpenLP.Ui', 'Search') - SelectDelete = translate('OpenLP.Ui', 'You must select an item to delete.') - SelectEdit = translate('OpenLP.Ui', 'You must select an item to edit.') - Settings = translate('OpenLP.Ui', 'Settings') - SaveService = translate('OpenLP.Ui', 'Save Service') - Service = translate('OpenLP.Ui', 'Service') - StartTimeCode = unicode(translate('OpenLP.Ui', 'Start %s')) - Theme = translate('OpenLP.Ui', 'Theme', 'Singular') - Themes = translate('OpenLP.Ui', 'Themes', 'Plural') - Tools = translate('OpenLP.Ui', 'Tools') - Top = translate('OpenLP.Ui', 'Top') - VersePerSlide = translate('OpenLP.Ui', 'Verse Per Slide') - VersePerLine = translate('OpenLP.Ui', 'Verse Per Line') - Version = translate('OpenLP.Ui', 'Version') - View = translate('OpenLP.Ui', 'View') - ViewMode = translate('OpenLP.Ui', 'View Model') + __instance__ = None + + def __new__(cls): + """ + Override the default object creation method to return a single instance. + """ + if not cls.__instance__: + cls.__instance__ = object.__new__(cls) + return cls.__instance__ + + def __init__(self): + """ + These strings should need a good reason to be retranslated elsewhere. + Should some/more/less of these have an & attached? + """ + self.About = translate('OpenLP.Ui', 'About') + self.Add = translate('OpenLP.Ui', '&Add') + self.Advanced = translate('OpenLP.Ui', 'Advanced') + self.AllFiles = translate('OpenLP.Ui', 'All Files') + self.Bottom = translate('OpenLP.Ui', 'Bottom') + self.Browse = translate('OpenLP.Ui', 'Browse...') + self.Cancel = translate('OpenLP.Ui', 'Cancel') + self.CCLINumberLabel = translate('OpenLP.Ui', 'CCLI number:') + self.CreateService = translate('OpenLP.Ui', 'Create a new service.') + self.Continuous = translate('OpenLP.Ui', 'Continuous') + self.Default = unicode(translate('OpenLP.Ui', 'Default')) + self.Delete = translate('OpenLP.Ui', '&Delete') + self.DisplayStyle = translate('OpenLP.Ui', 'Display style:') + self.Edit = translate('OpenLP.Ui', '&Edit') + self.EmptyField = translate('OpenLP.Ui', 'Empty Field') + self.Error = translate('OpenLP.Ui', 'Error') + self.Export = translate('OpenLP.Ui', 'Export') + self.File = translate('OpenLP.Ui', 'File') + self.FontSizePtUnit = translate('OpenLP.Ui', 'pt', + 'Abbreviated font pointsize unit') + self.Help = translate('OpenLP.Ui', 'Help') + self.Hours = translate('OpenLP.Ui', 'h', + 'The abbreviated unit for hours') + self.Image = translate('OpenLP.Ui', 'Image') + self.Import = translate('OpenLP.Ui', 'Import') + self.LayoutStyle = translate('OpenLP.Ui', 'Layout style:') + self.LengthTime = unicode(translate('OpenLP.Ui', 'Length %s')) + self.Live = translate('OpenLP.Ui', 'Live') + self.LiveBGError = translate('OpenLP.Ui', 'Live Background Error') + self.LivePanel = translate('OpenLP.Ui', 'Live Panel') + self.LiveToolbar = translate('OpenLP.Ui', 'Live Toolbar') + self.Load = translate('OpenLP.Ui', 'Load') + self.Minutes = translate('OpenLP.Ui', 'm', + 'The abbreviated unit for minutes') + self.Middle = translate('OpenLP.Ui', 'Middle') + self.New = translate('OpenLP.Ui', 'New') + self.NewService = translate('OpenLP.Ui', 'New Service') + self.NewTheme = translate('OpenLP.Ui', 'New Theme') + self.NFSs = translate('OpenLP.Ui', 'No File Selected', 'Singular') + self.NFSp = translate('OpenLP.Ui', 'No Files Selected', 'Plural') + self.NISs = translate('OpenLP.Ui', 'No Item Selected', 'Singular') + self.NISp = translate('OpenLP.Ui', 'No Items Selected', 'Plural') + self.OLPV1 = translate('OpenLP.Ui', 'openlp.org 1.x') + self.OLPV2 = translate('OpenLP.Ui', 'OpenLP 2.0') + self.OpenLPStart = translate('OpenLP.Ui', 'OpenLP is already running. ' + 'Do you wish to continue?') + self.OpenService = translate('OpenLP.Ui', 'Open Service') + self.Preview = translate('OpenLP.Ui', 'Preview') + self.PreviewPanel = translate('OpenLP.Ui', 'Preview Panel') + self.PrintServiceOrder = translate('OpenLP.Ui', 'Print Service Order') + self.ReplaceBG = translate('OpenLP.Ui', 'Replace Background') + self.ReplaceLiveBG = translate('OpenLP.Ui', 'Replace Live Background') + self.ResetBG = translate('OpenLP.Ui', 'Reset Background') + self.ResetLiveBG = translate('OpenLP.Ui', 'Reset Live Background') + self.Seconds = translate('OpenLP.Ui', 's', + 'The abbreviated unit for seconds') + self.SaveAndPreview = translate('OpenLP.Ui', 'Save && Preview') + self.Search = translate('OpenLP.Ui', 'Search') + self.SelectDelete = translate('OpenLP.Ui', 'You must select an item ' + 'to delete.') + self.SelectEdit = translate('OpenLP.Ui', 'You must select an item to ' + 'edit.') + self.Settings = translate('OpenLP.Ui', 'Settings') + self.SaveService = translate('OpenLP.Ui', 'Save Service') + self.Service = translate('OpenLP.Ui', 'Service') + self.StartTimeCode = unicode(translate('OpenLP.Ui', 'Start %s')) + self.Theme = translate('OpenLP.Ui', 'Theme', 'Singular') + self.Themes = translate('OpenLP.Ui', 'Themes', 'Plural') + self.Tools = translate('OpenLP.Ui', 'Tools') + self.Top = translate('OpenLP.Ui', 'Top') + self.VersePerSlide = translate('OpenLP.Ui', 'Verse Per Slide') + self.VersePerLine = translate('OpenLP.Ui', 'Verse Per Line') + self.Version = translate('OpenLP.Ui', 'Version') + self.View = translate('OpenLP.Ui', 'View') + self.ViewMode = translate('OpenLP.Ui', 'View Model') def add_welcome_page(parent, image): """ @@ -184,11 +202,11 @@ def critical_error_message_box(title=None, message=None, parent=None, Should this message box question the user. """ if question: - return QtGui.QMessageBox.critical(parent, UiStrings.Error, message, + return QtGui.QMessageBox.critical(parent, UiStrings().Error, message, QtGui.QMessageBox.StandardButtons( QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)) data = {u'message': message} - data[u'title'] = title if title else UiStrings.Error + data[u'title'] = title if title else UiStrings().Error return Receiver.send_message(u'openlp_error_message', data) def media_item_combo_box(parent, name): @@ -218,7 +236,7 @@ def create_delete_push_button(parent, icon=None): delete_button.setObjectName(u'deleteButton') delete_icon = icon if icon else u':/general/general_delete.png' delete_button.setIcon(build_icon(delete_icon)) - delete_button.setText(UiStrings.Delete) + delete_button.setText(UiStrings().Delete) delete_button.setToolTip( translate('OpenLP.Ui', 'Delete the selected item.')) QtCore.QObject.connect(delete_button, @@ -406,9 +424,9 @@ def create_valign_combo(form, parent, layout): verticalLabel.setText(translate('OpenLP.Ui', '&Vertical Align:')) form.verticalComboBox = QtGui.QComboBox(parent) form.verticalComboBox.setObjectName(u'VerticalComboBox') - form.verticalComboBox.addItem(UiStrings.Top) - form.verticalComboBox.addItem(UiStrings.Middle) - form.verticalComboBox.addItem(UiStrings.Bottom) + form.verticalComboBox.addItem(UiStrings().Top) + form.verticalComboBox.addItem(UiStrings().Middle) + form.verticalComboBox.addItem(UiStrings().Bottom) verticalLabel.setBuddy(form.verticalComboBox) layout.addRow(verticalLabel, form.verticalComboBox) @@ -427,4 +445,4 @@ def find_and_set_in_combo_box(combo_box, value_to_find): if index == -1: # Not Found. index = 0 - combo_box.setCurrentIndex(index) + combo_box.setCurrentIndex(index) \ No newline at end of file diff --git a/openlp/core/ui/aboutdialog.py b/openlp/core/ui/aboutdialog.py index 719cb02c2..d4ea463ea 100644 --- a/openlp/core/ui/aboutdialog.py +++ b/openlp/core/ui/aboutdialog.py @@ -87,7 +87,7 @@ class Ui_AboutDialog(object): QtCore.QMetaObject.connectSlotsByName(aboutDialog) def retranslateUi(self, aboutDialog): - aboutDialog.setWindowTitle(u'%s OpenLP' % UiStrings.About) + aboutDialog.setWindowTitle(u'%s OpenLP' % UiStrings().About) self.aboutTextEdit.setPlainText(translate('OpenLP.AboutForm', 'OpenLP - Open Source Lyrics ' 'Projection\n' @@ -105,7 +105,7 @@ class Ui_AboutDialog(object): 'consider contributing by using the button below.' )) self.aboutNotebook.setTabText( - self.aboutNotebook.indexOf(self.aboutTab), UiStrings.About) + self.aboutNotebook.indexOf(self.aboutTab), UiStrings().About) lead = u'Raoul "superfly" Snyman' developers = [u'Tim "TRB143" Bentley', u'Jonathan "gushie" Corwin', u'Michael "cocooncrash" Gorven', @@ -615,4 +615,4 @@ class Ui_AboutDialog(object): self.aboutNotebook.indexOf(self.licenseTab), translate('OpenLP.AboutForm', 'License')) self.contributeButton.setText(translate('OpenLP.AboutForm', - 'Contribute')) + 'Contribute')) \ No newline at end of file diff --git a/openlp/core/ui/advancedtab.py b/openlp/core/ui/advancedtab.py index 199ebff60..94bcb0801 100644 --- a/openlp/core/ui/advancedtab.py +++ b/openlp/core/ui/advancedtab.py @@ -127,7 +127,7 @@ class AdvancedTab(SettingsTab): """ Setup the interface translation strings. """ - self.tabTitleVisible = UiStrings.Advanced + self.tabTitleVisible = UiStrings().Advanced self.uiGroupBox.setTitle(translate('OpenLP.AdvancedTab', 'UI Settings')) self.recentLabel.setText( translate('OpenLP.AdvancedTab', @@ -226,10 +226,10 @@ class AdvancedTab(SettingsTab): def onDefaultBrowseButtonPressed(self): file_filters = u'%s;;%s (*.*) (*)' % (get_images_filter(), - UiStrings.AllFiles) + UiStrings().AllFiles) filename = QtGui.QFileDialog.getOpenFileName(self, translate('OpenLP.AdvancedTab', 'Open File'), '', file_filters) if filename: self.defaultFileEdit.setText(filename) - self.defaultFileEdit.setFocus() + self.defaultFileEdit.setFocus() \ No newline at end of file diff --git a/openlp/core/ui/displaytagdialog.py b/openlp/core/ui/displaytagdialog.py index 848818e88..8e71a60ff 100644 --- a/openlp/core/ui/displaytagdialog.py +++ b/openlp/core/ui/displaytagdialog.py @@ -136,10 +136,10 @@ class Ui_DisplayTagDialog(object): translate('OpenLP.DisplayTagDialog', 'Start tag')) self.endTagLabel.setText( translate('OpenLP.DisplayTagDialog', 'End tag')) - self.deletePushButton.setText(UiStrings.Delete) + self.deletePushButton.setText(UiStrings().Delete) self.defaultPushButton.setText( translate('OpenLP.DisplayTagDialog', 'Default')) - self.newPushButton.setText(UiStrings.New) + self.newPushButton.setText(UiStrings().New) self.tagTableWidget.horizontalHeaderItem(0).setText( translate('OpenLP.DisplayTagDialog', 'Description')) self.tagTableWidget.horizontalHeaderItem(1).setText( @@ -151,4 +151,4 @@ class Ui_DisplayTagDialog(object): self.tagTableWidget.setColumnWidth(0, 120) self.tagTableWidget.setColumnWidth(1, 40) self.tagTableWidget.setColumnWidth(2, 240) - self.tagTableWidget.setColumnWidth(3, 240) + self.tagTableWidget.setColumnWidth(3, 240) \ No newline at end of file diff --git a/openlp/core/ui/exceptionform.py b/openlp/core/ui/exceptionform.py index 0ae9497c9..622d60f79 100644 --- a/openlp/core/ui/exceptionform.py +++ b/openlp/core/ui/exceptionform.py @@ -178,11 +178,11 @@ class ExceptionForm(QtGui.QDialog, Ui_ExceptionDialog): self,translate('ImagePlugin.ExceptionDialog', 'Select Attachment'), SettingsManager.get_last_dir(u'exceptions'), - u'%s (*.*) (*)' % UiStrings.AllFiles) + u'%s (*.*) (*)' % UiStrings().AllFiles) log.info(u'New files(s) %s', unicode(files)) if files: self.fileAttachment = unicode(files) def __buttonState(self, state): self.saveReportButton.setEnabled(state) - self.sendReportButton.setEnabled(state) + self.sendReportButton.setEnabled(state) \ No newline at end of file diff --git a/openlp/core/ui/generaltab.py b/openlp/core/ui/generaltab.py index cfde7810c..7dac2fe9d 100644 --- a/openlp/core/ui/generaltab.py +++ b/openlp/core/ui/generaltab.py @@ -238,7 +238,7 @@ class GeneralTab(SettingsTab): self.timeoutSpinBox.setSuffix(translate('OpenLP.GeneralTab', ' sec')) self.ccliGroupBox.setTitle( translate('OpenLP.GeneralTab', 'CCLI Details')) - self.numberLabel.setText(UiStrings.CCLINumberLabel) + self.numberLabel.setText(UiStrings().CCLINumberLabel) self.usernameLabel.setText( translate('OpenLP.GeneralTab', 'SongSelect username:')) self.passwordLabel.setText( @@ -394,4 +394,4 @@ class GeneralTab(SettingsTab): """ Called when the width, height, x position or y position has changed. """ - self.overrideChanged = True + self.overrideChanged = True \ No newline at end of file diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 2038e1972..d2fbaef9e 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -163,82 +163,82 @@ class Ui_MainWindow(object): self.themeManagerDock) # Create the menu items action_list = ActionList.get_instance() - action_list.add_category(UiStrings.File, CategoryOrder.standardMenu) + action_list.add_category(UiStrings().File, CategoryOrder.standardMenu) self.FileNewItem = shortcut_action(mainWindow, u'FileNewItem', [QtGui.QKeySequence(u'Ctrl+N')], self.ServiceManagerContents.onNewServiceClicked, - u':/general/general_new.png', category=UiStrings.File) + u':/general/general_new.png', category=UiStrings().File) self.FileOpenItem = shortcut_action(mainWindow, u'FileOpenItem', [QtGui.QKeySequence(u'Ctrl+O')], self.ServiceManagerContents.onLoadServiceClicked, - u':/general/general_open.png', category=UiStrings.File) + u':/general/general_open.png', category=UiStrings().File) self.FileSaveItem = shortcut_action(mainWindow, u'FileSaveItem', [QtGui.QKeySequence(u'Ctrl+S')], self.ServiceManagerContents.saveFile, - u':/general/general_save.png', category=UiStrings.File) + u':/general/general_save.png', category=UiStrings().File) self.FileSaveAsItem = shortcut_action(mainWindow, u'FileSaveAsItem', [QtGui.QKeySequence(u'Ctrl+Shift+S')], - self.ServiceManagerContents.saveFileAs, category=UiStrings.File) + self.ServiceManagerContents.saveFileAs, category=UiStrings().File) self.printServiceOrderItem = shortcut_action(mainWindow, u'printServiceItem', [QtGui.QKeySequence(u'Ctrl+P')], self.ServiceManagerContents.printServiceOrder, - category=UiStrings.File) + category=UiStrings().File) self.FileExitItem = shortcut_action(mainWindow, u'FileExitItem', [QtGui.QKeySequence(u'Alt+F4')], mainWindow.close, - u':/system/system_exit.png', category=UiStrings.File) - action_list.add_category(UiStrings.Import, CategoryOrder.standardMenu) + u':/system/system_exit.png', category=UiStrings().File) + action_list.add_category(UiStrings().Import, CategoryOrder.standardMenu) self.ImportThemeItem = base_action( - mainWindow, u'ImportThemeItem', UiStrings.Import) + mainWindow, u'ImportThemeItem', UiStrings().Import) self.ImportLanguageItem = base_action( - mainWindow, u'ImportLanguageItem')#, UiStrings.Import) - action_list.add_category(UiStrings.Export, CategoryOrder.standardMenu) + mainWindow, u'ImportLanguageItem')#, UiStrings().Import) + action_list.add_category(UiStrings().Export, CategoryOrder.standardMenu) self.ExportThemeItem = base_action( - mainWindow, u'ExportThemeItem', UiStrings.Export) + mainWindow, u'ExportThemeItem', UiStrings().Export) self.ExportLanguageItem = base_action( - mainWindow, u'ExportLanguageItem')#, UiStrings.Export) - action_list.add_category(UiStrings.View, CategoryOrder.standardMenu) + mainWindow, u'ExportLanguageItem')#, UiStrings().Export) + action_list.add_category(UiStrings().View, CategoryOrder.standardMenu) self.ViewMediaManagerItem = shortcut_action(mainWindow, u'ViewMediaManagerItem', [QtGui.QKeySequence(u'F8')], self.toggleMediaManager, u':/system/system_mediamanager.png', - self.mediaManagerDock.isVisible(), UiStrings.View) + self.mediaManagerDock.isVisible(), UiStrings().View) self.ViewThemeManagerItem = shortcut_action(mainWindow, u'ViewThemeManagerItem', [QtGui.QKeySequence(u'F10')], self.toggleThemeManager, u':/system/system_thememanager.png', - self.themeManagerDock.isVisible(), UiStrings.View) + self.themeManagerDock.isVisible(), UiStrings().View) self.ViewServiceManagerItem = shortcut_action(mainWindow, u'ViewServiceManagerItem', [QtGui.QKeySequence(u'F9')], self.toggleServiceManager, u':/system/system_servicemanager.png', - self.serviceManagerDock.isVisible(), UiStrings.View) + self.serviceManagerDock.isVisible(), UiStrings().View) self.ViewPreviewPanel = shortcut_action(mainWindow, u'ViewPreviewPanel', [QtGui.QKeySequence(u'F11')], self.setPreviewPanelVisibility, checked=previewVisible, - category=UiStrings.View) + category=UiStrings().View) self.ViewLivePanel = shortcut_action(mainWindow, u'ViewLivePanel', [QtGui.QKeySequence(u'F12')], self.setLivePanelVisibility, - checked=liveVisible, category=UiStrings.View) - action_list.add_category(UiStrings.ViewMode, CategoryOrder.standardMenu) + checked=liveVisible, category=UiStrings().View) + action_list.add_category(UiStrings().ViewMode, CategoryOrder.standardMenu) self.ModeDefaultItem = checkable_action( - mainWindow, u'ModeDefaultItem', category=UiStrings.ViewMode) + mainWindow, u'ModeDefaultItem', category=UiStrings().ViewMode) self.ModeSetupItem = checkable_action( - mainWindow, u'ModeLiveItem', category=UiStrings.ViewMode) + mainWindow, u'ModeLiveItem', category=UiStrings().ViewMode) self.ModeLiveItem = checkable_action( - mainWindow, u'ModeLiveItem', True, UiStrings.ViewMode) + mainWindow, u'ModeLiveItem', True, UiStrings().ViewMode) self.ModeGroup = QtGui.QActionGroup(mainWindow) self.ModeGroup.addAction(self.ModeDefaultItem) self.ModeGroup.addAction(self.ModeSetupItem) self.ModeGroup.addAction(self.ModeLiveItem) self.ModeDefaultItem.setChecked(True) - action_list.add_category(UiStrings.Tools, CategoryOrder.standardMenu) + action_list.add_category(UiStrings().Tools, CategoryOrder.standardMenu) self.ToolsAddToolItem = icon_action(mainWindow, u'ToolsAddToolItem', - u':/tools/tools_add.png', category=UiStrings.Tools) + u':/tools/tools_add.png', category=UiStrings().Tools) self.ToolsOpenDataFolder = icon_action(mainWindow, u'ToolsOpenDataFolder', u':/general/general_open.png', - category=UiStrings.Tools) - action_list.add_category(UiStrings.Settings, CategoryOrder.standardMenu) + category=UiStrings().Tools) + action_list.add_category(UiStrings().Settings, CategoryOrder.standardMenu) self.settingsPluginListItem = shortcut_action(mainWindow, u'settingsPluginListItem', [QtGui.QKeySequence(u'Alt+F7')], self.onPluginItemClicked, u':/system/settings_plugin_list.png', - category=UiStrings.Settings) + category=UiStrings().Settings) # i18n Language Items self.AutoLanguageItem = checkable_action(mainWindow, u'AutoLanguageItem', LanguageManager.auto_language) @@ -255,25 +255,25 @@ class Ui_MainWindow(object): self.SettingsShortcutsItem = icon_action(mainWindow, u'SettingsShortcutsItem', u':/system/system_configure_shortcuts.png', - category=UiStrings.Settings) + category=UiStrings().Settings) self.DisplayTagItem = icon_action(mainWindow, u'DisplayTagItem', u':/system/tag_editor.png', - category=UiStrings.Settings) + category=UiStrings().Settings) self.SettingsConfigureItem = icon_action(mainWindow, u'SettingsConfigureItem', u':/system/system_settings.png', - category=UiStrings.Settings) - action_list.add_category(UiStrings.Help, CategoryOrder.standardMenu) + category=UiStrings().Settings) + action_list.add_category(UiStrings().Help, CategoryOrder.standardMenu) self.HelpDocumentationItem = icon_action(mainWindow, u'HelpDocumentationItem', u':/system/system_help_contents.png', - category=None)#UiStrings.Help) + category=None)#UiStrings().Help) self.HelpDocumentationItem.setEnabled(False) self.HelpAboutItem = shortcut_action(mainWindow, u'HelpAboutItem', [QtGui.QKeySequence(u'Ctrl+F1')], self.onHelpAboutItemClicked, - u':/system/system_about.png', category=UiStrings.Help) + u':/system/system_about.png', category=UiStrings().Help) self.HelpOnlineHelpItem = base_action( - mainWindow, u'HelpOnlineHelpItem', category=UiStrings.Help) + mainWindow, u'HelpOnlineHelpItem', category=UiStrings().Help) self.helpWebSiteItem = base_action( - mainWindow, u'helpWebSiteItem', category=UiStrings.Help) + mainWindow, u'helpWebSiteItem', category=UiStrings().Help) add_actions(self.FileImportMenu, (self.ImportThemeItem, self.ImportLanguageItem)) add_actions(self.FileExportMenu, @@ -320,7 +320,7 @@ class Ui_MainWindow(object): """ Set up the translation system """ - mainWindow.mainTitle = UiStrings.OLPV2 + mainWindow.mainTitle = UiStrings().OLPV2 mainWindow.setWindowTitle(mainWindow.mainTitle) self.FileMenu.setTitle(translate('OpenLP.MainWindow', '&File')) self.FileImportMenu.setTitle(translate('OpenLP.MainWindow', '&Import')) @@ -339,14 +339,14 @@ class Ui_MainWindow(object): self.themeManagerDock.setWindowTitle( translate('OpenLP.MainWindow', 'Theme Manager')) self.FileNewItem.setText(translate('OpenLP.MainWindow', '&New')) - self.FileNewItem.setToolTip(UiStrings.NewService) - self.FileNewItem.setStatusTip(UiStrings.CreateService) + self.FileNewItem.setToolTip(UiStrings().NewService) + self.FileNewItem.setStatusTip(UiStrings().CreateService) self.FileOpenItem.setText(translate('OpenLP.MainWindow', '&Open')) - self.FileOpenItem.setToolTip(UiStrings.OpenService) + self.FileOpenItem.setToolTip(UiStrings().OpenService) self.FileOpenItem.setStatusTip( translate('OpenLP.MainWindow', 'Open an existing service.')) self.FileSaveItem.setText(translate('OpenLP.MainWindow', '&Save')) - self.FileSaveItem.setToolTip(UiStrings.SaveService) + self.FileSaveItem.setToolTip(UiStrings().SaveService) self.FileSaveItem.setStatusTip( translate('OpenLP.MainWindow', 'Save the current service to disk.')) self.FileSaveAsItem.setText( @@ -355,7 +355,7 @@ class Ui_MainWindow(object): translate('OpenLP.MainWindow', 'Save Service As')) self.FileSaveAsItem.setStatusTip(translate('OpenLP.MainWindow', 'Save the current service under a new name.')) - self.printServiceOrderItem.setText(UiStrings.PrintServiceOrder) + self.printServiceOrderItem.setText(UiStrings().PrintServiceOrder) self.printServiceOrderItem.setStatusTip(translate('OpenLP.MainWindow', 'Print the current Service Order.')) self.FileExitItem.setText( @@ -1011,4 +1011,4 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): self.recentFiles.insert(0, QtCore.QString(filename)) while self.recentFiles.count() > maxRecentFiles: # Don't care what API says takeLast works, removeLast doesn't! - self.recentFiles.takeLast() + self.recentFiles.takeLast() \ No newline at end of file diff --git a/openlp/core/ui/plugindialog.py b/openlp/core/ui/plugindialog.py index 0ead739a5..84fb845c6 100644 --- a/openlp/core/ui/plugindialog.py +++ b/openlp/core/ui/plugindialog.py @@ -78,11 +78,11 @@ class Ui_PluginViewDialog(object): translate('OpenLP.PluginForm', 'Plugin List')) self.pluginInfoGroupBox.setTitle( translate('OpenLP.PluginForm', 'Plugin Details')) - self.versionLabel.setText(u'%s:' % UiStrings.Version) - self.aboutLabel.setText(u'%s:' % UiStrings.About) + self.versionLabel.setText(u'%s:' % UiStrings().Version) + self.aboutLabel.setText(u'%s:' % UiStrings().About) self.statusLabel.setText( translate('OpenLP.PluginForm', 'Status:')) self.statusComboBox.setItemText(0, translate('OpenLP.PluginForm', 'Active')) self.statusComboBox.setItemText(1, - translate('OpenLP.PluginForm', 'Inactive')) + translate('OpenLP.PluginForm', 'Inactive')) \ No newline at end of file diff --git a/openlp/core/ui/printservicedialog.py b/openlp/core/ui/printservicedialog.py index 9593e9ec4..889bc4f7d 100644 --- a/openlp/core/ui/printservicedialog.py +++ b/openlp/core/ui/printservicedialog.py @@ -148,7 +148,7 @@ class Ui_PrintServiceDialog(object): QtCore.SIGNAL(u'toggled(bool)'), self.toggleOptions) def retranslateUi(self, printServiceDialog): - printServiceDialog.setWindowTitle(UiStrings.PrintServiceOrder) + printServiceDialog.setWindowTitle(UiStrings().PrintServiceOrder) self.slideTextCheckBox.setText(translate('OpenLP.PrintServiceForm', 'Include slide text if available')) self.pageBreakAfterText.setText(translate('OpenLP.PrintServiceForm', @@ -164,4 +164,4 @@ class Ui_PrintServiceDialog(object): self.zoomComboBox.addItem(ZoomSize.Sizes[ZoomSize.OneHundred]) self.zoomComboBox.addItem(ZoomSize.Sizes[ZoomSize.SeventyFive]) self.zoomComboBox.addItem(ZoomSize.Sizes[ZoomSize.Fifty]) - self.zoomComboBox.addItem(ZoomSize.Sizes[ZoomSize.TwentyFive]) + self.zoomComboBox.addItem(ZoomSize.Sizes[ZoomSize.TwentyFive]) \ No newline at end of file diff --git a/openlp/core/ui/printserviceform.py b/openlp/core/ui/printserviceform.py index 0de20d8a9..42b773198 100644 --- a/openlp/core/ui/printserviceform.py +++ b/openlp/core/ui/printserviceform.py @@ -354,9 +354,9 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog): Called when html copy check box is selected. """ if value == QtCore.Qt.Checked: - self.copyTextButton.setText(UiStrings.CopyToHtml) + self.copyTextButton.setText(UiStrings().CopyToHtml) else: - self.copyTextButton.setText(UiStrings.CopyToText) + self.copyTextButton.setText(UiStrings().CopyToText) def onSlideTextCheckBoxChanged(self, state): """ @@ -380,4 +380,4 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog): QtCore.QVariant(self.metaDataCheckBox.isChecked())) settings.setValue(u'print notes', QtCore.QVariant(self.notesCheckBox.isChecked())) - settings.endGroup() + settings.endGroup() \ No newline at end of file diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index ba9ca718a..d682f5b52 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -111,18 +111,18 @@ class ServiceManager(QtGui.QWidget): # Create the top toolbar self.toolbar = OpenLPToolbar(self) self.toolbar.addToolbarButton( - UiStrings.NewService, u':/general/general_new.png', - UiStrings.CreateService, self.onNewServiceClicked) + UiStrings().NewService, u':/general/general_new.png', + UiStrings().CreateService, self.onNewServiceClicked) self.toolbar.addToolbarButton( - UiStrings.OpenService, u':/general/general_open.png', + UiStrings().OpenService, u':/general/general_open.png', translate('OpenLP.ServiceManager', 'Load an existing service'), self.onLoadServiceClicked) self.toolbar.addToolbarButton( - UiStrings.SaveService, u':/general/general_save.png', + UiStrings().SaveService, u':/general/general_save.png', translate('OpenLP.ServiceManager', 'Save this service'), self.saveFile) self.toolbar.addSeparator() - self.themeLabel = QtGui.QLabel(u'%s:' % UiStrings.Theme, self) + self.themeLabel = QtGui.QLabel(u'%s:' % UiStrings().Theme, self) self.themeLabel.setMargin(3) self.themeLabel.setObjectName(u'themeLabel') self.toolbar.addToolbarWidget(u'ThemeLabel', self.themeLabel) @@ -169,9 +169,9 @@ class ServiceManager(QtGui.QWidget): self.onServiceTop, shortcuts=[QtCore.Qt.Key_Home]) self.serviceManagerList.moveTop.setObjectName(u'moveTop') action_list = ActionList.get_instance() - action_list.add_category(UiStrings.Service, CategoryOrder.standardToolbar) + action_list.add_category(UiStrings().Service, CategoryOrder.standardToolbar) action_list.add_action( - self.serviceManagerList.moveTop, UiStrings.Service) + self.serviceManagerList.moveTop, UiStrings().Service) self.serviceManagerList.moveUp = self.orderToolbar.addToolbarButton( translate('OpenLP.ServiceManager', 'Move &up'), u':/services/service_up.png', @@ -179,7 +179,7 @@ class ServiceManager(QtGui.QWidget): 'Move item up one position in the service.'), self.onServiceUp, shortcuts=[QtCore.Qt.Key_PageUp]) self.serviceManagerList.moveUp.setObjectName(u'moveUp') - action_list.add_action(self.serviceManagerList.moveUp, UiStrings.Service) + action_list.add_action(self.serviceManagerList.moveUp, UiStrings().Service) self.serviceManagerList.moveDown = self.orderToolbar.addToolbarButton( translate('OpenLP.ServiceManager', 'Move &down'), u':/services/service_down.png', @@ -188,7 +188,7 @@ class ServiceManager(QtGui.QWidget): self.onServiceDown, shortcuts=[QtCore.Qt.Key_PageDown]) self.serviceManagerList.moveDown.setObjectName(u'moveDown') action_list.add_action( - self.serviceManagerList.moveDown, UiStrings.Service) + self.serviceManagerList.moveDown, UiStrings().Service) self.serviceManagerList.moveBottom = self.orderToolbar.addToolbarButton( translate('OpenLP.ServiceManager', 'Move to &bottom'), u':/services/service_bottom.png', @@ -197,7 +197,7 @@ class ServiceManager(QtGui.QWidget): self.onServiceEnd, shortcuts=[QtCore.Qt.Key_End]) self.serviceManagerList.moveBottom.setObjectName(u'moveBottom') action_list.add_action( - self.serviceManagerList.moveBottom, UiStrings.Service) + self.serviceManagerList.moveBottom, UiStrings().Service) self.serviceManagerList.down = self.orderToolbar.addToolbarButton( translate('OpenLP.ServiceManager', 'Move &down'), None, @@ -231,7 +231,7 @@ class ServiceManager(QtGui.QWidget): 'Expand all the service items.'), self.onExpandAll, shortcuts=[QtCore.Qt.Key_Plus]) self.serviceManagerList.expand.setObjectName(u'expand') - action_list.add_action(self.serviceManagerList.expand, UiStrings.Service) + action_list.add_action(self.serviceManagerList.expand, UiStrings().Service) self.serviceManagerList.collapse = self.orderToolbar.addToolbarButton( translate('OpenLP.ServiceManager', '&Collapse all'), u':/services/service_collapse_all.png', @@ -240,7 +240,7 @@ class ServiceManager(QtGui.QWidget): self.onCollapseAll, shortcuts=[QtCore.Qt.Key_Minus]) self.serviceManagerList.collapse.setObjectName(u'collapse') action_list.add_action( - self.serviceManagerList.collapse, UiStrings.Service) + self.serviceManagerList.collapse, UiStrings().Service) self.orderToolbar.addSeparator() self.serviceManagerList.makeLive = self.orderToolbar.addToolbarButton( translate('OpenLP.ServiceManager', 'Go Live'), @@ -250,7 +250,7 @@ class ServiceManager(QtGui.QWidget): shortcuts=[QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return]) self.serviceManagerList.makeLive.setObjectName(u'orderToolbar') action_list.add_action( - self.serviceManagerList.makeLive, UiStrings.Service) + self.serviceManagerList.makeLive, UiStrings().Service) self.layout.addWidget(self.orderToolbar) # Connect up our signals and slots QtCore.QObject.connect(self.themeComboBox, @@ -525,7 +525,7 @@ class ServiceManager(QtGui.QWidget): save the file. """ fileName = unicode(QtGui.QFileDialog.getSaveFileName(self.mainwindow, - UiStrings.SaveService, + UiStrings().SaveService, SettingsManager.get_last_dir( self.mainwindow.serviceSettingsSection), translate('OpenLP.ServiceManager', 'OpenLP Service Files (*.osz)'))) @@ -1311,4 +1311,4 @@ class ServiceManager(QtGui.QWidget): Print a Service Order Sheet. """ settingDialog = PrintServiceForm(self.mainwindow, self) - settingDialog.exec_() + settingDialog.exec_() \ No newline at end of file diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 2ae39c5e7..5f2c63c23 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -88,11 +88,11 @@ class SlideController(QtGui.QWidget): # Type label for the top of the slide controller self.typeLabel = QtGui.QLabel(self.panel) if self.isLive: - self.typeLabel.setText(UiStrings.Live) + self.typeLabel.setText(UiStrings().Live) self.split = 1 self.typePrefix = u'live' else: - self.typeLabel.setText(UiStrings.Preview) + self.typeLabel.setText(UiStrings().Preview) self.split = 0 self.typePrefix = u'preview' self.typeLabel.setStyleSheet(u'font-weight: bold; font-size: 12pt;') @@ -161,18 +161,18 @@ class SlideController(QtGui.QWidget): translate('OpenLP.SlideController', 'Hide'), self.toolbar)) self.blankScreen = shortcut_action(self.hideMenu, u'blankScreen', [QtCore.Qt.Key_Period], self.onBlankDisplay, - u':/slides/slide_blank.png', False, UiStrings.LiveToolbar) + u':/slides/slide_blank.png', False, UiStrings().LiveToolbar) self.blankScreen.setText( translate('OpenLP.SlideController', 'Blank Screen')) self.themeScreen = shortcut_action(self.hideMenu, u'themeScreen', [QtGui.QKeySequence(u'T')], self.onThemeDisplay, - u':/slides/slide_theme.png', False, UiStrings.LiveToolbar) + u':/slides/slide_theme.png', False, UiStrings().LiveToolbar) self.themeScreen.setText( translate('OpenLP.SlideController', 'Blank to Theme')) self.desktopScreen = shortcut_action(self.hideMenu, u'desktopScreen', [QtGui.QKeySequence(u'D')], self.onHideDisplay, u':/slides/slide_desktop.png', False, - UiStrings.LiveToolbar) + UiStrings().LiveToolbar) self.desktopScreen.setText( translate('OpenLP.SlideController', 'Show Desktop')) self.hideMenu.setDefaultAction(self.blankScreen) @@ -194,7 +194,7 @@ class SlideController(QtGui.QWidget): self.delaySpinBox.setMinimum(1) self.delaySpinBox.setMaximum(180) self.toolbar.addToolbarWidget(u'Image SpinBox', self.delaySpinBox) - self.delaySpinBox.setSuffix(UiStrings.Seconds) + self.delaySpinBox.setSuffix(UiStrings().Seconds) self.delaySpinBox.setToolTip(translate('OpenLP.SlideController', 'Delay between slides in seconds')) else: @@ -376,21 +376,21 @@ class SlideController(QtGui.QWidget): self.nextItem.setObjectName(u'nextItemLive') action_list = ActionList.get_instance() action_list.add_category( - UiStrings.LiveToolbar, CategoryOrder.standardToolbar) + UiStrings().LiveToolbar, CategoryOrder.standardToolbar) action_list.add_action(self.previousItem) action_list.add_action(self.nextItem) self.previousService = shortcut_action(parent, u'previousService', - [QtCore.Qt.Key_Left], self.servicePrevious, UiStrings.LiveToolbar) + [QtCore.Qt.Key_Left], self.servicePrevious, UiStrings().LiveToolbar) self.previousService.setShortcutContext(QtCore.Qt.WidgetWithChildrenShortcut) self.previousService.setText( translate('OpenLP.SlideController', 'Previous Service')) self.nextService = shortcut_action(parent, 'nextService', - [QtCore.Qt.Key_Right], self.serviceNext, UiStrings.LiveToolbar) + [QtCore.Qt.Key_Right], self.serviceNext, UiStrings().LiveToolbar) self.nextService.setShortcutContext(QtCore.Qt.WidgetWithChildrenShortcut) self.nextService.setText( translate('OpenLP.SlideController', 'Next Service')) self.escapeItem = shortcut_action(parent, 'escapeItem', - [QtCore.Qt.Key_Escape], self.liveEscape, UiStrings.LiveToolbar) + [QtCore.Qt.Key_Escape], self.liveEscape, UiStrings().LiveToolbar) self.escapeItem.setShortcutContext(QtCore.Qt.WidgetWithChildrenShortcut) self.escapeItem.setText( translate('OpenLP.SlideController', 'Escape Item')) @@ -1150,4 +1150,4 @@ class SlideController(QtGui.QWidget): elif self.desktopScreen.isChecked(): return HideMode.Screen else: - return None + return None \ No newline at end of file diff --git a/openlp/core/ui/starttimedialog.py b/openlp/core/ui/starttimedialog.py index be34b765e..2d1711231 100644 --- a/openlp/core/ui/starttimedialog.py +++ b/openlp/core/ui/starttimedialog.py @@ -107,15 +107,15 @@ class Ui_StartTimeDialog(object): def retranslateUi(self, StartTimeDialog): self.setWindowTitle(translate('OpenLP.StartTimeForm', 'Item Start and Finish Time')) - self.hourSpinBox.setSuffix(UiStrings.Hours) - self.minuteSpinBox.setSuffix(UiStrings.Minutes) - self.secondSpinBox.setSuffix(UiStrings.Seconds) - self.hourFinishSpinBox.setSuffix(UiStrings.Hours) - self.minuteFinishSpinBox.setSuffix(UiStrings.Minutes) - self.secondFinishSpinBox.setSuffix(UiStrings.Seconds) + self.hourSpinBox.setSuffix(UiStrings().Hours) + self.minuteSpinBox.setSuffix(UiStrings().Minutes) + self.secondSpinBox.setSuffix(UiStrings().Seconds) + self.hourFinishSpinBox.setSuffix(UiStrings().Hours) + self.minuteFinishSpinBox.setSuffix(UiStrings().Minutes) + self.secondFinishSpinBox.setSuffix(UiStrings().Seconds) self.hourLabel.setText(translate('OpenLP.StartTimeForm', 'Hours:')) self.minuteLabel.setText(translate('OpenLP.StartTimeForm', 'Minutes:')) self.secondLabel.setText(translate('OpenLP.StartTimeForm', 'Seconds:')) self.startLabel.setText(translate('OpenLP.StartTimeForm', 'Start')) self.finishLabel.setText(translate('OpenLP.StartTimeForm', 'Finish')) - self.lengthLabel.setText(translate('OpenLP.StartTimeForm', 'Length')) + self.lengthLabel.setText(translate('OpenLP.StartTimeForm', 'Length')) \ No newline at end of file diff --git a/openlp/core/ui/starttimeform.py b/openlp/core/ui/starttimeform.py index a30dd3b8e..b460bbbd0 100644 --- a/openlp/core/ui/starttimeform.py +++ b/openlp/core/ui/starttimeform.py @@ -53,11 +53,11 @@ class StartTimeForm(QtGui.QDialog, Ui_StartTimeDialog): self.hourFinishSpinBox.setValue(hours) self.minuteFinishSpinBox.setValue(minutes) self.secondFinishSpinBox.setValue(seconds) - self.hourFinishLabel.setText(u'%s%s' % (unicode(hour), UiStrings.Hours)) + self.hourFinishLabel.setText(u'%s%s' % (unicode(hour), UiStrings().Hours)) self.minuteFinishLabel.setText(u'%s%s' % - (unicode(minutes), UiStrings.Minutes)) + (unicode(minutes), UiStrings().Minutes)) self.secondFinishLabel.setText(u'%s%s' % - (unicode(seconds), UiStrings.Seconds)) + (unicode(seconds), UiStrings().Seconds)) return QtGui.QDialog.exec_(self) def accept(self): @@ -90,4 +90,4 @@ class StartTimeForm(QtGui.QDialog, Ui_StartTimeDialog): seconds -= 3600 * hours minutes = seconds / 60 seconds -= 60 * minutes - return hours, minutes, seconds + return hours, minutes, seconds \ No newline at end of file diff --git a/openlp/core/ui/themeform.py b/openlp/core/ui/themeform.py index 3a3b3bb61..ebba45e7c 100644 --- a/openlp/core/ui/themeform.py +++ b/openlp/core/ui/themeform.py @@ -290,7 +290,7 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard): 'Edit Theme - %s')) % self.theme.theme_name) self.next() else: - self.setWindowTitle(UiStrings.NewTheme) + self.setWindowTitle(UiStrings().NewTheme) return QtGui.QWizard.exec_(self) def initializePage(self, id): @@ -473,7 +473,7 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard): """ images_filter = get_images_filter() images_filter = u'%s;;%s (*.*) (*)' % ( - images_filter, UiStrings.AllFiles) + images_filter, UiStrings().AllFiles) filename = QtGui.QFileDialog.getOpenFileName(self, translate('OpenLP.ThemeForm', 'Select Image'), u'', images_filter) @@ -589,4 +589,4 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard): QtGui.QColor(field), self) if new_color.isValid(): field = new_color.name() - return field + return field \ No newline at end of file diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index 81da6e021..d2a653a26 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -63,7 +63,7 @@ class ThemeManager(QtGui.QWidget): self.layout.setMargin(0) self.layout.setObjectName(u'layout') self.toolbar = OpenLPToolbar(self) - self.toolbar.addToolbarButton(UiStrings.NewTheme, + self.toolbar.addToolbarButton(UiStrings().NewTheme, u':/themes/theme_new.png', translate('OpenLP.ThemeManager', 'Create a new theme.'), self.onAddTheme) @@ -449,7 +449,7 @@ class ThemeManager(QtGui.QWidget): # No themes have been found so create one if len(files) == 0: theme = ThemeXML() - theme.theme_name = UiStrings.Default + theme.theme_name = UiStrings().Default self._writeTheme(theme, None, None) QtCore.QSettings().setValue( self.settingsSection + u'/global theme', @@ -803,4 +803,4 @@ class ThemeManager(QtGui.QWidget): vAlignCorrection = VerticalType.Bottom newtheme.display_horizontal_align = theme.HorizontalAlign newtheme.display_vertical_align = vAlignCorrection - return newtheme.extract_xml() + return newtheme.extract_xml() \ No newline at end of file diff --git a/openlp/core/ui/themestab.py b/openlp/core/ui/themestab.py index 372ee0cc8..fccef1244 100644 --- a/openlp/core/ui/themestab.py +++ b/openlp/core/ui/themestab.py @@ -102,7 +102,7 @@ class ThemesTab(SettingsTab): QtCore.SIGNAL(u'theme_update_list'), self.updateThemeList) def retranslateUi(self): - self.tabTitleVisible = UiStrings.Themes + self.tabTitleVisible = UiStrings().Themes self.GlobalGroupBox.setTitle( translate('OpenLP.ThemesTab', 'Global Theme')) self.LevelGroupBox.setTitle( @@ -203,4 +203,4 @@ class ThemesTab(SettingsTab): if not preview.isNull(): preview = preview.scaled(300, 255, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation) - self.DefaultListView.setPixmap(preview) + self.DefaultListView.setPixmap(preview) \ No newline at end of file diff --git a/openlp/core/ui/themewizard.py b/openlp/core/ui/themewizard.py index 9e464aa7a..759b36101 100644 --- a/openlp/core/ui/themewizard.py +++ b/openlp/core/ui/themewizard.py @@ -424,7 +424,7 @@ class Ui_ThemeWizard(object): self.backgroundComboBox.setItemText(BackgroundType.Gradient, translate('OpenLP.ThemeWizard', 'Gradient')) self.backgroundComboBox.setItemText( - BackgroundType.Image, UiStrings.Image) + BackgroundType.Image, UiStrings().Image) self.colorLabel.setText(translate('OpenLP.ThemeWizard', 'Color:')) self.gradientStartLabel.setText( translate(u'OpenLP.ThemeWizard', 'Starting color:')) @@ -442,7 +442,7 @@ class Ui_ThemeWizard(object): translate('OpenLP.ThemeWizard', 'Top Left - Bottom Right')) self.gradientComboBox.setItemText(BackgroundGradientType.LeftBottom, translate('OpenLP.ThemeWizard', 'Bottom Left - Top Right')) - self.imageLabel.setText(u'%s:' % UiStrings.Image) + self.imageLabel.setText(u'%s:' % UiStrings().Image) self.mainAreaPage.setTitle( translate('OpenLP.ThemeWizard', 'Main Area Font Details')) self.mainAreaPage.setSubTitle( @@ -451,17 +451,17 @@ class Ui_ThemeWizard(object): self.mainFontLabel.setText(translate('OpenLP.ThemeWizard', 'Font:')) self.mainColorLabel.setText(translate('OpenLP.ThemeWizard', 'Color:')) self.mainSizeLabel.setText(translate('OpenLP.ThemeWizard', 'Size:')) - self.mainSizeSpinBox.setSuffix(UiStrings.FontSizePtUnit) + self.mainSizeSpinBox.setSuffix(UiStrings().FontSizePtUnit) self.lineSpacingLabel.setText( translate('OpenLP.ThemeWizard', 'Line Spacing:')) - self.lineSpacingSpinBox.setSuffix(UiStrings.FontSizePtUnit) + self.lineSpacingSpinBox.setSuffix(UiStrings().FontSizePtUnit) self.outlineCheckBox.setText( translate('OpenLP.ThemeWizard', '&Outline:')) self.outlineSizeLabel.setText(translate('OpenLP.ThemeWizard', 'Size:')) - self.outlineSizeSpinBox.setSuffix(UiStrings.FontSizePtUnit) + self.outlineSizeSpinBox.setSuffix(UiStrings().FontSizePtUnit) self.shadowCheckBox.setText(translate('OpenLP.ThemeWizard', '&Shadow:')) self.shadowSizeLabel.setText(translate('OpenLP.ThemeWizard', 'Size:')) - self.shadowSizeSpinBox.setSuffix(UiStrings.FontSizePtUnit) + self.shadowSizeSpinBox.setSuffix(UiStrings().FontSizePtUnit) self.mainBoldCheckBox.setText(translate('OpenLP.ThemeWizard', 'Bold')) self.mainItalicsCheckBox.setText( translate('OpenLP.ThemeWizard', 'Italic')) @@ -473,7 +473,7 @@ class Ui_ThemeWizard(object): self.footerFontLabel.setText(translate('OpenLP.ThemeWizard', 'Font:')) self.footerColorLabel.setText(translate('OpenLP.ThemeWizard', 'Color:')) self.footerSizeLabel.setText(translate('OpenLP.ThemeWizard', 'Size:')) - self.footerSizeSpinBox.setSuffix(UiStrings.FontSizePtUnit) + self.footerSizeSpinBox.setSuffix(UiStrings().FontSizePtUnit) self.alignmentPage.setTitle( translate('OpenLP.ThemeWizard', 'Text Formatting Details')) self.alignmentPage.setSubTitle( @@ -537,4 +537,4 @@ class Ui_ThemeWizard(object): labelWidth = max(self.backgroundLabel.minimumSizeHint().width(), self.horizontalLabel.minimumSizeHint().width()) self.spacer.changeSize(labelWidth, 0, - QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) \ No newline at end of file diff --git a/openlp/core/ui/wizard.py b/openlp/core/ui/wizard.py index cb3a75294..74ca0715a 100644 --- a/openlp/core/ui/wizard.py +++ b/openlp/core/ui/wizard.py @@ -212,11 +212,11 @@ class OpenLPWizard(QtGui.QWizard): """ if filters: filters += u';;' - filters += u'%s (*)' % UiStrings.AllFiles + filters += u'%s (*)' % UiStrings().AllFiles filename = QtGui.QFileDialog.getOpenFileName(self, title, os.path.dirname(SettingsManager.get_last_dir( self.plugin.settingsSection, 1)), filters) if filename: editbox.setText(filename) SettingsManager.set_last_dir(self.plugin.settingsSection, - filename, 1) + filename, 1) \ No newline at end of file diff --git a/openlp/plugins/alerts/alertsplugin.py b/openlp/plugins/alerts/alertsplugin.py index c5714c914..0cfa9c60a 100644 --- a/openlp/plugins/alerts/alertsplugin.py +++ b/openlp/plugins/alerts/alertsplugin.py @@ -77,7 +77,7 @@ class AlertsPlugin(Plugin): Plugin.initialise(self) self.toolsAlertItem.setVisible(True) action_list = ActionList.get_instance() - action_list.add_action(self.toolsAlertItem, UiStrings.Tools) + action_list.add_action(self.toolsAlertItem, UiStrings().Tools) self.liveController.alertTab = self.settings_tab def finalise(self): @@ -118,4 +118,4 @@ class AlertsPlugin(Plugin): ## Name for MediaDockManager, SettingsManager ## self.textStrings[StringContent.VisibleName] = { u'title': translate('AlertsPlugin', 'Alerts', 'container title') - } + } \ No newline at end of file diff --git a/openlp/plugins/alerts/lib/alertstab.py b/openlp/plugins/alerts/lib/alertstab.py index 3b6c50a10..2ec2be24b 100644 --- a/openlp/plugins/alerts/lib/alertstab.py +++ b/openlp/plugins/alerts/lib/alertstab.py @@ -109,12 +109,12 @@ class AlertsTab(SettingsTab): translate('AlertsPlugin.AlertsTab', 'Background color:')) self.FontSizeLabel.setText( translate('AlertsPlugin.AlertsTab', 'Font size:')) - self.FontSizeSpinBox.setSuffix(UiStrings.FontSizePtUnit) + self.FontSizeSpinBox.setSuffix(UiStrings().FontSizePtUnit) self.TimeoutLabel.setText( translate('AlertsPlugin.AlertsTab', 'Alert timeout:')) - self.TimeoutSpinBox.setSuffix(UiStrings.Seconds) - self.PreviewGroupBox.setTitle(UiStrings.Preview) - self.FontPreview.setText(UiStrings.OLPV2) + self.TimeoutSpinBox.setSuffix(UiStrings().Seconds) + self.PreviewGroupBox.setTitle(UiStrings().Preview) + self.FontPreview.setText(UiStrings().OLPV2) def onBackgroundColorButtonClicked(self): new_color = QtGui.QColorDialog.getColor( @@ -191,4 +191,4 @@ class AlertsTab(SettingsTab): font.setPointSize(self.font_size) self.FontPreview.setFont(font) self.FontPreview.setStyleSheet(u'background-color: %s; color: %s' % - (self.bg_color, self.font_color)) + (self.bg_color, self.font_color)) \ No newline at end of file diff --git a/openlp/plugins/bibles/bibleplugin.py b/openlp/plugins/bibles/bibleplugin.py index aea732688..5a631bf00 100644 --- a/openlp/plugins/bibles/bibleplugin.py +++ b/openlp/plugins/bibles/bibleplugin.py @@ -53,9 +53,9 @@ class BiblePlugin(Plugin): Plugin.initialise(self) self.importBibleItem.setVisible(True) action_list = ActionList.get_instance() - action_list.add_action(self.importBibleItem, UiStrings.Import) + action_list.add_action(self.importBibleItem, UiStrings().Import) # Do not add the action to the list yet. - #action_list.add_action(self.exportBibleItem, UiStrings.Export) + #action_list.add_action(self.exportBibleItem, UiStrings().Export) # Set to invisible until we can export bibles self.exportBibleItem.setVisible(False) @@ -67,9 +67,9 @@ class BiblePlugin(Plugin): self.manager.finalise() Plugin.finalise(self) action_list = ActionList.get_instance() - action_list.remove_action(self.importBibleItem, UiStrings.Import) + action_list.remove_action(self.importBibleItem, UiStrings().Import) self.importBibleItem.setVisible(False) - #action_list.remove_action(self.exportBibleItem, UiStrings.Export) + #action_list.remove_action(self.exportBibleItem, UiStrings().Export) self.exportBibleItem.setVisible(False) def addImportMenuItem(self, import_menu): @@ -146,4 +146,4 @@ class BiblePlugin(Plugin): u'service': translate('BiblesPlugin', 'Add the selected Bible to the service') } - self.setPluginUiTextStrings(tooltips) + self.setPluginUiTextStrings(tooltips) \ No newline at end of file diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index 35cd17c4b..439724b66 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -377,7 +377,7 @@ class BibleImportForm(OpenLPWizard): self.formatComboBox.setItemText(BibleFormat.OpenSong, WizardStrings.OS) self.formatComboBox.setItemText(BibleFormat.WebDownload, translate('BiblesPlugin.ImportWizardForm', 'Web Download')) - self.formatComboBox.setItemText(BibleFormat.OpenLP1, UiStrings.OLPV1) + self.formatComboBox.setItemText(BibleFormat.OpenLP1, UiStrings().OLPV1) self.openlp1FileLabel.setText( translate('BiblesPlugin.ImportWizardForm', 'Bible file:')) self.osisFileLabel.setText( @@ -451,13 +451,13 @@ class BibleImportForm(OpenLPWizard): elif self.currentPage() == self.selectPage: if self.field(u'source_format').toInt()[0] == BibleFormat.OSIS: if not self.field(u'osis_location').toString(): - critical_error_message_box(UiStrings.NFSs, + critical_error_message_box(UiStrings().NFSs, WizardStrings.YouSpecifyFile % WizardStrings.OSIS) self.osisFileEdit.setFocus() return False elif self.field(u'source_format').toInt()[0] == BibleFormat.CSV: if not self.field(u'csv_testamentsfile').toString(): - answer = critical_error_message_box(UiStrings.NFSs, + answer = critical_error_message_box(UiStrings().NFSs, translate('BiblesPlugin.ImportWizardForm', 'You have not specified a testaments file. Do you ' 'want to proceed with the import?'), question=True) @@ -465,14 +465,14 @@ class BibleImportForm(OpenLPWizard): self.csvTestamentsEdit.setFocus() return False if not self.field(u'csv_booksfile').toString(): - critical_error_message_box(UiStrings.NFSs, + critical_error_message_box(UiStrings().NFSs, translate('BiblesPlugin.ImportWizardForm', 'You need to specify a file with books of ' 'the Bible to use in the import.')) self.csvBooksEdit.setFocus() return False elif not self.field(u'csv_versefile').toString(): - critical_error_message_box(UiStrings.NFSs, + critical_error_message_box(UiStrings().NFSs, translate('BiblesPlugin.ImportWizardForm', 'You need to specify a file of Bible ' 'verses to import.')) @@ -481,14 +481,14 @@ class BibleImportForm(OpenLPWizard): elif self.field(u'source_format').toInt()[0] == \ BibleFormat.OpenSong: if not self.field(u'opensong_file').toString(): - critical_error_message_box(UiStrings.NFSs, + critical_error_message_box(UiStrings().NFSs, WizardStrings.YouSpecifyFile % WizardStrings.OS) self.openSongFileEdit.setFocus() return False elif self.field(u'source_format').toInt()[0] == BibleFormat.OpenLP1: if not self.field(u'openlp1_location').toString(): - critical_error_message_box(UiStrings.NFSs, - WizardStrings.YouSpecifyFile % UiStrings.OLPV1) + critical_error_message_box(UiStrings().NFSs, + WizardStrings.YouSpecifyFile % UiStrings().OLPV1) self.openlp1FileEdit.setFocus() return False return True @@ -497,13 +497,13 @@ class BibleImportForm(OpenLPWizard): license_copyright = \ unicode(self.field(u'license_copyright').toString()) if not license_version: - critical_error_message_box(UiStrings.EmptyField, + critical_error_message_box(UiStrings().EmptyField, translate('BiblesPlugin.ImportWizardForm', 'You need to specify a version name for your Bible.')) self.versionNameEdit.setFocus() return False elif not license_copyright: - critical_error_message_box(UiStrings.EmptyField, + critical_error_message_box(UiStrings().EmptyField, translate('BiblesPlugin.ImportWizardForm', 'You need to set a copyright for your Bible. ' 'Bibles in the Public Domain need to be marked as such.')) @@ -576,7 +576,7 @@ class BibleImportForm(OpenLPWizard): """ Show the file open dialog for the openlp.org 1.x file. """ - self.getFileName(WizardStrings.OpenTypeFile % UiStrings.OLPV1, + self.getFileName(WizardStrings.OpenTypeFile % UiStrings().OLPV1, self.openlp1FileEdit, u'%s (*.bible)' % translate('BiblesPlugin.ImportWizardForm', 'openlp.org 1.x Bible Files')) @@ -765,4 +765,4 @@ class BibleImportForm(OpenLPWizard): self.progressLabel.setText(translate( 'BiblesPlugin.ImportWizardForm', 'Your Bible import failed.')) del self.manager.db_cache[importer.name] - delete_database(self.plugin.settingsSection, importer.file) + delete_database(self.plugin.settingsSection, importer.file) \ No newline at end of file diff --git a/openlp/plugins/bibles/lib/biblestab.py b/openlp/plugins/bibles/lib/biblestab.py index b013c402a..33c2c1f9f 100644 --- a/openlp/plugins/bibles/lib/biblestab.py +++ b/openlp/plugins/bibles/lib/biblestab.py @@ -118,16 +118,16 @@ class BiblesTab(SettingsTab): self.newChaptersCheckBox.setText( translate('BiblesPlugin.BiblesTab', 'Only show new chapter numbers')) - self.layoutStyleLabel.setText(UiStrings.LayoutStyle) - self.displayStyleLabel.setText(UiStrings.DisplayStyle) + self.layoutStyleLabel.setText(UiStrings().LayoutStyle) + self.displayStyleLabel.setText(UiStrings().DisplayStyle) self.bibleThemeLabel.setText( translate('BiblesPlugin.BiblesTab', 'Bible theme:')) self.layoutStyleComboBox.setItemText(LayoutStyle.VersePerSlide, - UiStrings.VersePerSlide) + UiStrings().VersePerSlide) self.layoutStyleComboBox.setItemText(LayoutStyle.VersePerLine, - UiStrings.VersePerLine) + UiStrings().VersePerLine) self.layoutStyleComboBox.setItemText(LayoutStyle.Continuous, - UiStrings.Continuous) + UiStrings().Continuous) self.displayStyleComboBox.setItemText(DisplayStyle.NoBrackets, translate('BiblesPlugin.BiblesTab', 'No Brackets')) self.displayStyleComboBox.setItemText(DisplayStyle.Round, @@ -207,4 +207,4 @@ class BiblesTab(SettingsTab): self.bibleThemeComboBox.addItem(u'') for theme in theme_list: self.bibleThemeComboBox.addItem(theme) - find_and_set_in_combo_box(self.bibleThemeComboBox, self.bible_theme) + find_and_set_in_combo_box(self.bibleThemeComboBox, self.bible_theme) \ No newline at end of file diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index bb72b9ff2..e0e06b02f 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -193,7 +193,7 @@ class BibleMediaItem(MediaManagerItem): self.advancedSearchButtonLayout.addWidget(self.advancedSearchButton) self.advancedLayout.addLayout( self.advancedSearchButtonLayout, 7, 0, 1, 3) - self.searchTabWidget.addTab(self.advancedTab, UiStrings.Advanced) + self.searchTabWidget.addTab(self.advancedTab, UiStrings().Advanced) # Add the search tab widget to the page layout. self.pageLayout.addWidget(self.searchTabWidget) # Combo Boxes @@ -242,15 +242,15 @@ class BibleMediaItem(MediaManagerItem): def retranslateUi(self): log.debug(u'retranslateUi') - self.quickVersionLabel.setText(u'%s:' % UiStrings.Version) + self.quickVersionLabel.setText(u'%s:' % UiStrings().Version) self.quickSecondLabel.setText( translate('BiblesPlugin.MediaItem', 'Second:')) self.quickSearchLabel.setText( translate('BiblesPlugin.MediaItem', 'Find:')) - self.quickSearchButton.setText(UiStrings.Search) + self.quickSearchButton.setText(UiStrings().Search) self.quickClearLabel.setText( translate('BiblesPlugin.MediaItem', 'Results:')) - self.advancedVersionLabel.setText(u'%s:' % UiStrings.Version) + self.advancedVersionLabel.setText(u'%s:' % UiStrings().Version) self.advancedSecondLabel.setText( translate('BiblesPlugin.MediaItem', 'Second:')) self.advancedBookLabel.setText( @@ -265,7 +265,7 @@ class BibleMediaItem(MediaManagerItem): translate('BiblesPlugin.MediaItem', 'To:')) self.advancedClearLabel.setText( translate('BiblesPlugin.MediaItem', 'Results:')) - self.advancedSearchButton.setText(UiStrings.Search) + self.advancedSearchButton.setText(UiStrings().Search) self.quickClearComboBox.addItem( translate('BiblesPlugin.MediaItem', 'Clear')) self.quickClearComboBox.addItem( @@ -274,13 +274,13 @@ class BibleMediaItem(MediaManagerItem): translate('BiblesPlugin.MediaItem', 'Clear')) self.advancedClearComboBox.addItem( translate('BiblesPlugin.MediaItem', 'Keep')) - self.quickLayoutLabel.setText(UiStrings.LayoutStyle) + self.quickLayoutLabel.setText(UiStrings().LayoutStyle) self.quickLayoutComboBox.setItemText(LayoutStyle.VersePerSlide, - UiStrings.VersePerSlide) + UiStrings().VersePerSlide) self.quickLayoutComboBox.setItemText(LayoutStyle.VersePerLine, - UiStrings.VersePerLine) + UiStrings().VersePerLine) self.quickLayoutComboBox.setItemText(LayoutStyle.Continuous, - UiStrings.Continuous) + UiStrings().Continuous) def initialise(self): log.debug(u'bible manager initialise') @@ -849,4 +849,4 @@ class BibleMediaItem(MediaManagerItem): self.settings.layout_style) QtCore.QSettings().setValue( self.settingsSection + u'/verse layout style', - QtCore.QVariant(self.settings.layout_style)) + QtCore.QVariant(self.settings.layout_style)) \ No newline at end of file diff --git a/openlp/plugins/custom/forms/editcustomdialog.py b/openlp/plugins/custom/forms/editcustomdialog.py index 1ea0413ff..7a6c1f07b 100644 --- a/openlp/plugins/custom/forms/editcustomdialog.py +++ b/openlp/plugins/custom/forms/editcustomdialog.py @@ -107,11 +107,11 @@ class Ui_CustomEditDialog(object): translate('CustomPlugin.EditCustomForm', 'Edit Custom Slides')) self.titleLabel.setText( translate('CustomPlugin.EditCustomForm', '&Title:')) - self.addButton.setText(UiStrings.Add) + self.addButton.setText(UiStrings().Add) self.addButton.setToolTip( translate('CustomPlugin.EditCustomForm', 'Add a new slide at ' 'bottom.')) - self.editButton.setText(UiStrings.Edit) + self.editButton.setText(UiStrings().Edit) self.editButton.setToolTip( translate('CustomPlugin.EditCustomForm', 'Edit the selected ' 'slide.')) @@ -124,4 +124,4 @@ class Ui_CustomEditDialog(object): translate('CustomPlugin.EditCustomForm', 'The&me:')) self.creditLabel.setText( translate('CustomPlugin.EditCustomForm', '&Credits:')) - self.previewButton.setText(UiStrings.SaveAndPreview) + self.previewButton.setText(UiStrings().SaveAndPreview) \ No newline at end of file diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py index b045c58a4..b508104c4 100644 --- a/openlp/plugins/custom/lib/mediaitem.py +++ b/openlp/plugins/custom/lib/mediaitem.py @@ -110,7 +110,7 @@ class CustomMediaItem(MediaManagerItem): """ Edit a custom item """ - if check_item_selected(self.listView, UiStrings.SelectEdit): + if check_item_selected(self.listView, UiStrings().SelectEdit): item = self.listView.currentItem() item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0] self.parent.edit_custom_form.loadCustom(item_id, False) @@ -121,7 +121,7 @@ class CustomMediaItem(MediaManagerItem): """ Remove a custom item from the list and database """ - if check_item_selected(self.listView, UiStrings.SelectDelete): + if check_item_selected(self.listView, UiStrings().SelectDelete): row_list = [item.row() for item in self.listView.selectedIndexes()] row_list.sort(reverse=True) id_list = [(item.data(QtCore.Qt.UserRole)).toInt()[0] @@ -160,4 +160,4 @@ class CustomMediaItem(MediaManagerItem): else: raw_footer.append(u'') service_item.raw_footer = raw_footer - return True + return True \ No newline at end of file diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index c29adc3b1..298e701e3 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -55,11 +55,11 @@ class ImageMediaItem(MediaManagerItem): 'Select Image(s)') file_formats = get_images_filter() self.onNewFileMasks = u'%s;;%s (*.*) (*)' % (file_formats, - UiStrings.AllFiles) - self.replaceAction.setText(UiStrings.ReplaceBG) - self.replaceAction.setToolTip(UiStrings.ReplaceLiveBG) - self.resetAction.setText(UiStrings.ResetBG) - self.resetAction.setToolTip(UiStrings.ResetLiveBG) + UiStrings().AllFiles) + self.replaceAction.setText(UiStrings().ReplaceBG) + self.replaceAction.setToolTip(UiStrings().ReplaceLiveBG) + self.resetAction.setText(UiStrings().ResetBG) + self.resetAction.setToolTip(UiStrings().ResetLiveBG) def requiredIcons(self): MediaManagerItem.requiredIcons(self) @@ -198,7 +198,7 @@ class ImageMediaItem(MediaManagerItem): self.parent.liveController.display.directImage(name, filename) self.resetAction.setVisible(True) else: - critical_error_message_box(UiStrings.LiveBGError, + critical_error_message_box(UiStrings().LiveBGError, unicode(translate('ImagePlugin.MediaItem', 'There was a problem replacing your background, ' - 'the image file "%s" no longer exists.')) % filename) + 'the image file "%s" no longer exists.')) % filename) \ No newline at end of file diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 7612ab7c9..559af11e2 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -60,11 +60,11 @@ class MediaMediaItem(MediaManagerItem): self.onNewFileMasks = unicode(translate('MediaPlugin.MediaItem', 'Videos (%s);;Audio (%s);;%s (*)')) % ( u' '.join(self.parent.video_extensions_list), - u' '.join(self.parent.audio_extensions_list), UiStrings.AllFiles) - self.replaceAction.setText(UiStrings.ReplaceBG) - self.replaceAction.setToolTip(UiStrings.ReplaceLiveBG) - self.resetAction.setText(UiStrings.ResetBG) - self.resetAction.setToolTip(UiStrings.ResetLiveBG) + u' '.join(self.parent.audio_extensions_list), UiStrings().AllFiles) + self.replaceAction.setText(UiStrings().ReplaceBG) + self.replaceAction.setToolTip(UiStrings().ReplaceLiveBG) + self.resetAction.setText(UiStrings().ResetBG) + self.resetAction.setToolTip(UiStrings().ResetLiveBG) def requiredIcons(self): MediaManagerItem.requiredIcons(self) @@ -111,7 +111,7 @@ class MediaMediaItem(MediaManagerItem): self.parent.liveController.display.video(filename, 0, True) self.resetAction.setVisible(True) else: - critical_error_message_box(UiStrings.LiveBGError, + critical_error_message_box(UiStrings().LiveBGError, unicode(translate('MediaPlugin.MediaItem', 'There was a problem replacing your background, ' 'the media file "%s" no longer exists.')) % filename) @@ -209,4 +209,4 @@ class MediaMediaItem(MediaManagerItem): img = QtGui.QPixmap(u':/media/media_video.png').toImage() item_name.setIcon(build_icon(img)) item_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(file)) - self.listView.addItem(item_name) + self.listView.addItem(item_name) \ No newline at end of file diff --git a/openlp/plugins/presentations/lib/mediaitem.py b/openlp/plugins/presentations/lib/mediaitem.py index 6009ff906..74ff3fea8 100644 --- a/openlp/plugins/presentations/lib/mediaitem.py +++ b/openlp/plugins/presentations/lib/mediaitem.py @@ -203,7 +203,7 @@ class PresentationMediaItem(MediaManagerItem): """ Remove a presentation item from the list """ - if check_item_selected(self.listView, UiStrings.SelectDelete): + if check_item_selected(self.listView, UiStrings().SelectDelete): items = self.listView.selectedIndexes() row_list = [item.row() for item in items] row_list.sort(reverse=True) @@ -296,4 +296,4 @@ class PresentationMediaItem(MediaManagerItem): if self.controllers[controller].enabled(): if filetype in self.controllers[controller].alsosupports: return controller - return None + return None \ No newline at end of file diff --git a/openlp/plugins/presentations/lib/presentationtab.py b/openlp/plugins/presentations/lib/presentationtab.py index 8e3a98031..bba2b469e 100644 --- a/openlp/plugins/presentations/lib/presentationtab.py +++ b/openlp/plugins/presentations/lib/presentationtab.py @@ -86,7 +86,7 @@ class PresentationTab(SettingsTab): checkbox.setText( unicode(translate('PresentationPlugin.PresentationTab', '%s (unavailable)')) % controller.name) - self.AdvancedGroupBox.setTitle(UiStrings.Advanced) + self.AdvancedGroupBox.setTitle(UiStrings().Advanced) self.OverrideAppCheckBox.setText( translate('PresentationPlugin.PresentationTab', 'Allow presentation application to be overriden')) @@ -131,4 +131,4 @@ class PresentationTab(SettingsTab): QtCore.QVariant(self.OverrideAppCheckBox.checkState())) changed = True if changed: - Receiver.send_message(u'mediaitem_presentation_rebuild') + Receiver.send_message(u'mediaitem_presentation_rebuild') \ No newline at end of file diff --git a/openlp/plugins/songs/forms/editsongdialog.py b/openlp/plugins/songs/forms/editsongdialog.py index a9bd132cd..749d5184d 100644 --- a/openlp/plugins/songs/forms/editsongdialog.py +++ b/openlp/plugins/songs/forms/editsongdialog.py @@ -260,11 +260,11 @@ class Ui_EditSongDialog(object): translate('SongsPlugin.EditSongForm', '&Lyrics:')) self.verseOrderLabel.setText( translate('SongsPlugin.EditSongForm', '&Verse order:')) - self.verseAddButton.setText(UiStrings.Add) - self.verseEditButton.setText(UiStrings.Edit) + self.verseAddButton.setText(UiStrings().Add) + self.verseEditButton.setText(UiStrings().Edit) self.verseEditAllButton.setText( translate('SongsPlugin.EditSongForm', 'Ed&it All')) - self.verseDeleteButton.setText(UiStrings.Delete) + self.verseDeleteButton.setText(UiStrings().Delete) self.songTabWidget.setTabText( self.songTabWidget.indexOf(self.lyricsTab), translate('SongsPlugin.EditSongForm', 'Title && Lyrics')) @@ -289,13 +289,13 @@ class Ui_EditSongDialog(object): self.songTabWidget.indexOf(self.authorsTab), translate('SongsPlugin.EditSongForm', 'Authors, Topics && Song Book')) - self.themeGroupBox.setTitle(UiStrings.Theme) + self.themeGroupBox.setTitle(UiStrings().Theme) self.themeAddButton.setText( translate('SongsPlugin.EditSongForm', 'New &Theme')) self.rightsGroupBox.setTitle( translate('SongsPlugin.EditSongForm', 'Copyright Information')) self.copyrightInsertButton.setText(SongStrings.CopyrightSymbol) - self.CCLILabel.setText(UiStrings.CCLINumberLabel) + self.CCLILabel.setText(UiStrings().CCLINumberLabel) self.commentsGroupBox.setTitle( translate('SongsPlugin.EditSongForm', 'Comments')) self.songTabWidget.setTabText( @@ -313,4 +313,4 @@ def editSongDialogComboBox(parent, name): comboBox.setEditable(True) comboBox.setInsertPolicy(QtGui.QComboBox.NoInsert) comboBox.setObjectName(name) - return comboBox + return comboBox \ No newline at end of file diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 85294d92b..0b9c9316f 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -96,7 +96,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): QtCore.SIGNAL(u'theme_update_list'), self.loadThemes) self.previewButton = QtGui.QPushButton() self.previewButton.setObjectName(u'previewButton') - self.previewButton.setText(UiStrings.SaveAndPreview) + self.previewButton.setText(UiStrings().SaveAndPreview) self.buttonBox.addButton( self.previewButton, QtGui.QDialogButtonBox.ActionRole) QtCore.QObject.connect(self.buttonBox, @@ -355,7 +355,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.__addAuthorToList(author) self.authorsComboBox.setCurrentIndex(0) else: - QtGui.QMessageBox.warning(self, UiStrings.NISs, + QtGui.QMessageBox.warning(self, UiStrings().NISs, translate('SongsPlugin.EditSongForm', 'You have not selected ' 'a valid author. Either select an author from the list, ' 'or type in a new author and click the "Add Author to ' @@ -414,7 +414,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.topicsListView.addItem(topic_item) self.topicsComboBox.setCurrentIndex(0) else: - QtGui.QMessageBox.warning(self, UiStrings.NISs, + QtGui.QMessageBox.warning(self, UiStrings().NISs, translate('SongsPlugin.EditSongForm', 'You have not selected ' 'a valid topic. Either select a topic from the list, or ' 'type in a new topic and click the "Add Topic to Song" ' diff --git a/openlp/plugins/songs/forms/songexportform.py b/openlp/plugins/songs/forms/songexportform.py index d71321b98..745ee3f67 100644 --- a/openlp/plugins/songs/forms/songexportform.py +++ b/openlp/plugins/songs/forms/songexportform.py @@ -175,7 +175,7 @@ class SongExportForm(OpenLPWizard): self.availableSongsPage.setSubTitle( translate('SongsPlugin.ExportWizardForm', 'Check the songs you want to export.')) - self.searchLabel.setText(u'%s:' % UiStrings.Search) + self.searchLabel.setText(u'%s:' % UiStrings().Search) self.uncheckButton.setText( translate('SongsPlugin.ExportWizardForm', 'Uncheck All')) self.checkButton.setText( @@ -207,7 +207,7 @@ class SongExportForm(OpenLPWizard): self.availableListWidget) if item.checkState() ] if not items: - critical_error_message_box(UiStrings.NISp, + critical_error_message_box(UiStrings().NISp, translate('SongsPlugin.ExportWizardForm', 'You need to add at least one Song to export.')) return False @@ -360,4 +360,4 @@ class SongExportForm(OpenLPWizard): SettingsManager.get_last_dir(self.plugin.settingsSection, 1), options=QtGui.QFileDialog.ShowDirsOnly)) SettingsManager.set_last_dir(self.plugin.settingsSection, path, 1) - self.directoryLineEdit.setText(path) + self.directoryLineEdit.setText(path) \ No newline at end of file diff --git a/openlp/plugins/songs/forms/songimportform.py b/openlp/plugins/songs/forms/songimportform.py index 468d2f341..dde8826e0 100644 --- a/openlp/plugins/songs/forms/songimportform.py +++ b/openlp/plugins/songs/forms/songimportform.py @@ -235,8 +235,8 @@ class SongImportForm(OpenLPWizard): self.sourcePage.setTitle(WizardStrings.ImportSelect) self.sourcePage.setSubTitle(WizardStrings.ImportSelectLong) self.formatLabel.setText(WizardStrings.FormatLabel) - self.formatComboBox.setItemText(SongFormat.OpenLP2, UiStrings.OLPV2) - self.formatComboBox.setItemText(SongFormat.OpenLP1, UiStrings.OLPV1) + self.formatComboBox.setItemText(SongFormat.OpenLP2, UiStrings().OLPV2) + self.formatComboBox.setItemText(SongFormat.OpenLP1, UiStrings().OLPV1) self.formatComboBox.setItemText( SongFormat.OpenLyrics, WizardStrings.OL) self.formatComboBox.setItemText(SongFormat.OpenSong, WizardStrings.OS) @@ -261,10 +261,10 @@ class SongImportForm(OpenLPWizard): # self.formatComboBox.setItemText(SongFormat.CSV, WizardStrings.CSV) self.openLP2FilenameLabel.setText( translate('SongsPlugin.ImportWizardForm', 'Filename:')) - self.openLP2BrowseButton.setText(UiStrings.Browse) + self.openLP2BrowseButton.setText(UiStrings().Browse) self.openLP1FilenameLabel.setText( translate('SongsPlugin.ImportWizardForm', 'Filename:')) - self.openLP1BrowseButton.setText(UiStrings.Browse) + self.openLP1BrowseButton.setText(UiStrings().Browse) self.openLP1DisabledLabel.setText(WizardStrings.NoSqlite) self.openLyricsAddButton.setText( translate('SongsPlugin.ImportWizardForm', 'Add Files...')) @@ -305,10 +305,10 @@ class SongImportForm(OpenLPWizard): 'find OpenOffice.org on your computer.')) self.easiSlidesFilenameLabel.setText( translate('SongsPlugin.ImportWizardForm', 'Filename:')) - self.easiSlidesBrowseButton.setText(UiStrings.Browse) + self.easiSlidesBrowseButton.setText(UiStrings().Browse) self.ewFilenameLabel.setText( translate('SongsPlugin.ImportWizardForm', 'Filename:')) - self.ewBrowseButton.setText(UiStrings.Browse) + self.ewBrowseButton.setText(UiStrings().Browse) self.songBeamerAddButton.setText( translate('SongsPlugin.ImportWizardForm', 'Add Files...')) self.songBeamerRemoveButton.setText( @@ -323,7 +323,7 @@ class SongImportForm(OpenLPWizard): translate('SongsPlugin.ImportWizardForm', 'Remove File(s)')) # self.csvFilenameLabel.setText( # translate('SongsPlugin.ImportWizardForm', 'Filename:')) -# self.csvBrowseButton.setText(UiStrings.Browse) +# self.csvBrowseButton.setText(UiStrings().Browse) self.progressPage.setTitle(WizardStrings.Importing) self.progressPage.setSubTitle( translate('SongsPlugin.ImportWizardForm', @@ -346,49 +346,49 @@ class SongImportForm(OpenLPWizard): source_format = self.formatComboBox.currentIndex() if source_format == SongFormat.OpenLP2: if self.openLP2FilenameEdit.text().isEmpty(): - critical_error_message_box(UiStrings.NFSs, - WizardStrings.YouSpecifyFile % UiStrings.OLPV2) + critical_error_message_box(UiStrings().NFSs, + WizardStrings.YouSpecifyFile % UiStrings().OLPV2) self.openLP2BrowseButton.setFocus() return False elif source_format == SongFormat.OpenLP1: if self.openLP1FilenameEdit.text().isEmpty(): - critical_error_message_box(UiStrings.NFSs, - WizardStrings.YouSpecifyFile % UiStrings.OLPV1) + critical_error_message_box(UiStrings().NFSs, + WizardStrings.YouSpecifyFile % UiStrings().OLPV1) self.openLP1BrowseButton.setFocus() return False elif source_format == SongFormat.OpenLyrics: if self.openLyricsFileListWidget.count() == 0: - critical_error_message_box(UiStrings.NFSp, + critical_error_message_box(UiStrings().NFSp, WizardStrings.YouSpecifyFile % WizardStrings.OL) self.openLyricsAddButton.setFocus() return False elif source_format == SongFormat.OpenSong: if self.openSongFileListWidget.count() == 0: - critical_error_message_box(UiStrings.NFSp, + critical_error_message_box(UiStrings().NFSp, WizardStrings.YouSpecifyFile % WizardStrings.OS) self.openSongAddButton.setFocus() return False elif source_format == SongFormat.WordsOfWorship: if self.wordsOfWorshipFileListWidget.count() == 0: - critical_error_message_box(UiStrings.NFSp, + critical_error_message_box(UiStrings().NFSp, WizardStrings.YouSpecifyFile % WizardStrings.WoW) self.wordsOfWorshipAddButton.setFocus() return False elif source_format == SongFormat.CCLI: if self.ccliFileListWidget.count() == 0: - critical_error_message_box(UiStrings.NFSp, + critical_error_message_box(UiStrings().NFSp, WizardStrings.YouSpecifyFile % WizardStrings.CCLI) self.ccliAddButton.setFocus() return False elif source_format == SongFormat.SongsOfFellowship: if self.songsOfFellowshipFileListWidget.count() == 0: - critical_error_message_box(UiStrings.NFSp, + critical_error_message_box(UiStrings().NFSp, WizardStrings.YouSpecifyFile % WizardStrings.SoF) self.songsOfFellowshipAddButton.setFocus() return False elif source_format == SongFormat.Generic: if self.genericFileListWidget.count() == 0: - critical_error_message_box(UiStrings.NFSp, + critical_error_message_box(UiStrings().NFSp, translate('SongsPlugin.ImportWizardForm', 'You need to specify at least one document or ' 'presentation file to import from.')) @@ -396,31 +396,31 @@ class SongImportForm(OpenLPWizard): return False elif source_format == SongFormat.EasiSlides: if self.easiSlidesFilenameEdit.text().isEmpty(): - critical_error_message_box(UiStrings.NFSp, + critical_error_message_box(UiStrings().NFSp, WizardStrings.YouSpecifyFile % WizardStrings.ES) self.easiSlidesBrowseButton.setFocus() return False elif source_format == SongFormat.EasyWorship: if self.ewFilenameEdit.text().isEmpty(): - critical_error_message_box(UiStrings.NFSs, + critical_error_message_box(UiStrings().NFSs, WizardStrings.YouSpecifyFile % WizardStrings.EW) self.ewBrowseButton.setFocus() return False elif source_format == SongFormat.SongBeamer: if self.songBeamerFileListWidget.count() == 0: - critical_error_message_box(UiStrings.NFSp, + critical_error_message_box(UiStrings().NFSp, WizardStrings.YouSpecifyFile % WizardStrings.SB) self.songBeamerAddButton.setFocus() return False elif source_format == SongFormat.SongShowPlus: if self.songShowPlusFileListWidget.count() == 0: - critical_error_message_box(UiStrings.NFSp, + critical_error_message_box(UiStrings().NFSp, WizardStrings.YouSpecifyFile % WizardStrings.SSP) self.wordsOfWorshipAddButton.setFocus() return False elif source_format == SongFormat.FoilPresenter: if self.foilPresenterFileListWidget.count() == 0: - critical_error_message_box(UiStrings.NFSp, + critical_error_message_box(UiStrings().NFSp, WizardStrings.YouSpecifyFile % WizardStrings.FP) self.foilPresenterAddButton.setFocus() return False @@ -446,7 +446,7 @@ class SongImportForm(OpenLPWizard): """ if filters: filters += u';;' - filters += u'%s (*)' % UiStrings.AllFiles + filters += u'%s (*)' % UiStrings().AllFiles filenames = QtGui.QFileDialog.getOpenFileNames(self, title, SettingsManager.get_last_dir(self.plugin.settingsSection, 1), filters) @@ -476,7 +476,7 @@ class SongImportForm(OpenLPWizard): """ Get OpenLP v2 song database file """ - self.getFileName(WizardStrings.OpenTypeFile % UiStrings.OLPV2, + self.getFileName(WizardStrings.OpenTypeFile % UiStrings().OLPV2, self.openLP2FilenameEdit, u'%s (*.sqlite)' % (translate('SongsPlugin.ImportWizardForm', 'OpenLP 2.0 Databases')) @@ -486,7 +486,7 @@ class SongImportForm(OpenLPWizard): """ Get OpenLP v1 song database file """ - self.getFileName(WizardStrings.OpenTypeFile % UiStrings.OLPV1, + self.getFileName(WizardStrings.OpenTypeFile % UiStrings().OLPV1, self.openLP1FilenameEdit, u'%s (*.olp)' % translate('SongsPlugin.ImportWizardForm', 'openlp.org v1.x Databases') @@ -836,4 +836,4 @@ class SongImportForm(OpenLPWizard): setattr(self, prefix + u'DisabledLayout', disabledLayout) setattr(self, prefix + u'DisabledLabel', disabledLabel) setattr(self, prefix + u'ImportWidget', importWidget) - return importWidget + return importWidget \ No newline at end of file diff --git a/openlp/plugins/songs/forms/songmaintenancedialog.py b/openlp/plugins/songs/forms/songmaintenancedialog.py index 9d4b7da91..3d65783ac 100644 --- a/openlp/plugins/songs/forms/songmaintenancedialog.py +++ b/openlp/plugins/songs/forms/songmaintenancedialog.py @@ -149,17 +149,17 @@ class Ui_SongMaintenanceDialog(object): self.listItemAuthors.setText(SongStrings.Authors) self.listItemTopics.setText(SongStrings.Topics) self.listItemBooks.setText(SongStrings.SongBooks) - self.authorsAddButton.setText(UiStrings.Add) - self.authorsEditButton.setText(UiStrings.Edit) - self.authorsDeleteButton.setText(UiStrings.Delete) - self.topicsAddButton.setText(UiStrings.Add) - self.topicsEditButton.setText(UiStrings.Edit) - self.topicsDeleteButton.setText(UiStrings.Delete) - self.booksAddButton.setText(UiStrings.Add) - self.booksEditButton.setText(UiStrings.Edit) - self.booksDeleteButton.setText(UiStrings.Delete) + self.authorsAddButton.setText(UiStrings().Add) + self.authorsEditButton.setText(UiStrings().Edit) + self.authorsDeleteButton.setText(UiStrings().Delete) + self.topicsAddButton.setText(UiStrings().Add) + self.topicsEditButton.setText(UiStrings().Edit) + self.topicsDeleteButton.setText(UiStrings().Delete) + self.booksAddButton.setText(UiStrings().Add) + self.booksEditButton.setText(UiStrings().Edit) + self.booksDeleteButton.setText(UiStrings().Delete) typeListWidth = max(self.fontMetrics().width(SongStrings.Authors), self.fontMetrics().width(SongStrings.Topics), self.fontMetrics().width(SongStrings.SongBooks)) self.typeListWidget.setFixedWidth(typeListWidth + - self.typeListWidget.iconSize().width() + 32) + self.typeListWidget.iconSize().width() + 32) \ No newline at end of file diff --git a/openlp/plugins/songs/forms/songmaintenanceform.py b/openlp/plugins/songs/forms/songmaintenanceform.py index 0a1effcf3..48e614eeb 100644 --- a/openlp/plugins/songs/forms/songmaintenanceform.py +++ b/openlp/plugins/songs/forms/songmaintenanceform.py @@ -115,7 +115,7 @@ class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog): else: critical_error_message_box(dlg_title, err_text) else: - critical_error_message_box(dlg_title, UiStrings.NISs) + critical_error_message_box(dlg_title, UiStrings().NISs) def resetAuthors(self): """ @@ -503,4 +503,4 @@ class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog): editButton.setEnabled(False) else: deleteButton.setEnabled(True) - editButton.setEnabled(True) + editButton.setEnabled(True) \ No newline at end of file diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 5890fc76d..8245adfbc 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -137,8 +137,8 @@ class SongMediaItem(MediaManagerItem): QtCore.QVariant(u'True')).toBool() def retranslateUi(self): - self.searchTextLabel.setText(u'%s:' % UiStrings.Search) - self.searchTextButton.setText(UiStrings.Search) + self.searchTextLabel.setText(u'%s:' % UiStrings().Search) + self.searchTextButton.setText(UiStrings().Search) self.maintenanceAction.setText(SongStrings.SongMaintenance) self.maintenanceAction.setToolTip(translate('SongsPlugin.MediaItem', 'Maintain the lists of authors, topics and books')) @@ -153,7 +153,7 @@ class SongMediaItem(MediaManagerItem): translate('SongsPlugin.MediaItem', 'Lyrics')), (SongSearch.Authors, u':/songs/song_search_author.png', SongStrings.Authors), - (SongSearch.Themes, u':/slides/slide_theme.png', UiStrings.Themes) + (SongSearch.Themes, u':/slides/slide_theme.png', UiStrings().Themes) ]) self.searchTextEdit.setCurrentSearchType(QtCore.QSettings().value( u'%s/last search type' % self.settingsSection, @@ -312,7 +312,7 @@ class SongMediaItem(MediaManagerItem): Edit a song """ log.debug(u'onEditClick') - if check_item_selected(self.listView, UiStrings.SelectEdit): + if check_item_selected(self.listView, UiStrings().SelectEdit): self.editItem = self.listView.currentItem() item_id = (self.editItem.data(QtCore.Qt.UserRole)).toInt()[0] self.edit_song_form.loadSong(item_id, False) @@ -323,7 +323,7 @@ class SongMediaItem(MediaManagerItem): """ Remove a song from the list and database """ - if check_item_selected(self.listView, UiStrings.SelectDelete): + if check_item_selected(self.listView, UiStrings().SelectDelete): items = self.listView.selectedIndexes() if QtGui.QMessageBox.question(self, translate('SongsPlugin.MediaItem', 'Delete Song(s)?'), @@ -472,4 +472,4 @@ class SongMediaItem(MediaManagerItem): Locale aware collation of song titles """ return locale.strcoll(unicode(song_1.title.lower()), - unicode(song_2.title.lower())) + unicode(song_2.title.lower())) \ No newline at end of file diff --git a/openlp/plugins/songs/songsplugin.py b/openlp/plugins/songs/songsplugin.py index 4fc098949..0cace4977 100644 --- a/openlp/plugins/songs/songsplugin.py +++ b/openlp/plugins/songs/songsplugin.py @@ -67,9 +67,9 @@ class SongsPlugin(Plugin): Plugin.initialise(self) self.toolsReindexItem.setVisible(True) action_list = ActionList.get_instance() - action_list.add_action(self.SongImportItem, UiStrings.Import) - action_list.add_action(self.SongExportItem, UiStrings.Export) - action_list.add_action(self.toolsReindexItem, UiStrings.Tools) + action_list.add_action(self.SongImportItem, UiStrings().Import) + action_list.add_action(self.SongExportItem, UiStrings().Export) + action_list.add_action(self.toolsReindexItem, UiStrings().Tools) def addImportMenuItem(self, import_menu): """ @@ -139,7 +139,7 @@ class SongsPlugin(Plugin): if maxSongs == 0: return progressDialog = QtGui.QProgressDialog( - translate('SongsPlugin', 'Reindexing songs...'), UiStrings.Cancel, + translate('SongsPlugin', 'Reindexing songs...'), UiStrings().Cancel, 0, maxSongs, self.formparent) progressDialog.setWindowModality(QtCore.Qt.WindowModal) songs = self.manager.get_all_objects(Song) @@ -258,7 +258,7 @@ class SongsPlugin(Plugin): self.manager.finalise() self.toolsReindexItem.setVisible(False) action_list = ActionList.get_instance() - action_list.remove_action(self.SongImportItem, UiStrings.Import) - action_list.remove_action(self.SongExportItem, UiStrings.Export) - action_list.remove_action(self.toolsReindexItem, UiStrings.Tools) - Plugin.finalise(self) + action_list.remove_action(self.SongImportItem, UiStrings().Import) + action_list.remove_action(self.SongExportItem, UiStrings().Export) + action_list.remove_action(self.toolsReindexItem, UiStrings().Tools) + Plugin.finalise(self) \ No newline at end of file From 7fdd4bb1c1828e1c1cc70f0c7de2a9ed8bf720f8 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Fri, 15 Apr 2011 23:55:11 +0200 Subject: [PATCH 88/89] Line length cleanups. --- openlp/core/lib/ui.py | 5 +++-- openlp/core/ui/servicemanager.py | 11 +++++++---- openlp/core/ui/starttimeform.py | 5 +++-- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/openlp/core/lib/ui.py b/openlp/core/lib/ui.py index 013231b8c..a0686416c 100644 --- a/openlp/core/lib/ui.py +++ b/openlp/core/lib/ui.py @@ -175,7 +175,8 @@ def create_accept_reject_button_box(parent, okay=False): accept_button = QtGui.QDialogButtonBox.Save if okay: accept_button = QtGui.QDialogButtonBox.Ok - button_box.setStandardButtons(accept_button | QtGui.QDialogButtonBox.Cancel) + button_box.setStandardButtons( + accept_button | QtGui.QDialogButtonBox.Cancel) button_box.setObjectName(u'%sButtonBox' % parent) QtCore.QObject.connect(button_box, QtCore.SIGNAL(u'accepted()'), parent.accept) @@ -445,4 +446,4 @@ def find_and_set_in_combo_box(combo_box, value_to_find): if index == -1: # Not Found. index = 0 - combo_box.setCurrentIndex(index) \ No newline at end of file + combo_box.setCurrentIndex(index) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index d682f5b52..66cc61989 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -169,7 +169,8 @@ class ServiceManager(QtGui.QWidget): self.onServiceTop, shortcuts=[QtCore.Qt.Key_Home]) self.serviceManagerList.moveTop.setObjectName(u'moveTop') action_list = ActionList.get_instance() - action_list.add_category(UiStrings().Service, CategoryOrder.standardToolbar) + action_list.add_category( + UiStrings().Service, CategoryOrder.standardToolbar) action_list.add_action( self.serviceManagerList.moveTop, UiStrings().Service) self.serviceManagerList.moveUp = self.orderToolbar.addToolbarButton( @@ -179,7 +180,8 @@ class ServiceManager(QtGui.QWidget): 'Move item up one position in the service.'), self.onServiceUp, shortcuts=[QtCore.Qt.Key_PageUp]) self.serviceManagerList.moveUp.setObjectName(u'moveUp') - action_list.add_action(self.serviceManagerList.moveUp, UiStrings().Service) + action_list.add_action( + self.serviceManagerList.moveUp, UiStrings().Service) self.serviceManagerList.moveDown = self.orderToolbar.addToolbarButton( translate('OpenLP.ServiceManager', 'Move &down'), u':/services/service_down.png', @@ -231,7 +233,8 @@ class ServiceManager(QtGui.QWidget): 'Expand all the service items.'), self.onExpandAll, shortcuts=[QtCore.Qt.Key_Plus]) self.serviceManagerList.expand.setObjectName(u'expand') - action_list.add_action(self.serviceManagerList.expand, UiStrings().Service) + action_list.add_action( + self.serviceManagerList.expand, UiStrings().Service) self.serviceManagerList.collapse = self.orderToolbar.addToolbarButton( translate('OpenLP.ServiceManager', '&Collapse all'), u':/services/service_collapse_all.png', @@ -1311,4 +1314,4 @@ class ServiceManager(QtGui.QWidget): Print a Service Order Sheet. """ settingDialog = PrintServiceForm(self.mainwindow, self) - settingDialog.exec_() \ No newline at end of file + settingDialog.exec_() diff --git a/openlp/core/ui/starttimeform.py b/openlp/core/ui/starttimeform.py index b460bbbd0..956b01a9d 100644 --- a/openlp/core/ui/starttimeform.py +++ b/openlp/core/ui/starttimeform.py @@ -53,7 +53,8 @@ class StartTimeForm(QtGui.QDialog, Ui_StartTimeDialog): self.hourFinishSpinBox.setValue(hours) self.minuteFinishSpinBox.setValue(minutes) self.secondFinishSpinBox.setValue(seconds) - self.hourFinishLabel.setText(u'%s%s' % (unicode(hour), UiStrings().Hours)) + self.hourFinishLabel.setText(u'%s%s' % (unicode(hour), + UiStrings().Hours)) self.minuteFinishLabel.setText(u'%s%s' % (unicode(minutes), UiStrings().Minutes)) self.secondFinishLabel.setText(u'%s%s' % @@ -90,4 +91,4 @@ class StartTimeForm(QtGui.QDialog, Ui_StartTimeDialog): seconds -= 3600 * hours minutes = seconds / 60 seconds -= 60 * minutes - return hours, minutes, seconds \ No newline at end of file + return hours, minutes, seconds From b46aa38ce93836662c75efae5e35294dc3c53aa9 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Sat, 16 Apr 2011 00:46:24 +0200 Subject: [PATCH 89/89] Add a bit of spacing around the edges of the settings form to make it feel a little less crowded. --- openlp/core/ui/settingsdialog.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/ui/settingsdialog.py b/openlp/core/ui/settingsdialog.py index 485cb9c5f..50bcca4e2 100644 --- a/openlp/core/ui/settingsdialog.py +++ b/openlp/core/ui/settingsdialog.py @@ -37,7 +37,7 @@ class Ui_SettingsDialog(object): build_icon(u':/system/system_settings.png')) self.dialogLayout = QtGui.QGridLayout(settingsDialog) self.dialogLayout.setObjectName(u'dialogLayout') - self.dialogLayout.setMargin(0) + self.dialogLayout.setMargin(8) self.settingListWidget = QtGui.QListWidget(settingsDialog) self.settingListWidget.setUniformItemSizes(True) self.settingListWidget.setMinimumSize(QtCore.QSize(150, 0))