This commit is contained in:
Tim Bentley 2010-05-27 16:58:04 +01:00
commit fbbcdc20da
45 changed files with 445 additions and 335 deletions

View File

@ -15,3 +15,4 @@ OpenLP.egg-info
build build
resources/innosetup/Output resources/innosetup/Output
_eric4project _eric4project
.pylint.d

View File

@ -67,7 +67,7 @@ def get_text_file_string(text_file):
file_handle = open(text_file, u'r') file_handle = open(text_file, u'r')
content_string = file_handle.read() content_string = file_handle.read()
except IOError: except IOError:
log.error(u'Failed to open text file %s' % text_file) log.exception(u'Failed to open text file %s' % text_file)
finally: finally:
if file_handle: if file_handle:
file_handle.close() file_handle.close()
@ -131,6 +131,9 @@ def contextMenu(base, icon, text):
return action return action
def contextMenuSeparator(base): def contextMenuSeparator(base):
"""
Add a separator to a context menu
"""
action = QtGui.QAction(u'', base) action = QtGui.QAction(u'', base)
action.setSeparator(True) action.setSeparator(True)
return action return action
@ -149,7 +152,8 @@ def resize_image(image, width, height):
realw = preview.width() realw = preview.width()
realh = preview.height() realh = preview.height()
# and move it to the centre of the preview space # and move it to the centre of the preview space
newImage = QtGui.QImage(width, height, QtGui.QImage.Format_ARGB32_Premultiplied) newImage = QtGui.QImage(width, height,
QtGui.QImage.Format_ARGB32_Premultiplied)
newImage.fill(QtCore.Qt.black) newImage.fill(QtCore.Qt.black)
painter = QtGui.QPainter(newImage) painter = QtGui.QPainter(newImage)
painter.drawImage((width - realw) / 2, (height - realh) / 2, preview) painter.drawImage((width - realw) / 2, (height - realh) / 2, preview)
@ -157,6 +161,9 @@ def resize_image(image, width, height):
class ThemeLevel(object): class ThemeLevel(object):
"""
Provides an enumeration for the level a theme applies to
"""
Global = 1 Global = 1
Service = 2 Service = 2
Song = 3 Song = 3
@ -177,5 +184,4 @@ from songxmlhandler import SongXMLBuilder, SongXMLParser
from themexmlhandler import ThemeXML from themexmlhandler import ThemeXML
from renderer import Renderer from renderer import Renderer
from rendermanager import RenderManager from rendermanager import RenderManager
from mediamanageritem import MediaManagerItem
from baselistwithdnd import BaseListWithDnD from baselistwithdnd import BaseListWithDnD

View File

@ -230,7 +230,7 @@ class EventReceiver(QtCore.QObject):
self.emit(QtCore.SIGNAL(event), msg) self.emit(QtCore.SIGNAL(event), msg)
class Receiver(): class Receiver(object):
""" """
Class to allow events to be passed from different parts of the system. This Class to allow events to be passed from different parts of the system. This
is a static wrapper around the ``EventReceiver`` class. As there is only is a static wrapper around the ``EventReceiver`` class. As there is only

View File

@ -367,7 +367,7 @@ class MediaManagerItem(QtGui.QWidget):
def IconFromFile(self, file, thumb): def IconFromFile(self, file, thumb):
icon = build_icon(unicode(file)) icon = build_icon(unicode(file))
pixmap = icon.pixmap(QtCore.QSize(88,50)) pixmap = icon.pixmap(QtCore.QSize(88, 50))
ext = os.path.splitext(thumb)[1].lower() ext = os.path.splitext(thumb)[1].lower()
pixmap.save(thumb, ext[1:]) pixmap.save(thumb, ext[1:])
return icon return icon

View File

@ -474,7 +474,7 @@ class Renderer(object):
# draw a box around the text - debug only # draw a box around the text - debug only
if self._debug: if self._debug:
self.painter.setPen(QtGui.QPen(QtGui.QColor(0,255,0))) self.painter.setPen(QtGui.QPen(QtGui.QColor(0, 255, 0)))
self.painter.drawRect(startx, starty, rightextent-startx, y-starty) self.painter.drawRect(startx, starty, rightextent-startx, y-starty)
brcorner = (rightextent, y) brcorner = (rightextent, y)
self.painter.end() self.painter.end()

View File

@ -43,12 +43,12 @@ class ServiceItemType(object):
Command = 3 Command = 3
class ItemCapabilities(object): class ItemCapabilities(object):
AllowsPreview = 1 AllowsPreview = 1
AllowsEdit = 2 AllowsEdit = 2
AllowsMaintain = 3 AllowsMaintain = 3
RequiresMedia = 4 RequiresMedia = 4
AllowsLoop = 5 AllowsLoop = 5
AllowsAdditions = 6 AllowsAdditions = 6
class ServiceItem(object): class ServiceItem(object):
""" """
@ -125,8 +125,9 @@ class ServiceItem(object):
if title == u'': if title == u'':
title = line title = line
lines += line + u'\n' lines += line + u'\n'
self._display_frames.append({u'title': title, \ self._display_frames.append({u'title': title,
u'text': lines.rstrip(), u'verseTag': slide[u'verseTag'] }) u'text': lines.rstrip(),
u'verseTag': slide[u'verseTag'] })
self.cache.insert(len(self._display_frames), None) self.cache.insert(len(self._display_frames), None)
log.log(15, u'Formatting took %4s' % (time.time() - before)) log.log(15, u'Formatting took %4s' % (time.time() - before))
elif self.service_item_type == ServiceItemType.Image: elif self.service_item_type == ServiceItemType.Image:
@ -159,7 +160,7 @@ class ServiceItem(object):
frame = self.RenderManager.generate_slide(format, frame = self.RenderManager.generate_slide(format,
self.raw_footer) self.raw_footer)
else: else:
frame = self.RenderManager.generate_slide(format,u'') frame = self.RenderManager.generate_slide(format, u'')
self.cache[row] = frame self.cache[row] = frame
return frame return frame
@ -239,7 +240,8 @@ class ServiceItem(object):
service_data.append(slide[u'title']) service_data.append(slide[u'title'])
elif self.service_item_type == ServiceItemType.Command: elif self.service_item_type == ServiceItemType.Command:
for slide in self._raw_frames: for slide in self._raw_frames:
service_data.append({u'title':slide[u'title'], u'image':slide[u'image']}) service_data.append(
{u'title':slide[u'title'], u'image':slide[u'image']})
return {u'header': service_header, u'data': service_data} return {u'header': service_header, u'data': service_data}
def set_from_service(self, serviceitem, path=None): def set_from_service(self, serviceitem, path=None):
@ -276,7 +278,8 @@ class ServiceItem(object):
elif self.service_item_type == ServiceItemType.Command: elif self.service_item_type == ServiceItemType.Command:
for text_image in serviceitem[u'serviceitem'][u'data']: for text_image in serviceitem[u'serviceitem'][u'data']:
filename = os.path.join(path, text_image[u'title']) filename = os.path.join(path, text_image[u'title'])
self.add_from_command(path, text_image[u'title'], text_image[u'image'] ) self.add_from_command(
path, text_image[u'title'], text_image[u'image'] )
def merge(self, other): def merge(self, other):
""" """
@ -343,3 +346,4 @@ class ServiceItem(object):
Returns the title of the raw frame Returns the title of the raw frame
""" """
return self._raw_frames[row][u'path'] return self._raw_frames[row][u'path']

View File

@ -30,7 +30,7 @@ from xml.etree.ElementTree import ElementTree, XML
from openlp.core.lib import str_to_bool from openlp.core.lib import str_to_bool
blankthemexml=\ blankthemexml = \
'''<?xml version="1.0" encoding="utf-8"?> '''<?xml version="1.0" encoding="utf-8"?>
<theme version="1.0"> <theme version="1.0">
<name>BlankStyle</name> <name>BlankStyle</name>
@ -215,7 +215,7 @@ class ThemeXML(object):
The height of the text block. The height of the text block.
""" """
background = self.theme_xml.createElement(u'font') background = self.theme_xml.createElement(u'font')
background.setAttribute(u'type',fonttype) background.setAttribute(u'type', fonttype)
self.theme.appendChild(background) self.theme.appendChild(background)
#Create Font name element #Create Font name element
self.child_element(background, u'name', name) self.child_element(background, u'name', name)
@ -230,11 +230,12 @@ class ThemeXML(object):
#Create indentation name element #Create indentation name element
self.child_element(background, u'indentation', unicode(indentation)) self.child_element(background, u'indentation', unicode(indentation))
#Create indentation name element #Create indentation name element
self.child_element(background, u'line_adjustment', unicode(line_adjustment)) self.child_element(
background, u'line_adjustment', unicode(line_adjustment))
#Create Location element #Create Location element
element = self.theme_xml.createElement(u'location') element = self.theme_xml.createElement(u'location')
element.setAttribute(u'override',override) element.setAttribute(u'override', override)
if override == u'True': if override == u'True':
element.setAttribute(u'x', xpos) element.setAttribute(u'x', xpos)
element.setAttribute(u'y', ypos) element.setAttribute(u'y', ypos)

