Skip to content

Commit d847246

Browse files
author
wonder
committed
Show editing vertex markers with symbology-ng. Fixes #2171.
git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@12537 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 3f8c05a commit d847246

File tree

6 files changed

+146
-30
lines changed

6 files changed

+146
-30
lines changed

python/core/qgsvectorlayer.sip

+18-5
Original file line numberDiff line numberDiff line change
@@ -480,6 +480,24 @@ public:
480480
/** Execute redo operation. To be called only from QgsVectorLayerUndoCommand. */
481481
// (not necessary) void redoEditCommand(QgsUndoCommand* cmd);
482482

483+
/** Returns the index of a field name or -1 if the field does not exist
484+
@note this method was added in version 1.4
485+
*/
486+
int fieldNameIndex( const QString& fieldName ) const;
487+
488+
/** Editing vertex markers
489+
@note public from version 1.4 */
490+
enum VertexMarkerType
491+
{
492+
SemiTransparentCircle,
493+
Cross,
494+
NoMarker /* added in version 1.1 */
495+
};
496+
497+
/** Draws a vertex symbol at (screen) coordinates x, y. (Useful to assist vertex editing.)
498+
@note public and static from version 1.4 */
499+
static void drawVertexMarker( double x, double y, QPainter& p, QgsVectorLayer::VertexMarkerType type, int vertexSize );
500+
483501
public slots:
484502

485503
/** Select feature by its ID, optionally emit signal selectionChanged() */
@@ -498,11 +516,6 @@ public slots:
498516
*/
499517
virtual void updateExtents();
500518

501-
/** Returns the index of a field name or -1 if the field does not exist
502-
@note this method was added in version 1.4
503-
*/
504-
int fieldNameIndex( const QString& fieldName ) const;
505-
506519
signals:
507520

508521
/** This signal is emited when selection was changed */

python/core/symbology-ng-core.sip

+11-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public:
7070

7171
virtual QgsSymbolV2List symbols()=0;
7272

73-
void renderFeature(QgsFeature& feature, QgsRenderContext& context, int layer = -1);
73+
void renderFeature(QgsFeature& feature, QgsRenderContext& context, int layer = -1, bool drawVertexMarker = false );
7474

7575
bool usingSymbolLevels() const;
7676
void setUsingSymbolLevels(bool usingSymbolLevels);
@@ -84,9 +84,19 @@ public:
8484
//! return a list of symbology items for the legend
8585
virtual QgsLegendSymbologyList legendSymbologyItems(QSize iconSize);
8686

87+
//! set type and size of editing vertex markers for subsequent rendering
88+
void setVertexMarkerAppearance( int type, int size );
89+
8790
protected:
8891
QgsFeatureRendererV2(QString type);
8992

93+
//! render editing vertex marker at specified point
94+
void renderVertexMarker( QPointF& pt, QgsRenderContext& context );
95+
//! render editing vertex marker for a polyline
96+
void renderVertexMarkerPolyline( QPolygonF& pts, QgsRenderContext& context );
97+
//! render editing vertex marker for a polygon
98+
void renderVertexMarkerPolygon( QPolygonF& pts, QList<QPolygonF>* rings, QgsRenderContext& context );
99+
90100
};
91101

92102
///////////////

src/core/qgsvectorlayer.cpp

+29-9
Original file line numberDiff line numberDiff line change
@@ -476,7 +476,7 @@ unsigned char *QgsVectorLayer::drawLineString( unsigned char *feature, QgsRender
476476
std::vector<double>::const_iterator yIt;
477477
for ( xIt = x.begin(), yIt = y.begin(); xIt != x.end(); ++xIt, ++yIt )
478478
{
479-
drawVertexMarker(( int )( *xIt ), ( int )( *yIt ), *p, mCurrentVertexMarkerType, mCurrentVertexMarkerSize );
479+
drawVertexMarker( *xIt, *yIt, *p, mCurrentVertexMarkerType, mCurrentVertexMarkerSize );
480480
}
481481
}
482482

