diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index d5b46e6cb..40557d446 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -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): diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 61e9cac6e..706448bf3 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -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 diff --git a/openlp/core/lib/plugin.py b/openlp/core/lib/plugin.py index ebb38615d..0c22723a4 100644 --- a/openlp/core/lib/plugin.py +++ b/openlp/core/lib/plugin.py @@ -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): """ diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 142b3741d..aa8c0a95a 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -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 diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index 6f27ddf34..b3464888e 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -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'] diff --git a/openlp/core/lib/xmlrootclass.py b/openlp/core/lib/xmlrootclass.py index b2b37aaf1..1ea1d41a2 100644 --- a/openlp/core/lib/xmlrootclass.py +++ b/openlp/core/lib/xmlrootclass.py @@ -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. diff --git a/openlp/core/theme/theme.py b/openlp/core/theme/theme.py index 7bc705fcb..75a2ddd85 100644 --- a/openlp/core/theme/theme.py +++ b/openlp/core/theme/theme.py @@ -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: diff --git a/openlp/core/ui/aboutform.py b/openlp/core/ui/aboutform.py index 933a12b56..4f9519eb8 100644 --- a/openlp/core/ui/aboutform.py +++ b/openlp/core/ui/aboutform.py @@ -44,8 +44,8 @@ class AboutForm(QtGui.QDialog, Ui_AboutDialog): about_text = about_text.replace(u'', 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'', build_text) diff --git a/openlp/core/ui/amendthemeform.py b/openlp/core/ui/amendthemeform.py index a2db71ff3..9306a931c 100644 --- a/openlp/core/ui/amendthemeform.py +++ b/openlp/core/ui/amendthemeform.py @@ -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 diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 5e8db4934..a3c444097 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -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): """ diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index c65fa2ec0..9efadddd8 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -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() diff --git a/openlp/core/ui/pluginform.py b/openlp/core/ui/pluginform.py index 9969ed165..a91dd9a12 100644 --- a/openlp/core/ui/pluginform.py +++ b/openlp/core/ui/pluginform.py @@ -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) diff --git a/openlp/core/ui/serviceitemeditform.py b/openlp/core/ui/serviceitemeditform.py index eddf064e9..1ea829f81 100644 --- a/openlp/core/ui/serviceitemeditform.py +++ b/openlp/core/ui/serviceitemeditform.py @@ -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) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index de344a44d..03efb514f 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -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) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index fc77166e5..069ea718d 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -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) diff --git a/openlp/core/ui/splashscreen.py b/openlp/core/ui/splashscreen.py index 10cea5a11..f49d73815 100644 --- a/openlp/core/ui/splashscreen.py +++ b/openlp/core/ui/splashscreen.py @@ -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() diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index 1d60d264f..a5d6644de 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -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) diff --git a/openlp/core/utils/__init__.py b/openlp/core/utils/__init__.py index 512e15f06..857207896 100644 --- a/openlp/core/utils/__init__.py +++ b/openlp/core/utils/__init__.py @@ -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'] diff --git a/openlp/plugins/alerts/alertsplugin.py b/openlp/plugins/alerts/alertsplugin.py index 7474a0564..eb6d1f116 100644 --- a/openlp/plugins/alerts/alertsplugin.py +++ b/openlp/plugins/alerts/alertsplugin.py @@ -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'Alerts Plugin
This plugin ' u'controls the displaying of alerts on the presentations screen') return about_text diff --git a/openlp/plugins/alerts/lib/alertstab.py b/openlp/plugins/alerts/lib/alertstab.py index 9e6e98489..15f27df6d 100644 --- a/openlp/plugins/alerts/lib/alertstab.py +++ b/openlp/plugins/alerts/lib/alertstab.py @@ -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() diff --git a/openlp/plugins/bibles/bibleplugin.py b/openlp/plugins/bibles/bibleplugin.py index ca018cabd..f3998e5a5 100644 --- a/openlp/plugins/bibles/bibleplugin.py +++ b/openlp/plugins/bibles/bibleplugin.py @@ -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'Bible Plugin
This ' u'plugin allows bible verses from different sources to be ' u'displayed on the screen during the service.') diff --git a/openlp/plugins/bibles/forms/importwizardform.py b/openlp/plugins/bibles/forms/importwizardform.py index b1eafcd61..fbaa2ec14 100644 --- a/openlp/plugins/bibles/forms/importwizardform.py +++ b/openlp/plugins/bibles/forms/importwizardform.py @@ -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: diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index 47d9ffdd2..377803b19 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -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) - diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index 223d428af..073b03118 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -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) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index d922cb446..1d8739346 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -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): diff --git a/openlp/plugins/custom/customplugin.py b/openlp/plugins/custom/customplugin.py index 9ae208a28..2ad95b026 100644 --- a/openlp/plugins/custom/customplugin.py +++ b/openlp/plugins/custom/customplugin.py @@ -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'Custom Plugin
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 ' diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py index 581334410..4cbf25476 100644 --- a/openlp/plugins/custom/lib/mediaitem.py +++ b/openlp/plugins/custom/lib/mediaitem.py @@ -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) diff --git a/openlp/plugins/images/imageplugin.py b/openlp/plugins/images/imageplugin.py index ca375ed6c..343a87491 100644 --- a/openlp/plugins/images/imageplugin.py +++ b/openlp/plugins/images/imageplugin.py @@ -56,7 +56,7 @@ class ImagePlugin(Plugin): return ImageMediaItem(self, self.icon, self.name) def about(self): - about_text = translate(u'ImagePlugin.ImagePlugin', u'Image Plugin' + about_text = translate(u'ImagePlugin', u'Image Plugin' u'
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.' diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index 96584a455..3fbde6af2 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -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) diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index dc3cc837e..60bc190dc 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -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) - diff --git a/openlp/plugins/media/mediaplugin.py b/openlp/plugins/media/mediaplugin.py index 7c773c5a7..7f6e54472 100644 --- a/openlp/plugins/media/mediaplugin.py +++ b/openlp/plugins/media/mediaplugin.py @@ -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'Media Plugin
This plugin ' u'allows the playing of audio and video media') return about_text diff --git a/openlp/plugins/presentations/lib/impresscontroller.py b/openlp/plugins/presentations/lib/impresscontroller.py index 6c360355c..10add26b4 100644 --- a/openlp/plugins/presentations/lib/impresscontroller.py +++ b/openlp/plugins/presentations/lib/impresscontroller.py @@ -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 diff --git a/openlp/plugins/presentations/lib/mediaitem.py b/openlp/plugins/presentations/lib/mediaitem.py index 54c6a9488..51e2db23b 100644 --- a/openlp/plugins/presentations/lib/mediaitem.py +++ b/openlp/plugins/presentations/lib/mediaitem.py @@ -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: diff --git a/openlp/plugins/presentations/lib/messagelistener.py b/openlp/plugins/presentations/lib/messagelistener.py index 0e98b377a..c6ab1e921 100644 --- a/openlp/plugins/presentations/lib/messagelistener.py +++ b/openlp/plugins/presentations/lib/messagelistener.py @@ -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) diff --git a/openlp/plugins/presentations/lib/powerpointcontroller.py b/openlp/plugins/presentations/lib/powerpointcontroller.py index 760869f7a..93c48e86c 100644 --- a/openlp/plugins/presentations/lib/powerpointcontroller.py +++ b/openlp/plugins/presentations/lib/powerpointcontroller.py @@ -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): """ diff --git a/openlp/plugins/presentations/lib/pptviewcontroller.py b/openlp/plugins/presentations/lib/pptviewcontroller.py index 409a0b760..42a12be1d 100644 --- a/openlp/plugins/presentations/lib/pptviewcontroller.py +++ b/openlp/plugins/presentations/lib/pptviewcontroller.py @@ -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 diff --git a/openlp/plugins/presentations/presentationplugin.py b/openlp/plugins/presentations/presentationplugin.py index 036e8fc42..f59968287 100644 --- a/openlp/plugins/presentations/presentationplugin.py +++ b/openlp/plugins/presentations/presentationplugin.py @@ -108,7 +108,7 @@ class PresentationPlugin(Plugin): return False def about(self): - about_text = translate(u'PresentationPlugin.PresentationPlugin', + about_text = translate(u'PresentationPlugin', u'Presentation Plugin
Delivers ' u'the ability to show presentations using a number of different ' u'programs. The choice of available presentation programs is ' diff --git a/openlp/plugins/remotes/remoteplugin.py b/openlp/plugins/remotes/remoteplugin.py index e3d68a9a3..c839f1595 100644 --- a/openlp/plugins/remotes/remoteplugin.py +++ b/openlp/plugins/remotes/remoteplugin.py @@ -69,7 +69,7 @@ class RemotesPlugin(Plugin): """ Information about this plugin """ - about_text = translate(u'RemotePlugin.RemotePlugin', + about_text = translate(u'RemotePlugin', u'Remote Plugin
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
' diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 6b176dc60..4c809bd3d 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -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()) \ diff --git a/openlp/plugins/songs/forms/editverseform.py b/openlp/plugins/songs/forms/editverseform.py index 77e069e25..4d569f18d 100644 --- a/openlp/plugins/songs/forms/editverseform.py +++ b/openlp/plugins/songs/forms/editverseform.py @@ -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: diff --git a/openlp/plugins/songs/forms/songimportform.py b/openlp/plugins/songs/forms/songimportform.py index 75659da70..b4bb9f4b0 100644 --- a/openlp/plugins/songs/forms/songimportform.py +++ b/openlp/plugins/songs/forms/songimportform.py @@ -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: diff --git a/openlp/plugins/songs/forms/songimportwizard.py b/openlp/plugins/songs/forms/songimportwizard.py index 0556d1665..c684bd74b 100644 --- a/openlp/plugins/songs/forms/songimportwizard.py +++ b/openlp/plugins/songs/forms/songimportwizard.py @@ -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) diff --git a/openlp/plugins/songs/lib/manager.py b/openlp/plugins/songs/lib/manager.py index 0b833fb0b..4276303d5 100644 --- a/openlp/plugins/songs/lib/manager.py +++ b/openlp/plugins/songs/lib/manager.py @@ -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' % \ diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 67133f9c6..60faaa826 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -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 - diff --git a/openlp/plugins/songs/lib/songimport.py b/openlp/plugins/songs/lib/songimport.py index f3926425e..9fd7194e2 100644 --- a/openlp/plugins/songs/lib/songimport.py +++ b/openlp/plugins/songs/lib/songimport.py @@ -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): diff --git a/openlp/plugins/songs/songsplugin.py b/openlp/plugins/songs/songsplugin.py index 993b18bb9..21ec610b2 100644 --- a/openlp/plugins/songs/songsplugin.py +++ b/openlp/plugins/songs/songsplugin.py @@ -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'Song Plugin
' u'This plugin allows songs to be managed and displayed.') return about_text diff --git a/openlp/plugins/songusage/songusageplugin.py b/openlp/plugins/songusage/songusageplugin.py index 6cbb08e1a..0b3d7971c 100644 --- a/openlp/plugins/songusage/songusageplugin.py +++ b/openlp/plugins/songusage/songusageplugin.py @@ -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'SongUsage Plugin
This plugin ' u'records the use of songs and when they have been used during ' u'a live service') diff --git a/scripts/get-strings.py b/scripts/get-strings.py deleted file mode 100755 index 5fa42a1fc..000000000 --- a/scripts/get-strings.py +++ /dev/null @@ -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""" - - -%s - -""" -ts_context = u""" - %s -%s -""" -ts_message = u""" - - %s - - -""" - -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()