openlp/openlp/core/ui/formattingtagform.py

234 lines
12 KiB
Python
Raw Normal View History

# -*- coding: utf-8 -*-
2012-12-29 15:25:29 +00:00
# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
###############################################################################
# OpenLP - Open Source Lyrics Projection #
# --------------------------------------------------------------------------- #
2012-12-29 20:56:56 +00:00
# Copyright (c) 2008-2013 Raoul Snyman #
# Portions copyright (c) 2008-2013 Tim Bentley, Gerald Britton, Jonathan #
# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, #
2012-11-11 21:16:14 +00:00
# Meinert Jordan, Armin Köhler, Erik Lundin, Edwin Lunando, Brian T. Meyer. #
2012-10-21 13:16:22 +00:00
# Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias Põldaru, #
# Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, #
# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Dave Warnock, #
# Frode Woldsund, Martin Zibricky, Patrick Zimmermann #
# --------------------------------------------------------------------------- #
# 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.
Custom tags can be defined and saved. The Custom Tag arrays are saved in a pickle so QSettings works on them. Base Tags
cannot be changed.
2011-02-07 15:55:02 +00:00
"""
2013-08-25 13:29:00 +00:00
import cgi
from PyQt4 import QtGui, QtCore
2013-02-05 08:05:28 +00:00
from openlp.core.lib import FormattingTags, translate
2011-02-21 22:10:08 +00:00
from openlp.core.lib.ui import critical_error_message_box
from openlp.core.ui.formattingtagdialog import Ui_FormattingTagDialog
2013-08-31 08:52:44 +00:00
from openlp.core.ui.formattingtagcontroller import FormattingTagController
2013-08-26 08:11:20 +00:00
class EDITCOLUMN(object):
"""
Hides the magic numbers for the table columns
"""
Description = 0
Tag = 1
StartHtml = 2
EndHtml = 3
2013-08-31 08:52:44 +00:00
class FormattingTagForm(QtGui.QDialog, Ui_FormattingTagDialog, FormattingTagController):
2011-02-07 15:55:02 +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
"""
2013-08-31 08:52:44 +00:00
super(FormattingTagForm, self).__init__(parent)
2011-02-20 17:06:58 +00:00
self.setupUi(self)
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)
2013-08-31 08:52:44 +00:00
self.save_button.clicked.connect(self.on_saved_clicked)
2013-08-25 13:29:00 +00:00
self.delete_button.clicked.connect(self.on_delete_clicked)
self.tag_table_widget.currentCellChanged.connect(self.on_current_cell_changed)
self.button_box.rejected.connect(self.close)
# Forces reloading of tags from openlp configuration.
FormattingTags.load_tags()
2011-02-20 17:06:58 +00:00
def exec_(self):
"""
2011-02-20 17:06:58 +00:00
Load Display and set field state.
"""
# Create initial copy from master
self._reloadTable()
2011-02-21 20:06:55 +00:00
return QtGui.QDialog.exec_(self)
2013-03-06 22:32:59 +00:00
def on_row_selected(self):
"""
Table Row selected so display items and set field state.
"""
2013-08-26 08:11:20 +00:00
self.delete_button.setEnabled(True)
2013-03-06 22:32:59 +00:00
def on_new_clicked(self):
"""
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)
self.tag_table_widget.setItem(new_row, 0,
QtGui.QTableWidgetItem(translate('OpenLP.FormattingTagForm', 'New Tag')))
self.tag_table_widget.setItem(new_row, 1,
QtGui.QTableWidgetItem('n%s' % unicode(new_row)))
self.tag_table_widget.setItem(new_row, 2,
QtGui.QTableWidgetItem(translate('OpenLP.FormattingTagForm', '<HTML here>')))
2013-08-31 08:52:44 +00:00
self.tag_table_widget.setItem(new_row, 3, QtGui.QTableWidgetItem(u""))
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)
2013-03-06 22:32:59 +00:00
def on_delete_clicked(self):
"""
2013-08-26 08:11:20 +00:00
Delete selected custom row.
"""
2013-08-26 08:11:20 +00:00
selected = self.tag_table_widget.currentRow()
if selected != -1:
self.tag_table_widget.removeRow(selected)
2013-03-06 22:32:59 +00:00
def on_saved_clicked(self):
"""
2011-05-08 05:42:48 +00:00
Update Custom Tag details if not duplicate and save the data.
"""
2013-08-31 08:52:44 +00:00
count = 0
self.services.pre_save()
while count < self.tag_table_widget.rowCount():
result = self.services.validate_for_save(self.tag_table_widget.item(count, 0).text(),
self.tag_table_widget.item(count, 1).text(), self.tag_table_widget.item(count, 2).text(),
self.tag_table_widget.item(count, 3).text())
count += 1
html_expands = FormattingTags.get_html_tags()
2013-08-31 08:52:44 +00:00
#if self.selected != -1:
# html = html_expands[self.selected]
# tag = self.tag_line_edit.text()
# for linenumber, html1 in enumerate(html_expands):
# if self._strip(html1[u'start tag']) == tag and linenumber != self.selected:
# critical_error_message_box(
# translate('OpenLP.FormattingTagForm', 'Update Error'),
# translate('OpenLP.FormattingTagForm', 'Tag %s already defined.') % tag)
# return
# html[u'desc'] = self.description_line_edit.text()
# html[u'start html'] = self.start_tag_line_edit.text()
# html[u'end html'] = self.end_tag_line_edit.text()
# html[u'start tag'] = u'{%s}' % tag
# html[u'end tag'] = u'{/%s}' % tag
# # Keep temporary tags when the user changes one.
# html[u'temporary'] = False
# self.selected = -1
#FormattingTags.save_html_tags()
#self._reloadTable()
def _reloadTable(self):
"""
Reset List for loading.
"""
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)
2012-05-02 18:25:37 +00:00
for linenumber, html in enumerate(FormattingTags.get_html_tags()):
2013-08-25 13:29:00 +00:00
if html[u'protected']:
line = self.tag_table_widget_read.rowCount()
self.tag_table_widget_read.setRowCount(line + 1)
print linenumber, self.tag_table_widget_read.rowCount()
self.tag_table_widget_read.setItem(line, 0, QtGui.QTableWidgetItem(html[u'desc']))
self.tag_table_widget_read.setItem(line, 1, QtGui.QTableWidgetItem(self._strip(html[u'start tag'])))
self.tag_table_widget_read.setItem(line, 2, QtGui.QTableWidgetItem(html[u'start html']))
self.tag_table_widget_read.setItem(line, 3, QtGui.QTableWidgetItem(html[u'end html']))
self.tag_table_widget_read.resizeRowsToContents()
else:
print self.tag_table_widget.rowCount(), html
line = self.tag_table_widget.rowCount()
self.tag_table_widget.setRowCount(line + 1)
self.tag_table_widget.setItem(line, 0, QtGui.QTableWidgetItem(html[u'desc']))
self.tag_table_widget.setItem(line, 1, QtGui.QTableWidgetItem(self._strip(html[u'start tag'])))
self.tag_table_widget.setItem(line, 2, QtGui.QTableWidgetItem(html[u'start html']))
self.tag_table_widget.setItem(line, 3, QtGui.QTableWidgetItem(html[u'end html']))
self.tag_table_widget.resizeRowsToContents()
# Permanent (persistent) tags do not have this key
html[u'temporary'] = 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.
"""
print cur_row, cur_col, pre_col, pre_col
# only process for editable rows
pre_row_item = self.tag_table_widget.item(pre_row, 0)
2013-08-31 08:52:44 +00:00
if pre_row_item:
2013-08-25 13:29:00 +00:00
item = self.tag_table_widget.item(pre_row, pre_col)
text = unicode(item.text())
2013-08-26 08:11:20 +00:00
if pre_col is EDITCOLUMN.Tag:
2013-08-25 13:29:00 +00:00
if text:
for row in range(self.tag_table_widget.rowCount()):
counting_item = self.tag_table_widget.item(row, 0)
if row != pre_row and counting_item and counting_item.text() == text:
answer = QtGui.QMessageBox.warning(self,
translate('OpenLP.FormattingTagForm', 'Validation Error'),
translate('OpenLP.FormattingTagForm',
'Tag %s is already defined. Please pick a different one.' % text),
QtGui.QMessageBox.Discard|QtGui.QMessageBox.Ok)
if answer == QtGui.QMessageBox.Discard:
2013-08-26 08:11:20 +00:00
break
2013-08-25 13:29:00 +00:00
else:
edit_item = item
break
else:
answer = None
if self.tag_table_widget.item(pre_row, 1).text() or self.tag_table_widget.item(pre_row, 2).text():
answer = QtGui.QMessageBox.warning(self,
translate('OpenLP.FormattingTagForm', 'Validation Error'),
translate('OpenLP.FormattingTagForm',
'No tag name defined. Do you want to delete the whole tag?'),
QtGui.QMessageBox.Yes|QtGui.QMessageBox.Discard|QtGui.QMessageBox.Cancel)
2013-08-31 08:52:44 +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)
end_html = unicode(item.text())
errors, tag = self.services.start_tag_changed(text, end_html)
if tag:
self.tag_table_widget.setItem(pre_row, 3, QtGui.QTableWidgetItem(tag))
self.tag_table_widget.resizeRowsToContents()
2013-08-26 08:11:20 +00:00
#if not edit_item:
# # select the tag cell in a empty row
# cur_row_item = self.tag_table_widget.item(cur_row, 0)
# if cur_row_item and (cur_row_item.flags() & QtCore.Qt.ItemIsEditable) and cur_row_item.text().isEmpty():
# edit_item = cur_row_item
#if edit_item:
# self.tag_table_widget.setCurrentItem(edit_item)
2013-08-25 13:29:00 +00:00
# enable delete_button for editable rows
cur_row = self.tag_table_widget.currentRow()
cur_row_item = self.tag_table_widget.item(cur_row, 0)
delete_enabled = bool(cur_row_item) and bool(cur_row_item.flags() & QtCore.Qt.ItemIsEditable)
delete_enabled &= cur_row < self.tag_table_widget.rowCount() - 1
self.delete_button.setEnabled(delete_enabled)