QGIS API Documentation 3.37.0-Master (fdefdf9c27f)
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 "qgstextrenderer.h"
18#include "qgsscreenhelper.h"
19
20#include <QPainter>
21
23 : QLabel( parent )
24{
25 mScreenHelper = new QgsScreenHelper( this );
26 connect( mScreenHelper, &QgsScreenHelper::screenDpiChanged, this, [ = ]( double dpi )
27 {
28 mContext.setScaleFactor( dpi / 25.4 );
29 updateContext();
30 } );
31
32 // initially use a basic transform with no scale
33 QgsMapToPixel newCoordXForm;
34 newCoordXForm.setParameters( 1, 0, 0, 0, 0, 0 );
35 mContext.setMapToPixel( newCoordXForm );
36
37 mContext.setScaleFactor( mScreenHelper->screenDpi() / 25.4 );
38 mContext.setUseAdvancedEffects( true );
39
41
42 mContext.setIsGuiPreview( true );
43}
44
45void QgsTextPreview::paintEvent( QPaintEvent *e )
46{
47 Q_UNUSED( e )
48 QPainter p( this );
49
50 p.setRenderHint( QPainter::Antialiasing );
51
52 // slightly inset text
53 const double fontSize = mContext.convertToPainterUnits( mFormat.size(), mFormat.sizeUnit(), mFormat.sizeMapUnitScale() );
54 double xtrans = 0;
55 if ( mFormat.buffer().enabled() )
56 xtrans = mFormat.buffer().sizeUnit() == Qgis::RenderUnit::Percentage
57 ? fontSize * mFormat.buffer().size() / 100
58 : mContext.convertToPainterUnits( mFormat.buffer().size(), mFormat.buffer().sizeUnit(), mFormat.buffer().sizeMapUnitScale() );
60 xtrans = std::max( xtrans, mContext.convertToPainterUnits( mFormat.background().size().width(), mFormat.background().sizeUnit(), mFormat.background().sizeMapUnitScale() ) );
61 xtrans += 4;
62
63 double ytrans = 0.0;
64 if ( mFormat.buffer().enabled() )
65 ytrans = std::max( ytrans, mFormat.buffer().sizeUnit() == Qgis::RenderUnit::Percentage
66 ? fontSize * mFormat.buffer().size() / 100
67 : mContext.convertToPainterUnits( mFormat.buffer().size(), mFormat.buffer().sizeUnit(), mFormat.buffer().sizeMapUnitScale() ) );
68 if ( mFormat.background().enabled() )
69 ytrans = std::max( ytrans, mContext.convertToPainterUnits( mFormat.background().size().height(), mFormat.background().sizeUnit(), mFormat.background().sizeMapUnitScale() ) );
70 ytrans += 4;
71
72 QRectF textRect = rect();
73 textRect.setLeft( xtrans );
74 textRect.setWidth( textRect.width() - xtrans );
75 textRect.setTop( ytrans );
76 if ( textRect.height() > 300 )
77 textRect.setHeight( 300 );
78 if ( textRect.width() > 2000 )
79 textRect.setWidth( 2000 );
80
81 mContext.setPainter( &p );
82 QgsTextRenderer::drawText( textRect, 0, Qgis::TextHorizontalAlignment::Left, QStringList() << text(),
83 mContext, mFormat );
84}
85
87{
88 mFormat = format;
89 update();
90}
91
92void QgsTextPreview::updateContext()
93{
94 if ( mScale >= 0 )
95 {
96 const QgsMapToPixel newCoordXForm = QgsMapToPixel::fromScale( mScale, mMapUnits, mScreenHelper->screenDpi() );
97 mContext.setMapToPixel( newCoordXForm );
98 }
99 update();
100}
101
102void QgsTextPreview::setScale( double scale )
103{
104 mScale = scale;
105 updateContext();
106}
107
109{
110 mMapUnits = unit;
111 updateContext();
112}
DistanceUnit
Units of distance.
Definition: qgis.h:4124
@ Percentage
Percentage of another measurement (e.g., canvas size, feature size)
@ Antialiasing
Use antialiasing while drawing.
Perform transforms between map coordinates and device coordinates.
Definition: qgsmaptopixel.h:39
static QgsMapToPixel fromScale(double scale, Qgis::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, Qgis::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.
A utility class for dynamic handling of changes to screen properties.
double screenDpi() const
Returns the current screen DPI for the screen that the parent widget appears on.
void screenDpiChanged(double dpi)
Emitted whenever the screen dpi associated with the widget is changed.
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.
Qgis::RenderUnit sizeUnit() const
Returns the units used for the shape's size.
Qgis::RenderUnit sizeUnit() const
Returns the units for the buffer 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.
Container for all settings relating to text rendering.
Definition: qgstextformat.h:41
QgsMapUnitScale sizeMapUnitScale() const
Returns the map unit scale object for the size.
QgsTextBackgroundSettings & background()
Returns a reference to the text background settings.
Qgis::RenderUnit sizeUnit() const
Returns the units for the size of rendered text.
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 setMapUnits(Qgis::DistanceUnit unit)
Sets the map unit type for previewing format sizes in map units.
void setFormat(const QgsTextFormat &format)
Sets the text format for previewing in the widget.
static void drawText(const QRectF &rect, double rotation, Qgis::TextHorizontalAlignment alignment, const QStringList &textLines, QgsRenderContext &context, const QgsTextFormat &format, bool drawAsOutlines=true, Qgis::TextVerticalAlignment vAlignment=Qgis::TextVerticalAlignment::Top, Qgis::TextRendererFlags flags=Qgis::TextRendererFlags(), Qgis::TextLayoutMode mode=Qgis::TextLayoutMode::Rectangle)
Draws text within a rectangle using the specified settings.