From 5a4b91b37c3b634e3646de2feb73442faa896782 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sun, 27 Mar 2011 15:39:43 +0200 Subject: [PATCH 1/6] (suggestion) added support for multiple slides --- openlp/plugins/songs/lib/xml.py | 37 +++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/openlp/plugins/songs/lib/xml.py b/openlp/plugins/songs/lib/xml.py index 87e28591e..daec73d64 100644 --- a/openlp/plugins/songs/lib/xml.py +++ b/openlp/plugins/songs/lib/xml.py @@ -226,7 +226,6 @@ class OpenLyrics(object): Convert the song to OpenLyrics Format. """ sxml = SongXML() - verse_list = sxml.get_verses(song.lyrics) song_xml = objectify.fromstring(u'') # Append the necessary meta data to the song. song_xml.set(u'xmlns', u'http://openlyrics.info/namespace/2009/song') @@ -268,17 +267,26 @@ class OpenLyrics(object): themes = etree.SubElement(properties, u'themes') for topic in song.topics: self._add_text_to_element(u'theme', themes, topic.name) + # Process the song's lyrics. lyrics = etree.SubElement(song_xml, u'lyrics') + verse_list = sxml.get_verses(song.lyrics) for verse in verse_list: - verse_tag = u'%s%s' % ( - verse[0][u'type'][0].lower(), verse[0][u'label']) - element = \ - self._add_text_to_element(u'verse', lyrics, None, verse_tag) - 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 unicode(verse[1]).split(u'\n'): - self._add_text_to_element(u'line', element, line) + verse_tag = verse[0][u'type'][0].lower() + verse_number = verse[0][u'label'] + # Create a list with all "sub" verses. + sub_verses = verse[1].split(u'[---]') + for sub_index, sub_verse in enumerate(sub_verses): + verse_def = verse_tag + verse_number + # We have more than one sub verse, consequently we need "v1a". + if len(sub_verses) > 1: + verse_def += list(u'abcdefghijklmnopqrstuvwxyz')[sub_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 sub_verse.strip(u'\n').split(u'\n'): + self._add_text_to_element(u'line', element, line) return self._extract_xml(song_xml) def xml_to_song(self, xml): @@ -446,6 +454,7 @@ class OpenLyrics(object): The song object. """ sxml = SongXML() + verses = {} for verse in lyrics.verse: text = u'' for lines in verse.lines: @@ -465,7 +474,13 @@ class OpenLyrics(object): lang = None if 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 + for verse in verses: + sxml.add_verse_to_lyrics( + verse[0], verse[1], verses[verse], verse[2]) song.lyrics = unicode(sxml.extract_xml(), u'utf-8') # Process verse order if hasattr(properties, u'verseOrder'): From 6342a2aaa0fef2f379b4ea5e4340a2ec2a3a782e Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Tue, 29 Mar 2011 20:04:16 +0200 Subject: [PATCH 2/6] changed --- to ### --- openlp/plugins/songs/lib/xml.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openlp/plugins/songs/lib/xml.py b/openlp/plugins/songs/lib/xml.py index daec73d64..b4a9840a7 100644 --- a/openlp/plugins/songs/lib/xml.py +++ b/openlp/plugins/songs/lib/xml.py @@ -274,7 +274,7 @@ class OpenLyrics(object): verse_tag = verse[0][u'type'][0].lower() verse_number = verse[0][u'label'] # Create a list with all "sub" verses. - sub_verses = verse[1].split(u'[---]') + sub_verses = verse[1].split(u'[###]') for sub_index, sub_verse in enumerate(sub_verses): verse_def = verse_tag + verse_number # We have more than one sub verse, consequently we need "v1a". @@ -475,7 +475,7 @@ class OpenLyrics(object): if self._get(verse, u'lang'): lang = self._get(verse, u'lang') if verses.has_key((verse_tag, verse_number, lang)): - verses[(verse_tag, verse_number, lang)] += u'\n[---]\n' + text + verses[(verse_tag, verse_number, lang)] += u'\n[###]\n' + text else: verses[(verse_tag, verse_number, lang)] = text for verse in verses: From a0798b66bbcdafa9a14550e4aa62d62a67fab5ca Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Tue, 29 Mar 2011 20:23:01 +0200 Subject: [PATCH 3/6] changed wording --- openlp/plugins/songs/lib/xml.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/openlp/plugins/songs/lib/xml.py b/openlp/plugins/songs/lib/xml.py index b4a9840a7..556835587 100644 --- a/openlp/plugins/songs/lib/xml.py +++ b/openlp/plugins/songs/lib/xml.py @@ -273,19 +273,19 @@ class OpenLyrics(object): for verse in verse_list: verse_tag = verse[0][u'type'][0].lower() verse_number = verse[0][u'label'] - # Create a list with all "sub" verses. - sub_verses = verse[1].split(u'[###]') - for sub_index, sub_verse in enumerate(sub_verses): + # Create a list with all "virtual" verses. + virtual_verses = verse[1].split(u'[###]') + for index, virtual_verse in enumerate(virtual_verses): verse_def = verse_tag + verse_number - # We have more than one sub verse, consequently we need "v1a". - if len(sub_verses) > 1: - verse_def += list(u'abcdefghijklmnopqrstuvwxyz')[sub_index] + # We need "v1a" because we have more than one virtual verse. + if len(virtual_verses) > 1: + 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 sub_verse.strip(u'\n').split(u'\n'): + 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) From 253087e2c6016adf07f73434f2eea121d372df25 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 30 Mar 2011 09:13:04 +0200 Subject: [PATCH 4/6] fixed verse sorting, change ### to --- --- openlp/plugins/songs/lib/xml.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/openlp/plugins/songs/lib/xml.py b/openlp/plugins/songs/lib/xml.py index 556835587..05da325e2 100644 --- a/openlp/plugins/songs/lib/xml.py +++ b/openlp/plugins/songs/lib/xml.py @@ -32,7 +32,7 @@ The basic XML for storing the lyrics in the song database looks like this:: - + @@ -129,7 +129,8 @@ class SongXML(object): 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"]] """ self.song_xml = None @@ -274,7 +275,7 @@ class OpenLyrics(object): verse_tag = verse[0][u'type'][0].lower() verse_number = verse[0][u'label'] # Create a list with all "virtual" verses. - virtual_verses = verse[1].split(u'[###]') + virtual_verses = verse[1].split(u'[---]') for index, virtual_verse in enumerate(virtual_verses): verse_def = verse_tag + verse_number # We need "v1a" because we have more than one virtual verse. @@ -455,6 +456,7 @@ class OpenLyrics(object): """ sxml = SongXML() verses = {} + verse_def_list = [] for verse in lyrics.verse: text = u'' for lines in verse.lines: @@ -475,10 +477,12 @@ class OpenLyrics(object): if self._get(verse, u'lang'): lang = self._get(verse, u'lang') if verses.has_key((verse_tag, verse_number, lang)): - verses[(verse_tag, verse_number, lang)] += u'\n[###]\n' + text + verses[(verse_tag, verse_number, lang)] += u'\n[---]\n' + text else: verses[(verse_tag, verse_number, lang)] = text - for verse in verses: + 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') From e9ec8aaaaf53e94118dd1ab05b99493b63255207 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 28 Apr 2011 18:32:37 +0200 Subject: [PATCH 5/6] added shorcuts for start/stop/toggle loop (#771966) Fixes: https://launchpad.net/bugs/771966 --- openlp/core/ui/slidecontroller.py | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index dfa313cc1..5a6e5aec3 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -180,16 +180,25 @@ class SlideController(QtGui.QWidget): self.hideMenu.menu().addAction(self.themeScreen) self.hideMenu.menu().addAction(self.desktopScreen) self.toolbar.addToolbarSeparator(u'Loop Separator') - self.toolbar.addToolbarButton( + startLoop = self.toolbar.addToolbarButton( # Does not need translating - control string. u'Start Loop', u':/media/media_time.png', translate('OpenLP.SlideController', 'Start continuous loop'), 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. u'Stop Loop', u':/media/media_stop.png', translate('OpenLP.SlideController', 'Stop continuous loop'), 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.setMinimum(1) self.delaySpinBox.setMaximum(180) @@ -494,6 +503,9 @@ class SlideController(QtGui.QWidget): self.mediabar.setVisible(False) self.toolbar.makeWidgetsInvisible([u'Song Menu']) 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) if item.is_text(): if QtCore.QSettings().value( @@ -503,6 +515,9 @@ class SlideController(QtGui.QWidget): if item.is_capable(ItemCapabilities.AllowsLoop) and \ len(item.get_frames()) > 1: 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(): self.toolbar.setVisible(False) self.mediabar.setVisible(True) @@ -995,6 +1010,15 @@ class SlideController(QtGui.QWidget): self.previewListWidget.rowCount() - 1) 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): """ Start the timer loop running and store the timer id From aea4909201b18c990b8a014a2aa749292438d29f Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 28 Apr 2011 18:36:53 +0200 Subject: [PATCH 6/6] added missing space --- openlp/core/ui/slidecontroller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 5a6e5aec3..3b33f9a22 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -187,7 +187,7 @@ class SlideController(QtGui.QWidget): self.onStartLoop) action_list = ActionList.get_instance() action_list.add_action(startLoop, UiStrings().LiveToolbar) - stopLoop =self.toolbar.addToolbarButton( + stopLoop = self.toolbar.addToolbarButton( # Does not need translating - control string. u'Stop Loop', u':/media/media_stop.png', translate('OpenLP.SlideController', 'Stop continuous loop'),