Skip to content

Commit a3b9d6c

Browse files
committedMay 7, 2014
Add repeat distance UI
1 parent c3d7f0d commit a3b9d6c

File tree

4 files changed

+163
-1
lines changed

4 files changed

+163
-1
lines changed
 

‎src/app/qgslabelinggui.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ QgsLabelingGui::QgsLabelingGui( QgsVectorLayer* layer, QgsMapCanvas* mapCanvas,
6262
mShadowRadiusUnitWidget->setUnits( QStringList() << tr( "mm" ) << tr( "map units" ), 1 );
6363
mPointOffsetUnitWidget->setUnits( QStringList() << tr( "mm" ) << tr( "map units" ), 1 );
6464
mLineDistanceUnitWidget->setUnits( QStringList() << tr( "mm" ) << tr( "map units" ), 1 );
65+
mRepeatDistanceUnitWidget->setUnits( QStringList() << tr( "mm" ) << tr( "map units" ), 1 );
6566

6667
mCharDlg = new QgsCharacterSelectorDialog( this );
6768

@@ -308,6 +309,11 @@ void QgsLabelingGui::init()
308309
chkLineOrientationDependent->setChecked( true );
309310
}
310311

312+
// Label repeat distance
313+
mRepeatDistanceSpinBox->setValue( lyr.repeatDistance );
314+
mRepeatDistanceUnitWidget->setUnit( lyr.repeatDistanceUnit - 1 );
315+
mRepeatDistanceUnitWidget->setMapUnitScale( lyr.repeatDistanceMapUnitScale );
316+
311317
mPrioritySlider->setValue( lyr.priority );
312318
chkNoObstacle->setChecked( lyr.obstacle );
313319
chkLabelPerFeaturePart->setChecked( lyr.labelPerPart );
@@ -591,6 +597,9 @@ QgsPalLayerSettings QgsLabelingGui::layerSettings()
591597
qFatal( "Invalid settings" );
592598
}
593599

600+
lyr.repeatDistance = mRepeatDistanceSpinBox->value();
601+
lyr.repeatDistanceUnit = static_cast<QgsPalLayerSettings::SizeUnit>(1 + mRepeatDistanceUnitWidget->getUnit());
602+
lyr.repeatDistanceMapUnitScale = mRepeatDistanceUnitWidget->getMapUnitScale();
594603

595604
lyr.textColor = btnTextColor->color();
596605
lyr.textFont = mRefFont;
@@ -779,6 +788,8 @@ QgsPalLayerSettings QgsLabelingGui::layerSettings()
779788
// TODO: is this necessary? maybe just use the data defined-only rotation?
780789
//setDataDefinedProperty( mPointAngleDDBtn, QgsPalLayerSettings::OffsetRotation, lyr );
781790
setDataDefinedProperty( mMaxCharAngleDDBtn, QgsPalLayerSettings::CurvedCharAngleInOut, lyr );
791+
setDataDefinedProperty( mRepeatDistanceDDBtn, QgsPalLayerSettings::RepeatDistance, lyr );
792+
setDataDefinedProperty( mRepeatDistanceUnitDDBtn, QgsPalLayerSettings::RepeatDistanceUnit, lyr );
782793

783794
// data defined-only
784795
setDataDefinedProperty( mCoordXDDBtn, QgsPalLayerSettings::PositionX, lyr );
@@ -1004,6 +1015,10 @@ void QgsLabelingGui::populateDataDefinedButtons( QgsPalLayerSettings& s )
10041015
// QgsDataDefinedButton::AnyType, QgsDataDefinedButton::double180RotDesc() );
10051016
mMaxCharAngleDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::CurvedCharAngleInOut ),
10061017
QgsDataDefinedButton::AnyType, tr( "double coord [<b>in,out</b> as 20.0-60.0,20.0-95.0]" ) );
1018+
mRepeatDistanceDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::RepeatDistance ),
1019+
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::doublePosDesc() );
1020+
mRepeatDistanceUnitDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::DistanceUnits ),
1021+
QgsDataDefinedButton::String, QgsDataDefinedButton::unitsMmMuDesc() );
10071022

