[QGIS Commit] r13322 - in trunk/qgis: python/core src/core src/core/symbology-ng

svn_qgis at osgeo.org svn_qgis at osgeo.org
Sun Apr 18 13:30:12 EDT 2010


Author: wonder
Date: 2010-04-18 13:30:11 -0400 (Sun, 18 Apr 2010)
New Revision: 13322

Modified:
   trunk/qgis/python/core/symbology-ng-core.sip
   trunk/qgis/src/core/qgsvectorlayer.cpp
   trunk/qgis/src/core/symbology-ng/qgsfillsymbollayerv2.cpp
   trunk/qgis/src/core/symbology-ng/qgsfillsymbollayerv2.h
   trunk/qgis/src/core/symbology-ng/qgslinesymbollayerv2.cpp
   trunk/qgis/src/core/symbology-ng/qgslinesymbollayerv2.h
   trunk/qgis/src/core/symbology-ng/qgsmarkersymbollayerv2.cpp
   trunk/qgis/src/core/symbology-ng/qgsmarkersymbollayerv2.h
   trunk/qgis/src/core/symbology-ng/qgsrendererv2.cpp
   trunk/qgis/src/core/symbology-ng/qgsrendererv2.h
   trunk/qgis/src/core/symbology-ng/qgssymbollayerv2.cpp
   trunk/qgis/src/core/symbology-ng/qgssymbollayerv2.h
   trunk/qgis/src/core/symbology-ng/qgssymbolv2.cpp
   trunk/qgis/src/core/symbology-ng/qgssymbolv2.h
Log:
Applied patch from #2640: improved rendering of selected features (symbology-ng).
+ fixed font marker scaling for printing
Contributed by Chris Crook. Thanks!


Modified: trunk/qgis/python/core/symbology-ng-core.sip
===================================================================
--- trunk/qgis/python/core/symbology-ng-core.sip	2010-04-16 22:09:47 UTC (rev 13321)
+++ trunk/qgis/python/core/symbology-ng-core.sip	2010-04-18 17:30:11 UTC (rev 13322)
@@ -79,7 +79,7 @@
 
   virtual QgsSymbolV2List symbols()=0;
 
-  virtual void renderFeature(QgsFeature& feature, QgsRenderContext& context, int layer = -1, bool drawVertexMarker = false );
+  virtual void renderFeature(QgsFeature& feature, QgsRenderContext& context, int layer = -1, bool selected = false, bool drawVertexMarker = false );
 
   bool usingSymbolLevels() const;
   void setUsingSymbolLevels(bool usingSymbolLevels);
@@ -453,7 +453,7 @@
 %End
 
     public:
-    QgsSymbolV2RenderContext( QgsRenderContext& c, QgsSymbolV2::OutputUnit u , qreal alpha = 1.0 );
+    QgsSymbolV2RenderContext( QgsRenderContext& c, QgsSymbolV2::OutputUnit u , qreal alpha = 1.0, bool selected = false );
     ~QgsSymbolV2RenderContext();
 
     QgsRenderContext& renderContext();
@@ -465,6 +465,11 @@
     qreal alpha() const;
     void setAlpha( qreal alpha );
 
+    bool selected() const;
+    void setSelected( bool selected ) const;
+
+    static QColor selectionColor();
+
     double outputLineWidth(double width) const;
     double outputPixelSize(double size) const;
 };
@@ -574,7 +579,7 @@
   void setSize(double size);
   double size();
 
-  void renderPoint(const QPointF& point, QgsRenderContext& context, int layer = -1);
+  void renderPoint(const QPointF& point, QgsRenderContext& context, int layer = -1, bool selected = false );
 
   virtual QgsSymbolV2* clone() const /Factory/;
 };
@@ -593,7 +598,7 @@
   void setWidth(double width);
   double width();
 
-  void renderPolyline(const QPolygonF& points, QgsRenderContext& context, int layer = -1);
+  void renderPolyline(const QPolygonF& points, QgsRenderContext& context, int layer = -1, bool selected = false );
 
   virtual QgsSymbolV2* clone() const /Factory/;
 };