@@ -669,7 +669,7 @@ unsigned char *QgsVectorLayer::drawPolygon( unsigned char *feature, QgsRenderCon
669669
for ( int i = 0; i < path.elementCount(); ++i )
670670
{
671671
const QPainterPath::Element & e = path.elementAt( i );
672-
drawVertexMarker(( int )e.x, ( int )e.y, *p, mCurrentVertexMarkerType, mCurrentVertexMarkerSize );
672+
drawVertexMarker( e.x, e.y, *p, mCurrentVertexMarkerType, mCurrentVertexMarkerSize );
673673
}
674674
}
675675

@@ -686,24 +686,33 @@ unsigned char *QgsVectorLayer::drawPolygon( unsigned char *feature, QgsRenderCon
686686

687687
void QgsVectorLayer::drawRendererV2( QgsRenderContext& rendererContext, bool labeling )
688688
{
689+
QSettings settings;
690+
bool vertexMarkerOnlyForSelection = settings.value( "/qgis/digitizing/marker_only_for_selected", false ).toBool();
691+
689692
mRendererV2->startRender( rendererContext, this );
690693

691694
QgsSingleSymbolRendererV2* selRenderer = NULL;
692695
if ( !mSelectedFeatureIds.isEmpty() )
693696
{
694697
selRenderer = new QgsSingleSymbolRendererV2( QgsSymbolV2::defaultSymbol( geometryType() ) );
695698
selRenderer->symbol()->setColor( QgsRenderer::selectionColor() );
699+
selRenderer->setVertexMarkerAppearance( currentVertexMarkerType(), currentVertexMarkerSize() );
696700
selRenderer->startRender( rendererContext, this );
697701
}
698702

699703
QgsFeature fet;
700704
while ( nextFeature( fet ) )
701705
{
702-
if ( mSelectedFeatureIds.contains( fet.id() ) )
703-
selRenderer->renderFeature( fet, rendererContext );
706+
bool sel = mSelectedFeatureIds.contains( fet.id() );
707+
bool drawMarker = ( mEditable && ( !vertexMarkerOnlyForSelection || sel ) );
708+
709+
// render feature
710+
if ( sel )
711+
selRenderer->renderFeature( fet, rendererContext, -1, drawMarker );
704712
else
705-
mRendererV2->renderFeature( fet, rendererContext );
713+
mRendererV2->renderFeature( fet, rendererContext, -1, drawMarker );
706714

715+
// labeling - register feature
707716
if ( labeling && mRendererV2->symbolForFeature( fet ) != NULL )
708717
rendererContext.labelingEngine()->registerFeature( this, fet );
709718

@@ -727,6 +736,9 @@ void QgsVectorLayer::drawRendererV2Levels( QgsRenderContext& rendererContext, bo
727736
{
728737
QHash< QgsSymbolV2*, QList<QgsFeature> > features; // key = symbol, value = array of features
729738

739+
QSettings settings;
740+
bool vertexMarkerOnlyForSelection = settings.value( "/qgis/digitizing/marker_only_for_selected", false ).toBool();
741+
730742
// startRender must be called before symbolForFeature() calls to make sure renderer is ready
731743
mRendererV2->startRender( rendererContext, this );
732744

@@ -735,6 +747,7 @@ void QgsVectorLayer::drawRendererV2Levels( QgsRenderContext& rendererContext, bo
735747
{
736748
selRenderer = new QgsSingleSymbolRendererV2( QgsSymbolV2::defaultSymbol( geometryType() ) );
737749
selRenderer->symbol()->setColor( QgsRenderer::selectionColor() );
750+
selRenderer->setVertexMarkerAppearance( currentVertexMarkerType(), currentVertexMarkerSize() );
738751
selRenderer->startRender( rendererContext, this );
739752
}
740753

@@ -792,10 +805,14 @@ void QgsVectorLayer::drawRendererV2Levels( QgsRenderContext& rendererContext, bo
792805
QList<QgsFeature>::iterator fit;
793806
for ( fit = lst.begin(); fit != lst.end(); ++fit )
794807
{
795-
if ( mSelectedFeatureIds.contains( fit->id() ) )
796-
selRenderer->renderFeature( *fit, rendererContext );
808+
bool sel = mSelectedFeatureIds.contains( fit->id() );
809+
// maybe vertex markers should be drawn only during the last pass...
810+
bool drawMarker = ( mEditable && ( !vertexMarkerOnlyForSelection || sel ) );
811+
812+
if ( sel )
813+
selRenderer->renderFeature( *fit, rendererContext, -1, drawMarker );
797814
else
798-
mRendererV2->renderFeature( *fit, rendererContext, layer );
815+
mRendererV2->renderFeature( *fit, rendererContext, layer, drawMarker );
799816
}
800817
}
801818
}
@@ -823,6 +840,9 @@ bool QgsVectorLayer::draw( QgsRenderContext& rendererContext )
823840
// Destroy all cached geometries and clear the references to them
824841
deleteCachedGeometries();
825842
mCachedGeometriesRect = rendererContext.extent();
843+
844+
// set editing vertex markers style
845+
mRendererV2->setVertexMarkerAppearance( currentVertexMarkerType(), currentVertexMarkerSize() );
826846
}
827847

828848
// TODO: really needed?
@@ -1009,7 +1029,7 @@ void QgsVectorLayer::deleteCachedGeometries()
10091029
mCachedGeometriesRect = QgsRectangle();
10101030
}
10111031

1012-
void QgsVectorLayer::drawVertexMarker( int x, int y, QPainter& p, QgsVectorLayer::VertexMarkerType type, int m )
1032+
void QgsVectorLayer::drawVertexMarker( double x, double y, QPainter& p, QgsVectorLayer::VertexMarkerType type, int m )
10131033
{
10141034
if ( type == QgsVectorLayer::SemiTransparentCircle )
10151035
{

src/core/qgsvectorlayer.h

+15-12
Original file line numberDiff line numberDiff line change
@@ -533,6 +533,19 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
533533
*/
534534
int fieldNameIndex( const QString& fieldName ) const;
535535

536+
/** Editing vertex markers
537+
@note public from version 1.4 */
538+
enum VertexMarkerType
539+
{
540+
SemiTransparentCircle,
541+
Cross,
542+
NoMarker /* added in version 1.1 */
543+
};
544+
545+
/** Draws a vertex symbol at (screen) coordinates x, y. (Useful to assist vertex editing.)
546+
@note public and static from version 1.4 */
547+
static void drawVertexMarker( double x, double y, QPainter& p, QgsVectorLayer::VertexMarkerType type, int vertexSize );
548+
536549
public slots:
537550
/** Select feature by its ID, optionally emit signal selectionChanged() */
538551
void select( int featureId, bool emitSignal = TRUE );
@@ -569,13 +582,6 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
569582

570583
private: // Private methods
571584

572-
enum VertexMarkerType
573-
{
574-
SemiTransparentCircle,
575-
Cross,
576-
NoMarker /* added in version 1.1 */
577-
};
578-
579585
/** vector layers are not copyable */
580586
QgsVectorLayer( QgsVectorLayer const & rhs );
581587

@@ -616,9 +622,6 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
616622
/**Deletes the geometries in mCachedGeometries*/
617623
void deleteCachedGeometries();
618624

619-
/** Draws a vertex symbol at (screen) coordinates x, y. (Useful to assist vertex editing.) */
620-
void drawVertexMarker( int x, int y, QPainter& p, QgsVectorLayer::VertexMarkerType type, int vertexSize );
621-
622625
/**Snaps to a geometry and adds the result to the multimap if it is within the snapping result
623626
@param startPoint start point of the snap
624627
@param geom geometry to snap
@@ -634,10 +637,10 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
634637
int boundingBoxFromPointList( const QList<QgsPoint>& list, double& xmin, double& ymin, double& xmax, double& ymax ) const;
635638

636639
/**Reads vertex marker type from settings*/
637-
QgsVectorLayer::VertexMarkerType currentVertexMarkerType();
640+
static QgsVectorLayer::VertexMarkerType currentVertexMarkerType();
638641

639642
/**Reads vertex marker size from settings*/
640-
int currentVertexMarkerSize();
643+
static int currentVertexMarkerSize();
641644

642645
/**Update feature with uncommited attribute updates*/
643646
void updateFeatureAttributes( QgsFeature &f );

src/core/symbology-ng/qgsrendererv2.cpp

+57-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "qgsgeometry.h"
1212
#include "qgsfeature.h"
1313
#include "qgslogger.h"
14+
#include "qgsvectorlayer.h"
1415

1516
#include <QDomElement>
1617
#include <QDomDocument>
@@ -138,7 +139,9 @@ static unsigned char* _getPolygon( QPolygonF& pts, QList<QPolygonF>& holes, QgsR
138139

139140

140141
QgsFeatureRendererV2::QgsFeatureRendererV2( QString type )
141-
: mType( type ), mUsingSymbolLevels( false )
142+
: mType( type ), mUsingSymbolLevels( false ),
143+
mCurrentVertexMarkerType( QgsVectorLayer::Cross ),
144+
mCurrentVertexMarkerSize( 3 )
142145
{
143146
}
144147

@@ -148,7 +151,7 @@ QgsFeatureRendererV2* QgsFeatureRendererV2::defaultRenderer( QGis::GeometryType
148151
}
149152

150153

151-
void QgsFeatureRendererV2::renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer )
154+
void QgsFeatureRendererV2::renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer, bool drawVertexMarker )
152155
{
153156
QgsSymbolV2* symbol = symbolForFeature( feature );
154157
if ( symbol == NULL )
@@ -170,6 +173,9 @@ void QgsFeatureRendererV2::renderFeature( QgsFeature& feature, QgsRenderContext&
170173
QPointF pt;
171174
_getPoint( pt, context, geom->asWkb() );
172175
(( QgsMarkerSymbolV2* )symbol )->renderPoint( pt, context, layer );
176+
177+
//if ( drawVertexMarker )
178+
// renderVertexMarker( pt, context );
173179
}
174180
break;
175181

@@ -184,6 +190,9 @@ void QgsFeatureRendererV2::renderFeature( QgsFeature& feature, QgsRenderContext&
184190
QPolygonF pts;
185191
_getLineString( pts, context, geom->asWkb() );
186192
(( QgsLineSymbolV2* )symbol )->renderPolyline( pts, context, layer );
193+
194+
if ( drawVertexMarker )
195+
renderVertexMarkerPolyline( pts, context );
187196
}
188197
break;
189198

@@ -199,6 +208,9 @@ void QgsFeatureRendererV2::renderFeature( QgsFeature& feature, QgsRenderContext&
199208
QList<QPolygonF> holes;
200209
_getPolygon( pts, holes, context, geom->asWkb() );
201210
(( QgsFillSymbolV2* )symbol )->renderPolygon( pts, ( holes.count() ? &holes : NULL ), context, layer );
211+
212+
if ( drawVertexMarker )
213+
renderVertexMarkerPolygon( pts, ( holes.count() ? &holes : NULL ), context );
202214
}
203215
break;
204216

@@ -220,6 +232,9 @@ void QgsFeatureRendererV2::renderFeature( QgsFeature& feature, QgsRenderContext&
220232
{
221233
ptr = _getPoint( pt, context, ptr );
222234
(( QgsMarkerSymbolV2* )symbol )->renderPoint( pt, context, layer );
235+
236+
//if ( drawVertexMarker )
237+
// renderVertexMarker( pt, context );
223238
}
224239
}
225240
break;
@@ -242,6 +257,9 @@ void QgsFeatureRendererV2::renderFeature( QgsFeature& feature, QgsRenderContext&
242257
{
243258
ptr = _getLineString( pts, context, ptr );
244259
(( QgsLineSymbolV2* )symbol )->renderPolyline( pts, context, layer );
260+
261+
if ( drawVertexMarker )
262+
renderVertexMarkerPolyline( pts, context );
245263
}
246264
}
247265
break;
@@ -265,6 +283,9 @@ void QgsFeatureRendererV2::renderFeature( QgsFeature& feature, QgsRenderContext&
265283
{
266284
ptr = _getPolygon( pts, holes, context, ptr );
267285
(( QgsFillSymbolV2* )symbol )->renderPolygon( pts, ( holes.count() ? &holes : NULL ), context, layer );
286+
287+
if ( drawVertexMarker )
288+
renderVertexMarkerPolygon( pts, ( holes.count() ? &holes : NULL ), context );
268289
}
269290
}
270291
break;
@@ -314,3 +335,37 @@ QgsLegendSymbologyList QgsFeatureRendererV2::legendSymbologyItems( QSize iconSiz
314335
// empty list by default
315336
return QgsLegendSymbologyList();
316337
}
338+
339+
void QgsFeatureRendererV2::setVertexMarkerAppearance( int type, int size )
340+
{
341+
mCurrentVertexMarkerType = type;
342+
mCurrentVertexMarkerSize = size;
343+
}
344+
345+
void QgsFeatureRendererV2::renderVertexMarker( QPointF& pt, QgsRenderContext& context )
346+
{
347+
QgsVectorLayer::drawVertexMarker( pt.x(), pt.y(), *context.painter(),
348+
( QgsVectorLayer::VertexMarkerType ) mCurrentVertexMarkerType,
349+
mCurrentVertexMarkerSize );
350+
}
351+
352+
void QgsFeatureRendererV2::renderVertexMarkerPolyline( QPolygonF& pts, QgsRenderContext& context )
353+
{
354+
foreach( QPointF pt, pts )
355+
renderVertexMarker( pt, context );
356+
}
357+
358+
void QgsFeatureRendererV2::renderVertexMarkerPolygon( QPolygonF& pts, QList<QPolygonF>* rings, QgsRenderContext& context )
359+
{
360+
foreach( QPointF pt, pts )
361+
renderVertexMarker( pt, context );
362+
363+
if ( rings )
364+
{
365+
foreach( QPolygonF ring, *rings )
366+
{
367+
foreach( QPointF pt, ring )
368+
renderVertexMarker( pt, context );
369+
}
370+
}
371+
}

src/core/symbology-ng/qgsrendererv2.h

+16-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ class CORE_EXPORT QgsFeatureRendererV2
7272

7373
virtual QgsFeatureRendererV2* clone() = 0;
7474

75-
void renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer = -1 );
75+
void renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer = -1, bool drawVertexMarker = false );
7676

7777
//! for debugging
7878
virtual QString dump();
@@ -92,12 +92,27 @@ class CORE_EXPORT QgsFeatureRendererV2
9292
//! return a list of symbology items for the legend
9393
virtual QgsLegendSymbologyList legendSymbologyItems( QSize iconSize );
9494

95+
//! set type and size of editing vertex markers for subsequent rendering
96+
void setVertexMarkerAppearance( int type, int size );
97+
9598
protected:
9699
QgsFeatureRendererV2( QString type );
97100

101+
//! render editing vertex marker at specified point
102+
void renderVertexMarker( QPointF& pt, QgsRenderContext& context );
103+
//! render editing vertex marker for a polyline
104+
void renderVertexMarkerPolyline( QPolygonF& pts, QgsRenderContext& context );
105+
//! render editing vertex marker for a polygon
106+
void renderVertexMarkerPolygon( QPolygonF& pts, QList<QPolygonF>* rings, QgsRenderContext& context );
107+
98108
QString mType;
99109

100110
bool mUsingSymbolLevels;
111+
112+
/** The current type of editing marker */
113+
int mCurrentVertexMarkerType;
114+
/** The current size of editing marker */
115+
int mCurrentVertexMarkerSize;
101116
};
102117

103118

0 commit comments

Comments
 (0)