10081023
// data defined-only
10091024
QString ddPlaceInfo = tr( "In edit mode, layer's relevant labeling map tool is:<br>"

‎src/core/qgspallabeling.cpp

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,8 @@ QgsPalLayerSettings::QgsPalLayerSettings()
322322
maxCurvedCharAngleIn = 20.0;
323323
maxCurvedCharAngleOut = -20.0;
324324
priority = 5;
325+
repeatDistance = 0;
326+
repeatDistanceUnit = MM;
325327

326328
// rendering
327329
scaleVisibility = false;
@@ -513,6 +515,9 @@ QgsPalLayerSettings::QgsPalLayerSettings( const QgsPalLayerSettings& s )
513515
maxCurvedCharAngleIn = s.maxCurvedCharAngleIn;
514516
maxCurvedCharAngleOut = s.maxCurvedCharAngleOut;
515517
priority = s.priority;
518+
repeatDistance = s.repeatDistance;
519+
repeatDistanceUnit = s.repeatDistanceUnit;
520+
repeatDistanceMapUnitScale = s.repeatDistanceMapUnitScale;
516521

517522
// rendering
518523
scaleVisibility = s.scaleVisibility;
@@ -1007,6 +1012,10 @@ void QgsPalLayerSettings::readFromLayer( QgsVectorLayer* layer )
10071012
maxCurvedCharAngleIn = layer->customProperty( "labeling/maxCurvedCharAngleIn", QVariant( 20.0 ) ).toDouble();
10081013
maxCurvedCharAngleOut = layer->customProperty( "labeling/maxCurvedCharAngleOut", QVariant( -20.0 ) ).toDouble();
10091014
priority = layer->customProperty( "labeling/priority" ).toInt();
1015+
repeatDistance = layer->customProperty( "labeling/repeatDistance", 0.0 ).toDouble();
1016+
repeatDistanceUnit = (SizeUnit) layer->customProperty( "labeling/repeatDistanceUnit", QVariant( MM )).toUInt();
1017+
repeatDistanceMapUnitScale.minScale = layer->customProperty( "labeling/repeatDistanceMapUnitMinScale", 0.0).toDouble();
1018+
repeatDistanceMapUnitScale.maxScale = layer->customProperty( "labeling/repeatDistanceMapUnitMaxScale", 0.0).toDouble();
10101019

10111020
// rendering
10121021
int scalemn = layer->customProperty( "labeling/scaleMin", QVariant( 0 ) ).toInt();
@@ -1173,6 +1182,10 @@ void QgsPalLayerSettings::writeToLayer( QgsVectorLayer* layer )
11731182
layer->setCustomProperty( "labeling/maxCurvedCharAngleIn", maxCurvedCharAngleIn );
11741183
layer->setCustomProperty( "labeling/maxCurvedCharAngleOut", maxCurvedCharAngleOut );
11751184
layer->setCustomProperty( "labeling/priority", priority );
1185+
layer->setCustomProperty( "labeling/repeatDistance", repeatDistance );
1186+
layer->setCustomProperty( "labeling/repeatDistanceUnit", repeatDistanceUnit );
1187+
layer->setCustomProperty( "labeling/repeatDistanceMapUnitMinScale", repeatDistanceMapUnitScale.minScale );
1188+
layer->setCustomProperty( "labeling/repeatDistanceMapUnitMaxScale", repeatDistanceMapUnitScale.maxScale );
11761189

11771190
// rendering
11781191
layer->setCustomProperty( "labeling/scaleVisibility", scaleVisibility );
@@ -2213,12 +2226,48 @@ void QgsPalLayerSettings::registerFeature( QgsFeature& f, const QgsRenderContext
22132226
#endif
22142227
lbl->setDefinedFont( labelFont );
22152228

2229+
// data defined repeat distance?
2230+
double repeatDist = repeatDistance;
2231+
if ( dataDefinedEvaluate( QgsPalLayerSettings::RepeatDistance, exprVal ) )
2232+
{
2233+
bool ok;
2234+
double distD = exprVal.toDouble( &ok );
2235+
if ( ok )
2236+
{
2237+
repeatDist = distD;
2238+
}
2239+
}
2240+
2241+
// data defined label-repeat distance units?
2242+
bool repeatdistinmapunit = repeatDistanceUnit == MapUnits;
2243+
if ( dataDefinedEvaluate( QgsPalLayerSettings::RepeatDistanceUnit, exprVal ) )
2244+
{
2245+
QString units = exprVal.toString().trimmed();
2246+
QgsDebugMsgLevel( QString( "exprVal RepeatDistanceUnits:%1" ).arg( units ), 4 );
2247+
if ( !units.isEmpty() )
2248+
{
2249+
repeatdistinmapunit = ( _decodeUnits( units ) == QgsPalLayerSettings::MapUnits );
2250+
}
2251+
}
2252+
2253+
if ( repeatDist != 0 )
2254+
{
2255+
if ( !repeatdistinmapunit ) //convert distance from mm/map units to pixels
2256+
{
2257+
repeatDist *= repeatDistanceMapUnitScale.computeMapUnitsPerPixel(context) * context.scaleFactor();
2258+
}
2259+
else //mm
2260+
{
2261+
repeatDist *= vectorScaleFactor;
2262+
}
2263+
}
2264+
22162265
// feature to the layer
22172266
try
22182267
{
22192268
if ( !palLayer->registerFeature( lbl->strId(), lbl, labelX, labelY, labelText.toUtf8().constData(),
22202269
xPos, yPos, dataDefinedPosition, angle, dataDefinedRotation,
2221-
quadOffsetX, quadOffsetY, offsetX, offsetY, alwaysShow ) )
2270+
quadOffsetX, quadOffsetY, offsetX, offsetY, alwaysShow, repeatDist ) )
22222271
return;
22232272
}
22242273
catch ( std::exception &e )
@@ -2273,6 +2322,7 @@ void QgsPalLayerSettings::registerFeature( QgsFeature& f, const QgsRenderContext
22732322
feat->setDistLabel( qAbs( ptOne.x() - ptZero.x() )* distance );
22742323
}
22752324

