[QGIS Commit] r11671 - in trunk/qgis: images/themes/default src/app

svn_qgis at osgeo.org svn_qgis at osgeo.org
Wed Sep 16 15:02:27 EDT 2009


Author: mhugent
Date: 2009-09-16 15:02:26 -0400 (Wed, 16 Sep 2009)
New Revision: 11671

Added:
   trunk/qgis/images/themes/default/mActionRotatePointSymbols.png
   trunk/qgis/src/app/qgsmaptoolrotatepointsymbols.cpp
   trunk/qgis/src/app/qgsmaptoolrotatepointsymbols.h
   trunk/qgis/src/app/qgspointrotationitem.cpp
   trunk/qgis/src/app/qgspointrotationitem.h
Modified:
   trunk/qgis/src/app/CMakeLists.txt
   trunk/qgis/src/app/qgisapp.cpp
   trunk/qgis/src/app/qgisapp.h
Log:
[FEATURE]: add tool to graphically rotate points (by changing the value of the rotation field). Needs some more beautifying, perhaps a nicer arrow

Added: trunk/qgis/images/themes/default/mActionRotatePointSymbols.png
===================================================================
(Binary files differ)


Property changes on: trunk/qgis/images/themes/default/mActionRotatePointSymbols.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Modified: trunk/qgis/src/app/CMakeLists.txt
===================================================================
--- trunk/qgis/src/app/CMakeLists.txt	2009-09-16 11:55:36 UTC (rev 11670)
+++ trunk/qgis/src/app/CMakeLists.txt	2009-09-16 19:02:26 UTC (rev 11671)
@@ -40,6 +40,7 @@
   qgsmaptoolmovevertex.cpp
   qgsmaptoolnodetool.cpp
   qgsmaptoolreshape.cpp
+  qgsmaptoolrotatepointsymbols.cpp
   qgsmaptoolselect.cpp
   qgsmaptoolsimplify.cpp
   qgsmaptoolsplitfeatures.cpp
@@ -52,6 +53,7 @@
   qgsogrsublayersdialog.cpp
   qgsoptions.cpp
   qgspastetransformations.cpp
+  qgspointrotationitem.cpp
   qgspluginitem.cpp
   qgspluginmanager.cpp
   qgspluginmetadata.cpp

Modified: trunk/qgis/src/app/qgisapp.cpp
===================================================================
--- trunk/qgis/src/app/qgisapp.cpp	2009-09-16 11:55:36 UTC (rev 11670)
+++ trunk/qgis/src/app/qgisapp.cpp	2009-09-16 19:02:26 UTC (rev 11671)
@@ -172,6 +172,7 @@
 #include "qgsmaptoolpan.h"
 #include "qgsmaptoolselect.h"
 #include "qgsmaptoolreshape.h"
+#include "qgsmaptoolrotatepointsymbols.h"
 #include "qgsmaptoolsplitfeatures.h"
 #include "qgsmaptoolvertexedit.h"
 #include "qgsmaptoolzoom.h"
@@ -740,6 +741,12 @@
   connect( mActionNodeTool, SIGNAL( triggered() ), this, SLOT( nodeTool() ) );
   mActionNodeTool->setEnabled( false );
 
+  mActionRotatePointSymbols = new QAction( getThemeIcon( "mActionRotatePointSymbols.png" ), tr( "Rotate Point Symbols" ), this );
+  shortcuts->registerAction( mActionRotatePointSymbols );
+  mActionRotatePointSymbols->setStatusTip( tr( "Rotate Point Symbols" ) );
+  connect( mActionRotatePointSymbols, SIGNAL( triggered() ), this, SLOT( rotatePointSymbols() ) );
+  mActionRotatePointSymbols->setEnabled( false );
+
   // View Menu Items
 
   mActionPan = new QAction( getThemeIcon( "mActionPan.png" ), tr( "Pan Map" ), this );
@@ -1094,7 +1101,8 @@
   mMapToolGroup->addAction( mActionMergeFeatures );
   mActionNodeTool->setCheckable( true );
   mMapToolGroup->addAction( mActionNodeTool );
-
+  mActionRotatePointSymbols->setCheckable( true );
+  mMapToolGroup->addAction( mActionRotatePointSymbols );
 }
 
 void QgisApp::createMenus()
@@ -1189,6 +1197,7 @@
   mEditMenu->addAction( mActionSplitFeatures );
   mEditMenu->addAction( mActionMergeFeatures );
   mEditMenu->addAction( mActionNodeTool );