View File

@ -102,3 +102,4 @@ class XmlRootClass(object):
if not attrib.startswith(u'_'): if not attrib.startswith(u'_'):
result += u'_%s_' % getattr(self, attrib) result += u'_%s_' % getattr(self, attrib)
return result return result

View File

@ -23,4 +23,4 @@
# Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Temple Place, Suite 330, Boston, MA 02111-1307 USA #
############################################################################### ###############################################################################
from theme import Theme from openlp.core.theme.theme import Theme

View File

@ -28,13 +28,13 @@ import types
from xml.etree.ElementTree import ElementTree, XML from xml.etree.ElementTree import ElementTree, XML
from PyQt4 import QtGui from PyQt4 import QtGui
DelphiColors={"clRed":0xFF0000, DelphiColors = {"clRed":0xFF0000,
"clBlue":0x0000FF, "clBlue":0x0000FF,
"clYellow":0xFFFF00, "clYellow":0xFFFF00,
"clBlack":0x000000, "clBlack":0x000000,
"clWhite":0xFFFFFF} "clWhite":0xFFFFFF}
blankstylexml=\ blankstylexml = \
'''<?xml version="1.0" encoding="iso-8859-1"?> '''<?xml version="1.0" encoding="iso-8859-1"?>
<Theme> <Theme>
<Name>BlankStyle</Name> <Name>BlankStyle</Name>
@ -136,12 +136,15 @@ class Theme(object):
except ValueError: except ValueError:
val = t val = t
if (element.tag.find(u'Color') > 0 or if (element.tag.find(u'Color') > 0 or
(element.tag.find(u'BackgroundParameter') == 0 and type(val) == type(0))): (element.tag.find(u'BackgroundParameter') == 0 and
type(val) == type(0))):
# convert to a wx.Colour # convert to a wx.Colour
if not delphiColorChange: if not delphiColorChange:
val = QtGui.QColor(val&0xFF, (val>>8)&0xFF, (val>>16)&0xFF) val = QtGui.QColor(
else: val&0xFF, (val>>8)&0xFF, (val>>16)&0xFF)
val = QtGui.QColor((val>>16)&0xFF, (val>>8)&0xFF, val&0xFF) else:
val = QtGui.QColor(
(val>>16)&0xFF, (val>>8)&0xFF, val&0xFF)
setattr(self, element.tag, val) setattr(self, element.tag, val)
def __str__(self): def __str__(self):

View File

@ -222,8 +222,8 @@ class DisplayTab(SettingsTab):
self.postSetUp() self.postSetUp()
def postSetUp(self): def postSetUp(self):
self.screens.override[u'size'] = QtCore.QRect(int(self.XposEdit.text()),\ self.screens.override[u'size'] = QtCore.QRect(int(self.XposEdit.text()),
int(self.YposEdit.text()), int(self.WidthEdit.text()),\ int(self.YposEdit.text()), int(self.WidthEdit.text()),
int(self.HeightEdit.text())) int(self.HeightEdit.text()))
if self.amend_display: if self.amend_display:
self.screens.set_override_display() self.screens.set_override_display()
@ -233,3 +233,4 @@ class DisplayTab(SettingsTab):
if self.amend_display_start != self.amend_display: if self.amend_display_start != self.amend_display:
self.amend_display_start = self.amend_display self.amend_display_start = self.amend_display
Receiver.send_message(u'config_screen_changed') Receiver.send_message(u'config_screen_changed')

View File

@ -375,11 +375,13 @@ class Ui_MainWindow(object):
translate('MainWindow', 'Theme Manager')) translate('MainWindow', 'Theme Manager'))
self.FileNewItem.setText(translate('MainWindow', '&New')) self.FileNewItem.setText(translate('MainWindow', '&New'))
self.FileNewItem.setToolTip(translate('MainWindow', 'New Service')) self.FileNewItem.setToolTip(translate('MainWindow', 'New Service'))
self.FileNewItem.setStatusTip(translate('MainWindow', 'Create a new Service')) self.FileNewItem.setStatusTip(
translate('MainWindow', 'Create a new Service'))
self.FileNewItem.setShortcut(translate('MainWindow', 'Ctrl+N')) self.FileNewItem.setShortcut(translate('MainWindow', 'Ctrl+N'))
self.FileOpenItem.setText(translate('MainWindow', '&Open')) self.FileOpenItem.setText(translate('MainWindow', '&Open'))
self.FileOpenItem.setToolTip(translate('MainWindow', 'Open Service')) self.FileOpenItem.setToolTip(translate('MainWindow', 'Open Service'))
self.FileOpenItem.setStatusTip(translate('MainWindow', 'Open an existing service')) self.FileOpenItem.setStatusTip(
translate('MainWindow', 'Open an existing service'))
self.FileOpenItem.setShortcut(translate('MainWindow', 'Ctrl+O')) self.FileOpenItem.setShortcut(translate('MainWindow', 'Ctrl+O'))
self.FileSaveItem.setText(translate('MainWindow', '&Save')) self.FileSaveItem.setText(translate('MainWindow', '&Save'))
self.FileSaveItem.setToolTip(translate('MainWindow', 'Save Service')) self.FileSaveItem.setToolTip(translate('MainWindow', 'Save Service'))
@ -387,9 +389,10 @@ class Ui_MainWindow(object):
translate('MainWindow', 'Save the current service to disk')) translate('MainWindow', 'Save the current service to disk'))
self.FileSaveItem.setShortcut(translate('MainWindow', 'Ctrl+S')) self.FileSaveItem.setShortcut(translate('MainWindow', 'Ctrl+S'))
self.FileSaveAsItem.setText(translate('MainWindow', 'Save &As...')) self.FileSaveAsItem.setText(translate('MainWindow', 'Save &As...'))
self.FileSaveAsItem.setToolTip(translate('MainWindow', 'Save Service As')) self.FileSaveAsItem.setToolTip(
self.FileSaveAsItem.setStatusTip( translate('MainWindow', 'Save Service As'))
translate('MainWindow', 'Save the current service under a new name')) self.FileSaveAsItem.setStatusTip(translate('MainWindow',
'Save the current service under a new name'))
self.FileSaveAsItem.setShortcut(translate('MainWindow', 'F12')) self.FileSaveAsItem.setShortcut(translate('MainWindow', 'F12'))
self.FileExitItem.setText(translate('MainWindow', 'E&xit')) self.FileExitItem.setText(translate('MainWindow', 'E&xit'))
self.FileExitItem.setStatusTip(translate('MainWindow', 'Quit OpenLP')) self.FileExitItem.setStatusTip(translate('MainWindow', 'Quit OpenLP'))
@ -400,34 +403,40 @@ class Ui_MainWindow(object):
self.ExportLanguageItem.setText(translate('MainWindow', '&Language')) self.ExportLanguageItem.setText(translate('MainWindow', '&Language'))
self.actionLook_Feel.setText(translate('MainWindow', 'Look && &Feel')) self.actionLook_Feel.setText(translate('MainWindow', 'Look && &Feel'))
self.OptionsSettingsItem.setText(translate('MainWindow', '&Settings')) self.OptionsSettingsItem.setText(translate('MainWindow', '&Settings'))
self.ViewMediaManagerItem.setText(translate('MainWindow', '&Media Manager')) self.ViewMediaManagerItem.setText(
translate('MainWindow', '&Media Manager'))
self.ViewMediaManagerItem.setToolTip( self.ViewMediaManagerItem.setToolTip(
translate('MainWindow', 'Toggle Media Manager')) translate('MainWindow', 'Toggle Media Manager'))
self.ViewMediaManagerItem.setStatusTip( self.ViewMediaManagerItem.setStatusTip(translate('MainWindow',
translate('MainWindow', 'Toggle the visibility of the Media Manager')) 'Toggle the visibility of the Media Manager'))
self.ViewMediaManagerItem.setShortcut(translate('MainWindow', 'F8')) self.ViewMediaManagerItem.setShortcut(translate('MainWindow', 'F8'))
self.ViewThemeManagerItem.setText(translate('MainWindow', '&Theme Manager')) self.ViewThemeManagerItem.setText(
translate('MainWindow', '&Theme Manager'))
self.ViewThemeManagerItem.setToolTip( self.ViewThemeManagerItem.setToolTip(
translate('MainWindow', 'Toggle Theme Manager')) translate('MainWindow', 'Toggle Theme Manager'))
self.ViewThemeManagerItem.setStatusTip( self.ViewThemeManagerItem.setStatusTip(translate('MainWindow',
translate('MainWindow', 'Toggle the visibility of the Theme Manager')) 'Toggle the visibility of the Theme Manager'))
self.ViewThemeManagerItem.setShortcut(translate('MainWindow', 'F10')) self.ViewThemeManagerItem.setShortcut(translate('MainWindow', 'F10'))
self.ViewServiceManagerItem.setText(translate('MainWindow', '&Service Manager')) self.ViewServiceManagerItem.setText(
translate('MainWindow', '&Service Manager'))
self.ViewServiceManagerItem.setToolTip( self.ViewServiceManagerItem.setToolTip(
translate('MainWindow', 'Toggle Service Manager')) translate('MainWindow', 'Toggle Service Manager'))
self.ViewServiceManagerItem.setStatusTip( self.ViewServiceManagerItem.setStatusTip(translate('MainWindow',
translate('MainWindow', 'Toggle the visibility of the Service Manager')) 'Toggle the visibility of the Service Manager'))
self.ViewServiceManagerItem.setShortcut(translate('MainWindow', 'F9')) self.ViewServiceManagerItem.setShortcut(translate('MainWindow', 'F9'))
self.action_Preview_Panel.setText(translate('MainWindow', '&Preview Panel')) self.action_Preview_Panel.setText(
translate('MainWindow', '&Preview Panel'))
self.action_Preview_Panel.setToolTip( self.action_Preview_Panel.setToolTip(
translate('MainWindow', 'Toggle Preview Panel')) translate('MainWindow', 'Toggle Preview Panel'))
self.action_Preview_Panel.setStatusTip( self.action_Preview_Panel.setStatusTip(translate('MainWindow',
translate('MainWindow', 'Toggle the visibility of the Preview Panel')) 'Toggle the visibility of the Preview Panel'))
self.action_Preview_Panel.setShortcut(translate('MainWindow', 'F11')) self.action_Preview_Panel.setShortcut(translate('MainWindow', 'F11'))
self.PluginItem.setText(translate('MainWindow', '&Plugin List')) self.PluginItem.setText(translate('MainWindow', '&Plugin List'))
self.PluginItem.setStatusTip(translate('MainWindow', 'List the Plugins')) self.PluginItem.setStatusTip(
translate('MainWindow', 'List the Plugins'))
self.PluginItem.setShortcut(translate('MainWindow', 'Alt+F7')) self.PluginItem.setShortcut(translate('MainWindow', 'Alt+F7'))
self.HelpDocumentationItem.setText(translate('MainWindow', '&User Guide')) self.HelpDocumentationItem.setText(
translate('MainWindow', '&User Guide'))
self.HelpAboutItem.setText(translate('MainWindow', '&About')) self.HelpAboutItem.setText(translate('MainWindow', '&About'))
self.HelpAboutItem.setStatusTip( self.HelpAboutItem.setStatusTip(
translate('MainWindow', 'More information about OpenLP')) translate('MainWindow', 'More information about OpenLP'))
@ -440,12 +449,13 @@ class Ui_MainWindow(object):
translate('MainWindow', 'Choose System language, if available')) translate('MainWindow', 'Choose System language, if available'))
for item in self.LanguageGroup.actions(): for item in self.LanguageGroup.actions():
item.setText(item.objectName()) item.setText(item.objectName())
item.setStatusTip( item.setStatusTip(translate('MainWindow',
translate('MainWindow', 'Set the interface language to %1').arg(item.objectName())) 'Set the interface language to %1').arg(item.objectName()))
self.ToolsAddToolItem.setText(translate('MainWindow', 'Add &Tool...')) self.ToolsAddToolItem.setText(translate('MainWindow', 'Add &Tool...'))
self.ToolsAddToolItem.setStatusTip( self.ToolsAddToolItem.setStatusTip(
translate('MainWindow', 'Add an application to the list of tools')) translate('MainWindow', 'Add an application to the list of tools'))
self.action_Preview_Panel.setText(translate('MainWindow', '&Preview Pane')) self.action_Preview_Panel.setText(
translate('MainWindow', '&Preview Pane'))
self.ModeLiveItem.setText(translate('MainWindow', '&Live')) self.ModeLiveItem.setText(translate('MainWindow', '&Live'))

