[QGIS Commit] r15139 - in trunk/qgis: python/core src/core/symbology-ng src/gui/symbology-ng src/ui/symbollayer

svn_qgis at osgeo.org svn_qgis at osgeo.org
Tue Feb 8 05:00:09 EST 2011


Author: mhugent
Date: 2011-02-08 02:00:09 -0800 (Tue, 08 Feb 2011)
New Revision: 15139

Modified:
   trunk/qgis/python/core/symbology-ng-core.sip
   trunk/qgis/src/core/symbology-ng/qgsfillsymbollayerv2.cpp
   trunk/qgis/src/core/symbology-ng/qgsfillsymbollayerv2.h
   trunk/qgis/src/core/symbology-ng/qgssinglesymbolrendererv2.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
   trunk/qgis/src/gui/symbology-ng/qgssymbollayerv2widget.cpp
   trunk/qgis/src/gui/symbology-ng/qgssymbollayerv2widget.h
   trunk/qgis/src/ui/symbollayer/widget_svgfill.ui
Log:
[FEATURE]: rotation for svg fills

Modified: trunk/qgis/python/core/symbology-ng-core.sip
===================================================================
--- trunk/qgis/python/core/symbology-ng-core.sip	2011-02-08 08:40:37 UTC (rev 15138)
+++ trunk/qgis/python/core/symbology-ng-core.sip	2011-02-08 10:00:09 UTC (rev 15139)
@@ -589,6 +589,9 @@
 
   void drawPreviewIcon(QgsSymbolV2RenderContext& context, QSize size);
 
+  void setAngle( double angle );
+  double angle() const;
+
 protected:
   QgsFillSymbolLayerV2(bool locked = false);
 };
@@ -785,6 +788,7 @@
 public:
   QgsFillSymbolV2(QgsSymbolLayerV2List layers /Transfer/ = QgsSymbolLayerV2List());
 
+  void setAngle( double angle );
   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/symbology-ng/qgsfillsymbollayerv2.cpp
===================================================================
--- trunk/qgis/src/core/symbology-ng/qgsfillsymbollayerv2.cpp	2011-02-08 08:40:37 UTC (rev 15138)
+++ trunk/qgis/src/core/symbology-ng/qgsfillsymbollayerv2.cpp	2011-02-08 10:00:09 UTC (rev 15139)
@@ -116,17 +116,20 @@
 
 //QgsSVGFillSymbolLayer
 
-QgsSVGFillSymbolLayer::QgsSVGFillSymbolLayer( const QString& svgFilePath, double width ): mPatternWidth( width ), mOutline( 0 )
+QgsSVGFillSymbolLayer::QgsSVGFillSymbolLayer( const QString& svgFilePath, double width, double angle ): mPatternWidth( width ), mOutline( 0 )
 {
   setSvgFilePath( svgFilePath );
   mOutlineWidth = 0.3;
+  mAngle = angle;
   setSubSymbol( new QgsLineSymbolV2() );
 }
 
-QgsSVGFillSymbolLayer::QgsSVGFillSymbolLayer( const QByteArray& svgData, double width ): mPatternWidth( width ), mSvgData( svgData ), mOutline( 0 )
+QgsSVGFillSymbolLayer::QgsSVGFillSymbolLayer( const QByteArray& svgData, double width, double angle ): mPatternWidth( width ),
+    mSvgData( svgData ), mOutline( 0 )
 {
   storeViewBox();
   mOutlineWidth = 0.3;
+  mAngle = angle;
   setSubSymbol( new QgsLineSymbolV2() );
 }
 
@@ -151,6 +154,7 @@
   QByteArray data;
   double width = 20;
   QString svgFilePath;
+  double angle = 0.0;
 
 
   if ( properties.contains( "width" ) )
@@ -163,10 +167,14 @@
     QString savePath = QgsSvgMarkerSymbolLayerV2::symbolNameToPath( svgName );
     svgFilePath = ( savePath.isEmpty() ? svgName : savePath );
   }
+  if ( properties.contains( "angle" ) )
+  {
+    angle = properties["angle"].toDouble();
+  }
 
   if ( !svgFilePath.isEmpty() )
   {
-    return new QgsSVGFillSymbolLayer( svgFilePath, width );
+    return new QgsSVGFillSymbolLayer( svgFilePath, width, angle );
   }
   else
   {
@@ -175,7 +183,7 @@
       data = QByteArray::fromHex( properties["data"].toLocal8Bit() );
     }
 
-    return new QgsSVGFillSymbolLayer( data, width );
+    return new QgsSVGFillSymbolLayer( data, width, angle );
   }
 }
 
@@ -205,6 +213,7 @@
   {
     return;
   }
+
   r.render( &p );
 
   if ( context.alpha() < 1.0 )
@@ -246,7 +255,19 @@
     p->setBrush( QBrush( selColor ) );
     _renderPolygon( p, points, rings );
   }
