QGIS API Documentation  3.27.0-Master (aef1b1ec20)
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 }
@ Antialiasing
Use antialiasing while drawing.
Perform transforms between map coordinates and device coordinates.
Definition: qgsmaptopixel.h:39
static QgsMapToPixel fromScale(double scale, QgsUnitTypes::DistanceUnit mapUnits, double dpi=96)
Returns a new QgsMapToPixel created using a specified scale and distance unit.
void setParameters(double mapUnitsPerPixel, double centerX, double centerY, int widthPixels, int heightPixels, double rotation)
Sets parameters for use in transforming coordinates.
void setScaleFactor(double factor)
Sets the scaling factor for the render to convert painter units to physical sizes.
void setUseAdvancedEffects(bool enabled)
Used to enable or disable advanced effects such as blend modes.
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).
void setIsGuiPreview(bool preview)
Sets GUI preview mode.
void setFlag(Qgis::RenderContextFlag flag, bool on=true)
Enable or disable a particular flag (other flags are not affected)
void setMapToPixel(const QgsMapToPixel &mtp)
Sets the context's map to pixel transform, which transforms between map coordinates and device coordi...
void setPainter(QPainter *p)
Sets the destination QPainter for the render operation.
QSizeF size() const
Returns the size of the background shape.
bool enabled() const
Returns whether the background is enabled.
SizeType sizeType() const
Returns the method used to determine the size of the background shape (e.g., fixed size or buffer aro...
QgsMapUnitScale sizeMapUnitScale() const
Returns the map unit scale object for the shape size.
QgsUnitTypes::RenderUnit sizeUnit() const
Returns the units used for the shape's size.
double size() const
Returns the size of the buffer.
QgsMapUnitScale sizeMapUnitScale() const
Returns the map unit scale object for the buffer size.
bool enabled() const
Returns whether the buffer is enabled.
QgsUnitTypes::RenderUnit sizeUnit() const
Returns the units for the buffer size.
Container for all settings relating to text rendering.
Definition: qgstextformat.h:41
QgsMapUnitScale sizeMapUnitScale() const
Returns the map unit scale object for the size.
QgsUnitTypes::RenderUnit sizeUnit() const
Returns the units for the size of rendered text.
QgsTextBackgroundSettings & background()
Returns a reference to the text background settings.
double size() const
Returns the size for rendered text.
QgsTextBufferSettings & buffer()
Returns a reference to the text buffer settings.
void setScale(double scale)
Sets the scale to use for previewing format sizes in map units.
void paintEvent(QPaintEvent *e) override
QgsTextFormat format
QgsTextPreview(QWidget *parent=nullptr)
Constructor for QgsTextPreview.
void setFormat(const QgsTextFormat &format)
Sets the text format for previewing in the widget.
void setMapUnits(QgsUnitTypes::DistanceUnit unit)
Sets the map unit type for previewing format sizes in map units.
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.
@ AlignLeft
Left align.
DistanceUnit
Units of distance.
Definition: qgsunittypes.h:68
@ RenderPercentage
Percentage of another measurement (e.g., canvas size, feature size)
Definition: qgsunittypes.h:172