+  mEditMenu->addAction( mActionRotatePointSymbols );
 
   if ( layout == QDialogButtonBox::GnomeLayout || layout == QDialogButtonBox::MacLayout )
   {
@@ -1398,6 +1407,7 @@
   mAdvancedDigitizeToolBar->addAction( mActionSplitFeatures );
   mAdvancedDigitizeToolBar->addAction( mActionMergeFeatures );
   mAdvancedDigitizeToolBar->addAction( mActionNodeTool );
+  mAdvancedDigitizeToolBar->addAction( mActionRotatePointSymbols );
   mToolbarMenu->addAction( mAdvancedDigitizeToolBar->toggleViewAction() );
 
 
@@ -1788,6 +1798,8 @@
   mMapTools.mDeletePart->setAction( mActionDeletePart );
   mMapTools.mNodeTool = new QgsMapToolNodeTool( mMapCanvas );
   mMapTools.mNodeTool->setAction( mActionNodeTool );
+  mMapTools.mRotatePointSymbolsTool = new QgsMapToolRotatePointSymbols( mMapCanvas );
+  mMapTools.mRotatePointSymbolsTool->setAction( mActionRotatePointSymbols );
   //ensure that non edit tool is initialised or we will get crashes in some situations
   mNonEditMapTool = mMapTools.mPan;
 }
@@ -4298,6 +4310,11 @@
   mMapCanvas->setMapTool( mMapTools.mNodeTool );
 }
 
+void QgisApp::rotatePointSymbols()
+{
+  mMapCanvas->setMapTool( mMapTools.mRotatePointSymbolsTool );
+}
+
 void QgisApp::splitFeatures()
 {
   mMapCanvas->setMapTool( mMapTools.mSplitFeatures );
@@ -5639,11 +5656,19 @@
         mActionSplitFeatures->setEnabled( false );
         mActionSimplifyFeature->setEnabled( false );
         mActionDeleteRing->setEnabled( false );
+        mActionRotatePointSymbols->setEnabled( false );
 
         if ( vlayer->isEditable() && dprovider->capabilities() & QgsVectorDataProvider::ChangeGeometries )
         {
           mActionMoveVertex->setEnabled( true );
         }
+        if ( vlayer->isEditable() && dprovider->capabilities() & QgsVectorDataProvider::ChangeAttributeValues )
+        {
+          if ( QgsMapToolRotatePointSymbols::layerIsRotatable( vlayer ) )
+          {
+            mActionRotatePointSymbols->setEnabled( true );
+          }
+        }
         return;
       }
       else if ( vlayer->geometryType() == QGis::Line )
@@ -5752,6 +5777,9 @@
     mActionCopyFeatures->setEnabled( false );
     mActionCutFeatures->setEnabled( false );
     mActionPasteFeatures->setEnabled( false );
+    mActionRotatePointSymbols->setEnabled( false );
+    mActionNodeTool->setEnabled( false );
+    mActionDeletePart->setEnabled( false );
 
     //NOTE: This check does not really add any protection, as it is called on load not on layer select/activate
     //If you load a layer with a provider and idenitfy ability then load another without, the tool would be disabled for both

Modified: trunk/qgis/src/app/qgisapp.h
===================================================================
--- trunk/qgis/src/app/qgisapp.h	2009-09-16 11:55:36 UTC (rev 11670)
+++ trunk/qgis/src/app/qgisapp.h	2009-09-16 19:02:26 UTC (rev 11671)
@@ -523,6 +523,8 @@
     void mergeSelectedFeatures();
     //! provides operations with nodes
     void nodeTool();
+    //! activates the rotate points tool
+    void rotatePointSymbols();
 
     //! activates the selection tool
     void select();
@@ -742,6 +744,7 @@
     QAction *mActionDeletePart;
     QAction *mActionMergeFeatures;
     QAction *mActionNodeTool;
+    QAction *mActionRotatePointSymbols;
     QAction *mActionEditSeparator3;
 
     QAction *mActionPan;
@@ -864,6 +867,7 @@
         QgsMapTool* mDeleteRing;
         QgsMapTool* mDeletePart;
         QgsMapTool* mNodeTool;
+        QgsMapTool* mRotatePointSymbolsTool;
     } mMapTools;
 
     QgsMapTool *mNonEditMapTool;

