Пример #1
0
class FormattingTagForm(QtWidgets.QDialog, Ui_FormattingTagDialog,
                        FormattingTagController):
    """
    The :class:`FormattingTagForm` manages the settings tab .
    """
    def __init__(self, parent):
        """
        Constructor
        """
        super(FormattingTagForm, self).__init__(
            parent, QtCore.Qt.WindowSystemMenuHint | QtCore.Qt.WindowTitleHint
            | QtCore.Qt.WindowCloseButtonHint)
        self.setup_ui(self)
        self._setup()

    def _setup(self):
        """
        Set up the class. This method is mocked out by the tests.
        """
        self.services = FormattingTagController()
        self.tag_table_widget.itemSelectionChanged.connect(
            self.on_row_selected)
        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)
        self.button_box.rejected.connect(self.close)
        # Forces reloading of tags from openlp configuration.
        FormattingTags.load_tags()
        self.is_deleting = False
        self.reloading = False

    def exec(self):
        """
        Load Display and set field state.
        """
        # Create initial copy from master
        self._reloadTable()
        return QtWidgets.QDialog.exec(self)

    def on_row_selected(self):
        """
        Table Row selected so display items and set field state.
        """
        self.delete_button.setEnabled(True)

    def on_new_clicked(self):
        """
        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,
            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)))
        self.tag_table_widget.setItem(
            new_row, 2,
            QtWidgets.QTableWidgetItem(
                translate('OpenLP.FormattingTagForm', '<HTML here>')))
        self.tag_table_widget.setItem(new_row, 3,
                                      QtWidgets.QTableWidgetItem(''))
        self.tag_table_widget.resizeRowsToContents()
        self.tag_table_widget.scrollToBottom()
        self.tag_table_widget.selectRow(new_row)

    def on_delete_clicked(self):
        """
        Delete selected custom row.
        """
        selected = self.tag_table_widget.currentRow()
        if selected != -1:
            self.is_deleting = True
            self.tag_table_widget.removeRow(selected)

    def accept(self):
        """
        Update Custom Tag details if not duplicate and save the data.
        """
        count = 0
        self.services.pre_save()
        while count < self.tag_table_widget.rowCount():
            error = 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())
            if error:
                QtWidgets.QMessageBox.warning(
                    self,
                    translate('OpenLP.FormattingTagForm', 'Validation Error'),
                    error)
                self.tag_table_widget.selectRow(count)
                return
            count += 1
        self.services.save_tags()
        QtWidgets.QDialog.accept(self)

    def _reloadTable(self):
        """
        Reset List for loading.
        """
        self.reloading = True
        self.tag_table_widget_read.clearContents()
        self.tag_table_widget_read.setRowCount(0)
        self.tag_table_widget.clearContents()
        self.tag_table_widget.setRowCount(0)
        self.new_button.setEnabled(True)
        self.delete_button.setEnabled(False)
        for line_number, html in enumerate(FormattingTags.get_html_tags()):
            if html['protected']:
                line = self.tag_table_widget_read.rowCount()
                self.tag_table_widget_read.setRowCount(line + 1)
                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']))
                self.tag_table_widget_read.resizeRowsToContents()
            else:
                line = self.tag_table_widget.rowCount()
                self.tag_table_widget.setRowCount(line + 1)
                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']))
                self.tag_table_widget.resizeRowsToContents()
                # Permanent (persistent) tags do not have this key
                html['temporary'] = False
        self.reloading = False

    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.
        """
        if self.is_deleting:
            self.is_deleting = False
            return
        if self.reloading:
            return
        # only process for editable rows
        if self.tag_table_widget.item(pre_row, 0):
            item = self.tag_table_widget.item(pre_row, pre_col)
            text = item.text()
            errors = None
            if pre_col is EditColumn.Description:
                if not text:
                    errors = translate('OpenLP.FormattingTagForm',
                                       'Description is missing')
            elif pre_col is EditColumn.Tag:
                if not text:
                    errors = translate('OpenLP.FormattingTagForm',
                                       'Tag is missing')
            elif pre_col is EditColumn.StartHtml:
                # HTML edited
                item = self.tag_table_widget.item(pre_row, 3)
                end_html = item.text()
                errors, tag = self.services.start_tag_changed(text, end_html)
                if tag:
                    self.tag_table_widget.setItem(
                        pre_row, 3, QtWidgets.QTableWidgetItem(tag))
                self.tag_table_widget.resizeRowsToContents()
            elif pre_col is EditColumn.EndHtml:
                # 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:
                    self.tag_table_widget.setItem(
                        pre_row, 3, QtWidgets.QTableWidgetItem(tag))
            if errors:
                QtWidgets.QMessageBox.warning(
                    self,
                    translate('OpenLP.FormattingTagForm', 'Validation Error'),
                    errors)
            self.tag_table_widget.resizeRowsToContents()