@@ -609,7 +614,7 @@
 public:
   QgsFillSymbolV2(QgsSymbolLayerV2List layers /Transfer/ = QgsSymbolLayerV2List());
 
-  void renderPolygon(const QPolygonF& points, QList<QPolygonF>* rings, QgsRenderContext& context, int layer = -1);
+  void renderPolygon(const QPolygonF& points, QList<QPolygonF>* rings, QgsRenderContext& context, int layer = -1, bool selected = false );
 
   virtual QgsSymbolV2* clone() const /Factory/;
 };

Modified: trunk/qgis/src/core/qgsvectorlayer.cpp
===================================================================
--- trunk/qgis/src/core/qgsvectorlayer.cpp	2010-04-16 22:09:47 UTC (rev 13321)
+++ trunk/qgis/src/core/qgsvectorlayer.cpp	2010-04-18 17:30:11 UTC (rev 13322)
@@ -705,15 +705,6 @@
 
   mRendererV2->startRender( rendererContext, this );
 
-  QgsSingleSymbolRendererV2* selRenderer = NULL;
-  if ( !mSelectedFeatureIds.isEmpty() )
-  {
-    selRenderer = new QgsSingleSymbolRendererV2( QgsSymbolV2::defaultSymbol( geometryType() ) );
-    selRenderer->symbol()->setColor( QgsRenderer::selectionColor() );
-    selRenderer->setVertexMarkerAppearance( currentVertexMarkerType(), currentVertexMarkerSize() );
-    selRenderer->startRender( rendererContext, this );
-  }
-
 #ifndef Q_WS_MAC
   int totalFeatures = pendingFeatureCount();
   int featureCount = 0;
@@ -747,10 +738,7 @@
       bool drawMarker = ( mEditable && ( !vertexMarkerOnlyForSelection || sel ) );
 
       // render feature
-      if ( sel )
-        selRenderer->renderFeature( fet, rendererContext, -1, drawMarker );
-      else
-        mRendererV2->renderFeature( fet, rendererContext, -1, drawMarker );
+      mRendererV2->renderFeature( fet, rendererContext, -1, sel, drawMarker );
 
       // labeling - register feature
       if ( labeling && mRendererV2->symbolForFeature( fet ) != NULL )
@@ -771,8 +759,6 @@
     ++featureCount;
 #endif //Q_WS_MAC
   }
-
-  stopRendererV2( rendererContext, selRenderer );
 }
 
 void QgsVectorLayer::drawRendererV2Levels( QgsRenderContext& rendererContext, bool labeling )