Added: trunk/qgis/src/app/qgsmaptoolrotatepointsymbols.cpp
===================================================================
--- trunk/qgis/src/app/qgsmaptoolrotatepointsymbols.cpp	                        (rev 0)
+++ trunk/qgis/src/app/qgsmaptoolrotatepointsymbols.cpp	2009-09-16 19:02:26 UTC (rev 11671)
@@ -0,0 +1,250 @@
+/***************************************************************************
+    qgsmaptoolrotatepointsymbols.cpp
+    --------------------------------
+    begin                : September 2009
+    copyright            : (C) 2009 by Marco Hugentobler
+    email                : marco at hugis dot net
+ ***************************************************************************
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ ***************************************************************************/
+
+#include "qgsmaptoolrotatepointsymbols.h"
+#include "qgsapplication.h"
+#include "qgsmapcanvas.h"
+#include "qgspointrotationitem.h"
+#include "qgsrenderer.h"
+#include "qgssymbol.h"
+#include "qgsvectorlayer.h"
+#include <QGraphicsPixmapItem>
+#include <QMessageBox>
+#include <QMouseEvent>
+
+QgsMapToolRotatePointSymbols::QgsMapToolRotatePointSymbols( QgsMapCanvas* canvas ): QgsMapToolEdit( canvas ), \
+    mActiveLayer( 0 ), mFeatureNumber( 0 ), mCurrentMouseAzimut( 0.0 ), mCurrentRotationFeature( 0.0 ), mRotating( false ), mRotationItem( 0 )
+{
+
+}
+
+QgsMapToolRotatePointSymbols::~QgsMapToolRotatePointSymbols()
+{
+  delete mRotationItem;
+}
+
+bool QgsMapToolRotatePointSymbols::layerIsRotatable( QgsMapLayer* ml )
+{
+  if ( !ml )
+  {
+    return false;
+  }
+
+  //a vector layer
+  QgsVectorLayer* vLayer = dynamic_cast<QgsVectorLayer*>( ml );
+  if ( !vLayer )
+  {
+    return false;
+  }
+
+  //does it have point or multipoint type?
+  if ( vLayer->geometryType() != QGis::Point )
+  {
+    return false;
+  }
+
+  //does it have a least one rotation attribute?
+  QList<int> rotationAttributes;
+  layerRotationAttributes( vLayer, rotationAttributes );
+  if ( rotationAttributes.size() < 1 )
+  {
+    return false;
+  }
+  return true;
+}
+
+void QgsMapToolRotatePointSymbols::canvasPressEvent( QMouseEvent * e )
+{
+  if ( !mCanvas )
+  {
+    return;
+  }
+
+  mActiveLayer = currentVectorLayer();
+  if ( !mActiveLayer )
+  {
+    return;
+  }
+
+  if ( mActiveLayer->geometryType() != QGis::Point || !mActiveLayer->isEditable() )
+  {
+    return;
+  }
+
+  //find the closest feature to the pressed position
+  QgsMapCanvasSnapper canvasSnapper( mCanvas );
+  QList<QgsSnappingResult> snapResults;
+  if ( canvasSnapper.snapToCurrentLayer( e->pos(), snapResults, QgsSnapper::SnapToVertex, -1 ) != 0 || snapResults.size() < 1 )
+  {
+    QMessageBox::critical( 0, tr( "No point feature" ), tr( "No point feature was detected at the clicked position. Please click closer to the feature or enhance the search tolerance under Settings->Options->Digitizing->Serch radius for vertex edits" ) );
+    return; //error during snapping
+  }
+
+  mFeatureNumber = snapResults.at( 0 ).snappedAtGeometry;
+
+  //get list with renderer rotation attributes
+  if ( layerRotationAttributes( mActiveLayer, mCurrentRotationAttributes ) != 0 )
+  {
+    return;
+  }
+
+  if ( mCurrentRotationAttributes.size() < 1 )
+  {
+    QMessageBox::critical( 0, tr( "No rotation Attributes" ), tr( "The active point layer does not have a rotation attribute" ) );
+    return;
+  }
+
+  mSnappedPoint = toCanvasCoordinates( snapResults.at( 0 ).snappedVertex );
+
+  //find out initial arrow direction
+  QgsFeature pointFeature;
+  if ( !mActiveLayer->featureAtId( mFeatureNumber, pointFeature, false, true ) )
+  {
+    return;
+  }
+  const QgsAttributeMap pointFeatureAttributes = pointFeature.attributeMap();
+  const QgsAttributeMap::const_iterator attIt = pointFeatureAttributes.find( mCurrentRotationAttributes.at( 0 ) );
+  if ( attIt == pointFeatureAttributes.constEnd() )
+  {
+    return;
+  }
+
+  mCurrentRotationFeature = attIt.value().toDouble();
+  createPixmapItem();
+  if ( mRotationItem )
+  {
+    mRotationItem->setPointLocation( snapResults.at( 0 ).snappedVertex );
+  }
+  mCurrentMouseAzimut = calculateAzimut( e->pos() );
+  setPixmapItemRotation( mCurrentMouseAzimut );
+  mRotating = true;
+}
+
+void QgsMapToolRotatePointSymbols::canvasMoveEvent( QMouseEvent * e )
+{
+  if ( !mRotating )
+  {
+    return;
+  }
+
+  double azimut = calculateAzimut( e->pos() );
+  double azimutDiff = azimut - mCurrentMouseAzimut;
+
+  //assign new feature rotation, making sure to respect the 0 - 360 degree range
+  mCurrentRotationFeature += azimutDiff;
+  if ( mCurrentRotationFeature < 0 )
+  {
+    mCurrentRotationFeature = 360 - mCurrentRotationFeature;
+  }
+  else if ( mCurrentRotationFeature >= 360 )
+  {
+    mCurrentRotationFeature -= 360;
+  }
+  mCurrentMouseAzimut = azimut;
+  if ( mCurrentMouseAzimut < 0 )
+  {
+    mCurrentMouseAzimut = 360 - mCurrentMouseAzimut;
+  }
+  else if ( mCurrentMouseAzimut >= 360 )
+  {
+    mCurrentMouseAzimut -= 360;
+  }
+  setPixmapItemRotation( mCurrentRotationFeature );
+}
+
+void QgsMapToolRotatePointSymbols::canvasReleaseEvent( QMouseEvent * e )
+{
+  if ( mRotating && mActiveLayer )
+  {
+    mActiveLayer->beginEditCommand( tr( "Rotate symbol" ) );
+    bool rotateSuccess = true;
+
+    //write mCurrentRotationFeature to all rotation attributes of feature (mFeatureNumber)
+    QList<int>::const_iterator it = mCurrentRotationAttributes.constBegin();
+    for ( ; it != mCurrentRotationAttributes.constEnd(); ++it )
+    {
+      if ( !mActiveLayer->changeAttributeValue( mFeatureNumber, *it, mCurrentRotationFeature, true ) )
+      {
+        rotateSuccess = false;
+      }
+    }
+
+    if ( rotateSuccess )
+    {
+      mActiveLayer->endEditCommand();
+    }
+    else
+    {
+      mActiveLayer->destroyEditCommand();
+    }
+  }
+  mRotating = false;
+  delete mRotationItem;
+  mRotationItem = 0;
+  mCanvas->refresh();
+}
+
+int QgsMapToolRotatePointSymbols::layerRotationAttributes( const QgsVectorLayer* vl, QList<int>& attList )
+{
+  attList.clear();
+  if ( !vl )
+  {
+    return 1;
+  }
+
+  //get renderer
+  const QgsRenderer* layerRenderer = vl->renderer();
+  if ( !layerRenderer )
+  {
+    return 2;
+  }
+
+  //get renderer symbols
+  const QList<QgsSymbol*> rendererSymbols = layerRenderer->symbols();
+  int currentRotationAttribute;
+
+  QList<QgsSymbol*>::const_iterator symbolIt = rendererSymbols.constBegin();
+  for ( ; symbolIt != rendererSymbols.constEnd(); ++symbolIt )
+  {
+    currentRotationAttribute = ( *symbolIt )->rotationClassificationField();
+    if ( currentRotationAttribute >= 0 )
+    {
+      attList.push_back( currentRotationAttribute );
+    }
+  }
+  return 0;
+}
+
+double QgsMapToolRotatePointSymbols::calculateAzimut( const QPoint& mousePos )
+{
+  int dx = mousePos.x() - mSnappedPoint.x();
+  int dy = mousePos.y() - mSnappedPoint.y();
+  return 180 - atan2( dx, dy ) * 180.0 / M_PI;
+}
+
+void QgsMapToolRotatePointSymbols::createPixmapItem()
+{
+  delete mRotationItem;
+  mRotationItem = new QgsPointRotationItem( mCanvas );
+  mRotationItem->setSymbol( QgsApplication::defaultThemePath() + "mActionArrowUp.png" );
+  mCanvas->scene()->addItem( mRotationItem );
+}
+
+void QgsMapToolRotatePointSymbols::setPixmapItemRotation( double rotation )
+{
+  mRotationItem->setSymbolRotation( rotation );
+  mRotationItem->update();
+}
+

