QGIS API Documentation 4.3.0-Master (90cb4ecf9ef)
Loading...
Searching...
No Matches
qgsrubberband_impl.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsrubberband_impl.cpp
3 --------------------------------------
4 Date : July 2026
5 Copyright : (C) 2026 by Nyall Dawson
6 Email : nyall.dawson@gmail.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 "qgsrubberband_impl.h"
17
19#include "qgsmapcanvas.h"
20#include "qgstextrenderer.h"
21#include "qgsvectorlayer.h"
22
25 , mLayer( layer )
26{
27 QgsFeature f;
28 QgsFeatureIterator it = mLayer->getFeatures( qgis::listToSet( fids ) );
29 mFeatures.resize( fids.size() );
30 int index = 0;
31 while ( it.nextFeature( f ) )
32 {
33 mFeatures[index] = f;
34 index++;
35 }
36}
37
39{
41 if ( !rubberBand || !mLayer || !mLayer->labelsEnabled() || !mLayer->labeling() || mFeatures.empty() )
42 return;
43
44 QgsMapCanvas *canvas = rubberBand->canvas();
45 if ( !canvas )
46 return;
47
48 // fetch current rubber band geometry
49 QgsGeometry previewGeom = rubberBand->asGeometry();
50 if ( previewGeom.isEmpty() )
51 return;
52
54
55 const double previousReferenceScale = context.symbologyReferenceScale();
56 if ( const QgsFeatureRenderer *renderer = mLayer->renderer() )
57 {
58 context.setSymbologyReferenceScale( renderer->referenceScale() );
59 }
60
62
63 QgsExpressionContextScopePopper scopePopper( context.expressionContext(), featureScope );
65
66 // set up a super minimal, fast labeling engine. Why? Well...
67 // we can't just use QgsTextRenderer here, as that won't fully reflect the actual appearance
68 // of the labels actually rendered for the features. Eg it won't respect settings like text repeat distances,
69 // anchor points, overrun, curved placement modes, etc.
70 // So to get a useful preview we need to use the actual labeling engine to render the label.
71 // But we also don't need a lot of the weight of pal labeling, eg we only need to render the
72 // single least-cost candidate for each feature, we won't consider obstacles or overlaps, we don't
73 // need the label search tree, etc.
74 // Disabling all this gives us a very lean label engine, which is quite cheap to use and gives
75 // perfect 1:1 previews of the actual label to be rendered.
76 QgsMapSettings mapSettings = canvas->mapSettings();
78 QgsLabelingEngineSettings labelSettings = mapSettings.labelingEngineSettings();
81 labelSettings.setFlag( Qgis::LabelingFlag::IgnoreObstacles, true );
83 labelSettings.setFlag( Qgis::LabelingFlag::IgnoreOverlaps, true );
84 mapSettings.setLabelingEngineSettings( labelSettings );
85 QgsDefaultLabelingEngine engine( mapSettings );
86
87 QgsPalLayerSettings settings = mLayer->labeling()->settings();
88 auto provider = new QgsVectorLayerLabelProvider( mLayer, QString(), false, &settings );
89 engine.addProvider( provider );
90
91 QSet<QString> attributeNames;
92 if ( !provider->prepare( context, attributeNames ) )
93 {
94 context.setSymbologyReferenceScale( previousReferenceScale );
95 return;
96 }
97
98 const QVector< QgsGeometry> previewGeomParts = previewGeom.asGeometryCollection();
99 int index = 0;
100 for ( const QgsFeature &feature : std::as_const( mFeatures ) )
101 {
102 if ( index >= previewGeomParts.size() )
103 break;
104
105 // each individual part of the rubber band's geometry corresponds to an individual feature,
106 // so we re-associate them here:
107 QgsFeature tempFeature = feature;
108 tempFeature.setGeometry( previewGeomParts.at( index ) );
109
110 featureScope->setFeature( tempFeature );
111 featureScope->setFields( tempFeature.fields() );
112 provider->registerFeature( tempFeature, context );
113 index++;
114 }
115
116 QgsScopedQPainterState painterState( context.painter() );
117 context.painter()->translate( -rubberBand->pos() );
118
119 // running the engine calculates the placement and does the actual rendering:
120 engine.run( context );
121 context.setSymbologyReferenceScale( previousReferenceScale );
122}
@ DisableSearchTree
Disable the creation of the label search tree.
Definition qgis.h:3053
@ IgnoreObstacles
Disable obstacle handling.
Definition qgis.h:3050
@ SingleCandidateOnly
Generate only the single least-cost candidate for each feature. Useful for fast labeling,...
Definition qgis.h:3051
@ IgnoreOverlaps
Disable overlap detection and search solver, immediately returning lowest cost candidate per feature.
Definition qgis.h:3052
@ UsePartialCandidates
Whether to use also label candidates that are partially outside of the map view.
Definition qgis.h:3042
@ RecordProfile
Enable run-time profiling while rendering.
Definition qgis.h:2963
@ Reverse
Reverse/inverse transform (from destination to source).
Definition qgis.h:2864
@ RecordProfile
Enable run-time profiling while rendering.
Definition qgis.h:2928
Default QgsLabelingEngine implementation, which completes the whole labeling operation (including lab...
void run(QgsRenderContext &context) override
Runs the labeling job.
RAII class to pop scope from an expression context on destruction.
Single scope for storing variables and functions for use within a QgsExpressionContext.
void setFields(const QgsFields &fields)
Convenience function for setting a fields for the scope.
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the scope.
Wrapper for iterator of features from vector data provider or vector layer.
bool nextFeature(QgsFeature &f)
Fetch next feature and stores in f, returns true on success.
Abstract base class for all 2D vector feature renderers.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition qgsfeature.h:60
QgsFields fields
Definition qgsfeature.h:65
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
A geometry is the spatial representation of a feature.
Qgis::GeometryOperationResult transform(const QgsCoordinateTransform &ct, Qgis::TransformDirection direction=Qgis::TransformDirection::Forward, bool transformZ=false)
Transforms this geometry as described by the coordinate transform ct.
QVector< QgsGeometry > asGeometryCollection() const
Returns contents of the geometry as a list of geometries.
bool isEmpty() const
Returns true if the geometry is empty (eg a linestring with no vertices, or a collection with no geom...
Stores global configuration for labeling engine.
void setFlag(Qgis::LabelingFlag f, bool enabled=true)
Sets whether a particual flag is enabled.
QString addProvider(QgsAbstractLabelProvider *provider)
Adds a provider of label features.
Map canvas is a class for displaying all GIS data types on a canvas.
const QgsMapSettings & mapSettings() const
Gets access to properties used for map rendering.
Contains configuration for rendering maps.
const QgsLabelingEngineSettings & labelingEngineSettings() const
Returns the global configuration of the labeling engine.
QgsCoordinateTransform layerTransform(const QgsMapLayer *layer) const
Returns the coordinate transform from layer's CRS to destination CRS.
void setLabelingEngineSettings(const QgsLabelingEngineSettings &settings)
Sets the global configuration of the labeling engine.
void setFlag(Qgis::MapSettingsFlag flag, bool on=true)
Enable or disable a particular flag (other flags are not affected).
Contains settings for how a map layer will be labeled.
Contains information about the context of a rendering operation.
double symbologyReferenceScale() const
Returns the symbology reference scale.
QPainter * painter()
Returns the destination QPainter for the render operation.
QgsExpressionContext & expressionContext()
Gets the expression context.
void setFlag(Qgis::RenderContextFlag flag, bool on=true)
Enable or disable a particular flag (other flags are not affected).
void setSymbologyReferenceScale(double scale)
Sets the symbology reference scale.
QgsRubberBandPreviewItem(QgsRubberBand *rubberBand)
Constructor for a QgsRubberBandPreviewItem, attached to the specified rubberBand.
QgsRubberBand * rubberBand()
Returns the rubber band associated with the item.
Responsible for drawing transient features (e.g.
Scoped object for saving and restoring a QPainter object's state.
Implements a label provider for vector layers.
void render(QgsRenderContext &context) final
Renders the custom preview overlay using the specified render context.
QgsVectorLayerLabelRubberBandPreview(QgsRubberBand *rubberBand, const QList< QgsFeatureId > &fids, QgsVectorLayer *layer)
Constructor for QgsVectorLayerLabelRubberBandPreview.
Represents a vector layer which manages a vector based dataset.