Fix issue with tile font size.

This commit is contained in:
Roman Telezhynskyi 2022-02-18 20:01:30 +02:00
parent 9cddf75d97
commit 9bbf384a0a
2 changed files with 41 additions and 19 deletions

View file

@ -1,6 +1,7 @@
# Valentina 0.7.51 (unreleased) # Valentina 0.7.51 (unreleased)
- Z value change for a layout piece. - Z value change for a layout piece.
- Fix issue with Custom template. - Fix issue with Custom template.
- Fix issue with tile font size.
# Valentina 0.7.50 February 14, 2022 # Valentina 0.7.50 February 14, 2022
- Fix regression. Minimal seam allowance width is less than the point accuracy values. - Fix regression. Minimal seam allowance width is less than the point accuracy values.

View file

@ -4,6 +4,7 @@
#include "../layout/vplayout.h" #include "../layout/vplayout.h"
#include "../layout/vpsheet.h" #include "../layout/vpsheet.h"
#include "../vmisc/vmath.h" #include "../vmisc/vmath.h"
#include "../vwidgets/global.h"
#include <QFileInfo> #include <QFileInfo>
#include <QImageReader> #include <QImageReader>
@ -13,6 +14,7 @@
namespace namespace
{ {
constexpr qreal penWidth = 1; constexpr qreal penWidth = 1;
constexpr qreal minTextFontSize = 5.0;
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
auto SheetMargins(const VPSheetPtr &sheet) -> QMarginsF auto SheetMargins(const VPSheetPtr &sheet) -> QMarginsF
@ -30,17 +32,29 @@ auto OptimizeFontSizeToFitTextInRect(QPainter *painter, const QRectF &drawRect,
int flags = Qt::TextDontClip|Qt::TextWordWrap, double goalError = 0.01, int flags = Qt::TextDontClip|Qt::TextWordWrap, double goalError = 0.01,
int maxIterationNumber=10) -> QFont int maxIterationNumber=10) -> QFont
{ {
QFont font;
if (not drawRect.isValid())
{
font.setPointSizeF(0.00000001);
return font;
}
painter->save(); painter->save();
QRect fontBoundRect;
QFont font;
double minError = std::numeric_limits<double>::max(); double minError = std::numeric_limits<double>::max();
double error = std::numeric_limits<double>::max(); double error = std::numeric_limits<double>::max();
int iterationNumber=0; int iterationNumber=0;
while((error > goalError) && (iterationNumber<maxIterationNumber)) while((error > goalError) && (iterationNumber<maxIterationNumber))
{ {
iterationNumber++; iterationNumber++;
fontBoundRect = painter->fontMetrics().boundingRect(drawRect.toRect(), flags, text); QRect fontBoundRect = painter->fontMetrics().boundingRect(drawRect.toRect(), flags, text);
if (fontBoundRect.isNull())
{
font.setPointSizeF(0.00000001);
break;
}
double xFactor = drawRect.width() / fontBoundRect.width(); double xFactor = drawRect.width() / fontBoundRect.width();
double yFactor = drawRect.height() / fontBoundRect.height(); double yFactor = drawRect.height() / fontBoundRect.height();
double factor; double factor;
@ -74,7 +88,12 @@ auto OptimizeFontSizeToFitTextInRect(QPainter *painter, const QRectF &drawRect,
} }
} }
font = painter->font(); font = painter->font();
font.setPointSizeF(font.pointSizeF()*factor); qreal size = font.pointSizeF()*factor;
if (size <= 0)
{
size = 0.00000001;
}
font.setPointSizeF(size);
painter->setFont(font); painter->setFont(font);
} }
painter->restore(); painter->restore();
@ -145,19 +164,6 @@ void VPGraphicsTileGrid::paint(QPainter *painter, const QStyleOptionGraphicsItem
qreal xScale = layout->LayoutSettings().HorizontalScale(); qreal xScale = layout->LayoutSettings().HorizontalScale();
qreal yScale = layout->LayoutSettings().VerticalScale(); qreal yScale = layout->LayoutSettings().VerticalScale();
const qreal width = (layout->TileFactory()->DrawingAreaWidth() - VPTileFactory::tileStripeWidth) / xScale;
const qreal height = (layout->TileFactory()->DrawingAreaHeight() - VPTileFactory::tileStripeWidth) / yScale;
VPSheetPtr sheet = layout->GetSheet(m_sheetUuid);
QMarginsF sheetMargins = SheetMargins(sheet);
const int nbCol = layout->TileFactory()->ColNb(sheet);
const int nbRow = layout->TileFactory()->RowNb(sheet);
QFont font = OptimizeFontSizeToFitTextInRect(painter,
QRectF(sheetMargins.left(), sheetMargins.top(), width/3., height/3.),
QString::number(nbRow * nbCol));
VWatermarkData watermarkData = layout->TileFactory()->WatermarkData(); VWatermarkData watermarkData = layout->TileFactory()->WatermarkData();
auto PaintWatermark = [painter, layout, xScale, yScale, watermarkData] auto PaintWatermark = [painter, layout, xScale, yScale, watermarkData]
@ -180,10 +186,25 @@ void VPGraphicsTileGrid::paint(QPainter *painter, const QStyleOptionGraphicsItem
} }
}; };
auto PaintTileNumber = [painter, layout, nbCol, font] const qreal width = (layout->TileFactory()->DrawingAreaWidth() - VPTileFactory::tileStripeWidth) / xScale;
const qreal height = (layout->TileFactory()->DrawingAreaHeight() - VPTileFactory::tileStripeWidth) / yScale;
VPSheetPtr sheet = layout->GetSheet(m_sheetUuid);
QMarginsF sheetMargins = SheetMargins(sheet);
const int nbCol = layout->TileFactory()->ColNb(sheet);
const int nbRow = layout->TileFactory()->RowNb(sheet);
QFont font = OptimizeFontSizeToFitTextInRect(painter,
QRectF(sheetMargins.left(), sheetMargins.top(), width/3., height/3.),
QString::number(nbRow * nbCol));
const qreal scale = SceneScale(scene());
auto PaintTileNumber = [painter, layout, nbCol, font, scale]
(const QRectF &img, int i, int j) (const QRectF &img, int i, int j)
{ {
if (layout->LayoutSettings().GetShowTileNumber()) if (layout->LayoutSettings().GetShowTileNumber() && font.pointSizeF() * scale >= minTextFontSize)
{ {
painter->save(); painter->save();