From 98e265da722c5d4290c3f07e28e0aa700e68008a Mon Sep 17 00:00:00 2001 From: joshua Date: Fri, 31 Dec 2021 18:07:22 +0100 Subject: [PATCH] Test font size in pixel for DynamicElementTextItem --- sources/qetgraphicsitem/diagramtextitem.cpp | 12 ++++++- .../dynamicelementtextitem.cpp | 3 ++ sources/ui/dynamicelementtextmodel.cpp | 8 ++--- sources/utils/qetutils.cpp | 35 +++++++++++++++++++ sources/utils/qetutils.h | 4 +++ 5 files changed, 57 insertions(+), 5 deletions(-) diff --git a/sources/qetgraphicsitem/diagramtextitem.cpp b/sources/qetgraphicsitem/diagramtextitem.cpp index f408aca4f..192983617 100644 --- a/sources/qetgraphicsitem/diagramtextitem.cpp +++ b/sources/qetgraphicsitem/diagramtextitem.cpp @@ -21,6 +21,7 @@ #include "../diagramcommands.h" #include "../qetapp.h" #include "../richtext/richtexteditor_p.h" +#include "../utils/qetutils.h" /** @brief DiagramTextItem::DiagramTextItem @@ -157,6 +158,14 @@ QPointF DiagramTextItem::mapMovementFromParent(const QPointF &movement) const return(local_movement_point - local_origin); } +/** + * @brief DiagramTextItem::setFont + * Reimplemented from QGraphicsTextItem. + * This function ensure alignment is unchanged after @a font was set. + * If not set, the font size is set in pixel instead of point + * and emit fontChanged. + * @param font + */ void DiagramTextItem::setFont(const QFont &font) { if (this->font() == font) { @@ -165,7 +174,8 @@ void DiagramTextItem::setFont(const QFont &font) else { prepareAlignment(); - QGraphicsTextItem::setFont(font); + //Make sure font size is in pixel + QGraphicsTextItem::setFont(QETUtils::pointSizeToPixelSize(font)); finishAlignment(); emit fontChanged(font); } diff --git a/sources/qetgraphicsitem/dynamicelementtextitem.cpp b/sources/qetgraphicsitem/dynamicelementtextitem.cpp index 328b8983c..203c4e19d 100644 --- a/sources/qetgraphicsitem/dynamicelementtextitem.cpp +++ b/sources/qetgraphicsitem/dynamicelementtextitem.cpp @@ -26,6 +26,7 @@ #include "crossrefitem.h" #include "element.h" #include "elementtextitemgroup.h" +#include "../utils/qetutils.h" #include #include @@ -168,6 +169,7 @@ void DynamicElementTextItem::fromXml(const QDomElement &dom_elmt) { QFont font; font.fromString(dom_elmt.attribute("font")); + font = QETUtils::pointSizeToPixelSize(font); //In case of font was previously saved in point size setFont(font); } else //Retrocompatibility during the 0.7 dev because the font property was added lately. TODO remove this part in futur @@ -175,6 +177,7 @@ void DynamicElementTextItem::fromXml(const QDomElement &dom_elmt) 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())); + font_ = QETUtils::pointSizeToPixelSize(font_); setFont(font_); } diff --git a/sources/ui/dynamicelementtextmodel.cpp b/sources/ui/dynamicelementtextmodel.cpp index 49cd8bb00..68c1091ac 100644 --- a/sources/ui/dynamicelementtextmodel.cpp +++ b/sources/ui/dynamicelementtextmodel.cpp @@ -222,7 +222,7 @@ QList DynamicElementTextModel::itemsForText( size->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); QStandardItem *siza = new QStandardItem(); - siza->setData(deti->font().pointSize(), Qt::EditRole); + siza->setData(deti->font().pixelSize(), Qt::EditRole); siza->setData(DynamicElementTextModel::size, Qt::UserRole+1); siza->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled @@ -555,10 +555,10 @@ QUndoCommand *DynamicElementTextModel::undoForEditedText( } int fs = text_qsi->child(size_txt_row,1)->data(Qt::EditRole).toInt(); - if (fs != deti->font().pointSize()) + if (fs != deti->font().pixelSize()) { QFont font = deti->font(); - font.setPointSize(fs); + font.setPixelSize(fs); QPropertyUndoCommand *quc = new QPropertyUndoCommand(deti, "font", QVariant(deti->font()), QVariant(font), undo); quc->setText(tr("Modifier la taille d'un texte d'élément")); } @@ -1493,7 +1493,7 @@ void DynamicElementTextModel::updateDataFromText(DynamicElementTextItem *deti, QFont f(deti->font()); 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); + qsi->child(size_txt_row,1)->setData(f.pixelSize(), Qt::EditRole); break; } case color: diff --git a/sources/utils/qetutils.cpp b/sources/utils/qetutils.cpp index 10c560d44..6b10d3071 100644 --- a/sources/utils/qetutils.cpp +++ b/sources/utils/qetutils.cpp @@ -18,6 +18,7 @@ #include "qetutils.h" #include #include +#include /** @brief QETUtils::marginsToString @@ -57,3 +58,37 @@ QMargins QETUtils::marginsFromString(const QString &string) return margins; } + +/** + * @brief QETUtils::pointSizeToPixelSize + * @param font + * @return the same font with size set in pixel instead of point. + */ +QFont QETUtils::pointSizeToPixelSize(const QFont &font) +{ + if (font.pointSize()) + { + QFont f = font; + QFontInfo fi(f); + f.setPixelSize(fi.pixelSize()); + return f; + } + return font; +} + +/** + * @brief QETUtils::pixelSizeToPointSize + * @param font + * @return the same font with size set in point instead of pixel. + */ +QFont QETUtils::pixelSizeToPointSize(const QFont &font) +{ + if (font.pixelSize()) + { + QFont f = font; + QFontInfo fi(f); + f.setPointSizeF(fi.pointSizeF()); + return f; + } + return font; +} diff --git a/sources/utils/qetutils.h b/sources/utils/qetutils.h index a997b4504..08efb6f01 100644 --- a/sources/utils/qetutils.h +++ b/sources/utils/qetutils.h @@ -19,12 +19,16 @@ #define QETUTILS_H #include +#include /** Provide some small utils function */ namespace QETUtils { + QFont pointSizeToPixelSize(const QFont &font); + QFont pixelSizeToPointSize(const QFont &font); + QString marginsToString(const QMargins &margins); QMargins marginsFromString(const QString &string); }