Merge from trunk

This commit is contained in:
Raoul Snyman 2010-06-18 18:44:10 +02:00
commit cc2db3a5f4
48 changed files with 552 additions and 514 deletions

View File

@ -80,9 +80,9 @@ def str_to_bool(stringvalue):
``stringvalue``
The string value to examine and convert to a boolean type.
"""
if stringvalue is True or stringvalue is False:
if isinstance(stringvalue, bool):
return stringvalue
return stringvalue.strip().lower() in (u'true', u'yes', u'y')
return unicode(stringvalue).strip().lower() in (u'true', u'yes', u'y')
def build_icon(icon):
"""
@ -95,24 +95,24 @@ def build_icon(icon):
The icon to build. This can be a QIcon, a resource string in the form
``:/resource/file.png``, or a file location like ``/path/to/file.png``.
"""
ButtonIcon = None
button_icon = None
if isinstance(icon, QtGui.QIcon):
ButtonIcon = icon
button_icon = icon
elif isinstance(icon, basestring):
ButtonIcon = QtGui.QIcon()
button_icon = QtGui.QIcon()
if icon.startswith(u':/'):
ButtonIcon.addPixmap(
QtGui.QPixmap(icon), QtGui.QIcon.Normal, QtGui.QIcon.Off)
button_icon.addPixmap(QtGui.QPixmap(icon), QtGui.QIcon.Normal,
QtGui.QIcon.Off)
else:
ButtonIcon.addPixmap(QtGui.QPixmap.fromImage(QtGui.QImage(icon)),
button_icon.addPixmap(QtGui.QPixmap.fromImage(QtGui.QImage(icon)),
QtGui.QIcon.Normal, QtGui.QIcon.Off)
elif isinstance(icon, QtGui.QImage):
ButtonIcon = QtGui.QIcon()
ButtonIcon.addPixmap(
QtGui.QPixmap.fromImage(icon), QtGui.QIcon.Normal, QtGui.QIcon.Off)
return ButtonIcon
button_icon = QtGui.QIcon()
button_icon.addPixmap(QtGui.QPixmap.fromImage(icon),
QtGui.QIcon.Normal, QtGui.QIcon.Off)
return button_icon
def contextMenuAction(base, icon, text, slot):
def context_menu_action(base, icon, text, slot):
"""
Utility method to help build context menus for plugins
"""
@ -122,7 +122,7 @@ def contextMenuAction(base, icon, text, slot):
QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered()'), slot)
return action
def contextMenu(base, icon, text):
def context_menu(base, icon, text):
"""
Utility method to help build context menus for plugins
"""
@ -130,7 +130,7 @@ def contextMenu(base, icon, text):
action.setIcon(build_icon(icon))
return action
def contextMenuSeparator(base):
def context_menu_separator(base):
"""
Add a separator to a context menu
"""
@ -152,12 +152,12 @@ def resize_image(image, width, height):
realw = preview.width()
realh = preview.height()
# and move it to the centre of the preview space
newImage = QtGui.QImage(width, height,
new_image = QtGui.QImage(width, height,
QtGui.QImage.Format_ARGB32_Premultiplied)
newImage.fill(QtCore.Qt.black)
painter = QtGui.QPainter(newImage)
new_image.fill(QtCore.Qt.black)
painter = QtGui.QPainter(new_image)
painter.drawImage((width - realw) / 2, (height - realh) / 2, preview)
return newImage
return new_image
class ThemeLevel(object):

View File

@ -28,8 +28,8 @@ import os
from PyQt4 import QtCore, QtGui
from openlp.core.lib import contextMenuAction, contextMenuSeparator, \
SettingsManager, OpenLPToolbar, ServiceItem, build_icon
from openlp.core.lib import context_menu_action, context_menu_separator, \
SettingsManager, OpenLPToolbar, ServiceItem, build_icon, translate
log = logging.getLogger(__name__)
@ -110,7 +110,6 @@ class MediaManagerItem(QtGui.QWidget):
self.remoteTriggered = None
self.ServiceItemIconName = None
self.singleServiceItem = True
self.addToServiceItem = False
self.PageLayout = QtGui.QVBoxLayout(self)
self.PageLayout.setSpacing(0)
self.PageLayout.setContentsMargins(4, 0, 4, 0)
@ -133,6 +132,7 @@ class MediaManagerItem(QtGui.QWidget):
self.hasEditIcon = True
self.hasFileIcon = False
self.hasDeleteIcon = True
self.addToServiceItem = False
def retranslateUi(self):
"""
@ -208,50 +208,62 @@ class MediaManagerItem(QtGui.QWidget):
## Import Button ##
if self.hasImportIcon:
self.addToolbarButton(
u'Import %s' % self.PluginNameShort,
u'%s %s' % (self.trUtf8('Import a'), self.PluginNameVisible),
unicode(translate(u'MediaManagerItem', u'Import %s')) % \
self.PluginNameShort,
unicode(translate(u'MediaManagerItem', u'Import a %s')) % \
self.PluginNameVisible,
u':/general/general_import.png', self.onImportClick)
## File Button ##
if self.hasFileIcon:
self.addToolbarButton(
u'Load %s' % self.PluginNameShort,
u'%s %s' % (self.trUtf8('Load a new'), self.PluginNameVisible),
unicode(translate(u'MediaManagerItem', u'Load %s')) % \
self.PluginNameShort,
unicode(translate(u'MediaManagerItem', u'Load a new %s')) % \
self.PluginNameVisible,
u':/general/general_open.png', self.onFileClick)
## New Button ##
if self.hasNewIcon:
self.addToolbarButton(
u'New %s' % self.PluginNameShort,
u'%s %s' % (self.trUtf8('Add a new'), self.PluginNameVisible),
unicode(translate(u'MediaManagerItem', u'New %s')) % \
self.PluginNameShort,
unicode(translate(u'MediaManagerItem', u'Add a new %s')) % \
self.PluginNameVisible,
u':/general/general_new.png', self.onNewClick)
## Edit Button ##
if self.hasEditIcon:
self.addToolbarButton(
u'Edit %s' % self.PluginNameShort,
u'%s %s' % (self.trUtf8('Edit the selected'),
self.PluginNameVisible),
unicode(translate(u'MediaManagerItem', u'Edit %s')) % \
self.PluginNameShort,
unicode(translate(
u'MediaManagerItem', u'Edit the selected %s')) % \
self.PluginNameVisible,
u':/general/general_edit.png', self.onEditClick)
## Delete Button ##
if self.hasDeleteIcon:
self.addToolbarButton(
u'Delete %s' % self.PluginNameShort,
self.trUtf8('Delete the selected item'),
unicode(translate(u'MediaManagerItem', u'Delete %s')) % \
self.PluginNameShort,
translate(u'MediaManagerItem', u'Delete the selected item'),
u':/general/general_delete.png', self.onDeleteClick)
## Separator Line ##
self.addToolbarSeparator()
## Preview ##
self.addToolbarButton(
u'Preview %s' % self.PluginNameShort,
self.trUtf8('Preview the selected item'),
unicode(translate(u'MediaManagerItem', u'Preview %s')) % \
self.PluginNameShort,
translate(u'MediaManagerItem', u'Preview the selected item'),
u':/general/general_preview.png', self.onPreviewClick)
## Live Button ##
self.addToolbarButton(
u'Go Live',
self.trUtf8('Send the selected item live'),
translate(u'MediaManagerItem', u'Send the selected item live'),
u':/general/general_live.png', self.onLiveClick)
## Add to service Button ##
self.addToolbarButton(
u'Add %s to Service' % self.PluginNameShort,
self.trUtf8('Add the selected item(s) to the service'),
unicode(translate(u'MediaManagerItem', u'Add %s to Service')) % \
self.PluginNameShort,
translate(u'MediaManagerItem',
u'Add the selected item(s) to the service'),
u':/general/general_add.png', self.onAddClick)
def addListViewToToolBar(self):
@ -271,36 +283,42 @@ class MediaManagerItem(QtGui.QWidget):
self.ListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
if self.hasEditIcon:
self.ListView.addAction(
contextMenuAction(
context_menu_action(
self.ListView, u':/general/general_edit.png',
u'%s %s' % (self.trUtf8('&Edit'), self.PluginNameVisible),
unicode(translate(u'MediaManagerItem', u'&Edit %s')) % \
self.PluginNameVisible,
self.onEditClick))
self.ListView.addAction(contextMenuSeparator(self.ListView))
self.ListView.addAction(context_menu_separator(self.ListView))
if self.hasDeleteIcon:
self.ListView.addAction(
contextMenuAction(
context_menu_action(
self.ListView, u':/general/general_delete.png',
u'%s %s' % (self.trUtf8('&Delete'), self.PluginNameVisible),
unicode(translate(u'MediaManagerItem', u'&Delete %s')) % \
self.PluginNameVisible,
self.onDeleteClick))
self.ListView.addAction(contextMenuSeparator(self.ListView))
self.ListView.addAction(context_menu_separator(self.ListView))
self.ListView.addAction(
contextMenuAction(
context_menu_action(
self.ListView, u':/general/general_preview.png',
u'%s %s' % (self.trUtf8('&Preview'), self.PluginNameVisible),
unicode(translate(u'MediaManagerItem', u'&Preview %s')) % \
self.PluginNameVisible,
self.onPreviewClick))
self.ListView.addAction(
contextMenuAction(
context_menu_action(
self.ListView, u':/general/general_live.png',
self.trUtf8('&Show Live'), self.onLiveClick))
translate(u'MediaManagerItem', u'&Show Live'),
self.onLiveClick))
self.ListView.addAction(
contextMenuAction(
context_menu_action(
self.ListView, u':/general/general_add.png',
self.trUtf8('&Add to Service'), self.onAddClick))
translate(u'MediaManagerItem', u'&Add to Service'),
self.onAddClick))
if self.addToServiceItem:
self.ListView.addAction(
contextMenuAction(
context_menu_action(
self.ListView, u':/general/general_add.png',
self.trUtf8('&Add to selected Service Item'),
translate(u'MediaManagerItem',
u'&Add to selected Service Item'),
self.onAddEditClick))
QtCore.QObject.connect(
self.ListView, QtCore.SIGNAL(u'doubleClicked(QModelIndex)'),
@ -325,6 +343,19 @@ class MediaManagerItem(QtGui.QWidget):
"""
pass
def checkItemSelected(self, message):
"""
Check if a list item is selected so an action may be performed on it
``message``
The message to give the user if no item is selected
"""
if not self.ListView.selectedIndexes():
QtGui.QMessageBox.information(self,
translate(u'MediaManagerItem', u'No Items Selected'), message)
return False
return True
def onFileClick(self):
files = QtGui.QFileDialog.getOpenFileNames(
self, self.OnNewPrompt,
@ -343,7 +374,7 @@ class MediaManagerItem(QtGui.QWidget):
filelist = []
while count < self.ListView.count():
bitem = self.ListView.item(count)
filename = unicode((bitem.data(QtCore.Qt.UserRole)).toString())
filename = unicode(bitem.data(QtCore.Qt.UserRole).toString())
filelist.append(filename)
count += 1
return filelist
@ -391,8 +422,9 @@ class MediaManagerItem(QtGui.QWidget):
def onPreviewClick(self):
if not self.ListView.selectedIndexes() and not self.remoteTriggered:
QtGui.QMessageBox.information(self,
self.trUtf8('No Items Selected'),
self.trUtf8('You must select one or more items.'))
translate(u'MediaManagerItem', u'No Items Selected'),
translate(u'MediaManagerItem',
u'You must select one or more items to preview.'))
else:
log.debug(self.PluginNameShort + u' Preview requested')
service_item = self.buildServiceItem()
@ -403,8 +435,9 @@ class MediaManagerItem(QtGui.QWidget):
def onLiveClick(self):
if not self.ListView.selectedIndexes():
QtGui.QMessageBox.information(self,
self.trUtf8('No Items Selected'),
self.trUtf8('You must select one or more items.'))
translate(u'MediaManagerItem', u'No Items Selected'),
translate(u'MediaManagerItem',
u'You must select one or more items to send live.'))
else:
log.debug(self.PluginNameShort + u' Live requested')
service_item = self.buildServiceItem()
@ -415,8 +448,9 @@ class MediaManagerItem(QtGui.QWidget):
def onAddClick(self):
if not self.ListView.selectedIndexes() and not self.remoteTriggered:
QtGui.QMessageBox.information(self,
self.trUtf8('No Items Selected'),
self.trUtf8('You must select one or more items.'))
translate(u'MediaManagerItem', u'No Items Selected'),
translate(u'MediaManagerItem',
u'You must select one or more items.'))
else:
#Is it posssible to process multiple list items to generate multiple
#service items?
@ -438,16 +472,17 @@ class MediaManagerItem(QtGui.QWidget):
def onAddEditClick(self):
if not self.ListView.selectedIndexes() and not self.remoteTriggered:
QtGui.QMessageBox.information(self,
self.trUtf8('No items selected'),
self.trUtf8('You must select one or more items'))
translate(u'MediaManagerItem', u'No items selected'),
translate(u'MediaManagerItem',
u'You must select one or more items'))
else:
log.debug(self.PluginNameShort + u' Add requested')
service_item = self.parent.service_manager.getServiceItem()
if not service_item:
QtGui.QMessageBox.information(self,
self.trUtf8('No Service Item Selected'),
self.trUtf8(
'You must select an existing service item to add to.'))
translate(u'MediaManagerItem', u'No Service Item Selected'),
translate(u'MediaManagerItem',
u'You must select an existing service item to add to.'))
elif self.title.lower() == service_item.name.lower():
self.generateSlideData(service_item)
self.parent.service_manager.addServiceItem(service_item,
@ -455,9 +490,9 @@ class MediaManagerItem(QtGui.QWidget):
else:
#Turn off the remote edit update message indicator
QtGui.QMessageBox.information(self,
self.trUtf8('Invalid Service Item'),
self.trUtf8(unicode(
'You must select a %s service item.' % self.title)))
translate(u'MediaManagerItem', u'Invalid Service Item'),
translate(unicode(u'MediaManagerItem',
u'You must select a %s service item.')) % self.title)
def buildServiceItem(self, item=None):
"""
@ -465,9 +500,9 @@ class MediaManagerItem(QtGui.QWidget):
"""
service_item = ServiceItem(self.parent)
if self.ServiceItemIconName:
service_item.addIcon(self.ServiceItemIconName)
service_item.add_icon(self.ServiceItemIconName)
else:
service_item.addIcon(
service_item.add_icon(
u':/media/media_' + self.PluginNameShort.lower() + u'.png')
if self.generateSlideData(service_item, item):
return service_item

View File

@ -231,7 +231,8 @@ class Plugin(QtCore.QObject):
Show a dialog when the user clicks on the 'About' button in the plugin
manager.
"""
pass
raise NotImplementedError(
u'Plugin.about needs to be defined by the plugin')
def initialise(self):
"""

View File

@ -468,7 +468,7 @@ class Renderer(object):
self._get_extent_and_render(line, footer,
tlcorner=(x + display_shadow_size,
y + display_shadow_size),
draw=True, color = self._theme.display_shadow_color)
draw=True, color=self._theme.display_shadow_color)
self._get_extent_and_render(line, footer, tlcorner=(x, y),
draw=True, outline_size=display_outline_size)
y += h

View File

@ -73,9 +73,10 @@ class ServiceItem(object):
The plugin that this service item belongs to.
"""
if plugin:
self.RenderManager = plugin.render_manager
self.render_manager = plugin.render_manager
self.name = plugin.name
self.title = u''
self.shortname = u''
self.audit = u''
self.items = []
self.iconic_representation = None
@ -90,6 +91,7 @@ class ServiceItem(object):
self.capabilities = []
self.is_valid = True
self.cache = []
self.icon = None
def add_capability(self, capability):
"""
@ -109,7 +111,7 @@ class ServiceItem(object):
"""
return capability in self.capabilities
def addIcon(self, icon):
def add_icon(self, icon):
"""
Add an icon to the service item. This is used when displaying the
service item in the service manager.
@ -131,12 +133,12 @@ class ServiceItem(object):
if self.service_item_type == ServiceItemType.Text:
log.debug(u'Formatting slides')
if self.theme is None:
self.RenderManager.set_override_theme(None)
self.render_manager.set_override_theme(None)
else:
self.RenderManager.set_override_theme(self.theme)
self.render_manager.set_override_theme(self.theme)
for slide in self._raw_frames:
before = time.time()
formated = self.RenderManager.format_slide(slide[u'raw_slide'])
formated = self.render_manager.format_slide(slide[u'raw_slide'])
for format in formated:
lines = u''
title = u''
@ -151,9 +153,8 @@ class ServiceItem(object):
log.log(15, u'Formatting took %4s' % (time.time() - before))
elif self.service_item_type == ServiceItemType.Image:
for slide in self._raw_frames:
slide[u'image'] = \
resize_image(slide[u'image'], self.RenderManager.width,
self.RenderManager.height)
slide[u'image'] = resize_image(slide[u'image'],
self.render_manager.width, self.render_manager.height)
elif self.service_item_type == ServiceItemType.Command:
pass
else:
@ -167,19 +168,19 @@ class ServiceItem(object):
"""
log.debug(u'render individual')
if self.theme is None:
self.RenderManager.set_override_theme(None)
self.render_manager.set_override_theme(None)
else:
self.RenderManager.set_override_theme(self.theme)
self.render_manager.set_override_theme(self.theme)
format = self._display_frames[row][u'text'].split(u'\n')
#if screen blank then do not display footer
if self.cache[row] is not None:
if len(self.cache) > 0 and self.cache[row] is not None:
frame = self.cache[row]
else:
if format[0]:
frame = self.RenderManager.generate_slide(format,
self.raw_footer)
frame = self.render_manager.generate_slide(format,
self.raw_footer)
else:
frame = self.RenderManager.generate_slide(format, u'')
frame = self.render_manager.generate_slide(format, u'')
self.cache[row] = frame
return frame
@ -200,7 +201,7 @@ class ServiceItem(object):
self._raw_frames.append(
{u'title': title, u'image': image, u'path': path})
def add_from_text(self, title, raw_slide, verseTag=None):
def add_from_text(self, title, raw_slide, verse_tag=None):
"""
Add a text slide to the service item.
@ -213,7 +214,7 @@ class ServiceItem(object):
self.service_item_type = ServiceItemType.Text
title = title.split(u'\n')[0]
self._raw_frames.append(
{u'title': title, u'raw_slide': raw_slide, u'verseTag':verseTag})
{u'title': title, u'raw_slide': raw_slide, u'verseTag':verse_tag})
def add_from_command(self, path, file_name, image):
"""
@ -280,7 +281,7 @@ class ServiceItem(object):
self.service_item_type = header[u'type']
self.shortname = header[u'plugin']
self.theme = header[u'theme']
self.addIcon(header[u'icon'])
self.add_icon(header[u'icon'])
self.raw_footer = header[u'footer']
self.audit = header[u'audit']
self.notes = header[u'notes']

View File

@ -41,7 +41,7 @@ class XmlRootClass(object):
(element.tag, val) = self.post_tag_hook(element.tag, val)
"""
def _setFromXml(self, xml, root_tag):
def _set_from_xml(self, xml, root_tag):
"""
Set song properties from given xml content.

View File

@ -153,8 +153,8 @@ class Theme(object):
The data to initialise the theme with
"""
# init to defaults
self._set_from_XML(BLANK_STYLE_XML)
self._set_from_XML(xml)
self._set_from_xml(BLANK_STYLE_XML)
self._set_from_xml(xml)
def _get_as_string(self):
"""
@ -176,9 +176,9 @@ class Theme(object):
The data to apply to the theme
"""
root = ElementTree(element=XML(xml))
iter = root.getiterator()
for element in iter:
delphiColorChange = False
xml_iter = root.getiterator()
for element in xml_iter:
delphi_color_change = False
if element.tag != u'Theme':
element_text = element.text
val = 0
@ -194,7 +194,7 @@ class Theme(object):
pass
elif DELPHI_COLORS.has_key(element_text):
val = DELPHI_COLORS[element_text]
delphiColorChange = True
delphi_color_change = True
else:
try:
val = int(element_text)
@ -204,7 +204,7 @@ class Theme(object):
(element.tag.find(u'BackgroundParameter') == 0 and
type(val) == type(0))):
# convert to a wx.Colour
if not delphiColorChange:
if not delphi_color_change:
val = QtGui.QColor(
val&0xFF, (val>>8)&0xFF, (val>>16)&0xFF)
else:

View File

@ -44,8 +44,8 @@ class AboutForm(QtGui.QDialog, Ui_AboutDialog):
about_text = about_text.replace(u'<version>',
self.applicationVersion[u'version'])
if self.applicationVersion[u'build']:
build_text = u' %s %s' % (translate(u'AboutForm', u'build'),
self.applicationVersion[u'build'])
build_text = unicode(translate(u'AboutForm', u' build %s')) % \
self.applicationVersion[u'build']
else:
build_text = u''
about_text = about_text.replace(u'<revision>', build_text)

View File

@ -155,7 +155,7 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog):
self.theme.background_direction)
else:
filename = \
os.path.split(unicode(self.theme.background_filename))[0]
os.path.split(unicode(self.theme.background_filename))[1]
new_theme.add_background_image(filename)
save_to = os.path.join(self.path, theme_name, filename)
save_from = self.theme.background_filename
@ -239,12 +239,13 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog):
self.previewTheme()
def onFontMainColorPushButtonClicked(self):
self.theme.font_main_color = QtGui.QColorDialog.getColor(
QtGui.QColor(self.theme.font_main_color), self).name()
self.FontMainColorPushButton.setStyleSheet(
u'background-color: %s' % unicode(self.theme.font_main_color))
self.previewTheme()
new_color = QtGui.QColorDialog.getColor(
QtGui.QColor(self.theme.font_main_color), self)
if new_color.isValid():
self.theme.font_main_color = new_color.name()
self.FontMainColorPushButton.setStyleSheet(
u'background-color: %s' % unicode(self.theme.font_main_color))
self.previewTheme()
def onFontMainSizeSpinBoxChanged(self):
if self.theme.font_main_proportion != self.FontMainSizeSpinBox.value():
@ -332,11 +333,13 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog):
self.previewTheme()
def onFontFooterColorPushButtonClicked(self):
self.theme.font_footer_color = QtGui.QColorDialog.getColor(
QtGui.QColor(self.theme.font_footer_color), self).name()
self.FontFooterColorPushButton.setStyleSheet(
'background-color: %s' % unicode(self.theme.font_footer_color))
self.previewTheme()
new_color = QtGui.QColorDialog.getColor(
QtGui.QColor(self.theme.font_footer_color), self)
if new_color.isValid():
self.theme.font_footer_color = new_color.name()
self.FontFooterColorPushButton.setStyleSheet(
u'background-color: %s' % unicode(self.theme.font_footer_color))
self.previewTheme()
def onFontFooterSizeSpinBoxChanged(self):
if self.theme.font_footer_proportion != \
@ -431,24 +434,29 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog):
def onColor1PushButtonClicked(self):
if self.theme.background_type == u'solid':
self.theme.background_color = QtGui.QColorDialog.getColor(
QtGui.QColor(self.theme.background_color), self).name()
self.Color1PushButton.setStyleSheet(
u'background-color: %s' % unicode(self.theme.background_color))
new_color = QtGui.QColorDialog.getColor(
QtGui.QColor(self.theme.background_color), self)
if new_color.isValid():
self.theme.background_color = new_color.name()
self.Color1PushButton.setStyleSheet(u'background-color: %s' %
unicode(self.theme.background_color))
else:
self.theme.background_startColor = QtGui.QColorDialog.getColor(
QtGui.QColor(self.theme.background_startColor), self).name()
self.Color1PushButton.setStyleSheet(
u'background-color: %s' % \
new_color = QtGui.QColorDialog.getColor(
QtGui.QColor(self.theme.background_startColor), self)
if new_color.isValid():
self.theme.background_startColor = new_color.name()
self.Color1PushButton.setStyleSheet(u'background-color: %s' %
unicode(self.theme.background_startColor))
self.previewTheme()
def onColor2PushButtonClicked(self):
self.theme.background_endColor = QtGui.QColorDialog.getColor(
QtGui.QColor(self.theme.background_endColor), self).name()
self.Color2PushButton.setStyleSheet(
u'background-color: %s' % unicode(self.theme.background_endColor))
self.previewTheme()
new_color = QtGui.QColorDialog.getColor(
QtGui.QColor(self.theme.background_endColor), self)
if new_color.isValid():
self.theme.background_endColor = new_color.name()
self.Color2PushButton.setStyleSheet(u'background-color: %s' %
unicode(self.theme.background_endColor))
self.previewTheme()
#
#Other Tab
@ -472,11 +480,13 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog):
self.previewTheme()
def onOutlineColorPushButtonClicked(self):
self.theme.display_outline_color = QtGui.QColorDialog.getColor(
QtGui.QColor(self.theme.display_outline_color), self).name()
self.OutlineColorPushButton.setStyleSheet(
u'background-color: %s' % unicode(self.theme.display_outline_color))
self.previewTheme()
new_color = QtGui.QColorDialog.getColor(
QtGui.QColor(self.theme.display_outline_color), self)
if new_color.isValid():
self.theme.display_outline_color = new_color.name()
self.OutlineColorPushButton.setStyleSheet(u'background-color: %s' %
unicode(self.theme.display_outline_color))
self.previewTheme()
def onShadowCheckBoxChanged(self, value):
if value == 2: # checked
@ -495,11 +505,13 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog):
self.previewTheme()
def onShadowColorPushButtonClicked(self):
self.theme.display_shadow_color = QtGui.QColorDialog.getColor(
QtGui.QColor(self.theme.display_shadow_color), self).name()
self.ShadowColorPushButton.setStyleSheet(
u'background-color: %s' % unicode(self.theme.display_shadow_color))
self.previewTheme()
new_color = QtGui.QColorDialog.getColor(
QtGui.QColor(self.theme.display_shadow_color), self)
if new_color.isValid():
self.theme.display_shadow_color = new_color.name()
self.ShadowColorPushButton.setStyleSheet(u'background-color: %s' %
unicode(self.theme.display_shadow_color))
self.previewTheme()
def onHorizontalComboBoxSelected(self, currentIndex):
self.theme.display_horizontalAlign = currentIndex

View File

@ -133,7 +133,6 @@ class MainDisplay(DisplayWidget):
self.display_alert = QtGui.QLabel(self)
self.display_alert.setScaledContents(True)
self.primary = True
self.displayBlank = False
self.blankFrame = None
self.frame = None
QtCore.QObject.connect(Receiver.get_receiver(),
@ -280,15 +279,15 @@ class MainDisplay(DisplayWidget):
self.display_alert.setPixmap(frame)
self.moveToTop()
def frameView(self, frame, transition=False):
def frameView(self, frame, transition=False, display=True):
"""
Called from a slide controller to display a frame
if the alert is in progress the alert is added on top
``frame``
Image frame to be rendered
"""
log.debug(u'frameView %d' % (self.displayBlank))
if not self.displayBlank:
log.debug(u'frameView %d' % (display))
if display:
if transition:
if self.frame is not None:
self.display_text.setPixmap(
@ -314,8 +313,7 @@ class MainDisplay(DisplayWidget):
self.setVisible(True)
self.showFullScreen()
else:
self.waitingFrame = frame
self.waitingFrameTrans = transition
self.storeText = QtGui.QPixmap.fromImage(frame[u'main'])
class VideoDisplay(Phonon.VideoWidget):
"""

View File

@ -356,7 +356,7 @@ class Ui_MainWindow(object):
"""
MainWindow.mainTitle = translate(u'MainWindow', u'OpenLP 2.0')
MainWindow.language = translate(u'MainWindow', u'English')
MainWindow.defaultThemeText = translate(u'MainWindow',
MainWindow.defaultThemeText = translate(u'MainWindow',
u'Default Theme: ')
MainWindow.setWindowTitle(MainWindow.mainTitle)
self.FileMenu.setTitle(translate(u'MainWindow', u'&File'))
@ -452,11 +452,11 @@ class Ui_MainWindow(object):
translate(u'MainWindow', u'Choose System language, if available'))
for item in self.LanguageGroup.actions():
item.setText(item.objectName())
item.setStatusTip(translate(u'MainWindow',
u'Set the interface language to %1').arg(item.objectName()))
item.setStatusTip(unicode(translate(u'MainWindow',
u'Set the interface language to %s')) % item.objectName())
self.ToolsAddToolItem.setText(translate(u'MainWindow', u'Add &Tool...'))
self.ToolsAddToolItem.setStatusTip(
translate(u'MainWindow',
translate(u'MainWindow',
u'Add an application to the list of tools'))
self.action_Preview_Panel.setText(
translate(u'MainWindow', u'&Preview Pane'))
@ -488,7 +488,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
self.displayManager = DisplayManager(screens)
self.aboutForm = AboutForm(self, applicationVersion)
self.settingsForm = SettingsForm(self.screens, self, self)
self.recentFiles = []
self.recentFiles = QtCore.QStringList()
# Set up the path with plugins
pluginpath = AppLocation.get_directory(AppLocation.PluginsDir)
self.plugin_manager = PluginManager(pluginpath)
@ -652,15 +652,14 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
"""
settings = QtCore.QSettings()
settings.beginGroup(self.generalSettingsSection)
if settings.value(u'screen blank', QtCore.QVariant(False)).toBool() \
and settings.value(u'blank warning', QtCore.QVariant(False)).toBool():
self.LiveController.onBlankDisplay(True)
QtGui.QMessageBox.question(self,
translate(u'MainWindow', u'OpenLP Main Display Blanked'),
translate(u'MainWindow',
u'The Main Display has been blanked out'),
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok),
QtGui.QMessageBox.Ok)
if settings.value(u'screen blank', QtCore.QVariant(False)).toBool():
self.LiveController.mainDisplaySetBackground()
if settings.value(u'blank warning',
QtCore.QVariant(False)).toBool():
QtGui.QMessageBox.question(self,
translate(u'MainWindow', u'OpenLP Main Display Blanked'),
translate(u'MainWindow',
u'The Main Display has been blanked out'))
settings.endGroup()
def versionThread(self):
@ -851,5 +850,4 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
if filename and filename not in self.recentFiles:
self.recentFiles.insert(0, QtCore.QString(filename))
while self.recentFiles.count() > recentFileCount:
self.recentFiles.pop()
self.recentFiles.removeLast()

View File

@ -27,7 +27,7 @@ import logging
from PyQt4 import QtCore, QtGui
from openlp.core.lib.plugin import PluginStatus
from openlp.core.lib import PluginStatus, translate
from plugindialog import Ui_PluginViewDialog
log = logging.getLogger(__name__)
@ -63,14 +63,16 @@ class PluginForm(QtGui.QDialog, Ui_PluginViewDialog):
# sometimes when it's loaded from the config, it isn't cast to int.
plugin.status = int(plugin.status)
# Set the little status text in brackets next to the plugin name.
status_text = 'Inactive'
status_text = unicode(translate(u'PluginForm', u'%s (Inactive)'))
if plugin.status == PluginStatus.Active:
status_text = 'Active'
status_text = unicode(translate(u'PluginForm', u'%s (Active)'))
elif plugin.status == PluginStatus.Inactive:
status_text = 'Inactive'
status_text = unicode(
translate(u'PluginForm', u'%s (Inactive)'))
elif plugin.status == PluginStatus.Disabled:
status_text = 'Disabled'
item.setText(u'%s (%s)' % (plugin.name, status_text))
status_text = unicode(
translate(u'PluginForm', u'%s (Disabled)'))
item.setText(status_text % plugin.name)
# If the plugin has an icon, set it!
if plugin.icon:
item.setIcon(plugin.icon)

View File

@ -96,6 +96,7 @@ class ServiceItemEditForm(QtGui.QDialog, Ui_ServiceItemEditDialog):
self.itemList.remove(self.itemList[row])
self.itemList.insert(row - 1, temp)
self.loadData()
self.listWidget.setCurrentRow(row - 1)
def onItemDown(self):
"""
@ -109,3 +110,4 @@ class ServiceItemEditForm(QtGui.QDialog, Ui_ServiceItemEditDialog):
self.itemList.remove(self.itemList[row])
self.itemList.insert(row + 1, temp)
self.loadData()
self.listWidget.setCurrentRow(row + 1)

View File

@ -32,7 +32,7 @@ log = logging.getLogger(__name__)
from PyQt4 import QtCore, QtGui
from openlp.core.lib import OpenLPToolbar, ServiceItem, contextMenuAction, \
from openlp.core.lib import OpenLPToolbar, ServiceItem, context_menu_action, \
Receiver, build_icon, ItemCapabilities, SettingsManager, translate
from openlp.core.ui import ServiceNoteForm, ServiceItemEditForm
from openlp.core.utils import AppLocation
@ -599,11 +599,11 @@ class ServiceManager(QtGui.QWidget):
path_from = unicode(os.path.join(
frame[u'path'],
frame[u'title']))
zip.write(path_from)
zip.write(path_from.encode(u'utf-8'))
file = open(servicefile, u'wb')
cPickle.dump(service, file)
file.close()
zip.write(servicefile)
zip.write(servicefile.encode(u'utf-8'))
except IOError:
log.exception(u'Failed to save service to disk')
finally:
@ -669,7 +669,18 @@ class ServiceManager(QtGui.QWidget):
try:
zip = zipfile.ZipFile(unicode(filename))
for file in zip.namelist():
osfile = unicode(QtCore.QDir.toNativeSeparators(file))
try:
ucsfile = file.decode(u'utf-8')
except UnicodeDecodeError:
QtGui.QMessageBox.critical(
self, translate(u'ServiceManager', u'Error'),
translate(u'ServiceManager',
u'File is not a valid service.\n'
u'The content encoding is not UTF-8.'))
log.exception(u'Filename "%s" is not valid UTF-8' % \
file.decode(u'utf-8', u'replace'))
continue
osfile = unicode(QtCore.QDir.toNativeSeparators(ucsfile))
names = osfile.split(os.path.sep)
file_path = os.path.join(self.servicePath,
names[len(names) - 1])
@ -679,22 +690,29 @@ class ServiceManager(QtGui.QWidget):
file_to.close()
if file_path.endswith(u'osd'):
p_file = file_path
file_to = open(p_file, u'r')
items = cPickle.load(file_to)
file_to.close()
self.onNewService()
for item in items:
serviceitem = ServiceItem()
serviceitem.RenderManager = self.parent.RenderManager
serviceitem.set_from_service(item, self.servicePath)
self.validateItem(serviceitem)
self.addServiceItem(serviceitem)
try:
if os.path.isfile(p_file):
os.remove(p_file)
except (IOError, OSError):
log.exception(u'Failed to remove osd file')
except IOError:
if 'p_file' in locals():
file_to = open(p_file, u'r')
items = cPickle.load(file_to)
file_to.close()
self.onNewService()
for item in items:
serviceitem = ServiceItem()
serviceitem.RenderManager = self.parent.RenderManager
serviceitem.set_from_service(item, self.servicePath)
self.validateItem(serviceitem)
self.addServiceItem(serviceitem)
try:
if os.path.isfile(p_file):
os.remove(p_file)
except (IOError, OSError):
log.exception(u'Failed to remove osd file')
else:
QtGui.QMessageBox.critical(
self, translate(u'ServiceManager', u'Error'),
translate(u'ServiceManager',
u'File is not a valid service.'))
log.exception(u'File contains no service data')
except (IOError, NameError):
log.exception(u'Problem loading a service file')
finally:
if file_to:
@ -909,13 +927,9 @@ class ServiceManager(QtGui.QWidget):
endpos = len(self.serviceItems)
else:
endpos = self._getParentItemData(item) - 1
if endpos < startpos:
newpos = endpos
else:
newpos = endpos + 1
serviceItem = self.serviceItems[startpos]
self.serviceItems.remove(serviceItem)
self.serviceItems.insert(newpos, serviceItem)
self.serviceItems.insert(endpos, serviceItem)
self.repaintServiceList(endpos, startCount)
else:
#we are not over anything so drop
@ -954,7 +968,7 @@ class ServiceManager(QtGui.QWidget):
self.ThemeComboBox.addItem(u'')
for theme in theme_list:
self.ThemeComboBox.addItem(theme)
action = contextMenuAction(
action = context_menu_action(
self.ServiceManagerList,
None,
theme , self.onThemeChangeAction)

View File

@ -120,6 +120,7 @@ class SlideController(QtGui.QWidget):
self.serviceItem = None
self.Panel = QtGui.QWidget(parent.ControlSplitter)
self.slideList = {}
self.canDisplay = True
# Layout for holding panel
self.PanelLayout = QtGui.QVBoxLayout(self.Panel)
self.PanelLayout.setSpacing(0)
@ -535,7 +536,7 @@ class SlideController(QtGui.QWidget):
self.PreviewListWidget.setCursor(QtCore.Qt.PointingHandCursor)
before = time.time()
#Clear the old serviceItem cache to release memory
if self.serviceItem:
if self.serviceItem and self.serviceItem is not serviceItem:
self.serviceItem.cache = []
self.serviceItem = serviceItem
self.PreviewListWidget.clear()
@ -562,8 +563,7 @@ class SlideController(QtGui.QWidget):
if self.isLive and frame[u'verseTag'] is not None:
if tag1 not in self.slideList:
self.slideList[tag1] = framenumber
self.SongMenu.menu().addAction(
translate(u'SlideController', u'%s'%tag1),
self.SongMenu.menu().addAction(tag1,
self.onSongBarHandler)
item.setText(frame[u'text'])
else:
@ -651,6 +651,12 @@ class SlideController(QtGui.QWidget):
self.PreviewListWidget.selectRow(index)
self.onSlideSelected()
def mainDisplaySetBackground(self):
"""
Allow the main display to blank the main display at startup time
"""
self.blankButton.setChecked(True)
def onSlideBlank(self):
"""
Handle the slidecontroller blank event
@ -670,6 +676,7 @@ class SlideController(QtGui.QWidget):
log.debug(u'onBlankDisplay %d' % checked)
self.hideButton.setChecked(False)
self.themeButton.setChecked(False)
self.canDisplay = not checked
QtCore.QSettings().setValue(
self.parent.generalSettingsSection + u'/screen blank',
QtCore.QVariant(checked))
@ -687,6 +694,7 @@ class SlideController(QtGui.QWidget):
log.debug(u'onThemeDisplay %d' % checked)
self.blankButton.setChecked(False)
self.hideButton.setChecked(False)
self.canDisplay = False
if checked:
Receiver.send_message(u'maindisplay_hide', HideMode.Theme)
self.blankPlugin(True)
@ -701,6 +709,7 @@ class SlideController(QtGui.QWidget):
log.debug(u'onHideDisplay %d' % checked)
self.blankButton.setChecked(False)
self.themeButton.setChecked(False)
self.canDisplay = False
if checked:
Receiver.send_message(u'maindisplay_hide', HideMode.Screen)
self.hidePlugin(True)
@ -710,7 +719,7 @@ class SlideController(QtGui.QWidget):
def blankPlugin(self, blank):
"""
Blank the display screen.
Blank the display screen within a plugin if required.
"""
if self.serviceItem is not None:
if blank:
@ -770,7 +779,7 @@ class SlideController(QtGui.QWidget):
log.log(
15, u'Slide Rendering took %4s' % (time.time() - before))
if self.isLive:
self.mainDisplay.frameView(frame, True)
self.mainDisplay.frameView(frame, True, self.canDisplay)
self.selectedRow = row
Receiver.send_message(u'slidecontroller_%s_changed' % self.typePrefix,
row)

View File

@ -24,13 +24,15 @@
###############################################################################
from PyQt4 import QtCore, QtGui
from openlp.core.lib import build_icon
from openlp.core.lib import build_icon, translate
class SplashScreen(object):
def __init__(self, version):
self.splash_screen = QtGui.QSplashScreen()
self.setupUi()
self.message = self.splash_screen.trUtf8('Starting')\
self.message = translate(
u'Splashscreen', u'Starting')\
+ '..... ' + version
def setupUi(self):
@ -58,7 +60,7 @@ class SplashScreen(object):
def retranslateUi(self):
self.splash_screen.setWindowTitle(
self.splash_screen.trUtf8('Splash Screen'))
translate(u'Splashscreen', u'Splash Screen'))
def show(self):
self.splash_screen.show()

View File

@ -33,10 +33,10 @@ from PyQt4 import QtCore, QtGui
from openlp.core.ui import AmendThemeForm
from openlp.core.theme import Theme
from openlp.core.lib import OpenLPToolbar, contextMenuAction, \
from openlp.core.lib import OpenLPToolbar, context_menu_action, \
ThemeXML, str_to_bool, get_text_file_string, build_icon, Receiver, \
contextMenuSeparator, SettingsManager, translate
from openlp.core.utils import AppLocation
context_menu_separator, SettingsManager, translate
from openlp.core.utils import AppLocation, get_filesystem_encoding
log = logging.getLogger(__name__)
@ -81,27 +81,28 @@ class ThemeManager(QtGui.QWidget):
self.Layout.addWidget(self.ThemeListWidget)
self.ThemeListWidget.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
self.ThemeListWidget.addAction(
contextMenuAction(self.ThemeListWidget, u':/themes/theme_edit.png',
context_menu_action(self.ThemeListWidget,
u':/themes/theme_edit.png',
translate(u'ThemeManager', u'Edit a theme'), self.onEditTheme))
self.ThemeListWidget.addAction(
contextMenuSeparator(self.ThemeListWidget))
context_menu_separator(self.ThemeListWidget))
self.ThemeListWidget.addAction(
contextMenuAction(self.ThemeListWidget,
context_menu_action(self.ThemeListWidget,
u':/general/general_delete.png',
translate(u'ThemeManager', u'Delete theme'),
self.onDeleteTheme))
self.ThemeListWidget.addAction(
contextMenuAction(self.ThemeListWidget,
context_menu_action(self.ThemeListWidget,
u':/general/general_export.png',
translate(u'ThemeManager', u'Make Global'),
self.changeGlobalFromScreen))
self.ThemeListWidget.addAction(
contextMenuAction(self.ThemeListWidget,
context_menu_action(self.ThemeListWidget,
u':/general/general_export.png',
translate(u'ThemeManager', u'Export theme'),
self.onExportTheme))
self.ThemeListWidget.addAction(
contextMenuSeparator(self.ThemeListWidget))
context_menu_separator(self.ThemeListWidget))
#Signals
QtCore.QObject.connect(self.ThemeListWidget,
QtCore.SIGNAL(u'doubleClicked(QModelIndex)'),
@ -135,8 +136,8 @@ class ThemeManager(QtGui.QWidget):
self.ThemeListWidget.item(count).setText(newName)
#Set the new name
if themeName == newName:
name = u'%s (%s)' % (newName,
translate(u'ThemeManager', u'default'))
name = unicode(translate(u'ThemeManager', u'%s (default)')) % \
newName
self.ThemeListWidget.item(count).setText(name)
def changeGlobalFromScreen(self, index = -1):
@ -157,8 +158,8 @@ class ThemeManager(QtGui.QWidget):
if count == selected_row:
self.global_theme = unicode(
self.ThemeListWidget.item(count).text())
name = u'%s (%s)' % (self.global_theme,
translate(u'ThemeManager', u'default'))
name = unicode(translate(u'ThemeManager', u'%s (default)')) % \
self.global_theme
self.ThemeListWidget.item(count).setText(name)
QtCore.QSettings().setValue(
self.settingsSection + u'/global theme',
@ -230,7 +231,9 @@ class ThemeManager(QtGui.QWidget):
try:
os.remove(os.path.join(self.path, th))
os.remove(os.path.join(self.thumbPath, th))
shutil.rmtree(os.path.join(self.path, theme))
encoding = get_filesystem_encoding()
shutil.rmtree(
os.path.join(self.path, theme).encode(encoding))
except OSError:
#if not present do not worry
pass
@ -264,8 +267,8 @@ class ThemeManager(QtGui.QWidget):
for files in os.walk(source):
for name in files[2]:
zip.write(
os.path.join(source, name),
os.path.join(theme, name))
os.path.join(source, name).encode(u'utf-8'),
os.path.join(theme, name).encode(u'utf-8'))
QtGui.QMessageBox.information(self,
translate(u'ThemeManager', u'Theme Exported'),
translate(u'ThemeManager',
@ -315,8 +318,8 @@ class ThemeManager(QtGui.QWidget):
if os.path.exists(theme):
textName = os.path.splitext(name)[0]
if textName == self.global_theme:
name = u'%s (%s)' % (textName,
translate(u'ThemeManager', u'default'))
name = unicode(translate(u'ThemeManager',
u'%s (default)')) % textName
else:
name = textName
thumb = os.path.join(self.thumbPath, u'%s.png' % textName)
@ -387,7 +390,17 @@ class ThemeManager(QtGui.QWidget):
filexml = None
themename = None
for file in zip.namelist():
osfile = unicode(QtCore.QDir.toNativeSeparators(file))
try:
ucsfile = file.decode(u'utf-8')
except UnicodeDecodeError:
QtGui.QMessageBox.critical(
self, translate(u'ThemeManager', u'Error'),
translate(u'ThemeManager', u'File is not a valid '
u'theme.\nThe content encoding is not UTF-8.'))
log.exception(u'Filename "%s" is not valid UTF-8' % \
file.decode(u'utf-8', u'replace'))
continue
osfile = unicode(QtCore.QDir.toNativeSeparators(ucsfile))
theme_dir = None
if osfile.endswith(os.path.sep):
theme_dir = os.path.join(dir, osfile)
@ -405,7 +418,7 @@ class ThemeManager(QtGui.QWidget):
if not os.path.exists(theme_dir):
os.mkdir(os.path.join(dir, names[0]))
xml_data = zip.read(file)
if os.path.splitext(file)[1].lower() in [u'.xml']:
if os.path.splitext(ucsfile)[1].lower() in [u'.xml']:
if self.checkVersion1(xml_data):
# upgrade theme xml
filexml = self.migrateVersion122(xml_data)
@ -416,8 +429,15 @@ class ThemeManager(QtGui.QWidget):
else:
outfile = open(fullpath, u'wb')
outfile.write(zip.read(file))
self.generateAndSaveImage(dir, themename, filexml)
except IOError:
if filexml:
self.generateAndSaveImage(dir, themename, filexml)
else:
QtGui.QMessageBox.critical(
self, translate(u'ThemeManager', u'Error'),
translate(u'ThemeManager', u'File is not a valid theme.'))
log.exception(u'Theme file dosen\'t contain XML data %s' %
filename)
except (IOError, NameError):
QtGui.QMessageBox.critical(
self, translate(u'ThemeManager', u'Error'),
translate(u'ThemeManager', u'File is not a valid theme.'))
@ -526,7 +546,10 @@ class ThemeManager(QtGui.QWidget):
outfile.close()
if image_from and image_from != image_to:
try:
shutil.copyfile(image_from, image_to)
encoding = get_filesystem_encoding()
shutil.copyfile(
unicode(image_from).encode(encoding),
unicode(image_to).encode(encoding))
except IOError:
log.exception(u'Failed to save theme image')
self.generateAndSaveImage(self.path, name, theme_xml)

View File

@ -149,27 +149,6 @@ def check_latest_version(current_version):
log.exception(u'Reason for failure: %s', e.reason)
return version_string
def string_to_unicode(string):
"""
Converts a QString to a Python unicode object.
"""
if isinstance(string, QtCore.QString):
string = unicode(string.toUtf8(), u'utf8')
return string
def variant_to_unicode(variant):
"""
Converts a QVariant to a Python unicode object.
``variant``
The QVariant instance to convert to unicode.
"""
if isinstance(variant, QtCore.QVariant):
string = variant.toString()
if not isinstance(string, unicode):
string = string_to_unicode(string)
return string
def add_actions(target, actions):
"""
Adds multiple actions to a menu or toolbar in one command.
@ -187,7 +166,17 @@ def add_actions(target, actions):
else:
target.addAction(action)
def get_filesystem_encoding():
"""
Returns the name of the encoding used to convert Unicode filenames into
system file names.
"""
encoding = sys.getfilesystemencoding()
if encoding is None:
encoding = sys.getdefaultencoding()
return encoding
from languagemanager import LanguageManager
__all__ = [u'AppLocation', u'check_latest_version', u'add_actions',
u'LanguageManager']
u'get_filesystem_encoding', u'LanguageManager']

View File

@ -64,9 +64,9 @@ class alertsPlugin(Plugin):
self.toolsAlertItem.setIcon(AlertIcon)
self.toolsAlertItem.setObjectName(u'toolsAlertItem')
self.toolsAlertItem.setText(
translate(u'AlertsPlugin.AlertsPlugin', u'&Alert'))
translate(u'AlertsPlugin', u'&Alert'))
self.toolsAlertItem.setStatusTip(
translate(u'AlertsPlugin.AlertsPlugin', u'Show an alert message'))
translate(u'AlertsPlugin', u'Show an alert message'))
self.toolsAlertItem.setShortcut(u'F7')
self.service_manager.parent.ToolsMenu.addAction(self.toolsAlertItem)
QtCore.QObject.connect(self.toolsAlertItem,
@ -94,7 +94,7 @@ class alertsPlugin(Plugin):
self.alertForm.exec_()
def about(self):
about_text = translate(u'AlertsPlugin.AlertsPlugin',
about_text = translate(u'AlertsPlugin',
u'<b>Alerts Plugin</b><br>This plugin '
u'controls the displaying of alerts on the presentations screen')
return about_text

View File

@ -214,11 +214,13 @@ class AlertsTab(SettingsTab):
translate(u'AlertsPlugin.AlertsTab', u'Bottom'))
def onBackgroundColorButtonClicked(self):
self.bg_color = QtGui.QColorDialog.getColor(
QtGui.QColor(self.bg_color), self).name()
self.BackgroundColorButton.setStyleSheet(
u'background-color: %s' % self.bg_color)
self.updateDisplay()
new_color = QtGui.QColorDialog.getColor(
QtGui.QColor(self.bg_color), self)
if new_color.isValid():
self.bg_color = new_color.name()
self.BackgroundColorButton.setStyleSheet(
u'background-color: %s' % self.bg_color)
self.updateDisplay()
def onFontComboBoxClicked(self):
self.updateDisplay()
@ -227,11 +229,13 @@ class AlertsTab(SettingsTab):
self.location = location
def onFontColorButtonClicked(self):
self.font_color = QtGui.QColorDialog.getColor(
QtGui.QColor(self.font_color), self).name()
self.FontColorButton.setStyleSheet(
u'background-color: %s' % self.font_color)
self.updateDisplay()
new_color = QtGui.QColorDialog.getColor(
QtGui.QColor(self.font_color), self)
if new_color.isValid():
self.font_color = new_color.name()
self.FontColorButton.setStyleSheet(
u'background-color: %s' % self.font_color)
self.updateDisplay()
def onTimeoutSpinBoxChanged(self):
self.timeout = self.TimeoutSpinBox.value()

View File

@ -70,7 +70,8 @@ class BiblePlugin(Plugin):
self.ImportBibleItem = QtGui.QAction(import_menu)
self.ImportBibleItem.setObjectName(u'ImportBibleItem')
import_menu.addAction(self.ImportBibleItem)
self.ImportBibleItem.setText(import_menu.trUtf8('&Bible'))
self.ImportBibleItem.setText(
translate(u'BiblePlugin', u'&Bible'))
# Signals and slots
QtCore.QObject.connect(self.ImportBibleItem,
QtCore.SIGNAL(u'triggered()'), self.onBibleImportClick)
@ -80,7 +81,8 @@ class BiblePlugin(Plugin):
self.ExportBibleItem = QtGui.QAction(export_menu)
self.ExportBibleItem.setObjectName(u'ExportBibleItem')
export_menu.addAction(self.ExportBibleItem)
self.ExportBibleItem.setText(export_menu.trUtf8('&Bible'))
self.ExportBibleItem.setText(translate(
u'BiblePlugin', u'&Bible'))
self.ExportBibleItem.setVisible(False)
def onBibleImportClick(self):
@ -88,7 +90,7 @@ class BiblePlugin(Plugin):
self.media_item.onImportClick()
def about(self):
about_text = translate(u'BiblesPlugin.BiblePlugin',
about_text = translate(u'BiblePlugin',
u'<strong>Bible Plugin</strong><br />This '
u'plugin allows bible verses from different sources to be '
u'displayed on the screen during the service.')

View File

@ -32,7 +32,7 @@ from PyQt4 import QtCore, QtGui
from bibleimportwizard import Ui_BibleImportWizard
from openlp.core.lib import Receiver, SettingsManager, translate
from openlp.core.utils import AppLocation, variant_to_unicode
from openlp.core.utils import AppLocation
from openlp.plugins.bibles.lib.manager import BibleFormat
log = logging.getLogger(__name__)
@ -167,9 +167,9 @@ class ImportWizardForm(QtGui.QWizard, Ui_BibleImportWizard):
return True
elif self.currentId() == 2:
# License details
license_version = variant_to_unicode(self.field(u'license_version'))
license_copyright = variant_to_unicode(
self.field(u'license_copyright'))
license_version = unicode(self.field(u'license_version').toString())
license_copyright = \
unicode(self.field(u'license_copyright').toString())
if license_version == u'':
QtGui.QMessageBox.critical(self,
translate(u'BiblesPlugin.ImportWizardForm',
@ -303,17 +303,20 @@ class ImportWizardForm(QtGui.QWizard, Ui_BibleImportWizard):
self.setField(u'csv_versefile', QtCore.QVariant(''))
self.setField(u'opensong_file', QtCore.QVariant(''))
self.setField(u'web_location', QtCore.QVariant(WebDownload.Crosswalk))
self.setField(u'web_biblename', QtCore.QVariant(self.BibleComboBox))
self.setField(u'web_biblename',
QtCore.QVariant(self.BibleComboBox.currentIndex()))
self.setField(u'proxy_server',
settings.value(u'proxy address', QtCore.QVariant(u'')))
self.setField(u'proxy_username',
settings.value(u'proxy username', QtCore.QVariant(u'')))
self.setField(u'proxy_password',
settings.value(u'proxy password', QtCore.QVariant(u'')))
self.setField(u'license_version', QtCore.QVariant(self.VersionNameEdit))
self.setField(u'license_copyright', QtCore.QVariant(self.CopyrightEdit))
self.setField(u'license_version',
QtCore.QVariant(self.VersionNameEdit.text()))
self.setField(u'license_copyright',
QtCore.QVariant(self.CopyrightEdit.text()))
self.setField(u'license_permission',
QtCore.QVariant(self.PermissionEdit))
QtCore.QVariant(self.PermissionEdit.text()))
self.onLocationComboBoxChanged(WebDownload.Crosswalk)
settings.endGroup()
@ -391,37 +394,35 @@ class ImportWizardForm(QtGui.QWizard, Ui_BibleImportWizard):
def performImport(self):
bible_type = self.field(u'source_format').toInt()[0]
license_version = variant_to_unicode(self.field(u'license_version'))
license_copyright = variant_to_unicode(self.field(u'license_copyright'))
license_permission = variant_to_unicode(
self.field(u'license_permission'))
license_version = unicode(self.field(u'license_version').toString())
license_copyright = unicode(self.field(u'license_copyright').toString())
license_permission = \
unicode(self.field(u'license_permission').toString())
importer = None
if bible_type == BibleFormat.OSIS:
# Import an OSIS bible
importer = self.manager.import_bible(BibleFormat.OSIS,
name=license_version,
filename=variant_to_unicode(self.field(u'osis_location'))
filename=unicode(self.field(u'osis_location').toString())
)
elif bible_type == BibleFormat.CSV:
# Import a CSV bible
importer = self.manager.import_bible(BibleFormat.CSV,
name=license_version,
booksfile=variant_to_unicode(self.field(u'csv_booksfile')),
versefile=variant_to_unicode(self.field(u'csv_versefile'))
booksfile=unicode(self.field(u'csv_booksfile').toString()),
versefile=unicode(self.field(u'csv_versefile').toString())
)
elif bible_type == BibleFormat.OpenSong:
# Import an OpenSong bible
importer = self.manager.import_bible(BibleFormat.OpenSong,
name=license_version,
filename=variant_to_unicode(self.field(u'opensong_file'))
filename=unicode(self.field(u'opensong_file').toString())
)
elif bible_type == BibleFormat.WebDownload:
# Import a bible from the web
self.ImportProgressBar.setMaximum(1)
download_location = self.field(u'web_location').toInt()[0]
bible_version = self.BibleComboBox.currentText()
if not isinstance(bible_version, unicode):
bible_version = unicode(bible_version, u'utf8')
bible_version = unicode(self.BibleComboBox.currentText())
if download_location == WebDownload.Crosswalk:
bible = \
self.web_bible_list[WebDownload.Crosswalk][bible_version]
@ -433,10 +434,10 @@ class ImportWizardForm(QtGui.QWizard, Ui_BibleImportWizard):
name=license_version,
download_source=WebDownload.get_name(download_location),
download_name=bible,
proxy_server=variant_to_unicode(self.field(u'proxy_server')),
proxy_username=variant_to_unicode(
self.field(u'proxy_username')),
proxy_password=variant_to_unicode(self.field(u'proxy_password'))
proxy_server=unicode(self.field(u'proxy_server').toString()),
proxy_username=\
unicode(self.field(u'proxy_username').toString()),
proxy_password=unicode(self.field(u'proxy_password').toString())
)
success = importer.do_import()
if success:

View File

@ -29,8 +29,9 @@ import chardet
import re
from sqlalchemy import or_
from PyQt4 import QtCore
from PyQt4 import QtCore, QtGui
from openlp.core.lib import translate
from openlp.plugins.bibles.lib.models import *
log = logging.getLogger(__name__)
@ -59,6 +60,7 @@ class BibleDB(QtCore.QObject):
"""
log.info(u'BibleDB loaded')
QtCore.QObject.__init__(self)
self.bible_plugin = parent
if u'path' not in kwargs:
raise KeyError(u'Missing keyword argument "path".')
if u'name' not in kwargs and u'file' not in kwargs:
@ -303,14 +305,22 @@ class BibleDB(QtCore.QObject):
if db_book:
book = db_book.name
log.debug(u'Book name corrected to "%s"', book)
verses = self.session.query(Verse)\
.filter_by(book_id=db_book.id)\
.filter_by(chapter=chapter)\
.filter(Verse.verse >= start_verse)\
.filter(Verse.verse <= end_verse)\
.order_by(Verse.verse)\
.all()
verse_list.extend(verses)
verses = self.session.query(Verse)\
.filter_by(book_id=db_book.id)\
.filter_by(chapter=chapter)\
.filter(Verse.verse >= start_verse)\
.filter(Verse.verse <= end_verse)\
.order_by(Verse.verse)\
.all()
verse_list.extend(verses)
else:
log.debug(u'OpenLP failed to find book %s', book)
QtGui.QMessageBox.information(self.bible_plugin.media_item,
translate(u'BibleDB', u'Book not found'),
translate(u'BibleDB', u'The book you requested could not '
u'be found in this bible. Please check your spelling '
u'and that this is a complete bible not just one '
u'testament.'))
return verse_list
def verse_search(self, text):
@ -382,4 +392,3 @@ class BibleDB(QtCore.QObject):
log.debug(u'...............................Verses ')
verses = self.session.query(Verse).all()
log.debug(verses)

View File

@ -137,10 +137,10 @@ class HTTPBooks(object):
u'verses FROM chapters WHERE book_id = ?', (book[u'id'],))
if chapters:
return {
u'id': chapters[0][0],
u'book_id': chapters[0][1],
u'chapter': chapters[0][2],
u'verses': chapters[0][3]
u'id': chapters[chapter][0],
u'book_id': chapters[chapter][1],
u'chapter': chapters[chapter][2],
u'verses': chapters[chapter][3]
}
else:
return None
@ -288,8 +288,7 @@ class CWExtract(BibleCommon):
``chapter``
Chapter number
"""
log.debug(u'get_bible_chapter %s,%s,%s',
version, bookname, chapter)
log.debug(u'get_bible_chapter %s,%s,%s', version, bookname, chapter)
urlbookname = bookname.replace(u' ', u'-')
chapter_url = u'http://www.biblestudytools.com/%s/%s/%s.html' % \
(version, urlbookname.lower(), chapter)

View File

@ -57,7 +57,6 @@ class BibleMediaItem(MediaManagerItem):
self.IconPath = u'songs/song'
self.ListViewWithDnD_class = BibleListView
self.lastReference = []
self.addToServiceItem = True
MediaManagerItem.__init__(self, parent, icon, title)
# place to store the search results
self.search_results = {}
@ -147,7 +146,7 @@ class BibleMediaItem(MediaManagerItem):
self.QuickMessage = QtGui.QLabel(self.QuickTab)
self.QuickMessage.setObjectName(u'QuickMessage')
self.QuickLayout.addWidget(self.QuickMessage, 6, 0, 1, 3)
self.SearchTabWidget.addTab(self.QuickTab,
self.SearchTabWidget.addTab(self.QuickTab,
translate(u'BiblesPlugin.MediaItem', u'Quick'))
QuickSpacerItem = QtGui.QSpacerItem(20, 35, QtGui.QSizePolicy.Minimum,
QtGui.QSizePolicy.Expanding)
@ -232,7 +231,7 @@ class BibleMediaItem(MediaManagerItem):
self.AdvancedMessage = QtGui.QLabel(self.AdvancedTab)
self.AdvancedMessage.setObjectName(u'AdvancedMessage')
self.AdvancedLayout.addWidget(self.AdvancedMessage, 8, 0, 1, 3)
self.SearchTabWidget.addTab(self.AdvancedTab,
self.SearchTabWidget.addTab(self.AdvancedTab,
translate(u'BiblesPlugin.MediaItem', u'Advanced'))
# Add the search tab widget to the page layout
self.PageLayout.addWidget(self.SearchTabWidget)
@ -387,7 +386,7 @@ class BibleMediaItem(MediaManagerItem):
def onNoBookFound(self):
QtGui.QMessageBox.critical(self,
translate(u'BiblesPlugin.MediaItem', u'No Book Found'),
translate(u'BiblesPlugin.MediaItem',
translate(u'BiblesPlugin.MediaItem',
u'No matching book could be found in this Bible.'),
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok),
QtGui.QMessageBox.Ok
@ -454,7 +453,7 @@ class BibleMediaItem(MediaManagerItem):
def onQuickSearchButton(self):
log.debug(u'Quick Search Button pressed')
bible = unicode(self.QuickVersionComboBox.currentText())
text = unicode(self.QuickSearchEdit.displayText())
text = unicode(self.QuickSearchEdit.text())
if self.ClearQuickSearchComboBox.currentIndex() == 0:
self.ListView.clear()
self.lastReference = []
@ -495,7 +494,7 @@ class BibleMediaItem(MediaManagerItem):
if bible2_version:
bible2_version = bible2_version.value
else:
bible2_version = u''
bible2_version = u''
if bible2_copyright:
bible2_copyright = bible2_copyright.value
else:
@ -558,7 +557,7 @@ class BibleMediaItem(MediaManagerItem):
service_item.title = u'%s %s' % (book, verse_text)
elif service_item.title.find(
translate(u'BiblesPlugin.MediaItem', u'etc')) == -1:
service_item.title = u'%s, %s' % (service_item.title,
service_item.title = u'%s, %s' % (service_item.title,
translate(u'BiblesPlugin.MediaItem', u'etc'))
if len(self.parent.settings_tab.bible_theme) == 0:
service_item.theme = None
@ -569,7 +568,11 @@ class BibleMediaItem(MediaManagerItem):
raw_slides.append(bible_text)
for slide in raw_slides:
service_item.add_from_text(slide[:30], slide)
service_item.raw_footer = raw_footer
if service_item.raw_footer:
for foot in raw_footer:
service_item.raw_footer.append(foot)
else:
service_item.raw_footer = raw_footer
return True
def formatVerse(self, old_chapter, chapter, verse, opening, closing):

View File

@ -67,7 +67,7 @@ class CustomPlugin(Plugin):
self.remove_toolbox_item()
def about(self):
about_text = translate(u'CustomPlugin.CustomPlugin',
about_text = translate(u'CustomPlugin',
u'<b>Custom Plugin</b><br>This plugin '
u'allows slides to be displayed on the screen in the same way '
u'songs are. This plugin provides greater freedom over the '

View File

@ -115,16 +115,24 @@ class CustomMediaItem(MediaManagerItem):
self.parent.edit_custom_form.exec_()
def onEditClick(self):
item = self.ListView.currentItem()
if item:
"""
Edit a custom item
"""
if self.checkItemSelected(translate(u'CustomPlugin.MediaItem',
u'You must select an item to edit.')):
item = self.ListView.currentItem()
item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0]
self.parent.edit_custom_form.loadCustom(item_id, False)
self.parent.edit_custom_form.exec_()
self.initialise()
def onDeleteClick(self):
item = self.ListView.currentItem()
if item:
"""
Remove a custom item from the list and database
"""
if self.checkItemSelected(translate(u'CustomPlugin.MediaItem',
u'You must select an item to delete.')):
item = self.ListView.currentItem()
item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0]
self.parent.custommanager.delete_custom(item_id)
row = self.ListView.row(item)

View File

@ -56,7 +56,7 @@ class ImagePlugin(Plugin):
return ImageMediaItem(self, self.icon, self.name)
def about(self):
about_text = translate(u'ImagePlugin.ImagePlugin', u'<b>Image Plugin'
about_text = translate(u'ImagePlugin', u'<b>Image Plugin'
u'</b><br>Allows images of all types to be displayed. If a number '
u'of images are selected together and presented on the live '
u'controller it is possible to turn them into a timed loop.<br<br>'

View File

@ -29,7 +29,7 @@ import os
from PyQt4 import QtCore, QtGui
from openlp.core.lib import MediaManagerItem, BaseListWithDnD, build_icon, \
contextMenuAction, ItemCapabilities, SettingsManager, translate
context_menu_action, ItemCapabilities, SettingsManager, translate
from openlp.core.utils import AppLocation
log = logging.getLogger(__name__)
@ -93,7 +93,7 @@ class ImageMediaItem(MediaManagerItem):
MediaManagerItem.addListViewToToolBar(self)
self.ListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
self.ListView.addAction(
contextMenuAction(
context_menu_action(
self.ListView, u':/slides/slide_blank.png',
translate(u'ImagePlugin.MediaItem', u'Replace Live Background'),
self.onReplaceClick))
@ -116,16 +116,21 @@ class ImageMediaItem(MediaManagerItem):
self.PageLayout.addWidget(self.ImageWidget)
def onDeleteClick(self):
items = self.ListView.selectedIndexes()
if items:
"""
Remove an image item from the list
"""
if self.checkItemSelected(translate(u'ImagePlugin.MediaItem',
u'You must select an item to delete.')):
items = self.ListView.selectedIndexes()
for item in items:
text = self.ListView.item(item.row())
try:
os.remove(
os.path.join(self.servicePath, unicode(text.text())))
except OSError:
#if not present do not worry
pass
if text:
try:
os.remove(os.path.join(self.servicePath,
unicode(text.text())))
except OSError:
#if not present do not worry
pass
self.ListView.takeItem(item.row())
SettingsManager.set_list(self.settingsSection,
self.settingsSection, self.getFileList())
@ -157,7 +162,7 @@ class ImageMediaItem(MediaManagerItem):
service_item.add_capability(ItemCapabilities.AllowsAdditions)
for item in items:
bitem = self.ListView.item(item.row())
filename = unicode((bitem.data(QtCore.Qt.UserRole)).toString())
filename = unicode(bitem.data(QtCore.Qt.UserRole).toString())
frame = QtGui.QImage(unicode(filename))
(path, name) = os.path.split(filename)
service_item.add_from_image(path, name, frame)
@ -174,7 +179,7 @@ class ImageMediaItem(MediaManagerItem):
items = self.ListView.selectedIndexes()
for item in items:
bitem = self.ListView.item(item.row())
filename = unicode((bitem.data(QtCore.Qt.UserRole)).toString())
filename = unicode(bitem.data(QtCore.Qt.UserRole).toString())
frame = QtGui.QImage(unicode(filename))
self.parent.maindisplay.addImageWithText(frame)

View File

@ -29,7 +29,7 @@ import os
from PyQt4 import QtCore, QtGui
from openlp.core.lib import MediaManagerItem, BaseListWithDnD, build_icon, \
ItemCapabilities, SettingsManager, contextMenuAction, Receiver, translate
ItemCapabilities, SettingsManager, context_menu_action, Receiver, translate
log = logging.getLogger(__name__)
@ -77,7 +77,7 @@ class MediaMediaItem(MediaManagerItem):
MediaManagerItem.addListViewToToolBar(self)
self.ListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
self.ListView.addAction(
contextMenuAction(self.ListView, u':/slides/slide_blank.png',
context_menu_action(self.ListView, u':/slides/slide_blank.png',
translate(u'MediaPlugin.MediaItem', u'Replace Live Background'),
self.onReplaceClick))
@ -112,7 +112,7 @@ class MediaMediaItem(MediaManagerItem):
items = self.ListView.selectedIndexes()
for item in items:
bitem = self.ListView.item(item.row())
filename = unicode((bitem.data(QtCore.Qt.UserRole)).toString())
filename = unicode(bitem.data(QtCore.Qt.UserRole).toString())
Receiver.send_message(u'videodisplay_background', filename)
def generateSlideData(self, service_item, item=None):
@ -120,7 +120,7 @@ class MediaMediaItem(MediaManagerItem):
item = self.ListView.currentItem()
if item is None:
return False
filename = unicode((item.data(QtCore.Qt.UserRole)).toString())
filename = unicode(item.data(QtCore.Qt.UserRole).toString())
service_item.title = unicode(
translate(u'MediaPlugin.MediaItem', u'Media'))
service_item.add_capability(ItemCapabilities.RequiresMedia)
@ -137,8 +137,12 @@ class MediaMediaItem(MediaManagerItem):
self.settingsSection))
def onDeleteClick(self):
item = self.ListView.currentItem()
if item:
"""
Remove a media item from the list
"""
if self.checkItemSelected(translate(u'MediaPlugin.MediaItem',
u'You must select an item to delete.')):
item = self.ListView.currentItem()
row = self.ListView.row(item)
self.ListView.takeItem(row)
SettingsManager.set_list(self.settingsSection,
@ -152,4 +156,3 @@ class MediaMediaItem(MediaManagerItem):
item_name.setIcon(build_icon(img))
item_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(file))
self.ListView.addItem(item_name)

View File

@ -81,7 +81,7 @@ class MediaPlugin(Plugin):
return MediaMediaItem(self, self.icon, self.name)
def about(self):
about_text = translate(u'MediaPlugin.MediaPlugin',
about_text = translate(u'MediaPlugin',
u'<b>Media Plugin</b><br>This plugin '
u'allows the playing of audio and video media')
return about_text

View File

@ -181,7 +181,7 @@ class ImpressController(PresentationController):
class ImpressDocument(PresentationDocument):
def __init__(self, controller, presentation):
log.debug(u'Init Presentation OpenOffice')
PresentationDocument.__init__(controller, presentation)
PresentationDocument.__init__(self, controller, presentation)
self.document = None
self.presentation = None
self.control = None

View File

@ -174,13 +174,17 @@ class PresentationMediaItem(MediaManagerItem):
self.ListView.addItem(item_name)
def onDeleteClick(self):
item = self.ListView.currentItem()
if item:
"""
Remove a presentation item from the list
"""
if self.checkItemSelected(translate(u'PresentationPlugin.MediaItem',
u'You must select an item to delete.')):
item = self.ListView.currentItem()
row = self.ListView.row(item)
self.ListView.takeItem(row)
SettingsManager.set_list(self.settingsSection,
self.settingsSection, self.getFileList())
filepath = unicode((item.data(QtCore.Qt.UserRole)).toString())
filepath = unicode(item.data(QtCore.Qt.UserRole).toString())
#not sure of this has errors
#John please can you look at .
for cidx in self.controllers:
@ -198,7 +202,7 @@ class PresentationMediaItem(MediaManagerItem):
if shortname:
for item in items:
bitem = self.ListView.item(item.row())
filename = unicode((bitem.data(QtCore.Qt.UserRole)).toString())
filename = unicode(bitem.data(QtCore.Qt.UserRole).toString())
if shortname == self.Automatic:
service_item.shortname = self.findControllerByType(filename)
if not service_item.shortname:

View File

@ -29,6 +29,7 @@ import os
from PyQt4 import QtCore
from openlp.core.lib import Receiver
from openlp.core.ui import HideMode
log = logging.getLogger(__name__)
@ -55,7 +56,7 @@ class Controller(object):
self.doc.start_presentation()
if isBlank:
self.blank()
Receiver.send_message(u'maindisplay_hide')
Receiver.send_message(u'maindisplay_hide', HideMode.Screen)
self.doc.slidenumber = 0
def activate(self):
@ -179,6 +180,7 @@ class Controller(object):
self.doc.slidenumber != self.doc.get_slide_number():
self.doc.goto_slide(self.doc.slidenumber)
self.doc.unblank_screen()
Receiver.send_message(u'maindisplay_hide', HideMode.Screen)
def poll(self):
self.doc.poll_slidenumber(self.isLive)

View File

@ -104,7 +104,7 @@ class PowerpointController(PresentationController):
class PowerpointDocument(PresentationDocument):
def __init__(self, controller, presentation):
log.debug(u'Init Presentation Powerpoint')
PresentationDocument.__init__(controller, presentation)
PresentationDocument.__init__(self, controller, presentation)
self.presentation = None
def load_presentation(self):
@ -142,7 +142,7 @@ class PowerpointDocument(PresentationDocument):
if self.check_thumbnails():
return
self.presentation.Export(os.path.join(self.thumbnailpath, ''), 'png',
640, 480)
320, 240)
def close_presentation(self):
"""

View File

@ -102,7 +102,7 @@ class PptviewController(PresentationController):
class PptviewDocument(PresentationDocument):
def __init__(self, controller, presentation):
log.debug(u'Init Presentation PowerPoint')
PresentationDocument.__init__(controller, presentation)
PresentationDocument.__init__(self, controller, presentation)
self.presentation = None
self.pptid = None
self.blanked = False

View File

@ -108,7 +108,7 @@ class PresentationPlugin(Plugin):
return False
def about(self):
about_text = translate(u'PresentationPlugin.PresentationPlugin',
about_text = translate(u'PresentationPlugin',
u'<b>Presentation Plugin</b> <br> Delivers '
u'the ability to show presentations using a number of different '
u'programs. The choice of available presentation programs is '

View File

@ -69,7 +69,7 @@ class RemotesPlugin(Plugin):
"""
Information about this plugin
"""
about_text = translate(u'RemotePlugin.RemotePlugin',
about_text = translate(u'RemotePlugin',
u'<b>Remote Plugin</b><br>This plugin '
u'provides the ability to send messages to a running version of '
u'openlp on a different computer via a web browser or other app<br>'

View File

@ -277,7 +277,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
rowLabel = []
for row in range(0, self.VerseListWidget.rowCount()):
item = self.VerseListWidget.item(row, 0)
data = unicode((item.data(QtCore.Qt.UserRole)).toString())
data = unicode(item.data(QtCore.Qt.UserRole).toString())
bit = data.split(u':')
rowTag = u'%s\n%s' % (bit[0][0:1], bit[1])
rowLabel.append(rowTag)
@ -418,7 +418,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
item = self.VerseListWidget.currentItem()
if item:
tempText = item.text()
verseId = unicode((item.data(QtCore.Qt.UserRole)).toString())
verseId = unicode(item.data(QtCore.Qt.UserRole).toString())
self.verse_form.setVerse(tempText, True, verseId)
if self.verse_form.exec_():
afterText, verse, subVerse = self.verse_form.getVerse()
@ -449,7 +449,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
if self.VerseListWidget.rowCount() > 0:
for row in range(0, self.VerseListWidget.rowCount()):
item = self.VerseListWidget.item(row, 0)
field = unicode((item.data(QtCore.Qt.UserRole)).toString())
field = unicode(item.data(QtCore.Qt.UserRole).toString())
verse_list += u'---[%s]---\n' % field
verse_list += item.text()
verse_list += u'\n'
@ -540,7 +540,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
def onCopyrightInsertButtonTriggered(self):
text = self.CopyrightEditItem.text()
pos = self.CopyrightEditItem.cursorPosition()
text = text[:pos] + u'©' + text[pos:]
text = text[:pos] + u'\xa9' + text[pos:]
self.CopyrightEditItem.setText(text)
self.CopyrightEditItem.setFocus()
self.CopyrightEditItem.setCursorPosition(pos + 1)
@ -598,7 +598,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
text = u' '
for i in range (0, self.VerseListWidget.rowCount()):
item = self.VerseListWidget.item(i, 0)
verseId = unicode((item.data(QtCore.Qt.UserRole)).toString())
verseId = unicode(item.data(QtCore.Qt.UserRole).toString())
bits = verseId.split(u':')
sxml.add_verse_to_lyrics(bits[0], bits[1], unicode(item.text()))
text = text + unicode(self.VerseListWidget.item(i, 0).text()) \

View File

@ -104,7 +104,7 @@ class EditVerseForm(QtGui.QDialog, Ui_EditVerseDialog):
verse_type = match.group(1)
verse_number = int(match.group(2))
verse_type_index = VerseType.from_string(verse_type)
if verse_type_index:
if verse_type_index is not None:
self.VerseTypeComboBox.setCurrentIndex(verse_type_index)
self.VerseNumberBox.setValue(verse_number)
@ -112,8 +112,9 @@ class EditVerseForm(QtGui.QDialog, Ui_EditVerseDialog):
tag=u'%s:1' % VerseType.to_string(VerseType.Verse)):
if single:
verse_type, verse_number = tag.split(u':')
self.VerseTypeComboBox.setCurrentIndex(
VerseType.from_string(verse_type))
verse_type_index = VerseType.from_string(verse_type)
if verse_type_index is not None:
self.VerseTypeComboBox.setCurrentIndex(verse_type_index)
self.VerseNumberBox.setValue(int(verse_number))
self.InsertButton.setVisible(False)
else:

View File

@ -29,7 +29,7 @@ from PyQt4 import QtCore, QtGui
from songimportwizard import Ui_SongImportWizard
from openlp.core.lib import Receiver, SettingsManager, translate
#from openlp.core.utils import AppLocation, variant_to_unicode
#from openlp.core.utils import AppLocation
from openlp.plugins.songs.lib.manager import SongFormat
log = logging.getLogger(__name__)
@ -203,20 +203,20 @@ class ImportWizardForm(QtGui.QWizard, Ui_SongImportWizard):
# # Import an OSIS bible
# importer = self.manager.import_bible(BibleFormat.OSIS,
# name=license_version,
# filename=variant_to_unicode(self.field(u'osis_location'))
# filename=unicode(self.field(u'osis_location').toString())
# )
# elif bible_type == BibleFormat.CSV:
# # Import a CSV bible
# importer = self.manager.import_bible(BibleFormat.CSV,
# name=license_version,
# booksfile=variant_to_unicode(self.field(u'csv_booksfile')),
# versefile=variant_to_unicode(self.field(u'csv_versefile'))
# booksfile=unicode(self.field(u'csv_booksfile').toString()),
# versefile=unicode(self.field(u'csv_versefile').toString())
# )
# elif bible_type == BibleFormat.OpenSong:
# # Import an OpenSong bible
# importer = self.manager.import_bible(BibleFormat.OpenSong,
# name=license_version,
# filename=variant_to_unicode(self.field(u'opensong_file'))
# filename=unicode(self.field(u'opensong_file').toString())
# )
# elif bible_type == BibleFormat.WebDownload:
# # Import a bible from the web
@ -234,9 +234,9 @@ class ImportWizardForm(QtGui.QWizard, Ui_SongImportWizard):
# name=license_version,
# download_source=WebDownload.get_name(download_location),
# download_name=bible,
# proxy_server=variant_to_unicode(self.field(u'proxy_server')),
# proxy_username=variant_to_unicode(self.field(u'proxy_username')),
# proxy_password=variant_to_unicode(self.field(u'proxy_password'))
# proxy_server=unicode(self.field(u'proxy_server').toString()),
# proxy_username=unicode(self.field(u'proxy_username').toString()),
# proxy_password=unicode(self.field(u'proxy_password').toString())
# )
# success = importer.do_import()
# if success:

View File

@ -113,7 +113,8 @@ class Ui_SongImportWizard(object):
self.OpenIcon.addPixmap(QtGui.QPixmap(u':/general/general_open.png'),
QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.DeleteIcon = QtGui.QIcon()
self.DeleteIcon.addPixmap(QtGui.QPixmap(u':/general/general_delete.png'),
self.DeleteIcon.addPixmap(
QtGui.QPixmap(u':/general/general_delete.png'),
QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.OpenLyricsAddButton.setIcon(self.OpenIcon)
self.OpenLyricsAddButton.setObjectName(u'OpenLyricsAddButton')
@ -185,7 +186,8 @@ class Ui_SongImportWizard(object):
self.CSVLayout.setObjectName(u'CSVLayout')
self.CSVFilenameLabel = QtGui.QLabel(self.CSVPage)
self.CSVFilenameLabel.setObjectName(u'CSVFilenameLabel')
self.CSVLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.CSVFilenameLabel)
self.CSVLayout.setWidget(0, QtGui.QFormLayout.LabelRole,
self.CSVFilenameLabel)
self.CSVFileLayout = QtGui.QHBoxLayout()
self.CSVFileLayout.setSpacing(8)
self.CSVFileLayout.setObjectName(u'CSVFileLayout')
@ -196,7 +198,8 @@ class Ui_SongImportWizard(object):
self.CSVBrowseButton.setIcon(self.OpenIcon)
self.CSVBrowseButton.setObjectName(u'CSVBrowseButton')
self.CSVFileLayout.addWidget(self.CSVBrowseButton)
self.CSVLayout.setLayout(0, QtGui.QFormLayout.FieldRole, self.CSVFileLayout)
self.CSVLayout.setLayout(0, QtGui.QFormLayout.FieldRole,
self.CSVFileLayout)
self.FormatStackedWidget.addWidget(self.CSVPage)
self.SourceLayout.addWidget(self.FormatStackedWidget)
SongImportWizard.addPage(self.SourcePage)

View File

@ -96,7 +96,7 @@ class SongManager(object):
settings = QtCore.QSettings()
settings.beginGroup(u'songs')
self.db_url = u''
db_type = unicode(settings.value(u'songs/db type',
db_type = unicode(settings.value(u'db type',
QtCore.QVariant(u'sqlite')).toString())
if db_type == u'sqlite':
self.db_url = u'sqlite:///%s/songs.sqlite' % \

View File

@ -275,15 +275,23 @@ class SongMediaItem(MediaManagerItem):
self.edit_song_form.exec_()
def onEditClick(self):
item = self.ListView.currentItem()
if item:
"""
Edit a song
"""
if self.checkItemSelected(translate(u'SongsPlugin.MediaItem',
u'You must select an item to edit.')):
item = self.ListView.currentItem()
item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0]
self.edit_song_form.loadSong(item_id, False)
self.edit_song_form.exec_()
def onDeleteClick(self):
items = self.ListView.selectedIndexes()
if items:
"""
Remove a song from the list and database
"""
if self.checkItemSelected(translate(u'SongsPlugin.MediaItem',
u'You must select an item to delete.')):
items = self.ListView.selectedIndexes()
if len(items) == 1:
del_message = translate(u'SongsPlugin.MediaItem',
u'Delete song?')
@ -333,7 +341,7 @@ class SongMediaItem(MediaManagerItem):
for verse in verseList:
verseTag = 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]), verseTag)
else:
#Loop through the verse list and expand the song accordingly.
@ -345,8 +353,8 @@ class SongMediaItem(MediaManagerItem):
verse[0][u'type'][0] == order[0]:
verseTag = u'%s:%s' % \
(verse[0][u'type'], verse[0][u'label'])
service_item.add_from_text\
(verse[1][:30], verse[1], verseTag)
service_item.add_from_text(
verse[1][:30], verse[1], verseTag)
else:
verses = song.lyrics.split(u'\n\n')
for slide in verses:
@ -371,4 +379,3 @@ class SongMediaItem(MediaManagerItem):
song.title, author_audit, song.copyright, song.ccli_number
]
return True

View File

@ -66,7 +66,7 @@ class SongImport(object):
self.copyright_string = unicode(QtGui.QApplication.translate( \
u'SongsPlugin.SongImport', u'copyright'))
self.copyright_symbol = unicode(QtGui.QApplication.translate( \
u'SongsPlugin.SongImport', u'©'))
u'SongsPlugin.SongImport', u'\xa9'))
@staticmethod
def process_songs_text(manager, text):

View File

@ -94,36 +94,44 @@ class SongsPlugin(Plugin):
# Main song import menu item - will eventually be the only one
self.SongImportItem = QtGui.QAction(import_menu)
self.SongImportItem.setObjectName(u'SongImportItem')
self.SongImportItem.setText(import_menu.trUtf8('&Song'))
self.SongImportItem.setText(translate(
u'SongsPlugin', u'&Song'))
self.SongImportItem.setToolTip(
import_menu.trUtf8('Import songs using the import wizard.'))
translate(u'SongsPlugin',
u'Import songs using the import wizard.'))
import_menu.addAction(self.SongImportItem)
# Songs of Fellowship import menu item - will be removed and the
# functionality will be contained within the import wizard
self.ImportSofItem = QtGui.QAction(import_menu)
self.ImportSofItem.setObjectName(u'ImportSofItem')
self.ImportSofItem.setText(
import_menu.trUtf8('Songs of Fellowship (temp menu item)'))
translate(u'SongsPlugin',
u'Songs of Fellowship (temp menu item)'))
self.ImportSofItem.setToolTip(
import_menu.trUtf8('Import songs from the VOLS1_2.RTF, sof3words' \
+ '.rtf and sof4words.rtf supplied with the music books'))
translate(u'SongsPlugin',
u'Import songs from the VOLS1_2.RTF, sof3words' \
+ u'.rtf and sof4words.rtf supplied with the music books'))
self.ImportSofItem.setStatusTip(
import_menu.trUtf8('Import songs from the VOLS1_2.RTF, sof3words' \
+ '.rtf and sof4words.rtf supplied with the music books'))
translate(u'SongsPlugin',
u'Import songs from the VOLS1_2.RTF, sof3words' \
+ u'.rtf and sof4words.rtf supplied with the music books'))
import_menu.addAction(self.ImportSofItem)
# OpenOffice.org import menu item - will be removed and the
# functionality will be contained within the import wizard
self.ImportOooItem = QtGui.QAction(import_menu)
self.ImportOooItem.setObjectName(u'ImportOooItem')
self.ImportOooItem.setText(
import_menu.trUtf8('Generic Document/Presentation Import '
'(temp menu item)'))
translate(u'SongsPlugin',
u'Generic Document/Presentation Import '
u'(temp menu item)'))
self.ImportOooItem.setToolTip(
import_menu.trUtf8('Import songs from '
'Word/Writer/Powerpoint/Impress'))
translate(u'SongsPlugin',
u'Import songs from '
u'Word/Writer/Powerpoint/Impress'))
self.ImportOooItem.setStatusTip(
import_menu.trUtf8('Import songs from '
'Word/Writer/Powerpoint/Impress'))
translate(u'SongsPlugin',
u'Import songs from '
u'Word/Writer/Powerpoint/Impress'))
import_menu.addAction(self.ImportOooItem)
# Signals and slots
QtCore.QObject.connect(self.SongImportItem,
@ -151,7 +159,7 @@ class SongsPlugin(Plugin):
def onImportSofItemClick(self):
filenames = QtGui.QFileDialog.getOpenFileNames(
None, translate(u'SongsPlugin.Songsplugin',
None, translate(u'SongsPlugin',
u'Open Songs of Fellowship file'),
u'', u'Songs of Fellowship file (*.rtf *.RTF)')
try:
@ -161,18 +169,20 @@ class SongsPlugin(Plugin):
except:
log.exception('Could not import SoF file')
QtGui.QMessageBox.critical(None,
self.ImportSongMenu.trUtf8('Import Error'),
self.ImportSongMenu.trUtf8('Error importing Songs of '
'Fellowship file.\nOpenOffice.org must be installed'
' and you must be using an unedited copy of the RTF'
' included with the Songs of Fellowship Music Editions'),
translate(u'SongsPlugin',
u'Import Error'),
translate(u'SongsPlugin',
u'Error importing Songs of '
u'Fellowship file.\nOpenOffice.org must be installed'
u' and you must be using an unedited copy of the RTF'
u' included with the Songs of Fellowship Music Editions'),
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok),
QtGui.QMessageBox.Ok)
Receiver.send_message(u'songs_load_list')
def onImportOooItemClick(self):
filenames = QtGui.QFileDialog.getOpenFileNames(
None, translate(u'SongsPlugin.Songsplugin',
None, translate(u'SongsPlugin',
u'Open documents or presentations'),
u'', u'All Files(*.*)')
oooimport = OooImport(self.manager)
@ -180,7 +190,7 @@ class SongsPlugin(Plugin):
Receiver.send_message(u'songs_load_list')
def about(self):
about_text = translate(u'SongsPlugin.Songsplugin',
about_text = translate(u'SongsPlugin',
u'<strong>Song Plugin</strong><br />'
u'This plugin allows songs to be managed and displayed.')
return about_text

View File

@ -59,20 +59,25 @@ class SongUsagePlugin(Plugin):
self.toolsMenu = tools_menu
self.SongUsageMenu = QtGui.QMenu(tools_menu)
self.SongUsageMenu.setObjectName(u'SongUsageMenu')
self.SongUsageMenu.setTitle(tools_menu.trUtf8('&Song Usage'))
self.SongUsageMenu.setTitle(translate(
u'SongUsagePlugin', u'&Song Usage'))
#SongUsage Delete
self.SongUsageDelete = QtGui.QAction(tools_menu)
self.SongUsageDelete.setText(
tools_menu.trUtf8('&Delete recorded data'))
translate(u'SongUsagePlugin',
u'&Delete recorded data'))
self.SongUsageDelete.setStatusTip(
tools_menu.trUtf8('Delete song usage to specified date'))
translate(u'SongUsagePlugin',
u'Delete song usage to specified date'))
self.SongUsageDelete.setObjectName(u'SongUsageDelete')
#SongUsage Report
self.SongUsageReport = QtGui.QAction(tools_menu)
self.SongUsageReport.setText(
tools_menu.trUtf8('&Extract recorded data'))
translate(u'SongUsagePlugin',
u'&Extract recorded data'))
self.SongUsageReport.setStatusTip(
tools_menu.trUtf8('Generate report on Song Usage'))
translate(u'SongUsagePlugin',
u'Generate report on Song Usage'))
self.SongUsageReport.setObjectName(u'SongUsageReport')
#SongUsage activation
SongUsageIcon = build_icon(u':/tools/tools_alert.png')
@ -80,9 +85,11 @@ class SongUsagePlugin(Plugin):
self.SongUsageStatus.setIcon(SongUsageIcon)
self.SongUsageStatus.setCheckable(True)
self.SongUsageStatus.setChecked(False)
self.SongUsageStatus.setText(tools_menu.trUtf8('Song Usage Status'))
self.SongUsageStatus.setText(translate(
u'SongUsagePlugin', u'Song Usage Status'))
self.SongUsageStatus.setStatusTip(
tools_menu.trUtf8('Start/Stop live song usage recording'))
translate(u'SongUsagePlugin',
u'Start/Stop live song usage recording'))
self.SongUsageStatus.setShortcut(u'F4')
self.SongUsageStatus.setObjectName(u'SongUsageStatus')
#Add Menus together
@ -156,7 +163,7 @@ class SongUsagePlugin(Plugin):
self.SongUsagedetailform.exec_()
def about(self):
about_text = translate(u'SongsPlugin.SongUsagePlugin',
about_text = translate(u'SongUsagePlugin',
u'<b>SongUsage Plugin</b><br>This plugin '
u'records the use of songs and when they have been used during '
u'a live service')

View File

@ -1,116 +0,0 @@
#!/usr/bin/env python
# -*- 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, Christian Richter, Maikel Stuivenberg, Martin #
# Thompson, Jon Tibble, Carsten Tinggaard #
# --------------------------------------------------------------------------- #
# 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 os
from cgi import escape
from ast import parse, NodeVisitor, Str
ts_file = u"""<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="1.1">
%s
</TS>
"""
ts_context = u""" <context>
<name>%s</name>
%s </context>
"""
ts_message = u""" <message>
<location filename="%s" line="%d"/>
<source>%s</source>
<translation type="unfinished"></translation>
</message>
"""
class StringExtractor(NodeVisitor):
def __init__(self, strings, filename, base_path):
self.base_path = base_path
self.filename = filename
self.strings = strings
self.classname = 'unknown'
def visit_ClassDef(self, node):
self.classname = node.name
self.generic_visit(node)
def visit_Call(self, node):
if hasattr(node.func, 'attr') and node.func.attr == 'trUtf8' and isinstance(node.args[0], Str):
string = node.args[0].s
key = '%s-%s' % (self.classname, string)
self.strings[key] = [self.classname, self.filename[len(self.base_path) + 1:], node.lineno, escape(string)]
self.generic_visit(node)
def parse_file(base_path, filename, strings):
file = open(filename, u'r')
try:
ast = parse(file.read())
except SyntaxError, e:
print "Unable to parse %s: %s" % (filename, e)
return
file.close()
StringExtractor(strings, filename, base_path).visit(ast)
def write_file(filename, strings):
translation_file = u''
translation_contexts = []
translation_messages = []
class_name = strings[strings.keys()[0]][0]
current_context = u''
for key, translation in strings.iteritems():
if class_name != translation[0]:
current_context = ts_context % (class_name, u''.join(translation_messages))
translation_contexts.append(current_context)
translation_messages = []
class_name = translation[0]
translation_messages.append(ts_message % (translation[1], translation[2], translation[3]))
current_context = ts_context % (class_name, u''.join(translation_messages))
translation_contexts.append(current_context)
translation_file = ts_file % (u''.join(translation_contexts))
file = open(filename, u'w')
file.write(translation_file.encode('utf8'))
file.close()
def main():
strings = {}
start_dir = os.path.abspath(u'..')
for root, dirs, files in os.walk(start_dir):
for file in files:
if file.startswith(u'hook-') or file.startswith(u'test_'):
continue
if file.endswith(u'.py'):
print u'Parsing "%s"' % file
parse_file(start_dir, os.path.join(root, file), strings)
print u'Generating TS file...',
write_file(os.path.join(start_dir, u'resources', u'i18n', u'openlp_en.ts'), strings)
print u'done.'
if __name__ == u'__main__':
if os.path.split(os.path.abspath(u'.'))[1] != u'scripts':
print u'You need to run this script from the scripts directory.'
else:
main()