From a07e9734825388f63bbb24b5159e9c015683c80b Mon Sep 17 00:00:00 2001 From: Martin Marmsoler Date: Thu, 28 May 2020 18:29:56 +0200 Subject: [PATCH] make partTextEditor capable to modify multiple parts at the same time --- sources/editor/ui/texteditor.cpp | 203 ++++++++++++++++++++----------- 1 file changed, 131 insertions(+), 72 deletions(-) diff --git a/sources/editor/ui/texteditor.cpp b/sources/editor/ui/texteditor.cpp index 05b9f074e..97b5df52b 100644 --- a/sources/editor/ui/texteditor.cpp +++ b/sources/editor/ui/texteditor.cpp @@ -57,10 +57,7 @@ void TextEditor::updateForm() return; } - for (QMetaObject::Connection c : m_edit_connection) { - disconnect(c); - } - m_edit_connection.clear(); + disconnectEditConnection(); ui->m_line_edit->setText(m_text->toPlainText()); ui->m_x_sb->setValue(m_text->pos().x()); @@ -73,6 +70,30 @@ void TextEditor::updateForm() setUpEditConnection(); } +void TextEditor::setUpChangeConnection(QPointer part) { + assert(m_change_connection.isEmpty()); + m_change_connection << connect(part, &PartText::plainTextChanged, this, &TextEditor::updateForm); + m_change_connection << connect(part, &PartText::xChanged, this, &TextEditor::updateForm); + m_change_connection << connect(part, &PartText::yChanged, this, &TextEditor::updateForm); + m_change_connection << connect(part, &PartText::rotationChanged, this, &TextEditor::updateForm); + m_change_connection << connect(part, &PartText::fontChanged, this, &TextEditor::updateForm); + m_change_connection << connect(part, &PartText::colorChanged, this, &TextEditor::updateForm); +} + +void TextEditor::disconnectChangeConnection() { + for (QMetaObject::Connection c : m_change_connection) { + disconnect(c); + } + m_change_connection.clear(); +} + +void TextEditor::disconnectEditConnection() { + for (QMetaObject::Connection c : m_edit_connection) { + disconnect(c); + } + m_edit_connection.clear(); +} + /** * @brief TextEditor::setPart * Set the current text to edit. @@ -85,10 +106,7 @@ bool TextEditor::setPart(CustomElementPart *part) if (!part) { m_text = nullptr; - for (QMetaObject::Connection c : m_change_connection) { - disconnect(c); - } - m_change_connection.clear(); + disconnectChangeConnection(); return true; } @@ -99,13 +117,7 @@ bool TextEditor::setPart(CustomElementPart *part) } m_text = part_text; - m_change_connection.clear(); - m_change_connection << connect(part_text, &PartText::plainTextChanged, this, &TextEditor::updateForm); - m_change_connection << connect(part_text, &PartText::xChanged, this, &TextEditor::updateForm); - m_change_connection << connect(part_text, &PartText::yChanged, this, &TextEditor::updateForm); - m_change_connection << connect(part_text, &PartText::rotationChanged, this, &TextEditor::updateForm); - m_change_connection << connect(part_text, &PartText::fontChanged, this, &TextEditor::updateForm); - m_change_connection << connect(part_text, &PartText::colorChanged, this, &TextEditor::updateForm); + setUpChangeConnection(m_text); updateForm(); return true; @@ -113,6 +125,37 @@ bool TextEditor::setPart(CustomElementPart *part) return false; } +bool TextEditor::setParts(QList parts) { + if (parts.isEmpty()) + { + m_parts.clear(); + if (m_text) { + disconnectChangeConnection(); + } + m_text = nullptr; + return true; + } + + if (PartText *part= static_cast(parts.first())) + { + if (m_text) { + disconnectChangeConnection(); + } + + m_text = part; + m_parts.clear(); + m_parts.append(part); + for (int i=1; i < parts.length(); i++) + m_parts.append(dynamic_cast(parts[i])); + + setUpChangeConnection(m_text); + + updateForm(); + return true; + } + return(false); +} + /** * @brief TextEditor::currentPart * @return The current part @@ -128,63 +171,72 @@ CustomElementPart *TextEditor::currentPart() const { */ void TextEditor::setUpEditConnection() { - for (QMetaObject::Connection c : m_edit_connection) { - disconnect(c); - } - m_edit_connection.clear(); + disconnectEditConnection(); m_edit_connection << connect(ui->m_line_edit, &QLineEdit::textEdited, [this]() { QString text_ = ui->m_line_edit->text(); - if (text_ != m_text->toPlainText()) - { - QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_text, "text", m_text->toPlainText(), text_); - undo->setText(tr("Modifier le contenu d'un champ texte")); - undoStack().push(undo); - } + for (auto partText: m_parts) { + if (text_ != partText->toPlainText()) + { + QPropertyUndoCommand *undo = new QPropertyUndoCommand(partText, "text", partText->toPlainText(), text_); + undo->setText(tr("Modifier le contenu d'un champ texte")); + undoStack().push(undo); + } + } }); m_edit_connection << connect(ui->m_x_sb, QOverload::of(&QSpinBox::valueChanged), [this]() { - QPointF pos(ui->m_x_sb->value(), ui->m_y_sb->value()); - if (pos != m_text->pos()) - { - QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_text, "pos", m_text->pos(), pos); - undo->setText(tr("Déplacer un champ texte")); - undo->setAnimated(true, false); - undoStack().push(undo); - } + QPointF pos(ui->m_x_sb->value(), 0); + for (auto partText: m_parts) { + pos.setY(partText->pos().y()); + if (pos != partText->pos()) + { + QPropertyUndoCommand *undo = new QPropertyUndoCommand(partText, "pos", partText->pos(), pos); + undo->setText(tr("Déplacer un champ texte")); + undo->setAnimated(true, false); + undoStack().push(undo); + } + } }); m_edit_connection << connect(ui->m_y_sb, QOverload::of(&QSpinBox::valueChanged), [this]() { - QPointF pos(ui->m_x_sb->value(), ui->m_y_sb->value()); - if (pos != m_text->pos()) - { - QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_text, "pos", m_text->pos(), pos); - undo->setText(tr("Déplacer un champ texte")); - undo->setAnimated(true, false); - undoStack().push(undo); - } + QPointF pos(0, ui->m_y_sb->value()); + for (auto partText: m_parts) { + pos.setX(partText->pos().x()); + if (pos != partText->pos()) + { + QPropertyUndoCommand *undo = new QPropertyUndoCommand(partText, "pos", partText->pos(), pos); + undo->setText(tr("Déplacer un champ texte")); + undo->setAnimated(true, false); + undoStack().push(undo); + } + } }); m_edit_connection << connect(ui->m_rotation_sb, QOverload::of(&QSpinBox::valueChanged), [this]() { - if (ui->m_rotation_sb->value() != m_text->rotation()) - { - QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_text, "rotation", m_text->rotation(), ui->m_rotation_sb->value()); - undo->setText(tr("Pivoter un champ texte")); - undo->setAnimated(true, false); - undoStack().push(undo); - } + for (auto partText: m_parts) { + if (ui->m_rotation_sb->value() != partText->rotation()) + { + QPropertyUndoCommand *undo = new QPropertyUndoCommand(partText, "rotation", partText->rotation(), ui->m_rotation_sb->value()); + undo->setText(tr("Pivoter un champ texte")); + undo->setAnimated(true, false); + undoStack().push(undo); + } + } }); m_edit_connection << connect(ui->m_size_sb, QOverload::of(&QSpinBox::valueChanged), [this]() { - if (m_text->font().pointSize() != ui->m_size_sb->value()) - { - QFont font_ = m_text->font(); - font_.setPointSize(ui->m_size_sb->value()); - QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_text, "font", m_text->font(), font_); - undo->setText(tr("Modifier la police d'un texte")); - undoStack().push(undo); - } + for (auto partText: m_parts) { + if (partText->font().pointSize() != ui->m_size_sb->value()) + { + QFont font_ = partText->font(); + font_.setPointSize(ui->m_size_sb->value()); + QPropertyUndoCommand *undo = new QPropertyUndoCommand(partText, "font", partText->font(), font_); + undo->setText(tr("Modifier la police d'un texte")); + undoStack().push(undo); + } + } }); } @@ -196,17 +248,22 @@ void TextEditor::on_m_font_pb_clicked() bool ok; QFont font_ = QFontDialog::getFont(&ok, m_text->font(), this); - if (ok && font_ != m_text->font()) - { - ui->m_size_sb->blockSignals(true); - ui->m_size_sb->setValue(font_.pointSize()); - ui->m_size_sb->blockSignals(false); + if (ok && font_ != m_text->font()) { + ui->m_size_sb->blockSignals(true); + ui->m_size_sb->setValue(font_.pointSize()); + ui->m_size_sb->blockSignals(false); - ui->m_font_pb->setText(font_.family()); - QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_text, "font", m_text->font(), font_); - undo->setText(tr("Modifier la police d'un texte")); - undoStack().push(undo); - } + ui->m_font_pb->setText(font_.family()); + } + + for (auto partText: m_parts) { + if (ok && font_ != partText->font()) + { + QPropertyUndoCommand *undo = new QPropertyUndoCommand(partText, "font", partText->font(), font_); + undo->setText(tr("Modifier la police d'un texte")); + undoStack().push(undo); + } + } } /** @@ -215,10 +272,12 @@ void TextEditor::on_m_font_pb_clicked() */ void TextEditor::on_m_color_pb_changed(const QColor &newColor) { - if (newColor != m_text->defaultTextColor()) - { - QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_text, "color", m_text->defaultTextColor(), newColor); - undo->setText(tr("Modifier la couleur d'un texte")); - undoStack().push(undo); - } + for (auto partText: m_parts) { + if (newColor != partText->defaultTextColor()) + { + QPropertyUndoCommand *undo = new QPropertyUndoCommand(partText, "color", partText->defaultTextColor(), newColor); + undo->setText(tr("Modifier la couleur d'un texte")); + undoStack().push(undo); + } + } }