diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py
index 76d7c0617..f07d7c78d 100644
--- a/openlp/core/lib/__init__.py
+++ b/openlp/core/lib/__init__.py
@@ -315,10 +315,24 @@ def check_directory_exists(dir):
``dir``
Theme directory to make sure exists
"""
- log.debug(u'check_directory_exists')
+ log.debug(u'check_directory_exists %s' % dir)
if not os.path.exists(dir):
os.makedirs(dir)
+def save_cancel_button_box(parent):
+ """
+ Return a standard dialog button box with save and cancel buttons.
+ """
+ button_box = QtGui.QDialogButtonBox(parent)
+ button_box.setStandardButtons(QtGui.QDialogButtonBox.Save |
+ QtGui.QDialogButtonBox.Cancel)
+ button_box.setObjectName(u'%sButtonBox' % parent)
+ QtCore.QObject.connect(button_box, QtCore.SIGNAL(u'accepted()'),
+ parent.accept)
+ QtCore.QObject.connect(button_box, QtCore.SIGNAL(u'rejected()'),
+ parent.reject)
+ return button_box
+
from theme import ThemeLevel, ThemeXML, BackgroundGradientType, \
BackgroundType, HorizontalType, VerticalType
from displaytags import DisplayTags
diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py
index 9565a9b37..39c37e2a9 100644
--- a/openlp/core/lib/mediamanageritem.py
+++ b/openlp/core/lib/mediamanageritem.py
@@ -103,7 +103,6 @@ class MediaManagerItem(QtGui.QWidget):
self.icon = build_icon(icon)
self.toolbar = None
self.remoteTriggered = None
- self.serviceItemIconName = None
self.singleServiceItem = True
self.pageLayout = QtGui.QVBoxLayout(self)
self.pageLayout.setSpacing(0)
@@ -246,7 +245,7 @@ class MediaManagerItem(QtGui.QWidget):
preview_string[u'title'],
preview_string[u'tooltip'],
u':/general/general_preview.png', self.onPreviewClick)
- ## Live Button ##
+ ## Live Button ##
live_string = self.plugin.getString(StringContent.Live)
self.addToolbarButton(
live_string[u'title'],
@@ -508,7 +507,7 @@ class MediaManagerItem(QtGui.QWidget):
'No Service Item Selected'),
translate('OpenLP.MediaManagerItem',
'You must select an existing service item to add to.'))
- elif self.title.lower() == serviceItem.name.lower():
+ elif self.plugin.name.lower() == serviceItem.name.lower():
self.generateSlideData(serviceItem)
self.parent.serviceManager.addServiceItem(serviceItem,
replace=True)
@@ -525,10 +524,7 @@ class MediaManagerItem(QtGui.QWidget):
Common method for generating a service item
"""
serviceItem = ServiceItem(self.parent)
- if self.serviceItemIconName:
- serviceItem.add_icon(self.serviceItemIconName)
- else:
- serviceItem.add_icon(self.parent.icon_path)
+ serviceItem.add_icon(self.parent.icon_path)
if self.generateSlideData(serviceItem, item, xmlVersion):
return serviceItem
else:
@@ -540,3 +536,25 @@ class MediaManagerItem(QtGui.QWidget):
individual service items need to be processed by the plugins
"""
pass
+
+ def _getIdOfItemToGenerate(self, item, remoteItem):
+ """
+ Utility method to check items being submitted for slide generation.
+
+ ``item``
+ The item to check.
+
+ ``remoteItem``
+ The id to assign if the slide generation was remotely triggered.
+ """
+ if item is None:
+ if self.remoteTriggered is None:
+ item = self.listView.currentItem()
+ if item is None:
+ return False
+ item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0]
+ else:
+ item_id = remoteItem
+ else:
+ item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0]
+ return item_id
diff --git a/openlp/core/lib/plugin.py b/openlp/core/lib/plugin.py
index 5a3fa41ce..8b12004d3 100644
--- a/openlp/core/lib/plugin.py
+++ b/openlp/core/lib/plugin.py
@@ -42,6 +42,7 @@ class PluginStatus(object):
Inactive = 0
Disabled = -1
+
class StringContent(object):
Name = u'name'
Import = u'import'
@@ -54,6 +55,7 @@ class StringContent(object):
Service = u'service'
VisibleName = u'visible_name'
+
class Plugin(QtCore.QObject):
"""
Base class for openlp plugins to inherit from.
diff --git a/openlp/core/lib/searchedit.py b/openlp/core/lib/searchedit.py
index c69e1f15b..5e12dcefd 100644
--- a/openlp/core/lib/searchedit.py
+++ b/openlp/core/lib/searchedit.py
@@ -93,15 +93,15 @@ class SearchEdit(QtGui.QLineEdit):
``event``
The event that happened.
"""
- sz = self.clearButton.size()
+ size = self.clearButton.size()
frameWidth = self.style().pixelMetric(
QtGui.QStyle.PM_DefaultFrameWidth)
- self.clearButton.move(self.rect().right() - frameWidth - sz.width(),
- (self.rect().bottom() + 1 - sz.height()) / 2)
+ self.clearButton.move(self.rect().right() - frameWidth - size.width(),
+ (self.rect().bottom() + 1 - size.height()) / 2)
if hasattr(self, u'menuButton'):
- sz = self.menuButton.size()
+ size = self.menuButton.size()
self.menuButton.move(self.rect().left() + frameWidth + 2,
- (self.rect().bottom() + 1 - sz.height()) / 2)
+ (self.rect().bottom() + 1 - size.height()) / 2)
def currentSearchType(self):
"""
diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py
index 276563eba..c74b89144 100644
--- a/openlp/core/lib/serviceitem.py
+++ b/openlp/core/lib/serviceitem.py
@@ -59,6 +59,7 @@ class ItemCapabilities(object):
OnLoadUpdate = 8
AddIfNewItem = 9
ProvidesOwnDisplay = 10
+ AllowsDetailedTitleDisplay = 11
class ServiceItem(object):
@@ -314,6 +315,20 @@ class ServiceItem(object):
path, text_image[u'title'], text_image[u'image'] )
self._new_item()
+ def get_display_title(self):
+ """
+ Returns the title of the service item.
+ """
+ if self.is_text():
+ return self.title
+ else:
+ if ItemCapabilities.AllowsDetailedTitleDisplay in self.capabilities:
+ return self._raw_frames[0][u'title']
+ elif len(self._raw_frames) > 1:
+ return self.title
+ else:
+ return self._raw_frames[0][u'title']
+
def merge(self, other):
"""
Updates the _uuid with the value from the original one
diff --git a/openlp/core/lib/theme.py b/openlp/core/lib/theme.py
index 70517b34d..d119f19ff 100644
--- a/openlp/core/lib/theme.py
+++ b/openlp/core/lib/theme.py
@@ -91,21 +91,30 @@ class ThemeLevel(object):
Song = 3
class BackgroundType(object):
+ """
+ Type enumeration for backgrounds.
+ """
Solid = 0
Gradient = 1
Image = 2
@staticmethod
- def to_string(type):
- if type == BackgroundType.Solid:
+ def to_string(background_type):
+ """
+ Return a string representation of a background type.
+ """
+ if background_type == BackgroundType.Solid:
return u'solid'
- elif type == BackgroundType.Gradient:
+ elif background_type == BackgroundType.Gradient:
return u'gradient'
- elif type == BackgroundType.Image:
+ elif background_type == BackgroundType.Image:
return u'image'
@staticmethod
def from_string(type_string):
+ """
+ Return a background type for the given string.
+ """
if type_string == u'solid':
return BackgroundType.Solid
elif type_string == u'gradient':
@@ -114,6 +123,9 @@ class BackgroundType(object):
return BackgroundType.Image
class BackgroundGradientType(object):
+ """
+ Type enumeration for background gradients.
+ """
Horizontal = 0
Vertical = 1
Circular = 2
@@ -121,20 +133,26 @@ class BackgroundGradientType(object):
LeftBottom = 4
@staticmethod
- def to_string(type):
- if type == BackgroundGradientType.Horizontal:
+ def to_string(gradient_type):
+ """
+ Return a string representation of a background gradient type.
+ """
+ if gradient_type == BackgroundGradientType.Horizontal:
return u'horizontal'
- elif type == BackgroundGradientType.Vertical:
+ elif gradient_type == BackgroundGradientType.Vertical:
return u'vertical'
- elif type == BackgroundGradientType.Circular:
+ elif gradient_type == BackgroundGradientType.Circular:
return u'circular'
- elif type == BackgroundGradientType.LeftTop:
+ elif gradient_type == BackgroundGradientType.LeftTop:
return u'leftTop'
- elif type == BackgroundGradientType.LeftBottom:
+ elif gradient_type == BackgroundGradientType.LeftBottom:
return u'leftBottom'
@staticmethod
def from_string(type_string):
+ """
+ Return a background gradient type for the given string.
+ """
if type_string == u'horizontal':
return BackgroundGradientType.Horizontal
elif type_string == u'vertical':
@@ -147,19 +165,25 @@ class BackgroundGradientType(object):
return BackgroundGradientType.LeftBottom
class HorizontalType(object):
+ """
+ Type enumeration for horizontal alignment.
+ """
Left = 0
Center = 1
Right = 2
class VerticalType(object):
+ """
+ Type enumeration for vertical alignment.
+ """
Top = 0
Middle = 1
Bottom = 2
-boolean_list = [u'italics', u'override', u'outline', u'shadow',
+BOOLEAN_LIST = [u'bold', u'italics', u'override', u'outline', u'shadow',
u'slide_transition']
-integer_list = [u'size', u'line_adjustment', u'x', u'height', u'y',
+INTEGER_LIST = [u'size', u'line_adjustment', u'x', u'height', u'y',
u'width', u'shadow_size', u'outline_size', u'horizontal_align',
u'vertical_align', u'wrap_style']
@@ -514,9 +538,9 @@ class ThemeXML(object):
return
field = self._de_hump(element)
tag = master + u'_' + field
- if field in boolean_list:
+ if field in BOOLEAN_LIST:
setattr(self, tag, str_to_bool(value))
- elif field in integer_list:
+ elif field in INTEGER_LIST:
setattr(self, tag, int(value))
else:
# make string value unicode
diff --git a/openlp/core/lib/toolbar.py b/openlp/core/lib/toolbar.py
index f2c7f1b0d..b1aa3d96f 100644
--- a/openlp/core/lib/toolbar.py
+++ b/openlp/core/lib/toolbar.py
@@ -73,13 +73,13 @@ class OpenLPToolbar(QtGui.QToolBar):
``checkable``
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
-
+
``context``
Specify the context in which this shortcut is valid
"""
diff --git a/openlp/core/ui/advancedtab.py b/openlp/core/ui/advancedtab.py
index 58b637bc2..f68131894 100644
--- a/openlp/core/ui/advancedtab.py
+++ b/openlp/core/ui/advancedtab.py
@@ -80,6 +80,16 @@ class AdvancedTab(SettingsTab):
self.hideMouseCheckBox.setObjectName(u'hideMouseCheckBox')
self.hideMouseLayout.addWidget(self.hideMouseCheckBox)
self.leftLayout.addWidget(self.hideMouseGroupBox)
+ self.serviceOrderGroupBox = QtGui.QGroupBox(self.leftColumn)
+ self.serviceOrderGroupBox.setObjectName(u'serviceOrderGroupBox')
+ self.serviceOrderLayout = QtGui.QVBoxLayout(self.serviceOrderGroupBox)
+ self.serviceOrderLayout.setObjectName(u'serviceOrderLayout')
+ self.detailedServicePrintCheckBox = QtGui.QCheckBox(
+ self.serviceOrderGroupBox)
+ self.detailedServicePrintCheckBox.setObjectName(
+ u'detailedServicePrintCheckBox')
+ self.serviceOrderLayout.addWidget(self.detailedServicePrintCheckBox)
+ self.leftLayout.addWidget(self.serviceOrderGroupBox)
# self.sharedDirGroupBox = QtGui.QGroupBox(self.leftColumn)
# self.sharedDirGroupBox.setObjectName(u'sharedDirGroupBox')
# self.sharedDirLayout = QtGui.QFormLayout(self.sharedDirGroupBox)
@@ -129,6 +139,11 @@ class AdvancedTab(SettingsTab):
'Mouse Cursor'))
self.hideMouseCheckBox.setText(translate('OpenLP.AdvancedTab',
'Hide the mouse cursor when moved over the display window'))
+ self.serviceOrderGroupBox.setTitle(translate('OpenLP.AdvancedTab',
+ 'Service Order Print'))
+ self.detailedServicePrintCheckBox.setText(
+ translate('OpenLP.AdvancedTab',
+ 'Print slide texts and service item notes as well'))
# self.sharedDirGroupBox.setTitle(
# translate('AdvancedTab', 'Central Data Store'))
# self.sharedCheckBox.setText(
@@ -164,6 +179,8 @@ class AdvancedTab(SettingsTab):
QtCore.QVariant(True)).toBool())
self.hideMouseCheckBox.setChecked(
settings.value(u'hide mouse', QtCore.QVariant(False)).toBool())
+ self.detailedServicePrintCheckBox.setChecked(settings.value(
+ u'detailed service print', QtCore.QVariant(False)).toBool())
settings.endGroup()
def save(self):
@@ -184,6 +201,8 @@ class AdvancedTab(SettingsTab):
QtCore.QVariant(self.enableAutoCloseCheckBox.isChecked()))
settings.setValue(u'hide mouse',
QtCore.QVariant(self.hideMouseCheckBox.isChecked()))
+ settings.setValue(u'detailed service print',
+ QtCore.QVariant(self.detailedServicePrintCheckBox.isChecked()))
settings.endGroup()
# def onSharedCheckBoxChanged(self, checked):
diff --git a/openlp/core/ui/generaltab.py b/openlp/core/ui/generaltab.py
index edace883f..12353fed8 100644
--- a/openlp/core/ui/generaltab.py
+++ b/openlp/core/ui/generaltab.py
@@ -51,6 +51,7 @@ class ValidEdit(QtGui.QLineEdit):
else:
return self.text()
+
class GeneralTab(SettingsTab):
"""
GeneralTab is the general settings tab in the settings dialog.
diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py
index d8bedade3..6f57861c4 100644
--- a/openlp/core/ui/mainwindow.py
+++ b/openlp/core/ui/mainwindow.py
@@ -87,10 +87,10 @@ class Ui_MainWindow(object):
self.screens, True)
previewVisible = QtCore.QSettings().value(
u'user interface/preview panel', QtCore.QVariant(True)).toBool()
- self.previewController.Panel.setVisible(previewVisible)
+ self.previewController.panel.setVisible(previewVisible)
liveVisible = QtCore.QSettings().value(u'user interface/live panel',
QtCore.QVariant(True)).toBool()
- self.liveController.Panel.setVisible(liveVisible)
+ self.liveController.panel.setVisible(liveVisible)
# Create menu
self.MenuBar = QtGui.QMenuBar(mainWindow)
self.MenuBar.setObjectName(u'MenuBar')
@@ -175,6 +175,10 @@ class Ui_MainWindow(object):
self.FileSaveAsItem = QtGui.QAction(mainWindow)
self.FileSaveAsItem.setObjectName(u'FileSaveAsItem')
mainWindow.actionList.add_action(self.FileSaveAsItem, u'File')
+ self.printServiceOrderItem = QtGui.QAction(mainWindow)
+ self.printServiceOrderItem.setObjectName(u'printServiceItem')
+ mainWindow.actionList.add_action(
+ self.printServiceOrderItem, u'Print Service Order')
self.FileExitItem = QtGui.QAction(mainWindow)
self.FileExitItem.setIcon(build_icon(u':/system/system_exit.png'))
self.FileExitItem.setObjectName(u'FileExitItem')
@@ -302,8 +306,8 @@ class Ui_MainWindow(object):
(self.ExportThemeItem, self.ExportLanguageItem))
self.FileMenuActions = (self.FileNewItem, self.FileOpenItem,
self.FileSaveItem, self.FileSaveAsItem, None,
- self.FileImportMenu.menuAction(), self.FileExportMenu.menuAction(),
- self.FileExitItem)
+ self.printServiceOrderItem, None, self.FileImportMenu.menuAction(),
+ self.FileExportMenu.menuAction(), self.FileExitItem)
add_actions(self.ViewModeMenu, (self.ModeDefaultItem,
self.ModeSetupItem, self.ModeLiveItem))
add_actions(self.ViewMenu, (self.ViewModeMenu.menuAction(),
@@ -381,6 +385,12 @@ class Ui_MainWindow(object):
'Save the current service under a new name.'))
self.FileSaveAsItem.setShortcut(
translate('OpenLP.MainWindow', 'Ctrl+Shift+S'))
+ self.printServiceOrderItem.setText(
+ translate('OpenLP.MainWindow', 'Print Service Order'))
+ 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(
@@ -567,6 +577,9 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
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
QtCore.QObject.connect(self.AutoLanguageItem,
QtCore.SIGNAL(u'toggled(bool)'), self.setAutoLanguage)
@@ -758,34 +771,29 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
"""
Put OpenLP into "Default" view mode.
"""
- settings = QtCore.QSettings()
- settings.setValue(u'%s/view mode' % self.generalSettingsSection,
- u'default')
- self.setViewMode(True, True, True, True, True)
+ self.setViewMode(True, True, True, True, True, u'default')
def onModeSetupItemClicked(self):
"""
Put OpenLP into "Setup" view mode.
"""
- settings = QtCore.QSettings()
- settings.setValue(u'%s/view mode' % self.generalSettingsSection,
- u'setup')
- self.setViewMode(True, True, False, True, False)
+ self.setViewMode(True, True, False, True, False, u'setup')
def onModeLiveItemClicked(self):
"""
Put OpenLP into "Live" view mode.
"""
- settings = QtCore.QSettings()
- settings.setValue(u'%s/view mode' % self.generalSettingsSection,
- u'live')
- self.setViewMode(False, True, False, False, True)
+ self.setViewMode(False, True, False, False, True, u'live')
def setViewMode(self, media=True, service=True, theme=True, preview=True,
- live=True):
+ live=True, mode=u''):
"""
Set OpenLP to a different view mode.
"""
+ if mode:
+ settings = QtCore.QSettings()
+ settings.setValue(u'%s/view mode' % self.generalSettingsSection,
+ mode)
self.MediaManagerDock.setVisible(media)
self.ServiceManagerDock.setVisible(service)
self.ThemeManagerDock.setVisible(theme)
@@ -926,7 +934,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
True - Visible
False - Hidden
"""
- self.previewController.Panel.setVisible(visible)
+ self.previewController.panel.setVisible(visible)
QtCore.QSettings().setValue(u'user interface/preview panel',
QtCore.QVariant(visible))
self.ViewPreviewPanel.setChecked(visible)
@@ -941,7 +949,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
True - Visible
False - Hidden
"""
- self.liveController.Panel.setVisible(visible)
+ self.liveController.panel.setVisible(visible)
QtCore.QSettings().setValue(u'user interface/live panel',
QtCore.QVariant(visible))
self.ViewLivePanel.setChecked(visible)
diff --git a/openlp/core/ui/serviceitemeditdialog.py b/openlp/core/ui/serviceitemeditdialog.py
index 3e1079ded..0993c48b2 100644
--- a/openlp/core/ui/serviceitemeditdialog.py
+++ b/openlp/core/ui/serviceitemeditdialog.py
@@ -26,7 +26,7 @@
from PyQt4 import QtCore, QtGui
-from openlp.core.lib import translate, build_icon
+from openlp.core.lib import translate, build_icon, save_cancel_button_box
class Ui_ServiceItemEditDialog(object):
def setupUi(self, serviceItemEditDialog):
@@ -52,12 +52,8 @@ class Ui_ServiceItemEditDialog(object):
self.downButton.setObjectName(u'downButton')
self.buttonLayout.addWidget(self.downButton)
self.dialogLayout.addLayout(self.buttonLayout, 0, 1)
- self.buttonBox = QtGui.QDialogButtonBox(serviceItemEditDialog)
- self.buttonBox.setStandardButtons(
- QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Save)
- self.buttonBox.setObjectName(u'buttonBox')
- self.dialogLayout.addWidget(self.buttonBox, 1, 0, 1, 2)
-
+ self.dialogLayout.addWidget(
+ save_cancel_button_box(serviceItemEditDialog), 1, 0, 1, 2)
self.retranslateUi(serviceItemEditDialog)
QtCore.QMetaObject.connectSlotsByName(serviceItemEditDialog)
diff --git a/openlp/core/ui/serviceitemeditform.py b/openlp/core/ui/serviceitemeditform.py
index edd4ee29f..0621a44bd 100644
--- a/openlp/core/ui/serviceitemeditform.py
+++ b/openlp/core/ui/serviceitemeditform.py
@@ -46,10 +46,6 @@ class ServiceItemEditForm(QtGui.QDialog, Ui_ServiceItemEditDialog):
QtCore.SIGNAL(u'clicked()'), self.onItemDown)
QtCore.QObject.connect(self.deleteButton,
QtCore.SIGNAL(u'clicked()'), self.onItemDelete)
- QtCore.QObject.connect(self.buttonBox,
- QtCore.SIGNAL(u'accepted()'), self.accept)
- QtCore.QObject.connect(self.buttonBox,
- QtCore.SIGNAL(u'rejected()'), self.reject)
QtCore.QObject.connect(self.listWidget,
QtCore.SIGNAL(u'currentRowChanged(int)'), self.onCurrentRowChanged)
@@ -100,27 +96,30 @@ class ServiceItemEditForm(QtGui.QDialog, Ui_ServiceItemEditDialog):
"""
Move the current row up in the list.
"""
- item = self.listWidget.currentItem()
- if not item:
- return
- row = self.listWidget.row(item)
- temp = self.itemList[row]
- self.itemList.remove(self.itemList[row])
- self.itemList.insert(row - 1, temp)
- self.loadData()
- self.listWidget.setCurrentRow(row - 1)
+ self.__moveItem(u'up')
def onItemDown(self):
"""
Move the current row down in the list
"""
+ self.__moveItem(u'down')
+
+ def __moveItem(self, direction=u''):
+ """
+ Move the current item.
+ """
+ if not direction:
+ return
item = self.listWidget.currentItem()
if not item:
return
row = self.listWidget.row(item)
temp = self.itemList[row]
self.itemList.remove(self.itemList[row])
- self.itemList.insert(row + 1, temp)
+ if direction == u'up':
+ self.itemList.insert(row - 1, temp)
+ else:
+ self.itemList.insert(row + 1, temp)
self.loadData()
self.listWidget.setCurrentRow(row + 1)
diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py
index 7f1d6493e..9082c7a80 100644
--- a/openlp/core/ui/servicemanager.py
+++ b/openlp/core/ui/servicemanager.py
@@ -178,8 +178,8 @@ class ServiceManager(QtGui.QWidget):
translate('OpenLP.ServiceManager', 'Move &down'),
None,
translate('OpenLP.ServiceManager',
- 'Moves the selection up the window.'),
- self.onMoveSelectionDown, shortcut=QtCore.Qt.Key_Up)
+ 'Moves the selection down the window.'),
+ self.onMoveSelectionDown, shortcut=QtCore.Qt.Key_Down)
self.serviceManagerList.down.setVisible(False)
self.serviceManagerList.up = self.orderToolbar.addToolbarButton(
translate('OpenLP.ServiceManager', 'Move up'),
@@ -526,7 +526,7 @@ class ServiceManager(QtGui.QWidget):
'File is not a valid service.'))
log.exception(u'File contains no service data')
except (IOError, NameError):
- log.exception(u'Problem loading a service file')
+ log.exception(u'Problem loading service file %s' % fileName)
finally:
if fileTo:
fileTo.close()
@@ -833,7 +833,7 @@ class ServiceManager(QtGui.QWidget):
else:
treewidgetitem.setIcon(0,
build_icon(u':/general/general_delete.png'))
- treewidgetitem.setText(0, serviceitem.title)
+ treewidgetitem.setText(0, serviceitem.get_display_title())
treewidgetitem.setToolTip(0, serviceitem.notes)
treewidgetitem.setData(0, QtCore.Qt.UserRole,
QtCore.QVariant(item[u'order']))
@@ -856,7 +856,7 @@ class ServiceManager(QtGui.QWidget):
one it allows the item to be displayed.
"""
if serviceItem.is_command():
- type = serviceItem._raw_frames[0][u'title'].split(u'.')[1]
+ type = serviceItem._raw_frames[0][u'title'].split(u'.')[-1]
if type not in self.suffixes:
serviceItem.is_valid = False
@@ -1176,9 +1176,52 @@ class ServiceManager(QtGui.QWidget):
for item in self.serviceItems:
service_item = item[u'service_item']
data_item = {}
- data_item[u'title'] = unicode(service_item.title)
+ data_item[u'title'] = unicode(service_item.get_display_title())
data_item[u'plugin'] = unicode(service_item.name)
data_item[u'notes'] = unicode(service_item.notes)
data_item[u'selected'] = (item == curitem)
data.append(data_item)
Receiver.send_message(u'servicemanager_list_response', data)
+
+ def printServiceOrder(self):
+ """
+ Print a Service Order Sheet.
+ """
+ if not self.serviceItems:
+ criticalErrorMessageBox(
+ message=translate('OpenLP.ServiceManager',
+ 'There is no service item in this service.'))
+ return
+ printDialog = QtGui.QPrintDialog()
+ if not printDialog.exec_():
+ return
+ text = u'
%s
' % translate('OpenLP.ServiceManager',
+ 'Service Order Sheet')
+ for item in self.serviceItems:
+ item = item[u'service_item']
+ # add the title
+ text += u'
%s
' % (item.icon,
+ item.get_display_title())
+ if not QtCore.QSettings().value(u'advanced' +
+ u'/detailed service print', QtCore.QVariant(True)).toBool():
+ continue
+ if item.is_text():
+ # Add the text of the service item.
+ for slide in item.get_frames():
+ text += u'' + slide[u'text'] + u'
'
+ elif item.is_image():
+ # Add the image names of the service item.
+ text += u''
+ for slide in range(len(item.get_frames())):
+ text += u'%s
' % item.get_frame_title(slide)
+ text += u'
'
+ if item.foot_text:
+ # add footer
+ text += u'%s
' % item.foot_text
+ if item.notes:
+ # add notes
+ text += u'%s %s
' % (translate(
+ 'OpenLP.ServiceManager', 'Notes:'), item.notes)
+ serviceDocument = QtGui.QTextDocument()
+ serviceDocument.setHtml(text)
+ serviceDocument.print_(printDialog.printer())
diff --git a/openlp/core/ui/servicenotedialog.py b/openlp/core/ui/servicenotedialog.py
deleted file mode 100644
index 9a45dae7c..000000000
--- a/openlp/core/ui/servicenotedialog.py
+++ /dev/null
@@ -1,48 +0,0 @@
-# -*- coding: utf-8 -*-
-# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
-
-###############################################################################
-# OpenLP - Open Source Lyrics Projection #
-# --------------------------------------------------------------------------- #
-# Copyright (c) 2008-2011 Raoul Snyman #
-# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael #
-# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian #
-# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, #
-# Carsten Tinggaard, Frode Woldsund #
-# --------------------------------------------------------------------------- #
-# This program is free software; you can redistribute it and/or modify it #
-# under the terms of the GNU General Public License as published by the Free #
-# Software Foundation; version 2 of the License. #
-# #
-# This program is distributed in the hope that it will be useful, but WITHOUT #
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
-# more details. #
-# #
-# You should have received a copy of the GNU General Public License along #
-# with this program; if not, write to the Free Software Foundation, Inc., 59 #
-# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
-###############################################################################
-
-from PyQt4 import QtCore, QtGui
-from openlp.core.lib import translate
-
-class Ui_ServiceNoteEdit(object):
- def setupUi(self, serviceNoteEdit):
- serviceNoteEdit.setObjectName(u'serviceNoteEdit')
- self.dialogLayout = QtGui.QVBoxLayout(serviceNoteEdit)
- self.dialogLayout.setObjectName(u'verticalLayout')
- self.textEdit = QtGui.QTextEdit(serviceNoteEdit)
- self.textEdit.setObjectName(u'textEdit')
- self.dialogLayout.addWidget(self.textEdit)
- self.buttonBox = QtGui.QDialogButtonBox(serviceNoteEdit)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel |
- QtGui.QDialogButtonBox.Save)
- self.buttonBox.setObjectName(u'buttonBox')
- self.dialogLayout.addWidget(self.buttonBox)
- self.retranslateUi(serviceNoteEdit)
- QtCore.QMetaObject.connectSlotsByName(serviceNoteEdit)
-
- def retranslateUi(self, serviceNoteEdit):
- serviceNoteEdit.setWindowTitle(
- translate('OpenLP.ServiceNoteForm', 'Service Item Notes'))
diff --git a/openlp/core/ui/servicenoteform.py b/openlp/core/ui/servicenoteform.py
index de689e842..5cb68d03f 100644
--- a/openlp/core/ui/servicenoteform.py
+++ b/openlp/core/ui/servicenoteform.py
@@ -26,9 +26,9 @@
from PyQt4 import QtCore, QtGui
-from servicenotedialog import Ui_ServiceNoteEdit
+from openlp.core.lib import save_cancel_button_box, translate
-class ServiceNoteForm(QtGui.QDialog, Ui_ServiceNoteEdit):
+class ServiceNoteForm(QtGui.QDialog):
"""
This is the form that is used to edit the verses of the song.
"""
@@ -37,8 +37,19 @@ class ServiceNoteForm(QtGui.QDialog, Ui_ServiceNoteEdit):
Constructor
"""
QtGui.QDialog.__init__(self, parent)
- self.setupUi(self)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'accepted()'),
- self.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'rejected()'),
- self.reject)
\ No newline at end of file
+ self.setupUi()
+ self.retranslateUi()
+
+ def setupUi(self):
+ self.setObjectName(u'serviceNoteEdit')
+ self.dialogLayout = QtGui.QVBoxLayout(self)
+ self.dialogLayout.setObjectName(u'verticalLayout')
+ self.textEdit = QtGui.QTextEdit(self)
+ self.textEdit.setObjectName(u'textEdit')
+ self.dialogLayout.addWidget(self.textEdit)
+ self.dialogLayout.addWidget(save_cancel_button_box(self))
+ QtCore.QMetaObject.connectSlotsByName(self)
+
+ def retranslateUi(self):
+ self.setWindowTitle(
+ translate('OpenLP.ServiceNoteForm', 'Service Item Notes'))
diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py
index 7266d197c..ab8a656ff 100644
--- a/openlp/core/ui/slidecontroller.py
+++ b/openlp/core/ui/slidecontroller.py
@@ -77,14 +77,14 @@ class SlideController(QtGui.QWidget):
self.selectedRow = 0
self.serviceItem = None
self.alertTab = None
- self.Panel = QtGui.QWidget(parent.ControlSplitter)
+ self.panel = QtGui.QWidget(parent.ControlSplitter)
self.slideList = {}
# Layout for holding panel
- self.panelLayout = QtGui.QVBoxLayout(self.Panel)
+ self.panelLayout = QtGui.QVBoxLayout(self.panel)
self.panelLayout.setSpacing(0)
self.panelLayout.setMargin(0)
# Type label for the top of the slide controller
- self.typeLabel = QtGui.QLabel(self.Panel)
+ self.typeLabel = QtGui.QLabel(self.panel)
if self.isLive:
self.typeLabel.setText(translate('OpenLP.SlideController', 'Live'))
self.split = 1
@@ -98,7 +98,7 @@ class SlideController(QtGui.QWidget):
self.typeLabel.setAlignment(QtCore.Qt.AlignCenter)
self.panelLayout.addWidget(self.typeLabel)
# Splitter
- self.splitter = QtGui.QSplitter(self.Panel)
+ self.splitter = QtGui.QSplitter(self.panel)
self.splitter.setOrientation(QtCore.Qt.Vertical)
self.panelLayout.addWidget(self.splitter)
# Actual controller section
@@ -119,6 +119,8 @@ class SlideController(QtGui.QWidget):
self.previewListWidget.isLive = self.isLive
self.previewListWidget.setObjectName(u'PreviewListWidget')
self.previewListWidget.setSelectionBehavior(1)
+ self.previewListWidget.setSelectionMode(
+ QtGui.QAbstractItemView.SingleSelection)
self.previewListWidget.setEditTriggers(
QtGui.QAbstractItemView.NoEditTriggers)
self.previewListWidget.setHorizontalScrollBarPolicy(
@@ -183,13 +185,13 @@ class SlideController(QtGui.QWidget):
u'Stop Loop', u':/media/media_stop.png',
translate('OpenLP.SlideController', 'Stop continuous loop'),
self.onStopLoop)
- self.DelaySpinBox = QtGui.QSpinBox()
- self.DelaySpinBox.setMinimum(1)
- self.DelaySpinBox.setMaximum(180)
- self.toolbar.addToolbarWidget(u'Image SpinBox', self.DelaySpinBox)
- self.DelaySpinBox.setSuffix(translate('OpenLP.SlideController',
+ self.delaySpinBox = QtGui.QSpinBox()
+ self.delaySpinBox.setMinimum(1)
+ self.delaySpinBox.setMaximum(180)
+ self.toolbar.addToolbarWidget(u'Image SpinBox', self.delaySpinBox)
+ self.delaySpinBox.setSuffix(translate('OpenLP.SlideController',
's'))
- self.DelaySpinBox.setToolTip(translate('OpenLP.SlideController',
+ self.delaySpinBox.setToolTip(translate('OpenLP.SlideController',
'Delay between slides in seconds'))
else:
self.toolbar.addToolbarSeparator(u'Close Separator')
@@ -480,18 +482,11 @@ class SlideController(QtGui.QWidget):
def onSongBarHandler(self):
request = unicode(self.sender().text())
slideno = self.slideList[request]
- if slideno > self.previewListWidget.rowCount():
- self.previewListWidget.selectRow(
- self.previewListWidget.rowCount() - 1)
- else:
- if slideno + 1 < self.previewListWidget.rowCount():
- self.previewListWidget.scrollToItem(
- self.previewListWidget.item(slideno + 1, 0))
- self.previewListWidget.selectRow(slideno)
+ self.__updatePreviewSelection(slideno)
self.onSlideSelected()
def receiveSpinDelay(self, value):
- self.DelaySpinBox.setValue(int(value))
+ self.delaySpinBox.setValue(int(value))
def enableToolBar(self, item):
"""
@@ -663,14 +658,7 @@ class SlideController(QtGui.QWidget):
self.previewListWidget.resizeRowsToContents()
self.previewListWidget.setColumnWidth(0,
self.previewListWidget.viewport().size().width())
- if slideno > self.previewListWidget.rowCount():
- self.previewListWidget.selectRow(
- self.previewListWidget.rowCount() - 1)
- else:
- if slideno + 1 < self.previewListWidget.rowCount():
- self.previewListWidget.scrollToItem(
- self.previewListWidget.item(slideno + 1, 0))
- self.previewListWidget.selectRow(slideno)
+ self.__updatePreviewSelection(slideno)
self.enableToolBar(serviceItem)
# Pass to display for viewing
self.display.buildHtml(self.serviceItem)
@@ -681,6 +669,19 @@ class SlideController(QtGui.QWidget):
Receiver.send_message(u'slidecontroller_%s_started' % self.typePrefix,
[serviceItem])
+ def __updatePreviewSelection(self, slideno):
+ """
+ Utility method to update the selected slide in the list.
+ """
+ if slideno > self.previewListWidget.rowCount():
+ self.previewListWidget.selectRow(
+ self.previewListWidget.rowCount() - 1)
+ else:
+ if slideno + 1 < self.previewListWidget.rowCount():
+ self.previewListWidget.scrollToItem(
+ self.previewListWidget.item(slideno + 1, 0))
+ self.previewListWidget.selectRow(slideno)
+
def onTextRequest(self):
"""
Return the text for the current item in controller
@@ -997,7 +998,7 @@ class SlideController(QtGui.QWidget):
"""
if self.previewListWidget.rowCount() > 1:
self.timer_id = self.startTimer(
- int(self.DelaySpinBox.value()) * 1000)
+ int(self.delaySpinBox.value()) * 1000)
self.toolbar.actions[u'Stop Loop'].setVisible(True)
self.toolbar.actions[u'Start Loop'].setVisible(False)
diff --git a/openlp/core/ui/themeform.py b/openlp/core/ui/themeform.py
index 43f1034f4..8d10f21fa 100644
--- a/openlp/core/ui/themeform.py
+++ b/openlp/core/ui/themeform.py
@@ -272,14 +272,18 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard):
def onMainPositionCheckBoxStateChanged(self, value):
"""
Change state as Main Area Position check box changed
+ NOTE the font_main_override is the inverse of the check box value
"""
- self.theme.font_main_override = (value == QtCore.Qt.Checked)
+ if self.updateThemeAllowed:
+ self.theme.font_main_override = not (value == QtCore.Qt.Checked)
def onFooterPositionCheckBoxStateChanged(self, value):
"""
Change state as Footer Area Position check box changed
+ NOTE the font_footer_override is the inverse of the check box value
"""
- self.theme.font_footer_override = (value == QtCore.Qt.Checked)
+ if self.updateThemeAllowed:
+ self.theme.font_footer_override = not (value == QtCore.Qt.Checked)
def exec_(self, edit=False):
"""
diff --git a/openlp/core/ui/themestab.py b/openlp/core/ui/themestab.py
index a440a564e..441b95155 100644
--- a/openlp/core/ui/themestab.py
+++ b/openlp/core/ui/themestab.py
@@ -165,13 +165,7 @@ class ThemesTab(SettingsTab):
self.global_theme = unicode(self.DefaultComboBox.currentText())
self.parent.renderManager.set_global_theme(
self.global_theme, self.theme_level)
- image = self.parent.ThemeManagerContents.getPreviewImage(
- self.global_theme)
- preview = QtGui.QPixmap(unicode(image))
- if not preview.isNull():
- preview = preview.scaled(300, 255, QtCore.Qt.KeepAspectRatio,
- QtCore.Qt.SmoothTransformation)
- self.DefaultListView.setPixmap(preview)
+ self.__previewGlobalTheme()
def updateThemeList(self, theme_list):
"""
@@ -198,10 +192,16 @@ class ThemesTab(SettingsTab):
self.parent.renderManager.set_global_theme(
self.global_theme, self.theme_level)
if self.global_theme is not u'':
- image = self.parent.ThemeManagerContents.getPreviewImage(
- self.global_theme)
- preview = QtGui.QPixmap(unicode(image))
- if not preview.isNull():
- preview = preview.scaled(300, 255, QtCore.Qt.KeepAspectRatio,
- QtCore.Qt.SmoothTransformation)
- self.DefaultListView.setPixmap(preview)
+ self.__previewGlobalTheme()
+
+ def __previewGlobalTheme(self):
+ """
+ Utility method to update the global theme preview image.
+ """
+ image = self.parent.ThemeManagerContents.getPreviewImage(
+ self.global_theme)
+ preview = QtGui.QPixmap(unicode(image))
+ if not preview.isNull():
+ preview = preview.scaled(300, 255, QtCore.Qt.KeepAspectRatio,
+ QtCore.Qt.SmoothTransformation)
+ self.DefaultListView.setPixmap(preview)
diff --git a/openlp/core/ui/themewizard.py b/openlp/core/ui/themewizard.py
index 50e8109c5..fe5305454 100644
--- a/openlp/core/ui/themewizard.py
+++ b/openlp/core/ui/themewizard.py
@@ -27,32 +27,17 @@
from PyQt4 import QtCore, QtGui
from openlp.core.lib import translate, build_icon
+from openlp.core.ui.wizard import addWelcomePage
class Ui_ThemeWizard(object):
- def setupUi(self, ThemeWizard):
- ThemeWizard.setObjectName(u'OpenLP.ThemeWizard')
- ThemeWizard.setModal(True)
- ThemeWizard.setWizardStyle(QtGui.QWizard.ModernStyle)
- ThemeWizard.setOptions(
- QtGui.QWizard.IndependentPages |
+ def setupUi(self, themeWizard):
+ themeWizard.setObjectName(u'OpenLP.ThemeWizard')
+ themeWizard.setModal(True)
+ themeWizard.setWizardStyle(QtGui.QWizard.ModernStyle)
+ themeWizard.setOptions(QtGui.QWizard.IndependentPages |
QtGui.QWizard.NoBackButtonOnStartPage)
# Welcome Page
- self.welcomePage = QtGui.QWizardPage()
- self.welcomePage.setPixmap(QtGui.QWizard.WatermarkPixmap,
- QtGui.QPixmap(u':/wizards/wizard_createtheme.bmp'))
- self.welcomePage.setObjectName(u'WelcomePage')
- self.welcomeLayout = QtGui.QVBoxLayout(self.welcomePage)
- self.welcomeLayout.setObjectName(u'WelcomeLayout')
- self.titleLabel = QtGui.QLabel(self.welcomePage)
- self.titleLabel.setObjectName(u'TitleLabel')
- self.welcomeLayout.addWidget(self.titleLabel)
- self.welcomeLayout.addSpacing(40)
- self.informationLabel = QtGui.QLabel(self.welcomePage)
- self.informationLabel.setWordWrap(True)
- self.informationLabel.setObjectName(u'InformationLabel')
- self.welcomeLayout.addWidget(self.informationLabel)
- self.welcomeLayout.addStretch()
- ThemeWizard.addPage(self.welcomePage)
+ addWelcomePage(themeWizard, u':/wizards/wizard_createtheme.bmp')
# Background Page
self.backgroundPage = QtGui.QWizardPage()
self.backgroundPage.setObjectName(u'BackgroundPage')
@@ -142,7 +127,7 @@ class Ui_ThemeWizard(object):
self.imageSpacer)
self.backgroundStack.addWidget(self.imageWidget)
self.backgroundLayout.addLayout(self.backgroundStack)
- ThemeWizard.addPage(self.backgroundPage)
+ themeWizard.addPage(self.backgroundPage)
# Main Area Page
self.mainAreaPage = QtGui.QWizardPage()
self.mainAreaPage.setObjectName(u'MainAreaPage')
@@ -225,7 +210,7 @@ class Ui_ThemeWizard(object):
self.shadowSizeSpinBox.setObjectName(u'ShadowSizeSpinBox')
self.shadowLayout.addWidget(self.shadowSizeSpinBox)
self.mainAreaLayout.addRow(self.shadowCheckBox, self.shadowLayout)
- ThemeWizard.addPage(self.mainAreaPage)
+ themeWizard.addPage(self.mainAreaPage)
# Footer Area Page
self.footerAreaPage = QtGui.QWizardPage()
self.footerAreaPage.setObjectName(u'FooterAreaPage')
@@ -251,7 +236,7 @@ class Ui_ThemeWizard(object):
self.footerSizeSpinBox.setObjectName(u'FooterSizeSpinBox')
self.footerAreaLayout.addRow(self.footerSizeLabel,
self.footerSizeSpinBox)
- ThemeWizard.addPage(self.footerAreaPage)
+ themeWizard.addPage(self.footerAreaPage)
# Alignment Page
self.alignmentPage = QtGui.QWizardPage()
self.alignmentPage.setObjectName(u'AlignmentPage')
@@ -276,7 +261,7 @@ class Ui_ThemeWizard(object):
self.transitionsCheckBox.setObjectName(u'TransitionsCheckBox')
self.alignmentLayout.addRow(self.transitionsLabel,
self.transitionsCheckBox)
- ThemeWizard.addPage(self.alignmentPage)
+ themeWizard.addPage(self.alignmentPage)
# Area Position Page
self.areaPositionPage = QtGui.QWizardPage()
self.areaPositionPage.setObjectName(u'AreaPositionPage')
@@ -352,7 +337,7 @@ class Ui_ThemeWizard(object):
self.footerPositionLayout.addRow(self.footerHeightLabel,
self.footerHeightSpinBox)
self.areaPositionLayout.addWidget(self.footerPositionGroupBox)
- ThemeWizard.addPage(self.areaPositionPage)
+ themeWizard.addPage(self.areaPositionPage)
# Preview Page
self.previewPage = QtGui.QWizardPage()
self.previewPage.setObjectName(u'PreviewPage')
@@ -381,9 +366,8 @@ class Ui_ThemeWizard(object):
self.previewBoxLabel.setObjectName(u'PreviewBoxLabel')
self.previewAreaLayout.addWidget(self.previewBoxLabel)
self.previewLayout.addWidget(self.previewArea)
- ThemeWizard.addPage(self.previewPage)
-
- self.retranslateUi(ThemeWizard)
+ themeWizard.addPage(self.previewPage)
+ self.retranslateUi(themeWizard)
QtCore.QObject.connect(self.backgroundComboBox,
QtCore.SIGNAL(u'currentIndexChanged(int)'), self.backgroundStack,
QtCore.SLOT(u'setCurrentIndex(int)'))
@@ -423,10 +407,10 @@ class Ui_ThemeWizard(object):
QtCore.QObject.connect(self.footerPositionCheckBox,
QtCore.SIGNAL(u'toggled(bool)'), self.footerHeightSpinBox,
QtCore.SLOT(u'setDisabled(bool)'))
- QtCore.QMetaObject.connectSlotsByName(ThemeWizard)
+ QtCore.QMetaObject.connectSlotsByName(themeWizard)
- def retranslateUi(self, ThemeWizard):
- ThemeWizard.setWindowTitle(
+ def retranslateUi(self, themeWizard):
+ themeWizard.setWindowTitle(
translate('OpenLP.ThemeWizard', 'Theme Wizard'))
self.titleLabel.setText(
u'%s' % \
diff --git a/openlp/core/ui/wizard.py b/openlp/core/ui/wizard.py
index d3a0255b4..f57253d0e 100644
--- a/openlp/core/ui/wizard.py
+++ b/openlp/core/ui/wizard.py
@@ -63,36 +63,12 @@ class OpenLPWizard(QtGui.QWizard):
self.setOptions(QtGui.QWizard.IndependentPages |
QtGui.QWizard.NoBackButtonOnStartPage |
QtGui.QWizard.NoBackButtonOnLastPage)
- self.addWelcomePage(image)
+ addWelcomePage(self, image)
self.addCustomPages()
self.addProgressPage()
self.retranslateUi()
QtCore.QMetaObject.connectSlotsByName(self)
- def addWelcomePage(self, image):
- """
- Add the opening welcome page to the wizard.
-
- ``image``
- A splash image for the wizard
- """
- self.welcomePage = QtGui.QWizardPage()
- self.welcomePage.setPixmap(QtGui.QWizard.WatermarkPixmap,
- QtGui.QPixmap(image))
- self.welcomePage.setObjectName(u'WelcomePage')
- self.welcomeLayout = QtGui.QVBoxLayout(self.welcomePage)
- self.welcomeLayout.setObjectName(u'WelcomeLayout')
- self.titleLabel = QtGui.QLabel(self.welcomePage)
- self.titleLabel.setObjectName(u'TitleLabel')
- self.welcomeLayout.addWidget(self.titleLabel)
- self.welcomeLayout.addSpacing(40)
- self.informationLabel = QtGui.QLabel(self.welcomePage)
- self.informationLabel.setWordWrap(True)
- self.informationLabel.setObjectName(u'InformationLabel')
- self.welcomeLayout.addWidget(self.informationLabel)
- self.welcomeLayout.addStretch()
- self.addPage(self.welcomePage)
-
def addProgressPage(self):
"""
Add the progress page for the wizard. This page informs the user how
@@ -169,3 +145,27 @@ class OpenLPWizard(QtGui.QWizard):
self.finishButton.setVisible(True)
self.cancelButton.setVisible(False)
Receiver.send_message(u'openlp_process_events')
+
+def addWelcomePage(parent, image):
+ """
+ Generate an opening welcome page for a wizard using a provided image.
+
+ ``image``
+ A splash image for the wizard.
+ """
+ parent.welcomePage = QtGui.QWizardPage()
+ parent.welcomePage.setPixmap(QtGui.QWizard.WatermarkPixmap,
+ QtGui.QPixmap(image))
+ parent.welcomePage.setObjectName(u'WelcomePage')
+ parent.welcomeLayout = QtGui.QVBoxLayout(parent.welcomePage)
+ parent.welcomeLayout.setObjectName(u'WelcomeLayout')
+ parent.titleLabel = QtGui.QLabel(parent.welcomePage)
+ parent.titleLabel.setObjectName(u'TitleLabel')
+ parent.welcomeLayout.addWidget(parent.titleLabel)
+ parent.welcomeLayout.addSpacing(40)
+ parent.informationLabel = QtGui.QLabel(parent.welcomePage)
+ parent.informationLabel.setWordWrap(True)
+ parent.informationLabel.setObjectName(u'InformationLabel')
+ parent.welcomeLayout.addWidget(parent.informationLabel)
+ parent.welcomeLayout.addStretch()
+ parent.addPage(parent.welcomePage)
diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py
index d3f41804b..3e43d19aa 100644
--- a/openlp/plugins/bibles/forms/bibleimportform.py
+++ b/openlp/plugins/bibles/forms/bibleimportform.py
@@ -124,9 +124,12 @@ class BibleImportForm(OpenLPWizard):
QtCore.QObject.connect(self.osisBrowseButton,
QtCore.SIGNAL(u'clicked()'),
self.onOsisBrowseButtonClicked)
+ QtCore.QObject.connect(self.csvTestamentsButton,
+ QtCore.SIGNAL(u'clicked()'),
+ self.onCsvTestamentsBrowseButtonClicked)
QtCore.QObject.connect(self.csvBooksButton,
QtCore.SIGNAL(u'clicked()'),
- self.onBooksBrowseButtonClicked)
+ self.onCsvBooksBrowseButtonClicked)
QtCore.QObject.connect(self.csvVersesButton,
QtCore.SIGNAL(u'clicked()'),
self.onCsvVersesBrowseButtonClicked)
@@ -187,6 +190,18 @@ class BibleImportForm(OpenLPWizard):
self.csvLayout = QtGui.QFormLayout(self.csvWidget)
self.csvLayout.setMargin(0)
self.csvLayout.setObjectName(u'CsvLayout')
+ self.csvTestamentsLabel = QtGui.QLabel(self.csvWidget)
+ self.csvTestamentsLabel.setObjectName(u'CsvTestamentsLabel')
+ self.csvTestamentsLayout = QtGui.QHBoxLayout()
+ self.csvTestamentsLayout.setObjectName(u'CsvTestamentsLayout')
+ self.csvTestamentsEdit = QtGui.QLineEdit(self.csvWidget)
+ self.csvTestamentsEdit.setObjectName(u'CsvTestamentsEdit')
+ self.csvTestamentsLayout.addWidget(self.csvTestamentsEdit)
+ self.csvTestamentsButton = QtGui.QToolButton(self.csvWidget)
+ self.csvTestamentsButton.setIcon(self.openIcon)
+ self.csvTestamentsButton.setObjectName(u'CsvTestamentsButton')
+ self.csvTestamentsLayout.addWidget(self.csvTestamentsButton)
+ self.csvLayout.addRow(self.csvTestamentsLabel, self.csvTestamentsLayout)
self.csvBooksLabel = QtGui.QLabel(self.csvWidget)
self.csvBooksLabel.setObjectName(u'CsvBooksLabel')
self.csvBooksLayout = QtGui.QHBoxLayout()
@@ -213,7 +228,7 @@ class BibleImportForm(OpenLPWizard):
self.csvLayout.addRow(self.csvVersesLabel, self.csvVersesLayout)
self.csvSpacer = QtGui.QSpacerItem(10, 0, QtGui.QSizePolicy.Fixed,
QtGui.QSizePolicy.Minimum)
- self.csvLayout.setItem(2, QtGui.QFormLayout.LabelRole, self.csvSpacer)
+ self.csvLayout.setItem(3, QtGui.QFormLayout.LabelRole, self.csvSpacer)
self.selectStack.addWidget(self.csvWidget)
self.openSongWidget = QtGui.QWidget(self.selectPage)
self.openSongWidget.setObjectName(u'OpenSongWidget')
@@ -389,6 +404,8 @@ class BibleImportForm(OpenLPWizard):
translate('BiblesPlugin.ImportWizardForm', 'File location:'))
self.osisFileLabel.setText(
translate('BiblesPlugin.ImportWizardForm', 'File location:'))
+ self.csvTestamentsLabel.setText(
+ translate('BiblesPlugin.ImportWizardForm', 'Testaments location:'))
self.csvBooksLabel.setText(
translate('BiblesPlugin.ImportWizardForm', 'Books location:'))
self.csvVersesLabel.setText(
@@ -478,7 +495,16 @@ class BibleImportForm(OpenLPWizard):
self.osisFileEdit.setFocus()
return False
elif self.field(u'source_format').toInt()[0] == BibleFormat.CSV:
- if not self.field(u'csv_booksfile').toString():
+ if not self.field(u'csv_testamentsfile').toString():
+ answer = criticalErrorMessageBox(translate(
+ 'BiblesPlugin.ImportWizardForm', 'No Testaments File'),
+ translate('BiblesPlugin.ImportWizardForm',
+ 'You have not specified a testaments file. Do you '
+ 'want to proceed with the import?'), question=True)
+ if answer == QtGui.QMessageBox.No:
+ self.csvTestamentsEdit.setFocus()
+ return False
+ elif not self.field(u'csv_booksfile').toString():
criticalErrorMessageBox(
translate('BiblesPlugin.ImportWizardForm',
'Invalid Books File'),
@@ -572,7 +598,15 @@ class BibleImportForm(OpenLPWizard):
translate('BiblesPlugin.ImportWizardForm', 'Open OSIS File'),
self.osisFileEdit)
- def onBooksBrowseButtonClicked(self):
+ def onCsvTestamentsBrowseButtonClicked(self):
+ """
+ Show the file open dialog for the testaments CSV file.
+ """
+ self.getFileName(translate('BiblesPlugin.ImportWizardForm',
+ 'Open Testaments CSV File'), self.csvTestamentsEdit, u'%s (*.csv)'
+ % translate('BiblesPlugin.ImportWizardForm', 'CSV File'))
+
+ def onCsvBooksBrowseButtonClicked(self):
"""
Show the file open dialog for the books CSV file.
"""
@@ -613,12 +647,14 @@ class BibleImportForm(OpenLPWizard):
"""
self.selectPage.registerField(u'source_format', self.formatComboBox)
self.selectPage.registerField(u'osis_location', self.osisFileEdit)
+ self.selectPage.registerField(
+ u'csv_testamentsfile', self.csvTestamentsEdit)
self.selectPage.registerField(u'csv_booksfile', self.csvBooksEdit)
self.selectPage.registerField(u'csv_versefile', self.csvVersesEdit)
self.selectPage.registerField(u'opensong_file', self.openSongFileEdit)
self.selectPage.registerField(u'web_location', self.webSourceComboBox)
- self.selectPage.registerField(u'web_biblename',
- self.webTranslationComboBox)
+ self.selectPage.registerField(
+ u'web_biblename', self.webTranslationComboBox)
self.selectPage.registerField(u'proxy_server', self.webServerEdit)
self.selectPage.registerField(u'proxy_username', self.webUserEdit)
self.selectPage.registerField(u'proxy_password', self.webPasswordEdit)
@@ -641,6 +677,7 @@ class BibleImportForm(OpenLPWizard):
self.cancelButton.setVisible(True)
self.setField(u'source_format', QtCore.QVariant(0))
self.setField(u'osis_location', QtCore.QVariant(''))
+ self.setField(u'csv_testamentsfile', QtCore.QVariant(''))
self.setField(u'csv_booksfile', QtCore.QVariant(''))
self.setField(u'csv_versefile', QtCore.QVariant(''))
self.setField(u'opensong_file', QtCore.QVariant(''))
@@ -770,7 +807,8 @@ class BibleImportForm(OpenLPWizard):
elif bible_type == BibleFormat.CSV:
# Import a CSV bible.
importer = self.manager.import_bible(BibleFormat.CSV,
- name=license_version,
+ name=license_version, testamentsfile=unicode(
+ self.field(u'csv_testamentsfile').toString()),
booksfile=unicode(self.field(u'csv_booksfile').toString()),
versefile=unicode(self.field(u'csv_versefile').toString())
)
@@ -795,8 +833,7 @@ class BibleImportForm(OpenLPWizard):
bible = \
self.web_bible_list[WebDownload.Bibleserver][bible_version]
importer = self.manager.import_bible(
- BibleFormat.WebDownload,
- name=license_version,
+ BibleFormat.WebDownload, name=license_version,
download_source=WebDownload.get_name(download_location),
download_name=bible,
proxy_server=unicode(self.field(u'proxy_server').toString()),
diff --git a/openlp/plugins/bibles/lib/csvbible.py b/openlp/plugins/bibles/lib/csvbible.py
index 8959167a6..82872e15b 100644
--- a/openlp/plugins/bibles/lib/csvbible.py
+++ b/openlp/plugins/bibles/lib/csvbible.py
@@ -23,7 +23,48 @@
# with this program; if not, write to the Free Software Foundation, Inc., 59 #
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
###############################################################################
+"""
+The :mod:`cvsbible` modules provides a facility to import bibles from a set of
+CSV files.
+The module expects two mandatory files containing the books and the verses and
+will accept an optional third file containing the testaments.
+
+The format of the testament file is:
+
+ ,
+
+ For example:
+
+ 1,Old Testament
+ 2,New Testament
+
+The format of the books file is:
+
+ ,,,
+
+ For example
+
+ 1,1,Genesis,Gen
+ 2,1,Exodus,Exod
+ ...
+ 40,2,Matthew,Matt
+
+There are two acceptable formats of the verses file. They are:
+
+ ,,,
+ or
+ ,,,
+
+ For example:
+
+ 1,1,1,"In the beginning God created the heaven and the earth."
+ or
+ "Genesis",1,2,"And the earth was without form, and void; and...."
+
+All CSV files are expected to use a comma (',') as the delimeter and double
+quotes ('"') as the quote symbol.
+"""
import logging
import chardet
import csv
@@ -31,7 +72,7 @@ import csv
from PyQt4 import QtCore
from openlp.core.lib import Receiver, translate
-from openlp.plugins.bibles.lib.db import BibleDB
+from openlp.plugins.bibles.lib.db import BibleDB, Testament
log = logging.getLogger(__name__)
@@ -39,68 +80,120 @@ class CSVBible(BibleDB):
"""
This class provides a specialisation for importing of CSV Bibles.
"""
-
def __init__(self, parent, **kwargs):
"""
- Loads a Bible from a pair of CVS files passed in
+ Loads a Bible from a set of CVS files.
This class assumes the files contain all the information and
a clean bible is being loaded.
"""
log.info(self.__class__.__name__)
BibleDB.__init__(self, parent, **kwargs)
+ try:
+ self.testamentsfile = kwargs[u'testamentsfile']
+ except KeyError:
+ self.testamentsfile = None
self.booksfile = kwargs[u'booksfile']
self.versesfile = kwargs[u'versefile']
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'openlp_stop_wizard'), self.stop_import)
+ def setup_testaments(self):
+ """
+ Overrides parent method so we can handle importing a testament file.
+ """
+ if self.testamentsfile:
+ self.wizard.progressBar.setMinimum(0)
+ self.wizard.progressBar.setMaximum(2)
+ self.wizard.progressBar.setValue(0)
+ testaments_file = None
+ try:
+ details = get_file_encoding(self.testamentsfile)
+ testaments_file = open(self.testamentsfile, 'rb')
+ testaments_reader = csv.reader(testaments_file, delimiter=',',
+ quotechar='"')
+ for line in testaments_reader:
+ if self.stop_import_flag:
+ break
+ self.wizard.incrementProgressBar(unicode(
+ translate('BibleDB.Wizard',
+ 'Importing testaments... %s')) %
+ unicode(line[1], details['encoding']), 0)
+ self.save_object(Testament.populate(
+ name=unicode(line[1], details['encoding'])))
+ Receiver.send_message(u'openlp_process_events')
+ except (IOError, IndexError):
+ log.exception(u'Loading testaments from file failed')
+ finally:
+ if testaments_file:
+ testaments_file.close()
+ self.wizard.incrementProgressBar(unicode(translate(
+ 'BibleDB.Wizard', 'Importing testaments... done.')), 2)
+ else:
+ BibleDB.setup_testaments(self)
+
def do_import(self):
+ """
+ Import the bible books and verses.
+ """
+ self.wizard.progressBar.setValue(0)
+ self.wizard.progressBar.setMinimum(0)
+ self.wizard.progressBar.setMaximum(66)
success = True
books_file = None
- book_ptr = None
- verse_file = None
+ book_list = {}
# Populate the Tables
try:
+ details = get_file_encoding(self.booksfile)
books_file = open(self.booksfile, 'r')
- dialect = csv.Sniffer().sniff(books_file.read(1024))
- books_file.seek(0)
- books_reader = csv.reader(books_file, dialect)
+ books_reader = csv.reader(books_file, delimiter=',', quotechar='"')
for line in books_reader:
- # cancel pressed
if self.stop_import_flag:
break
- details = chardet.detect(line[1])
- self.create_book(unicode(line[1], details['encoding']),
- line[2], int(line[0]))
- Receiver.send_message(u'openlp_process_events')
+ self.wizard.incrementProgressBar(unicode(
+ translate('BibleDB.Wizard', 'Importing books... %s')) %
+ unicode(line[2], details['encoding']))
+ self.create_book(unicode(line[2], details['encoding']),
+ unicode(line[3], details['encoding']), int(line[1]))
+ book_list[int(line[0])] = unicode(line[2], details['encoding'])
+ Receiver.send_message(u'openlp_process_events')
except (IOError, IndexError):
log.exception(u'Loading books from file failed')
success = False
finally:
if books_file:
books_file.close()
- if not success:
+ if self.stop_import_flag or not success:
return False
+ self.wizard.progressBar.setValue(0)
+ self.wizard.progressBar.setMaximum(67)
+ verse_file = None
try:
- verse_file = open(self.versesfile, 'r')
- dialect = csv.Sniffer().sniff(verse_file.read(1024))
- verse_file.seek(0)
- verse_reader = csv.reader(verse_file, dialect)
+ book_ptr = None
+ details = get_file_encoding(self.versesfile)
+ verse_file = open(self.versesfile, 'rb')
+ verse_reader = csv.reader(verse_file, delimiter=',', quotechar='"')
for line in verse_reader:
if self.stop_import_flag:
- # cancel pressed
break
- details = chardet.detect(line[3])
- if book_ptr != line[0]:
- book = self.get_book(line[0])
+ try:
+ line_book = book_list[int(line[0])]
+ except ValueError:
+ line_book = unicode(line[0], details['encoding'])
+ if book_ptr != line_book:
+ book = self.get_book(line_book)
book_ptr = book.name
self.wizard.incrementProgressBar(unicode(translate(
- 'BiblesPlugin.CSVImport', 'Importing %s %s...',
- 'Importing ...')) %
- (book.name, int(line[1])))
+ 'BibleDB.Wizard', 'Importing verses from %s...',
+ 'Importing verses from ...')) % book.name)
self.session.commit()
- self.create_verse(book.id, line[1], line[2],
- unicode(line[3], details['encoding']))
- Receiver.send_message(u'openlp_process_events')
+ try:
+ verse_text = unicode(line[3], details['encoding'])
+ except UnicodeError:
+ verse_text = unicode(line[3], u'cp1252')
+ self.create_verse(book.id, line[1], line[2], verse_text)
+ self.wizard.incrementProgressBar(translate('BibleDB.Wizard',
+ 'Importing verses... done.'))
+ Receiver.send_message(u'openlp_process_events')
self.session.commit()
except IOError:
log.exception(u'Loading verses from file failed')
@@ -112,3 +205,18 @@ class CSVBible(BibleDB):
return False
else:
return success
+
+def get_file_encoding(filename):
+ """
+ Utility function to get the file encoding.
+ """
+ detect_file = None
+ try:
+ detect_file = open(filename, 'r')
+ details = chardet.detect(detect_file.read(1024))
+ except IOError:
+ log.exception(u'Error detecting file encoding')
+ finally:
+ if detect_file:
+ detect_file.close()
+ return details
diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py
index f442a9cd6..a9444d88b 100644
--- a/openlp/plugins/bibles/lib/db.py
+++ b/openlp/plugins/bibles/lib/db.py
@@ -206,10 +206,16 @@ class BibleDB(QtCore.QObject, Manager):
"""
self.wizard = wizard
self.create_meta(u'dbversion', u'2')
+ self.setup_testaments()
+ return self.name
+
+ def setup_testaments(self):
+ """
+ Initialise the testaments section of a bible with suitable defaults.
+ """
self.save_object(Testament.populate(name=u'Old Testament'))
self.save_object(Testament.populate(name=u'New Testament'))
self.save_object(Testament.populate(name=u'Apocrypha'))
- return self.name
def create_book(self, name, abbrev, testament=1):
"""
diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py
index b844bbe61..e004be9df 100644
--- a/openlp/plugins/bibles/lib/http.py
+++ b/openlp/plugins/bibles/lib/http.py
@@ -210,7 +210,8 @@ class BGExtract(object):
cleaner = [(re.compile(' |
|\'\+\''), lambda match: '')]
soup = get_soup_for_bible_ref(
u'http://www.biblegateway.com/passage/?%s' % url_params,
- cleaner=cleaner)
+ pre_parse_regex=r'', pre_parse_substitute='',
+ cleaner=cleaner)
if not soup:
return None
Receiver.send_message(u'openlp_process_events')
@@ -499,7 +500,8 @@ class HTTPBible(BibleDB):
"""
return HTTPBooks.get_verse_count(book, chapter)
-def get_soup_for_bible_ref(reference_url, header=None, cleaner=None):
+def get_soup_for_bible_ref(reference_url, header=None, pre_parse_regex=None,
+ pre_parse_substitute=None, cleaner=None):
"""
Gets a webpage and returns a parsed and optionally cleaned soup or None.
@@ -509,6 +511,13 @@ def get_soup_for_bible_ref(reference_url, header=None, cleaner=None):
``header``
An optional HTTP header to pass to the bible web server.
+ ``pre_parse_regex``
+ A regular expression to run on the webpage. Allows manipulation of the
+ webpage before passing to BeautifulSoup for parsing.
+
+ ``pre_parse_substitute``
+ The text to replace any matches to the regular expression with.
+
``cleaner``
An optional regex to use during webpage parsing.
"""
@@ -518,12 +527,15 @@ def get_soup_for_bible_ref(reference_url, header=None, cleaner=None):
if not page:
send_error_message(u'download')
return None
+ page_source = page.read()
+ if pre_parse_regex and pre_parse_substitute is not None:
+ page_source = re.sub(pre_parse_regex, pre_parse_substitute, page_source)
soup = None
try:
if cleaner:
- soup = BeautifulSoup(page, markupMassage=cleaner)
+ soup = BeautifulSoup(page_source, markupMassage=cleaner)
else:
- soup = BeautifulSoup(page)
+ soup = BeautifulSoup(page_source)
except HTMLParseError:
log.exception(u'BeautifulSoup could not parse the bible page.')
if not soup:
diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py
index f5e7b3966..de2649b31 100644
--- a/openlp/plugins/bibles/lib/mediaitem.py
+++ b/openlp/plugins/bibles/lib/mediaitem.py
@@ -254,9 +254,6 @@ class BibleMediaItem(MediaManagerItem):
QtCore.QObject.connect(self.quickSearchEdit,
QtCore.SIGNAL(u'returnPressed()'), self.onQuickSearchButton)
- def addListViewToToolBar(self):
- MediaManagerItem.addListViewToToolBar(self)
-
def configUpdated(self):
log.debug(u'configUpdated')
if QtCore.QSettings().value(self.settingsSection + u'/second bibles',
@@ -528,19 +525,7 @@ class BibleMediaItem(MediaManagerItem):
if self.advancedClearComboBox.currentIndex() == 0:
self.listView.clear()
if self.listView.count() != 0:
- # Check if the first item is a second bible item or not.
- bitem = self.listView.item(0)
- item_second_bible = self._decodeQtObject(bitem, 'second_bible')
- if item_second_bible and second_bible or not item_second_bible and \
- not second_bible:
- self.displayResults(bible, second_bible)
- elif criticalErrorMessageBox(
- message=translate('BiblePlugin.MediaItem',
- 'You cannot combine single and second bible verses. Do you '
- 'want to delete your search results and start a new search?'),
- parent=self, question=True) == QtGui.QMessageBox.Yes:
- self.listView.clear()
- self.displayResults(bible, second_bible)
+ self.__checkSecondBible(bible, second_bible)
else:
self.displayResults(bible, second_bible)
Receiver.send_message(u'cursor_normal')
@@ -580,24 +565,29 @@ class BibleMediaItem(MediaManagerItem):
if self.quickClearComboBox.currentIndex() == 0:
self.listView.clear()
if self.listView.count() != 0 and self.search_results:
- bitem = self.listView.item(0)
- item_second_bible = self._decodeQtObject(bitem, 'second_bible')
- if item_second_bible and second_bible or not item_second_bible and \
- not second_bible:
- self.displayResults(bible, second_bible)
- elif criticalErrorMessageBox(
- message=translate('BiblePlugin.MediaItem',
- 'You cannot combine single and second bible verses. Do you '
- 'want to delete your search results and start a new search?'),
- parent=self, question=True) == QtGui.QMessageBox.Yes:
- self.listView.clear()
- self.displayResults(bible, second_bible)
+ self.__checkSecondBible(bible, second_bible)
elif self.search_results:
self.displayResults(bible, second_bible)
self.quickSearchButton.setEnabled(True)
Receiver.send_message(u'cursor_normal')
Receiver.send_message(u'openlp_process_events')
+ def __checkSecondBible(self, bible, second_bible):
+ """
+ Check if the first item is a second bible item or not.
+ """
+ bitem = self.listView.item(0)
+ item_second_bible = self._decodeQtObject(bitem, 'second_bible')
+ if item_second_bible and second_bible or not item_second_bible and \
+ not second_bible:
+ self.displayResults(bible, second_bible)
+ elif criticalErrorMessageBox(message=translate('BiblePlugin.MediaItem',
+ 'You cannot combine single and second bible verses. Do you '
+ 'want to delete your search results and start a new search?'),
+ parent=self, question=True) == QtGui.QMessageBox.Yes:
+ self.listView.clear()
+ self.displayResults(bible, second_bible)
+
def displayResults(self, bible, second_bible=u''):
"""
Displays the search results in the media manager. All data needed for
diff --git a/openlp/plugins/custom/forms/editcustomdialog.py b/openlp/plugins/custom/forms/editcustomdialog.py
index d778b1dfe..3d5e3a3f7 100644
--- a/openlp/plugins/custom/forms/editcustomdialog.py
+++ b/openlp/plugins/custom/forms/editcustomdialog.py
@@ -26,7 +26,7 @@
from PyQt4 import QtCore, QtGui
-from openlp.core.lib import build_icon, translate
+from openlp.core.lib import build_icon, translate, save_cancel_button_box
class Ui_CustomEditDialog(object):
def setupUi(self, customEditDialog):
@@ -93,16 +93,9 @@ class Ui_CustomEditDialog(object):
self.creditLabel.setBuddy(self.creditEdit)
self.bottomFormLayout.addRow(self.creditLabel, self.creditEdit)
self.dialogLayout.addLayout(self.bottomFormLayout)
- self.buttonBox = QtGui.QDialogButtonBox(customEditDialog)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel |
- QtGui.QDialogButtonBox.Save)
- self.buttonBox.setObjectName(u'buttonBox')
+ self.buttonBox = save_cancel_button_box(customEditDialog)
self.dialogLayout.addWidget(self.buttonBox)
self.retranslateUi(customEditDialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'accepted()'),
- customEditDialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'rejected()'),
- customEditDialog.closePressed)
QtCore.QMetaObject.connectSlotsByName(customEditDialog)
def retranslateUi(self, customEditDialog):
diff --git a/openlp/plugins/custom/forms/editcustomform.py b/openlp/plugins/custom/forms/editcustomform.py
index ebc917e99..60b313284 100644
--- a/openlp/plugins/custom/forms/editcustomform.py
+++ b/openlp/plugins/custom/forms/editcustomform.py
@@ -136,15 +136,15 @@ class EditCustomForm(QtGui.QDialog, Ui_CustomEditDialog):
if preview:
self.previewButton.setVisible(True)
- def closePressed(self):
+ def reject(self):
Receiver.send_message(u'custom_edit_clear')
- self.close()
+ QtGui.QDialog.reject(self)
def accept(self):
log.debug(u'accept')
if self.saveCustom():
Receiver.send_message(u'custom_load_list')
- self.close()
+ QtGui.QDialog.accept(self)
def saveCustom(self):
"""
diff --git a/openlp/plugins/custom/forms/editcustomslidedialog.py b/openlp/plugins/custom/forms/editcustomslidedialog.py
index 1f4bf5b14..1325590d9 100644
--- a/openlp/plugins/custom/forms/editcustomslidedialog.py
+++ b/openlp/plugins/custom/forms/editcustomslidedialog.py
@@ -26,7 +26,7 @@
from PyQt4 import QtCore, QtGui
-from openlp.core.lib import translate, SpellTextEdit
+from openlp.core.lib import translate, SpellTextEdit, save_cancel_button_box
class Ui_CustomSlideEditDialog(object):
def setupUi(self, customSlideEditDialog):
@@ -36,20 +36,13 @@ class Ui_CustomSlideEditDialog(object):
self.slideTextEdit = SpellTextEdit(self)
self.slideTextEdit.setObjectName(u'slideTextEdit')
self.dialogLayout.addWidget(self.slideTextEdit)
- self.buttonBox = QtGui.QDialogButtonBox(customSlideEditDialog)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel |
- QtGui.QDialogButtonBox.Save)
- self.buttonBox.setObjectName(u'buttonBox')
+ self.buttonBox = save_cancel_button_box(customSlideEditDialog)
self.splitButton = QtGui.QPushButton(customSlideEditDialog)
self.splitButton.setObjectName(u'splitButton')
self.buttonBox.addButton(self.splitButton,
QtGui.QDialogButtonBox.ActionRole)
self.dialogLayout.addWidget(self.buttonBox)
self.retranslateUi(customSlideEditDialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'accepted()'),
- customSlideEditDialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'rejected()'),
- customSlideEditDialog.reject)
QtCore.QMetaObject.connectSlotsByName(customSlideEditDialog)
def retranslateUi(self, customSlideEditDialog):
diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py
index 9b8115956..ec915b0a9 100644
--- a/openlp/plugins/custom/lib/mediaitem.py
+++ b/openlp/plugins/custom/lib/mediaitem.py
@@ -146,16 +146,7 @@ class CustomMediaItem(MediaManagerItem):
raw_footer = []
slide = None
theme = None
- if item is None:
- if self.remoteTriggered is None:
- item = self.listView.currentItem()
- if item is None:
- return False
- item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0]
- else:
- item_id = self.remoteCustom
- else:
- item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0]
+ item_id = self._getIdOfItemToGenerate(item, self.remoteCustom)
service_item.add_capability(ItemCapabilities.AllowsEdit)
service_item.add_capability(ItemCapabilities.AllowsPreview)
service_item.add_capability(ItemCapabilities.AllowsLoop)
diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py
index d55735188..25d9811f1 100644
--- a/openlp/plugins/images/lib/mediaitem.py
+++ b/openlp/plugins/images/lib/mediaitem.py
@@ -96,7 +96,6 @@ class ImageMediaItem(MediaManagerItem):
def addListViewToToolBar(self):
MediaManagerItem.addListViewToToolBar(self)
- self.listView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
self.listView.addAction(self.replaceAction)
def addEndHeaderBar(self):
@@ -143,7 +142,7 @@ class ImageMediaItem(MediaManagerItem):
items = self.listView.selectedIndexes()
if items:
service_item.title = unicode(
- translate('ImagePlugin.MediaItem', 'Image(s)'))
+ translate('ImagePlugin.MediaItem', 'Images'))
service_item.add_capability(ItemCapabilities.AllowsMaintain)
service_item.add_capability(ItemCapabilities.AllowsPreview)
service_item.add_capability(ItemCapabilities.AllowsLoop)
diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py
index 1b5d6b8d8..c68b11c85 100644
--- a/openlp/plugins/media/lib/mediaitem.py
+++ b/openlp/plugins/media/lib/mediaitem.py
@@ -57,7 +57,6 @@ class MediaMediaItem(MediaManagerItem):
u':/media/media_video.png').toImage()
MediaManagerItem.__init__(self, parent, self, icon)
self.singleServiceItem = False
- self.serviceItemIconName = u':/media/image_clapperboard.png'
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'video_background_replaced'),
self.videobackgroundReplaced)
@@ -84,7 +83,6 @@ class MediaMediaItem(MediaManagerItem):
def addListViewToToolBar(self):
MediaManagerItem.addListViewToToolBar(self)
- self.listView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
self.listView.addAction(self.replaceAction)
def addEndHeaderBar(self):
diff --git a/openlp/plugins/presentations/lib/mediaitem.py b/openlp/plugins/presentations/lib/mediaitem.py
index e72d97be1..43cb3dab0 100644
--- a/openlp/plugins/presentations/lib/mediaitem.py
+++ b/openlp/plugins/presentations/lib/mediaitem.py
@@ -250,6 +250,7 @@ class PresentationMediaItem(MediaManagerItem):
service_item.title = unicode(self.displayTypeComboBox.currentText())
service_item.shortname = unicode(self.displayTypeComboBox.currentText())
service_item.add_capability(ItemCapabilities.ProvidesOwnDisplay)
+ service_item.add_capability(ItemCapabilities.AllowsDetailedTitleDisplay)
shortname = service_item.shortname
if shortname:
for item in items:
diff --git a/openlp/plugins/presentations/lib/messagelistener.py b/openlp/plugins/presentations/lib/messagelistener.py
index 19abadf0d..4d926ad3d 100644
--- a/openlp/plugins/presentations/lib/messagelistener.py
+++ b/openlp/plugins/presentations/lib/messagelistener.py
@@ -116,7 +116,7 @@ class Controller(object):
def last(self):
"""
- Based on the handler passed at startup triggers the first slide
+ Based on the handler passed at startup triggers the last slide
"""
log.debug(u'Live = %s, last' % self.is_live)
if not self.is_live:
diff --git a/openlp/plugins/songs/forms/authorsdialog.py b/openlp/plugins/songs/forms/authorsdialog.py
index 6f1c7f2a4..daae83525 100644
--- a/openlp/plugins/songs/forms/authorsdialog.py
+++ b/openlp/plugins/songs/forms/authorsdialog.py
@@ -26,7 +26,7 @@
from PyQt4 import QtCore, QtGui
-from openlp.core.lib import translate
+from openlp.core.lib import translate, save_cancel_button_box
class Ui_AuthorsDialog(object):
def setupUi(self, authorsDialog):
@@ -55,17 +55,9 @@ class Ui_AuthorsDialog(object):
self.displayLabel.setBuddy(self.displayEdit)
self.authorLayout.addRow(self.displayLabel, self.displayEdit)
self.dialogLayout.addLayout(self.authorLayout)
- self.buttonBox = QtGui.QDialogButtonBox(authorsDialog)
- self.buttonBox.setStandardButtons(
- QtGui.QDialogButtonBox.Save | QtGui.QDialogButtonBox.Cancel)
- self.buttonBox.setObjectName(u'buttonBox')
- self.dialogLayout.addWidget(self.buttonBox)
+ self.dialogLayout.addWidget(save_cancel_button_box(authorsDialog))
self.retranslateUi(authorsDialog)
authorsDialog.setMaximumHeight(authorsDialog.sizeHint().height())
- QtCore.QObject.connect(self.buttonBox,
- QtCore.SIGNAL(u'accepted()'), authorsDialog.accept)
- QtCore.QObject.connect(self.buttonBox,
- QtCore.SIGNAL(u'rejected()'), authorsDialog.reject)
QtCore.QMetaObject.connectSlotsByName(authorsDialog)
def retranslateUi(self, authorsDialog):
diff --git a/openlp/plugins/songs/forms/editsongdialog.py b/openlp/plugins/songs/forms/editsongdialog.py
index 675108af7..b9b6e5baf 100644
--- a/openlp/plugins/songs/forms/editsongdialog.py
+++ b/openlp/plugins/songs/forms/editsongdialog.py
@@ -26,7 +26,7 @@
from PyQt4 import QtCore, QtGui
-from openlp.core.lib import build_icon, translate
+from openlp.core.lib import build_icon, translate, save_cancel_button_box
class Ui_EditSongDialog(object):
def setupUi(self, editSongDialog):
@@ -111,14 +111,8 @@ class Ui_EditSongDialog(object):
self.authorsLayout.setObjectName(u'authorsLayout')
self.authorAddLayout = QtGui.QHBoxLayout()
self.authorAddLayout.setObjectName(u'authorAddLayout')
- self.authorsComboBox = QtGui.QComboBox(self.authorsGroupBox)
- self.authorsComboBox.setSizeAdjustPolicy(
- QtGui.QComboBox.AdjustToMinimumContentsLength)
- self.authorsComboBox.setSizePolicy(
- QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed)
- self.authorsComboBox.setEditable(True)
- self.authorsComboBox.setInsertPolicy(QtGui.QComboBox.NoInsert)
- self.authorsComboBox.setObjectName(u'authorsComboBox')
+ self.authorsComboBox = editSongDialogComboBox(
+ self.authorsGroupBox, u'authorsComboBox')
self.authorAddLayout.addWidget(self.authorsComboBox)
self.authorAddButton = QtGui.QPushButton(self.authorsGroupBox)
self.authorAddButton.setObjectName(u'authorAddButton')
@@ -152,14 +146,8 @@ class Ui_EditSongDialog(object):
self.topicsLayout.setObjectName(u'topicsLayout')
self.topicAddLayout = QtGui.QHBoxLayout()
self.topicAddLayout.setObjectName(u'topicAddLayout')
- self.topicsComboBox = QtGui.QComboBox(self.topicsGroupBox)
- self.topicsComboBox.setSizeAdjustPolicy(
- QtGui.QComboBox.AdjustToMinimumContentsLength)
- self.topicsComboBox.setSizePolicy(
- QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed)
- self.topicsComboBox.setEditable(True)
- self.topicsComboBox.setInsertPolicy(QtGui.QComboBox.NoInsert)
- self.topicsComboBox.setObjectName(u'topicsComboBox')
+ self.topicsComboBox = editSongDialogComboBox(
+ self.topicsGroupBox, u'topicsComboBox')
self.topicAddLayout.addWidget(self.topicsComboBox)
self.topicAddButton = QtGui.QPushButton(self.topicsGroupBox)
self.topicAddButton.setObjectName(u'topicAddButton')
@@ -183,14 +171,8 @@ class Ui_EditSongDialog(object):
self.songBookLayout.setObjectName(u'songBookLayout')
self.songBookNameLabel = QtGui.QLabel(self.songBookGroupBox)
self.songBookNameLabel.setObjectName(u'songBookNameLabel')
- self.songBookComboBox = QtGui.QComboBox(self.songBookGroupBox)
- self.songBookComboBox.setSizeAdjustPolicy(
- QtGui.QComboBox.AdjustToMinimumContentsLength)
- self.songBookComboBox.setSizePolicy(
- QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed)
- self.songBookComboBox.setEditable(True)
- self.songBookComboBox.setInsertPolicy(QtGui.QComboBox.NoInsert)
- self.songBookComboBox.setObjectName(u'songBookComboBox')
+ self.songBookComboBox = editSongDialogComboBox(
+ self.songBookGroupBox, u'songBookComboBox')
self.songBookNameLabel.setBuddy(self.songBookComboBox)
self.songBookLayout.addRow(self.songBookNameLabel,
self.songBookComboBox)
@@ -215,14 +197,8 @@ class Ui_EditSongDialog(object):
self.themeGroupBox.setObjectName(u'themeGroupBox')
self.themeLayout = QtGui.QHBoxLayout(self.themeGroupBox)
self.themeLayout.setObjectName(u'themeLayout')
- self.themeComboBox = QtGui.QComboBox(self.themeGroupBox)
- self.themeComboBox.setSizeAdjustPolicy(
- QtGui.QComboBox.AdjustToMinimumContentsLength)
- self.themeComboBox.setSizePolicy(
- QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed)
- self.themeComboBox.setEditable(True)
- self.themeComboBox.setInsertPolicy(QtGui.QComboBox.NoInsert)
- self.themeComboBox.setObjectName(u'themeComboBox')
+ self.themeComboBox = editSongDialogComboBox(
+ self.themeGroupBox, u'themeComboBox')
self.themeLayout.addWidget(self.themeComboBox)
self.themeAddButton = QtGui.QPushButton(self.themeGroupBox)
self.themeAddButton.setObjectName(u'themeAddButton')
@@ -264,16 +240,9 @@ class Ui_EditSongDialog(object):
self.themeTabLayout.addWidget(self.commentsGroupBox)
self.songTabWidget.addTab(self.themeTab, u'')
self.dialogLayout.addWidget(self.songTabWidget)
- self.buttonBox = QtGui.QDialogButtonBox(editSongDialog)
- self.buttonBox.setStandardButtons(
- QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Save)
- self.buttonBox.setObjectName(u'buttonBox')
+ self.buttonBox = save_cancel_button_box(editSongDialog)
self.dialogLayout.addWidget(self.buttonBox)
self.retranslateUi(editSongDialog)
- QtCore.QObject.connect(self.buttonBox,
- QtCore.SIGNAL(u'rejected()'), editSongDialog.closePressed)
- QtCore.QObject.connect(self.buttonBox,
- QtCore.SIGNAL(u'accepted()'), editSongDialog.accept)
QtCore.QMetaObject.connectSlotsByName(editSongDialog)
def retranslateUi(self, editSongDialog):
@@ -338,3 +307,15 @@ class Ui_EditSongDialog(object):
self.songTabWidget.indexOf(self.themeTab),
translate('SongsPlugin.EditSongForm',
'Theme, Copyright Info && Comments'))
+
+def editSongDialogComboBox(parent, name):
+ """
+ Utility method to generate a standard combo box for this dialog.
+ """
+ comboBox = QtGui.QComboBox(parent)
+ comboBox.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToMinimumContentsLength)
+ comboBox.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed)
+ comboBox.setEditable(True)
+ comboBox.setInsertPolicy(QtGui.QComboBox.NoInsert)
+ comboBox.setObjectName(name)
+ return comboBox
diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py
index b36ea55e1..c3279e1a9 100644
--- a/openlp/plugins/songs/forms/editsongform.py
+++ b/openlp/plugins/songs/forms/editsongform.py
@@ -333,11 +333,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
author = Author.populate(first_name=text.rsplit(u' ', 1)[0],
last_name=text.rsplit(u' ', 1)[1], display_name=text)
self.manager.save_object(author)
- author_item = QtGui.QListWidgetItem(
- unicode(author.display_name))
- author_item.setData(QtCore.Qt.UserRole,
- QtCore.QVariant(author.id))
- self.authorsListView.addItem(author_item)
+ self.__addAuthorToList(author)
self.loadAuthors()
self.authorsComboBox.setCurrentIndex(0)
else:
@@ -351,11 +347,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
message=translate('SongsPlugin.EditSongForm',
'This author is already in the list.'))
else:
- author_item = QtGui.QListWidgetItem(unicode(
- author.display_name))
- author_item.setData(QtCore.Qt.UserRole,
- QtCore.QVariant(author.id))
- self.authorsListView.addItem(author_item)
+ self.__addAuthorToList(author)
self.authorsComboBox.setCurrentIndex(0)
else:
QtGui.QMessageBox.warning(self,
@@ -365,6 +357,14 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
'or type in a new author and click the "Add Author to '
'Song" button to add the new author.'))
+ def __addAuthorToList(self, author):
+ """
+ Add an author to the author list.
+ """
+ author_item = QtGui.QListWidgetItem(unicode(author.display_name))
+ author_item.setData(QtCore.Qt.UserRole, QtCore.QVariant(author.id))
+ self.authorsListView.addItem(author_item)
+
def onAuthorsListViewPressed(self):
if self.authorsListView.count() > 1:
self.authorRemoveButton.setEnabled(True)
@@ -648,29 +648,31 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
"""
Free up autocompletion memory on dialog exit
"""
+ log.debug (u'SongEditForm.clearCaches')
self.authors = []
self.themes = []
self.books = []
self.topics = []
- def closePressed(self):
+ def reject(self):
"""
Exit Dialog and do not save
"""
+ log.debug (u'SongEditForm.reject')
Receiver.send_message(u'songs_edit_clear')
self.clearCaches()
- self.close()
+ QtGui.QDialog.reject(self)
def accept(self):
"""
Exit Dialog and save song if valid
"""
- log.debug(u'accept')
+ log.debug(u'SongEditForm.accept')
self.clearCaches()
if self._validate_song():
self.saveSong()
Receiver.send_message(u'songs_load_list')
- self.close()
+ QtGui.QDialog.accept(self)
def saveSong(self, preview=False):
"""
diff --git a/openlp/plugins/songs/forms/editversedialog.py b/openlp/plugins/songs/forms/editversedialog.py
index 1710d8b93..d74da50d1 100644
--- a/openlp/plugins/songs/forms/editversedialog.py
+++ b/openlp/plugins/songs/forms/editversedialog.py
@@ -26,7 +26,8 @@
from PyQt4 import QtCore, QtGui
-from openlp.core.lib import build_icon, translate, SpellTextEdit
+from openlp.core.lib import build_icon, save_cancel_button_box, translate, \
+ SpellTextEdit
from openlp.plugins.songs.lib import VerseType
class Ui_EditVerseDialog(object):
@@ -59,17 +60,8 @@ class Ui_EditVerseDialog(object):
self.verseTypeLayout.addWidget(self.insertButton)
self.verseTypeLayout.addStretch()
self.dialogLayout.addLayout(self.verseTypeLayout)
- self.buttonBox = QtGui.QDialogButtonBox(editVerseDialog)
- self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel |
- QtGui.QDialogButtonBox.Save)
- self.buttonBox.setObjectName(u'buttonBox')
- self.dialogLayout.addWidget(self.buttonBox)
+ self.dialogLayout.addWidget(save_cancel_button_box(editVerseDialog))
self.retranslateUi(editVerseDialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'accepted()'),
- editVerseDialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'rejected()'),
- editVerseDialog.reject)
QtCore.QMetaObject.connectSlotsByName(editVerseDialog)
def retranslateUi(self, editVerseDialog):
diff --git a/openlp/plugins/songs/forms/songbookdialog.py b/openlp/plugins/songs/forms/songbookdialog.py
index 9b9da43bf..757a629ab 100644
--- a/openlp/plugins/songs/forms/songbookdialog.py
+++ b/openlp/plugins/songs/forms/songbookdialog.py
@@ -26,7 +26,7 @@
from PyQt4 import QtCore, QtGui
-from openlp.core.lib import translate
+from openlp.core.lib import translate, save_cancel_button_box
class Ui_SongBookDialog(object):
def setupUi(self, songBookDialog):
@@ -49,17 +49,9 @@ class Ui_SongBookDialog(object):
self.publisherLabel.setBuddy(self.publisherEdit)
self.bookLayout.addRow(self.publisherLabel, self.publisherEdit)
self.dialogLayout.addLayout(self.bookLayout)
- self.buttonBox = QtGui.QDialogButtonBox(songBookDialog)
- self.buttonBox.setStandardButtons(
- QtGui.QDialogButtonBox.Save | QtGui.QDialogButtonBox.Cancel)
- self.buttonBox.setObjectName(u'buttonBox')
- self.dialogLayout.addWidget(self.buttonBox)
+ self.dialogLayout.addWidget(save_cancel_button_box(songBookDialog))
self.retranslateUi(songBookDialog)
songBookDialog.setMaximumHeight(songBookDialog.sizeHint().height())
- QtCore.QObject.connect(self.buttonBox,
- QtCore.SIGNAL(u'accepted()'), songBookDialog.accept)
- QtCore.QObject.connect(self.buttonBox,
- QtCore.SIGNAL(u'rejected()'), songBookDialog.reject)
QtCore.QMetaObject.connectSlotsByName(songBookDialog)
def retranslateUi(self, songBookDialog):
diff --git a/openlp/plugins/songs/forms/songimportform.py b/openlp/plugins/songs/forms/songimportform.py
index 3de251462..a5b0e713a 100644
--- a/openlp/plugins/songs/forms/songimportform.py
+++ b/openlp/plugins/songs/forms/songimportform.py
@@ -165,29 +165,29 @@ class SongImportForm(OpenLPWizard):
self.formatStack = QtGui.QStackedLayout()
self.formatStack.setObjectName(u'FormatStack')
# OpenLP 2.0
- self.addSingleFileSelectItem(u'openLP2')
+ self.addFileSelectItem(u'openLP2', single_select=True)
# openlp.org 1.x
- self.addSingleFileSelectItem(u'openLP1', None, True)
+ self.addFileSelectItem(u'openLP1', None, True, True)
# OpenLyrics
- self.addMultiFileSelectItem(u'openLyrics', u'OpenLyrics', True)
+ self.addFileSelectItem(u'openLyrics', u'OpenLyrics', True)
# Open Song
- self.addMultiFileSelectItem(u'openSong', u'OpenSong')
+ self.addFileSelectItem(u'openSong', u'OpenSong')
# Words of Worship
- self.addMultiFileSelectItem(u'wordsOfWorship')
+ self.addFileSelectItem(u'wordsOfWorship')
# CCLI File import
- self.addMultiFileSelectItem(u'ccli')
+ self.addFileSelectItem(u'ccli')
# Songs of Fellowship
- self.addMultiFileSelectItem(u'songsOfFellowship', None, True)
+ self.addFileSelectItem(u'songsOfFellowship', None, True)
# Generic Document/Presentation import
- self.addMultiFileSelectItem(u'generic', None, True)
+ self.addFileSelectItem(u'generic', None, True)
# EasySlides
- self.addSingleFileSelectItem(u'easiSlides')
+ self.addFileSelectItem(u'easiSlides', single_select=True)
# EasyWorship
- self.addSingleFileSelectItem(u'ew')
+ self.addFileSelectItem(u'ew', single_select=True)
# Words of Worship
- self.addMultiFileSelectItem(u'songBeamer')
+ self.addFileSelectItem(u'songBeamer')
# Commented out for future use.
-# self.addSingleFileSelectItem(u'csv', u'CSV')
+# self.addFileSelectItem(u'csv', u'CSV', single_select=True)
self.sourceLayout.addLayout(self.formatStack)
self.addPage(self.sourcePage)
@@ -318,16 +318,6 @@ class SongImportForm(OpenLPWizard):
self.openLP2FilenameLabel.minimumSizeHint().width())
self.formatSpacer.changeSize(width, 0, QtGui.QSizePolicy.Fixed,
QtGui.QSizePolicy.Fixed)
- self.openLP2FormLabelSpacer.changeSize(width, 0,
- QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
- self.openLP1FormLabelSpacer.changeSize(width, 0,
- QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
- self.easiSlidesFormLabelSpacer.changeSize(width, 0,
- QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
- self.ewFormLabelSpacer.changeSize(width, 0, QtGui.QSizePolicy.Fixed,
- QtGui.QSizePolicy.Fixed)
-# self.csvFormLabelSpacer.changeSize(width, 0, QtGui.QSizePolicy.Fixed,
-# QtGui.QSizePolicy.Fixed)
def validateCurrentPage(self):
"""
@@ -791,52 +781,8 @@ class SongImportForm(OpenLPWizard):
translate('SongsPlugin.SongImportForm',
'Your song import failed.'))
- def addSingleFileSelectItem(self, prefix, obj_prefix=None,
- can_disable=False):
- if not obj_prefix:
- obj_prefix = prefix
- page = QtGui.QWidget()
- page.setObjectName(obj_prefix + u'Page')
- if can_disable:
- importWidget = self.disablableWidget(page, prefix, obj_prefix)
- else:
- importWidget = page
- importLayout = QtGui.QFormLayout(importWidget)
- importLayout.setMargin(0)
- if can_disable:
- importLayout.setObjectName(obj_prefix + u'ImportLayout')
- else:
- importLayout.setObjectName(obj_prefix + u'Layout')
- filenameLabel = QtGui.QLabel(importWidget)
- filenameLabel.setObjectName(obj_prefix + u'FilenameLabel')
- fileLayout = QtGui.QHBoxLayout()
- fileLayout.setObjectName(obj_prefix + u'FileLayout')
- filenameEdit = QtGui.QLineEdit(importWidget)
- filenameEdit.setObjectName(obj_prefix + u'FilenameEdit')
- fileLayout.addWidget(filenameEdit)
- browseButton = QtGui.QToolButton(importWidget)
- browseButton.setIcon(self.openIcon)
- browseButton.setObjectName(obj_prefix + u'BrowseButton')
- fileLayout.addWidget(browseButton)
- importLayout.addRow(filenameLabel, fileLayout)
- formSpacer = QtGui.QSpacerItem(10, 0, QtGui.QSizePolicy.Fixed,
- QtGui.QSizePolicy.Minimum)
- importLayout.setItem(1, QtGui.QFormLayout.LabelRole, formSpacer)
- self.formatStack.addWidget(page)
- setattr(self, prefix + u'Page', page)
- setattr(self, prefix + u'FilenameLabel', filenameLabel)
- setattr(self, prefix + u'FormLabelSpacer', formSpacer)
- setattr(self, prefix + u'FileLayout', fileLayout)
- setattr(self, prefix + u'FilenameEdit', filenameEdit)
- setattr(self, prefix + u'BrowseButton', browseButton)
- if can_disable:
- setattr(self, prefix + u'ImportLayout', importLayout)
- else:
- setattr(self, prefix + u'Layout', importLayout)
- self.formatComboBox.addItem(u'')
-
- def addMultiFileSelectItem(self, prefix, obj_prefix=None,
- can_disable=False):
+ def addFileSelectItem(self, prefix, obj_prefix=None, can_disable=False,
+ single_select=False):
if not obj_prefix:
obj_prefix = prefix
page = QtGui.QWidget()
@@ -847,37 +793,55 @@ class SongImportForm(OpenLPWizard):
importWidget = page
importLayout = QtGui.QVBoxLayout(importWidget)
importLayout.setMargin(0)
- if can_disable:
- importLayout.setObjectName(obj_prefix + u'ImportLayout')
+ importLayout.setObjectName(obj_prefix + u'ImportLayout')
+ if single_select:
+ fileLayout = QtGui.QHBoxLayout()
+ fileLayout.setObjectName(obj_prefix + u'FileLayout')
+ filenameLabel = QtGui.QLabel(importWidget)
+ filenameLabel.setObjectName(obj_prefix + u'FilenameLabel')
+ fileLayout.addWidget(filenameLabel)
+ filenameEdit = QtGui.QLineEdit(importWidget)
+ filenameEdit.setObjectName(obj_prefix + u'FilenameEdit')
+ fileLayout.addWidget(filenameEdit)
+ browseButton = QtGui.QToolButton(importWidget)
+ browseButton.setIcon(self.openIcon)
+ browseButton.setObjectName(obj_prefix + u'BrowseButton')
+ fileLayout.addWidget(browseButton)
+ formSpacer = QtGui.QSpacerItem(10, 0, QtGui.QSizePolicy.Fixed,
+ QtGui.QSizePolicy.Expanding)
+ importLayout.addLayout(fileLayout)
+ importLayout.addSpacerItem(formSpacer)
else:
- importLayout.setObjectName(obj_prefix + u'Layout')
- fileListWidget = QtGui.QListWidget(importWidget)
- fileListWidget.setSelectionMode(
- QtGui.QAbstractItemView.ExtendedSelection)
- fileListWidget.setObjectName(obj_prefix + u'FileListWidget')
- importLayout.addWidget(fileListWidget)
- buttonLayout = QtGui.QHBoxLayout()
- buttonLayout.setObjectName(obj_prefix + u'ButtonLayout')
- addButton = QtGui.QPushButton(importWidget)
- addButton.setIcon(self.openIcon)
- addButton.setObjectName(obj_prefix + u'AddButton')
- buttonLayout.addWidget(addButton)
- buttonLayout.addStretch()
- removeButton = QtGui.QPushButton(importWidget)
- removeButton.setIcon(self.deleteIcon)
- removeButton.setObjectName(obj_prefix + u'RemoveButton')
- buttonLayout.addWidget(removeButton)
- importLayout.addLayout(buttonLayout)
+ fileListWidget = QtGui.QListWidget(importWidget)
+ fileListWidget.setSelectionMode(
+ QtGui.QAbstractItemView.ExtendedSelection)
+ fileListWidget.setObjectName(obj_prefix + u'FileListWidget')
+ importLayout.addWidget(fileListWidget)
+ buttonLayout = QtGui.QHBoxLayout()
+ buttonLayout.setObjectName(obj_prefix + u'ButtonLayout')
+ addButton = QtGui.QPushButton(importWidget)
+ addButton.setIcon(self.openIcon)
+ addButton.setObjectName(obj_prefix + u'AddButton')
+ buttonLayout.addWidget(addButton)
+ buttonLayout.addStretch()
+ removeButton = QtGui.QPushButton(importWidget)
+ removeButton.setIcon(self.deleteIcon)
+ removeButton.setObjectName(obj_prefix + u'RemoveButton')
+ buttonLayout.addWidget(removeButton)
+ importLayout.addLayout(buttonLayout)
self.formatStack.addWidget(page)
setattr(self, prefix + u'Page', page)
- setattr(self, prefix + u'FileListWidget', fileListWidget)
- setattr(self, prefix + u'ButtonLayout', buttonLayout)
- setattr(self, prefix + u'AddButton', addButton)
- setattr(self, prefix + u'RemoveButton', removeButton)
- if can_disable:
- setattr(self, prefix + u'ImportLayout', importLayout)
+ if single_select:
+ setattr(self, prefix + u'FilenameLabel', filenameLabel)
+ setattr(self, prefix + u'FileLayout', fileLayout)
+ setattr(self, prefix + u'FilenameEdit', filenameEdit)
+ setattr(self, prefix + u'BrowseButton', browseButton)
else:
- setattr(self, prefix + u'Layout', importLayout)
+ setattr(self, prefix + u'FileListWidget', fileListWidget)
+ setattr(self, prefix + u'ButtonLayout', buttonLayout)
+ setattr(self, prefix + u'AddButton', addButton)
+ setattr(self, prefix + u'RemoveButton', removeButton)
+ setattr(self, prefix + u'ImportLayout', importLayout)
self.formatComboBox.addItem(u'')
def disablableWidget(self, page, prefix, obj_prefix):
diff --git a/openlp/plugins/songs/forms/songmaintenanceform.py b/openlp/plugins/songs/forms/songmaintenanceform.py
index 93a01623e..441182424 100644
--- a/openlp/plugins/songs/forms/songmaintenanceform.py
+++ b/openlp/plugins/songs/forms/songmaintenanceform.py
@@ -94,8 +94,8 @@ class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog):
self.typeListWidget.setFocus()
return QtGui.QDialog.exec_(self)
- def _getCurrentItemId(self, ListWidget):
- item = ListWidget.currentItem()
+ def _getCurrentItemId(self, listWidget):
+ item = listWidget.currentItem()
if item:
item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0]
return item_id
@@ -278,117 +278,128 @@ class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog):
def onAuthorEditButtonClick(self):
author_id = self._getCurrentItemId(self.authorsListWidget)
- if author_id != -1:
- author = self.manager.get_object(Author, author_id)
- self.authorform.setAutoDisplayName(False)
- self.authorform.firstNameEdit.setText(author.first_name)
- self.authorform.lastNameEdit.setText(author.last_name)
- self.authorform.displayEdit.setText(author.display_name)
- # Save the author's first and last name as well as the display name
- # for the case that they have to be restored.
- temp_first_name = author.first_name
- temp_last_name = author.last_name
- temp_display_name = author.display_name
- if self.authorform.exec_(False):
- author.first_name = unicode(
- self.authorform.firstNameEdit.text())
- author.last_name = unicode(self.authorform.lastNameEdit.text())
- author.display_name = unicode(
- self.authorform.displayEdit.text())
- if self.checkAuthor(author, True):
- if self.manager.save_object(author):
- self.resetAuthors()
- Receiver.send_message(u'songs_load_list')
- else:
- criticalErrorMessageBox(
- message=translate('SongsPlugin.SongMaintenanceForm',
- 'Could not save your changes.'))
- elif criticalErrorMessageBox(message=unicode(translate(
- 'SongsPlugin.SongMaintenanceForm', 'The author %s already '
- 'exists. Would you like to make songs with author %s use '
- 'the existing author %s?')) % (author.display_name,
- temp_display_name, author.display_name),
- parent=self, question=True) == QtGui.QMessageBox.Yes:
- self.mergeAuthors(author)
+ if author_id == -1:
+ return
+ author = self.manager.get_object(Author, author_id)
+ self.authorform.setAutoDisplayName(False)
+ self.authorform.firstNameEdit.setText(author.first_name)
+ self.authorform.lastNameEdit.setText(author.last_name)
+ self.authorform.displayEdit.setText(author.display_name)
+ # Save the author's first and last name as well as the display name
+ # for the case that they have to be restored.
+ temp_first_name = author.first_name
+ temp_last_name = author.last_name
+ temp_display_name = author.display_name
+ if self.authorform.exec_(False):
+ author.first_name = unicode(
+ self.authorform.firstNameEdit.text())
+ author.last_name = unicode(self.authorform.lastNameEdit.text())
+ author.display_name = unicode(
+ self.authorform.displayEdit.text())
+ if self.checkAuthor(author, True):
+ if self.manager.save_object(author):
self.resetAuthors()
Receiver.send_message(u'songs_load_list')
else:
- # We restore the author's old first and last name as well as
- # his display name.
- author.first_name = temp_first_name
- author.last_name = temp_last_name
- author.display_name = temp_display_name
criticalErrorMessageBox(
message=translate('SongsPlugin.SongMaintenanceForm',
- 'Could not save your modified author, because the '
- 'author already exists.'))
+ 'Could not save your changes.'))
+ elif criticalErrorMessageBox(message=unicode(translate(
+ 'SongsPlugin.SongMaintenanceForm', 'The author %s already '
+ 'exists. Would you like to make songs with author %s use '
+ 'the existing author %s?')) % (author.display_name,
+ temp_display_name, author.display_name),
+ parent=self, question=True) == QtGui.QMessageBox.Yes:
+ self.__mergeObjects(author, self.mergeAuthors,
+ self.resetAuthors)
+ else:
+ # We restore the author's old first and last name as well as
+ # his display name.
+ author.first_name = temp_first_name
+ author.last_name = temp_last_name
+ author.display_name = temp_display_name
+ criticalErrorMessageBox(
+ message=translate('SongsPlugin.SongMaintenanceForm',
+ 'Could not save your modified author, because the '
+ 'author already exists.'))
def onTopicEditButtonClick(self):
topic_id = self._getCurrentItemId(self.topicsListWidget)
- if topic_id != -1:
- topic = self.manager.get_object(Topic, topic_id)
- self.topicform.nameEdit.setText(topic.name)
- # Save the topic's name for the case that he has to be restored.
- temp_name = topic.name
- if self.topicform.exec_(False):
- topic.name = unicode(self.topicform.nameEdit.text())
- if self.checkTopic(topic, True):
- if self.manager.save_object(topic):
- self.resetTopics()
- else:
- criticalErrorMessageBox(
- message=translate('SongsPlugin.SongMaintenanceForm',
- 'Could not save your changes.'))
- elif criticalErrorMessageBox(
- message=unicode(translate('SongsPlugin.SongMaintenanceForm',
- 'The topic %s already exists. Would you like to make songs '
- 'with topic %s use the existing topic %s?')) % (topic.name,
- temp_name, topic.name),
- parent=self, question=True) == QtGui.QMessageBox.Yes:
- self.mergeTopics(topic)
+ if topic_id == -1:
+ return
+ topic = self.manager.get_object(Topic, topic_id)
+ self.topicform.nameEdit.setText(topic.name)
+ # Save the topic's name for the case that he has to be restored.
+ temp_name = topic.name
+ if self.topicform.exec_(False):
+ topic.name = unicode(self.topicform.nameEdit.text())
+ if self.checkTopic(topic, True):
+ if self.manager.save_object(topic):
self.resetTopics()
else:
- # We restore the topics's old name.
- topic.name = temp_name
criticalErrorMessageBox(
message=translate('SongsPlugin.SongMaintenanceForm',
- 'Could not save your modified topic, because it '
- 'already exists.'))
+ 'Could not save your changes.'))
+ elif criticalErrorMessageBox(
+ message=unicode(translate('SongsPlugin.SongMaintenanceForm',
+ 'The topic %s already exists. Would you like to make songs '
+ 'with topic %s use the existing topic %s?')) % (topic.name,
+ temp_name, topic.name),
+ parent=self, question=True) == QtGui.QMessageBox.Yes:
+ self.__mergeObjects(topic, self.mergeTopics, self.resetTopics)
+ else:
+ # We restore the topics's old name.
+ topic.name = temp_name
+ criticalErrorMessageBox(
+ message=translate('SongsPlugin.SongMaintenanceForm',
+ 'Could not save your modified topic, because it '
+ 'already exists.'))
def onBookEditButtonClick(self):
book_id = self._getCurrentItemId(self.booksListWidget)
- if book_id != -1:
- book = self.manager.get_object(Book, book_id)
- if book.publisher is None:
- book.publisher = u''
- self.bookform.nameEdit.setText(book.name)
- self.bookform.publisherEdit.setText(book.publisher)
- # Save the book's name and publisher for the case that they have to
- # be restored.
- temp_name = book.name
- temp_publisher = book.publisher
- if self.bookform.exec_(False):
- book.name = unicode(self.bookform.nameEdit.text())
- book.publisher = unicode(self.bookform.publisherEdit.text())
- if self.checkBook(book, True):
- if self.manager.save_object(book):
- self.resetBooks()
- else:
- criticalErrorMessageBox(
- message=translate('SongsPlugin.SongMaintenanceForm',
- 'Could not save your changes.'))
- elif criticalErrorMessageBox(
- message=unicode(translate('SongsPlugin.SongMaintenanceForm',
- 'The book %s already exists. Would you like to make songs '
- 'with book %s use the existing book %s?')) % (book.name,
- temp_name, book.name),
- parent=self, question=True) == QtGui.QMessageBox.Yes:
- self.mergeBooks(book)
+ if book_id == -1:
+ return
+ book = self.manager.get_object(Book, book_id)
+ if book.publisher is None:
+ book.publisher = u''
+ self.bookform.nameEdit.setText(book.name)
+ self.bookform.publisherEdit.setText(book.publisher)
+ # Save the book's name and publisher for the case that they have to
+ # be restored.
+ temp_name = book.name
+ temp_publisher = book.publisher
+ if self.bookform.exec_(False):
+ book.name = unicode(self.bookform.nameEdit.text())
+ book.publisher = unicode(self.bookform.publisherEdit.text())
+ if self.checkBook(book, True):
+ if self.manager.save_object(book):
self.resetBooks()
else:
- # We restore the book's old name and publisher.
- book.name = temp_name
- book.publisher = temp_publisher
+ criticalErrorMessageBox(
+ message=translate('SongsPlugin.SongMaintenanceForm',
+ 'Could not save your changes.'))
+ elif criticalErrorMessageBox(
+ message=unicode(translate('SongsPlugin.SongMaintenanceForm',
+ 'The book %s already exists. Would you like to make songs '
+ 'with book %s use the existing book %s?')) % (book.name,
+ temp_name, book.name),
+ parent=self, question=True) == QtGui.QMessageBox.Yes:
+ self.__mergeObjects(book, self.mergeBooks, self.resetBooks)
+ else:
+ # We restore the book's old name and publisher.
+ book.name = temp_name
+ book.publisher = temp_publisher
+
+ def __mergeObjects(self, dbObject, merge, reset):
+ """
+ Utility method to merge two objects to leave one in the database.
+ """
+ Receiver.send_message(u'cursor_busy')
+ Receiver.send_message(u'openlp_process_events')
+ merge(dbObject)
+ reset()
+ Receiver.send_message(u'songs_load_list')
+ Receiver.send_message(u'cursor_normal')
def mergeAuthors(self, old_author):
"""
@@ -496,42 +507,32 @@ class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog):
def onAuthorsListRowChanged(self, row):
"""
- Called when the *authorsListWidget* current's row has changed.
-
- ``row``
- The current row. If there is no current row, the value is -1
+ Called when the *authorsListWidget*s current row has changed.
"""
- if row == -1:
- self.authorsDeleteButton.setEnabled(False)
- self.authorsEditButton.setEnabled(False)
- else:
- self.authorsDeleteButton.setEnabled(True)
- self.authorsEditButton.setEnabled(True)
+ self.__rowChange(row, self.authorsEditButton, self.authorsDeleteButton)
def onTopicsListRowChanged(self, row):
"""
- Called when the *booksListWidget* current's row has changed.
-
- ``row``
- The current row. If there is no current row, the value is -1.
+ Called when the *topicsListWidget*s current row has changed.
"""
- if row == -1:
- self.topicsDeleteButton.setEnabled(False)
- self.topicsEditButton.setEnabled(False)
- else:
- self.topicsDeleteButton.setEnabled(True)
- self.topicsEditButton.setEnabled(True)
+ self.__rowChange(row, self.topicsEditButton, self.topicsDeleteButton)
def onBooksListRowChanged(self, row):
"""
- Called when the *booksListWidget* current's row has changed.
+ Called when the *booksListWidget*s current row has changed.
+ """
+ self.__rowChange(row, self.booksEditButton, self.booksDeleteButton)
+
+ def __rowChange(self, row, editButton, deleteButton):
+ """
+ Utility method to toggle if buttons are enabled.
``row``
The current row. If there is no current row, the value is -1.
"""
if row == -1:
- self.booksDeleteButton.setEnabled(False)
- self.booksEditButton.setEnabled(False)
+ deleteButton.setEnabled(False)
+ editButton.setEnabled(False)
else:
- self.booksDeleteButton.setEnabled(True)
- self.booksEditButton.setEnabled(True)
+ deleteButton.setEnabled(True)
+ editButton.setEnabled(True)
diff --git a/openlp/plugins/songs/forms/topicsdialog.py b/openlp/plugins/songs/forms/topicsdialog.py
index ca0bbed97..38c45407f 100644
--- a/openlp/plugins/songs/forms/topicsdialog.py
+++ b/openlp/plugins/songs/forms/topicsdialog.py
@@ -26,7 +26,7 @@
from PyQt4 import QtCore, QtGui
-from openlp.core.lib import translate
+from openlp.core.lib import translate, save_cancel_button_box
class Ui_TopicsDialog(object):
def setupUi(self, topicsDialog):
@@ -43,17 +43,9 @@ class Ui_TopicsDialog(object):
self.nameLabel.setBuddy(self.nameEdit)
self.nameLayout.addRow(self.nameLabel, self.nameEdit)
self.dialogLayout.addLayout(self.nameLayout)
- self.buttonBox = QtGui.QDialogButtonBox(topicsDialog)
- self.buttonBox.setStandardButtons(
- QtGui.QDialogButtonBox.Save | QtGui.QDialogButtonBox.Cancel)
- self.buttonBox.setObjectName(u'buttonBox')
- self.dialogLayout.addWidget(self.buttonBox)
+ self.dialogLayout.addWidget(save_cancel_button_box(topicsDialog))
self.retranslateUi(topicsDialog)
topicsDialog.setMaximumHeight(topicsDialog.sizeHint().height())
- QtCore.QObject.connect(self.buttonBox,
- QtCore.SIGNAL(u'accepted()'), topicsDialog.accept)
- QtCore.QObject.connect(self.buttonBox,
- QtCore.SIGNAL(u'rejected()'), topicsDialog.reject)
QtCore.QMetaObject.connectSlotsByName(topicsDialog)
def retranslateUi(self, topicsDialog):
diff --git a/openlp/plugins/songs/lib/easislidesimport.py b/openlp/plugins/songs/lib/easislidesimport.py
index 84e7a3841..0b10ce428 100644
--- a/openlp/plugins/songs/lib/easislidesimport.py
+++ b/openlp/plugins/songs/lib/easislidesimport.py
@@ -133,29 +133,37 @@ class EasiSlidesImport(SongImport):
pass
def _add_copyright(self, song):
- copyright = []
+ """
+ Assign the copyright information from the import to the song being
+ created.
+
+ ``song``
+ The current song being imported.
+ """
+ copyright_list = []
+ self.__add_copyright_element(copyright_list, song.Copyright)
+ self.__add_copyright_element(copyright_list, song.LicenceAdmin1)
+ self.__add_copyright_element(copyright_list, song.LicenceAdmin2)
+ self.add_copyright(u' '.join(copyright_list))
+
+ def __add_copyright_element(self, copyright_list, element):
+ """
+ Add a piece of copyright to the total copyright information for the
+ song.
+
+ ``copyright_list``
+ The array to add the information to.
+
+ ``element``
+ The imported variable to get the data from.
+ """
try:
- copyright.append(unicode(song.Copyright).strip())
+ copyright_list.append(unicode(element).strip())
except UnicodeDecodeError:
- log.exception(u'Unicode decode error while decoding Copyright')
+ log.exception(u'Unicode error decoding %s' % element)
self._success = False
except AttributeError:
pass
- try:
- copyright.append(unicode(song.LicenceAdmin1).strip())
- except UnicodeDecodeError:
- log.exception(u'Unicode decode error while decoding LicenceAdmin1')
- self._success = False
- except AttributeError:
- pass
- try:
- copyright.append(unicode(song.LicenceAdmin2).strip())
- except UnicodeDecodeError:
- log.exception(u'Unicode decode error while decoding LicenceAdmin2')
- self._success = False
- except AttributeError:
- pass
- self.add_copyright(u' '.join(copyright))
def _parse_and_add_lyrics(self, song):
try:
diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py
index d83ab237e..bd6385c0a 100644
--- a/openlp/plugins/songs/lib/mediaitem.py
+++ b/openlp/plugins/songs/lib/mediaitem.py
@@ -342,16 +342,7 @@ class SongMediaItem(MediaManagerItem):
author_list = u''
author_audit = []
ccli = u''
- if item is None:
- if self.remoteTriggered is None:
- item = self.listView.currentItem()
- if item is None:
- return False
- item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0]
- else:
- item_id = self.remoteSong
- else:
- item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0]
+ item_id = self._getIdOfItemToGenerate(item, self.remoteSong)
service_item.add_capability(ItemCapabilities.AllowsEdit)
service_item.add_capability(ItemCapabilities.AllowsPreview)
service_item.add_capability(ItemCapabilities.AllowsLoop)
diff --git a/openlp/plugins/songs/lib/sofimport.py b/openlp/plugins/songs/lib/sofimport.py
index 96a514f85..cfb80caa3 100644
--- a/openlp/plugins/songs/lib/sofimport.py
+++ b/openlp/plugins/songs/lib/sofimport.py
@@ -39,9 +39,7 @@ from oooimport import OooImport
if os.name == u'nt':
BOLD = 150.0
ITALIC = 2
- PAGE_BEFORE = 4
- PAGE_AFTER = 5
- PAGE_BOTH = 6
+ from oooimport import PAGE_BEFORE, PAGE_AFTER, PAGE_BOTH
else:
try:
from com.sun.star.awt.FontWeight import BOLD
@@ -306,7 +304,6 @@ class SofImport(OooImport):
self.currentverse = u''
self.is_chorus = False
-
def uncap_text(self, text):
"""
Words in the title are in all capitals, so we lowercase them.
diff --git a/openlp/plugins/songs/lib/songimport.py b/openlp/plugins/songs/lib/songimport.py
index cab0aacf6..592aa7ac1 100644
--- a/openlp/plugins/songs/lib/songimport.py
+++ b/openlp/plugins/songs/lib/songimport.py
@@ -227,7 +227,7 @@ class SongImport(QtCore.QObject):
self.versecounts[versetag[0]] = int(versetag[1:])
self.verses.append([versetag, versetext.rstrip(), lang])
self.verse_order_list.append(versetag)
- if versetag.startswith(u'V') and self.contains_verse(u'C1'):
+ if versetag.startswith(u'V') and u'C1' in self.verse_order_list:
self.verse_order_list.append(u'C1')
def repeat_verse(self):
@@ -236,9 +236,6 @@ class SongImport(QtCore.QObject):
"""
self.verse_order_list.append(self.verse_order_list[-1])
- def contains_verse(self, versetag):
- return versetag in self.verse_order_list
-
def check_complete(self):
"""
Check the mandatory fields are entered (i.e. title and a verse)
diff --git a/openlp/plugins/songusage/forms/songusagedeleteform.py b/openlp/plugins/songusage/forms/songusagedeleteform.py
index f83ec8c82..c03fe15a3 100644
--- a/openlp/plugins/songusage/forms/songusagedeleteform.py
+++ b/openlp/plugins/songusage/forms/songusagedeleteform.py
@@ -26,7 +26,7 @@
from PyQt4 import QtGui
-from openlp.core.lib import translate
+from openlp.core.lib import translate, Receiver
from openlp.plugins.songusage.lib.db import SongUsageItem
from songusagedeletedialog import Ui_SongUsageDeleteDialog
@@ -55,4 +55,9 @@ class SongUsageDeleteForm(QtGui.QDialog, Ui_SongUsageDeleteDialog):
deleteDate = self.deleteCalendar.selectedDate().toPyDate()
self.manager.delete_all_objects(SongUsageItem,
SongUsageItem.usagedate <= deleteDate)
- self.close()
\ No newline at end of file
+ Receiver.send_message(u'openlp_information_message', {
+ u'title': translate('SongUsagePlugin.SongUsageDeleteForm',
+ 'Deletion Successful'),
+ u'message': translate('SongUsagePlugin.SongUsageDeleteForm',
+ 'All requested data has been deleted successfully. ')})
+ self.close()
diff --git a/openlp/plugins/songusage/forms/songusagedetaildialog.py b/openlp/plugins/songusage/forms/songusagedetaildialog.py
index 9383e147d..ec1f69d7e 100644
--- a/openlp/plugins/songusage/forms/songusagedetaildialog.py
+++ b/openlp/plugins/songusage/forms/songusagedetaildialog.py
@@ -60,10 +60,12 @@ class Ui_SongUsageDetailDialog(object):
self.horizontalLayout.setObjectName(u'horizontalLayout')
self.fileLineEdit = QtGui.QLineEdit(self.fileGroupBox)
self.fileLineEdit.setObjectName(u'fileLineEdit')
+ self.fileLineEdit.setReadOnly(True)
+ self.fileLineEdit.setEnabled(False)
self.horizontalLayout.addWidget(self.fileLineEdit)
self.saveFilePushButton = QtGui.QPushButton(self.fileGroupBox)
self.saveFilePushButton.setIcon(
- build_icon(u':/general/general_load.png'))
+ build_icon(u':/general/general_open.png'))
self.saveFilePushButton.setObjectName(u'saveFilePushButton')
self.horizontalLayout.addWidget(self.saveFilePushButton)
self.verticalLayout4.addLayout(self.horizontalLayout)
@@ -96,4 +98,4 @@ class Ui_SongUsageDetailDialog(object):
translate('SongUsagePlugin.SongUsageDetailForm', 'to'))
self.fileGroupBox.setTitle(
translate('SongUsagePlugin.SongUsageDetailForm',
- 'Report Location'))
\ No newline at end of file
+ 'Report Location'))
diff --git a/openlp/plugins/songusage/forms/songusagedetailform.py b/openlp/plugins/songusage/forms/songusagedetailform.py
index 8588ddcff..ff8ec4858 100644
--- a/openlp/plugins/songusage/forms/songusagedetailform.py
+++ b/openlp/plugins/songusage/forms/songusagedetailform.py
@@ -30,7 +30,8 @@ import os
from PyQt4 import QtCore, QtGui
from sqlalchemy.sql import and_
-from openlp.core.lib import SettingsManager, translate
+from openlp.core.lib import SettingsManager, translate, Receiver, \
+ check_directory_exists
from openlp.plugins.songusage.lib.db import SongUsageItem
from songusagedetaildialog import Ui_SongUsageDetailDialog
@@ -51,49 +52,74 @@ class SongUsageDetailForm(QtGui.QDialog, Ui_SongUsageDetailDialog):
self.setupUi(self)
def initialise(self):
+ """
+ We need to set up the screen
+ """
year = QtCore.QDate().currentDate().year()
if QtCore.QDate().currentDate().month() < 9:
year -= 1
- toDate = QtCore.QDate(year, 8, 31)
- fromDate = QtCore.QDate(year - 1, 9, 1)
+ toDate = QtCore.QSettings().value(
+ u'songusage/to date',
+ QtCore.QVariant(QtCore.QDate(year, 8, 31))).toDate()
+ fromDate = QtCore.QSettings().value(
+ u'songusage/from date',
+ QtCore.QVariant(QtCore.QDate(year - 1, 9, 1))).toDate()
self.fromDate.setSelectedDate(fromDate)
self.toDate.setSelectedDate(toDate)
self.fileLineEdit.setText(
SettingsManager.get_last_dir(self.plugin.settingsSection, 1))
def defineOutputLocation(self):
+ """
+ Triggered when the Directory selection button is pressed
+ """
path = QtGui.QFileDialog.getExistingDirectory(self,
translate('SongUsagePlugin.SongUsageDetailForm',
'Output File Location'),
SettingsManager.get_last_dir(self.plugin.settingsSection, 1))
path = unicode(path)
- if path != u'':
+ if path:
SettingsManager.set_last_dir(self.plugin.settingsSection, path, 1)
self.fileLineEdit.setText(path)
def accept(self):
- log.debug(u'Detailed report generated')
+ """
+ Ok was pressed so lets save the data and run the report
+ """
+ log.debug(u'accept')
+ path = unicode(self.fileLineEdit.text())
+ check_directory_exists(path)
filename = unicode(translate('SongUsagePlugin.SongUsageDetailForm',
'usage_detail_%s_%s.txt')) % (
self.fromDate.selectedDate().toString(u'ddMMyyyy'),
self.toDate.selectedDate().toString(u'ddMMyyyy'))
+ QtCore.QSettings().setValue(u'songusage/from date',
+ QtCore.QVariant(self.fromDate.selectedDate()))
+ QtCore.QSettings().setValue(u'songusage/to date',
+ QtCore.QVariant(self.toDate.selectedDate()))
usage = self.plugin.manager.get_all_objects(
SongUsageItem, and_(
SongUsageItem.usagedate >= self.fromDate.selectedDate().toPyDate(),
SongUsageItem.usagedate < self.toDate.selectedDate().toPyDate()),
[SongUsageItem.usagedate, SongUsageItem.usagetime])
- outname = os.path.join(unicode(self.fileLineEdit.text()), filename)
- file = None
+ outname = os.path.join(path, filename)
+ fileHandle = None
try:
- file = open(outname, u'w')
+ fileHandle = open(outname, u'w')
for instance in usage:
record = u'\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\"\n' % (
instance.usagedate, instance.usagetime, instance.title,
instance.copyright, instance.ccl_number, instance.authors)
- file.write(record)
+ fileHandle.write(record.encode(u'utf-8'))
+ Receiver.send_message(u'openlp_information_message', {
+ u'title': translate('SongUsagePlugin.SongUsageDetailForm',
+ 'Report Creation'),
+ u'message': unicode(translate(
+ 'SongUsagePlugin.SongUsageDetailForm', 'Report \n%s \n'
+ 'has been successfully created. ')) % outname})
except IOError:
log.exception(u'Failed to write out song usage records')
finally:
- if file:
- file.close()
+ if fileHandle:
+ fileHandle.close()
self.close()