[QGIS Commit] r12537 - in trunk/qgis: python/core src/core
src/core/symbology-ng
svn_qgis at osgeo.org
svn_qgis at osgeo.org
Sun Dec 20 10:39:06 EST 2009
Author: wonder
Date: 2009-12-20 10:39:05 -0500 (Sun, 20 Dec 2009)
New Revision: 12537
Modified:
trunk/qgis/python/core/qgsvectorlayer.sip
trunk/qgis/python/core/symbology-ng-core.sip
trunk/qgis/src/core/qgsvectorlayer.cpp
trunk/qgis/src/core/qgsvectorlayer.h
trunk/qgis/src/core/symbology-ng/qgsrendererv2.cpp
trunk/qgis/src/core/symbology-ng/qgsrendererv2.h
Log:
Show editing vertex markers with symbology-ng. Fixes #2171.
Modified: trunk/qgis/python/core/qgsvectorlayer.sip
===================================================================
--- trunk/qgis/python/core/qgsvectorlayer.sip 2009-12-20 15:14:38 UTC (rev 12536)
+++ trunk/qgis/python/core/qgsvectorlayer.sip 2009-12-20 15:39:05 UTC (rev 12537)
@@ -480,6 +480,24 @@
/** Execute redo operation. To be called only from QgsVectorLayerUndoCommand. */
// (not necessary) void redoEditCommand(QgsUndoCommand* cmd);
+ /** Returns the index of a field name or -1 if the field does not exist
+ @note this method was added in version 1.4
+ */
+ int fieldNameIndex( const QString& fieldName ) const;
+
+ /** Editing vertex markers
+ @note public from version 1.4 */
+ enum VertexMarkerType
+ {
+ SemiTransparentCircle,
+ Cross,
+ NoMarker /* added in version 1.1 */
+ };
+
+ /** Draws a vertex symbol at (screen) coordinates x, y. (Useful to assist vertex editing.)
+ @note public and static from version 1.4 */
+ static void drawVertexMarker( double x, double y, QPainter& p, QgsVectorLayer::VertexMarkerType type, int vertexSize );
+
public slots:
/** Select feature by its ID, optionally emit signal selectionChanged() */
@@ -498,11 +516,6 @@
*/
virtual void updateExtents();
- /** Returns the index of a field name or -1 if the field does not exist
- @note this method was added in version 1.4
- */
- int fieldNameIndex( const QString& fieldName ) const;
-
signals:
/** This signal is emited when selection was changed */
Modified: trunk/qgis/python/core/symbology-ng-core.sip
===================================================================
--- trunk/qgis/python/core/symbology-ng-core.sip 2009-12-20 15:14:38 UTC (rev 12536)
+++ trunk/qgis/python/core/symbology-ng-core.sip 2009-12-20 15:39:05 UTC (rev 12537)
@@ -70,7 +70,7 @@
virtual QgsSymbolV2List symbols()=0;
- void renderFeature(QgsFeature& feature, QgsRenderContext& context, int layer = -1);
+ void renderFeature(QgsFeature& feature, QgsRenderContext& context, int layer = -1, bool drawVertexMarker = false );
bool usingSymbolLevels() const;
void setUsingSymbolLevels(bool usingSymbolLevels);
@@ -84,9 +84,19 @@
//! return a list of symbology items for the legend
virtual QgsLegendSymbologyList legendSymbologyItems(QSize iconSize);
+ //! set type and size of editing vertex markers for subsequent rendering
+ void setVertexMarkerAppearance( int type, int size );
+
protected:
QgsFeatureRendererV2(QString type);
+ //! render editing vertex marker at specified point
+ void renderVertexMarker( QPointF& pt, QgsRenderContext& context );
+ //! render editing vertex marker for a polyline
+ void renderVertexMarkerPolyline( QPolygonF& pts, QgsRenderContext& context );
+ //! render editing vertex marker for a polygon
+ void renderVertexMarkerPolygon( QPolygonF& pts, QList<QPolygonF>* rings, QgsRenderContext& context );
+
};
///////////////
Modified: trunk/qgis/src/core/qgsvectorlayer.cpp
===================================================================
--- trunk/qgis/src/core/qgsvectorlayer.cpp 2009-12-20 15:14:38 UTC (rev 12536)
+++ trunk/qgis/src/core/qgsvectorlayer.cpp 2009-12-20 15:39:05 UTC (rev 12537)
@@ -476,7 +476,7 @@
std::vector<double>::const_iterator yIt;
for ( xIt = x.begin(), yIt = y.begin(); xIt != x.end(); ++xIt, ++yIt )
{
- drawVertexMarker(( int )( *xIt ), ( int )( *yIt ), *p, mCurrentVertexMarkerType, mCurrentVertexMarkerSize );
+ drawVertexMarker( *xIt, *yIt, *p, mCurrentVertexMarkerType, mCurrentVertexMarkerSize );
}
}
@@ -669,7 +669,7 @@
for ( int i = 0; i < path.elementCount(); ++i )
{
const QPainterPath::Element & e = path.elementAt( i );
- drawVertexMarker(( int )e.x, ( int )e.y, *p, mCurrentVertexMarkerType, mCurrentVertexMarkerSize );
+ drawVertexMarker( e.x, e.y, *p, mCurrentVertexMarkerType, mCurrentVertexMarkerSize );
}
}
@@ -686,6 +686,9 @@
void QgsVectorLayer::drawRendererV2( QgsRenderContext& rendererContext, bool labeling )
{
+ QSettings settings;
+ bool vertexMarkerOnlyForSelection = settings.value( "/qgis/digitizing/marker_only_for_selected", false ).toBool();
+
mRendererV2->startRender( rendererContext, this );
QgsSingleSymbolRendererV2* selRenderer = NULL;
@@ -693,17 +696,23 @@
{
selRenderer = new QgsSingleSymbolRendererV2( QgsSymbolV2::defaultSymbol( geometryType() ) );
selRenderer->symbol()->setColor( QgsRenderer::selectionColor() );
+ selRenderer->setVertexMarkerAppearance( currentVertexMarkerType(), currentVertexMarkerSize() );
selRenderer->startRender( rendererContext, this );
}
QgsFeature fet;
while ( nextFeature( fet ) )
{
- if ( mSelectedFeatureIds.contains( fet.id() ) )
- selRenderer->renderFeature( fet, rendererContext );
+ bool sel = mSelectedFeatureIds.contains( fet.id() );
+ bool drawMarker = ( mEditable && ( !vertexMarkerOnlyForSelection || sel ) );
+
+ // render feature
+ if ( sel )
+ selRenderer->renderFeature( fet, rendererContext, -1, drawMarker );
else
- mRendererV2->renderFeature( fet, rendererContext );
+ mRendererV2->renderFeature( fet, rendererContext, -1, drawMarker );
+ // labeling - register feature
if ( labeling && mRendererV2->symbolForFeature( fet ) != NULL )
rendererContext.labelingEngine()->registerFeature( this, fet );
@@ -727,6 +736,9 @@
{
QHash< QgsSymbolV2*, QList<QgsFeature> > features; // key = symbol, value = array of features
+ QSettings settings;
+ bool vertexMarkerOnlyForSelection = settings.value( "/qgis/digitizing/marker_only_for_selected", false ).toBool();
+
// startRender must be called before symbolForFeature() calls to make sure renderer is ready
mRendererV2->startRender( rendererContext, this );
@@ -735,6 +747,7 @@
{
selRenderer = new QgsSingleSymbolRendererV2( QgsSymbolV2::defaultSymbol( geometryType() ) );
selRenderer->symbol()->setColor( QgsRenderer::selectionColor() );
+ selRenderer->setVertexMarkerAppearance( currentVertexMarkerType(), currentVertexMarkerSize() );
selRenderer->startRender( rendererContext, this );
}
@@ -792,10 +805,14 @@
QList<QgsFeature>::iterator fit;
for ( fit = lst.begin(); fit != lst.end(); ++fit )
{
- if ( mSelectedFeatureIds.contains( fit->id() ) )
- selRenderer->renderFeature( *fit, rendererContext );
+ bool sel = mSelectedFeatureIds.contains( fit->id() );
+ // maybe vertex markers should be drawn only during the last pass...
+ bool drawMarker = ( mEditable && ( !vertexMarkerOnlyForSelection || sel ) );
+
+ if ( sel )
+ selRenderer->renderFeature( *fit, rendererContext, -1, drawMarker );
else
- mRendererV2->renderFeature( *fit, rendererContext, layer );
+ mRendererV2->renderFeature( *fit, rendererContext, layer, drawMarker );
}
}
}
@@ -823,6 +840,9 @@
// Destroy all cached geometries and clear the references to them
deleteCachedGeometries();
mCachedGeometriesRect = rendererContext.extent();
+
+ // set editing vertex markers style
+ mRendererV2->setVertexMarkerAppearance( currentVertexMarkerType(), currentVertexMarkerSize() );
}
// TODO: really needed?
@@ -1009,7 +1029,7 @@
mCachedGeometriesRect = QgsRectangle();
}
-void QgsVectorLayer::drawVertexMarker( int x, int y, QPainter& p, QgsVectorLayer::VertexMarkerType type, int m )
+void QgsVectorLayer::drawVertexMarker( double x, double y, QPainter& p, QgsVectorLayer::VertexMarkerType type, int m )
{
if ( type == QgsVectorLayer::SemiTransparentCircle )
{
Modified: trunk/qgis/src/core/qgsvectorlayer.h
===================================================================
--- trunk/qgis/src/core/qgsvectorlayer.h 2009-12-20 15:14:38 UTC (rev 12536)
+++ trunk/qgis/src/core/qgsvectorlayer.h 2009-12-20 15:39:05 UTC (rev 12537)
@@ -533,6 +533,19 @@
*/
int fieldNameIndex( const QString& fieldName ) const;
+ /** Editing vertex markers
+ @note public from version 1.4 */
+ enum VertexMarkerType
+ {
+ SemiTransparentCircle,
+ Cross,
+ NoMarker /* added in version 1.1 */
+ };
+
+ /** Draws a vertex symbol at (screen) coordinates x, y. (Useful to assist vertex editing.)
+ @note public and static from version 1.4 */
+ static void drawVertexMarker( double x, double y, QPainter& p, QgsVectorLayer::VertexMarkerType type, int vertexSize );
+
public slots:
/** Select feature by its ID, optionally emit signal selectionChanged() */
void select( int featureId, bool emitSignal = TRUE );
@@ -569,13 +582,6 @@
private: // Private methods
- enum VertexMarkerType
- {
- SemiTransparentCircle,
- Cross,
- NoMarker /* added in version 1.1 */
- };
-
/** vector layers are not copyable */
QgsVectorLayer( QgsVectorLayer const & rhs );
@@ -616,9 +622,6 @@
/**Deletes the geometries in mCachedGeometries*/
void deleteCachedGeometries();
- /** Draws a vertex symbol at (screen) coordinates x, y. (Useful to assist vertex editing.) */
- void drawVertexMarker( int x, int y, QPainter& p, QgsVectorLayer::VertexMarkerType type, int vertexSize );
-
/**Snaps to a geometry and adds the result to the multimap if it is within the snapping result
@param startPoint start point of the snap
@param geom geometry to snap
@@ -634,10 +637,10 @@
int boundingBoxFromPointList( const QList<QgsPoint>& list, double& xmin, double& ymin, double& xmax, double& ymax ) const;
/**Reads vertex marker type from settings*/
- QgsVectorLayer::VertexMarkerType currentVertexMarkerType();
+ static QgsVectorLayer::VertexMarkerType currentVertexMarkerType();
/**Reads vertex marker size from settings*/
- int currentVertexMarkerSize();
+ static int currentVertexMarkerSize();
/**Update feature with uncommited attribute updates*/
void updateFeatureAttributes( QgsFeature &f );
Modified: trunk/qgis/src/core/symbology-ng/qgsrendererv2.cpp
===================================================================
--- trunk/qgis/src/core/symbology-ng/qgsrendererv2.cpp 2009-12-20 15:14:38 UTC (rev 12536)
+++ trunk/qgis/src/core/symbology-ng/qgsrendererv2.cpp 2009-12-20 15:39:05 UTC (rev 12537)
@@ -11,6 +11,7 @@
#include "qgsgeometry.h"
#include "qgsfeature.h"
#include "qgslogger.h"
+#include "qgsvectorlayer.h"
#include <QDomElement>
#include <QDomDocument>
@@ -138,7 +139,9 @@
QgsFeatureRendererV2::QgsFeatureRendererV2( QString type )
- : mType( type ), mUsingSymbolLevels( false )
+ : mType( type ), mUsingSymbolLevels( false ),
+ mCurrentVertexMarkerType( QgsVectorLayer::Cross ),
+ mCurrentVertexMarkerSize( 3 )
{
}
@@ -148,7 +151,7 @@
}
-void QgsFeatureRendererV2::renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer )
+void QgsFeatureRendererV2::renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer, bool drawVertexMarker )
{
QgsSymbolV2* symbol = symbolForFeature( feature );
if ( symbol == NULL )
@@ -170,6 +173,9 @@
QPointF pt;
_getPoint( pt, context, geom->asWkb() );
(( QgsMarkerSymbolV2* )symbol )->renderPoint( pt, context, layer );
+
+ //if ( drawVertexMarker )
+ // renderVertexMarker( pt, context );
}
break;
@@ -184,6 +190,9 @@
QPolygonF pts;
_getLineString( pts, context, geom->asWkb() );
(( QgsLineSymbolV2* )symbol )->renderPolyline( pts, context, layer );
+
+ if ( drawVertexMarker )
+ renderVertexMarkerPolyline( pts, context );
}
break;
@@ -199,6 +208,9 @@
QList<QPolygonF> holes;
_getPolygon( pts, holes, context, geom->asWkb() );
(( QgsFillSymbolV2* )symbol )->renderPolygon( pts, ( holes.count() ? &holes : NULL ), context, layer );
+
+ if ( drawVertexMarker )
+ renderVertexMarkerPolygon( pts, ( holes.count() ? &holes : NULL ), context );
}
break;
@@ -220,6 +232,9 @@
{
ptr = _getPoint( pt, context, ptr );
(( QgsMarkerSymbolV2* )symbol )->renderPoint( pt, context, layer );
+
+ //if ( drawVertexMarker )
+ // renderVertexMarker( pt, context );
}
}
break;
@@ -242,6 +257,9 @@
{
ptr = _getLineString( pts, context, ptr );
(( QgsLineSymbolV2* )symbol )->renderPolyline( pts, context, layer );
+
+ if ( drawVertexMarker )
+ renderVertexMarkerPolyline( pts, context );
}
}
break;
@@ -265,6 +283,9 @@
{
ptr = _getPolygon( pts, holes, context, ptr );
(( QgsFillSymbolV2* )symbol )->renderPolygon( pts, ( holes.count() ? &holes : NULL ), context, layer );
+
+ if ( drawVertexMarker )
+ renderVertexMarkerPolygon( pts, ( holes.count() ? &holes : NULL ), context );
}
}
break;
@@ -314,3 +335,37 @@
// empty list by default
return QgsLegendSymbologyList();
}
+
+void QgsFeatureRendererV2::setVertexMarkerAppearance( int type, int size )
+{
+ mCurrentVertexMarkerType = type;
+ mCurrentVertexMarkerSize = size;
+}
+
+void QgsFeatureRendererV2::renderVertexMarker( QPointF& pt, QgsRenderContext& context )
+{
+ QgsVectorLayer::drawVertexMarker( pt.x(), pt.y(), *context.painter(),
+ ( QgsVectorLayer::VertexMarkerType ) mCurrentVertexMarkerType,
+ mCurrentVertexMarkerSize );
+}
+
+void QgsFeatureRendererV2::renderVertexMarkerPolyline( QPolygonF& pts, QgsRenderContext& context )
+{
+ foreach( QPointF pt, pts )
+ renderVertexMarker( pt, context );
+}
+
+void QgsFeatureRendererV2::renderVertexMarkerPolygon( QPolygonF& pts, QList<QPolygonF>* rings, QgsRenderContext& context )
+{
+ foreach( QPointF pt, pts )
+ renderVertexMarker( pt, context );
+
+ if ( rings )
+ {
+ foreach( QPolygonF ring, *rings )
+ {
+ foreach( QPointF pt, ring )
+ renderVertexMarker( pt, context );
+ }
+ }
+}
Modified: trunk/qgis/src/core/symbology-ng/qgsrendererv2.h
===================================================================
--- trunk/qgis/src/core/symbology-ng/qgsrendererv2.h 2009-12-20 15:14:38 UTC (rev 12536)
+++ trunk/qgis/src/core/symbology-ng/qgsrendererv2.h 2009-12-20 15:39:05 UTC (rev 12537)
@@ -72,7 +72,7 @@
virtual QgsFeatureRendererV2* clone() = 0;
- void renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer = -1 );
+ void renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer = -1, bool drawVertexMarker = false );
//! for debugging
virtual QString dump();
@@ -92,12 +92,27 @@
//! return a list of symbology items for the legend
virtual QgsLegendSymbologyList legendSymbologyItems( QSize iconSize );
+ //! set type and size of editing vertex markers for subsequent rendering
+ void setVertexMarkerAppearance( int type, int size );
+
protected:
QgsFeatureRendererV2( QString type );
+ //! render editing vertex marker at specified point
+ void renderVertexMarker( QPointF& pt, QgsRenderContext& context );
+ //! render editing vertex marker for a polyline
+ void renderVertexMarkerPolyline( QPolygonF& pts, QgsRenderContext& context );
+ //! render editing vertex marker for a polygon
+ void renderVertexMarkerPolygon( QPolygonF& pts, QList<QPolygonF>* rings, QgsRenderContext& context );
+
QString mType;
bool mUsingSymbolLevels;
+
+ /** The current type of editing marker */
+ int mCurrentVertexMarkerType;
+ /** The current size of editing marker */
+ int mCurrentVertexMarkerSize;
};
More information about the QGIS-commit
mailing list