View File

@ -810,8 +810,8 @@ class ServiceManager(QtGui.QWidget):
if self.serviceItems and item < len(self.serviceItems) and \ if self.serviceItems and item < len(self.serviceItems) and \
self.serviceItems[item][u'service_item'].is_capable( self.serviceItems[item][u'service_item'].is_capable(
ItemCapabilities.AllowsPreview): ItemCapabilities.AllowsPreview):
self.parent.PreviewController.addServiceManagerItem( self.parent.PreviewController.addServiceManagerItem(
self.serviceItems[item][u'service_item'], 0) self.serviceItems[item][u'service_item'], 0)
else: else:
QtGui.QMessageBox.critical(self, QtGui.QMessageBox.critical(self,
self.trUtf8('Missing Display Handler'), self.trUtf8('Missing Display Handler'),
@ -897,17 +897,18 @@ class ServiceManager(QtGui.QWidget):
#we are over somthing so lets investigate #we are over somthing so lets investigate
pos = self._getParentItemData(item) - 1 pos = self._getParentItemData(item) - 1
serviceItem = self.serviceItems[pos] serviceItem = self.serviceItems[pos]
if plugin == serviceItem[u'service_item'].name \ if (plugin == serviceItem[u'service_item'].name and
and serviceItem[u'service_item'].is_capable(ItemCapabilities.AllowsAdditions): serviceItem[u'service_item'].is_capable(
action = self.dndMenu.exec_(QtGui.QCursor.pos()) ItemCapabilities.AllowsAdditions)):
#New action required action = self.dndMenu.exec_(QtGui.QCursor.pos())
if action == self.newAction: #New action required
self.droppos = self._getParentItemData(item) if action == self.newAction:
#Append to existing action self.droppos = self._getParentItemData(item)
if action == self.addToAction: #Append to existing action
self.droppos = self._getParentItemData(item) if action == self.addToAction:
item.setSelected(True) self.droppos = self._getParentItemData(item)
replace = True item.setSelected(True)
replace = True
else: else:
self.droppos = self._getParentItemData(item) self.droppos = self._getParentItemData(item)
Receiver.send_message(u'%s_add_service_item' % plugin, replace) Receiver.send_message(u'%s_add_service_item' % plugin, replace)

View File

@ -426,11 +426,12 @@ class SlideController(QtGui.QWidget):
self.Toolbar.makeWidgetsVisible([u'Song Menu']) self.Toolbar.makeWidgetsVisible([u'Song Menu'])
if item.is_capable(ItemCapabilities.AllowsLoop) and \ if item.is_capable(ItemCapabilities.AllowsLoop) and \
len(item.get_frames()) > 1: len(item.get_frames()) > 1:
self.Toolbar.makeWidgetsVisible(self.loopList) self.Toolbar.makeWidgetsVisible(self.loopList)
if item.is_media(): if item.is_media():
self.Toolbar.setVisible(False) self.Toolbar.setVisible(False)
self.Mediabar.setVisible(True) self.Mediabar.setVisible(True)
#self.volumeSlider.setAudioOutput(self.mainDisplay.videoDisplay.audio) #self.volumeSlider.setAudioOutput(
# self.mainDisplay.videoDisplay.audio)
def enablePreviewToolBar(self, item): def enablePreviewToolBar(self, item):
""" """

View File

@ -73,7 +73,7 @@ class ThemeManager(QtGui.QWidget):
self.Layout.addWidget(self.Toolbar) self.Layout.addWidget(self.Toolbar)
self.ThemeListWidget = QtGui.QListWidget(self) self.ThemeListWidget = QtGui.QListWidget(self)
self.ThemeListWidget.setAlternatingRowColors(True) self.ThemeListWidget.setAlternatingRowColors(True)
self.ThemeListWidget.setIconSize(QtCore.QSize(88,50)) self.ThemeListWidget.setIconSize(QtCore.QSize(88, 50))
self.Layout.addWidget(self.ThemeListWidget) self.Layout.addWidget(self.ThemeListWidget)
self.ThemeListWidget.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu) self.ThemeListWidget.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
self.ThemeListWidget.addAction( self.ThemeListWidget.addAction(
@ -285,7 +285,7 @@ class ThemeManager(QtGui.QWidget):
icon = build_icon(thumb) icon = build_icon(thumb)
else: else:
icon = build_icon(theme) icon = build_icon(theme)
pixmap = icon.pixmap(QtCore.QSize(88,50)) pixmap = icon.pixmap(QtCore.QSize(88, 50))
pixmap.save(thumb, u'png') pixmap.save(thumb, u'png')
item_name.setIcon(icon) item_name.setIcon(icon)
item_name.setData(QtCore.Qt.UserRole, item_name.setData(QtCore.Qt.UserRole,
@ -450,8 +450,6 @@ class ThemeManager(QtGui.QWidget):
'would you like to overwrite it?'), 'would you like to overwrite it?'),
(QtGui.QMessageBox.Yes | QtGui.QMessageBox.No), (QtGui.QMessageBox.Yes | QtGui.QMessageBox.No),
QtGui.QMessageBox.No) QtGui.QMessageBox.No)
else:
result == QtGui.QMessageBox.Yes
if result == QtGui.QMessageBox.Yes: if result == QtGui.QMessageBox.Yes:
# Save the theme, overwriting the existing theme if necessary. # Save the theme, overwriting the existing theme if necessary.
outfile = None outfile = None
@ -485,7 +483,7 @@ class ThemeManager(QtGui.QWidget):
frame.save(samplepathname, u'png') frame.save(samplepathname, u'png')
thumb = os.path.join(self.thumbPath, u'%s.png' % name) thumb = os.path.join(self.thumbPath, u'%s.png' % name)
icon = build_icon(frame) icon = build_icon(frame)
pixmap = icon.pixmap(QtCore.QSize(88,50)) pixmap = icon.pixmap(QtCore.QSize(88, 50))
pixmap.save(thumb, u'png') pixmap.save(thumb, u'png')
log.debug(u'Theme image written to %s', samplepathname) log.debug(u'Theme image written to %s', samplepathname)

View File

@ -186,4 +186,5 @@ def add_actions(target, actions):
from languagemanager import LanguageManager from languagemanager import LanguageManager
__all__ = [u'AppLocation', u'check_latest_version', u'add_actions', u'LanguageManager'] __all__ = [u'AppLocation', u'check_latest_version', u'add_actions',
u'LanguageManager']

View File

@ -27,7 +27,7 @@ import logging
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
class Display(): class Display(object):
log.info(u'Display Class loaded') log.info(u'Display Class loaded')
@staticmethod @staticmethod

View File

@ -27,7 +27,6 @@ import os
import sys import sys
import sqlite3 import sqlite3
from sqlalchemy import *
from sqlalchemy import create_engine from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker, mapper from sqlalchemy.orm import scoped_session, sessionmaker, mapper
@ -35,22 +34,6 @@ from openlp.core.lib import SettingsManager
from openlp.core.utils import AppLocation from openlp.core.utils import AppLocation
from openlp.plugins.bibles.lib.models import * from openlp.plugins.bibles.lib.models import *
class BaseModel(object):
"""
BaseModel provides a base object with a set of generic functions
"""
@classmethod
def populate(cls, **kwargs):
"""
Creates an instance of a class and populates it, returning the instance
"""
me = cls()
keys = kwargs.keys()
for key in keys:
me.__setattr__(key, kwargs[key])
return me
class TBibleMeta(BaseModel): class TBibleMeta(BaseModel):
""" """
Bible Meta Data Bible Meta Data
@ -109,7 +92,7 @@ def init_models(url):
autocommit=False, bind=engine)) autocommit=False, bind=engine))
return session return session
class MigrateBibles(): class MigrateBibles(object):
def __init__(self, display): def __init__(self, display):
self.display = display self.display = display
self.data_path = AppLocation.get_section_data_path(u'bibles') self.data_path = AppLocation.get_section_data_path(u'bibles')

