QGIS API Documentation 4.1.0-Master (5bf3c20f3c9)
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, [] { QgsHelp::openHelp( u"working_with_vector/vector_properties.html#labeling-rules"_s ); } );
54}
55
57{
58 mWidget->setRule( rule );
59}
60
65
67//
68// QgsLabelingEngineRuleAvoidLabelOverlapWithFeatureWidget
69//
70
71QgsLabelingEngineRuleAvoidLabelOverlapWithFeatureWidget::QgsLabelingEngineRuleAvoidLabelOverlapWithFeatureWidget( QWidget *parent )
73{
74 setupUi( this );
75
76 setWindowTitle( tr( "Prevent Labels Overlapping Features" ) );
77 setPanelTitle( tr( "Configure Rule" ) );
78
79 mComboLabeledLayer->setFilters( Qgis::LayerFilter::SpatialLayer );
80 mComboTargetLayer->setFilters( Qgis::LayerFilter::HasGeometry );
81
82 connect( mEditName, &QLineEdit::textChanged, this, &QgsLabelingEngineRuleAvoidLabelOverlapWithFeatureWidget::onChanged );
83 connect( mComboLabeledLayer, &QgsMapLayerComboBox::layerChanged, this, &QgsLabelingEngineRuleAvoidLabelOverlapWithFeatureWidget::onChanged );
84 connect( mComboTargetLayer, &QgsMapLayerComboBox::layerChanged, this, &QgsLabelingEngineRuleAvoidLabelOverlapWithFeatureWidget::onChanged );
85}
86
87void QgsLabelingEngineRuleAvoidLabelOverlapWithFeatureWidget::setRule( const QgsAbstractLabelingEngineRule *rule )
88{
90 if ( !castRule )
91 return;
92
93 mBlockSignals = true;
94 mEditName->setText( castRule->name() );
95 mComboLabeledLayer->setLayer( const_cast<QgsLabelingEngineRuleAvoidLabelOverlapWithFeature *>( castRule )->labeledLayer() );
96 mComboTargetLayer->setLayer( const_cast<QgsLabelingEngineRuleAvoidLabelOverlapWithFeature *>( castRule )->targetLayer() );
97
98 mBlockSignals = false;
99}
100
101QgsAbstractLabelingEngineRule *QgsLabelingEngineRuleAvoidLabelOverlapWithFeatureWidget::rule()
102{
103 auto res = std::make_unique<QgsLabelingEngineRuleAvoidLabelOverlapWithFeature>();
104 res->setName( mEditName->text() );
105 res->setLabeledLayer( mComboLabeledLayer->currentLayer() );
106 res->setTargetLayer( qobject_cast<QgsVectorLayer *>( mComboTargetLayer->currentLayer() ) );
107 return res.release();
108}
109
110void QgsLabelingEngineRuleAvoidLabelOverlapWithFeatureWidget::onChanged()
111{
112 if ( !mBlockSignals )
113 emit changed();
114}
115
116//
117// QgsLabelingEngineRuleMinimumDistanceLabelToFeatureWidget
118//
119
120QgsLabelingEngineRuleMinimumDistanceLabelToFeatureWidget::QgsLabelingEngineRuleMinimumDistanceLabelToFeatureWidget( QWidget *parent )
122{
123 setupUi( this );
124
125 setWindowTitle( tr( "Push Labels Away from Features" ) );
126 setPanelTitle( tr( "Configure Rule" ) );
127
128 mComboLabeledLayer->setFilters( Qgis::LayerFilter::SpatialLayer );
129 mComboTargetLayer->setFilters( Qgis::LayerFilter::HasGeometry );
130
131 mDistanceUnitWidget->setUnits(
133 );
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
201 mDistanceUnitWidget->setUnits(
203 );
204
205 connect( mEditName, &QLineEdit::textChanged, this, &QgsLabelingEngineRuleMaximumDistanceLabelToFeatureWidget::onChanged );
206 connect( mComboLabeledLayer, &QgsMapLayerComboBox::layerChanged, this, &QgsLabelingEngineRuleMaximumDistanceLabelToFeatureWidget::onChanged );
207 connect( mComboTargetLayer, &QgsMapLayerComboBox::layerChanged, this, &QgsLabelingEngineRuleMaximumDistanceLabelToFeatureWidget::onChanged );
208
209 connect( mSpinDistance, qOverload<double>( &QgsDoubleSpinBox::valueChanged ), this, &QgsLabelingEngineRuleMaximumDistanceLabelToFeatureWidget::onChanged );
210 connect( mDistanceUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsLabelingEngineRuleMaximumDistanceLabelToFeatureWidget::onChanged );
211 connect( mCostSlider, &QSlider::valueChanged, this, &QgsLabelingEngineRuleMaximumDistanceLabelToFeatureWidget::onChanged );
212}
213
214void QgsLabelingEngineRuleMaximumDistanceLabelToFeatureWidget::setRule( const QgsAbstractLabelingEngineRule *rule )
215{
217 if ( !castRule )
218 return;
219
220 mBlockSignals = true;
221 mEditName->setText( castRule->name() );
222 mComboLabeledLayer->setLayer( const_cast<QgsLabelingEngineRuleMaximumDistanceLabelToFeature *>( castRule )->labeledLayer() );
223 mComboTargetLayer->setLayer( const_cast<QgsLabelingEngineRuleMaximumDistanceLabelToFeature *>( castRule )->targetLayer() );
224
225 mSpinDistance->setValue( castRule->distance() );
226 mDistanceUnitWidget->setUnit( castRule->distanceUnit() );
227 mDistanceUnitWidget->setMapUnitScale( castRule->distanceUnitScale() );
228
229 mCostSlider->setValue( static_cast<int>( castRule->cost() * 10 ) );
230
231 mBlockSignals = false;
232}
233
234QgsAbstractLabelingEngineRule *QgsLabelingEngineRuleMaximumDistanceLabelToFeatureWidget::rule()
235{
236 auto res = std::make_unique<QgsLabelingEngineRuleMaximumDistanceLabelToFeature>();
237 res->setName( mEditName->text() );
238 res->setLabeledLayer( mComboLabeledLayer->currentLayer() );
239 res->setTargetLayer( qobject_cast<QgsVectorLayer *>( mComboTargetLayer->currentLayer() ) );
240
241 res->setDistance( mSpinDistance->value() );
242 res->setDistanceUnit( mDistanceUnitWidget->unit() );
243 res->setDistanceUnitScale( mDistanceUnitWidget->getMapUnitScale() );
244
245 res->setCost( mCostSlider->value() / 10.0 );
246
247 return res.release();
248}
249
250void QgsLabelingEngineRuleMaximumDistanceLabelToFeatureWidget::onChanged()
251{
252 if ( !mBlockSignals )
253 emit changed();
254}
255
256
257//
258// QgsLabelingEngineRuleMinimumDistanceLabelToLabelWidget
259//
260
261QgsLabelingEngineRuleMinimumDistanceLabelToLabelWidget::QgsLabelingEngineRuleMinimumDistanceLabelToLabelWidget( QWidget *parent )
263{
264 setupUi( this );
265
266 setWindowTitle( tr( "Pull Labels toward Features" ) );
267 setPanelTitle( tr( "Configure Rule" ) );
268
269 mComboLabeledLayer->setFilters( Qgis::LayerFilter::SpatialLayer );
270 mComboTargetLayer->setFilters( Qgis::LayerFilter::SpatialLayer );
271
272 mDistanceUnitWidget->setUnits(
274 );
275
276 connect( mEditName, &QLineEdit::textChanged, this, &QgsLabelingEngineRuleMinimumDistanceLabelToLabelWidget::onChanged );
277 connect( mComboLabeledLayer, &QgsMapLayerComboBox::layerChanged, this, &QgsLabelingEngineRuleMinimumDistanceLabelToLabelWidget::onChanged );
278 connect( mComboTargetLayer, &QgsMapLayerComboBox::layerChanged, this, &QgsLabelingEngineRuleMinimumDistanceLabelToLabelWidget::onChanged );
279
280 connect( mSpinDistance, qOverload<double>( &QgsDoubleSpinBox::valueChanged ), this, &QgsLabelingEngineRuleMinimumDistanceLabelToLabelWidget::onChanged );
281 connect( mDistanceUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsLabelingEngineRuleMinimumDistanceLabelToLabelWidget::onChanged );
282}
283
284void QgsLabelingEngineRuleMinimumDistanceLabelToLabelWidget::setRule( const QgsAbstractLabelingEngineRule *rule )
285{
287 if ( !castRule )
288 return;
289
290 mBlockSignals = true;
291 mEditName->setText( castRule->name() );
292 mComboLabeledLayer->setLayer( const_cast<QgsLabelingEngineRuleMinimumDistanceLabelToLabel *>( castRule )->labeledLayer() );
293 mComboTargetLayer->setLayer( const_cast<QgsLabelingEngineRuleMinimumDistanceLabelToLabel *>( castRule )->targetLayer() );
294
295 mSpinDistance->setValue( castRule->distance() );
296 mDistanceUnitWidget->setUnit( castRule->distanceUnit() );
297 mDistanceUnitWidget->setMapUnitScale( castRule->distanceUnitScale() );
298
299 mBlockSignals = false;
300}
301
302QgsAbstractLabelingEngineRule *QgsLabelingEngineRuleMinimumDistanceLabelToLabelWidget::rule()
303{
304 auto res = std::make_unique<QgsLabelingEngineRuleMinimumDistanceLabelToLabel>();
305 res->setName( mEditName->text() );
306 res->setLabeledLayer( mComboLabeledLayer->currentLayer() );
307 res->setTargetLayer( mComboTargetLayer->currentLayer() );
308
309 res->setDistance( mSpinDistance->value() );
310 res->setDistanceUnit( mDistanceUnitWidget->unit() );
311 res->setDistanceUnitScale( mDistanceUnitWidget->getMapUnitScale() );
312
313 return res.release();
314}
315
316void QgsLabelingEngineRuleMinimumDistanceLabelToLabelWidget::onChanged()
317{
318 if ( !mBlockSignals )
319 emit changed();
320}
321
322
@ SpatialLayer
All spatial layers.
Definition qgis.h:241
@ Millimeters
Millimeters.
Definition qgis.h:5341
@ Points
Points (e.g., for font sizes).
Definition qgis.h:5345
@ MapUnits
Map units.
Definition qgis.h:5342
@ Pixels
Pixels.
Definition qgis.h:5343
@ Inches
Inches.
Definition qgis.h:5346
@ MetersInMapUnits
Meters value as Map units.
Definition qgis.h:5348
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.