From 156a70208ba2736ca9377f7ac67357296a11f52b Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Wed, 2 Dec 2009 08:35:02 +0000 Subject: [PATCH] Add new types to verse editing Clean up dialog so looks better Add controls around the editor in terms of validation --- openlp/core/ui/slidecontroller.py | 44 ++-- openlp/plugins/songs/forms/editsongform.py | 9 +- openlp/plugins/songs/forms/editversedialog.py | 149 +++++++------- openlp/plugins/songs/forms/editverseform.py | 49 ++++- resources/forms/editversedialog.ui | 189 ++++++++++-------- 5 files changed, 256 insertions(+), 184 deletions(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 6a0d53039..ac6a759a8 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -210,17 +210,17 @@ class SlideController(QtGui.QWidget): if isLive: self.Songbar = OpenLPToolbar(self) self.Songbar.addToolbarButton( - u'Bridge', u':/pages/page_bridge.png', + u'Bridge:1', u':/pages/page_bridge.png', self.trUtf8('Bridge'), self.onSongBarHandler) self.Songbar.addToolbarButton( - u'Chorus', u':/pages/page_chorus.png', + u'Chorus:1', u':/pages/page_chorus.png', self.trUtf8('Chorus'), self.onSongBarHandler) for verse in range(1, 12): self.Songbar.addToolbarButton( - unicode(verse), u':/pages/page_%s.png' % verse, - unicode(self.trUtf8('Verse %s'))%verse, + unicode(u'Verse:%s'% verse), u':/pages/page_%s.png' % verse, + unicode(self.trUtf8('Verse %s'))% verse, self.onSongBarHandler) self.ControllerLayout.addWidget(self.Songbar) self.Songbar.setVisible(False) @@ -312,14 +312,14 @@ class SlideController(QtGui.QWidget): pass def onSongBarHandler(self): - request = self.sender().text() + request = unicode(self.sender().text()) if request == u'Bridge': - pass + a=c elif request == u'Chorus': - pass + a=c else: #Remember list is 1 out! - slideno = int(request) - 1 + slideno = self.slideList[request] if slideno > self.PreviewListWidget.rowCount(): self.PreviewListWidget.selectRow(self.PreviewListWidget.rowCount()) else: @@ -355,14 +355,19 @@ class SlideController(QtGui.QWidget): self.Songbar.actions[action].setVisible(False) if item.verse_order: verses = item.verse_order.split(u' ') -# for verse in verses: -# if not verse or int(verse) > 12: -# break -# try: -# self.Songbar.actions[verse].setVisible(True) -# except: -# #More than 20 verses hard luck -# pass + for verse in verses: + if verse is not u' ': + pass + try: + if verse == u'C': + self.Songbar.actions[u'Chorus:1'].setVisible(True) + elif verse == u'B': + self.Songbar.actions[u'Bridge:1'].setVisible(True) + else: + vse = u'Verse:%s' % verse + self.Songbar.actions[vse].setVisible(True) + except: + pass self.Songbar.setVisible(True) elif item.is_image(): #Not sensible to allow loops with 1 frame @@ -451,7 +456,11 @@ class SlideController(QtGui.QWidget): slide_height = 0 #It is a based Text Render if self.serviceItem.is_text(): - self.slideList[frame[u'verseTag']] = framenumber + #only load the slot once + try: + test = self.slideList[frame[u'verseTag']] + except: + self.slideList[frame[u'verseTag']] = framenumber item.setText(frame[u'text']) else: label = QtGui.QLabel() @@ -479,6 +488,7 @@ class SlideController(QtGui.QWidget): if self.isLive: self.serviceItem.request_audit() log.debug(u'displayServiceManagerItems End') + print self.slideList #Screen event methods def onSlideSelectedFirst(self): diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index a68a02b08..dcda4ae52 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -315,7 +315,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.VerseDeleteButton.setEnabled(True) def onVerseAddButtonClicked(self): - self.verse_form.setVerse(u'') + self.verse_form.setVerse(u'', self.VerseListWidget.count() + 1, True) self.verse_form.exec_() afterText, verse, subVerse = self.verse_form.getVerse() data = u'%s:%s' %(verse, subVerse) @@ -329,7 +329,8 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): if item: tempText = item.text() verseId = unicode((item.data(QtCore.Qt.UserRole)).toString()) - self.verse_form.setVerse(tempText, True, verseId) + self.verse_form.setVerse(tempText, \ + self.VerseListWidget.count(), True, verseId) self.verse_form.exec_() afterText, verse, subVerse = self.verse_form.getVerse() data = u'%s:%s' %(verse, subVerse) @@ -401,13 +402,13 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.SongTabWidget.setCurrentIndex(2) self.AuthorsListView.setFocus() for verse in unicode(self.VerseOrderEdit.text()): - if verse.isdigit() or u' BC'.find(verse) > -1: + if verse.isdigit() or u' BCITPEO'.find(verse.upper()) > -1: pass else: self.SongTabWidget.setCurrentIndex(0) self.VerseOrderEdit.setFocus() return False, \ - self.trUtf8('Invalid verse entry - values must be Numeric, B or C') + self.trUtf8('Invalid verse entry - values must be Numeric, I,B,C,T,P,E,O') return True, u'' def onTitleEditItemLostFocus(self): diff --git a/openlp/plugins/songs/forms/editversedialog.py b/openlp/plugins/songs/forms/editversedialog.py index 6709dec21..8f532ac3f 100644 --- a/openlp/plugins/songs/forms/editversedialog.py +++ b/openlp/plugins/songs/forms/editversedialog.py @@ -1,88 +1,91 @@ # -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2009 Raoul Snyman # -# Portions copyright (c) 2008-2009 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # -# Carsten Tinggaard # -# --------------------------------------------------------------------------- # -# This program is free software; you can redistribute it and/or modify it # -# under the terms of the GNU General Public License as published by the Free # -# Software Foundation; version 2 of the License. # -# # -# This program is distributed in the hope that it will be useful, but WITHOUT # -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # -# more details. # -# # -# You should have received a copy of the GNU General Public License along # -# with this program; if not, write to the Free Software Foundation, Inc., 59 # -# Temple Place, Suite 330, Boston, MA 02111-1307 USA # -############################################################################### +# Form implementation generated from reading ui file 'editversedialog.ui' +# +# Created: Wed Dec 2 08:14:47 2009 +# by: PyQt4 UI code generator 4.6.2 +# +# WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui class Ui_EditVerseDialog(object): def setupUi(self, EditVerseDialog): EditVerseDialog.setObjectName("EditVerseDialog") - EditVerseDialog.resize(492, 494) + EditVerseDialog.resize(500, 521) EditVerseDialog.setModal(True) - self.widget = QtGui.QWidget(EditVerseDialog) - self.widget.setGeometry(QtCore.QRect(9, 12, 471, 471)) - self.widget.setObjectName("widget") - self.verticalLayout = QtGui.QVBoxLayout(self.widget) - self.verticalLayout.setObjectName("verticalLayout") + self.layoutWidget = QtGui.QWidget(EditVerseDialog) + self.layoutWidget.setGeometry(QtCore.QRect(11, 1, 471, 491)) + self.layoutWidget.setObjectName("layoutWidget") + self.verticalLayout_3 = QtGui.QVBoxLayout(self.layoutWidget) + self.verticalLayout_3.setObjectName("verticalLayout_3") self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") - self.VerseListComboBox = QtGui.QComboBox(self.widget) + self.verticalLayout = QtGui.QVBoxLayout() + self.verticalLayout.setObjectName("verticalLayout") + self.VerseTypeLabel = QtGui.QLabel(self.layoutWidget) + self.VerseTypeLabel.setTextFormat(QtCore.Qt.PlainText) + self.VerseTypeLabel.setAlignment(QtCore.Qt.AlignCenter) + self.VerseTypeLabel.setObjectName("VerseTypeLabel") + self.verticalLayout.addWidget(self.VerseTypeLabel) + self.VerseListComboBox = QtGui.QComboBox(self.layoutWidget) self.VerseListComboBox.setObjectName("VerseListComboBox") self.VerseListComboBox.addItem("") - self.VerseListComboBox.setItemText(0, "") self.VerseListComboBox.addItem("") self.VerseListComboBox.addItem("") self.VerseListComboBox.addItem("") - self.horizontalLayout.addWidget(self.VerseListComboBox) - self.SubVerseListComboBox = QtGui.QComboBox(self.widget) + self.VerseListComboBox.addItem("") + self.VerseListComboBox.addItem("") + self.VerseListComboBox.addItem("") + self.verticalLayout.addWidget(self.VerseListComboBox) + self.horizontalLayout.addLayout(self.verticalLayout) + self.verticalLayout_2 = QtGui.QVBoxLayout() + self.verticalLayout_2.setObjectName("verticalLayout_2") + self.VerseNumberLabel = QtGui.QLabel(self.layoutWidget) + self.VerseNumberLabel.setAlignment(QtCore.Qt.AlignCenter) + self.VerseNumberLabel.setObjectName("VerseNumberLabel") + self.verticalLayout_2.addWidget(self.VerseNumberLabel) + self.SubVerseListComboBox = QtGui.QComboBox(self.layoutWidget) self.SubVerseListComboBox.setObjectName("SubVerseListComboBox") - self.SubVerseListComboBox.addItem("") - self.SubVerseListComboBox.setItemText(0, "") - self.SubVerseListComboBox.addItem("") - self.SubVerseListComboBox.addItem("") - self.SubVerseListComboBox.addItem("") - self.SubVerseListComboBox.addItem("") - self.SubVerseListComboBox.addItem("") - self.SubVerseListComboBox.addItem("") - self.SubVerseListComboBox.addItem("") - self.SubVerseListComboBox.addItem("") - self.SubVerseListComboBox.addItem("") - self.SubVerseListComboBox.addItem("") - self.SubVerseListComboBox.addItem("") - self.horizontalLayout.addWidget(self.SubVerseListComboBox) - self.verticalLayout.addLayout(self.horizontalLayout) - self.VerseTextEdit = QtGui.QTextEdit(self.widget) + self.verticalLayout_2.addWidget(self.SubVerseListComboBox) + self.horizontalLayout.addLayout(self.verticalLayout_2) + self.verticalLayout_3.addLayout(self.horizontalLayout) + self.VerseTextEdit = QtGui.QTextEdit(self.layoutWidget) self.VerseTextEdit.setAcceptRichText(False) self.VerseTextEdit.setObjectName("VerseTextEdit") - self.verticalLayout.addWidget(self.VerseTextEdit) + self.verticalLayout_3.addWidget(self.VerseTextEdit) self.horizontalLayout_2 = QtGui.QHBoxLayout() self.horizontalLayout_2.setObjectName("horizontalLayout_2") - self.addVerse = QtGui.QPushButton(self.widget) - self.addVerse.setObjectName("addVerse") - self.horizontalLayout_2.addWidget(self.addVerse) - self.addChorus = QtGui.QPushButton(self.widget) - self.addChorus.setObjectName("addChorus") - self.horizontalLayout_2.addWidget(self.addChorus) - self.addBridge = QtGui.QPushButton(self.widget) + self.addBridge = QtGui.QPushButton(self.layoutWidget) self.addBridge.setObjectName("addBridge") self.horizontalLayout_2.addWidget(self.addBridge) - self.verticalLayout.addLayout(self.horizontalLayout_2) - self.ButtonBox = QtGui.QDialogButtonBox(self.widget) + self.addVerse = QtGui.QPushButton(self.layoutWidget) + self.addVerse.setObjectName("addVerse") + self.horizontalLayout_2.addWidget(self.addVerse) + self.addChorus = QtGui.QPushButton(self.layoutWidget) + self.addChorus.setObjectName("addChorus") + self.horizontalLayout_2.addWidget(self.addChorus) + self.verticalLayout_3.addLayout(self.horizontalLayout_2) + self.horizontalLayout_3 = QtGui.QHBoxLayout() + self.horizontalLayout_3.setObjectName("horizontalLayout_3") + self.addPreChorus = QtGui.QPushButton(self.layoutWidget) + self.addPreChorus.setObjectName("addPreChorus") + self.horizontalLayout_3.addWidget(self.addPreChorus) + self.addIntro = QtGui.QPushButton(self.layoutWidget) + self.addIntro.setObjectName("addIntro") + self.horizontalLayout_3.addWidget(self.addIntro) + self.addOther = QtGui.QPushButton(self.layoutWidget) + self.addOther.setObjectName("addOther") + self.horizontalLayout_3.addWidget(self.addOther) + self.addEnding = QtGui.QPushButton(self.layoutWidget) + self.addEnding.setObjectName("addEnding") + self.horizontalLayout_3.addWidget(self.addEnding) + self.verticalLayout_3.addLayout(self.horizontalLayout_3) + self.ButtonBox = QtGui.QDialogButtonBox(self.layoutWidget) self.ButtonBox.setOrientation(QtCore.Qt.Horizontal) self.ButtonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Save) self.ButtonBox.setObjectName("ButtonBox") - self.verticalLayout.addWidget(self.ButtonBox) + self.verticalLayout_3.addWidget(self.ButtonBox) self.retranslateUi(EditVerseDialog) QtCore.QObject.connect(self.ButtonBox, QtCore.SIGNAL("accepted()"), EditVerseDialog.accept) @@ -91,20 +94,20 @@ class Ui_EditVerseDialog(object): def retranslateUi(self, EditVerseDialog): EditVerseDialog.setWindowTitle(QtGui.QApplication.translate("EditVerseDialog", "Edit Verse", None, QtGui.QApplication.UnicodeUTF8)) + self.VerseTypeLabel.setText(QtGui.QApplication.translate("EditVerseDialog", "Verse Type", None, QtGui.QApplication.UnicodeUTF8)) + self.VerseListComboBox.setItemText(0, QtGui.QApplication.translate("EditVerseDialog", "Intro", None, QtGui.QApplication.UnicodeUTF8)) self.VerseListComboBox.setItemText(1, QtGui.QApplication.translate("EditVerseDialog", "Verse", None, QtGui.QApplication.UnicodeUTF8)) - self.VerseListComboBox.setItemText(2, QtGui.QApplication.translate("EditVerseDialog", "Chorus", None, QtGui.QApplication.UnicodeUTF8)) - self.VerseListComboBox.setItemText(3, QtGui.QApplication.translate("EditVerseDialog", "Bridge", None, QtGui.QApplication.UnicodeUTF8)) - self.SubVerseListComboBox.setItemText(1, QtGui.QApplication.translate("EditVerseDialog", "1", None, QtGui.QApplication.UnicodeUTF8)) - self.SubVerseListComboBox.setItemText(2, QtGui.QApplication.translate("EditVerseDialog", "1a", None, QtGui.QApplication.UnicodeUTF8)) - self.SubVerseListComboBox.setItemText(3, QtGui.QApplication.translate("EditVerseDialog", "1b", None, QtGui.QApplication.UnicodeUTF8)) - self.SubVerseListComboBox.setItemText(4, QtGui.QApplication.translate("EditVerseDialog", "2", None, QtGui.QApplication.UnicodeUTF8)) - self.SubVerseListComboBox.setItemText(5, QtGui.QApplication.translate("EditVerseDialog", "2a", None, QtGui.QApplication.UnicodeUTF8)) - self.SubVerseListComboBox.setItemText(6, QtGui.QApplication.translate("EditVerseDialog", "2b", None, QtGui.QApplication.UnicodeUTF8)) - self.SubVerseListComboBox.setItemText(7, QtGui.QApplication.translate("EditVerseDialog", "3", None, QtGui.QApplication.UnicodeUTF8)) - self.SubVerseListComboBox.setItemText(8, QtGui.QApplication.translate("EditVerseDialog", "4", None, QtGui.QApplication.UnicodeUTF8)) - self.SubVerseListComboBox.setItemText(9, QtGui.QApplication.translate("EditVerseDialog", "5", None, QtGui.QApplication.UnicodeUTF8)) - self.SubVerseListComboBox.setItemText(10, QtGui.QApplication.translate("EditVerseDialog", "6", None, QtGui.QApplication.UnicodeUTF8)) - self.SubVerseListComboBox.setItemText(11, QtGui.QApplication.translate("EditVerseDialog", "7", None, QtGui.QApplication.UnicodeUTF8)) + self.VerseListComboBox.setItemText(2, QtGui.QApplication.translate("EditVerseDialog", "Pre-Chorus", None, QtGui.QApplication.UnicodeUTF8)) + self.VerseListComboBox.setItemText(3, QtGui.QApplication.translate("EditVerseDialog", "Chorus", None, QtGui.QApplication.UnicodeUTF8)) + self.VerseListComboBox.setItemText(4, QtGui.QApplication.translate("EditVerseDialog", "Bridge", None, QtGui.QApplication.UnicodeUTF8)) + self.VerseListComboBox.setItemText(5, QtGui.QApplication.translate("EditVerseDialog", "Ending", None, QtGui.QApplication.UnicodeUTF8)) + self.VerseListComboBox.setItemText(6, QtGui.QApplication.translate("EditVerseDialog", "Other", None, QtGui.QApplication.UnicodeUTF8)) + self.VerseNumberLabel.setText(QtGui.QApplication.translate("EditVerseDialog", "Number", None, QtGui.QApplication.UnicodeUTF8)) + self.addBridge.setText(QtGui.QApplication.translate("EditVerseDialog", "Bridge", None, QtGui.QApplication.UnicodeUTF8)) self.addVerse.setText(QtGui.QApplication.translate("EditVerseDialog", "Verse", None, QtGui.QApplication.UnicodeUTF8)) self.addChorus.setText(QtGui.QApplication.translate("EditVerseDialog", "Chorus", None, QtGui.QApplication.UnicodeUTF8)) - self.addBridge.setText(QtGui.QApplication.translate("EditVerseDialog", "Bridge", None, QtGui.QApplication.UnicodeUTF8)) + self.addPreChorus.setText(QtGui.QApplication.translate("EditVerseDialog", "Pre-Chorus", None, QtGui.QApplication.UnicodeUTF8)) + self.addIntro.setText(QtGui.QApplication.translate("EditVerseDialog", "Intro", None, QtGui.QApplication.UnicodeUTF8)) + self.addOther.setText(QtGui.QApplication.translate("EditVerseDialog", "Other", None, QtGui.QApplication.UnicodeUTF8)) + self.addEnding.setText(QtGui.QApplication.translate("EditVerseDialog", "Ending", None, QtGui.QApplication.UnicodeUTF8)) + diff --git a/openlp/plugins/songs/forms/editverseform.py b/openlp/plugins/songs/forms/editverseform.py index 5f46dd5ef..1f92fbbd8 100644 --- a/openlp/plugins/songs/forms/editverseform.py +++ b/openlp/plugins/songs/forms/editverseform.py @@ -42,17 +42,39 @@ class EditVerseForm(QtGui.QDialog, Ui_EditVerseDialog): QtCore.SIGNAL(u'clicked()'), self.onAddChorus) QtCore.QObject.connect(self.addBridge, QtCore.SIGNAL(u'clicked()'), self.onAddBridge) + QtCore.QObject.connect(self.addIntro, + QtCore.SIGNAL(u'clicked()'), self.onAddIntro) + QtCore.QObject.connect(self.addOther, + QtCore.SIGNAL(u'clicked()'), self.onAddOther) + QtCore.QObject.connect(self.addPreChorus, + QtCore.SIGNAL(u'clicked()'), self.onAddPreChorus) + QtCore.QObject.connect(self.addEnding, + QtCore.SIGNAL(u'clicked()'), self.onAddEnding) + QtCore.QObject.connect(self.VerseListComboBox, + QtCore.SIGNAL(u'activated(int)'), self.onVerseComboChanged) + + def onAddIntro(self): + self.VerseTextEdit.insertPlainText(u'---[Intro:1]---') + + def onAddEnding(self): + self.VerseTextEdit.insertPlainText(u'---[Ending:1]---') + + def onAddOther(self): + self.VerseTextEdit.insertPlainText(u'---[Other:1]---') + + def onAddPreChorus(self): + self.VerseTextEdit.insertPlainText(u'---[PreChorus:1]---') def onAddBridge(self): - self.VerseTextEdit.insertPlainText(u'---[Bridge:1]---\n') + self.VerseTextEdit.insertPlainText(u'---[Bridge:1]---') def onAddChorus(self): - self.VerseTextEdit.insertPlainText(u'---[Chorus:1]---\n') + self.VerseTextEdit.insertPlainText(u'---[Chorus:1]---') def onAddVerse(self): - self.VerseTextEdit.insertPlainText(u'---[Verse:1]---\n') + self.VerseTextEdit.insertPlainText(u'---[Verse:1]---') - def setVerse(self, text, single=False, tag=0): + def setVerse(self, text, verseCount=0, single=False, tag=u'Verse:1'): posVerse = 0 posSub = 0 if single: @@ -65,19 +87,31 @@ class EditVerseForm(QtGui.QDialog, Ui_EditVerseDialog): posSub = 0 self.VerseListComboBox.setEnabled(True) self.SubVerseListComboBox.setEnabled(True) + self.SubVerseListComboBox.clear() + for i in range(1, verseCount + 1): + self.SubVerseListComboBox.addItem(u'%s'% i) self.addBridge.setEnabled(False) self.addChorus.setEnabled(False) self.addVerse.setEnabled(False) + self.addIntro.setEnabled(False) + self.addPreChorus.setEnabled(False) + self.addOther.setEnabled(False) + self.addEnding.setEnabled(False) else: self.VerseListComboBox.setEnabled(False) self.SubVerseListComboBox.setEnabled(False) self.addBridge.setEnabled(True) self.addChorus.setEnabled(True) self.addVerse.setEnabled(True) + self.addIntro.setEnabled(True) + self.addPreChorus.setEnabled(True) + self.addOther.setEnabled(True) + self.addEnding.setEnabled(True) self.VerseListComboBox.setCurrentIndex(posVerse) self.SubVerseListComboBox.setCurrentIndex(posSub) self.VerseTextEdit.setPlainText(text) self.VerseTextEdit.setFocus(QtCore.Qt.OtherFocusReason) + self.onVerseComboChanged(0) def getVerse(self): return self.VerseTextEdit.toPlainText(), \ @@ -86,3 +120,10 @@ class EditVerseForm(QtGui.QDialog, Ui_EditVerseDialog): def getVerseAll(self): return self.VerseTextEdit.toPlainText() + + def onVerseComboChanged(self, id): + if unicode(self.VerseListComboBox.currentText()) == u'Verse': + self.SubVerseListComboBox.setEnabled(True) + else: + self.SubVerseListComboBox.setEnabled(False) + self.SubVerseListComboBox.setCurrentIndex(0) diff --git a/resources/forms/editversedialog.ui b/resources/forms/editversedialog.ui index e629eaa87..e0917f44d 100644 --- a/resources/forms/editversedialog.ui +++ b/resources/forms/editversedialog.ui @@ -6,115 +6,100 @@ 0 0 - 492 - 494 + 500 + 521 - Dialog + Edit Verse true - + - 9 - 12 + 11 + 1 471 - 471 + 491 - + - + - - - + + + Verse Type + + + Qt::PlainText + + + Qt::AlignCenter + + - - Verse - + + + + Intro + + + + + Verse + + + + + Pre-Chorus + + + + + Chorus + + + + + Bridge + + + + + Ending + + + + + Other + + + - - - Chorus - - - - - Bridge - - - + - + - - - + + + Number + + + Qt::AlignCenter + + - - 1 - + - - - 1a - - - - - 1b - - - - - 2 - - - - - 2a - - - - - 2b - - - - - 3 - - - - - 4 - - - - - 5 - - - - - 6 - - - - - 7 - - - + @@ -127,6 +112,13 @@ + + + + Bridge + + + @@ -141,10 +133,35 @@ + + + + - + - Bridge + Pre-Chorus + + + + + + + Intro + + + + + + + Other + + + + + + + Ending