2010-12-23 17:42:28 +00:00
|
|
|
# -*- coding: utf-8 -*-
|
2012-12-29 15:25:29 +00:00
|
|
|
# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
|
2010-12-23 17:42:28 +00:00
|
|
|
|
|
|
|
###############################################################################
|
|
|
|
# OpenLP - Open Source Lyrics Projection #
|
|
|
|
# --------------------------------------------------------------------------- #
|
2017-12-29 09:15:48 +00:00
|
|
|
# Copyright (c) 2008-2018 OpenLP Developers #
|
2010-12-23 17:42:28 +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; 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 #
|
|
|
|
###############################################################################
|
2011-02-07 15:55:02 +00:00
|
|
|
"""
|
2013-02-01 20:36:27 +00:00
|
|
|
The :mod:`formattingtagform` provides an Tag Edit facility. The Base set are protected and included each time loaded.
|
2013-08-25 18:31:15 +00:00
|
|
|
Custom tags can be defined and saved. The Custom Tag arrays are saved in a json string so QSettings works on them.
|
|
|
|
Base Tags cannot be changed.
|
2011-02-07 15:55:02 +00:00
|
|
|
"""
|
2015-12-30 15:03:35 +00:00
|
|
|
from PyQt5 import QtCore, QtWidgets
|
2010-12-23 17:42:28 +00:00
|
|
|
|
2017-10-07 07:05:07 +00:00
|
|
|
from openlp.core.common.i18n import translate
|
2013-10-13 21:07:28 +00:00
|
|
|
from openlp.core.lib import FormattingTags
|
2013-08-31 08:52:44 +00:00
|
|
|
from openlp.core.ui.formattingtagcontroller import FormattingTagController
|
2017-12-28 08:27:44 +00:00
|
|
|
from openlp.core.ui.formattingtagdialog import Ui_FormattingTagDialog
|
2010-12-23 17:42:28 +00:00
|
|
|
|
2011-09-22 14:23:51 +00:00
|
|
|
|
2013-09-08 21:13:15 +00:00
|
|
|
class EditColumn(object):
|
2013-08-26 08:11:20 +00:00
|
|
|
"""
|
|
|
|
Hides the magic numbers for the table columns
|
|
|
|
"""
|
|
|
|
Description = 0
|
|
|
|
Tag = 1
|
|
|
|
StartHtml = 2
|
|
|
|
EndHtml = 3
|
|
|
|
|
|
|
|
|
2015-11-07 00:49:40 +00:00
|
|
|
class FormattingTagForm(QtWidgets.QDialog, Ui_FormattingTagDialog, FormattingTagController):
|
2011-02-07 15:55:02 +00:00
|
|
|
"""
|
2011-07-30 07:34:37 +00:00
|
|
|
The :class:`FormattingTagForm` manages the settings tab .
|
2011-02-07 15:55:02 +00:00
|
|
|
"""
|
2011-02-20 17:06:58 +00:00
|
|
|
def __init__(self, parent):
|
2011-02-07 15:55:02 +00:00
|
|
|
"""
|
2011-02-20 17:06:58 +00:00
|
|
|
Constructor
|
2011-02-07 15:55:02 +00:00
|
|
|
"""
|
2017-06-04 12:14:23 +00:00
|
|
|
super(FormattingTagForm, self).__init__(parent, QtCore.Qt.WindowSystemMenuHint | QtCore.Qt.WindowTitleHint |
|
|
|
|
QtCore.Qt.WindowCloseButtonHint)
|
2011-02-20 17:06:58 +00:00
|
|
|
self.setupUi(self)
|
2014-09-07 22:17:20 +00:00
|
|
|
self._setup()
|
|
|
|
|
|
|
|
def _setup(self):
|
|
|
|
"""
|
|
|
|
Set up the class. This method is mocked out by the tests.
|
|
|
|
"""
|
2013-08-31 08:52:44 +00:00
|
|
|
self.services = FormattingTagController()
|
2013-08-26 08:11:20 +00:00
|
|
|
self.tag_table_widget.itemSelectionChanged.connect(self.on_row_selected)
|
2013-08-25 13:29:00 +00:00
|
|
|
self.new_button.clicked.connect(self.on_new_clicked)
|
|
|
|
self.delete_button.clicked.connect(self.on_delete_clicked)
|
|
|
|
self.tag_table_widget.currentCellChanged.connect(self.on_current_cell_changed)
|
2013-03-06 22:42:52 +00:00
|
|
|
self.button_box.rejected.connect(self.close)
|
2011-09-23 00:41:01 +00:00
|
|
|
# Forces reloading of tags from openlp configuration.
|
|
|
|
FormattingTags.load_tags()
|
2013-09-15 06:37:43 +00:00
|
|
|
self.is_deleting = False
|
2013-09-28 20:55:25 +00:00
|
|
|
self.reloading = False
|
2011-01-08 09:17:08 +00:00
|
|
|
|
2015-11-07 00:49:40 +00:00
|
|
|
def exec(self):
|
2010-12-23 17:42:28 +00:00
|
|
|
"""
|
2011-02-20 17:06:58 +00:00
|
|
|
Load Display and set field state.
|
2010-12-23 17:42:28 +00:00
|
|
|
"""
|
|
|
|
# Create initial copy from master
|
2012-05-05 16:03:40 +00:00
|
|
|
self._reloadTable()
|
2015-11-07 00:49:40 +00:00
|
|
|
return QtWidgets.QDialog.exec(self)
|
2011-02-21 20:06:55 +00:00
|
|
|
|
2013-03-06 22:32:59 +00:00
|
|
|
def on_row_selected(self):
|
2010-12-23 17:42:28 +00:00
|
|
|
"""
|
|
|
|
Table Row selected so display items and set field state.
|
|
|
|
"""
|
2013-08-26 08:11:20 +00:00
|
|
|
self.delete_button.setEnabled(True)
|
2012-05-05 16:03:40 +00:00
|
|
|
|
2013-03-06 22:32:59 +00:00
|
|
|
def on_new_clicked(self):
|
2010-12-23 17:42:28 +00:00
|
|
|
"""
|
2013-08-26 08:11:20 +00:00
|
|
|
Add a new tag to edit list and select it for editing.
|
|
|
|
"""
|
|
|
|
new_row = self.tag_table_widget.rowCount()
|
|
|
|
self.tag_table_widget.insertRow(new_row)
|
2016-05-20 16:22:06 +00:00
|
|
|
self.tag_table_widget.setItem(new_row, 0,
|
|
|
|
QtWidgets.QTableWidgetItem(translate('OpenLP.FormattingTagForm',
|
|
|
|
'New Tag {row:d}').format(row=new_row)))
|
|
|
|
self.tag_table_widget.setItem(new_row, 1, QtWidgets.QTableWidgetItem('n{row:d}'.format(row=new_row)))
|
2013-08-26 08:11:20 +00:00
|
|
|
self.tag_table_widget.setItem(new_row, 2,
|
2015-11-07 00:49:40 +00:00
|
|
|
QtWidgets.QTableWidgetItem(translate('OpenLP.FormattingTagForm', '<HTML here>')))
|
|
|
|
self.tag_table_widget.setItem(new_row, 3, QtWidgets.QTableWidgetItem(''))
|
2013-08-26 08:11:20 +00:00
|
|
|
self.tag_table_widget.resizeRowsToContents()
|
2013-03-06 22:27:22 +00:00
|
|
|
self.tag_table_widget.scrollToBottom()
|
2013-08-26 08:11:20 +00:00
|
|
|
self.tag_table_widget.selectRow(new_row)
|
2010-12-23 17:42:28 +00:00
|
|
|
|
2013-03-06 22:32:59 +00:00
|
|
|
def on_delete_clicked(self):
|
2010-12-23 17:42:28 +00:00
|
|
|
"""
|
2013-08-26 08:11:20 +00:00
|
|
|
Delete selected custom row.
|
2010-12-23 17:42:28 +00:00
|
|
|
"""
|
2013-08-26 08:11:20 +00:00
|
|
|
selected = self.tag_table_widget.currentRow()
|
|
|
|
if selected != -1:
|
2013-09-15 06:37:43 +00:00
|
|
|
self.is_deleting = True
|
2013-08-26 08:11:20 +00:00
|
|
|
self.tag_table_widget.removeRow(selected)
|
2010-12-23 17:42:28 +00:00
|
|
|
|
2013-09-01 20:43:22 +00:00
|
|
|
def accept(self):
|
2010-12-23 17:42:28 +00:00
|
|
|
"""
|
2011-05-08 05:42:48 +00:00
|
|
|
Update Custom Tag details if not duplicate and save the data.
|
2010-12-23 17:42:28 +00:00
|
|
|
"""
|
2013-08-31 08:52:44 +00:00
|
|
|
count = 0
|
|
|
|
self.services.pre_save()
|
|
|
|
while count < self.tag_table_widget.rowCount():
|
2013-09-01 20:43:22 +00:00
|
|
|
error = self.services.validate_for_save(self.tag_table_widget.item(count, 0).text(),
|
2013-12-24 15:55:01 +00:00
|
|
|
self.tag_table_widget.item(count, 1).text(),
|
|
|
|
self.tag_table_widget.item(count, 2).text(),
|
|
|
|
self.tag_table_widget.item(count, 3).text())
|
2013-09-01 20:43:22 +00:00
|
|
|
if error:
|
2017-05-30 18:42:35 +00:00
|
|
|
QtWidgets.QMessageBox.warning(self, translate('OpenLP.FormattingTagForm', 'Validation Error'), error)
|
2013-09-01 20:43:22 +00:00
|
|
|
self.tag_table_widget.selectRow(count)
|
|
|
|
return
|
2013-08-31 08:52:44 +00:00
|
|
|
count += 1
|
2013-09-01 20:43:22 +00:00
|
|
|
self.services.save_tags()
|
2015-11-07 00:49:40 +00:00
|
|
|
QtWidgets.QDialog.accept(self)
|
2010-12-23 17:42:28 +00:00
|
|
|
|
2012-05-05 16:03:40 +00:00
|
|
|
def _reloadTable(self):
|
2010-12-23 17:42:28 +00:00
|
|
|
"""
|
|
|
|
Reset List for loading.
|
|
|
|
"""
|
2013-09-28 20:55:25 +00:00
|
|
|
self.reloading = True
|
2013-08-25 13:29:00 +00:00
|
|
|
self.tag_table_widget_read.clearContents()
|
|
|
|
self.tag_table_widget_read.setRowCount(0)
|
2013-03-06 22:27:22 +00:00
|
|
|
self.tag_table_widget.clearContents()
|
|
|
|
self.tag_table_widget.setRowCount(0)
|
2013-08-25 13:29:00 +00:00
|
|
|
self.new_button.setEnabled(True)
|
|
|
|
self.delete_button.setEnabled(False)
|
2013-12-24 15:55:01 +00:00
|
|
|
for line_number, html in enumerate(FormattingTags.get_html_tags()):
|
2013-10-04 19:27:53 +00:00
|
|
|
if html['protected']:
|
2013-08-25 13:29:00 +00:00
|
|
|
line = self.tag_table_widget_read.rowCount()
|
|
|
|
self.tag_table_widget_read.setRowCount(line + 1)
|
2015-11-07 00:49:40 +00:00
|
|
|
self.tag_table_widget_read.setItem(line, 0, QtWidgets.QTableWidgetItem(html['desc']))
|
|
|
|
self.tag_table_widget_read.setItem(line, 1, QtWidgets.QTableWidgetItem(self._strip(html['start tag'])))
|
|
|
|
self.tag_table_widget_read.setItem(line, 2, QtWidgets.QTableWidgetItem(html['start html']))
|
|
|
|
self.tag_table_widget_read.setItem(line, 3, QtWidgets.QTableWidgetItem(html['end html']))
|
2013-08-25 13:29:00 +00:00
|
|
|
self.tag_table_widget_read.resizeRowsToContents()
|
|
|
|
else:
|
|
|
|
line = self.tag_table_widget.rowCount()
|
|
|
|
self.tag_table_widget.setRowCount(line + 1)
|
2015-11-07 00:49:40 +00:00
|
|
|
self.tag_table_widget.setItem(line, 0, QtWidgets.QTableWidgetItem(html['desc']))
|
|
|
|
self.tag_table_widget.setItem(line, 1, QtWidgets.QTableWidgetItem(self._strip(html['start tag'])))
|
|
|
|
self.tag_table_widget.setItem(line, 2, QtWidgets.QTableWidgetItem(html['start html']))
|
|
|
|
self.tag_table_widget.setItem(line, 3, QtWidgets.QTableWidgetItem(html['end html']))
|
2013-08-25 13:29:00 +00:00
|
|
|
self.tag_table_widget.resizeRowsToContents()
|
|
|
|
# Permanent (persistent) tags do not have this key
|
2013-10-04 19:27:53 +00:00
|
|
|
html['temporary'] = False
|
2013-09-28 20:55:25 +00:00
|
|
|
self.reloading = False
|
2013-08-25 13:29:00 +00:00
|
|
|
|
|
|
|
def on_current_cell_changed(self, cur_row, cur_col, pre_row, pre_col):
|
|
|
|
"""
|
|
|
|
This function processes all user edits in the table. It is called on each cell change.
|
|
|
|
"""
|
2013-09-15 06:37:43 +00:00
|
|
|
if self.is_deleting:
|
|
|
|
self.is_deleting = False
|
|
|
|
return
|
2013-09-28 20:55:25 +00:00
|
|
|
if self.reloading:
|
|
|
|
return
|
2013-08-25 13:29:00 +00:00
|
|
|
# only process for editable rows
|
2013-08-31 17:20:43 +00:00
|
|
|
if self.tag_table_widget.item(pre_row, 0):
|
2013-08-25 13:29:00 +00:00
|
|
|
item = self.tag_table_widget.item(pre_row, pre_col)
|
2013-08-31 11:43:05 +00:00
|
|
|
text = item.text()
|
2013-08-31 17:20:43 +00:00
|
|
|
errors = None
|
2013-09-08 21:13:15 +00:00
|
|
|
if pre_col is EditColumn.Description:
|
2013-09-02 20:59:19 +00:00
|
|
|
if not text:
|
|
|
|
errors = translate('OpenLP.FormattingTagForm', 'Description is missing')
|
2013-09-08 21:13:15 +00:00
|
|
|
elif pre_col is EditColumn.Tag:
|
2013-09-02 20:59:19 +00:00
|
|
|
if not text:
|
|
|
|
errors = translate('OpenLP.FormattingTagForm', 'Tag is missing')
|
2013-09-08 21:13:15 +00:00
|
|
|
elif pre_col is EditColumn.StartHtml:
|
2013-08-25 13:29:00 +00:00
|
|
|
# HTML edited
|
2013-08-31 08:52:44 +00:00
|
|
|
item = self.tag_table_widget.item(pre_row, 3)
|
2013-08-31 11:43:05 +00:00
|
|
|
end_html = item.text()
|
2013-08-31 08:52:44 +00:00
|
|
|
errors, tag = self.services.start_tag_changed(text, end_html)
|
|
|
|
if tag:
|
2015-11-07 00:49:40 +00:00
|
|
|
self.tag_table_widget.setItem(pre_row, 3, QtWidgets.QTableWidgetItem(tag))
|
2013-08-31 08:52:44 +00:00
|
|
|
self.tag_table_widget.resizeRowsToContents()
|
2013-09-08 21:13:15 +00:00
|
|
|
elif pre_col is EditColumn.EndHtml:
|
2013-08-31 17:20:43 +00:00
|
|
|
# HTML edited
|
|
|
|
item = self.tag_table_widget.item(pre_row, 2)
|
|
|
|
start_html = item.text()
|
|
|
|
errors, tag = self.services.end_tag_changed(start_html, text)
|
|
|
|
if tag:
|
2015-11-07 00:49:40 +00:00
|
|
|
self.tag_table_widget.setItem(pre_row, 3, QtWidgets.QTableWidgetItem(tag))
|
2013-08-31 17:20:43 +00:00
|
|
|
if errors:
|
2017-05-30 18:42:35 +00:00
|
|
|
QtWidgets.QMessageBox.warning(self, translate('OpenLP.FormattingTagForm', 'Validation Error'), errors)
|
2013-08-31 17:20:43 +00:00
|
|
|
self.tag_table_widget.resizeRowsToContents()
|