View File

@ -25,7 +25,7 @@
from openlp.core.utils import AppLocation from openlp.core.utils import AppLocation
class MigrateFiles(): class MigrateFiles(object):
def __init__(self, display): def __init__(self, display):
self.display = display self.display = display

View File

@ -75,21 +75,6 @@ temp_authors_songs_table = Table(u'songauthors_temp', metadata,
Column(u'authorid', types.Integer, primary_key=True), Column(u'authorid', types.Integer, primary_key=True),
Column(u'songid', types.Integer) Column(u'songid', types.Integer)
) )
class BaseModel(object):
"""
BaseModel provides a base object with a set of generic functions
"""
@classmethod
def populate(cls, **kwargs):
"""
Creates an instance of a class and populates it, returning the instance
"""
me = cls()
keys = kwargs.keys()
for key in keys:
me.__setattr__(key, kwargs[key])
return me
class TAuthor(BaseModel): class TAuthor(BaseModel):
""" """
@ -109,7 +94,7 @@ class TSongAuthor(BaseModel):
""" """
pass pass
class MigrateSongs(): class MigrateSongs(object):
def __init__(self, display): def __init__(self, display):
self.display = display self.display = display
self.data_path = AppLocation.get_section_data_path(u'songs') self.data_path = AppLocation.get_section_data_path(u'songs')

View File

@ -67,7 +67,7 @@ class AlertsManager(QtCore.QObject):
- self.alertHeight - self.alertHeight
self.alertHeight = self.screen[u'size'].height() \ self.alertHeight = self.screen[u'size'].height() \
- self.alertScreenPosition - self.alertScreenPosition
self.parent.maindisplay.setAlertSize(self.alertScreenPosition,\ self.parent.maindisplay.setAlertSize(self.alertScreenPosition,
self.alertHeight) self.alertHeight)
def onAlertText(self, message): def onAlertText(self, message):

View File

@ -32,7 +32,7 @@ from openlp.plugins.alerts.lib.models import init_models, metadata, AlertItem
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
class DBManager(): class DBManager(object):
""" """
The Song Manager provides a central location for all database code. This The Song Manager provides a central location for all database code. This
class takes care of connecting to the database and running all the queries. class takes care of connecting to the database and running all the queries.
@ -70,13 +70,13 @@ class DBManager():
""" """
return self.session.query(AlertItem).order_by(AlertItem.text).all() return self.session.query(AlertItem).order_by(AlertItem.text).all()
def save_alert(self, AlertItem): def save_alert(self, alert_item):
""" """
Saves a Alert show to the database Saves a Alert show to the database
""" """
log.debug(u'Alert added') log.debug(u'Alert added')
try: try:
self.session.add(AlertItem) self.session.add(alert_item)
self.session.commit() self.session.commit()
log.debug(u'Alert saved') log.debug(u'Alert saved')
return True return True
@ -99,9 +99,9 @@ class DBManager():
Delete a Alert show Delete a Alert show
""" """
if id != 0: if id != 0:
AlertItem = self.get_alert(id) alert_item = self.get_alert(id)
try: try:
self.session.delete(AlertItem) self.session.delete(alert_item)
self.session.commit() self.session.commit()
return True return True
except: except:
@ -110,3 +110,4 @@ class DBManager():
return False return False
else: else:
return True return True

View File

@ -277,7 +277,7 @@ class Ui_BibleImportWizard(object):
self.CopyrightEdit) self.CopyrightEdit)
self.PermissionLabel = QtGui.QLabel(self.LicenseDetailsPage) self.PermissionLabel = QtGui.QLabel(self.LicenseDetailsPage)
self.PermissionLabel.setObjectName(u'PermissionLabel') self.PermissionLabel.setObjectName(u'PermissionLabel')
self.LicenseDetailsLayout.setWidget(2, QtGui.QFormLayout.LabelRole,\ self.LicenseDetailsLayout.setWidget(2, QtGui.QFormLayout.LabelRole,
self.PermissionLabel) self.PermissionLabel)
self.PermissionEdit = QtGui.QLineEdit(self.LicenseDetailsPage) self.PermissionEdit = QtGui.QLineEdit(self.LicenseDetailsPage)
self.PermissionEdit.setObjectName(u'PermissionEdit') self.PermissionEdit.setObjectName(u'PermissionEdit')

View File

@ -257,8 +257,8 @@ def unescape(text):
@param text The HTML (or XML) source text. @param text The HTML (or XML) source text.
@return The plain text, as a Unicode string, if necessary. @return The plain text, as a Unicode string, if necessary.
""" """
def fixup(m): def fixup(markup):
text = m.group(0) text = markup.group(0)
if text[:2] == u'&#': if text[:2] == u'&#':
# character reference # character reference
try: try:

View File

@ -27,6 +27,8 @@ import logging
import chardet import chardet
import csv import csv
from PyQt4 import QtCore
from openlp.core.lib import Receiver from openlp.core.lib import Receiver
from db import BibleDB from db import BibleDB
@ -89,7 +91,7 @@ class CSVBible(BibleDB):
verse_file = None verse_file = None
try: try:
book_ptr = None book_ptr = None
verse_file = open(versesfile, 'r') verse_file = open(self.versesfile, 'r')
dialect = csv.Sniffer().sniff(verse_file.read(1024)) dialect = csv.Sniffer().sniff(verse_file.read(1024))
verse_file.seek(0) verse_file.seek(0)
verse_reader = csv.reader(verse_file, dialect) verse_reader = csv.reader(verse_file, dialect)

View File

