openlp/openlp/plugins/songs/forms/editverseform.py

203 lines
8.6 KiB
Python
Raw Normal View History

# -*- coding: utf-8 -*-
# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
###############################################################################
# OpenLP - Open Source Lyrics Projection #
# --------------------------------------------------------------------------- #
2010-12-26 11:04:47 +00:00
# Copyright (c) 2008-2011 Raoul Snyman #
2011-05-26 16:25:54 +00:00
# Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan #
# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, #
2011-05-26 17:11:22 +00:00
# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias #
2011-06-12 16:02:52 +00:00
# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, #
2011-06-12 15:41:01 +00:00
# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund #
# --------------------------------------------------------------------------- #
# 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 #
###############################################################################
2010-04-03 23:00:05 +00:00
import re
import logging
2009-09-25 00:43:42 +00:00
from PyQt4 import QtCore, QtGui
2010-04-03 23:00:05 +00:00
from openlp.core.lib.ui import critical_error_message_box
from openlp.plugins.songs.lib import VerseType, translate
2010-06-05 20:00:50 +00:00
from editversedialog import Ui_EditVerseDialog
2010-04-03 23:00:05 +00:00
log = logging.getLogger(__name__)
2011-07-13 13:32:19 +00:00
VERSE_REGEX = re.compile(r'---\[(.+):\D*(\d*)\D*.*\]---')
class EditVerseForm(QtGui.QDialog, Ui_EditVerseDialog):
"""
This is the form that is used to edit the verses of the song.
"""
def __init__(self, parent=None):
"""
Constructor
"""
QtGui.QDialog.__init__(self, parent)
self.setupUi(self)
2010-08-28 19:54:50 +00:00
QtCore.QObject.connect(self.verseTextEdit,
2010-08-22 07:05:05 +00:00
QtCore.SIGNAL('customContextMenuRequested(QPoint)'),
self.contextMenu)
QtCore.QObject.connect(self.insertButton, QtCore.SIGNAL(u'clicked()'),
self.onInsertButtonClicked)
2011-05-22 13:08:43 +00:00
QtCore.QObject.connect(self.splitButton, QtCore.SIGNAL(u'clicked()'),
self.onSplitButtonClicked)
QtCore.QObject.connect(self.verseTextEdit,
2010-04-03 23:00:05 +00:00
QtCore.SIGNAL(u'cursorPositionChanged()'),
self.onCursorPositionChanged)
2010-10-11 17:29:03 +00:00
QtCore.QObject.connect(self.verseTypeComboBox,
QtCore.SIGNAL(u'currentIndexChanged(int)'),
self.onVerseTypeComboBoxChanged)
2010-04-03 23:00:05 +00:00
2010-08-22 07:05:05 +00:00
def contextMenu(self, point):
item = self.serviceManagerList.itemAt(point)
def insertVerse(self, verse_tag, verse_num=1):
if self.verseTextEdit.textCursor().columnNumber() != 0:
self.verseTextEdit.insertPlainText(u'\n')
verse_tag = VerseType.translated_name(verse_tag)
self.verseTextEdit.insertPlainText(u'---[%s:%s]---\n' %
(verse_tag, verse_num))
self.verseTextEdit.setFocus()
2011-05-22 13:08:43 +00:00
def onSplitButtonClicked(self):
verse_type_index = self.verseTypeComboBox.currentIndex()
if self.verseTextEdit.textCursor().columnNumber() != 0:
self.verseTextEdit.insertPlainText(u'\n')
self.verseTextEdit.insertPlainText(u'[---]')
self.verseTextEdit.setFocus()
2010-04-03 23:00:05 +00:00
def onInsertButtonClicked(self):
verse_type_index = self.verseTypeComboBox.currentIndex()
self.insertVerse(VerseType.Tags[verse_type_index],
2011-02-17 19:46:01 +00:00
self.verseNumberBox.value())
2010-10-11 17:29:03 +00:00
def onVerseTypeComboBoxChanged(self):
"""
2010-10-12 16:47:53 +00:00
Adjusts the verse number SpinBox in regard to the selected verse type
and the cursor's position.
2010-10-11 17:29:03 +00:00
"""
position = self.verseTextEdit.textCursor().position()
text = unicode(self.verseTextEdit.toPlainText())
verse_name = VerseType.TranslatedNames[
self.verseTypeComboBox.currentIndex()]
2010-10-11 17:29:03 +00:00
if not text:
return
position = text.rfind(u'---[%s' % verse_name, 0, position)
2010-10-11 17:29:03 +00:00
if position == -1:
self.verseNumberBox.setValue(1)
return
text = text[position:]
position = text.find(u']---')
if position == -1:
return
text = text[:position + 4]
2011-07-13 13:32:19 +00:00
match = VERSE_REGEX.match(text)
2010-10-11 17:29:03 +00:00
if match:
verse_tag = match.group(1)
2011-03-03 20:18:17 +00:00
try:
verse_num = int(match.group(2))
except ValueError:
verse_num = 1
verse_type_index = VerseType.from_loose_input(verse_tag, True)
2010-10-11 17:29:03 +00:00
if verse_type_index is not None:
self.verseNumberBox.setValue(verse_num)
2010-10-11 17:29:03 +00:00
2010-04-03 23:00:05 +00:00
def onCursorPositionChanged(self):
"""
Determines the previous verse type and number in regard to the cursor's
position and adjusts the ComboBox and SpinBox to these values.
"""
position = self.verseTextEdit.textCursor().position()
text = unicode(self.verseTextEdit.toPlainText())
2010-04-03 23:00:05 +00:00
if not text:
return
if text.rfind(u'[', 0, position) > text.rfind(u']', 0, position) and \
text.find(u']', position) < text.find(u'[', position):
2010-04-03 23:00:05 +00:00
return
position = text.rfind(u'---[', 0, position)
if position == -1:
return
text = text[position:]
position = text.find(u']---')
if position == -1:
return
text = text[:position + 4]
2011-07-13 13:32:19 +00:00
match = VERSE_REGEX.match(text)
2010-04-03 23:00:05 +00:00
if match:
verse_type = match.group(1)
verse_type_index = VerseType.from_loose_input(verse_type, True)
2011-03-03 20:18:17 +00:00
try:
verse_number = int(match.group(2))
except ValueError:
verse_number = 1
if verse_type_index is not None:
self.verseTypeComboBox.setCurrentIndex(verse_type_index)
2011-02-18 07:53:40 +00:00
self.verseNumberBox.setValue(verse_number)
2010-06-06 07:28:07 +00:00
def setVerse(self, text, single=False,
2011-02-17 19:46:01 +00:00
tag=u'%s1' % VerseType.Tags[VerseType.Verse]):
2010-12-20 14:15:03 +00:00
self.hasSingleVerse = single
2009-11-22 20:33:39 +00:00
if single:
2011-02-17 19:46:01 +00:00
verse_type_index = VerseType.from_tag(tag[0])
verse_number = tag[1:]
if verse_type_index is not None:
self.verseTypeComboBox.setCurrentIndex(verse_type_index)
self.verseNumberBox.setValue(int(verse_number))
self.insertButton.setVisible(False)
2009-11-22 20:33:39 +00:00
else:
2010-04-03 23:00:05 +00:00
if not text:
text = u'---[%s:1]---\n' % \
2011-02-17 19:46:01 +00:00
VerseType.TranslatedNames[VerseType.Verse]
self.verseTypeComboBox.setCurrentIndex(0)
self.verseNumberBox.setValue(1)
self.insertButton.setVisible(True)
self.verseTextEdit.setPlainText(text)
self.verseTextEdit.setFocus(QtCore.Qt.OtherFocusReason)
self.verseTextEdit.moveCursor(QtGui.QTextCursor.End)
def getVerse(self):
return self.verseTextEdit.toPlainText(), \
VerseType.Tags[self.verseTypeComboBox.currentIndex()], \
unicode(self.verseNumberBox.value())
2009-11-26 18:41:39 +00:00
def getVerseAll(self):
text = self.verseTextEdit.toPlainText()
2010-02-27 09:55:44 +00:00
if not text.startsWith(u'---['):
text = u'---[%s:1]---\n%s' % \
2011-02-17 19:46:01 +00:00
(VerseType.TranslatedNames[VerseType.Verse], text)
2010-07-27 09:32:52 +00:00
return text
def accept(self):
2010-12-20 14:15:03 +00:00
if self.hasSingleVerse:
2010-12-18 19:24:44 +00:00
value = unicode(self.getVerse()[0])
else:
log.debug(unicode(self.getVerse()[0]).split(u'\n'))
value = unicode(self.getVerse()[0]).split(u'\n')[1]
if len(value) == 0:
lines = unicode(self.getVerse()[0]).split(u'\n')
index = 2
while index < len(lines) and len(value) == 0:
value = lines[index]
index += 1
2010-12-18 19:24:44 +00:00
if len(value) == 0:
critical_error_message_box(
2011-01-15 19:24:50 +00:00
message=translate('SongsPlugin.EditSongForm',
'You need to type some text in to the verse.'))
return False
2011-01-04 21:06:50 +00:00
QtGui.QDialog.accept(self)