-  p->setBrush( mBrush );
+
+  if ( doubleNear( mAngle, 0.0 ) )
+  {
+    p->setBrush( mBrush );
+  }
+  else
+  {
+    QTransform t;
+    t.rotate( mAngle );
+    QBrush rotatedBrush = mBrush;
+    rotatedBrush.setTransform( t );
+    p->setBrush( rotatedBrush );
+  }
   _renderPolygon( p, points, rings );
   if ( mOutline )
   {
@@ -275,6 +296,7 @@
   }
 
   map.insert( "width", QString::number( mPatternWidth ) );
+  map.insert( "angle", QString::number( mAngle ) );
   return map;
 }
 
@@ -283,11 +305,11 @@
   QgsSymbolLayerV2* clonedLayer = 0;
   if ( !mSvgFilePath.isEmpty() )
   {
-    clonedLayer = new QgsSVGFillSymbolLayer( mSvgFilePath, mPatternWidth );
+    clonedLayer = new QgsSVGFillSymbolLayer( mSvgFilePath, mPatternWidth, mAngle );
   }
   else
   {
-    clonedLayer = new QgsSVGFillSymbolLayer( mSvgData, mPatternWidth );
+    clonedLayer = new QgsSVGFillSymbolLayer( mSvgData, mPatternWidth, mAngle );
   }
 
   if ( mOutline )

Modified: trunk/qgis/src/core/symbology-ng/qgsfillsymbollayerv2.h
===================================================================
--- trunk/qgis/src/core/symbology-ng/qgsfillsymbollayerv2.h	2011-02-08 08:40:37 UTC (rev 15138)
+++ trunk/qgis/src/core/symbology-ng/qgsfillsymbollayerv2.h	2011-02-08 10:00:09 UTC (rev 15139)
@@ -72,8 +72,8 @@
 class CORE_EXPORT QgsSVGFillSymbolLayer: public QgsFillSymbolLayerV2
 {
   public:
-    QgsSVGFillSymbolLayer( const QString& svgFilePath = "", double width = 20 );
-    QgsSVGFillSymbolLayer( const QByteArray& svgData, double width = 20 );
+    QgsSVGFillSymbolLayer( const QString& svgFilePath = "", double width = 20, double rotation = 0.0 );
+    QgsSVGFillSymbolLayer( const QByteArray& svgData, double width = 20, double rotation = 0.0 );
     ~QgsSVGFillSymbolLayer();
 
     static QgsSymbolLayerV2* create( const QgsStringMap& properties = QgsStringMap() );
@@ -91,7 +91,7 @@
 
     QgsSymbolLayerV2* clone() const;
 
-    //gettersn and setters
+    //getters and setters
     void setSvgFilePath( const QString& svgPath );
     QString svgFilePath() const { return mSvgFilePath; }
     void setPatternWidth( double width ) { mPatternWidth = width;}

Modified: trunk/qgis/src/core/symbology-ng/qgssinglesymbolrendererv2.cpp
===================================================================
--- trunk/qgis/src/core/symbology-ng/qgssinglesymbolrendererv2.cpp	2011-02-08 08:40:37 UTC (rev 15138)
+++ trunk/qgis/src/core/symbology-ng/qgssinglesymbolrendererv2.cpp	2011-02-08 10:00:09 UTC (rev 15139)
@@ -53,6 +53,12 @@
     if ( mSizeScaleFieldIdx != -1 )
       lineSymbol->setWidth( sizeScale * mOrigSize );
   }
+  else if ( mTempSymbol->type() == QgsSymbolV2::Fill )
+  {
+    QgsFillSymbolV2* fillSymbol = static_cast<QgsFillSymbolV2*>( mTempSymbol );
+    if ( mRotationFieldIdx != -1 )
+      fillSymbol->setAngle( rotation );
+  }
 
   return mTempSymbol;
 }

Modified: trunk/qgis/src/core/symbology-ng/qgssymbollayerv2.h
===================================================================
--- trunk/qgis/src/core/symbology-ng/qgssymbollayerv2.h	2011-02-08 08:40:37 UTC (rev 15138)
+++ trunk/qgis/src/core/symbology-ng/qgssymbollayerv2.h	2011-02-08 10:00:09 UTC (rev 15139)
@@ -120,10 +120,15 @@
 
     void drawPreviewIcon( QgsSymbolV2RenderContext& context, QSize size );
 
+    void setAngle( double angle ) { mAngle = angle; }
+    double angle() const { return mAngle; }
+
   protected:
     QgsFillSymbolLayerV2( bool locked = false );
     /**Default method to render polygon*/
     void _renderPolygon( QPainter* p, const QPolygonF& points, const QList<QPolygonF>* rings );
+
+    double mAngle;
 };
 
 class QgsSymbolLayerV2Widget;