@ -418,12 +418,13 @@ class HTTPBible(BibleDB):
Receiver.send_message(u'bibles_nobook') Receiver.send_message(u'bibles_nobook')
return [] return []
db_book = self.create_book(book_details[u'name'], db_book = self.create_book(book_details[u'name'],
book_details[u'abbreviation'], book_details[u'testament_id']) book_details[u'abbreviation'],
book_details[u'testament_id'])
book = db_book.name book = db_book.name
if BibleDB.get_verse_count(self, book, reference[1]) == 0: if BibleDB.get_verse_count(self, book, reference[1]) == 0:
Receiver.send_message(u'bibles_showprogress') Receiver.send_message(u'bibles_showprogress')
Receiver.send_message(u'openlp_process_events') Receiver.send_message(u'openlp_process_events')
search_results = self.get_chapter(self.name, book, reference[1]) search_results = self.get_chapter(book, reference[1])
if search_results and search_results.has_verselist(): if search_results and search_results.has_verselist():
## We have found a book of the bible lets check to see ## We have found a book of the bible lets check to see
## if it was there. By reusing the returned book name ## if it was there. By reusing the returned book name
@ -433,18 +434,19 @@ class HTTPBible(BibleDB):
Receiver.send_message(u'openlp_process_events') Receiver.send_message(u'openlp_process_events')
# check to see if book/chapter exists # check to see if book/chapter exists
db_book = self.get_book(bookname) db_book = self.get_book(bookname)
self.create_chapter(db_book.id, search_results.get_chapter(), self.create_chapter(db_book.id,
search_results.get_chapter(),
search_results.get_verselist()) search_results.get_verselist())
Receiver.send_message(u'openlp_process_events') Receiver.send_message(u'openlp_process_events')
Receiver.send_message(u'bibles_hideprogress') Receiver.send_message(u'bibles_hideprogress')
Receiver.send_message(u'openlp_process_events') Receiver.send_message(u'openlp_process_events')
return BibleDB.get_verses(self, reference_list) return BibleDB.get_verses(self, reference_list)
def get_chapter(self, version, book, chapter): def get_chapter(self, book, chapter):
""" """
Receive the request and call the relevant handler methods Receive the request and call the relevant handler methods
""" """
log.debug(u'get_chapter %s, %s, %s', version, book, chapter) log.debug(u'get_chapter %s, %s', book, chapter)
log.debug(u'source = %s', self.download_source) log.debug(u'source = %s', self.download_source)
try: try:
if self.download_source.lower() == u'crosswalk': if self.download_source.lower() == u'crosswalk':

View File

@ -211,8 +211,8 @@ class EditCustomForm(QtGui.QDialog, Ui_customEditDialog):
for row in range(0, self.VerseListView.count()): for row in range(0, self.VerseListView.count()):
item = self.VerseListView.item(row) item = self.VerseListView.item(row)
verse_list += item.text() verse_list += item.text()
if row != self.VerseListView.count() - 1: if row != self.VerseListView.count() - 1:
verse_list += u'\n[---]\n' verse_list += u'\n[---]\n'
self.editText(verse_list) self.editText(verse_list)
def editText(self, text): def editText(self, text):

View File

@ -32,7 +32,7 @@ from openlp.plugins.custom.lib.models import init_models, metadata, CustomSlide
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
class CustomManager(): class CustomManager(object):
""" """
The Song Manager provides a central location for all database code. This The Song Manager provides a central location for all database code. This
class takes care of connecting to the database and running all the queries. class takes care of connecting to the database and running all the queries.

View File

@ -75,7 +75,7 @@ class ImageMediaItem(MediaManagerItem):
self.ListView.clear() self.ListView.clear()
self.ListView.setSelectionMode( self.ListView.setSelectionMode(
QtGui.QAbstractItemView.ExtendedSelection) QtGui.QAbstractItemView.ExtendedSelection)
self.ListView.setIconSize(QtCore.QSize(88,50)) self.ListView.setIconSize(QtCore.QSize(88, 50))
self.servicePath = os.path.join( self.servicePath = os.path.join(
AppLocation.get_section_data_path(self.settingsSection), AppLocation.get_section_data_path(self.settingsSection),
u'thumbnails') u'thumbnails')

View File

@ -129,7 +129,7 @@ class MediaMediaItem(MediaManagerItem):
def initialise(self): def initialise(self):
self.ListView.setSelectionMode( self.ListView.setSelectionMode(
QtGui.QAbstractItemView.ExtendedSelection) QtGui.QAbstractItemView.ExtendedSelection)
self.ListView.setIconSize(QtCore.QSize(88,50)) self.ListView.setIconSize(QtCore.QSize(88, 50))
self.loadList(SettingsManager.load_list( self.loadList(SettingsManager.load_list(
self.settingsSection, self.settingsSection)) self.settingsSection, self.settingsSection))

View File

@ -354,10 +354,10 @@ class ImpressDocument(PresentationDocument):
self.control.gotoSlideIndex(slideno-1) self.control.gotoSlideIndex(slideno-1)
def next_step(self): def next_step(self):
""" """
Triggers the next effect of slide on the running presentation Triggers the next effect of slide on the running presentation
""" """
self.control.gotoNextEffect() self.control.gotoNextEffect()
def previous_step(self): def previous_step(self):
""" """

View File

@ -109,7 +109,7 @@ class PresentationMediaItem(MediaManagerItem):
self.servicePath = os.path.join( self.servicePath = os.path.join(
AppLocation.get_section_data_path(self.settingsSection), AppLocation.get_section_data_path(self.settingsSection),
u'thumbnails') u'thumbnails')
self.ListView.setIconSize(QtCore.QSize(88,50)) self.ListView.setIconSize(QtCore.QSize(88, 50))
if not os.path.exists(self.servicePath): if not os.path.exists(self.servicePath):
os.mkdir(self.servicePath) os.mkdir(self.servicePath)
list = SettingsManager.load_list( list = SettingsManager.load_list(

View File

@ -73,7 +73,7 @@ class PptviewController(PresentationController):
self.start_process() self.start_process()
return self.process.CheckInstalled() return self.process.CheckInstalled()
except: except:
return False return False
def start_process(self): def start_process(self):
""" """

View File

@ -151,7 +151,7 @@ class PresentationController(object):
if doc is None: if doc is None:
return return
if doc in self.docs: if doc in self.docs:
self.docs.remove(doc) self.docs.remove(doc)
def close_presentation(self): def close_presentation(self):
pass pass

View File

@ -95,10 +95,9 @@ class PresentationPlugin(Plugin):
log.debug(u'Importing controller %s', modulename) log.debug(u'Importing controller %s', modulename)
try: try:
__import__(modulename, globals(), locals(), []) __import__(modulename, globals(), locals(), [])
except ImportError, e: except ImportError:
log.error( log.exception(u'Failed to import %s on path %s',
u'Failed to import %s on path %s for reason %s', modulename, path)
modulename, path, e.args[0])
controller_classes = PresentationController.__subclasses__() controller_classes = PresentationController.__subclasses__()
for controller_class in controller_classes: for controller_class in controller_classes:
controller = controller_class(self) controller = controller_class(self)
@ -114,3 +113,4 @@ class PresentationPlugin(Plugin):
'programs. The choice of available presentation programs is ' 'programs. The choice of available presentation programs is '
'available to the user in a drop down box.') 'available to the user in a drop down box.')
return about_text return about_text

View File

@ -206,14 +206,17 @@ class HttpConnection(object):
mimetype = u'image/png' mimetype = u'image/png'
else: else:
return (None, None) return (None, None)
file_handle = None
try: try:
f = open(path, u'rb') file_handle = open(path, u'rb')
except: log.debug(u'Opened %s' % path)
html = file_handle.read()
except IOError:
log.exception(u'Failed to open %s' % path) log.exception(u'Failed to open %s' % path)
return None return None
log.debug(u'Opened %s' % path) finally:
html = f.read() if file_handle:
f.close() file_handle.close()
return (mimetype, html) return (mimetype, html)
def load_params(self, query): def load_params(self, query):

View File