Added: trunk/qgis/src/app/qgsmaptoolrotatepointsymbols.h
===================================================================
--- trunk/qgis/src/app/qgsmaptoolrotatepointsymbols.h	                        (rev 0)
+++ trunk/qgis/src/app/qgsmaptoolrotatepointsymbols.h	2009-09-16 19:02:26 UTC (rev 11671)
@@ -0,0 +1,68 @@
+/***************************************************************************
+    qgsmaptoolrotatepointsymbols.h
+    ---------------------
+    begin                : September 2009
+    copyright            : (C) 2009 by Marco Hugentobler
+    email                : marco at hugis dot net
+ ***************************************************************************
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ ***************************************************************************/
+
+#ifndef QGSMAPTOOLROTATEPOINTSYMBOLS_H
+#define QGSMAPTOOLROTATEPOINTSYMBOLS_H
+
+#include "qgsmaptooledit.h"
+
+class QgsPointRotationItem;
+
+/**A class that allows to interactively manipulate the value of the rotation field(s) for point layers*/
+class QgsMapToolRotatePointSymbols: public QgsMapToolEdit
+{
+  public:
+    QgsMapToolRotatePointSymbols( QgsMapCanvas* canvas );
+    ~QgsMapToolRotatePointSymbols();
+
+    void canvasPressEvent( QMouseEvent * e );
+    void canvasMoveEvent( QMouseEvent * e );
+    void canvasReleaseEvent( QMouseEvent * e );
+
+    bool isEditTool() {return true;}
+
+    /**Returns true if the symbols of a maplayer can be rotated. This means the layer \
+      is a vector layer, has type point or multipoint and has at least one rotation attribute in the renderer*/
+    static bool layerIsRotatable( QgsMapLayer* ml );
+
+  private:
+    QgsVectorLayer* mActiveLayer;
+    int mFeatureNumber;
+    /**Last azimut between mouse and edited point*/
+    double mCurrentMouseAzimut;
+    /**Last feature rotation*/
+    double mCurrentRotationFeature;
+    bool mRotating;
+    QList<int> mCurrentRotationAttributes;
+    /**Screen coordinate of the snaped feature*/
+    QPoint mSnappedPoint;
+    /**Item that displays rotation during mouse move*/
+    QgsPointRotationItem* mRotationItem;
+
+    /**Finds out the rotation attributes of mActiveLayers
+      @param vl the point vector layer
+      @param attList out: the list containing the rotation indices
+      @return 0 in case of success*/
+    static int layerRotationAttributes( const QgsVectorLayer* vl, QList<int>& attList );
+    void drawArrow( double azimut ) const;
+    /**Calculates the azimut between mousePos and mSnappedPoint*/
+    double calculateAzimut( const QPoint& mousePos );
+    /**Create item that shows rotation to the user*/
+    void createPixmapItem();
+    /**Sets the rotation of the pixmap item*/
+    void setPixmapItemRotation( double rotation );
+};
+
+#endif // QGSMAPTOOLROTATEPOINTSYMBOLS_H