Пример #2
0
class FormattingTagForm(QtGui.QDialog, Ui_FormattingTagDialog, FormattingTagController):
    """
    The :class:`FormattingTagForm` manages the settings tab .
    """

    def __init__(self, parent):
        """
        Constructor
        """
        super(FormattingTagForm, self).__init__(parent)
        self.setupUi(self)
        self._setup()

    def _setup(self):
        """
        Set up the class. This method is mocked out by the tests.
        """
        self.services = FormattingTagController()
        self.tag_table_widget.itemSelectionChanged.connect(self.on_row_selected)
        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)
        self.button_box.rejected.connect(self.close)
        # Forces reloading of tags from openlp configuration.
        FormattingTags.load_tags()
        self.is_deleting = False
        self.reloading = False

    def exec_(self):
        """
        Load Display and set field state.
        """
        # Create initial copy from master
        self._reloadTable()
        return QtGui.QDialog.exec_(self)

    def on_row_selected(self):
        """
        Table Row selected so display items and set field state.
        """
        self.delete_button.setEnabled(True)

    def on_new_clicked(self):
        """
        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 %d" % new_row))
        )
        self.tag_table_widget.setItem(new_row, 1, QtGui.QTableWidgetItem("n%d" % new_row))
        self.tag_table_widget.setItem(
            new_row, 2, QtGui.QTableWidgetItem(translate("OpenLP.FormattingTagForm", "<HTML here>"))
        )
        self.tag_table_widget.setItem(new_row, 3, QtGui.QTableWidgetItem(""))
        self.tag_table_widget.resizeRowsToContents()
        self.tag_table_widget.scrollToBottom()
        self.tag_table_widget.selectRow(new_row)

    def on_delete_clicked(self):
        """
        Delete selected custom row.
        """
        selected = self.tag_table_widget.currentRow()
        if selected != -1:
            self.is_deleting = True
            self.tag_table_widget.removeRow(selected)

    def accept(self):
        """
        Update Custom Tag details if not duplicate and save the data.
        """
        count = 0
        self.services.pre_save()
        while count < self.tag_table_widget.rowCount():
            error = 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(),
            )
            if error:
                QtGui.QMessageBox.warning(
                    self, translate("OpenLP.FormattingTagForm", "Validation Error"), error, QtGui.QMessageBox.Ok
                )
                self.tag_table_widget.selectRow(count)
                return
            count += 1
        self.services.save_tags()
        QtGui.QDialog.accept(self)

    def _reloadTable(self):
        """
        Reset List for loading.
        """
        self.reloading = True
        self.tag_table_widget_read.clearContents()
        self.tag_table_widget_read.setRowCount(0)
        self.tag_table_widget.clearContents()
        self.tag_table_widget.setRowCount(0)
        self.new_button.setEnabled(True)
        self.delete_button.setEnabled(False)
        for line_number, html in enumerate(FormattingTags.get_html_tags()):
            if html["protected"]:
                line = self.tag_table_widget_read.rowCount()
                self.tag_table_widget_read.setRowCount(line + 1)
                self.tag_table_widget_read.setItem(line, 0, QtGui.QTableWidgetItem(html["desc"]))
                self.tag_table_widget_read.setItem(line, 1, QtGui.QTableWidgetItem(self._strip(html["start tag"])))
                self.tag_table_widget_read.setItem(line, 2, QtGui.QTableWidgetItem(html["start html"]))
                self.tag_table_widget_read.setItem(line, 3, QtGui.QTableWidgetItem(html["end html"]))
                self.tag_table_widget_read.resizeRowsToContents()
            else:
                line = self.tag_table_widget.rowCount()
                self.tag_table_widget.setRowCount(line + 1)
                self.tag_table_widget.setItem(line, 0, QtGui.QTableWidgetItem(html["desc"]))
                self.tag_table_widget.setItem(line, 1, QtGui.QTableWidgetItem(self._strip(html["start tag"])))
                self.tag_table_widget.setItem(line, 2, QtGui.QTableWidgetItem(html["start html"]))
                self.tag_table_widget.setItem(line, 3, QtGui.QTableWidgetItem(html["end html"]))
                self.tag_table_widget.resizeRowsToContents()
                # Permanent (persistent) tags do not have this key
                html["temporary"] = False
        self.reloading = False

    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.
        """
        if self.is_deleting:
            self.is_deleting = False
            return
        if self.reloading:
            return
        # only process for editable rows
        if self.tag_table_widget.item(pre_row, 0):
            item = self.tag_table_widget.item(pre_row, pre_col)
            text = item.text()
            errors = None
            if pre_col is EditColumn.Description:
                if not text:
                    errors = translate("OpenLP.FormattingTagForm", "Description is missing")
            elif pre_col is EditColumn.Tag:
                if not text:
                    errors = translate("OpenLP.FormattingTagForm", "Tag is missing")
            elif pre_col is EditColumn.StartHtml:
                # HTML edited
                item = self.tag_table_widget.item(pre_row, 3)
                end_html = 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()
            elif pre_col is EditColumn.EndHtml:
                # 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:
                    self.tag_table_widget.setItem(pre_row, 3, QtGui.QTableWidgetItem(tag))
            if errors:
                QtGui.QMessageBox.warning(
                    self, translate("OpenLP.FormattingTagForm", "Validation Error"), errors, QtGui.QMessageBox.Ok
                )
            self.tag_table_widget.resizeRowsToContents()