@ -127,8 +127,8 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
authorsCompleter = QtGui.QCompleter( authorsCompleter = QtGui.QCompleter(
[author.display_name for author in authors], [author.display_name for author in authors],
self.AuthorsSelectionComboItem) self.AuthorsSelectionComboItem)
authorsCompleter.setCaseSensitivity(QtCore.Qt.CaseInsensitive); authorsCompleter.setCaseSensitivity(QtCore.Qt.CaseInsensitive)
self.AuthorsSelectionComboItem.setCompleter(authorsCompleter); self.AuthorsSelectionComboItem.setCompleter(authorsCompleter)
self.AuthorsSelectionComboItem.clear() self.AuthorsSelectionComboItem.clear()
for author in authors: for author in authors:
row = self.AuthorsSelectionComboItem.count() row = self.AuthorsSelectionComboItem.count()
@ -139,10 +139,9 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
def loadTopics(self): def loadTopics(self):
topics = self.songmanager.get_topics() topics = self.songmanager.get_topics()
topicsCompleter = QtGui.QCompleter( topicsCompleter = QtGui.QCompleter(
[topic.name for topic in topics], [topic.name for topic in topics], self.SongTopicCombo)
self.SongTopicCombo) topicsCompleter.setCaseSensitivity(QtCore.Qt.CaseInsensitive)
topicsCompleter.setCaseSensitivity(QtCore.Qt.CaseInsensitive); self.SongTopicCombo.setCompleter(topicsCompleter)
self.SongTopicCombo.setCompleter(topicsCompleter);
self.SongTopicCombo.clear() self.SongTopicCombo.clear()
for topic in topics: for topic in topics:
row = self.SongTopicCombo.count() row = self.SongTopicCombo.count()
@ -153,8 +152,8 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
books = self.songmanager.get_books() books = self.songmanager.get_books()
booksCompleter = QtGui.QCompleter( booksCompleter = QtGui.QCompleter(
[book.name for book in books], self.SongbookCombo) [book.name for book in books], self.SongbookCombo)
booksCompleter.setCaseSensitivity(QtCore.Qt.CaseInsensitive); booksCompleter.setCaseSensitivity(QtCore.Qt.CaseInsensitive)
self.SongbookCombo.setCompleter(booksCompleter); self.SongbookCombo.setCompleter(booksCompleter)
self.SongbookCombo.clear() self.SongbookCombo.clear()
self.SongbookCombo.addItem(u' ') self.SongbookCombo.addItem(u' ')
for book in books: for book in books:
@ -166,8 +165,8 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
themesCompleter = QtGui.QCompleter( themesCompleter = QtGui.QCompleter(
[theme for theme in theme_list], [theme for theme in theme_list],
self.ThemeSelectionComboItem) self.ThemeSelectionComboItem)
themesCompleter.setCaseSensitivity(QtCore.Qt.CaseInsensitive); themesCompleter.setCaseSensitivity(QtCore.Qt.CaseInsensitive)
self.ThemeSelectionComboItem.setCompleter(themesCompleter); self.ThemeSelectionComboItem.setCompleter(themesCompleter)
self.ThemeSelectionComboItem.clear() self.ThemeSelectionComboItem.clear()
self.ThemeSelectionComboItem.addItem(u' ') self.ThemeSelectionComboItem.addItem(u' ')
for theme in theme_list: for theme in theme_list:

View File

@ -81,7 +81,7 @@ class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog):
return -1 return -1
def _deleteItem(self, list_widget, get_func, del_func, reset_func, def _deleteItem(self, list_widget, get_func, del_func, reset_func,
dlg_title, del_text, err_text, sel_text): dlg_title, del_text, err_text, sel_text):
item_id = self._getCurrentItemId(list_widget) item_id = self._getCurrentItemId(list_widget)
if item_id != -1: if item_id != -1:
item = get_func(item_id) item = get_func(item_id)
@ -93,11 +93,9 @@ class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog):
del_func(item.id) del_func(item.id)
reset_func() reset_func()
else: else:
QtGui.QMessageBox.critical(self, dlg_title, err_text, QtGui.QMessageBox.critical(self, dlg_title, err_text)
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok))
else: else:
QtGui.QMessageBox.critical(self, dlg_title, sel_text, QtGui.QMessageBox.critical(self, dlg_title, sel_text)
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok))
def resetAuthors(self): def resetAuthors(self):
self.AuthorsListWidget.clear() self.AuthorsListWidget.clear()
@ -131,39 +129,41 @@ class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog):
self.authorform.setAutoDisplayName(True) self.authorform.setAutoDisplayName(True)
if self.authorform.exec_(): if self.authorform.exec_():
author = Author.populate( author = Author.populate(
first_name=unicode(self.authorform.FirstNameEdit.text(), u'utf-8'), first_name=unicode(
last_name=unicode(self.authorform.LastNameEdit.text(), u'utf-8'), self.authorform.FirstNameEdit.text(), u'utf-8'),
display_name=unicode(self.authorform.DisplayEdit.text(), u'utf-8')) last_name=unicode(
self.authorform.LastNameEdit.text(), u'utf-8'),
display_name=unicode(
self.authorform.DisplayEdit.text(), u'utf-8'))
if self.songmanager.save_author(author): if self.songmanager.save_author(author):
self.resetAuthors() self.resetAuthors()
else: else:
QtGui.QMessageBox.critical( QtGui.QMessageBox.critical(
self, self.trUtf8('Error'), self, self.trUtf8('Error'),
self.trUtf8('Couldn\'t add your author.'), self.trUtf8('Couldn\'t add your author.'))
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok))
def onTopicAddButtonClick(self): def onTopicAddButtonClick(self):
if self.topicform.exec_(): if self.topicform.exec_():
topic = Topic.populate(name=unicode(self.topicform.NameEdit.text(), u'utf-8')) topic = Topic.populate(
name=unicode(self.topicform.NameEdit.text(), u'utf-8'))
if self.songmanager.save_topic(topic): if self.songmanager.save_topic(topic):
self.resetTopics() self.resetTopics()
else: else:
QtGui.QMessageBox.critical( QtGui.QMessageBox.critical(
self, self.trUtf8('Error'), self, self.trUtf8('Error'),
self.trUtf8('Couldn\'t add your topic.'), self.trUtf8('Couldn\'t add your topic.'))
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok))
def onBookAddButtonClick(self): def onBookAddButtonClick(self):
if self.bookform.exec_(): if self.bookform.exec_():
book = Book.populate(name=unicode(self.bookform.NameEdit.text(), u'utf-8'), book = Book.populate(
name=unicode(self.bookform.NameEdit.text(), u'utf-8'),
publisher=unicode(self.bookform.PublisherEdit.text(), u'utf-8')) publisher=unicode(self.bookform.PublisherEdit.text(), u'utf-8'))
if self.songmanager.save_book(book): if self.songmanager.save_book(book):
self.resetBooks() self.resetBooks()
else: else:
QtGui.QMessageBox.critical( QtGui.QMessageBox.critical(
self, self.trUtf8('Error'), self, self.trUtf8('Error'),
self.trUtf8('Couldn\'t add your book.'), self.trUtf8('Couldn\'t add your book.'))
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok))
def onAuthorEditButtonClick(self): def onAuthorEditButtonClick(self):
author_id = self._getCurrentItemId(self.AuthorsListWidget) author_id = self._getCurrentItemId(self.AuthorsListWidget)
@ -174,16 +174,18 @@ class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog):
self.authorform.LastNameEdit.setText(author.last_name) self.authorform.LastNameEdit.setText(author.last_name)
self.authorform.DisplayEdit.setText(author.display_name) self.authorform.DisplayEdit.setText(author.display_name)
if self.authorform.exec_(False): if self.authorform.exec_(False):
author.first_name = unicode(self.authorform.FirstNameEdit.text(), u'utf-8') author.first_name = unicode(
author.last_name = unicode(self.authorform.LastNameEdit.text(), u'utf-8') self.authorform.FirstNameEdit.text(), u'utf-8')
author.display_name = unicode(self.authorform.DisplayEdit.text(), u'utf-8') author.last_name = unicode(
self.authorform.LastNameEdit.text(), u'utf-8')
author.display_name = unicode(
self.authorform.DisplayEdit.text(), u'utf-8')
if self.songmanager.save_author(author): if self.songmanager.save_author(author):
self.resetAuthors() self.resetAuthors()
else: else:
QtGui.QMessageBox.critical( QtGui.QMessageBox.critical(
self, self.trUtf8('Error'), self, self.trUtf8('Error'),
self.trUtf8('Couldn\'t save your author.'), self.trUtf8('Couldn\'t save your author.'))
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok))
def onTopicEditButtonClick(self): def onTopicEditButtonClick(self):
topic_id = self._getCurrentItemId(self.TopicsListWidget) topic_id = self._getCurrentItemId(self.TopicsListWidget)
@ -197,8 +199,7 @@ class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog):
else: else:
QtGui.QMessageBox.critical( QtGui.QMessageBox.critical(
self, self.trUtf8('Error'), self, self.trUtf8('Error'),
self.trUtf8('Couldn\'t save your topic.'), self.trUtf8('Couldn\'t save your topic.'))
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok))
def onBookEditButtonClick(self): def onBookEditButtonClick(self):
book_id = self._getCurrentItemId(self.BooksListWidget) book_id = self._getCurrentItemId(self.BooksListWidget)
@ -208,14 +209,14 @@ class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog):
self.bookform.PublisherEdit.setText(book.publisher) self.bookform.PublisherEdit.setText(book.publisher)
if self.bookform.exec_(False): if self.bookform.exec_(False):
book.name = unicode(self.bookform.NameEdit.text(), u'utf-8') book.name = unicode(self.bookform.NameEdit.text(), u'utf-8')
book.publisher = unicode(self.bookform.PublisherEdit.text(), u'utf-8') book.publisher = unicode(
self.bookform.PublisherEdit.text(), u'utf-8')
if self.songmanager.save_book(book): if self.songmanager.save_book(book):
self.resetBooks() self.resetBooks()
else: else:
QtGui.QMessageBox.critical( QtGui.QMessageBox.critical(
self, self.trUtf8('Error'), self, self.trUtf8('Error'),
self.trUtf8('Couldn\'t save your book.'), self.trUtf8('Couldn\'t save your book.'))
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok))
def onAuthorDeleteButtonClick(self): def onAuthorDeleteButtonClick(self):
""" """