@@ -885,10 +871,7 @@
 
         try
         {
-          if ( sel )
-            selRenderer->renderFeature( *fit, rendererContext, -1, drawMarker );
-          else
-            mRendererV2->renderFeature( *fit, rendererContext, layer, drawMarker );
+          mRendererV2->renderFeature( *fit, rendererContext, layer, sel, drawMarker );
         }
         catch ( const QgsCsException &cse )
         {

Modified: trunk/qgis/src/core/symbology-ng/qgsfillsymbollayerv2.cpp
===================================================================
--- trunk/qgis/src/core/symbology-ng/qgsfillsymbollayerv2.cpp	2010-04-16 22:09:47 UTC (rev 13321)
+++ trunk/qgis/src/core/symbology-ng/qgsfillsymbollayerv2.cpp	2010-04-18 17:30:11 UTC (rev 13322)
@@ -47,6 +47,10 @@
 {
   mColor.setAlphaF( context.alpha() );
   mBrush = QBrush( mColor, mBrushStyle );
+  QColor selColor = context.selectionColor();
+  // selColor.setAlphaF( context.alpha() );
+  mSelBrush = QBrush( selColor );
+  if ( selectFillStyle )  mSelBrush.setStyle( mBrushStyle );
   mBorderColor.setAlphaF( context.alpha() );
   mPen = QPen( mBorderColor );
   mPen.setStyle( mBorderStyle );
@@ -65,7 +69,7 @@
     return;
   }
 
-  p->setBrush( mBrush );
+  p->setBrush( context.selected() ? mSelBrush : mBrush );
   p->setPen( mPen );
 
   _renderPolygon( p, points, rings );
@@ -209,18 +213,25 @@
   {
     return;
   }
+  p->setPen( QPen( Qt::NoPen ) );
+  if ( context.selected() )
+  {
+    QColor selColor = context.selectionColor();
+    if ( ! selectionIsOpaque ) selColor.setAlphaF( context.alpha() );
+    p->setBrush( QBrush( selColor ) );
+    _renderPolygon( p, points, rings );
+  }
   p->setBrush( mBrush );
-  p->setPen( QPen( Qt::NoPen ) );
   _renderPolygon( p, points, rings );
   if ( mOutline )
   {
-    mOutline->renderPolyline( points, context.renderContext() );
+    mOutline->renderPolyline( points, context.renderContext(), -1, selectFillBorder && context.selected() );
     if ( rings )
     {
       QList<QPolygonF>::const_iterator ringIt = rings->constBegin();
       for ( ; ringIt != rings->constEnd(); ++ringIt )
       {
-        mOutline->renderPolyline( *ringIt, context.renderContext() );
+        mOutline->renderPolyline( *ringIt, context.renderContext(), -1, selectFillBorder && context.selected() );
       }
     }
   }

Modified: trunk/qgis/src/core/symbology-ng/qgsfillsymbollayerv2.h
===================================================================
--- trunk/qgis/src/core/symbology-ng/qgsfillsymbollayerv2.h	2010-04-16 22:09:47 UTC (rev 13321)
+++ trunk/qgis/src/core/symbology-ng/qgsfillsymbollayerv2.h	2010-04-18 17:30:11 UTC (rev 13322)
@@ -54,6 +54,7 @@
 
   protected:
     QBrush mBrush;
+    QBrush mSelBrush;
     Qt::BrushStyle mBrushStyle;
     QColor mBorderColor;
     Qt::PenStyle mBorderStyle;

Modified: trunk/qgis/src/core/symbology-ng/qgslinesymbollayerv2.cpp
===================================================================
--- trunk/qgis/src/core/symbology-ng/qgslinesymbollayerv2.cpp	2010-04-16 22:09:47 UTC (rev 13321)
+++ trunk/qgis/src/core/symbology-ng/qgslinesymbollayerv2.cpp	2010-04-18 17:30:11 UTC (rev 13322)
@@ -83,6 +83,11 @@
   }
   mPen.setJoinStyle( mPenJoinStyle );
   mPen.setCapStyle( mPenCapStyle );
+
+  mSelPen = mPen;
+  QColor selColor = context.selectionColor();
+  if ( ! selectionIsOpaque ) selColor.setAlphaF( context.alpha() );
+  mSelPen.setColor( selColor );
 }
 
 void QgsSimpleLineSymbolLayerV2::stopRender( QgsSymbolV2RenderContext& context )
@@ -97,7 +102,7 @@
     return;
   }
 
-  p->setPen( mPen );
+  p->setPen( context.selected() ? mSelPen : mPen );
   if ( mOffset == 0 )
   {
     p->drawPolyline( points );
@@ -309,7 +314,7 @@
     // draw first marker
     if ( first )
     {
-      mMarker->renderPoint( lastPt, rc );
+      mMarker->renderPoint( lastPt, rc, -1, context.selected() );
       first = false;
     }
 
@@ -319,7 +324,7 @@
       // "c" is 1 for regular point or in interval (0,1] for begin of line segment
       lastPt += c * diff;
       lengthLeft -= painterUnitInterval;
-      mMarker->renderPoint( lastPt, rc );
+      mMarker->renderPoint( lastPt, rc, -1, context.selected() );
       c = 1; // reset c (if wasn't 1 already)
     }
 
@@ -401,6 +406,9 @@
   QColor penColor = mColor;
   penColor.setAlphaF( context.alpha() );
   mPen.setColor( penColor );
+  QColor selColor = context.selectionColor();
+  if ( ! selectionIsOpaque ) selColor.setAlphaF( context.alpha() );
+  mSelPen.setColor( selColor );
 }
 
 void QgsLineDecorationSymbolLayerV2::stopRender( QgsSymbolV2RenderContext& context )
