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

246 lines
10 KiB
Python
Raw Normal View History

# -*- coding: utf-8 -*-
2019-04-13 13:00:22 +00:00
##########################################################################
# OpenLP - Open Source Lyrics Projection #
# ---------------------------------------------------------------------- #
2020-12-30 21:42:49 +00:00
# Copyright (c) 2008-2021 OpenLP Developers #
2019-04-13 13:00:22 +00:00
# ---------------------------------------------------------------------- #
# 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, either version 3 of the License, or #
# (at your option) any later version. #
# #
# 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, see <https://www.gnu.org/licenses/>. #
##########################################################################
2010-04-03 23:00:05 +00:00
import logging
2017-12-28 08:08:12 +00:00
import re
2010-04-03 23:00:05 +00:00
from PyQt5 import QtCore, QtGui, QtWidgets
2010-04-03 23:00:05 +00:00
2017-10-07 07:05:07 +00:00
from openlp.core.common.i18n import translate
from openlp.core.common.registry import Registry
2017-12-28 08:08:12 +00:00
from openlp.core.lib.ui import critical_error_message_box
2017-10-07 07:05:07 +00:00
from openlp.plugins.songs.forms.editversedialog import Ui_EditVerseDialog
from openlp.plugins.songs.lib import VerseType, transpose_lyrics
2018-10-02 04:39:42 +00:00
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*.*\]---')
2013-02-11 19:44:04 +00:00
2015-11-07 00:49:40 +00:00
class EditVerseForm(QtWidgets.QDialog, Ui_EditVerseDialog):
"""
This is the form that is used to edit the verses of the song.
"""
def __init__(self, parent=None):
"""
Constructor
"""
super(EditVerseForm, self).__init__(parent, QtCore.Qt.WindowSystemMenuHint | QtCore.Qt.WindowTitleHint |
QtCore.Qt.WindowCloseButtonHint)
self.setup_ui(self)
2015-05-25 20:03:31 +00:00
self.has_single_verse = False
self.insert_button.clicked.connect(self.on_insert_button_clicked)
2017-08-27 17:13:14 +00:00
self.overflow_split_button.clicked.connect(self.on_overflow_split_button_clicked)
self.verse_text_edit.cursorPositionChanged.connect(self.on_cursor_position_changed)
self.verse_type_combo_box.currentIndexChanged.connect(self.on_verse_type_combo_box_changed)
2017-08-27 17:13:14 +00:00
self.forced_split_button.clicked.connect(self.on_forced_split_button_clicked)
if Registry().get('settings').value('songs/enable chords'):
2017-08-09 05:02:42 +00:00
self.transpose_down_button.clicked.connect(self.on_transpose_down_button_clicked)
self.transpose_up_button.clicked.connect(self.on_transpose_up_button_clicked)
def insert_verse(self, verse_tag, verse_num=1):
2014-03-04 18:49:30 +00:00
"""
Insert a verse
:param verse_tag: The verse tag
:param verse_num: The verse number
"""
if self.verse_text_edit.textCursor().columnNumber() != 0:
2013-08-31 18:17:38 +00:00
self.verse_text_edit.insertPlainText('\n')
verse_tag = VerseType.translated_name(verse_tag)
self.verse_text_edit.insertPlainText('---[{tag}:{number}]---\n'.format(tag=verse_tag, number=verse_num))
self.verse_text_edit.setFocus()
2017-08-27 17:13:14 +00:00
def on_overflow_split_button_clicked(self):
2014-03-04 18:49:30 +00:00
"""
2017-08-11 16:09:14 +00:00
The optional split button has been pressed so we need add the split
2014-03-04 18:49:30 +00:00
"""
2017-08-11 16:09:14 +00:00
self._add_splitter_to_text('[---]')
2011-05-22 13:08:43 +00:00
2017-08-27 17:13:14 +00:00
def on_forced_split_button_clicked(self):
2017-04-05 20:28:43 +00:00
"""
2017-08-11 16:19:07 +00:00
The force split button has been pressed so we need add the split
2017-04-05 20:28:43 +00:00
"""
2017-08-11 16:09:14 +00:00
self._add_splitter_to_text('[--}{--]')
def _add_splitter_to_text(self, insert_string):
"""
Add a custom splitter to the song text
:param insert_string: The string to insert
:return:
2014-03-04 18:49:30 +00:00
"""
text = self.verse_text_edit.toPlainText()
position = self.verse_text_edit.textCursor().position()
2014-04-12 20:19:22 +00:00
if position and text[position - 1] != '\n':
2013-08-31 18:17:38 +00:00
insert_string = '\n' + insert_string
2014-03-04 18:49:30 +00:00
if position == len(text) or text[position] != '\n':
2013-08-31 18:17:38 +00:00
insert_string += '\n'
self.verse_text_edit.insertPlainText(insert_string)
self.verse_text_edit.setFocus()
2011-05-22 13:08:43 +00:00
def on_insert_button_clicked(self):
2014-03-04 18:49:30 +00:00
"""
The insert button has been pressed
"""
verse_type_index = self.verse_type_combo_box.currentIndex()
self.insert_verse(VerseType.tags[verse_type_index], self.verse_number_box.value())
def on_verse_type_combo_box_changed(self):
2014-03-04 18:49:30 +00:00
"""
The verse type combo has been changed
"""
self.update_suggested_verse_number()
def on_cursor_position_changed(self):
2014-03-04 18:49:30 +00:00
"""
The cursor position has been changed
"""
self.update_suggested_verse_number()
2017-08-09 05:02:42 +00:00
def on_transpose_up_button_clicked(self):
"""
The transpose up button clicked
"""
2017-02-22 21:01:42 +00:00
try:
transposed_lyrics = transpose_lyrics(self.verse_text_edit.toPlainText(), 1)
self.verse_text_edit.setPlainText(transposed_lyrics)
except ValueError as ve:
# Transposing failed
critical_error_message_box(title=translate('SongsPlugin.EditVerseForm', 'Transposing failed'),
message=translate('SongsPlugin.EditVerseForm',
'Transposing failed because of invalid chord:\n{err_msg}'
.format(err_msg=ve)))
return
2016-06-08 19:06:04 +00:00
self.verse_text_edit.setFocus()
self.verse_text_edit.moveCursor(QtGui.QTextCursor.End)
2017-08-09 05:02:42 +00:00
def on_transpose_down_button_clicked(self):
"""
The transpose down button clicked
"""
2017-02-22 21:01:42 +00:00
try:
transposed_lyrics = transpose_lyrics(self.verse_text_edit.toPlainText(), -1)
self.verse_text_edit.setPlainText(transposed_lyrics)
except ValueError as ve:
# Transposing failed
critical_error_message_box(title=translate('SongsPlugin.EditVerseForm', 'Transposing failed'),
message=translate('SongsPlugin.EditVerseForm',
'Transposing failed because of invalid chord:\n{err_msg}'
.format(err_msg=ve)))
return
self.verse_text_edit.setPlainText(transposed_lyrics)
2016-06-08 19:06:04 +00:00
self.verse_text_edit.setFocus()
self.verse_text_edit.moveCursor(QtGui.QTextCursor.End)
def update_suggested_verse_number(self):
2010-10-11 17:29:03 +00:00
"""
2013-02-24 18:13:50 +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
"""
2015-02-23 17:40:56 +00:00
if self.has_single_verse:
return
position = self.verse_text_edit.textCursor().position()
text = self.verse_text_edit.toPlainText()
2013-02-24 18:13:50 +00:00
verse_name = VerseType.translated_names[
self.verse_type_combo_box.currentIndex()]
2010-10-11 17:29:03 +00:00
if not text:
return
position = text.rfind('---[{verse}'.format(verse=verse_name), 0, position)
2010-10-11 17:29:03 +00:00
if position == -1:
self.verse_number_box.setValue(1)
2010-10-11 17:29:03 +00:00
return
text = text[position:]
2013-08-31 18:17:38 +00:00
position = text.find(']---')
2010-10-11 17:29:03 +00:00
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:
2011-03-03 20:18:17 +00:00
try:
verse_num = int(match.group(2)) + 1
2011-03-03 20:18:17 +00:00
except ValueError:
verse_num = 1
self.verse_number_box.setValue(verse_num)
def set_verse(self, text, single=False, tag='{verse}1'.format(verse=VerseType.tags[VerseType.Verse])):
2014-03-04 18:49:30 +00:00
"""
Save the verse
:param text: The text
:param single: is this a single verse
:param tag: The tag
"""
self.has_single_verse = single
2009-11-22 20:33:39 +00:00
if single:
verse_type_index = VerseType.from_tag(tag[0], None)
2011-02-17 19:46:01 +00:00
verse_number = tag[1:]
if verse_type_index is not None:
self.verse_type_combo_box.setCurrentIndex(verse_type_index)
self.verse_number_box.setValue(int(verse_number))
self.insert_button.setVisible(False)
2009-11-22 20:33:39 +00:00
else:
2010-04-03 23:00:05 +00:00
if not text:
text = '---[{tag}:1]---\n'.format(tag=VerseType.translated_names[VerseType.Verse])
self.verse_type_combo_box.setCurrentIndex(0)
self.verse_number_box.setValue(1)
self.insert_button.setVisible(True)
self.verse_text_edit.setPlainText(text)
self.verse_text_edit.setFocus()
self.verse_text_edit.moveCursor(QtGui.QTextCursor.End)
def get_verse(self):
2014-03-04 18:49:30 +00:00
"""
Extract the verse text
:return: The text
"""
return self.verse_text_edit.toPlainText(), VerseType.tags[self.verse_type_combo_box.currentIndex()], \
2013-08-31 18:17:38 +00:00
str(self.verse_number_box.value())
def get_all_verses(self):
2014-03-04 18:49:30 +00:00
"""
Extract all the verses
:return: The text
"""
text = self.verse_text_edit.toPlainText()
2013-08-31 18:17:38 +00:00
if not text.startswith('---['):
text = '---[{tag}:1]---\n{text}'.format(tag=VerseType.translated_names[VerseType.Verse], text=text)
2010-07-27 09:32:52 +00:00
return text
def accept(self):
"""
Test if any invalid chords has been entered before closing the verse editor
"""
if Registry().get('settings').value('songs/enable chords'):
try:
transpose_lyrics(self.verse_text_edit.toPlainText(), 0)
super(EditVerseForm, self).accept()
except ValueError as ve:
# Transposing failed
critical_error_message_box(title=translate('SongsPlugin.EditVerseForm', 'Invalid Chord'),
message=translate('SongsPlugin.EditVerseForm',
'An invalid chord was detected:\n{err_msg}'
.format(err_msg=ve)))
else:
super(EditVerseForm, self).accept()