Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Output units for marker line properties
  • Loading branch information
mhugent committed Mar 11, 2013
1 parent b163d05 commit 460a471
Show file tree
Hide file tree
Showing 5 changed files with 100 additions and 3 deletions.
37 changes: 34 additions & 3 deletions src/core/symbology-ng/qgslinesymbollayerv2.cpp
Expand Up @@ -351,8 +351,10 @@ QgsMarkerLineSymbolLayerV2::QgsMarkerLineSymbolLayerV2( bool rotateMarker, doubl
{
mRotateMarker = rotateMarker;
mInterval = interval;
mIntervalUnit = QgsSymbolV2::MM;
mMarker = NULL;
mOffset = 0;
mOffsetUnit = QgsSymbolV2::MM;
mPlacement = Interval;

setSubSymbol( new QgsMarkerSymbolV2() );
Expand All @@ -378,6 +380,14 @@ QgsSymbolLayerV2* QgsMarkerLineSymbolLayerV2::create( const QgsStringMap& props
{
x->setOffset( props["offset"].toDouble() );
}
if ( props.contains( "offset_unit" ) )
{
x->setOffsetUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( props["offset_unit"] ) );
}
if ( props.contains( "interval_unit" ) )
{
x->setIntervalUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( props["interval_unit"] ) );
}

if ( props.contains( "placement" ) )
{
Expand Down Expand Up @@ -440,7 +450,7 @@ void QgsMarkerLineSymbolLayerV2::renderPolyline( const QPolygonF& points, QgsSym
}
else
{
QPolygonF points2 = ::offsetLine( points, context.outputLineWidth( mOffset ) );
QPolygonF points2 = ::offsetLine( points, mOffset * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit ) );
if ( mPlacement == Interval )
renderPolylineInterval( points2, context );
else if ( mPlacement == CentralPoint )
Expand All @@ -460,9 +470,9 @@ void QgsMarkerLineSymbolLayerV2::renderPolylineInterval( const QPolygonF& points
bool first = true;
double origAngle = mMarker->angle();

double painterUnitInterval = context.outputLineWidth( mInterval > 0 ? mInterval : 0.1 );

QgsRenderContext& rc = context.renderContext();
double interval = mInterval > 0 ? mInterval : 0.1;
double painterUnitInterval = interval * QgsSymbolLayerV2Utils::lineWidthScaleFactor( rc, mIntervalUnit );

for ( int i = 1; i < points.count(); ++i )
{
Expand Down Expand Up @@ -668,6 +678,8 @@ QgsStringMap QgsMarkerLineSymbolLayerV2::properties() const
map["rotate"] = ( mRotateMarker ? "1" : "0" );
map["interval"] = QString::number( mInterval );
map["offset"] = QString::number( mOffset );
map["offset_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mOffsetUnit );
map["interval_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mIntervalUnit );
if ( mPlacement == Vertex )
map["placement"] = "vertex";
else if ( mPlacement == LastVertex )
Expand All @@ -678,6 +690,7 @@ QgsStringMap QgsMarkerLineSymbolLayerV2::properties() const
map["placement"] = "centralpoint";
else
map["placement"] = "interval";

return map;
}

Expand Down Expand Up @@ -706,6 +719,8 @@ QgsSymbolLayerV2* QgsMarkerLineSymbolLayerV2::clone() const
x->setSubSymbol( mMarker->clone() );
x->setOffset( mOffset );
x->setPlacement( mPlacement );
x->setOffsetUnit( mOffsetUnit );
x->setIntervalUnit( mIntervalUnit );
return x;
}

Expand Down Expand Up @@ -867,6 +882,22 @@ double QgsMarkerLineSymbolLayerV2::width() const
return mMarker->size();
}

void QgsMarkerLineSymbolLayerV2::setOutputUnit( QgsSymbolV2::OutputUnit unit )
{
mIntervalUnit = unit;
mOffsetUnit = unit;
}

QgsSymbolV2::OutputUnit QgsMarkerLineSymbolLayerV2::outputUnit() const
{
QgsSymbolV2::OutputUnit unit = mIntervalUnit;
if ( mOffsetUnit != unit )
{
return QgsSymbolV2::Mixed;
}
return unit;
}

/////////////

QgsLineDecorationSymbolLayerV2::QgsLineDecorationSymbolLayerV2( QColor color, double width )
Expand Down
11 changes: 11 additions & 0 deletions src/core/symbology-ng/qgslinesymbollayerv2.h
Expand Up @@ -169,6 +169,15 @@ class CORE_EXPORT QgsMarkerLineSymbolLayerV2 : public QgsLineSymbolLayerV2
Placement placement() const { return mPlacement; }
void setPlacement( Placement p ) { mPlacement = p; }

QgsSymbolV2::OutputUnit intervalUnit() const { return mIntervalUnit; }
void setIntervalUnit( QgsSymbolV2::OutputUnit unit ) { mIntervalUnit = unit; }

QgsSymbolV2::OutputUnit offsetUnit() const { return mOffsetUnit; }
void setOffsetUnit( QgsSymbolV2::OutputUnit unit ) { mOffsetUnit = unit; }

void setOutputUnit( QgsSymbolV2::OutputUnit unit );
QgsSymbolV2::OutputUnit outputUnit() const;

protected:

void renderPolylineInterval( const QPolygonF& points, QgsSymbolV2RenderContext& context );
Expand All @@ -177,8 +186,10 @@ class CORE_EXPORT QgsMarkerLineSymbolLayerV2 : public QgsLineSymbolLayerV2

bool mRotateMarker;
double mInterval;
QgsSymbolV2::OutputUnit mIntervalUnit;
QgsMarkerSymbolV2* mMarker;
double mOffset;
QgsSymbolV2::OutputUnit mOffsetUnit;
Placement mPlacement;
};

Expand Down
25 changes: 25 additions & 0 deletions src/gui/symbology-ng/qgssymbollayerv2widget.cpp
Expand Up @@ -487,6 +487,15 @@ void QgsMarkerLineSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer )
radCentralPoint->setChecked( true );
else
radVertexFirst->setChecked( true );

// set units
mIntervalUnitComboBox->blockSignals( true );
mIntervalUnitComboBox->setCurrentIndex( mLayer->intervalUnit() );
mIntervalUnitComboBox->blockSignals( false );
mOffsetUnitComboBox->blockSignals( true );
mOffsetUnitComboBox->setCurrentIndex( mLayer->offsetUnit() );
mOffsetUnitComboBox->blockSignals( false );

setPlacement(); // update gui
}