@@ -442,7 +450,7 @@
   QPointF p2_1 = p2 - QPointF( size * cos( angle1 ), size * sin( angle1 ) );
   QPointF p2_2 = p2 - QPointF( size * cos( angle2 ), size * sin( angle2 ) );
 
-  p->setPen( mPen );
+  p->setPen( context.selected() ? mSelPen : mPen );
   p->drawLine( p2, p2_1 );
   p->drawLine( p2, p2_2 );
 }

Modified: trunk/qgis/src/core/symbology-ng/qgslinesymbollayerv2.h
===================================================================
--- trunk/qgis/src/core/symbology-ng/qgslinesymbollayerv2.h	2010-04-16 22:09:47 UTC (rev 13321)
+++ trunk/qgis/src/core/symbology-ng/qgslinesymbollayerv2.h	2010-04-18 17:30:11 UTC (rev 13322)
@@ -64,6 +64,7 @@
     Qt::PenJoinStyle mPenJoinStyle;
     Qt::PenCapStyle mPenCapStyle;
     QPen mPen;
+    QPen mSelPen;
     double mOffset;
     //use a custom dash dot pattern instead of the predefined ones
     bool mUseCustomDashPattern;
@@ -159,6 +160,7 @@
 
   protected:
     QPen mPen;
+    QPen mSelPen;
 
 };
 

Modified: trunk/qgis/src/core/symbology-ng/qgsmarkersymbollayerv2.cpp
===================================================================
--- trunk/qgis/src/core/symbology-ng/qgsmarkersymbollayerv2.cpp	2010-04-16 22:09:47 UTC (rev 13321)
+++ trunk/qgis/src/core/symbology-ng/qgsmarkersymbollayerv2.cpp	2010-04-18 17:30:11 UTC (rev 13322)
@@ -68,6 +68,10 @@
   mBrush = QBrush( mColor );
   mPen = QPen( mBorderColor );
   mPen.setWidthF( context.outputLineWidth( mPen.widthF() ) );
+  QColor selColor = context.selectionColor();
+  mSelBrush = QBrush( selColor );
+  mSelPen = QPen( selColor == mColor ? selColor : mBorderColor );
+  mSelPen.setWidthF( mPen.widthF() );
 
   mPolygon.clear();
 
@@ -148,6 +152,9 @@
   else
   {
     // some markers can't be drawn as a polygon (circle, cross)
+    // For these set the selected border color to the selected color
+
+    if ( mName != "circle" ) mSelPen.setColor( selColor );
   }
 
   // rotate if needed
@@ -176,10 +183,40 @@
   drawMarker( &p, context );
   p.end();
 
+  // Construct the selected version of the Cache
+
+  mSelCache = QImage( QSize( imageSize, imageSize ), QImage::Format_ARGB32_Premultiplied );
+  mSelCache.fill( 0 );
+
+  p.begin( &mSelCache );
+  p.setRenderHint( QPainter::Antialiasing );
+  p.setBrush( mSelBrush );
+  p.setPen( mSelPen );
+  p.translate( QPointF( center, center ) );
+  drawMarker( &p, context );
+  p.end();
+
+  // Check that the selected version is different.  If not, then re-render,
+  // filling the background with the selection colour and using the normal
+  // colours for the symbol .. could be ugly!
+
+  if ( mSelCache == mCache )
+  {
+    p.begin( &mSelCache );
+    p.setRenderHint( QPainter::Antialiasing );
+    p.fillRect( 0, 0, imageSize, imageSize, selColor );
+    p.setBrush( mBrush );
+    p.setPen( mPen );
+    p.translate( QPointF( center, center ) );
+    drawMarker( &p, context );
+    p.end();
+  }
+
   //opacity
   if ( context.alpha() < 1.0 )
   {
     QgsSymbolLayerV2Utils::multiplyImageOpacity( &mCache, context.alpha() );
+    if ( ! selectionIsOpaque ) QgsSymbolLayerV2Utils::multiplyImageOpacity( &mSelCache, context.alpha() );
   }
 }
 
