diff --git a/openlp/core/lib/spelltextedit.py b/openlp/core/lib/spelltextedit.py index 3e58738ce..57a176a69 100644 --- a/openlp/core/lib/spelltextedit.py +++ b/openlp/core/lib/spelltextedit.py @@ -29,6 +29,7 @@ import re try: import enchant from enchant import DictNotFoundError + from enchant.errors import Error ENCHANT_AVAILABLE = True except ImportError: ENCHANT_AVAILABLE = False @@ -56,7 +57,7 @@ class SpellTextEdit(QtGui.QPlainTextEdit): self.dictionary = enchant.Dict() self.highlighter = Highlighter(self.document()) self.highlighter.spellingDictionary = self.dictionary - except DictNotFoundError: + except Error, DictNotFoundError: ENCHANT_AVAILABLE = False log.debug(u'Could not load default dictionary') diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index be23e4108..b661b1e49 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -49,7 +49,10 @@ class MainDisplay(QtGui.QGraphicsView): This is the display screen. """ def __init__(self, parent, image_manager, live): - QtGui.QGraphicsView.__init__(self, parent) + if live: + QtGui.QGraphicsView.__init__(self) + else: + QtGui.QGraphicsView.__init__(self, parent) self.isLive = live self.image_manager = image_manager self.screens = ScreenList.get_instance() diff --git a/openlp/core/ui/shortcutlistform.py b/openlp/core/ui/shortcutlistform.py index 0be7fc85d..6bdcc46bc 100644 --- a/openlp/core/ui/shortcutlistform.py +++ b/openlp/core/ui/shortcutlistform.py @@ -98,6 +98,9 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): if event.modifiers() & QtCore.Qt.ShiftModifier == \ QtCore.Qt.ShiftModifier: key_string = u'Shift+' + key_string + if event.modifiers() & QtCore.Qt.MetaModifier == \ + QtCore.Qt.MetaModifier: + key_string = u'Meta+' + key_string key_sequence = QtGui.QKeySequence(key_string) if self._validiate_shortcut(self._currentItemAction(), key_sequence): if self.primaryPushButton.isChecked(): diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 30341b9dd..8e2c199a1 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -500,7 +500,9 @@ class SlideController(QtGui.QWidget): """ Allows the live toolbar to be customised """ - self.toolbar.setVisible(True) + # Work-around for OS X, hide and then show the toolbar + # See bug #791050 + self.toolbar.hide() self.mediabar.setVisible(False) self.toolbar.makeWidgetsInvisible([u'Song Menu']) self.toolbar.makeWidgetsInvisible(self.loopList) @@ -515,12 +517,18 @@ class SlideController(QtGui.QWidget): if item.is_media(): self.toolbar.setVisible(False) self.mediabar.setVisible(True) + else: + # Work-around for OS X, hide and then show the toolbar + # See bug #791050 + self.toolbar.show() def enablePreviewToolBar(self, item): """ Allows the Preview toolbar to be customised """ - self.toolbar.setVisible(True) + # Work-around for OS X, hide and then show the toolbar + # See bug #791050 + self.toolbar.hide() self.mediabar.setVisible(False) self.toolbar.makeWidgetsInvisible(self.songEditList) if item.is_capable(ItemCapabilities.AllowsEdit) and item.from_plugin: @@ -529,6 +537,10 @@ class SlideController(QtGui.QWidget): self.toolbar.setVisible(False) self.mediabar.setVisible(True) self.volumeSlider.setAudioOutput(self.audio) + if not item.is_media(): + # Work-around for OS X, hide and then show the toolbar + # See bug #791050 + self.toolbar.show() def refreshServiceItem(self): """ diff --git a/openlp/core/ui/wizard.py b/openlp/core/ui/wizard.py index 6bc3e2df6..9d8a106ed 100644 --- a/openlp/core/ui/wizard.py +++ b/openlp/core/ui/wizard.py @@ -190,6 +190,14 @@ class OpenLPWizard(QtGui.QWizard): self.preWizard() self.performWizard() self.postWizard() + else: + self.customPageChanged(pageId) + + def customPageChanged(self, pageId): + """ + Called when changing to a page other than the progress page + """ + pass def onErrorCopyToButtonClicked(self): """ diff --git a/openlp/plugins/songs/forms/editsongdialog.py b/openlp/plugins/songs/forms/editsongdialog.py index 39612ba1a..26c799c00 100644 --- a/openlp/plugins/songs/forms/editsongdialog.py +++ b/openlp/plugins/songs/forms/editsongdialog.py @@ -68,6 +68,8 @@ class Ui_EditSongDialog(object): QtCore.Qt.AlignTop) self.verseListWidget = QtGui.QTableWidget(self.lyricsTab) self.verseListWidget.horizontalHeader().setVisible(False) + self.verseListWidget.horizontalHeader().setStretchLastSection(True) + self.verseListWidget.horizontalHeader().setMinimumSectionSize(16) self.verseListWidget.setAlternatingRowColors(True) self.verseListWidget.setColumnCount(1) self.verseListWidget.setSelectionBehavior( diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 05c891a55..6d261ffc2 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -233,7 +233,6 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): # lazy xml migration for now self.verseListWidget.clear() self.verseListWidget.setRowCount(0) - self.verseListWidget.setColumnWidth(0, self.width) # This is just because occasionally the lyrics come back as a "buffer" if isinstance(self.song.lyrics, buffer): self.song.lyrics = unicode(self.song.lyrics) diff --git a/openlp/plugins/songs/forms/songimportform.py b/openlp/plugins/songs/forms/songimportform.py index faaddd3eb..4ab60d360 100644 --- a/openlp/plugins/songs/forms/songimportform.py +++ b/openlp/plugins/songs/forms/songimportform.py @@ -343,6 +343,13 @@ class SongImportForm(OpenLPWizard): self.formatSpacer.changeSize(width, 0, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + def customPageChanged(self, pageId): + """ + Called when changing to a page other than the progress page + """ + if self.page(pageId) == self.sourcePage: + self.onCurrentIndexChanged(self.formatStack.currentIndex()) + def validateCurrentPage(self): """ Validate the current page before moving on to the next page. diff --git a/openlp/plugins/songs/lib/easislidesimport.py b/openlp/plugins/songs/lib/easislidesimport.py index d941a1d45..b1eaceeaf 100644 --- a/openlp/plugins/songs/lib/easislidesimport.py +++ b/openlp/plugins/songs/lib/easislidesimport.py @@ -73,15 +73,21 @@ class EasiSlidesImport(SongImport): def _parse_song(self, song): self._success = True self._add_unicode_attribute(u'title', song.Title1, True) - self._add_unicode_attribute(u'alternate_title', song.Title2) - self._add_unicode_attribute(u'song_number', song.SongNumber) + if hasattr(song, u'Title2'): + self._add_unicode_attribute(u'alternate_title', song.Title2) + if hasattr(song, u'SongNumber'): + self._add_unicode_attribute(u'song_number', song.SongNumber) if self.song_number == u'0': self.song_number = u'' self._add_authors(song) - self._add_copyright(song.Copyright) - self._add_copyright(song.LicenceAdmin1) - self._add_copyright(song.LicenceAdmin2) - self._add_unicode_attribute(u'song_book_name', song.BookReference) + if hasattr(song, u'Copyright'): + self._add_copyright(song.Copyright) + if hasattr(song, u'LicenceAdmin1'): + self._add_copyright(song.LicenceAdmin1) + if hasattr(song, u'LicenceAdmin2'): + self._add_copyright(song.LicenceAdmin2) + if hasattr(song, u'BookReference'): + self._add_unicode_attribute(u'song_book_name', song.BookReference) self._parse_and_add_lyrics(song) if self._success: if not self.finish(): diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 5c203c630..cd7484df9 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -467,23 +467,20 @@ class SongMediaItem(MediaManagerItem): search_results = self.plugin.manager.get_all_objects(Song, Song.search_title == item.data_string[u'title'], Song.search_title.asc()) - author_list = item.data_string[u'authors'].split(u', ') editId = 0 add_song = True if search_results: for song in search_results: + author_list = item.data_string[u'authors'] same_authors = True - # If the author counts are different, we do not have to do any - # further checking. - if len(song.authors) == len(author_list): - for author in song.authors: - if author.display_name not in author_list: - same_authors = False - else: - same_authors = False - # All authors are the same, so we can stop here and the song - # does not have to be saved. - if same_authors: + for author in song.authors: + if author.display_name in author_list: + author_list = author_list.replace(author.display_name, + u'', 1) + else: + same_authors = False + break + if same_authors and author_list.strip(u', ') == u'': add_song = False editId = song.id break diff --git a/openlp/plugins/songs/lib/oooimport.py b/openlp/plugins/songs/lib/oooimport.py index 62a5f0cdd..ba442bb35 100644 --- a/openlp/plugins/songs/lib/oooimport.py +++ b/openlp/plugins/songs/lib/oooimport.py @@ -37,14 +37,16 @@ log = logging.getLogger(__name__) if os.name == u'nt': from win32com.client import Dispatch - PAGE_BEFORE = 4 - PAGE_AFTER = 5 - PAGE_BOTH = 6 NoConnectException = Exception else: import uno from com.sun.star.connection import NoConnectException +try: from com.sun.star.style.BreakType import PAGE_BEFORE, PAGE_AFTER, PAGE_BOTH +except ImportError: + PAGE_BEFORE = 4 + PAGE_AFTER = 5 + PAGE_BOTH = 6 class OooImport(SongImport): """ diff --git a/openlp/plugins/songs/lib/openlyricsexport.py b/openlp/plugins/songs/lib/openlyricsexport.py index d6e21ee51..6ba1fabe7 100644 --- a/openlp/plugins/songs/lib/openlyricsexport.py +++ b/openlp/plugins/songs/lib/openlyricsexport.py @@ -70,10 +70,12 @@ class OpenLyricsExport(object): song.title) xml = openLyrics.song_to_xml(song) tree = etree.ElementTree(etree.fromstring(xml)) - filename = u'%s (%s).xml' % (song.title, + filename = u'%s (%s)' % (song.title, u', '.join([author.display_name for author in song.authors])) filename = re.sub( r'[/\\?*|<>\[\]":<>+%]+', u'_', filename).strip(u'_') + # Ensure the filename isn't too long for some filesystems + filename = u'%s.xml' % filename[0:250 - len(self.save_path)] # Pass a file object, because lxml does not cope with some special # characters in the path (see lp:757673 and lp:744337). tree.write(open(os.path.join(self.save_path, filename), u'w'), diff --git a/openlp/plugins/songs/lib/sofimport.py b/openlp/plugins/songs/lib/sofimport.py index 4168670e7..e0134f282 100644 --- a/openlp/plugins/songs/lib/sofimport.py +++ b/openlp/plugins/songs/lib/sofimport.py @@ -41,20 +41,23 @@ from oooimport import OooImport log = logging.getLogger(__name__) if os.name == u'nt': - BOLD = 150.0 - ITALIC = 2 from oooimport import PAGE_BEFORE, PAGE_AFTER, PAGE_BOTH RuntimeException = Exception else: try: - from com.sun.star.awt.FontWeight import BOLD - from com.sun.star.awt.FontSlant import ITALIC from com.sun.star.style.BreakType import PAGE_BEFORE, PAGE_AFTER, \ PAGE_BOTH from com.sun.star.uno import RuntimeException except ImportError: pass - +try: + from com.sun.star.awt.FontWeight import BOLD +except ImportError: + BOLD = 150.0 +try: + from com.sun.star.awt.FontSlant import ITALIC +except ImportError: + ITALIC = 2 class SofImport(OooImport): """ diff --git a/resources/windows/WizImageBig.bmp b/resources/windows/WizImageBig.bmp index 8fc9e2091..32b2ca092 100644 Binary files a/resources/windows/WizImageBig.bmp and b/resources/windows/WizImageBig.bmp differ diff --git a/resources/windows/WizImageSmall.bmp b/resources/windows/WizImageSmall.bmp index b8685c808..58c716fdf 100644 Binary files a/resources/windows/WizImageSmall.bmp and b/resources/windows/WizImageSmall.bmp differ