Expand Down Expand Up @@ -532,6 +541,22 @@ void QgsMarkerLineSymbolLayerV2Widget::setPlacement()
emit changed();
}

void QgsMarkerLineSymbolLayerV2Widget::on_mIntervalUnitComboBox_currentIndexChanged( int index )
{
if ( mLayer )
{
mLayer->setIntervalUnit(( QgsSymbolV2::OutputUnit ) index );
}
}

void QgsMarkerLineSymbolLayerV2Widget::on_mOffsetUnitComboBox_currentIndexChanged( int index )
{
if ( mLayer )
{
mLayer->setOffsetUnit(( QgsSymbolV2::OutputUnit ) index );
}
}

///////////


Expand Down
2 changes: 2 additions & 0 deletions src/gui/symbology-ng/qgssymbollayerv2widget.h
Expand Up @@ -167,6 +167,8 @@ class GUI_EXPORT QgsMarkerLineSymbolLayerV2Widget : public QgsSymbolLayerV2Widge
void setRotate();
void setOffset();
void setPlacement();
void on_mIntervalUnitComboBox_currentIndexChanged( int index );
void on_mOffsetUnitComboBox_currentIndexChanged( int index );

protected:

Expand Down
28 changes: 28 additions & 0 deletions src/ui/symbollayer/widget_markerline.ui
Expand Up @@ -122,6 +122,34 @@
</property>
</widget>
</item>
<item row="8" column="2">
<widget class="QComboBox" name="mOffsetUnitComboBox">
<item>
<property name="text">
<string>Millimeter</string>
</property>
</item>
<item>
<property name="text">
<string>Map unit</string>
</property>
</item>
</widget>
</item>
<item row="1" column="2">
<widget class="QComboBox" name="mIntervalUnitComboBox">
<item>
<property name="text">
<string>Millimeter</string>
</property>
</item>
<item>
<property name="text">
<string>Map unit</string>
</property>
</item>
</widget>
</item>
</layout>
</widget>
<tabstops>
Expand Down

0 comments on commit 460a471

Please sign in to comment.