@@ -203,11 +240,12 @@
   //p->translate(point);
 
   //drawMarker(p);
-  //mCache.save("/home/marco/tmp/marker.png", "PNG");
-  double s = mCache.width() / context.renderContext().rasterScaleFactor();
+  //mCache.save("/home/marco/tmp/marker.png","PNG");
+  QImage &img = context.selected() ? mSelCache : mCache;
+  double s = img.width() / context.renderContext().rasterScaleFactor();
   p->drawImage( QRectF( point.x() - s / 2.0 + context.outputLineWidth( mOffset.x() ),
                         point.y() - s / 2.0 + context.outputLineWidth( mOffset.y() ),
-                        s, s ), mCache );
+                        s, s ), img );
   //p->restore();
 }
 
@@ -328,6 +366,13 @@
   QSvgRenderer renderer( mPath );
   QPainter painter( &mPicture );
   renderer.render( &painter, rect );
+  double selPictureSize = pictureSize * 1.2;
+  QPainter selPainter( &mSelPicture );
+  selPainter.setRenderHint( QPainter::Antialiasing );
+  selPainter.setBrush( QBrush( context.selectionColor() ) );
+  selPainter.setPen( Qt::NoPen );
+  selPainter.drawEllipse( QPointF( 0, 0 ), pictureSize*0.6, pictureSize*0.6 );
+  renderer.render( &selPainter, rect );
 }
 
 void QgsSvgMarkerSymbolLayerV2::stopRender( QgsSymbolV2RenderContext& context )
@@ -350,7 +395,8 @@
   if ( mAngle != 0 )
     p->rotate( mAngle );
 
-  p->drawPicture( 0, 0, mPicture );
+  QPicture &pct = context.selected() ? mSelPicture : mPicture;
+  p->drawPicture( 0, 0, pct );
 
   if ( mAngle != 0 )
     p->rotate( -mAngle );
@@ -515,7 +561,7 @@
 
 void QgsFontMarkerSymbolLayerV2::startRender( QgsSymbolV2RenderContext& context )
 {
-  mFont = QFont( mFontFamily, MM2POINT( mSize ) );
+  mFont = QFont( mFontFamily, MM2POINT( mSize ) / context.renderContext().rasterScaleFactor() );
   QFontMetrics fm( mFont );
   mChrOffset = QPointF( fm.width( mChr ) / 2, -fm.ascent() / 2 );
 
@@ -529,7 +575,7 @@
 void QgsFontMarkerSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV2RenderContext& context )
 {
   QPainter* p = context.renderContext().painter();
-  QColor penColor = mColor;
+  QColor penColor = context.selected() ? context.selectionColor() : mColor;
   penColor.setAlphaF( context.alpha() );
   p->setPen( penColor );
   p->setFont( mFont );

Modified: trunk/qgis/src/core/symbology-ng/qgsmarkersymbollayerv2.h
===================================================================
--- trunk/qgis/src/core/symbology-ng/qgsmarkersymbollayerv2.h	2010-04-16 22:09:47 UTC (rev 13321)
+++ trunk/qgis/src/core/symbology-ng/qgsmarkersymbollayerv2.h	2010-04-18 17:30:11 UTC (rev 13322)
@@ -59,6 +59,9 @@
     QPolygonF mPolygon;
     QString mName;
     QImage mCache;
+    QPen mSelPen;
+    QBrush mSelBrush;
+    QImage mSelCache;
 };
 
 //////////
@@ -110,6 +113,7 @@
 
     QString mPath;
     QPicture mPicture;
+    QPicture mSelPicture;
 };
 
 

Modified: trunk/qgis/src/core/symbology-ng/qgsrendererv2.cpp
===================================================================
--- trunk/qgis/src/core/symbology-ng/qgsrendererv2.cpp	2010-04-16 22:09:47 UTC (rev 13321)
+++ trunk/qgis/src/core/symbology-ng/qgsrendererv2.cpp	2010-04-18 17:30:11 UTC (rev 13322)
@@ -151,7 +151,7 @@
 }
 
 
