This commit is contained in:
Tim Bentley 2011-04-29 08:11:19 +01:00
commit 79dc4948fa
2 changed files with 58 additions and 15 deletions

View File

@ -180,16 +180,25 @@ class SlideController(QtGui.QWidget):
self.hideMenu.menu().addAction(self.themeScreen) self.hideMenu.menu().addAction(self.themeScreen)
self.hideMenu.menu().addAction(self.desktopScreen) self.hideMenu.menu().addAction(self.desktopScreen)
self.toolbar.addToolbarSeparator(u'Loop Separator') self.toolbar.addToolbarSeparator(u'Loop Separator')
self.toolbar.addToolbarButton( startLoop = self.toolbar.addToolbarButton(
# Does not need translating - control string. # Does not need translating - control string.
u'Start Loop', u':/media/media_time.png', u'Start Loop', u':/media/media_time.png',
translate('OpenLP.SlideController', 'Start continuous loop'), translate('OpenLP.SlideController', 'Start continuous loop'),
self.onStartLoop) self.onStartLoop)
self.toolbar.addToolbarButton( action_list = ActionList.get_instance()
action_list.add_action(startLoop, UiStrings().LiveToolbar)
stopLoop = self.toolbar.addToolbarButton(
# Does not need translating - control string. # Does not need translating - control string.
u'Stop Loop', u':/media/media_stop.png', u'Stop Loop', u':/media/media_stop.png',
translate('OpenLP.SlideController', 'Stop continuous loop'), translate('OpenLP.SlideController', 'Stop continuous loop'),
self.onStopLoop) self.onStopLoop)
action_list.add_action(stopLoop, UiStrings().LiveToolbar)
self.toogleLoop = shortcut_action(self, u'toogleLoop',
[QtGui.QKeySequence(u'L')], self.onToggleLoop,
category=UiStrings().LiveToolbar)
self.toogleLoop.setText(translate('OpenLP.SlideController',
'Start/Stop continuous loop'))
self.addAction(self.toogleLoop)
self.delaySpinBox = QtGui.QSpinBox() self.delaySpinBox = QtGui.QSpinBox()
self.delaySpinBox.setMinimum(1) self.delaySpinBox.setMinimum(1)
self.delaySpinBox.setMaximum(180) self.delaySpinBox.setMaximum(180)
@ -494,6 +503,9 @@ class SlideController(QtGui.QWidget):
self.mediabar.setVisible(False) self.mediabar.setVisible(False)
self.toolbar.makeWidgetsInvisible([u'Song Menu']) self.toolbar.makeWidgetsInvisible([u'Song Menu'])
self.toolbar.makeWidgetsInvisible(self.loopList) self.toolbar.makeWidgetsInvisible(self.loopList)
self.toogleLoop.setEnabled(False)
self.toolbar.actions[u'Start Loop'].setEnabled(False)
self.toolbar.actions[u'Stop Loop'].setEnabled(False)
self.toolbar.actions[u'Stop Loop'].setVisible(False) self.toolbar.actions[u'Stop Loop'].setVisible(False)
if item.is_text(): if item.is_text():
if QtCore.QSettings().value( if QtCore.QSettings().value(
@ -503,6 +515,9 @@ class SlideController(QtGui.QWidget):
if item.is_capable(ItemCapabilities.AllowsLoop) and \ if item.is_capable(ItemCapabilities.AllowsLoop) and \
len(item.get_frames()) > 1: len(item.get_frames()) > 1:
self.toolbar.makeWidgetsVisible(self.loopList) self.toolbar.makeWidgetsVisible(self.loopList)
self.toogleLoop.setEnabled(True)
self.toolbar.actions[u'Start Loop'].setEnabled(True)
self.toolbar.actions[u'Stop Loop'].setEnabled(True)
if item.is_media(): if item.is_media():
self.toolbar.setVisible(False) self.toolbar.setVisible(False)
self.mediabar.setVisible(True) self.mediabar.setVisible(True)
@ -995,6 +1010,15 @@ class SlideController(QtGui.QWidget):
self.previewListWidget.rowCount() - 1) self.previewListWidget.rowCount() - 1)
self.slideSelected() self.slideSelected()
def onToggleLoop(self, toggled):
"""
Toggles the loop state.
"""
if self.toolbar.actions[u'Start Loop'].isVisible():
self.onStartLoop()
else:
self.onStopLoop()
def onStartLoop(self): def onStartLoop(self):
""" """
Start the timer loop running and store the timer id Start the timer loop running and store the timer id

View File