View File

@ -50,7 +50,8 @@ class Book(BaseModel):
Book model Book model
""" """
def __repr__(self): def __repr__(self):
return u'<Book id="%s" name="%s" publisher="%s" />' % (str(self.id), self.name, self.publisher) return u'<Book id="%s" name="%s" publisher="%s" />' % (
str(self.id), self.name, self.publisher)
class Song(BaseModel): class Song(BaseModel):
""" """

View File

@ -270,7 +270,7 @@ class SongMediaItem(MediaManagerItem):
self.edit_song_form.loadSong(fields[1], (fields[0] == u'P')) self.edit_song_form.loadSong(fields[1], (fields[0] == u'P'))
self.edit_song_form.exec_() self.edit_song_form.exec_()
def onEditClick(self, preview=False): def onEditClick(self):
item = self.ListView.currentItem() item = self.ListView.currentItem()
if item: if item:
item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0] item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0]
@ -283,7 +283,8 @@ class SongMediaItem(MediaManagerItem):
if len(items) == 1: if len(items) == 1:
del_message = self.trUtf8('Delete song?') del_message = self.trUtf8('Delete song?')
else: else:
del_message = unicode(self.trUtf8('Delete %d songs?')) % len(items) del_message = unicode(
self.trUtf8('Delete %d songs?')) % len(items)
ans = QtGui.QMessageBox.question(self, ans = QtGui.QMessageBox.question(self,
self.trUtf8('Delete Confirmation'), del_message, self.trUtf8('Delete Confirmation'), del_message,
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok| QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok|
@ -323,7 +324,8 @@ class SongMediaItem(MediaManagerItem):
#no verse list or only 1 space (in error) #no verse list or only 1 space (in error)
if not song.verse_order or not song.verse_order.strip(): if not song.verse_order or not song.verse_order.strip():
for verse in verseList: for verse in verseList:
verse_tag = u'%s:%s' % (verse[0][u'type'], verse[0][u'label']) verse_tag = u'%s:%s' % (
verse[0][u'type'], verse[0][u'label'])
service_item.add_from_text(\ service_item.add_from_text(\
verse[1][:30], unicode(verse[1]), verse_tag) verse[1][:30], unicode(verse[1]), verse_tag)
else: else:
@ -372,4 +374,3 @@ class SongMediaItem(MediaManagerItem):
] ]
return True return True

View File

@ -67,7 +67,7 @@ class SofImport(OooImport):
Initialise the class. Requires a songmanager class which is passed Initialise the class. Requires a songmanager class which is passed
to SongImport for writing song to disk to SongImport for writing song to disk
""" """
OooImport.__init__(self,songmanager) OooImport.__init__(self, songmanager)
def import_sof(self, filename): def import_sof(self, filename):
self.start_ooo() self.start_ooo()
@ -332,105 +332,205 @@ class SofImport(OooImport):
Because someone at Kingsway forgot to check the 1+2 RTF file, Because someone at Kingsway forgot to check the 1+2 RTF file,
some verses were not formatted correctly. some verses were not formatted correctly.
""" """
if song_number == 11: return 8 if song_number == 11:
if song_number == 18: return 5 return 8
if song_number == 21: return 6 if song_number == 18:
if song_number == 23: return 4 return 5
if song_number == 24: return 7 if song_number == 21:
if song_number == 27: return 4 return 6
if song_number == 31: return 6 if song_number == 23:
if song_number == 49: return 4 return 4
if song_number == 50: return 8 if song_number == 24:
if song_number == 70: return 4 return 7
if song_number == 75: return 8 if song_number == 27:
if song_number == 79: return 6 return 4
if song_number == 97: return 7 if song_number == 31:
if song_number == 107: return 4 return 6
if song_number == 109: return 4 if song_number == 49:
if song_number == 133: return 4 return 4
if song_number == 155: return 10 if song_number == 50:
if song_number == 156: return 8 return 8
if song_number == 171: return 4 if song_number == 70:
if song_number == 188: return 7 return 4
if song_number == 192: return 4 if song_number == 75:
if song_number == 208: return 8 return 8
if song_number == 215: return 8 if song_number == 79:
if song_number == 220: return 4 return 6
if song_number == 247: return 6 if song_number == 97:
if song_number == 248: return 6 return 7
if song_number == 251: return 8 if song_number == 107:
if song_number == 295: return 8 return 4
if song_number == 307: return 5 if song_number == 109:
if song_number == 314: return 6 return 4
if song_number == 325: return 8 if song_number == 133:
if song_number == 386: return 6 return 4
if song_number == 415: return 4 if song_number == 155:
if song_number == 426: return 4 return 10
if song_number == 434: return 5 if song_number == 156:
if song_number == 437: return 4 return 8
if song_number == 438: return 6 if song_number == 171:
if song_number == 456: return 8 return 4
if song_number == 461: return 4 if song_number == 188:
if song_number == 469: return 4 return 7
if song_number == 470: return 5 if song_number == 192:
if song_number == 476: return 6 return 4
if song_number == 477: return 7 if song_number == 208:
if song_number == 480: return 8 return 8
if song_number == 482: return 4 if song_number == 215:
if song_number == 512: return 4 return 8
if song_number == 513: return 8 if song_number == 220:
if song_number == 518: return 5 return 4
if song_number == 520: return 4 if song_number == 247:
if song_number == 523: return 6 return 6
if song_number == 526: return 8 if song_number == 248:
if song_number == 527: return 4 return 6
if song_number == 529: return 4 if song_number == 251:
if song_number == 537: return 4 return 8
if song_number == 555: return 6 if song_number == 295:
if song_number == 581: return 4 return 8
if song_number == 589: return 6 if song_number == 307:
if song_number == 590: return 4 return 5
if song_number == 593: return 8 if song_number == 314:
if song_number == 596: return 4 return 6
if song_number == 610: return 6 if song_number == 325:
if song_number == 611: return 6 return 8
if song_number == 619: return 8 if song_number == 386:
if song_number == 645: return 5 return 6
if song_number == 653: return 6 if song_number == 415:
if song_number == 683: return 7 return 4
if song_number == 686: return 4 if song_number == 426:
if song_number == 697: return 8 return 4
if song_number == 698: return 4 if song_number == 434:
if song_number == 704: return 6 return 5
if song_number == 716: return 4 if song_number == 437:
if song_number == 717: return 6 return 4
if song_number == 730: return 4 if song_number == 438:
if song_number == 731: return 8 return 6
if song_number == 732: return 8 if song_number == 456:
if song_number == 738: return 4 return 8
if song_number == 756: return 9 if song_number == 461:
if song_number == 815: return 6 return 4
if song_number == 830: return 8 if song_number == 469:
if song_number == 831: return 4 return 4
if song_number == 876: return 6 if song_number == 470:
if song_number == 877: return 6 return 5
if song_number == 892: return 4 if song_number == 476:
if song_number == 894: return 6 return 6
if song_number == 902: return 8 if song_number == 477:
if song_number == 905: return 8 return 7
if song_number == 921: return 6 if song_number == 480:
if song_number == 940: return 7 return 8
if song_number == 955: return 9 if song_number == 482:
if song_number == 968: return 8 return 4
if song_number == 972: return 7 if song_number == 512:
if song_number == 974: return 4 return 4
if song_number == 988: return 6 if song_number == 513:
if song_number == 991: return 5 return 8
if song_number == 1002: return 8 if song_number == 518:
if song_number == 1024: return 8 return 5
if song_number == 1044: return 9 if song_number == 520:
if song_number == 1088: return 6 return 4
if song_number == 1117: return 6 if song_number == 523:
if song_number == 1119: return 7 return 6
if song_number == 526:
return 8
if song_number == 527:
return 4
if song_number == 529:
return 4
if song_number == 537:
return 4
if song_number == 555:
return 6
if song_number == 581:
return 4
if song_number == 589:
return 6
if song_number == 590:
return 4
if song_number == 593:
return 8
if song_number == 596:
return 4
if song_number == 610:
return 6
if song_number == 611:
return 6
if song_number == 619:
return 8
if song_number == 645:
return 5
if song_number == 653:
return 6
if song_number == 683:
return 7
if song_number == 686:
return 4
if song_number == 697:
return 8
if song_number == 698:
return 4
if song_number == 704:
return 6
if song_number == 716:
return 4
if song_number == 717:
return 6
if song_number == 730:
return 4
if song_number == 731:
return 8
if song_number == 732:
return 8
if song_number == 738:
return 4
if song_number == 756:
return 9
if song_number == 815:
return 6
if song_number == 830:
return 8
if song_number == 831:
return 4
if song_number == 876:
return 6
if song_number == 877:
return 6
if song_number == 892:
return 4
if song_number == 894:
return 6
if song_number == 902:
return 8
if song_number == 905:
return 8
if song_number == 921:
return 6
if song_number == 940:
return 7
if song_number == 955:
return 9
if song_number == 968:
return 8
if song_number == 972:
return 7
if song_number == 974:
return 4
if song_number == 988:
return 6
if song_number == 991:
return 5
if song_number == 1002:
return 8
if song_number == 1024:
return 8
if song_number == 1044:
return 9
if song_number == 1088:
return 6
if song_number == 1117:
return 6
if song_number == 1119:
return 7
return None return None