-void QgsFeatureRendererV2::renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer, bool drawVertexMarker )
+void QgsFeatureRendererV2::renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer, bool selected, bool drawVertexMarker )
 {
   QgsSymbolV2* symbol = symbolForFeature( feature );
   if ( symbol == NULL )
@@ -172,7 +172,7 @@
       }
       QPointF pt;
       _getPoint( pt, context, geom->asWkb() );
-      (( QgsMarkerSymbolV2* )symbol )->renderPoint( pt, context, layer );
+      (( QgsMarkerSymbolV2* )symbol )->renderPoint( pt, context, layer, selected );
 
       //if ( drawVertexMarker )
       //  renderVertexMarker( pt, context );
@@ -189,7 +189,7 @@
       }
       QPolygonF pts;
       _getLineString( pts, context, geom->asWkb() );
-      (( QgsLineSymbolV2* )symbol )->renderPolyline( pts, context, layer );
+      (( QgsLineSymbolV2* )symbol )->renderPolyline( pts, context, layer, selected );
 
       if ( drawVertexMarker )
         renderVertexMarkerPolyline( pts, context );
@@ -207,7 +207,7 @@
       QPolygonF pts;
       QList<QPolygonF> holes;
       _getPolygon( pts, holes, context, geom->asWkb() );
-      (( QgsFillSymbolV2* )symbol )->renderPolygon( pts, ( holes.count() ? &holes : NULL ), context, layer );
+      (( QgsFillSymbolV2* )symbol )->renderPolygon( pts, ( holes.count() ? &holes : NULL ), context, layer, selected );
 
       if ( drawVertexMarker )
         renderVertexMarkerPolygon( pts, ( holes.count() ? &holes : NULL ), context );
