Skip to content

Commit 2263435

Browse files
committedAug 13, 2012
Add min/max scale-based visibility to advanced labeling data defined columns
- Layer-level options, if set, will override data defined values (correct behavior IMHO) - Spinboxes for min and max added to Change Label tool's dialog - Seems to still be a bug in renderer scale-to-value comparison, where equal scales are not always equal if user directly enters values in the map canvas scale combobox
1 parent ad6c964 commit 2263435

File tree

7 files changed

+217
-36
lines changed

7 files changed

+217
-36
lines changed
 

‎src/app/qgslabelinggui.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,8 @@ QgsPalLayerSettings QgsLabelingGui::layerSettings()
354354
setDataDefinedProperty( mLabelDistanceComboBox, QgsPalLayerSettings::LabelDistance, lyr );
355355
setDataDefinedProperty( mRotationComboBox, QgsPalLayerSettings::Rotation, lyr );
356356
setDataDefinedProperty( mShowLabelAttributeComboBox, QgsPalLayerSettings::Show, lyr );
357+
setDataDefinedProperty( mMinScaleAttributeComboBox, QgsPalLayerSettings::MinScale, lyr );
358+
setDataDefinedProperty( mMaxScaleAttributeComboBox, QgsPalLayerSettings::MaxScale, lyr );
357359

358360
return lyr;
359361
}
@@ -419,6 +421,8 @@ void QgsLabelingGui::populateDataDefinedCombos( QgsPalLayerSettings& s )
419421
comboList << mLabelDistanceComboBox;
420422
comboList << mRotationComboBox;
421423
comboList << mShowLabelAttributeComboBox;
424+
comboList << mMinScaleAttributeComboBox;
425+
comboList << mMaxScaleAttributeComboBox;
422426

423427
QList<QComboBox*>::iterator comboIt = comboList.begin();
424428
for ( ; comboIt != comboList.end(); ++comboIt )
@@ -453,6 +457,8 @@ void QgsLabelingGui::populateDataDefinedCombos( QgsPalLayerSettings& s )
453457
setCurrentComboValue( mLabelDistanceComboBox, s, QgsPalLayerSettings::LabelDistance );
454458
setCurrentComboValue( mRotationComboBox, s, QgsPalLayerSettings::Rotation );
455459
setCurrentComboValue( mShowLabelAttributeComboBox, s, QgsPalLayerSettings::Show );
460+
setCurrentComboValue( mMinScaleAttributeComboBox, s, QgsPalLayerSettings::MinScale );
461+
setCurrentComboValue( mMaxScaleAttributeComboBox, s, QgsPalLayerSettings::MaxScale );
456462
}
457463

458464
void QgsLabelingGui::changePreviewBackground()

‎src/app/qgslabelpropertydialog.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@ void QgsLabelPropertyDialog::init( const QString& layerId, int featureId )
9696
mBufferColorButton->setColor( layerSettings.textColor );
9797
mLabelDistanceSpinBox->setValue( layerSettings.dist );
9898
mBufferSizeSpinBox->setValue( layerSettings.bufferSize );
99+
mMinScaleSpinBox->setValue( layerSettings.scaleMin );
100+
mMaxScaleSpinBox->setValue( layerSettings.scaleMax );
99101
mHaliComboBox->setCurrentIndex( mHaliComboBox->findText( "Left" ) );
100102
mValiComboBox->setCurrentIndex( mValiComboBox->findText( "Bottom" ) );
101103

