forked from openlp/openlp
Head978
This commit is contained in:
commit
50691074b8
@ -220,17 +220,17 @@ class Ui_MainWindow(object):
|
|||||||
# Create the menu items
|
# Create the menu items
|
||||||
self.FileNewItem = QtGui.QAction(MainWindow)
|
self.FileNewItem = QtGui.QAction(MainWindow)
|
||||||
self.FileNewItem.setIcon(
|
self.FileNewItem.setIcon(
|
||||||
self.ServiceManagerContents.Toolbar.getIconFromTitle(
|
self.ServiceManagerContents.toolbar.getIconFromTitle(
|
||||||
u'New Service'))
|
u'New Service'))
|
||||||
self.FileNewItem.setObjectName(u'FileNewItem')
|
self.FileNewItem.setObjectName(u'FileNewItem')
|
||||||
self.FileOpenItem = QtGui.QAction(MainWindow)
|
self.FileOpenItem = QtGui.QAction(MainWindow)
|
||||||
self.FileOpenItem.setIcon(
|
self.FileOpenItem.setIcon(
|
||||||
self.ServiceManagerContents.Toolbar.getIconFromTitle(
|
self.ServiceManagerContents.toolbar.getIconFromTitle(
|
||||||
u'Open Service'))
|
u'Open Service'))
|
||||||
self.FileOpenItem.setObjectName(u'FileOpenItem')
|
self.FileOpenItem.setObjectName(u'FileOpenItem')
|
||||||
self.FileSaveItem = QtGui.QAction(MainWindow)
|
self.FileSaveItem = QtGui.QAction(MainWindow)
|
||||||
self.FileSaveItem.setIcon(
|
self.FileSaveItem.setIcon(
|
||||||
self.ServiceManagerContents.Toolbar.getIconFromTitle(
|
self.ServiceManagerContents.toolbar.getIconFromTitle(
|
||||||
u'Save Service'))
|
u'Save Service'))
|
||||||
self.FileSaveItem.setObjectName(u'FileSaveItem')
|
self.FileSaveItem.setObjectName(u'FileSaveItem')
|
||||||
self.FileSaveAsItem = QtGui.QAction(MainWindow)
|
self.FileSaveAsItem = QtGui.QAction(MainWindow)
|
||||||
|
@ -112,60 +112,60 @@ class ServiceManager(QtGui.QWidget):
|
|||||||
self.serviceNoteForm = ServiceNoteForm(self.parent)
|
self.serviceNoteForm = ServiceNoteForm(self.parent)
|
||||||
self.serviceItemEditForm = ServiceItemEditForm(self.parent)
|
self.serviceItemEditForm = ServiceItemEditForm(self.parent)
|
||||||
#start with the layout
|
#start with the layout
|
||||||
self.Layout = QtGui.QVBoxLayout(self)
|
self.layout = QtGui.QVBoxLayout(self)
|
||||||
self.Layout.setSpacing(0)
|
self.layout.setSpacing(0)
|
||||||
self.Layout.setMargin(0)
|
self.layout.setMargin(0)
|
||||||
# Create the top toolbar
|
# Create the top toolbar
|
||||||
self.Toolbar = OpenLPToolbar(self)
|
self.toolbar = OpenLPToolbar(self)
|
||||||
self.Toolbar.addToolbarButton(
|
self.toolbar.addToolbarButton(
|
||||||
translate('OpenLP.ServiceManager', 'New Service'),
|
translate('OpenLP.ServiceManager', 'New Service'),
|
||||||
u':/general/general_new.png',
|
u':/general/general_new.png',
|
||||||
translate('OpenLP.ServiceManager', 'Create a new service'),
|
translate('OpenLP.ServiceManager', 'Create a new service'),
|
||||||
self.onNewService)
|
self.onNewService)
|
||||||
self.Toolbar.addToolbarButton(
|
self.toolbar.addToolbarButton(
|
||||||
translate('OpenLP.ServiceManager', 'Open Service'),
|
translate('OpenLP.ServiceManager', 'Open Service'),
|
||||||
u':/general/general_open.png',
|
u':/general/general_open.png',
|
||||||
translate('OpenLP.ServiceManager', 'Load an existing service'),
|
translate('OpenLP.ServiceManager', 'Load an existing service'),
|
||||||
self.onLoadService)
|
self.onLoadService)
|
||||||
self.Toolbar.addToolbarButton(
|
self.toolbar.addToolbarButton(
|
||||||
translate('OpenLP.ServiceManager', 'Save Service'),
|
translate('OpenLP.ServiceManager', 'Save Service'),
|
||||||
u':/general/general_save.png',
|
u':/general/general_save.png',
|
||||||
translate('OpenLP.ServiceManager', 'Save this service'),
|
translate('OpenLP.ServiceManager', 'Save this service'),
|
||||||
self.onQuickSaveService)
|
self.onQuickSaveService)
|
||||||
self.Toolbar.addSeparator()
|
self.toolbar.addSeparator()
|
||||||
self.ThemeLabel = QtGui.QLabel(translate('OpenLP.ServiceManager',
|
self.themeLabel = QtGui.QLabel(translate('OpenLP.ServiceManager',
|
||||||
'Theme:'), self)
|
'Theme:'), self)
|
||||||
self.ThemeLabel.setMargin(3)
|
self.themeLabel.setMargin(3)
|
||||||
self.Toolbar.addToolbarWidget(u'ThemeLabel', self.ThemeLabel)
|
self.toolbar.addToolbarWidget(u'ThemeLabel', self.themeLabel)
|
||||||
self.ThemeComboBox = QtGui.QComboBox(self.Toolbar)
|
self.themeComboBox = QtGui.QComboBox(self.toolbar)
|
||||||
self.ThemeComboBox.setToolTip(translate('OpenLP.ServiceManager',
|
self.themeComboBox.setToolTip(translate('OpenLP.ServiceManager',
|
||||||
'Select a theme for the service'))
|
'Select a theme for the service'))
|
||||||
self.ThemeComboBox.setSizeAdjustPolicy(
|
self.themeComboBox.setSizeAdjustPolicy(
|
||||||
QtGui.QComboBox.AdjustToContents)
|
QtGui.QComboBox.AdjustToContents)
|
||||||
self.Toolbar.addToolbarWidget(u'ThemeWidget', self.ThemeComboBox)
|
self.toolbar.addToolbarWidget(u'ThemeWidget', self.themeComboBox)
|
||||||
self.Layout.addWidget(self.Toolbar)
|
self.layout.addWidget(self.toolbar)
|
||||||
# Create the service manager list
|
# Create the service manager list
|
||||||
self.ServiceManagerList = ServiceManagerList(self)
|
self.serviceManagerList = ServiceManagerList(self)
|
||||||
self.ServiceManagerList.setEditTriggers(
|
self.serviceManagerList.setEditTriggers(
|
||||||
QtGui.QAbstractItemView.CurrentChanged |
|
QtGui.QAbstractItemView.CurrentChanged |
|
||||||
QtGui.QAbstractItemView.DoubleClicked |
|
QtGui.QAbstractItemView.DoubleClicked |
|
||||||
QtGui.QAbstractItemView.EditKeyPressed)
|
QtGui.QAbstractItemView.EditKeyPressed)
|
||||||
self.ServiceManagerList.setDragDropMode(
|
self.serviceManagerList.setDragDropMode(
|
||||||
QtGui.QAbstractItemView.DragDrop)
|
QtGui.QAbstractItemView.DragDrop)
|
||||||
self.ServiceManagerList.setAlternatingRowColors(True)
|
self.serviceManagerList.setAlternatingRowColors(True)
|
||||||
self.ServiceManagerList.setHeaderHidden(True)
|
self.serviceManagerList.setHeaderHidden(True)
|
||||||
self.ServiceManagerList.setExpandsOnDoubleClick(False)
|
self.serviceManagerList.setExpandsOnDoubleClick(False)
|
||||||
self.ServiceManagerList.setContextMenuPolicy(
|
self.serviceManagerList.setContextMenuPolicy(
|
||||||
QtCore.Qt.CustomContextMenu)
|
QtCore.Qt.CustomContextMenu)
|
||||||
QtCore.QObject.connect(self.ServiceManagerList,
|
QtCore.QObject.connect(self.serviceManagerList,
|
||||||
QtCore.SIGNAL('customContextMenuRequested(QPoint)'),
|
QtCore.SIGNAL('customContextMenuRequested(QPoint)'),
|
||||||
self.contextMenu)
|
self.contextMenu)
|
||||||
self.ServiceManagerList.setObjectName(u'ServiceManagerList')
|
self.serviceManagerList.setObjectName(u'serviceManagerList')
|
||||||
# enable drop
|
# enable drop
|
||||||
self.ServiceManagerList.__class__.dragEnterEvent = self.dragEnterEvent
|
self.serviceManagerList.__class__.dragEnterEvent = self.dragEnterEvent
|
||||||
self.ServiceManagerList.__class__.dragMoveEvent = self.dragEnterEvent
|
self.serviceManagerList.__class__.dragMoveEvent = self.dragEnterEvent
|
||||||
self.ServiceManagerList.__class__.dropEvent = self.dropEvent
|
self.serviceManagerList.__class__.dropEvent = self.dropEvent
|
||||||
self.Layout.addWidget(self.ServiceManagerList)
|
self.layout.addWidget(self.serviceManagerList)
|
||||||
# Add the bottom toolbar
|
# Add the bottom toolbar
|
||||||
self.OrderToolbar = OpenLPToolbar(self)
|
self.OrderToolbar = OpenLPToolbar(self)
|
||||||
self.OrderToolbar.addToolbarButton(
|
self.OrderToolbar.addToolbarButton(
|
||||||
@ -199,15 +199,15 @@ class ServiceManager(QtGui.QWidget):
|
|||||||
translate('OpenLP.ServiceManager',
|
translate('OpenLP.ServiceManager',
|
||||||
'Delete the selected item from the service.'),
|
'Delete the selected item from the service.'),
|
||||||
self.onDeleteFromService)
|
self.onDeleteFromService)
|
||||||
self.Layout.addWidget(self.OrderToolbar)
|
self.layout.addWidget(self.OrderToolbar)
|
||||||
# Connect up our signals and slots
|
# Connect up our signals and slots
|
||||||
QtCore.QObject.connect(self.ThemeComboBox,
|
QtCore.QObject.connect(self.themeComboBox,
|
||||||
QtCore.SIGNAL(u'activated(int)'), self.onThemeComboBoxSelected)
|
QtCore.SIGNAL(u'activated(int)'), self.onThemeComboBoxSelected)
|
||||||
QtCore.QObject.connect(self.ServiceManagerList,
|
QtCore.QObject.connect(self.serviceManagerList,
|
||||||
QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.makeLive)
|
QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.makeLive)
|
||||||
QtCore.QObject.connect(self.ServiceManagerList,
|
QtCore.QObject.connect(self.serviceManagerList,
|
||||||
QtCore.SIGNAL(u'itemCollapsed(QTreeWidgetItem*)'), self.collapsed)
|
QtCore.SIGNAL(u'itemCollapsed(QTreeWidgetItem*)'), self.collapsed)
|
||||||
QtCore.QObject.connect(self.ServiceManagerList,
|
QtCore.QObject.connect(self.serviceManagerList,
|
||||||
QtCore.SIGNAL(u'itemExpanded(QTreeWidgetItem*)'), self.expanded)
|
QtCore.SIGNAL(u'itemExpanded(QTreeWidgetItem*)'), self.expanded)
|
||||||
QtCore.QObject.connect(Receiver.get_receiver(),
|
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||||
QtCore.SIGNAL(u'theme_update_list'), self.updateThemeList)
|
QtCore.SIGNAL(u'theme_update_list'), self.updateThemeList)
|
||||||
@ -268,7 +268,7 @@ class ServiceManager(QtGui.QWidget):
|
|||||||
self.suffixes.append(suffix)
|
self.suffixes.append(suffix)
|
||||||
|
|
||||||
def contextMenu(self, point):
|
def contextMenu(self, point):
|
||||||
item = self.ServiceManagerList.itemAt(point)
|
item = self.serviceManagerList.itemAt(point)
|
||||||
if item is None:
|
if item is None:
|
||||||
return
|
return
|
||||||
if item.parent() is None:
|
if item.parent() is None:
|
||||||
@ -289,7 +289,7 @@ class ServiceManager(QtGui.QWidget):
|
|||||||
self.themeMenu.menuAction().setVisible(False)
|
self.themeMenu.menuAction().setVisible(False)
|
||||||
if serviceItem[u'service_item'].is_text():
|
if serviceItem[u'service_item'].is_text():
|
||||||
self.themeMenu.menuAction().setVisible(True)
|
self.themeMenu.menuAction().setVisible(True)
|
||||||
action = self.menu.exec_(self.ServiceManagerList.mapToGlobal(point))
|
action = self.menu.exec_(self.serviceManagerList.mapToGlobal(point))
|
||||||
if action == self.editAction:
|
if action == self.editAction:
|
||||||
self.remoteEdit()
|
self.remoteEdit()
|
||||||
if action == self.maintainAction:
|
if action == self.maintainAction:
|
||||||
@ -326,14 +326,14 @@ class ServiceManager(QtGui.QWidget):
|
|||||||
Called by the SlideController to select the
|
Called by the SlideController to select the
|
||||||
next service item
|
next service item
|
||||||
"""
|
"""
|
||||||
if len(self.ServiceManagerList.selectedItems()) == 0:
|
if len(self.serviceManagerList.selectedItems()) == 0:
|
||||||
return
|
return
|
||||||
selected = self.ServiceManagerList.selectedItems()[0]
|
selected = self.serviceManagerList.selectedItems()[0]
|
||||||
lookFor = 0
|
lookFor = 0
|
||||||
serviceIterator = QtGui.QTreeWidgetItemIterator(self.ServiceManagerList)
|
serviceIterator = QtGui.QTreeWidgetItemIterator(self.serviceManagerList)
|
||||||
while serviceIterator.value():
|
while serviceIterator.value():
|
||||||
if lookFor == 1 and serviceIterator.value().parent() is None:
|
if lookFor == 1 and serviceIterator.value().parent() is None:
|
||||||
self.ServiceManagerList.setCurrentItem(serviceIterator.value())
|
self.serviceManagerList.setCurrentItem(serviceIterator.value())
|
||||||
self.makeLive()
|
self.makeLive()
|
||||||
return
|
return
|
||||||
if serviceIterator.value() == selected:
|
if serviceIterator.value() == selected:
|
||||||
@ -345,15 +345,15 @@ class ServiceManager(QtGui.QWidget):
|
|||||||
Called by the SlideController to select the
|
Called by the SlideController to select the
|
||||||
previous service item
|
previous service item
|
||||||
"""
|
"""
|
||||||
if len(self.ServiceManagerList.selectedItems()) == 0:
|
if len(self.serviceManagerList.selectedItems()) == 0:
|
||||||
return
|
return
|
||||||
selected = self.ServiceManagerList.selectedItems()[0]
|
selected = self.serviceManagerList.selectedItems()[0]
|
||||||
prevItem = None
|
prevItem = None
|
||||||
serviceIterator = QtGui.QTreeWidgetItemIterator(self.ServiceManagerList)
|
serviceIterator = QtGui.QTreeWidgetItemIterator(self.serviceManagerList)
|
||||||
while serviceIterator.value():
|
while serviceIterator.value():
|
||||||
if serviceIterator.value() == selected:
|
if serviceIterator.value() == selected:
|
||||||
if prevItem:
|
if prevItem:
|
||||||
self.ServiceManagerList.setCurrentItem(prevItem)
|
self.serviceManagerList.setCurrentItem(prevItem)
|
||||||
self.makeLive()
|
self.makeLive()
|
||||||
return
|
return
|
||||||
if serviceIterator.value().parent() is None:
|
if serviceIterator.value().parent() is None:
|
||||||
@ -370,9 +370,9 @@ class ServiceManager(QtGui.QWidget):
|
|||||||
"""
|
"""
|
||||||
Makes a specific item in the service live
|
Makes a specific item in the service live
|
||||||
"""
|
"""
|
||||||
if index >= 0 and index < self.ServiceManagerList.topLevelItemCount:
|
if index >= 0 and index < self.serviceManagerList.topLevelItemCount:
|
||||||
item = self.ServiceManagerList.topLevelItem(index)
|
item = self.serviceManagerList.topLevelItem(index)
|
||||||
self.ServiceManagerList.setCurrentItem(item)
|
self.serviceManagerList.setCurrentItem(item)
|
||||||
self.makeLive()
|
self.makeLive()
|
||||||
|
|
||||||
def onMoveSelectionUp(self):
|
def onMoveSelectionUp(self):
|
||||||
@ -380,7 +380,7 @@ class ServiceManager(QtGui.QWidget):
|
|||||||
Moves the selection up the window
|
Moves the selection up the window
|
||||||
Called by the up arrow
|
Called by the up arrow
|
||||||
"""
|
"""
|
||||||
serviceIterator = QtGui.QTreeWidgetItemIterator(self.ServiceManagerList)
|
serviceIterator = QtGui.QTreeWidgetItemIterator(self.serviceManagerList)
|
||||||
tempItem = None
|
tempItem = None
|
||||||
setLastItem = False
|
setLastItem = False
|
||||||
while serviceIterator:
|
while serviceIterator:
|
||||||
@ -405,7 +405,7 @@ class ServiceManager(QtGui.QWidget):
|
|||||||
Moves the selection down the window
|
Moves the selection down the window
|
||||||
Called by the down arrow
|
Called by the down arrow
|
||||||
"""
|
"""
|
||||||
serviceIterator = QtGui.QTreeWidgetItemIterator(self.ServiceManagerList)
|
serviceIterator = QtGui.QTreeWidgetItemIterator(self.serviceManagerList)
|
||||||
firstItem = serviceIterator
|
firstItem = serviceIterator
|
||||||
setSelected = False
|
setSelected = False
|
||||||
while serviceIterator:
|
while serviceIterator:
|
||||||
@ -503,7 +503,7 @@ class ServiceManager(QtGui.QWidget):
|
|||||||
QtGui.QMessageBox.Save)
|
QtGui.QMessageBox.Save)
|
||||||
if ret == QtGui.QMessageBox.Save:
|
if ret == QtGui.QMessageBox.Save:
|
||||||
self.onSaveService()
|
self.onSaveService()
|
||||||
self.ServiceManagerList.clear()
|
self.serviceManagerList.clear()
|
||||||
self.serviceItems = []
|
self.serviceItems = []
|
||||||
self.serviceName = u''
|
self.serviceName = u''
|
||||||
self.isNew = True
|
self.isNew = True
|
||||||
@ -531,10 +531,10 @@ class ServiceManager(QtGui.QWidget):
|
|||||||
item[u'order'] = count
|
item[u'order'] = count
|
||||||
count += 1
|
count += 1
|
||||||
#Repaint the screen
|
#Repaint the screen
|
||||||
self.ServiceManagerList.clear()
|
self.serviceManagerList.clear()
|
||||||
for itemcount, item in enumerate(self.serviceItems):
|
for itemcount, item in enumerate(self.serviceItems):
|
||||||
serviceitem = item[u'service_item']
|
serviceitem = item[u'service_item']
|
||||||
treewidgetitem = QtGui.QTreeWidgetItem(self.ServiceManagerList)
|
treewidgetitem = QtGui.QTreeWidgetItem(self.serviceManagerList)
|
||||||
if serviceitem.is_valid:
|
if serviceitem.is_valid:
|
||||||
if serviceitem.notes:
|
if serviceitem.notes:
|
||||||
icon = QtGui.QImage(serviceitem.icon)
|
icon = QtGui.QImage(serviceitem.icon)
|
||||||
@ -565,7 +565,7 @@ class ServiceManager(QtGui.QWidget):
|
|||||||
if serviceItem == itemcount and serviceItemCount == count:
|
if serviceItem == itemcount and serviceItemCount == count:
|
||||||
#preserve expanding status as setCurrentItem sets it to True
|
#preserve expanding status as setCurrentItem sets it to True
|
||||||
temp = item[u'expanded']
|
temp = item[u'expanded']
|
||||||
self.ServiceManagerList.setCurrentItem(treewidgetitem1)
|
self.serviceManagerList.setCurrentItem(treewidgetitem1)
|
||||||
item[u'expanded'] = temp
|
item[u'expanded'] = temp
|
||||||
treewidgetitem.setExpanded(item[u'expanded'])
|
treewidgetitem.setExpanded(item[u'expanded'])
|
||||||
|
|
||||||
@ -758,7 +758,7 @@ class ServiceManager(QtGui.QWidget):
|
|||||||
"""
|
"""
|
||||||
Set the theme for the current service
|
Set the theme for the current service
|
||||||
"""
|
"""
|
||||||
self.service_theme = unicode(self.ThemeComboBox.currentText())
|
self.service_theme = unicode(self.themeComboBox.currentText())
|
||||||
self.parent.RenderManager.set_service_theme(self.service_theme)
|
self.parent.RenderManager.set_service_theme(self.service_theme)
|
||||||
QtCore.QSettings().setValue(
|
QtCore.QSettings().setValue(
|
||||||
self.parent.serviceSettingsSection + u'/service theme',
|
self.parent.serviceSettingsSection + u'/service theme',
|
||||||
@ -771,11 +771,11 @@ class ServiceManager(QtGui.QWidget):
|
|||||||
sure the theme combo box is in the correct state.
|
sure the theme combo box is in the correct state.
|
||||||
"""
|
"""
|
||||||
if self.parent.RenderManager.theme_level == ThemeLevel.Global:
|
if self.parent.RenderManager.theme_level == ThemeLevel.Global:
|
||||||
self.Toolbar.actions[u'ThemeLabel'].setVisible(False)
|
self.toolbar.actions[u'ThemeLabel'].setVisible(False)
|
||||||
self.Toolbar.actions[u'ThemeWidget'].setVisible(False)
|
self.toolbar.actions[u'ThemeWidget'].setVisible(False)
|
||||||
else:
|
else:
|
||||||
self.Toolbar.actions[u'ThemeLabel'].setVisible(True)
|
self.toolbar.actions[u'ThemeLabel'].setVisible(True)
|
||||||
self.Toolbar.actions[u'ThemeWidget'].setVisible(True)
|
self.toolbar.actions[u'ThemeWidget'].setVisible(True)
|
||||||
|
|
||||||
def regenerateServiceItems(self):
|
def regenerateServiceItems(self):
|
||||||
"""
|
"""
|
||||||
@ -786,7 +786,7 @@ class ServiceManager(QtGui.QWidget):
|
|||||||
self.parent.RenderManager.themedata = None
|
self.parent.RenderManager.themedata = None
|
||||||
if self.serviceItems:
|
if self.serviceItems:
|
||||||
tempServiceItems = self.serviceItems
|
tempServiceItems = self.serviceItems
|
||||||
self.ServiceManagerList.clear()
|
self.serviceManagerList.clear()
|
||||||
self.serviceItems = []
|
self.serviceItems = []
|
||||||
self.isNew = True
|
self.isNew = True
|
||||||
for item in tempServiceItems:
|
for item in tempServiceItems:
|
||||||
@ -903,7 +903,7 @@ class ServiceManager(QtGui.QWidget):
|
|||||||
"""
|
"""
|
||||||
Finds a ServiceItem in the list
|
Finds a ServiceItem in the list
|
||||||
"""
|
"""
|
||||||
items = self.ServiceManagerList.selectedItems()
|
items = self.serviceManagerList.selectedItems()
|
||||||
pos = 0
|
pos = 0
|
||||||
count = 0
|
count = 0
|
||||||
for item in items:
|
for item in items:
|
||||||
@ -923,7 +923,6 @@ class ServiceManager(QtGui.QWidget):
|
|||||||
|
|
||||||
``event``
|
``event``
|
||||||
Handle of the event pint passed
|
Handle of the event pint passed
|
||||||
|
|
||||||
"""
|
"""
|
||||||
event.accept()
|
event.accept()
|
||||||
|
|
||||||
@ -939,7 +938,7 @@ class ServiceManager(QtGui.QWidget):
|
|||||||
link = event.mimeData()
|
link = event.mimeData()
|
||||||
if link.hasText():
|
if link.hasText():
|
||||||
plugin = event.mimeData().text()
|
plugin = event.mimeData().text()
|
||||||
item = self.ServiceManagerList.itemAt(event.pos())
|
item = self.serviceManagerList.itemAt(event.pos())
|
||||||
#ServiceManager started the drag and drop
|
#ServiceManager started the drag and drop
|
||||||
if plugin == u'ServiceManager':
|
if plugin == u'ServiceManager':
|
||||||
startpos, startCount = self.findServiceItem()
|
startpos, startCount = self.findServiceItem()
|
||||||
@ -983,23 +982,21 @@ class ServiceManager(QtGui.QWidget):
|
|||||||
``theme_list``
|
``theme_list``
|
||||||
A list of current themes to be displayed
|
A list of current themes to be displayed
|
||||||
"""
|
"""
|
||||||
self.ThemeComboBox.clear()
|
self.themeComboBox.clear()
|
||||||
self.themeMenu.clear()
|
self.themeMenu.clear()
|
||||||
self.ThemeComboBox.addItem(u'')
|
self.themeComboBox.addItem(u'')
|
||||||
for theme in theme_list:
|
for theme in theme_list:
|
||||||
self.ThemeComboBox.addItem(theme)
|
self.themeComboBox.addItem(theme)
|
||||||
action = context_menu_action(
|
action = context_menu_action(self.serviceManagerList, None, theme,
|
||||||
self.ServiceManagerList,
|
self.onThemeChangeAction)
|
||||||
None,
|
|
||||||
theme , self.onThemeChangeAction)
|
|
||||||
self.themeMenu.addAction(action)
|
self.themeMenu.addAction(action)
|
||||||
id = self.ThemeComboBox.findText(self.service_theme,
|
index = self.themeComboBox.findText(self.service_theme,
|
||||||
QtCore.Qt.MatchExactly)
|
QtCore.Qt.MatchExactly)
|
||||||
# Not Found
|
# Not Found
|
||||||
if id == -1:
|
if index == -1:
|
||||||
id = 0
|
index = 0
|
||||||
self.service_theme = u''
|
self.service_theme = u''
|
||||||
self.ThemeComboBox.setCurrentIndex(id)
|
self.themeComboBox.setCurrentIndex(index)
|
||||||
self.parent.RenderManager.set_service_theme(self.service_theme)
|
self.parent.RenderManager.set_service_theme(self.service_theme)
|
||||||
self.regenerateServiceItems()
|
self.regenerateServiceItems()
|
||||||
|
|
||||||
|
@ -49,7 +49,7 @@ class ThemeManager(QtGui.QWidget):
|
|||||||
QtGui.QWidget.__init__(self, parent)
|
QtGui.QWidget.__init__(self, parent)
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
self.settingsSection = u'themes'
|
self.settingsSection = u'themes'
|
||||||
self.serviceComboBox = self.parent.ServiceManagerContents.ThemeComboBox
|
self.serviceComboBox = self.parent.ServiceManagerContents.themeComboBox
|
||||||
self.layout = QtGui.QVBoxLayout(self)
|
self.layout = QtGui.QVBoxLayout(self)
|
||||||
self.layout.setSpacing(0)
|
self.layout.setSpacing(0)
|
||||||
self.layout.setMargin(0)
|
self.layout.setMargin(0)
|
||||||
|
@ -54,10 +54,10 @@ class LanguageManager(object):
|
|||||||
"""
|
"""
|
||||||
if LanguageManager.AutoLanguage:
|
if LanguageManager.AutoLanguage:
|
||||||
language = QtCore.QLocale.system().name()
|
language = QtCore.QLocale.system().name()
|
||||||
lang_Path = AppLocation.get_directory(AppLocation.AppDir)
|
lang_path = AppLocation.get_directory(AppLocation.AppDir)
|
||||||
lang_Path = os.path.join(lang_Path, u'resources', u'i18n')
|
lang_path = os.path.join(lang_path, u'resources', u'i18n')
|
||||||
app_translator = QtCore.QTranslator()
|
app_translator = QtCore.QTranslator()
|
||||||
if app_translator.load("openlp_" + language, lang_Path):
|
if app_translator.load("openlp_" + language, lang_path):
|
||||||
return app_translator
|
return app_translator
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -66,11 +66,9 @@ class AlertsPlugin(Plugin):
|
|||||||
"""
|
"""
|
||||||
log.info(u'add tools menu')
|
log.info(u'add tools menu')
|
||||||
self.toolsAlertItem = QtGui.QAction(tools_menu)
|
self.toolsAlertItem = QtGui.QAction(tools_menu)
|
||||||
AlertIcon = build_icon(u':/plugins/plugin_alerts.png')
|
self.toolsAlertItem.setIcon(build_icon(u':/plugins/plugin_alerts.png'))
|
||||||
self.toolsAlertItem.setIcon(AlertIcon)
|
|
||||||
self.toolsAlertItem.setObjectName(u'toolsAlertItem')
|
self.toolsAlertItem.setObjectName(u'toolsAlertItem')
|
||||||
self.toolsAlertItem.setText(
|
self.toolsAlertItem.setText(translate('AlertsPlugin', '&Alert'))
|
||||||
translate('AlertsPlugin', '&Alert'))
|
|
||||||
self.toolsAlertItem.setStatusTip(
|
self.toolsAlertItem.setStatusTip(
|
||||||
translate('AlertsPlugin', 'Show an alert message.'))
|
translate('AlertsPlugin', 'Show an alert message.'))
|
||||||
self.toolsAlertItem.setShortcut(u'F7')
|
self.toolsAlertItem.setShortcut(u'F7')
|
||||||
|
@ -50,14 +50,14 @@ class BiblePlugin(Plugin):
|
|||||||
if self.manager is None:
|
if self.manager is None:
|
||||||
self.manager = BibleManager(self)
|
self.manager = BibleManager(self)
|
||||||
Plugin.initialise(self)
|
Plugin.initialise(self)
|
||||||
self.ImportBibleItem.setVisible(True)
|
self.importBibleItem.setVisible(True)
|
||||||
self.ExportBibleItem.setVisible(True)
|
self.exportBibleItem.setVisible(True)
|
||||||
|
|
||||||
def finalise(self):
|
def finalise(self):
|
||||||
log.info(u'Plugin Finalise')
|
log.info(u'Plugin Finalise')
|
||||||
Plugin.finalise(self)
|
Plugin.finalise(self)
|
||||||
self.ImportBibleItem.setVisible(False)
|
self.importBibleItem.setVisible(False)
|
||||||
self.ExportBibleItem.setVisible(False)
|
self.exportBibleItem.setVisible(False)
|
||||||
|
|
||||||
def getSettingsTab(self):
|
def getSettingsTab(self):
|
||||||
return BiblesTab(self.name)
|
return BiblesTab(self.name)
|
||||||
@ -67,23 +67,23 @@ class BiblePlugin(Plugin):
|
|||||||
return BibleMediaItem(self, self.icon, self.name)
|
return BibleMediaItem(self, self.icon, self.name)
|
||||||
|
|
||||||
def addImportMenuItem(self, import_menu):
|
def addImportMenuItem(self, import_menu):
|
||||||
self.ImportBibleItem = QtGui.QAction(import_menu)
|
self.importBibleItem = QtGui.QAction(import_menu)
|
||||||
self.ImportBibleItem.setObjectName(u'ImportBibleItem')
|
self.importBibleItem.setObjectName(u'importBibleItem')
|
||||||
import_menu.addAction(self.ImportBibleItem)
|
import_menu.addAction(self.importBibleItem)
|
||||||
self.ImportBibleItem.setText(
|
self.importBibleItem.setText(
|
||||||
translate('BiblesPlugin', '&Bible'))
|
translate('BiblesPlugin', '&Bible'))
|
||||||
# signals and slots
|
# signals and slots
|
||||||
QtCore.QObject.connect(self.ImportBibleItem,
|
QtCore.QObject.connect(self.importBibleItem,
|
||||||
QtCore.SIGNAL(u'triggered()'), self.onBibleImportClick)
|
QtCore.SIGNAL(u'triggered()'), self.onBibleImportClick)
|
||||||
self.ImportBibleItem.setVisible(False)
|
self.importBibleItem.setVisible(False)
|
||||||
|
|
||||||
def addExportMenuItem(self, export_menu):
|
def addExportMenuItem(self, export_menu):
|
||||||
self.ExportBibleItem = QtGui.QAction(export_menu)
|
self.exportBibleItem = QtGui.QAction(export_menu)
|
||||||
self.ExportBibleItem.setObjectName(u'ExportBibleItem')
|
self.exportBibleItem.setObjectName(u'exportBibleItem')
|
||||||
export_menu.addAction(self.ExportBibleItem)
|
export_menu.addAction(self.exportBibleItem)
|
||||||
self.ExportBibleItem.setText(translate(
|
self.exportBibleItem.setText(translate(
|
||||||
'BiblesPlugin', '&Bible'))
|
'BiblesPlugin', '&Bible'))
|
||||||
self.ExportBibleItem.setVisible(False)
|
self.exportBibleItem.setVisible(False)
|
||||||
|
|
||||||
def onBibleImportClick(self):
|
def onBibleImportClick(self):
|
||||||
if self.mediaItem:
|
if self.mediaItem:
|
||||||
|
@ -50,8 +50,8 @@ class WebDownload(object):
|
|||||||
}
|
}
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_name(cls, id):
|
def get_name(cls, name):
|
||||||
return cls.Names[id]
|
return cls.Names[name]
|
||||||
|
|
||||||
|
|
||||||
class ImportWizardForm(QtGui.QWizard, Ui_BibleImportWizard):
|
class ImportWizardForm(QtGui.QWizard, Ui_BibleImportWizard):
|
||||||
@ -260,8 +260,8 @@ class ImportWizardForm(QtGui.QWizard, Ui_BibleImportWizard):
|
|||||||
if self.currentId() == 3:
|
if self.currentId() == 3:
|
||||||
Receiver.send_message(u'bibles_stop_import')
|
Receiver.send_message(u'bibles_stop_import')
|
||||||
|
|
||||||
def onCurrentIdChanged(self, id):
|
def onCurrentIdChanged(self, pageId):
|
||||||
if id == 3:
|
if pageId == 3:
|
||||||
self.preImport()
|
self.preImport()
|
||||||
self.performImport()
|
self.performImport()
|
||||||
self.postImport()
|
self.postImport()
|
||||||
@ -327,6 +327,7 @@ class ImportWizardForm(QtGui.QWizard, Ui_BibleImportWizard):
|
|||||||
#Load and store Crosswalk Bibles
|
#Load and store Crosswalk Bibles
|
||||||
filepath = AppLocation.get_directory(AppLocation.PluginsDir)
|
filepath = AppLocation.get_directory(AppLocation.PluginsDir)
|
||||||
filepath = os.path.join(filepath, u'bibles', u'resources')
|
filepath = os.path.join(filepath, u'bibles', u'resources')
|
||||||
|
books_file = None
|
||||||
try:
|
try:
|
||||||
self.web_bible_list[WebDownload.Crosswalk] = {}
|
self.web_bible_list[WebDownload.Crosswalk] = {}
|
||||||
books_file = open(
|
books_file = open(
|
||||||
@ -348,6 +349,7 @@ class ImportWizardForm(QtGui.QWizard, Ui_BibleImportWizard):
|
|||||||
if books_file:
|
if books_file:
|
||||||
books_file.close()
|
books_file.close()
|
||||||
#Load and store BibleGateway Bibles
|
#Load and store BibleGateway Bibles
|
||||||
|
books_file = None
|
||||||
try:
|
try:
|
||||||
self.web_bible_list[WebDownload.BibleGateway] = {}
|
self.web_bible_list[WebDownload.BibleGateway] = {}
|
||||||
books_file = open(os.path.join(filepath, u'biblegateway.csv'), 'r')
|
books_file = open(os.path.join(filepath, u'biblegateway.csv'), 'r')
|
||||||
|
@ -23,8 +23,163 @@
|
|||||||
# with this program; if not, write to the Free Software Foundation, Inc., 59 #
|
# with this program; if not, write to the Free Software Foundation, Inc., 59 #
|
||||||
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
|
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
"""
|
||||||
|
The :mod:`lib` module contains all the library functionality for the bibles
|
||||||
|
plugin.
|
||||||
|
"""
|
||||||
|
import logging
|
||||||
|
import re
|
||||||
|
|
||||||
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
BIBLE_REFERENCE = re.compile(
|
||||||
|
r'^([\w ]+?) *([0-9]+)' # Initial book and chapter
|
||||||
|
r'(?: *[:|v|V] *([0-9]+))?' # Verse for first chapter
|
||||||
|
r'(?: *- *([0-9]+|end$))?' # Range for verses or chapters
|
||||||
|
r'(?:(?:,([0-9]+))?' # Second chapter
|
||||||
|
r' *[,|:|v|V] *([0-9]+|end$)' # More range for verses or chapters
|
||||||
|
r'(?: *- *([0-9]+|end$))?)?$', # End of second verse range
|
||||||
|
re.UNICODE)
|
||||||
|
|
||||||
|
def check_end(match_group):
|
||||||
|
"""
|
||||||
|
Check if a regular expression match group contains the text u'end' or
|
||||||
|
should be converted to an int.
|
||||||
|
|
||||||
|
``match_group``
|
||||||
|
The match group to check.
|
||||||
|
"""
|
||||||
|
if match_group == u'end':
|
||||||
|
return -1
|
||||||
|
else:
|
||||||
|
return int(match_group)
|
||||||
|
|
||||||
|
def parse_reference(reference):
|
||||||
|
"""
|
||||||
|
This is the über-awesome function that takes a person's typed in string
|
||||||
|
and converts it to a reference list, a list of references to be queried
|
||||||
|
from the Bible database files.
|
||||||
|
|
||||||
|
BIBLE_REFERENCE regular expression produces the following match groups:
|
||||||
|
0 This is a special group consisting of the whole string that matched.
|
||||||
|
1 [\w ]+ The book the reference is from.
|
||||||
|
2 [0-9]+ The first (or only) chapter in the reference.
|
||||||
|
3 None|[0-9]+ None or the only verse or the first verse in a
|
||||||
|
verse range or the start verse in a chapter range.
|
||||||
|
4 None|[0-9]+|end None or the end verse of the first verse range or
|
||||||
|
the end chapter of a chapter range.
|
||||||
|
5 None|[0-9]+ None or the second chapter in multiple
|
||||||
|
(non-ranged) chapters.
|
||||||
|
6 None|[0-9]+|end None, the start of the second verse range or the
|
||||||
|
end of a chapter range.
|
||||||
|
7 None|[0-9]+|end None or the end of the second verse range.
|
||||||
|
|
||||||
|
The reference list is a list of tuples, with each tuple structured like
|
||||||
|
this::
|
||||||
|
(book, chapter, start_verse, end_verse)
|
||||||
|
|
||||||
|
``reference``
|
||||||
|
The bible reference to parse.
|
||||||
|
|
||||||
|
Returns None or a reference list.
|
||||||
|
"""
|
||||||
|
reference = reference.strip()
|
||||||
|
log.debug('parse_reference("%s")', reference)
|
||||||
|
unified_ref_list = []
|
||||||
|
match = BIBLE_REFERENCE.match(reference)
|
||||||
|
if match:
|
||||||
|
log.debug(u'Matched reference %s' % reference)
|
||||||
|
book = match.group(1)
|
||||||
|
chapter = int(match.group(2))
|
||||||
|
if match.group(7):
|
||||||
|
# Two verse ranges
|
||||||
|
vr1_start = int(match.group(3))
|
||||||
|
vr1_end = int(match.group(4))
|
||||||
|
unified_ref_list.append((book, chapter, vr1_start, vr1_end))
|
||||||
|
vr2_start = int(match.group(6))
|
||||||
|
vr2_end = check_end(match.group(7))
|
||||||
|
if match.group(5):
|
||||||
|
# One verse range per chapter
|
||||||
|
chapter2 = int(match.group(5))
|
||||||
|
unified_ref_list.append((book, chapter2, vr2_start, vr2_end))
|
||||||
|
else:
|
||||||
|
unified_ref_list.append((book, chapter, vr2_start, vr2_end))
|
||||||
|
elif match.group(6):
|
||||||
|
# Chapter range with verses
|
||||||
|
if match.group(3):
|
||||||
|
vr1_start = int(match.group(3))
|
||||||
|
else:
|
||||||
|
vr1_start = 1
|
||||||
|
if match.group(2) == match.group(4):
|
||||||
|
vr1_end = int(match.group(6))
|
||||||
|
unified_ref_list.append((book, chapter, vr1_start, vr1_end))
|
||||||
|
else:
|
||||||
|
vr1_end = -1
|
||||||
|
unified_ref_list.append((book, chapter, vr1_start, vr1_end))
|
||||||
|
vr2_end = check_end(match.group(6))
|
||||||
|
if int(match.group(4)) > chapter:
|
||||||
|
for x in range(chapter + 1, int(match.group(4)) + 1):
|
||||||
|
if x == int(match.group(4)):
|
||||||
|
unified_ref_list.append((book, x, 1, vr2_end))
|
||||||
|
else:
|
||||||
|
unified_ref_list.append((book, x, 1, -1))
|
||||||
|
elif match.group(4):
|
||||||
|
# Chapter range or chapter and verse range
|
||||||
|
if match.group(3):
|
||||||
|
vr1_start = int(match.group(3))
|
||||||
|
vr1_end = check_end(match.group(4))
|
||||||
|
if vr1_end == -1 or vr1_end > vr1_start:
|
||||||
|
unified_ref_list.append((book, chapter, vr1_start, vr1_end))
|
||||||
|
else:
|
||||||
|
log.debug(u'Ambiguous reference: %s' % reference)
|
||||||
|
return None
|
||||||
|
elif match.group(4) != u'end':
|
||||||
|
for x in range(chapter, int(match.group(4)) + 1):
|
||||||
|
unified_ref_list.append((book, x, 1, -1))
|
||||||
|
else:
|
||||||
|
log.debug(u'Unsupported reference: %s' % reference)
|
||||||
|
return None
|
||||||
|
elif match.group(3):
|
||||||
|
# Single chapter and verse
|
||||||
|
verse = int(match.group(3))
|
||||||
|
unified_ref_list.append((book, chapter, verse, verse))
|
||||||
|
else:
|
||||||
|
# Single chapter
|
||||||
|
unified_ref_list.append((book, chapter, -1, -1))
|
||||||
|
else:
|
||||||
|
log.debug(u'Invalid reference: %s' % reference)
|
||||||
|
return None
|
||||||
|
return unified_ref_list
|
||||||
|
|
||||||
|
|
||||||
|
class SearchResults(object):
|
||||||
|
"""
|
||||||
|
Encapsulate a set of search results. This is Bible-type independant.
|
||||||
|
"""
|
||||||
|
def __init__(self, book, chapter, verselist):
|
||||||
|
"""
|
||||||
|
Create the search result object.
|
||||||
|
|
||||||
|
``book``
|
||||||
|
The book of the Bible.
|
||||||
|
|
||||||
|
``chapter``
|
||||||
|
The chapter of the book.
|
||||||
|
|
||||||
|
``verselist``
|
||||||
|
The list of verses for this reading
|
||||||
|
"""
|
||||||
|
self.book = book
|
||||||
|
self.chapter = chapter
|
||||||
|
self.verselist = verselist
|
||||||
|
|
||||||
|
def has_verselist(self):
|
||||||
|
"""
|
||||||
|
Returns whether or not the verse list contains verses.
|
||||||
|
"""
|
||||||
|
return len(self.verselist) > 0
|
||||||
|
|
||||||
|
|
||||||
from common import BibleCommon
|
|
||||||
from manager import BibleManager
|
from manager import BibleManager
|
||||||
from biblestab import BiblesTab
|
from biblestab import BiblesTab
|
||||||
from mediaitem import BibleMediaItem
|
from mediaitem import BibleMediaItem
|
||||||
|
@ -241,10 +241,10 @@ class BiblesTab(SettingsTab):
|
|||||||
self.BibleThemeComboBox.addItem(u'')
|
self.BibleThemeComboBox.addItem(u'')
|
||||||
for theme in theme_list:
|
for theme in theme_list:
|
||||||
self.BibleThemeComboBox.addItem(theme)
|
self.BibleThemeComboBox.addItem(theme)
|
||||||
id = self.BibleThemeComboBox.findText(
|
index = self.BibleThemeComboBox.findText(
|
||||||
unicode(self.bible_theme), QtCore.Qt.MatchExactly)
|
unicode(self.bible_theme), QtCore.Qt.MatchExactly)
|
||||||
if id == -1:
|
if index == -1:
|
||||||
# Not Found
|
# Not Found
|
||||||
id = 0
|
index = 0
|
||||||
self.bible_theme = u''
|
self.bible_theme = u''
|
||||||
self.BibleThemeComboBox.setCurrentIndex(id)
|
self.BibleThemeComboBox.setCurrentIndex(index)
|
||||||
|
@ -1,256 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
# OpenLP - Open Source Lyrics Projection #
|
|
||||||
# --------------------------------------------------------------------------- #
|
|
||||||
# Copyright (c) 2008-2010 Raoul Snyman #
|
|
||||||
# Portions copyright (c) 2008-2010 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 #
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
import urllib2
|
|
||||||
import logging
|
|
||||||
import re
|
|
||||||
import chardet
|
|
||||||
import htmlentitydefs
|
|
||||||
|
|
||||||
only_verses = re.compile(r'([\w .]+)[ ]+([0-9]+)[ ]*[:|v|V][ ]*([0-9]+)'
|
|
||||||
r'(?:[ ]*-[ ]*([0-9]+|end))?(?:[ ]*,[ ]*([0-9]+)'
|
|
||||||
r'(?:[ ]*-[ ]*([0-9]+|end))?)?',
|
|
||||||
re.UNICODE)
|
|
||||||
chapter_range = re.compile(r'([\w .]+)[ ]+([0-9]+)[ ]*[:|v|V][ ]*'
|
|
||||||
r'([0-9]+|end)[ ]*-[ ]*([0-9]+)[ ]*[:|v|V][ ]*([0-9]+|end)',
|
|
||||||
re.UNICODE)
|
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
def parse_reference(reference):
|
|
||||||
"""
|
|
||||||
This is the über-awesome function that takes a person's typed in string
|
|
||||||
and converts it to a reference list, a list of references to be queried
|
|
||||||
from the Bible database files.
|
|
||||||
|
|
||||||
The reference list is a list of tuples, with each tuple structured like
|
|
||||||
this::
|
|
||||||
|
|
||||||
(book, chapter, start_verse, end_verse)
|
|
||||||
"""
|
|
||||||
reference = reference.strip()
|
|
||||||
log.debug('parse_reference("%s")', reference)
|
|
||||||
reference_list = []
|
|
||||||
# We start with the most "complicated" match first, so that they are found
|
|
||||||
# first, and we don't have any "false positives".
|
|
||||||
match = chapter_range.match(reference)
|
|
||||||
if match:
|
|
||||||
log.debug('Found a chapter range.')
|
|
||||||
book = match.group(1)
|
|
||||||
from_verse = match.group(3)
|
|
||||||
to_verse = match.group(5)
|
|
||||||
if int(match.group(2)) == int(match.group(4)):
|
|
||||||
reference_list.append(
|
|
||||||
(book, int(match.group(2)), from_verse, to_verse)
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
if int(match.group(2)) > int(match.group(4)):
|
|
||||||
from_chapter = int(match.group(4))
|
|
||||||
to_chapter = int(match.group(2))
|
|
||||||
else:
|
|
||||||
from_chapter = int(match.group(2))
|
|
||||||
to_chapter = int(match.group(4))
|
|
||||||
for chapter in xrange(from_chapter, to_chapter + 1):
|
|
||||||
if chapter == from_chapter:
|
|
||||||
reference_list.append((book, chapter, from_verse, -1))
|
|
||||||
elif chapter == to_chapter:
|
|
||||||
reference_list.append((book, chapter, 1, to_verse))
|
|
||||||
else:
|
|
||||||
reference_list.append((book, chapter, 1, -1))
|
|
||||||
else:
|
|
||||||
match = only_verses.match(reference)
|
|
||||||
if match:
|
|
||||||
log.debug('Found a verse range.')
|
|
||||||
book = match.group(1)
|
|
||||||
chapter = match.group(2)
|
|
||||||
verse = match.group(3)
|
|
||||||
if match.group(4) is None:
|
|
||||||
reference_list.append((book, chapter, verse, verse))
|
|
||||||
elif match.group(5) is None:
|
|
||||||
end_verse = match.group(4)
|
|
||||||
if end_verse == u'end':
|
|
||||||
end_verse = -1
|
|
||||||
reference_list.append((book, chapter, verse, end_verse))
|
|
||||||
elif match.group(6) is None:
|
|
||||||
reference_list.extend([
|
|
||||||
(book, chapter, verse, match.group(4)),
|
|
||||||
(book, chapter, match.group(5), match.group(5))
|
|
||||||
])
|
|
||||||
else:
|
|
||||||
end_verse = match.group(6)
|
|
||||||
if end_verse == u'end':
|
|
||||||
end_verse = -1
|
|
||||||
reference_list.extend([
|
|
||||||
(book, chapter, verse, match.group(4)),
|
|
||||||
(book, chapter, match.group(5), end_verse)
|
|
||||||
])
|
|
||||||
else:
|
|
||||||
log.debug('Didn\'t find anything.')
|
|
||||||
log.debug(reference_list)
|
|
||||||
return reference_list
|
|
||||||
|
|
||||||
class SearchResults(object):
|
|
||||||
"""
|
|
||||||
Encapsulate a set of search results. This is Bible-type independant.
|
|
||||||
"""
|
|
||||||
def __init__(self, book, chapter, verselist):
|
|
||||||
"""
|
|
||||||
Create the search result object.
|
|
||||||
|
|
||||||
``book``
|
|
||||||
The book of the Bible.
|
|
||||||
|
|
||||||
``chapter``
|
|
||||||
The chapter of the book.
|
|
||||||
|
|
||||||
``verselist``
|
|
||||||
The list of verses for this reading
|
|
||||||
"""
|
|
||||||
self.book = book
|
|
||||||
self.chapter = chapter
|
|
||||||
self.verselist = verselist
|
|
||||||
|
|
||||||
def has_verselist(self):
|
|
||||||
"""
|
|
||||||
Returns whether or not the verse list contains verses.
|
|
||||||
"""
|
|
||||||
return len(self.verselist) > 0
|
|
||||||
|
|
||||||
|
|
||||||
class BibleCommon(object):
|
|
||||||
"""
|
|
||||||
A common ancestor for bible download sites.
|
|
||||||
"""
|
|
||||||
log.info(u'BibleCommon')
|
|
||||||
|
|
||||||
def _get_web_text(self, urlstring, proxyurl):
|
|
||||||
"""
|
|
||||||
Get the HTML from the web page.
|
|
||||||
|
|
||||||
``urlstring``
|
|
||||||
The URL of the page to open.
|
|
||||||
|
|
||||||
``proxyurl``
|
|
||||||
The URL of a proxy server used to access the Internet.
|
|
||||||
"""
|
|
||||||
log.debug(u'get_web_text %s %s', proxyurl, urlstring)
|
|
||||||
if proxyurl:
|
|
||||||
proxy_support = urllib2.ProxyHandler({'http': self.proxyurl})
|
|
||||||
http_support = urllib2.HTTPHandler()
|
|
||||||
opener = urllib2.build_opener(proxy_support, http_support)
|
|
||||||
urllib2.install_opener(opener)
|
|
||||||
xml_string = u''
|
|
||||||
req = urllib2.Request(urlstring)
|
|
||||||
#Make us look like an IE Browser on XP to stop blocking by web site
|
|
||||||
req.add_header(u'User-Agent',
|
|
||||||
u'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)')
|
|
||||||
try:
|
|
||||||
handle = urllib2.urlopen(req)
|
|
||||||
html = handle.read()
|
|
||||||
details = chardet.detect(html)
|
|
||||||
xml_string = unicode(html, details[u'encoding'])
|
|
||||||
except IOError, e:
|
|
||||||
if hasattr(e, u'reason'):
|
|
||||||
log.exception(u'Reason for failure: %s', e.reason)
|
|
||||||
return xml_string
|
|
||||||
|
|
||||||
def _clean_text(self, text):
|
|
||||||
"""
|
|
||||||
Clean up text and remove extra characters after been downloaded from
|
|
||||||
the Internet.
|
|
||||||
|
|
||||||
``text``
|
|
||||||
The text from the web page that needs to be cleaned up.
|
|
||||||
"""
|
|
||||||
#return text.rstrip()
|
|
||||||
# Remove Headings from the Text
|
|
||||||
start_tag = text.find(u'<h')
|
|
||||||
while start_tag > -1:
|
|
||||||
end_tag = text.find(u'</h', start_tag)
|
|
||||||
text = text[:(start_tag - 1)] + text[(end_tag + 4)]
|
|
||||||
start_tag = text.find(u'<h')
|
|
||||||
# Remove Support References from the Text
|
|
||||||
start_tag = text.find(u'<sup>')
|
|
||||||
while start_tag > -1:
|
|
||||||
end_tag = text.find(u'</sup>')
|
|
||||||
text = text[:start_tag] + text[end_tag + 6:len(text)]
|
|
||||||
start_tag = text.find(u'<sup>')
|
|
||||||
start_tag = text.find(u'<SUP>')
|
|
||||||
while start_tag > -1:
|
|
||||||
end_tag = text.find(u'</SUP>')
|
|
||||||
text = text[:start_tag] + text[end_tag + 6:len(text)]
|
|
||||||
start_tag = text.find(u'<SUP>')
|
|
||||||
# Static Clean ups
|
|
||||||
text = text.replace(u'\n', u'')
|
|
||||||
text = text.replace(u'\r', u'')
|
|
||||||
text = text.replace(u' ', u'')
|
|
||||||
text = text.replace(u'<P>', u'')
|
|
||||||
text = text.replace(u'<I>', u'')
|
|
||||||
text = text.replace(u'</I>', u'')
|
|
||||||
text = text.replace(u'<P />', u'')
|
|
||||||
text = text.replace(u'<p />', u'')
|
|
||||||
text = text.replace(u'</P>', u'')
|
|
||||||
text = text.replace(u'<BR>', u'')
|
|
||||||
text = text.replace(u'<BR />', u'')
|
|
||||||
text = text.replace(u'"', u'\"')
|
|
||||||
text = text.replace(u''', u'\'')
|
|
||||||
# Remove some other tags
|
|
||||||
start_tag = text.find(u'<')
|
|
||||||
while start_tag > -1:
|
|
||||||
end_tag = text.find(u'>', start_tag)
|
|
||||||
text = text[:start_tag] + text[end_tag + 1:]
|
|
||||||
start_tag = text.find(u'<')
|
|
||||||
text = text.replace(u'>', u'')
|
|
||||||
return text.rstrip().lstrip()
|
|
||||||
|
|
||||||
|
|
||||||
def unescape(text):
|
|
||||||
"""
|
|
||||||
Removes HTML or XML character references and entities from a text string.
|
|
||||||
Courtesy of Fredrik Lundh, http://effbot.org/zone/re-sub.htm#unescape-html
|
|
||||||
|
|
||||||
@param text The HTML (or XML) source text.
|
|
||||||
@return The plain text, as a Unicode string, if necessary.
|
|
||||||
"""
|
|
||||||
def fixup(markup):
|
|
||||||
text = markup.group(0)
|
|
||||||
if text.startswith(u'&#'):
|
|
||||||
# character reference
|
|
||||||
try:
|
|
||||||
if text.startswith(u'&#x'):
|
|
||||||
return unichr(int(text[3:-1], 16))
|
|
||||||
else:
|
|
||||||
return unichr(int(text[2:-1]))
|
|
||||||
except ValueError:
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
# named entity
|
|
||||||
try:
|
|
||||||
text = unichr(htmlentitydefs.name2codepoint[text[1:-1]])
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
return text # leave as is
|
|
||||||
return re.sub(u'&#?\w+;', fixup, text)
|
|
@ -36,7 +36,7 @@ from BeautifulSoup import BeautifulSoup, NavigableString
|
|||||||
|
|
||||||
from openlp.core.lib import Receiver
|
from openlp.core.lib import Receiver
|
||||||
from openlp.core.utils import AppLocation
|
from openlp.core.utils import AppLocation
|
||||||
from openlp.plugins.bibles.lib.common import BibleCommon, SearchResults
|
from openlp.plugins.bibles.lib import SearchResults
|
||||||
from openlp.plugins.bibles.lib.db import BibleDB, Book
|
from openlp.plugins.bibles.lib.db import BibleDB, Book
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
@ -177,7 +177,7 @@ class HTTPBooks(object):
|
|||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
class BGExtract(BibleCommon):
|
class BGExtract(object):
|
||||||
"""
|
"""
|
||||||
Extract verses from BibleGateway
|
Extract verses from BibleGateway
|
||||||
"""
|
"""
|
||||||
@ -239,7 +239,8 @@ class BGExtract(BibleCommon):
|
|||||||
found_count += 1
|
found_count += 1
|
||||||
return SearchResults(bookname, chapter, verse_list)
|
return SearchResults(bookname, chapter, verse_list)
|
||||||
|
|
||||||
class CWExtract(BibleCommon):
|
|
||||||
|
class CWExtract(object):
|
||||||
"""
|
"""
|
||||||
Extract verses from CrossWalk/BibleStudyTools
|
Extract verses from CrossWalk/BibleStudyTools
|
||||||
"""
|
"""
|
||||||
|
@ -26,13 +26,13 @@
|
|||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from PyQt4 import QtCore
|
from PyQt4 import QtCore, QtGui
|
||||||
|
|
||||||
from openlp.core.lib import SettingsManager
|
from openlp.core.lib import SettingsManager, translate
|
||||||
from openlp.core.utils import AppLocation
|
from openlp.core.utils import AppLocation
|
||||||
|
from openlp.plugins.bibles.lib import parse_reference
|
||||||
from openlp.plugins.bibles.lib.db import BibleDB, BibleMeta
|
from openlp.plugins.bibles.lib.db import BibleDB, BibleMeta
|
||||||
|
|
||||||
from common import parse_reference
|
|
||||||
from opensong import OpenSongBible
|
from opensong import OpenSongBible
|
||||||
from osis import OSISBible
|
from osis import OSISBible
|
||||||
from csvbible import CSVBible
|
from csvbible import CSVBible
|
||||||
@ -63,20 +63,20 @@ class BibleFormat(object):
|
|||||||
WebDownload = 3
|
WebDownload = 3
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_class(id):
|
def get_class(format):
|
||||||
"""
|
"""
|
||||||
Return the appropriate imeplementation class.
|
Return the appropriate imeplementation class.
|
||||||
|
|
||||||
``id``
|
``format``
|
||||||
The Bible format.
|
The Bible format.
|
||||||
"""
|
"""
|
||||||
if id == BibleFormat.OSIS:
|
if format == BibleFormat.OSIS:
|
||||||
return OSISBible
|
return OSISBible
|
||||||
elif id == BibleFormat.CSV:
|
elif format == BibleFormat.CSV:
|
||||||
return CSVBible
|
return CSVBible
|
||||||
elif id == BibleFormat.OpenSong:
|
elif format == BibleFormat.OpenSong:
|
||||||
return OpenSongBible
|
return OpenSongBible
|
||||||
elif id == BibleFormat.WebDownload:
|
elif format == BibleFormat.WebDownload:
|
||||||
return HTTPBible
|
return HTTPBible
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
@ -229,13 +229,33 @@ class BibleManager(object):
|
|||||||
``versetext``
|
``versetext``
|
||||||
Unicode. The scripture reference. Valid scripture references are:
|
Unicode. The scripture reference. Valid scripture references are:
|
||||||
|
|
||||||
|
- Genesis 1
|
||||||
|
- Genesis 1-2
|
||||||
- Genesis 1:1
|
- Genesis 1:1
|
||||||
- Genesis 1:1-10
|
- Genesis 1:1-10
|
||||||
|
- Genesis 1:1-10,15-20
|
||||||
- Genesis 1:1-2:10
|
- Genesis 1:1-2:10
|
||||||
|
- Genesis 1:1-10,2:1-10
|
||||||
"""
|
"""
|
||||||
log.debug(u'BibleManager.get_verses("%s", "%s")', bible, versetext)
|
log.debug(u'BibleManager.get_verses("%s", "%s")', bible, versetext)
|
||||||
reflist = parse_reference(versetext)
|
reflist = parse_reference(versetext)
|
||||||
|
if reflist:
|
||||||
return self.db_cache[bible].get_verses(reflist)
|
return self.db_cache[bible].get_verses(reflist)
|
||||||
|
else:
|
||||||
|
QtGui.QMessageBox.information(self.parent.mediaItem,
|
||||||
|
translate('BiblesPlugin.BibleManager',
|
||||||
|
'Scripture Reference Error'),
|
||||||
|
translate('BiblesPlugin.BibleManager', 'Your scripture '
|
||||||
|
'reference is either not supported by OpenLP or invalid. '
|
||||||
|
'Please make sure your reference conforms to one of the '
|
||||||
|
'following patterns:\n\n'
|
||||||
|
'Book Chapter\n'
|
||||||
|
'Book Chapter-Chapter\n'
|
||||||
|
'Book Chapter:Verse-Verse\n'
|
||||||
|
'Book Chapter:Verse-Verse,Verse-Verse\n'
|
||||||
|
'Book Chapter:Verse-Verse,Chapter:Verse-Verse\n'
|
||||||
|
'Book Chapter:Verse-Chapter:Verse\n'))
|
||||||
|
return None
|
||||||
|
|
||||||
def save_meta_data(self, bible, version, copyright, permissions):
|
def save_meta_data(self, bible, version, copyright, permissions):
|
||||||
"""
|
"""
|
||||||
|
@ -431,7 +431,7 @@ class BibleMediaItem(MediaManagerItem):
|
|||||||
chapter_to = int(self.AdvancedToChapter.currentText())
|
chapter_to = int(self.AdvancedToChapter.currentText())
|
||||||
verse_from = int(self.AdvancedFromVerse.currentText())
|
verse_from = int(self.AdvancedFromVerse.currentText())
|
||||||
verse_to = int(self.AdvancedToVerse.currentText())
|
verse_to = int(self.AdvancedToVerse.currentText())
|
||||||
versetext = u'%s %s:%s-%s:%s' % (book, chapter_from, verse_from, \
|
versetext = u'%s %s:%s-%s:%s' % (book, chapter_from, verse_from,
|
||||||
chapter_to, verse_to)
|
chapter_to, verse_to)
|
||||||
self.search_results = self.parent.manager.get_verses(bible, versetext)
|
self.search_results = self.parent.manager.get_verses(bible, versetext)
|
||||||
if self.ClearAdvancedSearchComboBox.currentIndex() == 0:
|
if self.ClearAdvancedSearchComboBox.currentIndex() == 0:
|
||||||
@ -656,7 +656,3 @@ class BibleMediaItem(MediaManagerItem):
|
|||||||
row = self.listView.setCurrentRow(count)
|
row = self.listView.setCurrentRow(count)
|
||||||
if row:
|
if row:
|
||||||
row.setSelected(True)
|
row.setSelected(True)
|
||||||
|
|
||||||
def searchByReference(self, bible, search):
|
|
||||||
log.debug(u'searchByReference %s, %s', bible, search)
|
|
||||||
self.search_results = self.parent.manager.get_verses(bible, search)
|
|
||||||
|
@ -38,29 +38,29 @@ class CustomTab(SettingsTab):
|
|||||||
def setupUi(self):
|
def setupUi(self):
|
||||||
self.setObjectName(u'CustomTab')
|
self.setObjectName(u'CustomTab')
|
||||||
self.tabTitleVisible = translate('CustomPlugin.CustomTab', 'Custom')
|
self.tabTitleVisible = translate('CustomPlugin.CustomTab', 'Custom')
|
||||||
self.CustomLayout = QtGui.QFormLayout(self)
|
self.customLayout = QtGui.QFormLayout(self)
|
||||||
self.CustomLayout.setSpacing(8)
|
self.customLayout.setSpacing(8)
|
||||||
self.CustomLayout.setMargin(8)
|
self.customLayout.setMargin(8)
|
||||||
self.CustomLayout.setObjectName(u'CustomLayout')
|
self.customLayout.setObjectName(u'customLayout')
|
||||||
self.CustomModeGroupBox = QtGui.QGroupBox(self)
|
self.customModeGroupBox = QtGui.QGroupBox(self)
|
||||||
self.CustomModeGroupBox.setObjectName(u'CustomModeGroupBox')
|
self.customModeGroupBox.setObjectName(u'customModeGroupBox')
|
||||||
self.CustomModeLayout = QtGui.QVBoxLayout(self.CustomModeGroupBox)
|
self.customModeLayout = QtGui.QVBoxLayout(self.customModeGroupBox)
|
||||||
self.CustomModeLayout.setSpacing(8)
|
self.customModeLayout.setSpacing(8)
|
||||||
self.CustomModeLayout.setMargin(8)
|
self.customModeLayout.setMargin(8)
|
||||||
self.CustomModeLayout.setObjectName(u'CustomModeLayout')
|
self.customModeLayout.setObjectName(u'customModeLayout')
|
||||||
self.DisplayFooterCheckBox = QtGui.QCheckBox(self.CustomModeGroupBox)
|
self.displayFooterCheckBox = QtGui.QCheckBox(self.customModeGroupBox)
|
||||||
self.DisplayFooterCheckBox.setObjectName(u'DisplayFooterCheckBox')
|
self.displayFooterCheckBox.setObjectName(u'displayFooterCheckBox')
|
||||||
self.CustomModeLayout.addWidget(self.DisplayFooterCheckBox)
|
self.customModeLayout.addWidget(self.displayFooterCheckBox)
|
||||||
self.CustomLayout.setWidget(
|
self.customLayout.setWidget(
|
||||||
0, QtGui.QFormLayout.LabelRole, self.CustomModeGroupBox)
|
0, QtGui.QFormLayout.LabelRole, self.customModeGroupBox)
|
||||||
QtCore.QObject.connect(self.DisplayFooterCheckBox,
|
QtCore.QObject.connect(self.displayFooterCheckBox,
|
||||||
QtCore.SIGNAL(u'stateChanged(int)'),
|
QtCore.SIGNAL(u'stateChanged(int)'),
|
||||||
self.onDisplayFooterCheckBoxChanged)
|
self.onDisplayFooterCheckBoxChanged)
|
||||||
|
|
||||||
def retranslateUi(self):
|
def retranslateUi(self):
|
||||||
self.CustomModeGroupBox.setTitle(translate('CustomPlugin.CustomTab',
|
self.customModeGroupBox.setTitle(translate('CustomPlugin.CustomTab',
|
||||||
'Custom Display'))
|
'Custom Display'))
|
||||||
self.DisplayFooterCheckBox.setText(
|
self.displayFooterCheckBox.setText(
|
||||||
translate('CustomPlugin.CustomTab', 'Display footer'))
|
translate('CustomPlugin.CustomTab', 'Display footer'))
|
||||||
|
|
||||||
def onDisplayFooterCheckBoxChanged(self, check_state):
|
def onDisplayFooterCheckBoxChanged(self, check_state):
|
||||||
@ -73,7 +73,7 @@ class CustomTab(SettingsTab):
|
|||||||
self.displayFooter = QtCore.QSettings().value(
|
self.displayFooter = QtCore.QSettings().value(
|
||||||
self.settingsSection + u'/display footer',
|
self.settingsSection + u'/display footer',
|
||||||
QtCore.QVariant(True)).toBool()
|
QtCore.QVariant(True)).toBool()
|
||||||
self.DisplayFooterCheckBox.setChecked(self.displayFooter)
|
self.displayFooterCheckBox.setChecked(self.displayFooter)
|
||||||
|
|
||||||
def save(self):
|
def save(self):
|
||||||
QtCore.QSettings().setValue(self.settingsSection + u'/display footer',
|
QtCore.QSettings().setValue(self.settingsSection + u'/display footer',
|
||||||
|
@ -42,20 +42,20 @@ class SongFormat(object):
|
|||||||
CSV = 3
|
CSV = 3
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_class(id):
|
def get_class(format):
|
||||||
"""
|
"""
|
||||||
Return the appropriate imeplementation class.
|
Return the appropriate imeplementation class.
|
||||||
|
|
||||||
``id``
|
``format``
|
||||||
The song format.
|
The song format.
|
||||||
"""
|
"""
|
||||||
# if id == SongFormat.OpenLyrics:
|
# if format == SongFormat.OpenLyrics:
|
||||||
# return OpenLyricsSong
|
# return OpenLyricsSong
|
||||||
# elif id == SongFormat.OpenSong:
|
# elif format == SongFormat.OpenSong:
|
||||||
# return OpenSongSong
|
# return OpenSongSong
|
||||||
# elif id == SongFormat.CCLI:
|
# elif format == SongFormat.CCLI:
|
||||||
# return CCLISong
|
# return CCLISong
|
||||||
# elif id == SongFormat.CSV:
|
# elif format == SongFormat.CSV:
|
||||||
# return CSVSong
|
# return CSVSong
|
||||||
# else:
|
# else:
|
||||||
return None
|
return None
|
||||||
|
Loading…
Reference in New Issue
Block a user