Index: src/gui/symbology-ng/qgssymbollayerv2widget.cpp =================================================================== --- src/gui/symbology-ng/qgssymbollayerv2widget.cpp (Revision 14780) +++ src/gui/symbology-ng/qgssymbollayerv2widget.cpp (Arbeitskopie) @@ -361,6 +361,8 @@ connect( spinOffset, SIGNAL( valueChanged( double ) ), this, SLOT( setOffset() ) ); connect( radInterval, SIGNAL( clicked() ), this, SLOT( setPlacement() ) ); connect( radVertex, SIGNAL( clicked() ), this, SLOT( setPlacement() ) ); + connect( radVertexLast, SIGNAL( clicked() ),this, SLOT( setPlacement() ) ); + connect( radVertexFirst, SIGNAL( clicked() ),this, SLOT( setPlacement() ) ); } void QgsMarkerLineSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer ) @@ -377,8 +379,12 @@ spinOffset->setValue( mLayer->offset() ); if ( mLayer->placement() == QgsMarkerLineSymbolLayerV2::Interval ) radInterval->setChecked( true ); + else if ( mLayer->placement() == QgsMarkerLineSymbolLayerV2::Vertex ) + radVertex->setChecked( true ); + else if ( mLayer->placement() == QgsMarkerLineSymbolLayerV2::LastVertex ) + radVertexLast->setChecked( true ); else - radVertex->setChecked( true ); + radVertexFirst->setChecked( true ); updateMarker(); setPlacement(); // update gui } @@ -426,8 +432,17 @@ void QgsMarkerLineSymbolLayerV2Widget::setPlacement() { bool interval = radInterval->isChecked(); - mLayer->setPlacement( interval ? QgsMarkerLineSymbolLayerV2::Interval : QgsMarkerLineSymbolLayerV2::Vertex ); spinInterval->setEnabled( interval ); + //mLayer->setPlacement( interval ? QgsMarkerLineSymbolLayerV2::Interval : QgsMarkerLineSymbolLayerV2::Vertex ); + if ( radInterval->isChecked() ) + mLayer->setPlacement( QgsMarkerLineSymbolLayerV2::Interval ); + else if ( radVertex->isChecked() ) + mLayer->setPlacement( QgsMarkerLineSymbolLayerV2::Vertex ); + else if ( radVertexLast->isChecked() ) + mLayer->setPlacement( QgsMarkerLineSymbolLayerV2::LastVertex ); + else + mLayer->setPlacement( QgsMarkerLineSymbolLayerV2::FirstVertex ); + emit changed(); } Index: src/core/symbology-ng/qgslinesymbollayerv2.h =================================================================== --- src/core/symbology-ng/qgslinesymbollayerv2.h (Revision 14780) +++ src/core/symbology-ng/qgslinesymbollayerv2.h (Arbeitskopie) @@ -88,7 +88,9 @@ enum Placement { Interval, - Vertex + Vertex, + LastVertex, + FirstVertex }; // static stuff Index: src/core/symbology-ng/qgslinesymbollayerv2.cpp =================================================================== --- src/core/symbology-ng/qgslinesymbollayerv2.cpp (Revision 14780) +++ src/core/symbology-ng/qgslinesymbollayerv2.cpp (Arbeitskopie) @@ -239,7 +239,14 @@ if ( props.contains( "offset" ) ) x->setOffset( props["offset"].toDouble() ); if ( props.contains( "placement" ) ) - x->setPlacement( props["placement"] == "vertex" ? Vertex : Interval ); + if ( props["placement"] == "vertex" ) + x->setPlacement( Vertex ); + else if ( props["placement"] == "lastvertex" ) + x->setPlacement( LastVertex ); + else if ( props["placement"] == "firstvertex" ) + x->setPlacement( FirstVertex ); + else + x->setPlacement( Interval ); return x; } @@ -279,18 +286,18 @@ { if ( mOffset == 0 ) { - if ( mPlacement == Vertex ) + if ( mPlacement == Interval ) + renderPolylineInterval( points, context ); + else renderPolylineVertex( points, context ); - else - renderPolylineInterval( points, context ); } else { QPolygonF points2 = ::offsetLine( points, context.outputLineWidth( mOffset ) ); - if ( mPlacement == Vertex ) - renderPolylineVertex( points2, context ); + if ( mPlacement == Interval ) + renderPolylineInterval( points2, context ); else - renderPolylineInterval( points2, context ); + renderPolylineVertex( points2, context ); } } @@ -360,9 +367,26 @@ double origAngle = mMarker->angle(); double angle; + int i, maxCount; - for ( int i = 0; i < points.count(); ++i ) + if( mPlacement == FirstVertex ) { + i = 0; + maxCount = 1; + } + else if( mPlacement == LastVertex ) + { + i = points.count() - 1; + maxCount = points.count(); + } + else + { + i = 0; + maxCount = points.count(); + } + + for ( ; i < maxCount; ++i ) + { const QPointF& pt = points[i]; // rotate marker (if desired) @@ -395,7 +419,7 @@ double unitX = cos( a1 ) + cos( a2 ), unitY = sin( a1 ) + sin( a2 ); angle = atan2( unitY, unitX ); } - mMarker->setAngle( angle * 180 / M_PI ); + mMarker->setAngle(origAngle + angle * 180 / M_PI ); } mMarker->renderPoint( points.at( i ), rc, -1, context.selected() ); @@ -411,7 +435,14 @@ map["rotate"] = ( mRotateMarker ? "1" : "0" ); map["interval"] = QString::number( mInterval ); map["offset"] = QString::number( mOffset ); - map["placement"] = ( mPlacement == Vertex ? "vertex" : "interval" ); + if ( mPlacement == Vertex ) + map["placement"] = "vertex"; + else if ( mPlacement == LastVertex ) + map["placement"] = "lastvertex"; + else if ( mPlacement == FirstVertex ) + map["placement"] = "firstvertex"; + else + map["placement"] = "interval"; return map; } Index: src/ui/symbollayer/widget_markerline.ui =================================================================== --- src/ui/symbollayer/widget_markerline.ui (Revision 14780) +++ src/ui/symbollayer/widget_markerline.ui (Arbeitskopie) @@ -7,114 +7,124 @@ 0 0 352 - 232 + 281 Form - - - - - - - Marker - - - - - - - Change - - - - - - - Marker placement - - - - - - - with interval - - - true - - - - - - - 2 - - - 100000.000000000000000 - - - 1.000000000000000 - - - - - - - on every vertex - - - - - - - Rotate marker - - - - - - - Line offset - - - - - - - 2 - - - -100000.000000000000000 - - - 100000.000000000000000 - - - - - - - Qt::Horizontal - - - QSizePolicy::Preferred - - - - 110 - 20 - - - - - + + + + + Marker + + - + + + + Change + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 109 + 20 + + + + + + + + Marker placement + + + + + + + with interval + + + true + + + + + + + 2 + + + 100000.000000000000000 + + + 1.000000000000000 + + + + + + + on every vertex + + + + + + + on last vertex only + + + + + + + on first vertex only + + + + + + + Rotate marker + + + + + + + Line offset + + + + + + + 2 + + + -100000.000000000000000 + + + 100000.000000000000000 + + + + + + Qt::Vertical