@@ -112,6 +114,14 @@ void QgsLabelPropertyDialog::init( const QString& layerId, int featureId )
112114
mShowLabelChkbx->setEnabled( true );
113115
mShowLabelChkbx->setChecked( attributeValues[propIt.value()].toInt() != 0 );
114116
break;
117+
case QgsPalLayerSettings::MinScale:
118+
mMinScaleSpinBox->setEnabled( true );
119+
mMinScaleSpinBox->setValue( attributeValues[propIt.value()].toInt() );
120+
break;
121+
case QgsPalLayerSettings::MaxScale:
122+
mMaxScaleSpinBox->setEnabled( true );
123+
mMaxScaleSpinBox->setValue( attributeValues[propIt.value()].toInt() );
124+
break;
115125
case QgsPalLayerSettings::Size:
116126
mFontSizeSpinBox->setEnabled( true );
117127
mLabelFont.setPointSizeF( attributeValues[propIt.value()].toDouble() );
@@ -181,6 +191,8 @@ void QgsLabelPropertyDialog::init( const QString& layerId, int featureId )
181191
void QgsLabelPropertyDialog::disableGuiElements()
182192
{
183193
mShowLabelChkbx->setEnabled( false );
194+
mMinScaleSpinBox->setEnabled( false );
195+
mMaxScaleSpinBox->setEnabled( false );
184196
mFontSizeSpinBox->setEnabled( false );
185197
mBufferSizeSpinBox->setEnabled( false );
186198
mFontPushButton->setEnabled( false );
@@ -197,6 +209,8 @@ void QgsLabelPropertyDialog::disableGuiElements()
197209
void QgsLabelPropertyDialog::blockElementSignals( bool block )
198210
{
199211
mShowLabelChkbx->blockSignals( block );
212+
mMinScaleSpinBox->blockSignals( block );
213+
mMaxScaleSpinBox->blockSignals( block );
200214
mFontSizeSpinBox->blockSignals( block );
201215
mBufferSizeSpinBox->blockSignals( block );
202216
mFontPushButton->blockSignals( block );
@@ -229,6 +243,16 @@ void QgsLabelPropertyDialog::on_mShowLabelChkbx_toggled( bool chkd )
229243
insertChangedValue( QgsPalLayerSettings::Show, ( chkd ? 1 : 0 ) );
230244
}
231245

246+
void QgsLabelPropertyDialog::on_mMinScaleSpinBox_valueChanged( int i )
247+
{
248+
insertChangedValue( QgsPalLayerSettings::MinScale, i );
249+
}
250+
251+
void QgsLabelPropertyDialog::on_mMaxScaleSpinBox_valueChanged(int i )
252+
{
253+
insertChangedValue( QgsPalLayerSettings::MaxScale, i );
254+
}
255+
232256
void QgsLabelPropertyDialog::on_mLabelDistanceSpinBox_valueChanged( double d )
233257
{
234258
insertChangedValue( QgsPalLayerSettings::LabelDistance, d );

‎src/app/qgslabelpropertydialog.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ class QgsLabelPropertyDialog: public QDialog, private Ui::QgsLabelPropertyDialog
3838

3939
private slots:
4040
void on_mShowLabelChkbx_toggled( bool chkd );
41+
void on_mMinScaleSpinBox_valueChanged(int i );
42+
void on_mMaxScaleSpinBox_valueChanged( int i );
4143
void on_mLabelDistanceSpinBox_valueChanged( double d );
4244
void on_mXCoordSpinBox_valueChanged( double d );
4345
void on_mYCoordSpinBox_valueChanged( double d );

‎src/core/qgspallabeling.cpp

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ static void _writeDataDefinedPropertyMap( QgsVectorLayer* layer, const QMap< Qgs
245245
{
246246
return;
247247
}
248-
for ( int i = 0; i < 16; ++i )
248+
for ( int i = 0; i < 18; ++i )
249249
{
250250
QMap< QgsPalLayerSettings::DataDefinedProperties, int >::const_iterator it = propertyMap.find(( QgsPalLayerSettings::DataDefinedProperties )i );
251251
QVariant propertyValue;
@@ -301,6 +301,8 @@ static void _readDataDefinedPropertyMap( QgsVectorLayer* layer, QMap< QgsPalLaye
301301
_readDataDefinedProperty( layer, QgsPalLayerSettings::LabelDistance, propertyMap );
302302
_readDataDefinedProperty( layer, QgsPalLayerSettings::Rotation, propertyMap );
303303
_readDataDefinedProperty( layer, QgsPalLayerSettings::Show, propertyMap );
304+
_readDataDefinedProperty( layer, QgsPalLayerSettings::MinScale, propertyMap );
305+
_readDataDefinedProperty( layer, QgsPalLayerSettings::MaxScale, propertyMap );
304306
}
305307

306308
void QgsPalLayerSettings::readFromLayer( QgsVectorLayer* layer )
@@ -486,6 +488,40 @@ void QgsPalLayerSettings::registerFeature( QgsVectorLayer* layer, QgsFeature& f
486488
}
487489
}
488490

491+
// data defined min scale?
492+
QMap< DataDefinedProperties, int >::const_iterator minScaleIt = dataDefinedProperties.find( QgsPalLayerSettings::MinScale );
493+
if ( minScaleIt != dataDefinedProperties.constEnd() )
494+
{
495+
QVariant minScaleValue = f.attributeMap().value( *minScaleIt );
496+
if ( minScaleValue.isValid() )
497+
{
498+
bool conversionOk;
499+
int minScale = minScaleValue.toInt( &conversionOk );
500+
// TODO: occasional floating point issues?
501+
if ( conversionOk && int( context.rendererScale() ) < minScale )
502+
{
503+
return;
504+
}
505+
}
506+
}
507+
508+
// data defined max scale?
509+
QMap< DataDefinedProperties, int >::const_iterator maxScaleIt = dataDefinedProperties.find( QgsPalLayerSettings::MaxScale );
510+
if ( maxScaleIt != dataDefinedProperties.constEnd() )
511+
{
512+
QVariant maxScaleValue = f.attributeMap().value( *maxScaleIt );
513+
if ( maxScaleValue.isValid() )
514+
{
515+
bool conversionOk;
516+
int maxScale = maxScaleValue.toInt( &conversionOk );
517+
// TODO: occasional floating point issues?
518+
if ( conversionOk && int( context.rendererScale() ) > maxScale )
519+
{
520+
return;
521+
}
522+
}
523+
}
524+
489525
QString labelText;
490526
// Check to see if we are a expression string.
491527
if ( isExpression )

‎src/core/qgspallabeling.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,9 @@ class CORE_EXPORT QgsPalLayerSettings
9898
Vali, //vertical alignment for data defined label position (Bottom, Base, Half, Cap, Top)
9999
LabelDistance,
100100
Rotation, //data defined rotation (only useful in connection with data defined position)
101-
Show
101+
Show,
102+
MinScale,
103+
MaxScale
102104
};
103105

104106
QString fieldName;

‎src/ui/qgslabelingguibase.ui

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2047,7 +2047,7 @@
20472047
<item row="1" column="1">
20482048
<widget class="QComboBox" name="mMinScaleAttributeComboBox">
20492049
<property name="enabled">
2050-
<bool>false</bool>
2050+
<bool>true</bool>
20512051
</property>
20522052
</widget>
20532053
</item>
@@ -2085,7 +2085,7 @@
20852085
<item row="2" column="1">
20862086
<widget class="QComboBox" name="mMaxScaleAttributeComboBox">
20872087
<property name="enabled">
2088-
<bool>false</bool>
2088+
<bool>true</bool>
20892089
</property>
20902090
</widget>
20912091
</item>

‎src/ui/qgslabelpropertydialogbase.ui

Lines changed: 143 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
<rect>
77
<x>0</x>
88
<y>0</y>
9-
<width>326</width>
10-
<height>535</height>
9+
<width>411</width>
10+
<height>570</height>
1111
</rect>
1212
</property>
1313
<property name="windowTitle">
@@ -34,10 +34,36 @@
3434
<string>Font</string>
3535
</property>
3636
<layout class="QGridLayout" name="gridLayout">
37+
<item row="0" column="1">
38+
<widget class="QgsColorButton" name="mFontColorButton">
39+
<property name="sizePolicy">
40+
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
41+
<horstretch>0</horstretch>
42+
<verstretch>0</verstretch>
43+
</sizepolicy>
44+
</property>
45+
<property name="text">
46+
<string/>
47+
</property>
48+
</widget>
49+
</item>
50+
<item row="0" column="2">
51+
<widget class="QPushButton" name="mFontPushButton">
52+
<property name="text">
53+
<string>Font</string>
54+
</property>
55+
</widget>
56+
</item>
3757
<item row="0" column="0">
3858
<layout class="QHBoxLayout" name="horizontalLayout">
3959
<item>
4060
<widget class="QLabel" name="mFontSizeLabel">
61+
<property name="sizePolicy">
62+
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
63+
<horstretch>0</horstretch>
64+
<verstretch>0</verstretch>
65+
</sizepolicy>
66+
</property>
4167
<property name="text">
4268
<string>Size</string>
4369
</property>
@@ -52,23 +78,61 @@
5278
</item>
5379
</layout>
5480
</item>
55-
<item row="0" column="2">
56-
<widget class="QPushButton" name="mFontPushButton">
81+
</layout>
82+
</widget>
83+
</item>
84+
<item row="1" column="0">
85+
<widget class="QGroupBox" name="groupBox">
86+
<property name="title">
87+
<string>Display</string>
88+
</property>
89+
<layout class="QGridLayout" name="gridLayout_5">
90+
<item row="0" column="0" colspan="3">
91+
<widget class="QCheckBox" name="mShowLabelChkbx">
5792
<property name="text">
58-
<string>Font</string>
93+
<string>Show label</string>
5994
</property>
6095
</widget>
6196
</item>
62-
<item row="0" column="1">
63-
<widget class="QgsColorButton" name="mFontColorButton">
97+
<item row="1" column="2">
98+
<widget class="QSpinBox" name="mMaxScaleSpinBox">
99+
<property name="prefix">
100+
<string>Max </string>
101+
</property>
102+
<property name="minimum">
103+
<number>1</number>
104+
</property>
105+
<property name="maximum">
106+
<number>999999999</number>
107+
</property>
108+
<property name="value">
109+
<number>10000000</number>
110+
</property>
111+
</widget>
112+
</item>
113+
<item row="1" column="1">
114+
<widget class="QSpinBox" name="mMinScaleSpinBox">
115+
<property name="prefix">
116+
<string>Min </string>
117+
</property>
118+
<property name="minimum">
119+
<number>1</number>
120+
</property>
121+
<property name="maximum">
122+
<number>999999999</number>
123+
</property>
124+
</widget>
125+
</item>
126+
<item row="1" column="0">
127+
<widget class="QLabel" name="label">
64128
<property name="sizePolicy">
65-
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
129+
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
66130
<horstretch>0</horstretch>
67131
<verstretch>0</verstretch>
68132
</sizepolicy>
69133
</property>
70134
<property name="text">
71-
<string/>
135+
<string>Scale-based</string>
72136
</property>
73137
</widget>
74138
</item>
@@ -85,6 +149,12 @@
85149
<layout class="QHBoxLayout" name="horizontalLayout_2">
86150
<item>
87151
<widget class="QLabel" name="mBufferSizeLabel">
152+
<property name="sizePolicy">
153+
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
154+
<horstretch>0</horstretch>
155+
<verstretch>0</verstretch>
156+
</sizepolicy>
157+
</property>
88158
<property name="text">
89159
<string>Size</string>
90160
</property>
@@ -123,23 +193,42 @@
123193
<layout class="QGridLayout" name="gridLayout_3">
124194
<item row="0" column="0">
125195
<widget class="QLabel" name="mLabelDistanceLabel">
196+
<property name="sizePolicy">
197+
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
198+
<horstretch>0</horstretch>
199+
<verstretch>0</verstretch>
200+
</sizepolicy>
201+
</property>
126202
<property name="text">
127203
<string>Label distance</string>
128204
</property>
129205
</widget>
130206
</item>
131207
<item row="0" column="1">
132-
<widget class="QDoubleSpinBox" name="mLabelDistanceSpinBox"/>
208+
<widget class="QDoubleSpinBox" name="mLabelDistanceSpinBox">
209+
<property name="alignment">
210+
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
211+
</property>
212+
</widget>
133213
</item>
134214
<item row="1" column="0">
135215
<widget class="QLabel" name="mXCoordLabel">
216+
<property name="sizePolicy">
217+
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
218+
<horstretch>0</horstretch>
219+
<verstretch>0</verstretch>
220+
</sizepolicy>
221+
</property>
136222
<property name="text">
137223
<string>X Coordinate</string>
138224
</property>
139225
</widget>
140226
</item>
141227
<item row="1" column="1">
142228
<widget class="QDoubleSpinBox" name="mXCoordSpinBox">
229+
<property name="alignment">
230+
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
231+
</property>
143232
<property name="minimum">
144233
<double>-999999999.000000000000000</double>
145234
</property>
@@ -150,13 +239,22 @@
150239
</item>
151240
<item row="2" column="0">
152241
<widget class="QLabel" name="mYCoordLabel">
242+
<property name="sizePolicy">
243+
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
244+
<horstretch>0</horstretch>
245+
<verstretch>0</verstretch>
246+
</sizepolicy>
247+
</property>
153248
<property name="text">
154249
<string>Y Coordinate</string>
155250
</property>
156251
</widget>
157252
</item>
158253
<item row="2" column="1">
159254
<widget class="QDoubleSpinBox" name="mYCoordSpinBox">
255+
<property name="alignment">
256+
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
257+
</property>
160258
<property name="minimum">
161259
<double>-999999999.000000000000000</double>
162260
</property>
@@ -167,33 +265,62 @@
167265
</item>
168266
<item row="3" column="0">
169267
<widget class="QLabel" name="mHaliLabel">
268+
<property name="sizePolicy">
269+
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
270+
<horstretch>0</horstretch>
271+
<verstretch>0</verstretch>
272+
</sizepolicy>
273+
</property>
170274
<property name="text">
171275
<string>Horizontal alignment</string>
172276
</property>
173277
</widget>
174278
</item>
175279
<item row="3" column="1">
176-
<widget class="QComboBox" name="mHaliComboBox"/>
280+
<widget class="QComboBox" name="mHaliComboBox">
281+
<property name="layoutDirection">
282+
<enum>Qt::RightToLeft</enum>
283+
</property>
284+
</widget>
177285
</item>
178286
<item row="4" column="0">
179287
<widget class="QLabel" name="mValiLabel">
288+
<property name="sizePolicy">
289+
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
290+
<horstretch>0</horstretch>
291+
<verstretch>0</verstretch>
292+
</sizepolicy>
293+
</property>
180294
<property name="text">
181295
<string>Vertical alignment</string>
182296
</property>
183297
</widget>
184298
</item>
185299
<item row="4" column="1">
186-
<widget class="QComboBox" name="mValiComboBox"/>
300+
<widget class="QComboBox" name="mValiComboBox">
301+
<property name="layoutDirection">
302+
<enum>Qt::RightToLeft</enum>
303+
</property>
304+
</widget>
187305
</item>
188306
<item row="5" column="0">
189307
<widget class="QLabel" name="mRotationLabel">
308+
<property name="sizePolicy">
309+
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
310+
<horstretch>0</horstretch>
311+
<verstretch>0</verstretch>
312+
</sizepolicy>
313+
</property>
190314
<property name="text">
191315
<string>Rotation</string>
192316
</property>
193317
</widget>
194318
</item>
195319
<item row="5" column="1">
196320
<widget class="QDoubleSpinBox" name="mRotationSpinBox">
321+
<property name="alignment">
322+
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
323+
</property>
197324
<property name="maximum">
198325
<double>360.000000000000000</double>
199326
</property>
@@ -212,22 +339,6 @@
212339
</property>
213340
</widget>
214341
</item>
215-
<item row="1" column="0">
216-
<widget class="QGroupBox" name="groupBox">
217-
<property name="title">
218-
<string>Display</string>
219-
</property>
220-
<layout class="QGridLayout" name="gridLayout_5">
221-
<item row="0" column="0">
222-
<widget class="QCheckBox" name="mShowLabelChkbx">
223-
<property name="text">
224-
<string>Show label</string>
225-
</property>
226-
</widget>
227-
</item>
228-
</layout>
229-
</widget>
230-
</item>
231342
</layout>
232343
</widget>
233344
<customwidgets>
@@ -246,8 +357,8 @@
246357
<slot>accept()</slot>
247358
<hints>
248359
<hint type="sourcelabel">
249-
<x>248</x>
250-
<y>254</y>
360+
<x>254</x>
361+
<y>604</y>
251362
</hint>
252363
<hint type="destinationlabel">
253364
<x>157</x>
@@ -262,8 +373,8 @@
262373
<slot>reject()</slot>
263374
<hints>
264375
<hint type="sourcelabel">
265-
<x>316</x>
266-
<y>260</y>
376+
<x>322</x>
377+
<y>604</y>
267378
</hint>
268379
<hint type="destinationlabel">
269380
<x>286</x>

0 commit comments

Comments
 (0)
Please sign in to comment.