@@ -231,7 +231,7 @@
       for ( unsigned int i = 0; i < num; ++i )
       {
         ptr = _getPoint( pt, context, ptr );
-        (( QgsMarkerSymbolV2* )symbol )->renderPoint( pt, context, layer );
+        (( QgsMarkerSymbolV2* )symbol )->renderPoint( pt, context, layer, selected );
 
         //if ( drawVertexMarker )
         //  renderVertexMarker( pt, context );
@@ -256,7 +256,7 @@
       for ( unsigned int i = 0; i < num; ++i )
       {
         ptr = _getLineString( pts, context, ptr );
-        (( QgsLineSymbolV2* )symbol )->renderPolyline( pts, context, layer );
+        (( QgsLineSymbolV2* )symbol )->renderPolyline( pts, context, layer, selected );
 
         if ( drawVertexMarker )
           renderVertexMarkerPolyline( pts, context );
@@ -282,7 +282,7 @@
       for ( unsigned int i = 0; i < num; ++i )
       {
         ptr = _getPolygon( pts, holes, context, ptr );
-        (( QgsFillSymbolV2* )symbol )->renderPolygon( pts, ( holes.count() ? &holes : NULL ), context, layer );
+        (( QgsFillSymbolV2* )symbol )->renderPolygon( pts, ( holes.count() ? &holes : NULL ), context );
 
         if ( drawVertexMarker )
           renderVertexMarkerPolygon( pts, ( holes.count() ? &holes : NULL ), context );

Modified: trunk/qgis/src/core/symbology-ng/qgsrendererv2.h
===================================================================
--- trunk/qgis/src/core/symbology-ng/qgsrendererv2.h	2010-04-16 22:09:47 UTC (rev 13321)
+++ trunk/qgis/src/core/symbology-ng/qgsrendererv2.h	2010-04-18 17:30:11 UTC (rev 13322)
@@ -73,7 +73,7 @@
 
     virtual QgsFeatureRendererV2* clone() = 0;
 
-    virtual void renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer = -1, bool drawVertexMarker = false );
+    virtual void renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer = -1, bool selected = false, bool drawVertexMarker = false );
 
     //! for debugging
     virtual QString dump();

Modified: trunk/qgis/src/core/symbology-ng/qgssymbollayerv2.cpp
===================================================================
--- trunk/qgis/src/core/symbology-ng/qgssymbollayerv2.cpp	2010-04-16 22:09:47 UTC (rev 13321)
+++ trunk/qgis/src/core/symbology-ng/qgssymbollayerv2.cpp	2010-04-18 17:30:11 UTC (rev 13322)
@@ -1,6 +1,7 @@
 
 #include "qgssymbollayerv2.h"
 
+#include "qgsrenderer.h"
 #include "qgsrendercontext.h"
 
 #include <QSize>

Modified: trunk/qgis/src/core/symbology-ng/qgssymbollayerv2.h
===================================================================
--- trunk/qgis/src/core/symbology-ng/qgssymbollayerv2.h	2010-04-16 22:09:47 UTC (rev 13321)
+++ trunk/qgis/src/core/symbology-ng/qgssymbollayerv2.h	2010-04-18 17:30:11 UTC (rev 13322)
@@ -18,7 +18,6 @@
 class QgsSymbolV2;
 
 
-
 class CORE_EXPORT QgsSymbolLayerV2
 {
   public:
@@ -61,6 +60,12 @@
     bool mLocked;
     QColor mColor;
     int mRenderingPass;
+
+    // Configuration of selected symbology implementation
+    static const bool selectionIsOpaque = true;  // Selection ignores symbol alpha
+    static const bool selectFillBorder = false;  // Fill symbol layer also selects border symbology
+    static const bool selectFillStyle = false;   // Fill symbol uses symbol layer style..
+
 };
 
 //////////////////////

Modified: trunk/qgis/src/core/symbology-ng/qgssymbolv2.cpp
===================================================================
--- trunk/qgis/src/core/symbology-ng/qgssymbolv2.cpp	2010-04-16 22:09:47 UTC (rev 13321)
+++ trunk/qgis/src/core/symbology-ng/qgssymbolv2.cpp	2010-04-18 17:30:11 UTC (rev 13322)
@@ -1,4 +1,5 @@
 
+#include "qgsrenderer.h"
 #include "qgssymbolv2.h"
 #include "qgssymbollayerv2.h"
 
@@ -244,8 +245,8 @@
 
 ////////////////////
 
-QgsSymbolV2RenderContext::QgsSymbolV2RenderContext( QgsRenderContext& c, QgsSymbolV2::OutputUnit u, qreal alpha )
-    : mRenderContext( c ), mOutputUnit( u ), mAlpha( alpha )
+QgsSymbolV2RenderContext::QgsSymbolV2RenderContext( QgsRenderContext& c, QgsSymbolV2::OutputUnit u, qreal alpha, bool selected )
+    : mRenderContext( c ), mOutputUnit( u ), mAlpha( alpha ), mSelected( selected )
 {
 
 }
@@ -255,6 +256,12 @@
 
 }
 
+QColor QgsSymbolV2RenderContext::selectionColor()
+{
+  return QgsRenderer::selectionColor();
+}
+
+
 double QgsSymbolV2RenderContext::outputLineWidth( double width ) const
 {
   return width * QgsSymbolLayerV2Utils::lineWidthScaleFactor( mRenderContext, mOutputUnit );
@@ -271,7 +278,7 @@
   // sip 4.7 generates a piece of code that needs this function to exist.
   // It's not generated automatically by the compiler because of
   // mRenderContext member which is a reference (and thus can't be changed).
-  Q_ASSERT(false);
+  Q_ASSERT( false );
   return *this;
 }
 
@@ -338,9 +345,9 @@
   return maxSize;
 }
 