@ -32,7 +32,7 @@ The basic XML for storing the lyrics in the song database looks like this::
<song version="1.0"> <song version="1.0">
<lyrics> <lyrics>
<verse type="c" label="1" lang="en"> <verse type="c" label="1" lang="en">
<![CDATA[ ... ]]> <![CDATA[Chorus virtual slide 1[---]Chorus virtual slide 2]]>
</verse> </verse>
</lyrics> </lyrics>
</song> </song>
@ -129,7 +129,8 @@ class SongXML(object):
The returned list has the following format:: The returned list has the following format::
[[{'lang': 'en', 'type': 'v', 'label': '1'}, u"English verse"], [[{'type': 'v', 'label': '1'},
u"virtual slide 1[---]virtual slide 2"],
[{'lang': 'en', 'type': 'c', 'label': '1'}, u"English chorus"]] [{'lang': 'en', 'type': 'c', 'label': '1'}, u"English chorus"]]
""" """
self.song_xml = None self.song_xml = None
@ -226,7 +227,6 @@ class OpenLyrics(object):
Convert the song to OpenLyrics Format. Convert the song to OpenLyrics Format.
""" """
sxml = SongXML() sxml = SongXML()
verse_list = sxml.get_verses(song.lyrics)
song_xml = objectify.fromstring(u'<song/>') song_xml = objectify.fromstring(u'<song/>')
# Append the necessary meta data to the song. # Append the necessary meta data to the song.
song_xml.set(u'xmlns', u'http://openlyrics.info/namespace/2009/song') song_xml.set(u'xmlns', u'http://openlyrics.info/namespace/2009/song')
@ -268,17 +268,26 @@ class OpenLyrics(object):
themes = etree.SubElement(properties, u'themes') themes = etree.SubElement(properties, u'themes')
for topic in song.topics: for topic in song.topics:
self._add_text_to_element(u'theme', themes, topic.name) self._add_text_to_element(u'theme', themes, topic.name)
# Process the song's lyrics.
lyrics = etree.SubElement(song_xml, u'lyrics') lyrics = etree.SubElement(song_xml, u'lyrics')
verse_list = sxml.get_verses(song.lyrics)
for verse in verse_list: for verse in verse_list:
verse_tag = u'%s%s' % ( verse_tag = verse[0][u'type'][0].lower()
verse[0][u'type'][0].lower(), verse[0][u'label']) verse_number = verse[0][u'label']
element = \ # Create a list with all "virtual" verses.
self._add_text_to_element(u'verse', lyrics, None, verse_tag) virtual_verses = verse[1].split(u'[---]')
if verse[0].has_key(u'lang'): for index, virtual_verse in enumerate(virtual_verses):
element.set(u'lang', verse[0][u'lang']) verse_def = verse_tag + verse_number
element = self._add_text_to_element(u'lines', element) # We need "v1a" because we have more than one virtual verse.
for line in unicode(verse[1]).split(u'\n'): if len(virtual_verses) > 1:
self._add_text_to_element(u'line', element, line) verse_def += list(u'abcdefghijklmnopqrstuvwxyz')[index]
element = \
self._add_text_to_element(u'verse', lyrics, None, verse_def)
if verse[0].has_key(u'lang'):
element.set(u'lang', verse[0][u'lang'])
element = self._add_text_to_element(u'lines', element)
for line in virtual_verse.strip(u'\n').split(u'\n'):
self._add_text_to_element(u'line', element, line)
return self._extract_xml(song_xml) return self._extract_xml(song_xml)
def xml_to_song(self, xml): def xml_to_song(self, xml):
@ -446,6 +455,8 @@ class OpenLyrics(object):
The song object. The song object.
""" """
sxml = SongXML() sxml = SongXML()
verses = {}
verse_def_list = []
for verse in lyrics.verse: for verse in lyrics.verse:
text = u'' text = u''
for lines in verse.lines: for lines in verse.lines:
@ -465,7 +476,15 @@ class OpenLyrics(object):
lang = None lang = None
if self._get(verse, u'lang'): if self._get(verse, u'lang'):
lang = self._get(verse, u'lang') lang = self._get(verse, u'lang')
sxml.add_verse_to_lyrics(verse_tag, verse_number, text, lang) if verses.has_key((verse_tag, verse_number, lang)):
verses[(verse_tag, verse_number, lang)] += u'\n[---]\n' + text
else:
verses[(verse_tag, verse_number, lang)] = text
verse_def_list.append((verse_tag, verse_number, lang))
# We have to use a list to keep the order, as dicts are not sorted.
for verse in verse_def_list:
sxml.add_verse_to_lyrics(
verse[0], verse[1], verses[verse], verse[2])
song.lyrics = unicode(sxml.extract_xml(), u'utf-8') song.lyrics = unicode(sxml.extract_xml(), u'utf-8')
# Process verse order # Process verse order
if hasattr(properties, u'verseOrder'): if hasattr(properties, u'verseOrder'):