From 26a071a4d97e9192e9d5caa02e316c5a662cd80f Mon Sep 17 00:00:00 2001 From: blacksun Date: Fri, 8 Mar 2019 10:27:33 +0000 Subject: [PATCH] Dynamic element text item : The font of the dynamic texts can be individually be setted. git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@5764 bfdf4180-ca20-0410-9c96-a3a8aa849046 --- sources/qetgraphicsitem/diagramtextitem.cpp | 16 ++- sources/qetgraphicsitem/diagramtextitem.h | 5 + .../dynamicelementtextitem.cpp | 33 +++-- sources/ui/dynamicelementtextmodel.cpp | 123 +++++++++++++----- sources/ui/dynamicelementtextmodel.h | 1 + 5 files changed, 136 insertions(+), 42 deletions(-) diff --git a/sources/qetgraphicsitem/diagramtextitem.cpp b/sources/qetgraphicsitem/diagramtextitem.cpp index b08b93998..d046d9a70 100644 --- a/sources/qetgraphicsitem/diagramtextitem.cpp +++ b/sources/qetgraphicsitem/diagramtextitem.cpp @@ -162,7 +162,21 @@ void DiagramTextItem::setFontSize(int s) int DiagramTextItem::fontSize() const { - return font().pointSize(); + return font().pointSize(); +} + +void DiagramTextItem::setFont(const QFont &font) +{ + if (this->font() == font) { + return; + } + else + { + prepareAlignment(); + QGraphicsTextItem::setFont(font); + finishAlignment(); + emit fontChanged(font); + } } void DiagramTextItem::setColor(const QColor& color) diff --git a/sources/qetgraphicsitem/diagramtextitem.h b/sources/qetgraphicsitem/diagramtextitem.h index 681a5a018..1c19f6628 100644 --- a/sources/qetgraphicsitem/diagramtextitem.h +++ b/sources/qetgraphicsitem/diagramtextitem.h @@ -19,6 +19,7 @@ #define DIAGRAM_TEXT_ITEM_H #include +#include class Diagram; class QDomElement; @@ -37,6 +38,7 @@ class DiagramTextItem : public QGraphicsTextItem Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged) Q_PROPERTY(Qt::Alignment alignment READ alignment WRITE setAlignment NOTIFY alignmentChanged) Q_PROPERTY(QString plainText READ toPlainText WRITE setPlainText) + Q_PROPERTY(QFont font READ font WRITE setFont NOTIFY fontChanged) signals: @@ -44,6 +46,7 @@ class DiagramTextItem : public QGraphicsTextItem void colorChanged(QColor color); void alignmentChanged(Qt::Alignment alignment); void textEdited(const QString &old_str, const QString &new_str); + void fontChanged(QFont font); public: DiagramTextItem(QGraphicsItem * = nullptr); @@ -68,6 +71,8 @@ class DiagramTextItem : public QGraphicsTextItem void setFontSize(int s); int fontSize()const; + + void setFont(const QFont &font); void setColor(const QColor& color); QColor color() const; diff --git a/sources/qetgraphicsitem/dynamicelementtextitem.cpp b/sources/qetgraphicsitem/dynamicelementtextitem.cpp index 2e1e49253..1c7a84638 100644 --- a/sources/qetgraphicsitem/dynamicelementtextitem.cpp +++ b/sources/qetgraphicsitem/dynamicelementtextitem.cpp @@ -92,12 +92,10 @@ QDomElement DynamicElementTextItem::toXml(QDomDocument &dom_doc) const root_element.setAttribute("x", QString::number(pos().x())); root_element.setAttribute("y", QString::number(pos().y())); root_element.setAttribute("rotation", QString::number(QET::correctAngle(rotation()))); - root_element.setAttribute("font_size", font().pointSize()); root_element.setAttribute("uuid", m_uuid.toString()); - root_element.setAttribute("font_family", font().family()); - root_element.setAttribute("dynamicitemstyle", font().styleName()); root_element.setAttribute("frame", m_frame? "true" : "false"); root_element.setAttribute("text_width", QString::number(m_text_width)); + root_element.setAttribute("font", font().toString()); QMetaEnum me = textFromMetaEnum(); root_element.setAttribute("text_from", me.valueToKey(m_text_from)); @@ -162,10 +160,21 @@ void DynamicElementTextItem::fromXml(const QDomElement &dom_elmt) } QGraphicsTextItem::setRotation(dom_elmt.attribute("rotation", QString::number(0)).toDouble()); - QFont font_(dom_elmt.attribute("font_family", font().family()), - dom_elmt.attribute("font_size", QString::number(9)).toInt()); - font_.setStyleName(dom_elmt.attribute("dynamicitemstyle", font().styleName())); - setFont(font_); + + if (dom_elmt.hasAttribute("font")) + { + QFont font; + font.fromString(dom_elmt.attribute("font")); + setFont(font); + } + else //Retrocompatibility during the 0.7 dev because the font property was added lately. TODO remove this part in futur + { + QFont font_(dom_elmt.attribute("font_family", font().family()), + dom_elmt.attribute("font_size", QString::number(9)).toInt()); + font_.setStyleName(dom_elmt.attribute("dynamicitemstyle", font().styleName())); + setFont(font_); + } + m_uuid = QUuid(dom_elmt.attribute("uuid", QUuid::createUuid().toString())); setFrame(dom_elmt.attribute("frame", "false") == "true"? true : false); setTextWidth(dom_elmt.attribute("text_width", QString::number(-1)).toDouble()); @@ -643,13 +652,13 @@ void DynamicElementTextItem::paint(QPainter *painter, const QStyleOptionGraphics if (m_frame) { painter->save(); - painter->setFont(QETApp::dynamicTextsItemFont(fontSize())); + painter->setFont(QETApp::dynamicTextsItemFont(font().pointSize())); //Adjust the thickness according to the font size, qreal w=0.3; - if(fontSize() >= 5) + if(font().pointSize() >= 5) { - w = (qreal)fontSize()*0.1; + w = font().pointSizeF()*0.1; if(w > 2.5) w = 2.5; } @@ -659,9 +668,9 @@ void DynamicElementTextItem::paint(QPainter *painter, const QStyleOptionGraphics pen.setWidthF(w); painter->setPen(pen); painter->setRenderHint(QPainter::Antialiasing); - + //Adjust the rounding of the rectangle according to the size of the font - qreal ro = (qreal)fontSize()/3; + qreal ro = font().pointSizeF()/3; painter->drawRoundedRect(frameRect(), ro, ro); painter->restore(); diff --git a/sources/ui/dynamicelementtextmodel.cpp b/sources/ui/dynamicelementtextmodel.cpp index 8e4b4a52b..2ac8b1791 100644 --- a/sources/ui/dynamicelementtextmodel.cpp +++ b/sources/ui/dynamicelementtextmodel.cpp @@ -35,26 +35,27 @@ #include "addelementtextcommand.h" #include "alignmenttextdialog.h" -int src_txt_row = 0; -int usr_txt_row = 1; -int info_txt_row = 2; -int compo_txt_row = 3; -int size_txt_row = 4; -int color_txt_row = 5; -int frame_txt_row = 6; -int width_txt_row = 7; -int x_txt_row = 8; -int y_txt_row = 9; -int rot_txt_row = 10; -int align_txt_row = 11; +static int src_txt_row = 0; +static int usr_txt_row = 1; +static int info_txt_row = 2; +static int compo_txt_row = 3; +static int size_txt_row = 4; +static int font_txt_row = 5; +static int color_txt_row = 6; +static int frame_txt_row = 7; +static int width_txt_row = 8; +static int x_txt_row = 9; +static int y_txt_row = 10; +static int rot_txt_row = 11; +static int align_txt_row = 12; -int align_grp_row = 0; -int x_grp_row = 1; -int y_grp_row = 2; -int rot_grp_row = 3; -int adjust_grp_row = 4; -int frame_grp_row = 5; -int hold_to_bottom_grp_row = 6; +static int align_grp_row = 0; +static int x_grp_row = 1; +static int y_grp_row = 2; +static int rot_grp_row = 3; +static int adjust_grp_row = 4; +static int frame_grp_row = 5; +static int hold_to_bottom_grp_row = 6; DynamicElementTextModel::DynamicElementTextModel(Element *element, QObject *parent) : QStandardItemModel(parent), @@ -114,7 +115,7 @@ bool DynamicElementTextModel::indexIsInGroup(const QModelIndex &index) const /** * @brief DynamicElementTextModel::itemsForText * @param deti - * @return The items for the text @deti, if the text@deti is already managed by this model + * @return The items for the text @deti, if the text @deti is already managed by this model * the returned list is empty * The returned items haven't got the same number of childs if the text is in a group or not. */ @@ -193,12 +194,27 @@ QList DynamicElementTextModel::itemsForText(DynamicElementTextI size->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); QStandardItem *siza = new QStandardItem(); - siza->setData(deti->fontSize(), Qt::EditRole); + siza->setData(deti->font().pointSize(), Qt::EditRole); siza->setData(DynamicElementTextModel::size, Qt::UserRole+1); siza->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable); qsi_list.clear(); qsi_list << size << siza; + qsi->appendRow(qsi_list); + + //Font + QStandardItem *font = new QStandardItem(tr("Police")); + font->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + + QStandardItem *fonta = new QStandardItem(); + fonta->setFont(deti->font()); + fonta->setData(deti->font().family(), Qt::EditRole); + fonta->setData(DynamicElementTextModel::font, Qt::UserRole+1); + fonta->setData(deti->font(), Qt::UserRole+2); + fonta->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable); + + qsi_list.clear(); + qsi_list << font << fonta; qsi->appendRow(qsi_list); //Color @@ -470,12 +486,19 @@ QUndoCommand *DynamicElementTextModel::undoForEditedText(DynamicElementTextItem } int fs = text_qsi->child(size_txt_row,1)->data(Qt::EditRole).toInt(); - if (fs != deti->fontSize()) + if (fs != deti->font().pointSize()) { - QPropertyUndoCommand *quc = new QPropertyUndoCommand(deti, "fontSize", QVariant(deti->fontSize()), QVariant(fs), undo); + QPropertyUndoCommand *quc = new QPropertyUndoCommand(deti, "fontSize", QVariant(deti->font().pointSize()), QVariant(fs), undo); quc->setAnimated(true, false); quc->setText(tr("Modifier la taille d'un texte d'élément")); } + + QFont font = text_qsi->child(font_txt_row, 1)->data(Qt::UserRole+2).value(); + if (font != deti->font()) + { + QPropertyUndoCommand *quc = new QPropertyUndoCommand(deti, "font", QVariant(deti->font()), QVariant(font), undo); + quc->setText(tr("Modifier la police d'un texte d'élément")); + } QColor color = text_qsi->child(color_txt_row,1)->data(Qt::EditRole).value(); if(color != deti->color()) @@ -1209,7 +1232,7 @@ void DynamicElementTextModel::setConnection(DynamicElementTextItem *deti, bool s QList connection_list; connection_list << connect(deti, &DynamicElementTextItem::colorChanged, [deti,this](){this->updateDataFromText(deti, color);}); - connection_list << connect(deti, &DynamicElementTextItem::fontSizeChanged, [deti,this](){this->updateDataFromText(deti, size);}); + connection_list << connect(deti, &DynamicElementTextItem::fontChanged, [deti,this](){this->updateDataFromText(deti, font);}); connection_list << connect(deti, &DynamicElementTextItem::textFromChanged, [deti,this](){this->updateDataFromText(deti, textFrom);}); connection_list << connect(deti, &DynamicElementTextItem::textChanged, [deti,this](){this->updateDataFromText(deti, userText);}); connection_list << connect(deti, &DynamicElementTextItem::infoNameChanged, [deti,this](){this->updateDataFromText(deti, infoText);}); @@ -1317,8 +1340,17 @@ void DynamicElementTextModel::updateDataFromText(DynamicElementTextItem *deti, V break; } case size: - qsi->child(size_txt_row,1)->setData(deti->fontSize(), Qt::EditRole); + //qsi->child(size_txt_row,1)->setData(deti->fontSize(), Qt::EditRole); break; + case font: + { + QFont f(deti->font()); + qsi->child(font_txt_row,1)->setFont(f); + qsi->child(font_txt_row,1)->setData(f.family(), Qt::EditRole); + qsi->child(font_txt_row,1)->setData(f, Qt::UserRole+2); + qsi->child(size_txt_row,1)->setData(f.pointSize(), Qt::EditRole); + break; + } case color: { qsi->child(color_txt_row,1)->setData(deti->color(), Qt::EditRole); @@ -1380,6 +1412,7 @@ void DynamicElementTextModel::updateDataFromGroup(ElementTextItemGroup *group, D { qsi->child(x_grp_row,1)->setData(group->pos().x(), Qt::EditRole); qsi->child(y_grp_row,1)->setData(group->pos().y(), Qt::EditRole); + break; } case grpRotation: qsi->child(rot_grp_row,1)->setData(group->rotation(), Qt::EditRole); @@ -1493,9 +1526,15 @@ QWidget *DynamicTextItemDelegate::createEditor(QWidget *parent, const QStyleOpti sb->setFrame(false); return sb; } + case DynamicElementTextModel::font: + { + QFontDialog *fd = new QFontDialog(index.data(Qt::UserRole+2).value(), parent); + fd->setObjectName("font_dialog"); + return fd; + } case DynamicElementTextModel::color: { - QColorDialog *cd = new QColorDialog(index.data(Qt::EditRole).value()); + QColorDialog *cd = new QColorDialog(index.data(Qt::EditRole).value(), parent); cd->setObjectName("color_dialog"); return cd; } @@ -1573,15 +1612,41 @@ void DynamicTextItemDelegate::setModelData(QWidget *editor, QAbstractItemModel * { if (index.isValid()) { - if(editor->objectName() == "color_dialog") + if (editor->objectName() == "font_dialog") + { + if (QStandardItemModel *qsim = dynamic_cast(model)) + { + if(QStandardItem *qsi = qsim->itemFromIndex(index)) + { + QFontDialog *fd = static_cast(editor); + if (fd->result() == QDialog::Accepted) + { + //qsi->setData(fd->selectedFont().family(), Qt::EditRole); + //qsi->setData(fd->selectedFont(), Qt::UserRole+2); + /**For unknow reason, call selectedFont doesn't work, + * (always return the same font, no matter what you select) + * Instead we use curentFont + **/ + qsi->setData(fd->currentFont().family(), Qt::EditRole); + qsi->setData(fd->currentFont(), Qt::UserRole+2); + qsi->setFont(fd->currentFont()); + } + return; + } + } + } + else if(editor->objectName() == "color_dialog") { if (QStandardItemModel *qsim = dynamic_cast(model)) { if(QStandardItem *qsi = qsim->itemFromIndex(index)) { QColorDialog *cd = static_cast (editor); - qsi->setData(cd->selectedColor(), Qt::EditRole); - qsi->setData(cd->selectedColor(), Qt::ForegroundRole); + if (cd->result() == QDialog::Accepted) + { + qsi->setData(cd->selectedColor(), Qt::EditRole); + qsi->setData(cd->selectedColor(), Qt::ForegroundRole); + } return; } diff --git a/sources/ui/dynamicelementtextmodel.h b/sources/ui/dynamicelementtextmodel.h index 9130d07a0..d10685428 100644 --- a/sources/ui/dynamicelementtextmodel.h +++ b/sources/ui/dynamicelementtextmodel.h @@ -44,6 +44,7 @@ class DynamicElementTextModel : public QStandardItemModel compositeText, txtAlignment, size, + font, color, pos, frame,