Added: trunk/qgis/src/app/qgspointrotationitem.cpp
===================================================================
--- trunk/qgis/src/app/qgspointrotationitem.cpp	                        (rev 0)
+++ trunk/qgis/src/app/qgspointrotationitem.cpp	2009-09-16 19:02:26 UTC (rev 11671)
@@ -0,0 +1,97 @@
+/***************************************************************************
+    qgspointrotationitem.cpp
+    ------------------------
+    begin                : September 2009
+    copyright            : (C) 2009 by Marco Hugentobler
+    email                : marco at hugis dot net
+ ***************************************************************************
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ ***************************************************************************/
+
+#include "qgspointrotationitem.h"
+#include <QPainter>
+
+#ifndef Q_OS_MACX
+#include <cmath>
+#else
+#include <math.h>
+#endif
+
+QgsPointRotationItem::QgsPointRotationItem( QgsMapCanvas* canvas ): QgsMapCanvasItem( canvas ), mRotation( 0.0 )
+{
+  //setup font
+  mFont.setPointSize( 12 );
+  mFont.setBold( true );
+}
+
+QgsPointRotationItem::QgsPointRotationItem(): QgsMapCanvasItem( 0 ), mRotation( 0.0 )
+{
+
+}
+
+QgsPointRotationItem::~QgsPointRotationItem()
+{
+
+}
+
+void QgsPointRotationItem::paint( QPainter * painter )
+{
+  if ( !painter )
+  {
+    return;
+  }
+  painter->save();
+
+  //do a bit of trigonometry to find out how to transform a rotated item such that the center point is at the point feature
+  double x = 0;
+  double y = 0;
+  double h, dAngel;
+  if ( mPixmap.width() > 0 && mPixmap.height() > 0 )
+  {
+    h = sqrt( mPixmap.width() * mPixmap.width() + mPixmap.height() * mPixmap.height() ) / 2; //the half of the item diagonal
+    dAngel = acos( mPixmap.width() / ( h * 2 ) ) * 180 / M_PI; //the diagonal angel of the original rect
+    x = h * cos(( mRotation - dAngel ) * M_PI / 180 );
+    y = h * sin(( mRotation - dAngel ) * M_PI / 180 );
+  }
+
+  //painter->translate(-mPixmap.width() / 2.0, -mPixmap.width() / 2.0);
+  painter->rotate( mRotation );
+  painter->translate( x - mPixmap.width() / 2.0, -y - mPixmap.height() / 2.0 );
+  painter->drawPixmap( 0, 0, mPixmap );
+
+  //draw numeric value beside the symbol
+  painter->restore();
+  QFontMetricsF fm( mFont );
+  painter->fillRect( mPixmap.width(), 0, mItemSize.width() - mPixmap.width(), mItemSize.height(), QColor( Qt::white ) );
+  painter->setFont( mFont );
+  painter->drawText( mPixmap.width(), mPixmap.height() / 2.0 + fm.height() / 2.0, QString::number( mRotation, 'f', 2 ) );
+}
+
+void QgsPointRotationItem::setPointLocation( const QgsPoint& p )
+{
+  QPointF transformedPoint = toCanvasCoordinates( p );
+  setPos( transformedPoint.x() - mPixmap.width() / 2.0, transformedPoint.y() - mPixmap.height() / 2.0 );
+}
+
+void QgsPointRotationItem::setSymbol( const QString& symbolPath )
+{
+  mPixmap = QPixmap( symbolPath );
+  QFontMetricsF fm( mFont );
+  mItemSize.setWidth( mPixmap.width() + fm.width( "360.99" ) );
+  double pixmapHeight = mPixmap.height();
+  double fontHeight = fm.height();
+  if ( pixmapHeight >= fontHeight )
+  {
+    mItemSize.setHeight( mPixmap.height() );
+  }
+  else
+  {
+    mItemSize.setHeight( fm.height() );
+  }
+}
+