-void QgsMarkerSymbolV2::renderPoint( const QPointF& point, QgsRenderContext& context, int layer )
+void QgsMarkerSymbolV2::renderPoint( const QPointF& point, QgsRenderContext& context, int layer, bool selected )
 {
-  QgsSymbolV2RenderContext symbolContext( context, mOutputUnit, mAlpha );
+  QgsSymbolV2RenderContext symbolContext( context, mOutputUnit, mAlpha, selected );
   if ( layer != -1 )
   {
     if ( layer >= 0 && layer < mLayers.count() )
@@ -407,9 +414,9 @@
   return maxWidth;
 }
 
-void QgsLineSymbolV2::renderPolyline( const QPolygonF& points, QgsRenderContext& context, int layer )
+void QgsLineSymbolV2::renderPolyline( const QPolygonF& points, QgsRenderContext& context, int layer, bool selected )
 {
-  QgsSymbolV2RenderContext symbolContext( context, mOutputUnit, mAlpha );
+  QgsSymbolV2RenderContext symbolContext( context, mOutputUnit, mAlpha, selected );
   if ( layer != -1 )
   {
     if ( layer >= 0 && layer < mLayers.count() )
@@ -443,9 +450,9 @@
     mLayers.append( new QgsSimpleFillSymbolLayerV2() );
 }
 
-void QgsFillSymbolV2::renderPolygon( const QPolygonF& points, QList<QPolygonF>* rings, QgsRenderContext& context, int layer )
+void QgsFillSymbolV2::renderPolygon( const QPolygonF& points, QList<QPolygonF>* rings, QgsRenderContext& context, int layer, bool selected )
 {
-  QgsSymbolV2RenderContext symbolContext( context, mOutputUnit, mAlpha );
+  QgsSymbolV2RenderContext symbolContext( context, mOutputUnit, mAlpha, selected );
   if ( layer != -1 )
   {
     if ( layer >= 0 && layer < mLayers.count() )

Modified: trunk/qgis/src/core/symbology-ng/qgssymbolv2.h
===================================================================
--- trunk/qgis/src/core/symbology-ng/qgssymbolv2.h	2010-04-16 22:09:47 UTC (rev 13321)
+++ trunk/qgis/src/core/symbology-ng/qgssymbolv2.h	2010-04-18 17:30:11 UTC (rev 13322)
@@ -103,7 +103,7 @@
 class CORE_EXPORT QgsSymbolV2RenderContext
 {
   public:
-    QgsSymbolV2RenderContext( QgsRenderContext& c, QgsSymbolV2::OutputUnit u , qreal alpha = 1.0 );
+    QgsSymbolV2RenderContext( QgsRenderContext& c, QgsSymbolV2::OutputUnit u , qreal alpha = 1.0, bool selected = false );
     ~QgsSymbolV2RenderContext();
 
     QgsRenderContext& renderContext() { return mRenderContext; }
@@ -115,6 +115,13 @@
     qreal alpha() const { return mAlpha; }
     void setAlpha( qreal alpha ) { mAlpha = alpha; }
 
+    bool selected() const { return mSelected; }
+    void setSelected( bool selected ) { mSelected = selected; }
+
+    // Colour used for selections
+
+    static QColor selectionColor();
+
     double outputLineWidth( double width ) const;
     double outputPixelSize( double size ) const;
 
@@ -125,6 +132,7 @@
     QgsRenderContext& mRenderContext;
     QgsSymbolV2::OutputUnit mOutputUnit;
     qreal mAlpha;
+    bool mSelected;
 };
 
 
@@ -144,7 +152,7 @@
     void setSize( double size );
     double size();
 
-    void renderPoint( const QPointF& point, QgsRenderContext& context, int layer = -1 );
+    void renderPoint( const QPointF& point, QgsRenderContext& context, int layer = -1, bool selected = false );
 
     virtual QgsSymbolV2* clone() const;
 };
@@ -159,7 +167,7 @@
     void setWidth( double width );
     double width();
 
-    void renderPolyline( const QPolygonF& points, QgsRenderContext& context, int layer = -1 );
+    void renderPolyline( const QPolygonF& points, QgsRenderContext& context, int layer = -1, bool selected = false );
 
     virtual QgsSymbolV2* clone() const;
 };
@@ -171,7 +179,7 @@
   public:
     QgsFillSymbolV2( QgsSymbolLayerV2List layers = QgsSymbolLayerV2List() );
 
-    void renderPolygon( const QPolygonF& points, QList<QPolygonF>* rings, QgsRenderContext& context, int layer = -1 );
+    void renderPolygon( const QPolygonF& points, QList<QPolygonF>* rings, QgsRenderContext& context, int layer = -1, bool selected = false );
 
     virtual QgsSymbolV2* clone() const;
 };



More information about the QGIS-commit mailing list