From 71426aa467e1e348b02dd3346dd99392bd2886a6 Mon Sep 17 00:00:00 2001 From: Wanderer Fan Date: Sat, 14 May 2022 11:42:27 -0400 Subject: [PATCH] [TD]fix Text sizes not exact --- src/Mod/TechDraw/Gui/QGIGhostHighlight.cpp | 2 +- src/Mod/TechDraw/Gui/QGIHighlight.cpp | 5 +- src/Mod/TechDraw/Gui/QGISectionLine.cpp | 9 +++- src/Mod/TechDraw/Gui/QGIView.cpp | 59 ++++++++++++---------- src/Mod/TechDraw/Gui/QGIView.h | 3 ++ src/Mod/TechDraw/Gui/QGIViewAnnotation.cpp | 6 +-- src/Mod/TechDraw/Gui/QGIViewBalloon.cpp | 8 ++- src/Mod/TechDraw/Gui/QGIViewDimension.cpp | 4 +- src/Mod/TechDraw/Gui/QGIViewPart.cpp | 1 + src/Mod/TechDraw/Gui/QGIWeldSymbol.cpp | 15 +++--- 10 files changed, 67 insertions(+), 45 deletions(-) diff --git a/src/Mod/TechDraw/Gui/QGIGhostHighlight.cpp b/src/Mod/TechDraw/Gui/QGIGhostHighlight.cpp index b97d945fbd..5be1ac6eb3 100644 --- a/src/Mod/TechDraw/Gui/QGIGhostHighlight.cpp +++ b/src/Mod/TechDraw/Gui/QGIGhostHighlight.cpp @@ -54,7 +54,7 @@ QGIGhostHighlight::QGIGhostHighlight() m_dragging = false; //make the ghost very visible - QFont f(QGIView::getPrefFont()); + QFont f(Preferences::labelFontQString()); double fontSize = Preferences::labelFontSizeMM(); setFont(f, fontSize); setReference("drag"); diff --git a/src/Mod/TechDraw/Gui/QGIHighlight.cpp b/src/Mod/TechDraw/Gui/QGIHighlight.cpp index 3a6ff4b3fd..6dc18bb0aa 100644 --- a/src/Mod/TechDraw/Gui/QGIHighlight.cpp +++ b/src/Mod/TechDraw/Gui/QGIHighlight.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include @@ -94,7 +95,9 @@ void QGIHighlight::makeHighlight() void QGIHighlight::makeReference() { prepareGeometryChange(); - m_refFont.setPixelSize(QGIView::calculateFontPixelSize(m_refSize)); + int fontSize = QGIView::exactFontSize(Base::Tools::toStdString(m_refFont.family()), + m_refSize); + m_refFont .setPixelSize(fontSize); m_reference->setFont(m_refFont); m_reference->setPlainText(m_refText); double fudge = Rez::guiX(1.0); diff --git a/src/Mod/TechDraw/Gui/QGISectionLine.cpp b/src/Mod/TechDraw/Gui/QGISectionLine.cpp index 198a5d0923..20bdfcecd5 100644 --- a/src/Mod/TechDraw/Gui/QGISectionLine.cpp +++ b/src/Mod/TechDraw/Gui/QGISectionLine.cpp @@ -33,6 +33,7 @@ #include #include #include +#include //#include #include @@ -189,7 +190,9 @@ void QGISectionLine::makeSymbols() void QGISectionLine::makeSymbolsTrad() { prepareGeometryChange(); - m_symFont.setPixelSize(QGIView::calculateFontPixelSize(m_symSize)); +// m_symFont.setPixelSize(QGIView::calculateFontPixelSize(m_symSize)); + int fontSize = QGIView::exactFontSize(Base::Tools::toStdString(m_symFont.family()), m_symSize); + m_symFont.setPixelSize(fontSize); m_symbol1->setFont(m_symFont); m_symbol1->setPlainText(QString::fromUtf8(m_symbol)); m_symbol2->setFont(m_symFont); @@ -222,7 +225,9 @@ void QGISectionLine::makeSymbolsTrad() void QGISectionLine::makeSymbolsISO() { prepareGeometryChange(); - m_symFont.setPixelSize(QGIView::calculateFontPixelSize(m_symSize)); +// m_symFont.setPixelSize(QGIView::calculateFontPixelSize(m_symSize)); + int fontSize = QGIView::exactFontSize(Base::Tools::toStdString(m_symFont.family()), m_symSize); + m_symFont.setPixelSize(fontSize); m_symbol1->setFont(m_symFont); m_symbol1->setPlainText(QString::fromUtf8(m_symbol)); m_symbol2->setFont(m_symFont); diff --git a/src/Mod/TechDraw/Gui/QGIView.cpp b/src/Mod/TechDraw/Gui/QGIView.cpp index 449730c526..480a2aa8c5 100644 --- a/src/Mod/TechDraw/Gui/QGIView.cpp +++ b/src/Mod/TechDraw/Gui/QGIView.cpp @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #include @@ -104,10 +105,6 @@ QGIView::QGIView() m_colCurrent = m_colNormal; m_pen.setColor(m_colCurrent); - //Border/Label styling -// m_font.setPixelSize(calculateFontPixelSize(getPrefFontSize())); - m_font.setPixelSize(PreferencesGui::labelFontSizePX()); - m_decorPen.setStyle(Qt::DashLine); m_decorPen.setWidth(0); // 0 => 1px "cosmetic pen" @@ -445,8 +442,10 @@ void QGIView::drawCaption() prepareGeometryChange(); QRectF displayArea = customChildrenBoundingRect(); m_caption->setDefaultTextColor(m_colCurrent); - m_font.setFamily(getPrefFont()); - m_font.setPixelSize(PreferencesGui::labelFontSizePX()); + m_font.setFamily(Preferences::labelFontQString()); + int fontSize = exactFontSize(Preferences::labelFont(), + Preferences::labelFontSizeMM()); + m_font.setPixelSize(fontSize); m_caption->setFont(m_font); QString captionStr = QString::fromUtf8(getViewObject()->Caption.getValue()); m_caption->setPlainText(captionStr); @@ -485,10 +484,12 @@ void QGIView::drawBorder() m_lock->hide(); m_label->setDefaultTextColor(m_colCurrent); - m_font.setFamily(getPrefFont()); - m_font.setPixelSize(PreferencesGui::labelFontSizePX()); - + m_font.setFamily(Preferences::labelFontQString()); + int fontSize = exactFontSize(Preferences::labelFont(), + Preferences::labelFontSizeMM()); + m_font.setPixelSize(fontSize); m_label->setFont(m_font); + QString labelStr = QString::fromUtf8(getViewObject()->Label.getValue()); m_label->setPlainText(labelStr); QRectF labelArea = m_label->boundingRect(); //m_label coords @@ -728,21 +729,10 @@ Base::Reference QGIView::getParmGroupCol() return hGrp; } -QString QGIView::getPrefFont() -{ - return Preferences::labelFontQString(); -} - -double QGIView::getPrefFontSize() -{ - return Preferences::labelFontSizeMM(); -} - -double QGIView::getDimFontSize() -{ - return Preferences::dimFontSizeMM(); -} - +//convert input font size in mm to scene units +//note that when used to set font size this will result in +//text that is smaller than sizeInMillimetres. If exactly +//correct sized text is required, use exactFontSize. int QGIView::calculateFontPixelSize(double sizeInMillimetres) { // Calculate font size in pixels by using resolution conversion @@ -763,15 +753,30 @@ void QGIView::dumpRect(const char* text, QRectF rect) { rect.left(), rect.top(), rect.right(), rect.bottom()); } -void QGIView::makeMark(double xPos, double yPos, QColor c) +//determine the required font size to generate text with upper case +//letter height = nominalSize +int QGIView::exactFontSize(std::string fontFamily, double nominalSize) +{ + double sceneSize = Rez::guiX(nominalSize); //desired height in scene units + QFont font; + font.setFamily(QString::fromUtf8(fontFamily.c_str())); + font.setPixelSize(sceneSize); + + QFontMetricsF fm(font); + double capHeight = fm.capHeight(); + double ratio = sceneSize / capHeight; + return (int) sceneSize * ratio; +} + +void QGIView::makeMark(double xPos, double yPos, QColor color) { QGIVertex* vItem = new QGIVertex(-1); vItem->setParentItem(this); vItem->setPos(xPos, yPos); vItem->setWidth(2.0); vItem->setRadius(20.0); - vItem->setNormalColor(c); - vItem->setFillColor(c); + vItem->setNormalColor(color); + vItem->setFillColor(color); vItem->setPrettyNormal(); vItem->setZValue(ZVALUE::VERTEX); } diff --git a/src/Mod/TechDraw/Gui/QGIView.h b/src/Mod/TechDraw/Gui/QGIView.h index cb238e2ea7..7f0751a2e9 100644 --- a/src/Mod/TechDraw/Gui/QGIView.h +++ b/src/Mod/TechDraw/Gui/QGIView.h @@ -149,6 +149,9 @@ public: static double getDimFontSize(); QFont getFont() { return m_font; }; void setFont(QFont font) { m_font = font; } + + static int exactFontSize(std::string fontFamily, double nominalSize); + virtual void removeChild(QGIView* child); virtual void addArbitraryItem(QGraphicsItem* qgi); diff --git a/src/Mod/TechDraw/Gui/QGIViewAnnotation.cpp b/src/Mod/TechDraw/Gui/QGIViewAnnotation.cpp index 1fbb55413c..ceab31712c 100644 --- a/src/Mod/TechDraw/Gui/QGIViewAnnotation.cpp +++ b/src/Mod/TechDraw/Gui/QGIViewAnnotation.cpp @@ -127,14 +127,14 @@ void QGIViewAnnotation::drawAnnotation() } const std::vector& annoText = viewAnno->Text.getValues(); - int fontSize = calculateFontPixelSize(viewAnno->TextSize.getValue()); + int scaledSize = exactFontSize(viewAnno->Font.getValue(), viewAnno->TextSize.getValue()); //build HTML/CSS formatting around Text lines std::stringstream ss; ss << "\n\n