- removed hard coded verse tags

- the reindex tool to convert pre 1.9.5 verse tags (this also fixes translated tags, as long as the user is running a localised version)
- now only one row/verse in the song editor can be selected

bzr-revno: 1405
This commit is contained in:
Andreas Preikschat 2011-03-18 22:37:06 +01:00
commit 3550b77b61
6 changed files with 43 additions and 26 deletions

View File

@ -117,7 +117,8 @@ class SlideController(QtGui.QWidget):
self.previewListWidget.setColumnWidth(0, self.controller.width()) self.previewListWidget.setColumnWidth(0, self.controller.width())
self.previewListWidget.isLive = self.isLive self.previewListWidget.isLive = self.isLive
self.previewListWidget.setObjectName(u'PreviewListWidget') self.previewListWidget.setObjectName(u'PreviewListWidget')
self.previewListWidget.setSelectionBehavior(1) self.previewListWidget.setSelectionBehavior(
QtGui.QAbstractItemView.SelectRows)
self.previewListWidget.setSelectionMode( self.previewListWidget.setSelectionMode(
QtGui.QAbstractItemView.SingleSelection) QtGui.QAbstractItemView.SingleSelection)
self.previewListWidget.setEditTriggers( self.previewListWidget.setEditTriggers(

View File

@ -71,6 +71,8 @@ class Ui_EditSongDialog(object):
self.verseListWidget.setColumnCount(1) self.verseListWidget.setColumnCount(1)
self.verseListWidget.setSelectionBehavior( self.verseListWidget.setSelectionBehavior(
QtGui.QAbstractItemView.SelectRows) QtGui.QAbstractItemView.SelectRows)
self.verseListWidget.setSelectionMode(
QtGui.QAbstractItemView.SingleSelection)
self.verseListWidget.setEditTriggers( self.verseListWidget.setEditTriggers(
QtGui.QAbstractItemView.NoEditTriggers) QtGui.QAbstractItemView.NoEditTriggers)
self.verseListWidget.setObjectName(u'verseListWidget') self.verseListWidget.setObjectName(u'verseListWidget')

View File

@ -543,8 +543,9 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
def onVerseDeleteButtonClicked(self): def onVerseDeleteButtonClicked(self):
self.verseListWidget.removeRow(self.verseListWidget.currentRow()) self.verseListWidget.removeRow(self.verseListWidget.currentRow())
self.verseEditButton.setEnabled(False) if not self.verseListWidget.selectedItems():
self.verseDeleteButton.setEnabled(False) self.verseEditButton.setEnabled(False)
self.verseDeleteButton.setEnabled(False)
def _validate_song(self): def _validate_song(self):
""" """

View File

@ -271,6 +271,18 @@ def clean_song(manager, song):
verses = SongXML().get_verses(song.lyrics) verses = SongXML().get_verses(song.lyrics)
lyrics = u' '.join([whitespace.sub(u' ', verse[1]) for verse in verses]) lyrics = u' '.join([whitespace.sub(u' ', verse[1]) for verse in verses])
song.search_lyrics = lyrics.lower() song.search_lyrics = lyrics.lower()
# We need a new and clean SongXML instance.
sxml = SongXML()
# Rebuild the song's verses, to remove any wrong verse names (for example
# translated ones), which might have been added prior to 1.9.5.
for verse in verses:
sxml.add_verse_to_lyrics(
VerseType.Tags[VerseType.from_loose_input(verse[0][u'type'])],
verse[0][u'label'],
verse[1],
verse[0][u'lang'] if verse[0].has_key(u'lang') else None
)
song.lyrics = unicode(sxml.extract_xml(), u'utf-8')
# The song does not have any author, add one. # The song does not have any author, add one.
if not song.authors: if not song.authors:
name = SongStrings.AuthorUnknown name = SongStrings.AuthorUnknown

View File

@ -34,31 +34,32 @@ import os
import re import re
from openlp.core.ui.wizard import WizardStrings from openlp.core.ui.wizard import WizardStrings
from openlp.plugins.songs.lib import VerseType
from openlp.plugins.songs.lib.songimport import SongImport from openlp.plugins.songs.lib.songimport import SongImport
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
class SongBeamerTypes(object): class SongBeamerTypes(object):
MarkTypes = { MarkTypes = {
u'Refrain': u'C', u'Refrain': VerseType.Tags[VerseType.Chorus],
u'Chorus': u'C', u'Chorus': VerseType.Tags[VerseType.Chorus],
u'Vers': u'V', u'Vers': VerseType.Tags[VerseType.Verse],
u'Verse': u'V', u'Verse': VerseType.Tags[VerseType.Verse],
u'Strophe': u'V', u'Strophe': VerseType.Tags[VerseType.Verse],
u'Intro': u'I', u'Intro': VerseType.Tags[VerseType.Intro],
u'Coda': u'E', u'Coda': VerseType.Tags[VerseType.Ending],
u'Ending': u'E', u'Ending': VerseType.Tags[VerseType.Ending],
u'Bridge': u'B', u'Bridge': VerseType.Tags[VerseType.Bridge],
u'Interlude': u'B', u'Interlude': VerseType.Tags[VerseType.Bridge],
u'Zwischenspiel': u'B', u'Zwischenspiel': VerseType.Tags[VerseType.Bridge],
u'Pre-Chorus': u'P', u'Pre-Chorus': VerseType.Tags[VerseType.PreChorus],
u'Pre-Refrain': u'P', u'Pre-Refrain': VerseType.Tags[VerseType.PreChorus],
u'Pre-Bridge': u'O', u'Pre-Bridge': VerseType.Tags[VerseType.Other],
u'Pre-Coda': u'O', u'Pre-Coda': VerseType.Tags[VerseType.Other],
u'Unbekannt': u'O', u'Unbekannt': VerseType.Tags[VerseType.Other],
u'Unknown': u'O', u'Unknown': VerseType.Tags[VerseType.Other],
u'Unbenannt': u'O' u'Unbenannt': VerseType.Tags[VerseType.Other]
} }
class SongBeamerImport(SongImport): class SongBeamerImport(SongImport):
@ -84,7 +85,7 @@ class SongBeamerImport(SongImport):
# TODO: check that it is a valid SongBeamer file # TODO: check that it is a valid SongBeamer file
self.set_defaults() self.set_defaults()
self.current_verse = u'' self.current_verse = u''
self.current_verse_type = u'V' self.current_verse_type = VerseType.Tags[VerseType.Verse]
read_verses = False read_verses = False
file_name = os.path.split(file)[1] file_name = os.path.split(file)[1]
self.import_wizard.incrementProgressBar( self.import_wizard.incrementProgressBar(
@ -111,7 +112,7 @@ class SongBeamerImport(SongImport):
self.add_verse(self.current_verse, self.add_verse(self.current_verse,
self.current_verse_type) self.current_verse_type)
self.current_verse = u'' self.current_verse = u''
self.current_verse_type = u'V' self.current_verse_type = VerseType.Tags[VerseType.Verse]
read_verses = True read_verses = True
verse_start = True verse_start = True
elif read_verses: elif read_verses:
@ -157,7 +158,7 @@ class SongBeamerImport(SongImport):
(u'<[/]?c.*?>', u''), (u'<[/]?c.*?>', u''),
(u'<align.*?>', u''), (u'<align.*?>', u''),
(u'<valign.*?>', u'') (u'<valign.*?>', u'')
] ]
for pair in tag_pairs: for pair in tag_pairs:
self.current_verse = re.compile(pair[0]).sub(pair[1], self.current_verse = re.compile(pair[0]).sub(pair[1],
self.current_verse) self.current_verse)

View File

@ -31,7 +31,7 @@ The basic XML for storing the lyrics in the song database looks like this::
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<song version="1.0"> <song version="1.0">
<lyrics> <lyrics>
<verse type="Chorus" label="1" lang="en"> <verse type="c" label="1" lang="en">
<![CDATA[ ... ]]> <![CDATA[ ... ]]>
</verse> </verse>
</lyrics> </lyrics>