QGIS API Documentation 3.99.0-Master (26c88405ac0)
Loading...
Searching...
No Matches
qgslabelingenginerulewidget.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgslabelingenginerulewidget.cpp
3 ------------------------
4 begin : September 2024
5 copyright : (C) 2024 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
17
18#include "qgsgui.h"
19#include "qgshelp.h"
21
22#include <QDialogButtonBox>
23#include <QPushButton>
24
25#include "moc_qgslabelingenginerulewidget.cpp"
26
27//
28// QgsLabelingEngineRuleDialog
29//
30
32 : QDialog( parent, flags )
33 , mWidget( widget )
34{
35 Q_ASSERT( mWidget );
36 setWindowTitle( tr( "Configure Rule" ) );
37 setObjectName( QStringLiteral( "QgsLabelingEngineRuleDialog" ) );
38
39 QVBoxLayout *layout = new QVBoxLayout( this );
40 layout->addWidget( mWidget );
41
42 mButtonBox = new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::Help, Qt::Horizontal, this );
43 layout->addWidget( mButtonBox );
44
45 setLayout( layout );
47
48 connect( mButtonBox->button( QDialogButtonBox::Ok ), &QAbstractButton::clicked, this, &QDialog::accept );
49 connect( mButtonBox->button( QDialogButtonBox::Cancel ), &QAbstractButton::clicked, this, &QDialog::reject );
50 connect( mButtonBox, &QDialogButtonBox::helpRequested, this, [] {
51 QgsHelp::openHelp( QStringLiteral( "working_with_vector/vector_properties.html#labeling-rules" ) );
52 } );
53}
54
56{
57 mWidget->setRule( rule );
58}
59
64
66//
67// QgsLabelingEngineRuleAvoidLabelOverlapWithFeatureWidget
68//
69
70QgsLabelingEngineRuleAvoidLabelOverlapWithFeatureWidget::QgsLabelingEngineRuleAvoidLabelOverlapWithFeatureWidget( QWidget *parent )
72{
73 setupUi( this );
74
75 setWindowTitle( tr( "Prevent Labels Overlapping Features" ) );
76 setPanelTitle( tr( "Configure Rule" ) );
77
78 mComboLabeledLayer->setFilters( Qgis::LayerFilter::SpatialLayer );
79 mComboTargetLayer->setFilters( Qgis::LayerFilter::HasGeometry );
80
81 connect( mEditName, &QLineEdit::textChanged, this, &QgsLabelingEngineRuleAvoidLabelOverlapWithFeatureWidget::onChanged );
82 connect( mComboLabeledLayer, &QgsMapLayerComboBox::layerChanged, this, &QgsLabelingEngineRuleAvoidLabelOverlapWithFeatureWidget::onChanged );
83 connect( mComboTargetLayer, &QgsMapLayerComboBox::layerChanged, this, &QgsLabelingEngineRuleAvoidLabelOverlapWithFeatureWidget::onChanged );
84}
85
86void QgsLabelingEngineRuleAvoidLabelOverlapWithFeatureWidget::setRule( const QgsAbstractLabelingEngineRule *rule )
87{
89 if ( !castRule )
90 return;
91
92 mBlockSignals = true;
93 mEditName->setText( castRule->name() );
94 mComboLabeledLayer->setLayer( const_cast<QgsLabelingEngineRuleAvoidLabelOverlapWithFeature *>( castRule )->labeledLayer() );
95 mComboTargetLayer->setLayer( const_cast<QgsLabelingEngineRuleAvoidLabelOverlapWithFeature *>( castRule )->targetLayer() );
96
97 mBlockSignals = false;
98}
99
100QgsAbstractLabelingEngineRule *QgsLabelingEngineRuleAvoidLabelOverlapWithFeatureWidget::rule()
101{
102 auto res = std::make_unique<QgsLabelingEngineRuleAvoidLabelOverlapWithFeature>();
103 res->setName( mEditName->text() );
104 res->setLabeledLayer( mComboLabeledLayer->currentLayer() );
105 res->setTargetLayer( qobject_cast<QgsVectorLayer *>( mComboTargetLayer->currentLayer() ) );
106 return res.release();
107}
108
109void QgsLabelingEngineRuleAvoidLabelOverlapWithFeatureWidget::onChanged()
110{
111 if ( !mBlockSignals )
112 emit changed();
113}
114
115//
116// QgsLabelingEngineRuleMinimumDistanceLabelToFeatureWidget
117//
118
119QgsLabelingEngineRuleMinimumDistanceLabelToFeatureWidget::QgsLabelingEngineRuleMinimumDistanceLabelToFeatureWidget( QWidget *parent )
121{
122 setupUi( this );
123
124 setWindowTitle( tr( "Push Labels Away from Features" ) );
125 setPanelTitle( tr( "Configure Rule" ) );
126
127 mComboLabeledLayer->setFilters( Qgis::LayerFilter::SpatialLayer );
128 mComboTargetLayer->setFilters( Qgis::LayerFilter::HasGeometry );
129
131
132 connect( mEditName, &QLineEdit::textChanged, this, &QgsLabelingEngineRuleMinimumDistanceLabelToFeatureWidget::onChanged );
133 connect( mComboLabeledLayer, &QgsMapLayerComboBox::layerChanged, this, &QgsLabelingEngineRuleMinimumDistanceLabelToFeatureWidget::onChanged );
134 connect( mComboTargetLayer, &QgsMapLayerComboBox::layerChanged, this, &QgsLabelingEngineRuleMinimumDistanceLabelToFeatureWidget::onChanged );
135
136 connect( mSpinDistance, qOverload<double>( &QgsDoubleSpinBox::valueChanged ), this, &QgsLabelingEngineRuleMinimumDistanceLabelToFeatureWidget::onChanged );
137 connect( mDistanceUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsLabelingEngineRuleMinimumDistanceLabelToFeatureWidget::onChanged );
138 connect( mCostSlider, &QSlider::valueChanged, this, &QgsLabelingEngineRuleMinimumDistanceLabelToFeatureWidget::onChanged );
139}
140
141void QgsLabelingEngineRuleMinimumDistanceLabelToFeatureWidget::setRule( const QgsAbstractLabelingEngineRule *rule )
142{
144 if ( !castRule )
145 return;
146
147 mBlockSignals = true;
148 mEditName->setText( castRule->name() );
149 mComboLabeledLayer->setLayer( const_cast<QgsLabelingEngineRuleMinimumDistanceLabelToFeature *>( castRule )->labeledLayer() );
150 mComboTargetLayer->setLayer( const_cast<QgsLabelingEngineRuleMinimumDistanceLabelToFeature *>( castRule )->targetLayer() );
151
152 mSpinDistance->setValue( castRule->distance() );
153 mDistanceUnitWidget->setUnit( castRule->distanceUnit() );
154 mDistanceUnitWidget->setMapUnitScale( castRule->distanceUnitScale() );
155
156 mCostSlider->setValue( static_cast<int>( castRule->cost() * 10 ) );
157
158 mBlockSignals = false;
159}
160
161QgsAbstractLabelingEngineRule *QgsLabelingEngineRuleMinimumDistanceLabelToFeatureWidget::rule()
162{
163 auto res = std::make_unique<QgsLabelingEngineRuleMinimumDistanceLabelToFeature>();
164 res->setName( mEditName->text() );
165 res->setLabeledLayer( mComboLabeledLayer->currentLayer() );
166 res->setTargetLayer( qobject_cast<QgsVectorLayer *>( mComboTargetLayer->currentLayer() ) );
167
168 res->setDistance( mSpinDistance->value() );
169 res->setDistanceUnit( mDistanceUnitWidget->unit() );
170 res->setDistanceUnitScale( mDistanceUnitWidget->getMapUnitScale() );
171
172 res->setCost( mCostSlider->value() / 10.0 );
173
174 return res.release();
175}
176
177void QgsLabelingEngineRuleMinimumDistanceLabelToFeatureWidget::onChanged()
178{
179 if ( !mBlockSignals )
180 emit changed();
181}
182
183//
184// QgsLabelingEngineRuleMaximumDistanceLabelToFeatureWidget
185//
186
187QgsLabelingEngineRuleMaximumDistanceLabelToFeatureWidget::QgsLabelingEngineRuleMaximumDistanceLabelToFeatureWidget( QWidget *parent )
189{
190 setupUi( this );
191
192 setWindowTitle( tr( "Pull Labels toward Features" ) );
193 setPanelTitle( tr( "Configure Rule" ) );
194
195 mComboLabeledLayer->setFilters( Qgis::LayerFilter::SpatialLayer );
196 mComboTargetLayer->setFilters( Qgis::LayerFilter::HasGeometry );
197
199
200 connect( mEditName, &QLineEdit::textChanged, this, &QgsLabelingEngineRuleMaximumDistanceLabelToFeatureWidget::onChanged );
201 connect( mComboLabeledLayer, &QgsMapLayerComboBox::layerChanged, this, &QgsLabelingEngineRuleMaximumDistanceLabelToFeatureWidget::onChanged );
202 connect( mComboTargetLayer, &QgsMapLayerComboBox::layerChanged, this, &QgsLabelingEngineRuleMaximumDistanceLabelToFeatureWidget::onChanged );
203
204 connect( mSpinDistance, qOverload<double>( &QgsDoubleSpinBox::valueChanged ), this, &QgsLabelingEngineRuleMaximumDistanceLabelToFeatureWidget::onChanged );
205 connect( mDistanceUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsLabelingEngineRuleMaximumDistanceLabelToFeatureWidget::onChanged );
206 connect( mCostSlider, &QSlider::valueChanged, this, &QgsLabelingEngineRuleMaximumDistanceLabelToFeatureWidget::onChanged );
207}
208
209void QgsLabelingEngineRuleMaximumDistanceLabelToFeatureWidget::setRule( const QgsAbstractLabelingEngineRule *rule )
210{
212 if ( !castRule )
213 return;
214
215 mBlockSignals = true;
216 mEditName->setText( castRule->name() );
217 mComboLabeledLayer->setLayer( const_cast<QgsLabelingEngineRuleMaximumDistanceLabelToFeature *>( castRule )->labeledLayer() );
218 mComboTargetLayer->setLayer( const_cast<QgsLabelingEngineRuleMaximumDistanceLabelToFeature *>( castRule )->targetLayer() );
219
220 mSpinDistance->setValue( castRule->distance() );
221 mDistanceUnitWidget->setUnit( castRule->distanceUnit() );
222 mDistanceUnitWidget->setMapUnitScale( castRule->distanceUnitScale() );
223
224 mCostSlider->setValue( static_cast<int>( castRule->cost() * 10 ) );
225
226 mBlockSignals = false;
227}
228
229QgsAbstractLabelingEngineRule *QgsLabelingEngineRuleMaximumDistanceLabelToFeatureWidget::rule()
230{
231 auto res = std::make_unique<QgsLabelingEngineRuleMaximumDistanceLabelToFeature>();
232 res->setName( mEditName->text() );
233 res->setLabeledLayer( mComboLabeledLayer->currentLayer() );
234 res->setTargetLayer( qobject_cast<QgsVectorLayer *>( mComboTargetLayer->currentLayer() ) );
235
236 res->setDistance( mSpinDistance->value() );
237 res->setDistanceUnit( mDistanceUnitWidget->unit() );
238 res->setDistanceUnitScale( mDistanceUnitWidget->getMapUnitScale() );
239
240 res->setCost( mCostSlider->value() / 10.0 );
241
242 return res.release();
243}
244
245void QgsLabelingEngineRuleMaximumDistanceLabelToFeatureWidget::onChanged()
246{
247 if ( !mBlockSignals )
248 emit changed();
249}
250
251
252//
253// QgsLabelingEngineRuleMinimumDistanceLabelToLabelWidget
254//
255
256QgsLabelingEngineRuleMinimumDistanceLabelToLabelWidget::QgsLabelingEngineRuleMinimumDistanceLabelToLabelWidget( QWidget *parent )
258{
259 setupUi( this );
260
261 setWindowTitle( tr( "Pull Labels toward Features" ) );
262 setPanelTitle( tr( "Configure Rule" ) );
263
264 mComboLabeledLayer->setFilters( Qgis::LayerFilter::SpatialLayer );
265 mComboTargetLayer->setFilters( Qgis::LayerFilter::SpatialLayer );
266
268
269 connect( mEditName, &QLineEdit::textChanged, this, &QgsLabelingEngineRuleMinimumDistanceLabelToLabelWidget::onChanged );
270 connect( mComboLabeledLayer, &QgsMapLayerComboBox::layerChanged, this, &QgsLabelingEngineRuleMinimumDistanceLabelToLabelWidget::onChanged );
271 connect( mComboTargetLayer, &QgsMapLayerComboBox::layerChanged, this, &QgsLabelingEngineRuleMinimumDistanceLabelToLabelWidget::onChanged );
272
273 connect( mSpinDistance, qOverload<double>( &QgsDoubleSpinBox::valueChanged ), this, &QgsLabelingEngineRuleMinimumDistanceLabelToLabelWidget::onChanged );
274 connect( mDistanceUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsLabelingEngineRuleMinimumDistanceLabelToLabelWidget::onChanged );
275}
276
277void QgsLabelingEngineRuleMinimumDistanceLabelToLabelWidget::setRule( const QgsAbstractLabelingEngineRule *rule )
278{
280 if ( !castRule )
281 return;
282
283 mBlockSignals = true;
284 mEditName->setText( castRule->name() );
285 mComboLabeledLayer->setLayer( const_cast<QgsLabelingEngineRuleMinimumDistanceLabelToLabel *>( castRule )->labeledLayer() );
286 mComboTargetLayer->setLayer( const_cast<QgsLabelingEngineRuleMinimumDistanceLabelToLabel *>( castRule )->targetLayer() );
287
288 mSpinDistance->setValue( castRule->distance() );
289 mDistanceUnitWidget->setUnit( castRule->distanceUnit() );
290 mDistanceUnitWidget->setMapUnitScale( castRule->distanceUnitScale() );
291
292 mBlockSignals = false;
293}
294
295QgsAbstractLabelingEngineRule *QgsLabelingEngineRuleMinimumDistanceLabelToLabelWidget::rule()
296{
297 auto res = std::make_unique<QgsLabelingEngineRuleMinimumDistanceLabelToLabel>();
298 res->setName( mEditName->text() );
299 res->setLabeledLayer( mComboLabeledLayer->currentLayer() );
300 res->setTargetLayer( mComboTargetLayer->currentLayer() );
301
302 res->setDistance( mSpinDistance->value() );
303 res->setDistanceUnit( mDistanceUnitWidget->unit() );
304 res->setDistanceUnitScale( mDistanceUnitWidget->getMapUnitScale() );
305
306 return res.release();
307}
308
309void QgsLabelingEngineRuleMinimumDistanceLabelToLabelWidget::onChanged()
310{
311 if ( !mBlockSignals )
312 emit changed();
313}
314
315
@ SpatialLayer
All spatial layers.
Definition qgis.h:225
@ Millimeters
Millimeters.
Definition qgis.h:5184
@ Points
Points (e.g., for font sizes).
Definition qgis.h:5188
@ MapUnits
Map units.
Definition qgis.h:5185
@ Pixels
Pixels.
Definition qgis.h:5186
@ Inches
Inches.
Definition qgis.h:5189
@ MetersInMapUnits
Meters value as Map units.
Definition qgis.h:5191
Qgis::RenderUnit distanceUnit() const
Returns the units for the distance between labels and the features from the targetLayer().
const QgsMapUnitScale & distanceUnitScale() const
Returns the scaling for the distance between labels and the features from the targetLayer().
double distance() const
Returns the acceptable distance threshold between labels and the features from the targetLayer().
double cost() const
Returns the penalty cost incurred when the rule is violated.
Abstract base class for labeling engine rules.
QString name() const
Returns the name for this instance of the rule.
static void enableAutoGeometryRestore(QWidget *widget, const QString &key=QString())
Register the widget to allow its position to be automatically saved and restored when open and closed...
Definition qgsgui.cpp:221
static void openHelp(const QString &key)
Opens help topic for the given help key using default system web browser.
Definition qgshelp.cpp:38
A labeling engine rule which prevents labels being placed overlapping features from a different layer...
void setRule(const QgsAbstractLabelingEngineRule *rule)
Sets the rule to show in the dialog.
QgsAbstractLabelingEngineRule * rule()
Returns the rule defined by the current settings in the dialog.
QgsLabelingEngineRuleDialog(QgsLabelingEngineRuleWidget *widget, QWidget *parent=nullptr, Qt::WindowFlags flags=QgsGuiUtils::ModalDialogFlags)
Constructor for QgsLabelingEngineRuleDialog.
A labeling engine rule which prevents labels being placed too far from features from a different laye...
A labeling engine rule which prevents labels being placed too close to features from a different laye...
A labeling engine rule which prevents labels being placed too close to labels from a different layer.
double distance() const
Returns the minimum permitted distance between labels from the labeledLayer() and the labels from the...
const QgsMapUnitScale & distanceUnitScale() const
Returns the scaling for the distance between labels from the labeledLayer() and the labels from the t...
Qgis::RenderUnit distanceUnit() const
Returns the units for the distance between labels from the labeledLayer() and the labels from the tar...
Base class for widgets which allow control over the properties of QgsAbstractLabelingEngineRule subcl...
void layerChanged(QgsMapLayer *layer)
Emitted whenever the currently selected layer changes.
void changed()
Emitted when the selected unit is changed, or the definition of the map unit scale is changed.
QList< Qgis::RenderUnit > RenderUnitList
List of render units.