From 31e6db8757538d04f422301b2ff9d1d66ba39c60 Mon Sep 17 00:00:00 2001 From: blacksun Date: Sun, 13 May 2018 19:03:38 +0000 Subject: [PATCH] Element editor : alignment of text field can be edited git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@5362 bfdf4180-ca20-0410-9c96-a3a8aa849046 --- .../graphicspart/partdynamictextfield.cpp | 83 +++++++++++++++++++ .../graphicspart/partdynamictextfield.h | 12 ++- sources/editor/ui/dynamictextfieldeditor.cpp | 14 ++++ sources/editor/ui/dynamictextfieldeditor.h | 2 +- sources/editor/ui/dynamictextfieldeditor.ui | 7 ++ sources/ui/alignmenttextdialog.cpp | 23 +++-- sources/ui/alignmenttextdialog.h | 4 +- sources/ui/dynamicelementtextmodel.cpp | 2 +- 8 files changed, 129 insertions(+), 18 deletions(-) diff --git a/sources/editor/graphicspart/partdynamictextfield.cpp b/sources/editor/graphicspart/partdynamictextfield.cpp index 2166db5c4..49b65c678 100644 --- a/sources/editor/graphicspart/partdynamictextfield.cpp +++ b/sources/editor/graphicspart/partdynamictextfield.cpp @@ -99,6 +99,21 @@ const QDomElement PartDynamicTextField::toXml(QDomDocument &dom_doc) const QMetaEnum me = DynamicElementTextItem::textFromMetaEnum(); root_element.setAttribute("text_from", me.valueToKey(m_text_from)); + me = QMetaEnum::fromType(); + if(this->alignment() &Qt::AlignRight) + root_element.setAttribute("Halignment", me.valueToKey(Qt::AlignRight)); + else if(this->alignment() &Qt::AlignLeft) + root_element.setAttribute("Halignment", me.valueToKey(Qt::AlignLeft)); + else if(this->alignment() &Qt::AlignHCenter) + root_element.setAttribute("Halignment", me.valueToKey(Qt::AlignHCenter)); + + if(this->alignment() &Qt::AlignBottom) + root_element.setAttribute("Valignment", me.valueToKey(Qt::AlignBottom)); + else if(this->alignment() & Qt::AlignTop) + root_element.setAttribute("Valignment", me.valueToKey(Qt::AlignTop)); + else if(this->alignment() &Qt::AlignVCenter) + root_element.setAttribute("Valignment", me.valueToKey(Qt::AlignVCenter)); + QDomElement dom_text = dom_doc.createElement("text"); dom_text.appendChild(dom_doc.createTextNode(toPlainText())); root_element.appendChild(dom_text); @@ -152,13 +167,21 @@ void PartDynamicTextField::fromXml(const QDomElement &dom_elmt) QMetaEnum me = DynamicElementTextItem::textFromMetaEnum(); m_text_from = DynamicElementTextItem::TextFrom(me.keyToValue(dom_elmt.attribute("text_from").toStdString().data())); + + me = QMetaEnum::fromType(); + if(dom_elmt.hasAttribute("Halignment")) + setAlignment(Qt::Alignment(me.keyToValue(dom_elmt.attribute("Halignment").toStdString().data()))); + if(dom_elmt.hasAttribute(("Valignment"))) + setAlignment(Qt::Alignment(me.keyToValue(dom_elmt.attribute("Valignment").toStdString().data())) | this->alignment()); //Text QDomElement dom_text = dom_elmt.firstChildElement("text"); if (!dom_text.isNull()) { m_text = dom_text.text(); + m_block_alignment = true; setPlainText(m_text); + m_block_alignment = false; } //Info name @@ -363,6 +386,10 @@ void PartDynamicTextField::setTextWidth(qreal width) void PartDynamicTextField::setPlainText(const QString &text) { + if(toPlainText() == text) + return; + + prepareAlignment(); QGraphicsTextItem::setPlainText(text); //User define a text width @@ -377,6 +404,17 @@ void PartDynamicTextField::setPlainText(const QString &text) } } } + finishAlignment(); +} + +void PartDynamicTextField::setAlignment(Qt::Alignment alignment) +{ + m_alignment = alignment; + emit alignmentChanged(m_alignment); +} + +Qt::Alignment PartDynamicTextField::alignment() const { + return m_alignment; } /** @@ -509,3 +547,48 @@ void PartDynamicTextField::elementInfoChanged() else if (m_text_from == DynamicElementTextItem::CompositeText && elementScene()) setPlainText(autonum::AssignVariables::replaceVariable(m_composite_text, elementScene()->elementInformation())); } + +void PartDynamicTextField::prepareAlignment() +{ + m_alignment_rect = boundingRect(); +} + +void PartDynamicTextField::finishAlignment() +{ + if(m_block_alignment) + return; + + QTransform transform; + transform.rotate(this->rotation()); + qreal x,xa, y,ya; + x=xa=0; + y=ya=0; + + if(m_alignment &Qt::AlignRight) + { + x = m_alignment_rect.right(); + xa = boundingRect().right(); + } + else if(m_alignment &Qt::AlignHCenter) + { + x = m_alignment_rect.center().x(); + xa = boundingRect().center().x(); + } + + if(m_alignment &Qt::AlignBottom) + { + y = m_alignment_rect.bottom(); + ya = boundingRect().bottom(); + } + else if(m_alignment &Qt::AlignVCenter) + { + y = m_alignment_rect.center().y(); + ya = boundingRect().center().y(); + } + + QPointF p = transform.map(QPointF(x,y)); + QPointF pa = transform.map(QPointF(xa,ya)); + QPointF diff = pa-p; + + setPos(this->pos() - diff); +} diff --git a/sources/editor/graphicspart/partdynamictextfield.h b/sources/editor/graphicspart/partdynamictextfield.h index cd84b7878..ec2f073cf 100644 --- a/sources/editor/graphicspart/partdynamictextfield.h +++ b/sources/editor/graphicspart/partdynamictextfield.h @@ -41,6 +41,7 @@ class PartDynamicTextField : public QGraphicsTextItem, public CustomElementPart Q_PROPERTY(int fontSize READ fontSize WRITE setFontSize NOTIFY fontSizeChanged) Q_PROPERTY(bool frame READ frame WRITE setFrame NOTIFY frameChanged) Q_PROPERTY(qreal textWidth READ textWidth WRITE setTextWidth NOTIFY textWidthChanged) + Q_PROPERTY(Qt::Alignment alignment READ alignment WRITE setAlignment NOTIFY alignmentChanged) public: ///PROPERTY @@ -57,6 +58,7 @@ class PartDynamicTextField : public QGraphicsTextItem, public CustomElementPart void fontSizeChanged(int size); void frameChanged(bool frame); void textWidthChanged(qreal width); + void alignmentChanged(Qt::Alignment alignment); public: PartDynamicTextField(QETElementEditor *editor, QGraphicsItem *parent = nullptr); @@ -92,6 +94,8 @@ class PartDynamicTextField : public QGraphicsTextItem, public CustomElementPart bool frame() const; void setTextWidth(qreal width); void setPlainText(const QString &text); + void setAlignment(Qt::Alignment alignment); + Qt::Alignment alignment() const; protected: void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override; @@ -103,6 +107,9 @@ class PartDynamicTextField : public QGraphicsTextItem, public CustomElementPart private: void elementInfoChanged(); + void prepareAlignment(); + void finishAlignment(); + private: QPointF m_origine_pos, m_saved_point; @@ -112,8 +119,11 @@ class PartDynamicTextField : public QGraphicsTextItem, public CustomElementPart DynamicElementTextItem::TextFrom m_text_from = DynamicElementTextItem::UserText; QUuid m_uuid; bool m_frame = false, - m_first_add = true; + m_first_add = true, + m_block_alignment = false; qreal m_text_width = -1; + Qt::Alignment m_alignment = Qt::AlignTop|Qt::AlignLeft; + QRectF m_alignment_rect; }; #endif // PARTDYNAMICTEXTFIELD_H diff --git a/sources/editor/ui/dynamictextfieldeditor.cpp b/sources/editor/ui/dynamictextfieldeditor.cpp index c0a29972f..76d3d1e30 100644 --- a/sources/editor/ui/dynamictextfieldeditor.cpp +++ b/sources/editor/ui/dynamictextfieldeditor.cpp @@ -23,6 +23,7 @@ #include "qetelementeditor.h" #include "qetapp.h" #include "compositetexteditdialog.h" +#include "alignmenttextdialog.h" #include #include @@ -292,3 +293,16 @@ void DynamicTextFieldEditor::on_m_composite_text_pb_clicked() } } } + +void DynamicTextFieldEditor::on_m_alignment_pb_clicked() +{ + AlignmentTextDialog atd(m_text_field.data()->alignment(), this); + atd.exec(); + + if(atd.alignment() != m_text_field.data()->alignment()) + { + QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_text_field.data(), "alignment", QVariant(m_text_field.data()->alignment()), QVariant(atd.alignment())); + undo->setText(tr("Modifier l'alignement d'un champ texte")); + undoStack().push(undo); + } +} diff --git a/sources/editor/ui/dynamictextfieldeditor.h b/sources/editor/ui/dynamictextfieldeditor.h index 768b5e2b9..ce5315860 100644 --- a/sources/editor/ui/dynamictextfieldeditor.h +++ b/sources/editor/ui/dynamictextfieldeditor.h @@ -56,8 +56,8 @@ class DynamicTextFieldEditor : public ElementItemEditor void on_m_width_sb_editingFinished(); void on_m_elmt_info_cb_activated(const QString &arg1); void on_m_text_from_cb_activated(int index); - void on_m_composite_text_pb_clicked(); + void on_m_alignment_pb_clicked(); private: Ui::DynamicTextFieldEditor *ui; diff --git a/sources/editor/ui/dynamictextfieldeditor.ui b/sources/editor/ui/dynamictextfieldeditor.ui index e8eb12714..f352935fc 100644 --- a/sources/editor/ui/dynamictextfieldeditor.ui +++ b/sources/editor/ui/dynamictextfieldeditor.ui @@ -196,6 +196,13 @@ + + + + Alignement + + + diff --git a/sources/ui/alignmenttextdialog.cpp b/sources/ui/alignmenttextdialog.cpp index fddeb644e..ebfc1e064 100644 --- a/sources/ui/alignmenttextdialog.cpp +++ b/sources/ui/alignmenttextdialog.cpp @@ -19,30 +19,29 @@ #include "ui_alignmenttextdialog.h" #include "dynamicelementtextitem.h" -AlignmentTextDialog::AlignmentTextDialog(DynamicElementTextItem *text, QWidget *parent) : +AlignmentTextDialog::AlignmentTextDialog(Qt::Alignment alignment, QWidget *parent) : QDialog(parent), ui(new Ui::AlignmentTextDialog) { ui->setupUi(this); - Qt::Alignment align = text->alignment(); - if(align == (Qt::AlignTop|Qt::AlignLeft)) + if(alignment == (Qt::AlignTop|Qt::AlignLeft)) ui->top_left->setChecked(true); - else if(align == (Qt::AlignTop|Qt::AlignHCenter)) + else if(alignment == (Qt::AlignTop|Qt::AlignHCenter)) ui->top->setChecked(true); - else if(align == (Qt::AlignTop|Qt::AlignRight)) + else if(alignment == (Qt::AlignTop|Qt::AlignRight)) ui->top_right->setChecked(true); - else if(align == (Qt::AlignVCenter|Qt::AlignLeft)) + else if(alignment == (Qt::AlignVCenter|Qt::AlignLeft)) ui->left->setChecked(true); - else if(align == Qt::AlignCenter) + else if(alignment == Qt::AlignCenter) ui->center->setChecked(true); - else if(align == (Qt::AlignVCenter|Qt::AlignRight)) + else if(alignment == (Qt::AlignVCenter|Qt::AlignRight)) ui->right->setChecked(true); - else if(align == (Qt::AlignBottom|Qt::AlignLeft)) + else if(alignment == (Qt::AlignBottom|Qt::AlignLeft)) ui->bottom_left->setChecked(true); - else if(align == (Qt::AlignBottom|Qt::AlignHCenter)) + else if(alignment == (Qt::AlignBottom|Qt::AlignHCenter)) ui->bottom->setChecked(true); - else if(align == (Qt::AlignBottom|Qt::AlignRight)) + else if(alignment == (Qt::AlignBottom|Qt::AlignRight)) ui->bottom_right->setChecked(true); } @@ -81,7 +80,7 @@ Qt::Alignment AlignmentTextDialog::alignment() const bool AlignmentTextDialog::event(QEvent *event) { - //Little hack to set focus to a radio button + //Little hack when this dialog is called from a QAbstractItemModel, to set focus to a radio button //if we not do that, when the user click on the title bar (for move the dialog) or try to resize the dialog, //the dialog lose focus and close. if(event->type() == QEvent::Show && m_first_show) diff --git a/sources/ui/alignmenttextdialog.h b/sources/ui/alignmenttextdialog.h index 5e9b7b625..3d5858ab8 100644 --- a/sources/ui/alignmenttextdialog.h +++ b/sources/ui/alignmenttextdialog.h @@ -20,8 +20,6 @@ #include -class DynamicElementTextItem; - namespace Ui { class AlignmentTextDialog; } @@ -31,7 +29,7 @@ class AlignmentTextDialog : public QDialog Q_OBJECT public: - explicit AlignmentTextDialog(DynamicElementTextItem *text, QWidget *parent = nullptr); + explicit AlignmentTextDialog(Qt::Alignment alignment, QWidget *parent = nullptr); ~AlignmentTextDialog(); Qt::Alignment alignment() const; diff --git a/sources/ui/dynamicelementtextmodel.cpp b/sources/ui/dynamicelementtextmodel.cpp index dcc7b1746..56e822980 100644 --- a/sources/ui/dynamicelementtextmodel.cpp +++ b/sources/ui/dynamicelementtextmodel.cpp @@ -1406,7 +1406,7 @@ QWidget *DynamicTextItemDelegate::createEditor(QWidget *parent, const QStyleOpti if(!deti) break; - AlignmentTextDialog *atd = new AlignmentTextDialog(deti, parent); + AlignmentTextDialog *atd = new AlignmentTextDialog(deti->alignment(), parent); atd->setObjectName("alignment_text"); return atd; }