View File

@ -122,8 +122,9 @@ class SongImport(object):
or text.lower().find(self.copyright_symbol) >= 0: or text.lower().find(self.copyright_symbol) >= 0:
copyright_found = False copyright_found = False
for line in lines: for line in lines:
if copyright_found or line.lower().find(self.copyright_string) >= 0\ if (copyright_found or
or line.lower().find(self.copyright_symbol) >= 0: line.lower().find(self.copyright_string) >= 0 or
line.lower().find(self.copyright_symbol) >= 0):
copyright_found = True copyright_found = True
self.add_copyright(line) self.add_copyright(line)
else: else:
@ -264,8 +265,8 @@ class SongImport(object):
""" """
Remove punctuation from the string for searchable fields Remove punctuation from the string for searchable fields
""" """
for c in string.punctuation: for character in string.punctuation:
text = text.replace(c, u'') text = text.replace(character, u'')
return text return text
def finish(self): def finish(self):

View File

@ -23,6 +23,7 @@
# Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Temple Place, Suite 330, Boston, MA 02111-1307 USA #
############################################################################### ###############################################################################
import logging
import sys import sys
import os import os
@ -32,6 +33,9 @@ sys.path.append(os.path.abspath(u'./../../../..'))
from openlp.core.lib import XmlRootClass from openlp.core.lib import XmlRootClass
log = logging.getLogger(__name__)
class SongException(Exception): class SongException(Exception):
pass pass
@ -71,7 +75,7 @@ _blankOpenSongXml = \
''' '''
class _OpenSong(XmlRootClass): class _OpenSong(XmlRootClass):
"""Class for import of OpenSogn""" """Class for import of OpenSong"""
def __init__(self, xmlContent = None): def __init__(self, xmlContent = None):
"""Initialize from given xml content""" """Initialize from given xml content"""
@ -80,7 +84,6 @@ class _OpenSong(XmlRootClass):
def _reset(self): def _reset(self):
"""Reset all song attributes""" """Reset all song attributes"""
global _blankOpenSongXml
self._setFromXml(_blankOpenSongXml, 'song') self._setFromXml(_blankOpenSongXml, 'song')
def from_buffer(self, xmlContent): def from_buffer(self, xmlContent):
@ -110,8 +113,7 @@ class _OpenSong(XmlRootClass):
res.append(self.theme) res.append(self.theme)
if self.alttheme: if self.alttheme:
res.append(self.alttheme) res.append(self.alttheme)
s = u', u'.join(res) return u', u'.join(res)
return s
def _reorder_verse(self, tag, tmpVerse): def _reorder_verse(self, tag, tmpVerse):
""" """
@ -120,28 +122,28 @@ class _OpenSong(XmlRootClass):
tmpVerse -- list of strings tmpVerse -- list of strings
""" """
res = [] res = []
for c in '1234567890 ': for digit in '1234567890 ':
tagPending = True tagPending = True
for l in tmpVerse: for line in tmpVerse:
if l.startswith(c): if line.startswith(digit):
if tagPending: if tagPending:
tagPending = False tagPending = False
t = tag.strip(u'[]').lower() tagChar = tag.strip(u'[]').lower()
if 'v' == t: if 'v' == tagChar:
newtag = "Verse" newtag = "Verse"
elif 'c' == t: elif 'c' == tagChar:
newtag = "Chorus" newtag = "Chorus"
elif 'b' == t: elif 'b' == tagChar:
newtag = "Bridge" newtag = "Bridge"
elif 'p' == t: elif 'p' == tagChar:
newtag = "Pre-chorus" newtag = "Pre-chorus"
else: else:
newtag = t newtag = tagChar
s = (u'# %s %s' % (newtag, c)).rstrip() tagString = (u'# %s %s' % (newtag, digit)).rstrip()
res.append(s) res.append(tagString)
res.append(l[1:]) res.append(line[1:])
if (len(l) == 0) and (not tagPending): if (len(line) == 0) and (not tagPending):
res.append(l) res.append(line)
return res return res
def get_lyrics(self): def get_lyrics(self):
@ -162,13 +164,13 @@ class _OpenSong(XmlRootClass):
if line.startswith(u'['): if line.startswith(u'['):
tag = line tag = line
else: else:
r = self._reorder_verse(tag, tmpVerse) reorderedVerse = self._reorder_verse(tag, tmpVerse)
finalLyrics.extend(r) finalLyrics.extend(reorderedVerse)
tag = "" tag = ""
tmpVerse = [] tmpVerse = []
# catch up final verse # catch up final verse
r = self._reorder_verse(tag, tmpVerse) reorderedVerse = self._reorder_verse(tag, tmpVerse)
finalLyrics.extend(r) finalLyrics.extend(reorderedVerse)
return finalLyrics return finalLyrics
@ -301,7 +303,7 @@ class Song(object):
string = title string = title
for char in punctuation: for char in punctuation:
string = string.replace(char, '') string = string.replace(char, '')
return s return string
def set_title(self, title): def set_title(self, title):
"""Set the song title """Set the song title
@ -341,36 +343,36 @@ class Song(object):
sCopyright = "" sCopyright = ""
sCcli = "" sCcli = ""
lastpart = 0 lastpart = 0
n = 0 lineCount = 0
metMisc = False metMisc = False
lyrics = [] lyrics = []
for l in textList: for line in textList:
n += 1 lineCount += 1
if lastpart > 0: if lastpart > 0:
lastpart += 1 lastpart += 1
if lastpart == 2: if lastpart == 2:
sCopyright = l[1:].strip() sCopyright = line[1:].strip()
if lastpart == 3: if lastpart == 3:
sAuthor = l sAuthor = line
elif l.startswith(u'CCLI Song'): elif line.startswith(u'CCLI Song'):
sCcli = l[13:].strip() sCcli = line[13:].strip()
lastpart = 1 lastpart = 1
else: else:
if metMisc: if metMisc:
metMisc = False metMisc = False
if l.upper().startswith(u'(BRIDGE)'): if line.upper().startswith(u'(BRIDGE)'):
lyrics.append(u'# Bridge') lyrics.append(u'# Bridge')
# otherwise unknown misc keyword # otherwise unknown misc keyword
elif l.startswith(u'Misc'): elif line.startswith(u'Misc'):
metMisc = True metMisc = True
elif l.startswith(u'Verse') or l.startswith(u'Chorus'): elif line.startswith(u'Verse') or line.startswith(u'Chorus'):
lyrics.append(u'# %s'%l) lyrics.append(u'# %s' % line)
else: else:
# should we remove multiple blank lines? # should we remove multiple blank lines?
if n == 1: if lineCount == 1:
sName = l sName = line
else: else:
lyrics.append(l) lyrics.append(line)
# split on known separators # split on known separators
lst = sAuthor.split(u'/') lst = sAuthor.split(u'/')
if len(lst) < 2: if len(lst) < 2:
@ -403,7 +405,7 @@ class Song(object):
if string_in is None: if string_in is None:
string_out = "" string_out = ""
else: else:
string_out = unicode(s) string_out = unicode(string_in)
return string_out return string_out
def _split_to_list(self, aString): def _split_to_list(self, aString):

View File

@ -35,10 +35,11 @@ from songusagedetaildialog import Ui_SongUsageDetailDialog
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
class SongUsageDetailForm(QtGui.QDialog, Ui_SongUsageDetailDialog): class SongUsageDetailForm(QtGui.QDialog, Ui_SongUsageDetailDialog):
log.info(u'SongUsage Detail Form loaded')
""" """
Class documentation goes here. Class documentation goes here.
""" """
log.info(u'SongUsage Detail Form Loaded')
def __init__(self, parent=None): def __init__(self, parent=None):
""" """
Constructor Constructor

View File

@ -33,7 +33,7 @@ from openlp.plugins.songusage.lib.models import init_models, metadata, \
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
class SongUsageManager(): class SongUsageManager(object):
""" """
The Song Manager provides a central location for all database code. This The Song Manager provides a central location for all database code. This
class takes care of connecting to the database and running all the queries. class takes care of connecting to the database and running all the queries.