[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