QGIS API Documentation  3.26.3-Buenos Aires (65e4edfdad)
qgstextpreview.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgstextpreview.cpp
3  ------------------
4  begin : October 2016
5  copyright : (C) 2016 by Nyall Dawson
6  email : nyall dot dawson at gmail dot com
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 
16 #include "qgstextpreview.h"
17 #include "qgsapplication.h"
18 #include "qgstextrenderer.h"
19 #include <QDesktopWidget>
20 #include <QPainter>
21 
23  : QLabel( parent )
24 {
25  // initially use a basic transform with no scale
26  QgsMapToPixel newCoordXForm;
27  newCoordXForm.setParameters( 1, 0, 0, 0, 0, 0 );
28  mContext.setMapToPixel( newCoordXForm );
29 
30  mContext.setScaleFactor( QgsApplication::desktop()->logicalDpiX() / 25.4 );
31  mContext.setUseAdvancedEffects( true );
32 
34 
35  mContext.setIsGuiPreview( true );
36 }
37 
38 
39 void QgsTextPreview::paintEvent( QPaintEvent *e )
40 {
41  Q_UNUSED( e )
42  QPainter p( this );
43 
44  p.setRenderHint( QPainter::Antialiasing );
45 
46  // slightly inset text
47  const double fontSize = mContext.convertToPainterUnits( mFormat.size(), mFormat.sizeUnit(), mFormat.sizeMapUnitScale() );
48  double xtrans = 0;
49  if ( mFormat.buffer().enabled() )
50  xtrans = mFormat.buffer().sizeUnit() == QgsUnitTypes::RenderPercentage
51  ? fontSize * mFormat.buffer().size() / 100
52  : mContext.convertToPainterUnits( mFormat.buffer().size(), mFormat.buffer().sizeUnit(), mFormat.buffer().sizeMapUnitScale() );
54  xtrans = std::max( xtrans, mContext.convertToPainterUnits( mFormat.background().size().width(), mFormat.background().sizeUnit(), mFormat.background().sizeMapUnitScale() ) );
55  xtrans += 4;
56 
57  double ytrans = 0.0;
58  if ( mFormat.buffer().enabled() )
59  ytrans = std::max( ytrans, mFormat.buffer().sizeUnit() == QgsUnitTypes::RenderPercentage
60  ? fontSize * mFormat.buffer().size() / 100
61  : mContext.convertToPainterUnits( mFormat.buffer().size(), mFormat.buffer().sizeUnit(), mFormat.buffer().sizeMapUnitScale() ) );
62  if ( mFormat.background().enabled() )
63  ytrans = std::max( ytrans, mContext.convertToPainterUnits( mFormat.background().size().height(), mFormat.background().sizeUnit(), mFormat.background().sizeMapUnitScale() ) );
64  ytrans += 4;
65 
66  QRectF textRect = rect();
67  textRect.setLeft( xtrans );
68  textRect.setWidth( textRect.width() - xtrans );
69  textRect.setTop( ytrans );
70  if ( textRect.height() > 300 )
71  textRect.setHeight( 300 );
72  if ( textRect.width() > 2000 )
73  textRect.setWidth( 2000 );
74 
75  mContext.setPainter( &p );
76  QgsTextRenderer::drawText( textRect, 0, QgsTextRenderer::AlignLeft, QStringList() << text(),
77  mContext, mFormat );
78 }
79 
81 {
82  mFormat = format;
83  update();
84 }
85 
86 void QgsTextPreview::updateContext()
87 {
88  if ( mScale >= 0 )
89  {
90  const QgsMapToPixel newCoordXForm = QgsMapToPixel::fromScale( mScale, mMapUnits, QgsApplication::desktop()->logicalDpiX() );
91  mContext.setMapToPixel( newCoordXForm );
92  }
93  update();
94 }
95 
96 void QgsTextPreview::setScale( double scale )
97 {
98  mScale = scale;
99  updateContext();
100 }
101 
103 {
104  mMapUnits = unit;
105  updateContext();
106 }
QgsRenderContext::setIsGuiPreview
void setIsGuiPreview(bool preview)
Sets GUI preview mode.
Definition: qgsrendercontext.h:800
QgsTextBufferSettings::sizeMapUnitScale
QgsMapUnitScale sizeMapUnitScale() const
Returns the map unit scale object for the buffer size.
Definition: qgstextbuffersettings.cpp:102
QgsTextBackgroundSettings::enabled
bool enabled() const
Returns whether the background is enabled.
Definition: qgstextbackgroundsettings.cpp:107
qgstextrenderer.h
QgsMapToPixel::setParameters
void setParameters(double mapUnitsPerPixel, double centerX, double centerY, int widthPixels, int heightPixels, double rotation)
Sets parameters for use in transforming coordinates.
Definition: qgsmaptopixel.cpp:168
QgsTextFormat::buffer
QgsTextBufferSettings & buffer()
Returns a reference to the text buffer settings.
Definition: qgstextformat.cpp:112
QgsRenderContext::setPainter
void setPainter(QPainter *p)
Sets the destination QPainter for the render operation.
Definition: qgsrendercontext.h:512
QgsTextFormat::background
QgsTextBackgroundSettings & background()
Returns a reference to the text background settings.
Definition: qgstextformat.cpp:124
QgsTextFormat::sizeUnit
QgsUnitTypes::RenderUnit sizeUnit() const
Returns the units for the size of rendered text.
Definition: qgstextformat.cpp:264
QgsUnitTypes::RenderPercentage
@ RenderPercentage
Percentage of another measurement (e.g., canvas size, feature size)
Definition: qgsunittypes.h:172
QgsTextPreview::paintEvent
void paintEvent(QPaintEvent *e) override
Definition: qgstextpreview.cpp:39
QgsUnitTypes::DistanceUnit
DistanceUnit
Units of distance.
Definition: qgsunittypes.h:67
QgsTextBackgroundSettings::sizeType
SizeType sizeType() const
Returns the method used to determine the size of the background shape (e.g., fixed size or buffer aro...
Definition: qgstextbackgroundsettings.cpp:157
QgsTextPreview::setMapUnits
void setMapUnits(QgsUnitTypes::DistanceUnit unit)
Sets the map unit type for previewing format sizes in map units.
Definition: qgstextpreview.cpp:102
qgsapplication.h
QgsTextBackgroundSettings::sizeMapUnitScale
QgsMapUnitScale sizeMapUnitScale() const
Returns the map unit scale object for the shape size.
Definition: qgstextbackgroundsettings.cpp:187
QgsTextFormat
Container for all settings relating to text rendering.
Definition: qgstextformat.h:40
QgsTextBackgroundSettings::size
QSizeF size() const
Returns the size of the background shape.
Definition: qgstextbackgroundsettings.cpp:167
QgsTextFormat::sizeMapUnitScale
QgsMapUnitScale sizeMapUnitScale() const
Returns the map unit scale object for the size.
Definition: qgstextformat.cpp:275
qgstextpreview.h
QgsRenderContext::setFlag
void setFlag(Qgis::RenderContextFlag flag, bool on=true)
Enable or disable a particular flag (other flags are not affected)
Definition: qgsrendercontext.cpp:216
QgsTextRenderer::drawText
static void drawText(const QRectF &rect, double rotation, HAlignment alignment, const QStringList &textLines, QgsRenderContext &context, const QgsTextFormat &format, bool drawAsOutlines=true, VAlignment vAlignment=AlignTop, Qgis::TextRendererFlags flags=Qgis::TextRendererFlags())
Draws text within a rectangle using the specified settings.
Definition: qgstextrenderer.cpp:81
QgsRenderContext::setMapToPixel
void setMapToPixel(const QgsMapToPixel &mtp)
Sets the context's map to pixel transform, which transforms between map coordinates and device coordi...
Definition: qgsrendercontext.h:412
QgsTextRenderer::AlignLeft
@ AlignLeft
Left align.
Definition: qgstextrenderer.h:60
QgsTextPreview::QgsTextPreview
QgsTextPreview(QWidget *parent=nullptr)
Constructor for QgsTextPreview.
Definition: qgstextpreview.cpp:22
QgsTextBufferSettings::sizeUnit
QgsUnitTypes::RenderUnit sizeUnit() const
Returns the units for the buffer size.
Definition: qgstextbuffersettings.cpp:92
QgsTextBufferSettings::size
double size() const
Returns the size of the buffer.
Definition: qgstextbuffersettings.cpp:82
QgsRenderContext::convertToPainterUnits
double convertToPainterUnits(double size, QgsUnitTypes::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale(), Qgis::RenderSubcomponentProperty property=Qgis::RenderSubcomponentProperty::Generic) const
Converts a size from the specified units to painter units (pixels).
Definition: qgsrendercontext.cpp:367
QgsTextFormat::size
double size() const
Returns the size for rendered text.
Definition: qgstextformat.cpp:286
QgsTextPreview::scale
double scale
Definition: qgstextpreview.h:44
Qgis::RenderContextFlag::Antialiasing
@ Antialiasing
Use antialiasing while drawing.
QgsTextBufferSettings::enabled
bool enabled() const
Returns whether the buffer is enabled.
Definition: qgstextbuffersettings.cpp:72
QgsMapToPixel
Perform transforms between map coordinates and device coordinates.
Definition: qgsmaptopixel.h:38
QgsTextBackgroundSettings::SizeFixed
@ SizeFixed
Fixed size.
Definition: qgstextbackgroundsettings.h:69
QgsTextBackgroundSettings::sizeUnit
QgsUnitTypes::RenderUnit sizeUnit() const
Returns the units used for the shape's size.
Definition: qgstextbackgroundsettings.cpp:177
QgsRenderContext::setUseAdvancedEffects
void setUseAdvancedEffects(bool enabled)
Used to enable or disable advanced effects such as blend modes.
Definition: qgsrendercontext.cpp:305
QgsTextPreview::setFormat
void setFormat(const QgsTextFormat &format)
Sets the text format for previewing in the widget.
Definition: qgstextpreview.cpp:80
QgsMapToPixel::fromScale
static QgsMapToPixel fromScale(double scale, QgsUnitTypes::DistanceUnit mapUnits, double dpi=96)
Returns a new QgsMapToPixel created using a specified scale and distance unit.
Definition: qgsmaptopixel.cpp:59
QgsTextPreview::setScale
void setScale(double scale)
Sets the scale to use for previewing format sizes in map units.
Definition: qgstextpreview.cpp:96
QgsRenderContext::setScaleFactor
void setScaleFactor(double factor)
Sets the scaling factor for the render to convert painter units to physical sizes.
Definition: qgsrendercontext.h:472
QgsTextPreview::format
QgsTextFormat format
Definition: qgstextpreview.h:43