2325+
22762326
//add parameters for data defined labeling to QgsPalGeometry
22772327
QMap< DataDefinedProperties, QVariant >::const_iterator dIt = dataDefinedValues.constBegin();
22782328
for ( ; dIt != dataDefinedValues.constEnd(); ++dIt )

‎src/core/qgspallabeling.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,8 @@ class CORE_EXPORT QgsPalLayerSettings
254254
Hali = 11, //horizontal alignment for data defined label position (Left, Center, Right)
255255
Vali = 12, //vertical alignment for data defined label position (Bottom, Base, Half, Cap, Top)
256256
Rotation = 14, //data defined rotation
257+
RepeatDistance = 84,
258+
RepeatDistanceUnit = 85,
257259

258260
// rendering
259261
ScaleVisibility = 23,
@@ -377,6 +379,10 @@ class CORE_EXPORT QgsPalLayerSettings
377379
bool distInMapUnits; //true if distance is in map units (otherwise in mm)
378380
QgsMapUnitScale distMapUnitScale;
379381

382+
double repeatDistance;
383+
SizeUnit repeatDistanceUnit;
384+
QgsMapUnitScale repeatDistanceMapUnitScale;
385+
380386
// offset labels of point/centroid features default to center
381387
// move label to quadrant: left/down, don't move, right/up (-1, 0, 1)
382388
QuadrantPosition quadOffset;

‎src/ui/qgslabelingguibase.ui

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3829,6 +3829,70 @@ font-style: italic;</string>
38293829
</property>
38303830
</widget>
38313831
</item>
3832+
<item row="1" column="0" colspan="3">
3833+
<widget class="QFrame" name="mRepeatDistanceFrame">
3834+
<property name="frameShape">
3835+
<enum>QFrame::StyledPanel</enum>
3836+
</property>
3837+
<property name="frameShadow">
3838+
<enum>QFrame::Raised</enum>
3839+
</property>
3840+
<layout class="QGridLayout" name="gridLayout_24">
3841+
<property name="leftMargin">
3842+
<number>0</number>
3843+
</property>
3844+
<property name="topMargin">
3845+
<number>0</number>
3846+
</property>
3847+
<property name="rightMargin">
3848+
<number>0</number>
3849+
</property>
3850+
<property name="bottomMargin">
3851+
<number>0</number>
3852+
</property>
3853+
<property name="verticalSpacing">
3854+
<number>12</number>
3855+
</property>
3856+
<item row="0" column="0">
3857+
<widget class="QLabel" name="label_7">
3858+
<property name="text">
3859+
<string>Repeat</string>
3860+
</property>
3861+
</widget>
3862+
</item>
3863+
<item row="0" column="1">
3864+
<widget class="QDoubleSpinBox" name="mRepeatDistanceSpinBox">
3865+
<property name="sizePolicy">
3866+
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
3867+
<horstretch>0</horstretch>
3868+
<verstretch>0</verstretch>
3869+
</sizepolicy>
3870+
</property>
3871+
<property name="decimals">
3872+
<number>4</number>
3873+
</property>
3874+
</widget>
3875+
</item>
3876+
<item row="0" column="2">
3877+
<widget class="QgsDataDefinedButton" name="mRepeatDistanceDDBtn">
3878+
<property name="text">
3879+
<string>...</string>
3880+
</property>
3881+
</widget>
3882+
</item>
3883+
<item row="1" column="1">
3884+
<widget class="QgsUnitSelectionWidget" name="mRepeatDistanceUnitWidget" native="true"/>
3885+
</item>
3886+
<item row="1" column="2">
3887+
<widget class="QgsDataDefinedButton" name="mRepeatDistanceUnitDDBtn">
3888+
<property name="text">
3889+
<string>...</string>
3890+
</property>
3891+
</widget>
3892+
</item>
3893+
</layout>
3894+
</widget>
3895+
</item>
38323896
</layout>
38333897
</widget>
38343898
<widget class="QWidget" name="pagePolygon">
@@ -4720,6 +4784,33 @@ font-style: italic;</string>
47204784
</layout>
47214785
</widget>
47224786
</item>
4787+
<item>
4788+
<widget class="QFrame" name="s">
4789+
<property name="frameShape">
4790+
<enum>QFrame::NoFrame</enum>
4791+
</property>
4792+
<property name="frameShadow">
4793+
<enum>QFrame::Raised</enum>
4794+
</property>
4795+
<layout class="QGridLayout" name="gridLayout_11">
4796+
<property name="leftMargin">
4797+
<number>0</number>
4798+
</property>
4799+
<property name="topMargin">
4800+
<number>0</number>
4801+
</property>
4802+
<property name="rightMargin">
4803+
<number>0</number>
4804+
</property>
4805+
<property name="bottomMargin">
4806+
<number>0</number>
4807+
</property>
4808+
<property name="verticalSpacing">
4809+
<number>12</number>
4810+
</property>
4811+
</layout>
4812+
</widget>
4813+
</item>
47234814
<item>
47244815
<widget class="Line" name="line">
47254816
<property name="minimumSize">

0 commit comments

Comments
 (0)
Please sign in to comment.