From dad04bfd901582c6334e22c8130c04e444726c58 Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Sat, 3 Apr 2010 00:24:51 +0100 Subject: [PATCH] SOF fixes+delete all selected songs --- openlp/plugins/songs/lib/mediaitem.py | 23 +++++++++++------ openlp/plugins/songs/lib/sofimport.py | 23 +++++++++++------ openlp/plugins/songs/lib/songimport.py | 35 ++++++++++++++++---------- openlp/plugins/songs/songsplugin.py | 12 +++++++-- 4 files changed, 64 insertions(+), 29 deletions(-) diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 9ac8ec977..145646a02 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -271,12 +271,21 @@ class SongMediaItem(MediaManagerItem): self.edit_song_form.exec_() def onDeleteClick(self): - item = self.ListView.currentItem() - if item: - item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0] - self.parent.songmanager.delete_song(item_id) - row = self.ListView.row(item) - self.ListView.takeItem(row) + items = self.ListView.selectedIndexes() + if items: + if len(items) > 1: + ans = QtGui.QMessageBox.question(None, + self.trUtf8('Delete Confirmation'), + self.trUtf8('Delete %d songs?' % len(items)), + QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok| + QtGui.QMessageBox.Cancel), + QtGui.QMessageBox.Ok) + if ans == QtGui.QMessageBox.Cancel: + return + for item in items[:]: + item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0] + self.parent.songmanager.delete_song(item_id) + self.ListView.takeItem(item.row()) def generateSlideData(self, service_item): raw_footer = [] @@ -345,4 +354,4 @@ class SongMediaItem(MediaManagerItem): service_item.audit = [ song.title, author_audit, song.copyright, song.ccli_number ] - return True \ No newline at end of file + return True diff --git a/openlp/plugins/songs/lib/sofimport.py b/openlp/plugins/songs/lib/sofimport.py index 63870f35c..df0ffd5bc 100644 --- a/openlp/plugins/songs/lib/sofimport.py +++ b/openlp/plugins/songs/lib/sofimport.py @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- +property# -*- coding: utf-8 -*- # vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 ############################################################################### @@ -32,7 +32,7 @@ import re import os import time -from PyQt4 import QtCore +from PyQt4 import QtCore, QtGui from songimport import SongImport if os.name == u'nt': @@ -44,7 +44,6 @@ if os.name == u'nt': PAGE_BOTH = 6 else: import uno - from com.sun.star.beans import PropertyValue 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 @@ -273,7 +272,8 @@ class SofImport(object): Add a song number, store as alternate title. Also use the song number to work out which songbook we're in """ - self.song.set_song_number(song_no) + self.song.set_song_number(song_no) + self.song.set_alternate_title(song_no + u'.') if int(song_no) <= 640: self.song.set_song_book(u'Songs of Fellowship 1', u'Kingsway Publications') @@ -313,7 +313,9 @@ class SofImport(object): author2 = authors[i].strip() if author2.find(u' ') == -1 and i < len(authors) - 1: author2 = author2 + u' ' \ - + authors[i + 1].strip().split(u' ')[-1] + + authors[i + 1].strip().split(u' ')[-1] + if author2.endswith(u'.'): + author2 = author2[:-1] self.song.add_author(author2) def add_verse_line(self, text): @@ -337,8 +339,15 @@ class SofImport(object): """ if self.currentverse.strip() == u'': return - if self.is_chorus: - versetag = 'C' + if self.is_chorus: + if not self.song.contains_verse('C'): + versetag = 'C' + elif not self.song.contains_verse('B'): + versetag = 'B' + elif not self.song.contains_verse('E'): + versetag = 'E' + else: + versetag = 'O' splitat = None else: versetag = 'V' diff --git a/openlp/plugins/songs/lib/songimport.py b/openlp/plugins/songs/lib/songimport.py index aa9a73fd8..15e8e00eb 100644 --- a/openlp/plugins/songs/lib/songimport.py +++ b/openlp/plugins/songs/lib/songimport.py @@ -46,6 +46,7 @@ class SongImport(object): self.manager = song_manager self.title = u'' self.song_number = u'' + self.alternate_title = u'' self.copyright = u'' self.comment = u'' self.theme_name = u'' @@ -73,7 +74,7 @@ class SongImport(object): def get_song_number(self): """ - Return the song number (also known as alternate title) + Return the song number """ return self.song_number @@ -82,10 +83,16 @@ class SongImport(object): Set the title """ self.title = title - + + def set_alternate_title(self, title): + """ + Set the alternate title + """ + self.alternate_title = title + def set_song_number(self, song_number): """ - Set the song number/alternate title + Set the song number """ self.song_number = song_number @@ -113,8 +120,8 @@ class SongImport(object): def add_verse(self, verse, versetag): """ Add a verse. This is the whole verse, lines split by \n - Verse tag can be V1/C1/B1 etc, or 'V' and 'C' (will count the verses/ - choruses itself) or None, where it will assume verse + Verse tag can be V1/C/B etc, or 'V' (will count the verses/ + itself) or None, where it will assume verse It will also attempt to detect duplicates. In this case it will just add to the verse order """ @@ -122,23 +129,23 @@ class SongImport(object): if oldverse.strip() == verse.strip(): self.verse_order_list.append(oldversetag) return - if versetag == u'C': - self.choruscount += 1 - versetag += unicode(self.choruscount) if versetag == u'V' or not versetag: self.versecount += 1 versetag = u'V' + unicode(self.versecount) - self.verses.append([versetag, verse]) + self.verses.append([versetag, verse.rstrip()]) self.verse_order_list.append(versetag) - if self.choruscount > 0 and not versetag.startswith(u'C'): - self.verse_order_list.append(u'C1') + if versetag.startswith(u'V') and self.contains_verse(u'C'): + self.verse_order_list.append(u'C') def repeat_verse(self): """ Repeat the previous verse in the verse order """ self.verse_order_list.append(self.verse_order_list[-1]) - + + def contains_verse(self, versetag): + return versetag in self.verse_order_list + def check_complete(self): """ Check the mandatory fields are entered (i.e. title and a verse) @@ -173,7 +180,8 @@ class SongImport(object): """ song = Song() song.title = self.title - song.search_title = self.remove_punctuation(self.title) + song.search_title = self.remove_punctuation(self.title) \ + + '@' + self.alternate_title song.song_number = self.song_number song.search_lyrics = u'' sxml = SongXMLBuilder() @@ -235,6 +243,7 @@ class SongImport(object): print u'========================================' \ + u'========================================' print u'TITLE: ' + self.title + print u'ALT TITLE: ' + self.alternate_title for (versetag, versetext) in self.verses: print u'VERSE ' + versetag + u': ' + versetext print u'ORDER: ' + u' '.join(self.verse_order_list) diff --git a/openlp/plugins/songs/songsplugin.py b/openlp/plugins/songs/songsplugin.py index 6d39daa48..3e245690a 100644 --- a/openlp/plugins/songs/songsplugin.py +++ b/openlp/plugins/songs/songsplugin.py @@ -187,8 +187,16 @@ class SongsPlugin(Plugin): filename = QtGui.QFileDialog.getOpenFileName( None, self.trUtf8('Open Songs of Fellowship file'), u'', u'Songs of Fellowship file (*.rtf *.RTF)') - sofimport = SofImport(self.songmanager) - sofimport.import_sof(unicode(filename)) + try: + sofimport = SofImport(self.songmanager) + sofimport.import_sof(unicode(filename)) + 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'), + QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok), + QtGui.QMessageBox.Ok) def onExportOpenlp1ItemClicked(self): self.openlp_export_form.show()