QGIS API Documentation 3.99.0-Master (d270888f95f)
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#include <QString>
25
26#include "moc_qgslabelingenginerulewidget.cpp"
27
28using namespace Qt::StringLiterals;
29
30//
31// QgsLabelingEngineRuleDialog
32//
33
35 : QDialog( parent, flags )
36 , mWidget( widget )
37{
38 Q_ASSERT( mWidget );
39 setWindowTitle( tr( "Configure Rule" ) );
40 setObjectName( u"QgsLabelingEngineRuleDialog"_s );
41
42 QVBoxLayout *layout = new QVBoxLayout( this );
43 layout->addWidget( mWidget );
44
45 mButtonBox = new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::Help, Qt::Horizontal, this );
46 layout->addWidget( mButtonBox );
47
48 setLayout( layout );
50
51 connect( mButtonBox->button( QDialogButtonBox::Ok ), &QAbstractButton::clicked, this, &QDialog::accept );
52 connect( mButtonBox->button( QDialogButtonBox::Cancel ), &QAbstractButton::clicked, this, &QDialog::reject );
53 connect( mButtonBox, &QDialogButtonBox::helpRequested, this, [] {
54 QgsHelp::openHelp( u"working_with_vector/vector_properties.html#labeling-rules"_s );
55 } );
56}
57
59{
60 mWidget->setRule( rule );
61}
62
67
69//
70// QgsLabelingEngineRuleAvoidLabelOverlapWithFeatureWidget
71//
72
73QgsLabelingEngineRuleAvoidLabelOverlapWithFeatureWidget::QgsLabelingEngineRuleAvoidLabelOverlapWithFeatureWidget( QWidget *parent )
75{
76 setupUi( this );
77
78 setWindowTitle( tr( "Prevent Labels Overlapping Features" ) );
79 setPanelTitle( tr( "Configure Rule" ) );
80
81 mComboLabeledLayer->setFilters( Qgis::LayerFilter::SpatialLayer );
82 mComboTargetLayer->setFilters( Qgis::LayerFilter::HasGeometry );
83
84 connect( mEditName, &QLineEdit::textChanged, this, &QgsLabelingEngineRuleAvoidLabelOverlapWithFeatureWidget::onChanged );
85 connect( mComboLabeledLayer, &QgsMapLayerComboBox::layerChanged, this, &QgsLabelingEngineRuleAvoidLabelOverlapWithFeatureWidget::onChanged );
86 connect( mComboTargetLayer, &QgsMapLayerComboBox::layerChanged, this, &QgsLabelingEngineRuleAvoidLabelOverlapWithFeatureWidget::onChanged );
87}
88
89void QgsLabelingEngineRuleAvoidLabelOverlapWithFeatureWidget::setRule( const QgsAbstractLabelingEngineRule *rule )
90{
92 if ( !castRule )
93 return;
94
95 mBlockSignals = true;
96 mEditName->setText( castRule->name() );
97 mComboLabeledLayer->setLayer( const_cast<QgsLabelingEngineRuleAvoidLabelOverlapWithFeature *>( castRule )->labeledLayer() );
98 mComboTargetLayer->setLayer( const_cast<QgsLabelingEngineRuleAvoidLabelOverlapWithFeature *>( castRule )->targetLayer() );
99
100 mBlockSignals = false;
101}
102
103QgsAbstractLabelingEngineRule *QgsLabelingEngineRuleAvoidLabelOverlapWithFeatureWidget::rule()
104{
105 auto res = std::make_unique<QgsLabelingEngineRuleAvoidLabelOverlapWithFeature>();
106 res->setName( mEditName->text() );
107 res->setLabeledLayer( mComboLabeledLayer->currentLayer() );
108 res->setTargetLayer( qobject_cast<QgsVectorLayer *>( mComboTargetLayer->currentLayer() ) );
109 return res.release();
110}
111
112void QgsLabelingEngineRuleAvoidLabelOverlapWithFeatureWidget::onChanged()
113{
114 if ( !mBlockSignals )
115 emit changed();
116}
117
118//
119// QgsLabelingEngineRuleMinimumDistanceLabelToFeatureWidget
120//
121
122QgsLabelingEngineRuleMinimumDistanceLabelToFeatureWidget::QgsLabelingEngineRuleMinimumDistanceLabelToFeatureWidget( QWidget *parent )
124{
125 setupUi( this );
126
127 setWindowTitle( tr( "Push Labels Away from Features" ) );
128 setPanelTitle( tr( "Configure Rule" ) );
129
130 mComboLabeledLayer->setFilters( Qgis::LayerFilter::SpatialLayer );
131 mComboTargetLayer->setFilters( Qgis::LayerFilter::HasGeometry );
132
134
135 connect( mEditName, &QLineEdit::textChanged, this, &QgsLabelingEngineRuleMinimumDistanceLabelToFeatureWidget::onChanged );
136 connect( mComboLabeledLayer, &QgsMapLayerComboBox::layerChanged, this, &QgsLabelingEngineRuleMinimumDistanceLabelToFeatureWidget::onChanged );
137 connect( mComboTargetLayer, &QgsMapLayerComboBox::layerChanged, this, &QgsLabelingEngineRuleMinimumDistanceLabelToFeatureWidget::onChanged );
138
139 connect( mSpinDistance, qOverload<double>( &QgsDoubleSpinBox::valueChanged ), this, &QgsLabelingEngineRuleMinimumDistanceLabelToFeatureWidget::onChanged );
140 connect( mDistanceUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsLabelingEngineRuleMinimumDistanceLabelToFeatureWidget::onChanged );
141 connect( mCostSlider, &QSlider::valueChanged, this, &QgsLabelingEngineRuleMinimumDistanceLabelToFeatureWidget::onChanged );
142}
143
144void QgsLabelingEngineRuleMinimumDistanceLabelToFeatureWidget::setRule( const QgsAbstractLabelingEngineRule *rule )
145{
147 if ( !castRule )
148 return;
149
150 mBlockSignals = true;
151 mEditName->setText( castRule->name() );
152 mComboLabeledLayer->setLayer( const_cast<QgsLabelingEngineRuleMinimumDistanceLabelToFeature *>( castRule )->labeledLayer() );
153 mComboTargetLayer->setLayer( const_cast<QgsLabelingEngineRuleMinimumDistanceLabelToFeature *>( castRule )->targetLayer() );
154
155 mSpinDistance->setValue( castRule->distance() );
156 mDistanceUnitWidget->setUnit( castRule->distanceUnit() );
157 mDistanceUnitWidget->setMapUnitScale( castRule->distanceUnitScale() );
158
159 mCostSlider->setValue( static_cast<int>( castRule->cost() * 10 ) );
160
161 mBlockSignals = false;
162}
163
164QgsAbstractLabelingEngineRule *QgsLabelingEngineRuleMinimumDistanceLabelToFeatureWidget::rule()
165{
166 auto res = std::make_unique<QgsLabelingEngineRuleMinimumDistanceLabelToFeature>();
167 res->setName( mEditName->text() );
168 res->setLabeledLayer( mComboLabeledLayer->currentLayer() );
169 res->setTargetLayer( qobject_cast<QgsVectorLayer *>( mComboTargetLayer->currentLayer() ) );
170
171 res->setDistance( mSpinDistance->value() );
172 res->setDistanceUnit( mDistanceUnitWidget->unit() );
173 res->setDistanceUnitScale( mDistanceUnitWidget->getMapUnitScale() );
174
175 res->setCost( mCostSlider->value() / 10.0 );
176
177 return res.release();
178}
179
180void QgsLabelingEngineRuleMinimumDistanceLabelToFeatureWidget::onChanged()
181{
182 if ( !mBlockSignals )
183 emit changed();
184}
185
186//
187// QgsLabelingEngineRuleMaximumDistanceLabelToFeatureWidget
188//
189
190QgsLabelingEngineRuleMaximumDistanceLabelToFeatureWidget::QgsLabelingEngineRuleMaximumDistanceLabelToFeatureWidget( QWidget *parent )
192{
193 setupUi( this );
194
195 setWindowTitle( tr( "Pull Labels toward Features" ) );
196 setPanelTitle( tr( "Configure Rule" ) );
197
198 mComboLabeledLayer->setFilters( Qgis::LayerFilter::SpatialLayer );
199 mComboTargetLayer->setFilters( Qgis::LayerFilter::HasGeometry );
200
202
203 connect( mEditName, &QLineEdit::textChanged, this, &QgsLabelingEngineRuleMaximumDistanceLabelToFeatureWidget::onChanged );
204 connect( mComboLabeledLayer, &QgsMapLayerComboBox::layerChanged, this, &QgsLabelingEngineRuleMaximumDistanceLabelToFeatureWidget::onChanged );
205 connect( mComboTargetLayer, &QgsMapLayerComboBox::layerChanged, this, &QgsLabelingEngineRuleMaximumDistanceLabelToFeatureWidget::onChanged );
206
207 connect( mSpinDistance, qOverload<double>( &QgsDoubleSpinBox::valueChanged ), this, &QgsLabelingEngineRuleMaximumDistanceLabelToFeatureWidget::onChanged );
208 connect( mDistanceUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsLabelingEngineRuleMaximumDistanceLabelToFeatureWidget::onChanged );
209 connect( mCostSlider, &QSlider::valueChanged, this, &QgsLabelingEngineRuleMaximumDistanceLabelToFeatureWidget::onChanged );
210}
211
212void QgsLabelingEngineRuleMaximumDistanceLabelToFeatureWidget::setRule( const QgsAbstractLabelingEngineRule *rule )
213{
215 if ( !castRule )
216 return;
217
218 mBlockSignals = true;
219 mEditName->setText( castRule->name() );
220 mComboLabeledLayer->setLayer( const_cast<QgsLabelingEngineRuleMaximumDistanceLabelToFeature *>( castRule )->labeledLayer() );
221 mComboTargetLayer->setLayer( const_cast<QgsLabelingEngineRuleMaximumDistanceLabelToFeature *>( castRule )->targetLayer() );
222
223 mSpinDistance->setValue( castRule->distance() );
224 mDistanceUnitWidget->setUnit( castRule->distanceUnit() );
225 mDistanceUnitWidget->setMapUnitScale( castRule->distanceUnitScale() );
226
227 mCostSlider->setValue( static_cast<int>( castRule->cost() * 10 ) );
228
229 mBlockSignals = false;
230}
231
232QgsAbstractLabelingEngineRule *QgsLabelingEngineRuleMaximumDistanceLabelToFeatureWidget::rule()
233{
234 auto res = std::make_unique<QgsLabelingEngineRuleMaximumDistanceLabelToFeature>();
235 res->setName( mEditName->text() );
236 res->setLabeledLayer( mComboLabeledLayer->currentLayer() );
237 res->setTargetLayer( qobject_cast<QgsVectorLayer *>( mComboTargetLayer->currentLayer() ) );
238
239 res->setDistance( mSpinDistance->value() );
240 res->setDistanceUnit( mDistanceUnitWidget->unit() );
241 res->setDistanceUnitScale( mDistanceUnitWidget->getMapUnitScale() );
242
243 res->setCost( mCostSlider->value() / 10.0 );
244
245 return res.release();
246}
247
248void QgsLabelingEngineRuleMaximumDistanceLabelToFeatureWidget::onChanged()
249{
250 if ( !mBlockSignals )
251 emit changed();
252}
253
254
255//
256// QgsLabelingEngineRuleMinimumDistanceLabelToLabelWidget
257//
258
259QgsLabelingEngineRuleMinimumDistanceLabelToLabelWidget::QgsLabelingEngineRuleMinimumDistanceLabelToLabelWidget( QWidget *parent )
261{
262 setupUi( this );
263
264 setWindowTitle( tr( "Pull Labels toward Features" ) );
265 setPanelTitle( tr( "Configure Rule" ) );
266
267 mComboLabeledLayer->setFilters( Qgis::LayerFilter::SpatialLayer );
268 mComboTargetLayer->setFilters( Qgis::LayerFilter::SpatialLayer );
269
271
272 connect( mEditName, &QLineEdit::textChanged, this, &QgsLabelingEngineRuleMinimumDistanceLabelToLabelWidget::onChanged );
273 connect( mComboLabeledLayer, &QgsMapLayerComboBox::layerChanged, this, &QgsLabelingEngineRuleMinimumDistanceLabelToLabelWidget::onChanged );
274 connect( mComboTargetLayer, &QgsMapLayerComboBox::layerChanged, this, &QgsLabelingEngineRuleMinimumDistanceLabelToLabelWidget::onChanged );
275
276 connect( mSpinDistance, qOverload<double>( &QgsDoubleSpinBox::valueChanged ), this, &QgsLabelingEngineRuleMinimumDistanceLabelToLabelWidget::onChanged );
277 connect( mDistanceUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsLabelingEngineRuleMinimumDistanceLabelToLabelWidget::onChanged );
278}
279
280void QgsLabelingEngineRuleMinimumDistanceLabelToLabelWidget::setRule( const QgsAbstractLabelingEngineRule *rule )
281{
283 if ( !castRule )
284 return;
285
286 mBlockSignals = true;
287 mEditName->setText( castRule->name() );
288 mComboLabeledLayer->setLayer( const_cast<QgsLabelingEngineRuleMinimumDistanceLabelToLabel *>( castRule )->labeledLayer() );
289 mComboTargetLayer->setLayer( const_cast<QgsLabelingEngineRuleMinimumDistanceLabelToLabel *>( castRule )->targetLayer() );
290
291 mSpinDistance->setValue( castRule->distance() );
292 mDistanceUnitWidget->setUnit( castRule->distanceUnit() );
293 mDistanceUnitWidget->setMapUnitScale( castRule->distanceUnitScale() );
294
295 mBlockSignals = false;
296}
297
298QgsAbstractLabelingEngineRule *QgsLabelingEngineRuleMinimumDistanceLabelToLabelWidget::rule()
299{
300 auto res = std::make_unique<QgsLabelingEngineRuleMinimumDistanceLabelToLabel>();
301 res->setName( mEditName->text() );
302 res->setLabeledLayer( mComboLabeledLayer->currentLayer() );
303 res->setTargetLayer( mComboTargetLayer->currentLayer() );
304
305 res->setDistance( mSpinDistance->value() );
306 res->setDistanceUnit( mDistanceUnitWidget->unit() );
307 res->setDistanceUnitScale( mDistanceUnitWidget->getMapUnitScale() );
308
309 return res.release();
310}
311
312void QgsLabelingEngineRuleMinimumDistanceLabelToLabelWidget::onChanged()
313{
314 if ( !mBlockSignals )
315 emit changed();
316}
317
318
@ SpatialLayer
All spatial layers.
Definition qgis.h:228
@ Millimeters
Millimeters.
Definition qgis.h:5256
@ Points
Points (e.g., for font sizes).
Definition qgis.h:5260
@ MapUnits
Map units.
Definition qgis.h:5257
@ Pixels
Pixels.
Definition qgis.h:5258
@ Inches
Inches.
Definition qgis.h:5261
@ MetersInMapUnits
Meters value as Map units.
Definition qgis.h:5263
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:224
static void openHelp(const QString &key)
Opens help topic for the given help key using default system web browser.
Definition qgshelp.cpp:41
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.