Added: trunk/qgis/src/app/qgspointrotationitem.h
===================================================================
--- trunk/qgis/src/app/qgspointrotationitem.h	                        (rev 0)
+++ trunk/qgis/src/app/qgspointrotationitem.h	2009-09-16 19:02:26 UTC (rev 11671)
@@ -0,0 +1,51 @@
+/***************************************************************************
+    qgspointrotationitem.h
+    ----------------------
+    begin                : September 2009
+    copyright            : (C) 2009 by Marco Hugentobler
+    email                : marco at hugis dot net
+ ***************************************************************************
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ ***************************************************************************/
+
+#ifndef QGSPOINTROTATIONITEM_H
+#define QGSPOINTROTATIONITEM_H
+
+#include "qgsmapcanvasitem.h"
+#include <QFontMetricsF>
+#include <QPixmap>
+
+/**An item that shows a rotated point symbol (e.g. arrow) centered to a map location together with a text displaying the rotation value*/
+class QgsPointRotationItem: public QgsMapCanvasItem
+{
+  public:
+    QgsPointRotationItem( QgsMapCanvas* canvas );
+    ~QgsPointRotationItem();
+
+    void paint( QPainter * painter );
+
+    /**Sets the center point of the rotation symbol (in map coordinates)*/
+    void setPointLocation( const QgsPoint& p );
+
+    /**Sets the rotation of the symbol and displays the new rotation number. \
+    Units are degrees, starting from north direction, clockwise direction*/
+    void setSymbolRotation( double r ) {mRotation = r;}
+
+    /**Sets a symbol from image file*/
+    void setSymbol( const QString& symbolPath );
+
+  private:
+    QgsPointRotationItem();
+    /**Font to display the numerical rotation values*/
+    QFont mFont;
+    /**Symboll pixmap*/
+    QPixmap mPixmap;
+    double mRotation;
+};
+
+#endif // QGSPOINTROTATIONITEM_H



More information about the QGIS-commit mailing list