Modified: trunk/qgis/src/core/symbology-ng/qgssymbolv2.cpp
===================================================================
--- trunk/qgis/src/core/symbology-ng/qgssymbolv2.cpp	2011-02-08 08:40:37 UTC (rev 15138)
+++ trunk/qgis/src/core/symbology-ng/qgssymbolv2.cpp	2011-02-08 10:00:09 UTC (rev 15139)
@@ -512,3 +512,12 @@
   cloneSymbol->setAlpha( mAlpha );
   return cloneSymbol;
 }
+
+void QgsFillSymbolV2::setAngle( double angle )
+{
+  for ( QgsSymbolLayerV2List::iterator it = mLayers.begin(); it != mLayers.end(); ++it )
+  {
+    QgsFillSymbolLayerV2* layer = ( QgsFillSymbolLayerV2* ) * it;
+    layer->setAngle( angle );
+  }
+}

Modified: trunk/qgis/src/core/symbology-ng/qgssymbolv2.h
===================================================================
--- trunk/qgis/src/core/symbology-ng/qgssymbolv2.h	2011-02-08 08:40:37 UTC (rev 15138)
+++ trunk/qgis/src/core/symbology-ng/qgssymbolv2.h	2011-02-08 10:00:09 UTC (rev 15139)
@@ -202,7 +202,7 @@
 {
   public:
     QgsFillSymbolV2( QgsSymbolLayerV2List layers = QgsSymbolLayerV2List() );
-
+    void setAngle( double angle );
     void renderPolygon( const QPolygonF& points, QList<QPolygonF>* rings, QgsRenderContext& context, int layer = -1, bool selected = false );
 
     virtual QgsSymbolV2* clone() const;

Modified: trunk/qgis/src/gui/symbology-ng/qgssymbollayerv2widget.cpp
===================================================================
--- trunk/qgis/src/gui/symbology-ng/qgssymbollayerv2widget.cpp	2011-02-08 08:40:37 UTC (rev 15138)
+++ trunk/qgis/src/gui/symbology-ng/qgssymbollayerv2widget.cpp	2011-02-08 10:00:09 UTC (rev 15139)
@@ -678,6 +678,7 @@
     double width = mLayer->patternWidth();
     mTextureWidthSpinBox->setValue( width );
     mSVGLineEdit->setText( mLayer->svgFilePath() );
+    mRotationSpinBox->setValue( mLayer->angle() );
   }
   updateOutlineIcon();
 }
@@ -745,6 +746,15 @@
   emit changed();
 }
 
+void QgsSVGFillSymbolLayerWidget::on_mRotationSpinBox_valueChanged( double d )
+{
+  if ( mLayer )
+  {
+    mLayer->setAngle( d );
+  }
+  emit changed();
+}
+
 void QgsSVGFillSymbolLayerWidget::updateOutlineIcon()
 {
   if ( mLayer )

Modified: trunk/qgis/src/gui/symbology-ng/qgssymbollayerv2widget.h
===================================================================
--- trunk/qgis/src/gui/symbology-ng/qgssymbollayerv2widget.h	2011-02-08 08:40:37 UTC (rev 15138)
+++ trunk/qgis/src/gui/symbology-ng/qgssymbollayerv2widget.h	2011-02-08 10:00:09 UTC (rev 15139)
@@ -247,6 +247,7 @@
     void on_mSVGLineEdit_textChanged( const QString & text );
     void setFile( const QModelIndex& item );
     void on_mChangeOutlinePushButton_clicked();
+    void on_mRotationSpinBox_valueChanged( double d );
 };
 
 //////////

Modified: trunk/qgis/src/ui/symbollayer/widget_svgfill.ui
===================================================================
--- trunk/qgis/src/ui/symbollayer/widget_svgfill.ui	2011-02-08 08:40:37 UTC (rev 15138)
+++ trunk/qgis/src/ui/symbollayer/widget_svgfill.ui	2011-02-08 10:00:09 UTC (rev 15139)
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>211</width>
-    <height>199</height>
+    <width>185</width>
+    <height>221</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -33,6 +33,24 @@
     </layout>
    </item>
    <item row="1" column="0">
+    <layout class="QHBoxLayout" name="horizontalLayout_3">
+     <item>
+      <widget class="QLabel" name="mRotationLabel">
+       <property name="text">
+        <string>Rotation</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QDoubleSpinBox" name="mRotationSpinBox">
+       <property name="maximum">
+        <double>360.000000000000000</double>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="2" column="0">
     <layout class="QHBoxLayout" name="horizontalLayout_4">
      <item>
       <widget class="QLabel" name="mOutlineLabel">
@@ -50,7 +68,7 @@
      </item>
     </layout>
    </item>
-   <item row="2" column="0">
+   <item row="3" column="0">
     <widget class="QListView" name="mSvgListView">
      <property name="flow">
       <enum>QListView::LeftToRight</enum>
@@ -66,7 +84,7 @@
      </property>
     </widget>
    </item>
-   <item row="3" column="0">
+   <item row="4" column="0">
     <layout class="QHBoxLayout" name="horizontalLayout">
      <item>
       <widget class="QLineEdit" name="mSVGLineEdit"/>



More information about the QGIS-commit mailing list