Quantum GIS API Documentation  master-ce49b66
src/gui/symbology-ng/qgsrendererv2widget.cpp
Go to the documentation of this file.
00001 /***************************************************************************
00002     qgsrendererv2widget.cpp
00003     ---------------------
00004     begin                : November 2009
00005     copyright            : (C) 2009 by Martin Dobias
00006     email                : wonder dot sk at gmail dot com
00007  ***************************************************************************
00008  *                                                                         *
00009  *   This program is free software; you can redistribute it and/or modify  *
00010  *   it under the terms of the GNU General Public License as published by  *
00011  *   the Free Software Foundation; either version 2 of the License, or     *
00012  *   (at your option) any later version.                                   *
00013  *                                                                         *
00014  ***************************************************************************/
00015 #include "qgsrendererv2widget.h"
00016 #include "qgssymbolv2.h"
00017 #include "qgsvectorlayer.h"
00018 #include <QColorDialog>
00019 #include <QInputDialog>
00020 #include <QMenu>
00021 
00022 #include "qgssymbollevelsv2dialog.h"
00023 
00024 
00025 QgsRendererV2Widget::QgsRendererV2Widget( QgsVectorLayer* layer, QgsStyleV2* style )
00026     : QWidget(), mLayer( layer ), mStyle( style )
00027 {
00028   contextMenu = new QMenu( "Renderer Options " );
00029 
00030   contextMenu->addAction( tr( "Change color" ), this, SLOT( changeSymbolColor( ) ) );
00031   contextMenu->addAction( tr( "Change transparency" ), this, SLOT( changeSymbolTransparency() ) );
00032   contextMenu->addAction( tr( "Change output unit" ), this, SLOT( changeSymbolUnit() ) );
00033 
00034   if ( mLayer && mLayer->geometryType() == QGis::Line )
00035   {
00036     contextMenu->addAction( tr( "Change width" ), this, SLOT( changeSymbolWidth() ) );
00037   }
00038   else if ( mLayer && mLayer->geometryType() == QGis::Point )
00039   {
00040     contextMenu->addAction( tr( "Change size" ), this, SLOT( changeSymbolSize() ) );
00041   }
00042 }
00043 
00044 void QgsRendererV2Widget::contextMenuViewCategories( const QPoint & )
00045 {
00046   contextMenu->exec( QCursor::pos() );
00047 }
00048 
00049 void QgsRendererV2Widget::changeSymbolColor()
00050 {
00051   QList<QgsSymbolV2*> symbolList = selectedSymbols();
00052   if ( symbolList.size() < 1 )
00053   {
00054     return;
00055   }
00056 
00057   QColor color = QColorDialog::getColor( symbolList.at( 0 )->color(), this );
00058   if ( color.isValid() )
00059   {
00060     QList<QgsSymbolV2*>::iterator symbolIt = symbolList.begin();
00061     for ( ; symbolIt != symbolList.end(); ++symbolIt )
00062     {
00063       ( *symbolIt )->setColor( color );
00064     }
00065     refreshSymbolView();
00066   }
00067 }
00068 
00069 void QgsRendererV2Widget::changeSymbolTransparency()
00070 {
00071   QList<QgsSymbolV2*> symbolList = selectedSymbols();
00072   if ( symbolList.size() < 1 )
00073   {
00074     return;
00075   }
00076 
00077   bool ok;
00078   double oldTransparency = ( 1 - symbolList.at( 0 )->alpha() ) * 100; // convert to percents
00079   double transparency = QInputDialog::getDouble( this, tr( "Transparency" ), tr( "Change symbol transparency [%]" ), oldTransparency, 0.0, 100.0, 0, &ok );
00080   if ( ok )
00081   {
00082     QList<QgsSymbolV2*>::iterator symbolIt = symbolList.begin();
00083     for ( ; symbolIt != symbolList.end(); ++symbolIt )
00084     {
00085       ( *symbolIt )->setAlpha( 1 - transparency / 100 );
00086     }
00087     refreshSymbolView();
00088   }
00089 }
00090 
00091 void QgsRendererV2Widget::changeSymbolUnit()
00092 {
00093   QList<QgsSymbolV2*> symbolList = selectedSymbols();
00094   if ( symbolList.size() < 1 )
00095   {
00096     return;
00097   }
00098 
00099   bool ok;
00100   int currentUnit = ( symbolList.at( 0 )->outputUnit() == QgsSymbolV2::MM ) ? 0 : 1;
00101   QString item = QInputDialog::getItem( this, tr( "Symbol unit" ), tr( "Select symbol unit" ), QStringList() << tr( "Millimeter" ) << tr( "Map unit" ), currentUnit, false, &ok );
00102   if ( ok )
00103   {
00104     QgsSymbolV2::OutputUnit unit = ( item.compare( tr( "Millimeter" ) ) == 0 ) ? QgsSymbolV2::MM : QgsSymbolV2::MapUnit;
00105 
00106     QList<QgsSymbolV2*>::iterator symbolIt = symbolList.begin();
00107     for ( ; symbolIt != symbolList.end(); ++symbolIt )
00108     {
00109       ( *symbolIt )->setOutputUnit( unit );
00110     }
00111     refreshSymbolView();
00112   }
00113 }
00114 
00115 void QgsRendererV2Widget::changeSymbolWidth()
00116 {
00117   QList<QgsSymbolV2*> symbolList = selectedSymbols();
00118   if ( symbolList.size() < 1 )
00119   {
00120     return;
00121   }
00122 
00123   bool ok;
00124   double width = QInputDialog::getDouble( this, tr( "Width" ), tr( "Change symbol width" ), dynamic_cast<QgsLineSymbolV2*>( symbolList.at( 0 ) )->width(), 0.0, 999999, 1, &ok );
00125   if ( ok )
00126   {
00127     QList<QgsSymbolV2*>::iterator symbolIt = symbolList.begin();
00128     for ( ; symbolIt != symbolList.end(); ++symbolIt )
00129     {
00130       dynamic_cast<QgsLineSymbolV2*>( *symbolIt )->setWidth( width );
00131     }
00132     refreshSymbolView();
00133   }
00134 }
00135 
00136 void QgsRendererV2Widget::changeSymbolSize()
00137 {
00138   QList<QgsSymbolV2*> symbolList = selectedSymbols();
00139   if ( symbolList.size() < 1 )
00140   {
00141     return;
00142   }
00143 
00144   bool ok;
00145   double size = QInputDialog::getDouble( this, tr( "Size" ), tr( "Change symbol size" ), dynamic_cast<QgsMarkerSymbolV2*>( symbolList.at( 0 ) )->size(), 0.0, 999999, 1, &ok );
00146   if ( ok )
00147   {
00148     QList<QgsSymbolV2*>::iterator symbolIt = symbolList.begin();
00149     for ( ; symbolIt != symbolList.end(); ++symbolIt )
00150     {
00151       dynamic_cast<QgsMarkerSymbolV2*>( *symbolIt )->setSize( size );
00152     }
00153     refreshSymbolView();
00154   }
00155 }
00156 
00157 void QgsRendererV2Widget::showSymbolLevelsDialog( QgsFeatureRendererV2* r )
00158 {
00159   QgsLegendSymbolList symbols = r->legendSymbolItems();
00160 
00161   QgsSymbolLevelsV2Dialog dlg( symbols, r->usingSymbolLevels(), this );
00162 
00163   if ( dlg.exec() )
00164   {
00165     r->setUsingSymbolLevels( dlg.usingLevels() );
00166   }
00167 }
00168 
00169 
00171 
00172 //#include <QAction>
00173 #include "qgsfield.h"
00174 #include <QMenu>
00175 
00176 QgsRendererV2DataDefinedMenus::QgsRendererV2DataDefinedMenus( QMenu* menu, const QgsFields& flds, QString rotationField, QString sizeScaleField, QgsSymbolV2::ScaleMethod scaleMethod )
00177     : QObject( menu ), mFlds( flds )
00178 {
00179   mRotationMenu = new QMenu( tr( "Rotation field" ) );
00180   mSizeScaleMenu = new QMenu( tr( "Size scale field" ) );
00181 
00182   mRotationAttributeActionGroup = new QActionGroup( mRotationMenu );
00183   mSizeAttributeActionGroup = new QActionGroup( mSizeScaleMenu );
00184   mSizeMethodActionGroup = new QActionGroup( mSizeScaleMenu );
00185 
00186   populateMenu( mRotationMenu, SLOT( rotationFieldSelected( QAction* a ) ), rotationField, mRotationAttributeActionGroup );
00187   populateMenu( mSizeScaleMenu, SLOT( sizeScaleFieldSelected( QAction* a ) ), sizeScaleField, mSizeAttributeActionGroup );
00188 
00189   mSizeScaleMenu->addSeparator();
00190 
00191   QAction* aScaleByArea = new QAction( tr( "Scale area" ), mSizeMethodActionGroup ) ;
00192   QAction* aScaleByDiameter = new QAction( tr( "Scale diameter" ), mSizeMethodActionGroup );
00193 
00194   aScaleByArea->setCheckable( true );
00195   aScaleByDiameter->setCheckable( true );
00196 
00197   if ( scaleMethod == QgsSymbolV2::ScaleDiameter )
00198   {
00199     aScaleByDiameter->setChecked( true );
00200   }
00201   else
00202   {
00203     aScaleByArea->setChecked( true );
00204   }
00205 
00206   mSizeScaleMenu->addActions( mSizeMethodActionGroup->actions() );
00207 
00208   menu->addMenu( mRotationMenu );
00209   menu->addMenu( mSizeScaleMenu );
00210 }
00211 
00212 QgsRendererV2DataDefinedMenus::~QgsRendererV2DataDefinedMenus()
00213 {
00214   delete mSizeMethodActionGroup;
00215   delete mSizeAttributeActionGroup;
00216   delete mRotationAttributeActionGroup;
00217   delete mRotationMenu;
00218   delete mSizeScaleMenu;
00219 }
00220 
00221 void QgsRendererV2DataDefinedMenus::populateMenu( QMenu* menu, const char* slot, QString fieldName, QActionGroup *actionGroup )
00222 {
00223   Q_UNUSED( slot );
00224   QAction* aNo = new QAction( tr( "- no field -" ), actionGroup );
00225   aNo->setCheckable( true );
00226   menu->addAction( aNo );
00227   menu->addSeparator();
00228 
00229   bool hasField = false;
00230   //const QgsFieldMap& flds = mLayer->pendingFields();
00231   for ( int idx = 0; idx < mFlds.count(); ++idx )
00232   {
00233     const QgsField& fld = mFlds[idx];
00234     if ( fld.type() == QVariant::Int || fld.type() == QVariant::Double )
00235     {
00236       QAction* a = new QAction( fld.name(), actionGroup );
00237       a->setCheckable( true );
00238       if ( fieldName == fld.name() )
00239       {
00240         a->setChecked( true );
00241         hasField = true;
00242       }
00243       menu->addAction( a );
00244     }
00245   }
00246 
00247   if ( !hasField )
00248   {
00249     aNo->setChecked( true );
00250   }
00251 
00252   connect( mSizeMethodActionGroup, SIGNAL( triggered( QAction* ) ), this, SLOT( scaleMethodSelected( QAction* ) ) );
00253   connect( mRotationAttributeActionGroup, SIGNAL( triggered( QAction* ) ), this, SLOT( rotationFieldSelected( QAction* ) ) );
00254   connect( mSizeAttributeActionGroup, SIGNAL( triggered( QAction* ) ), this, SLOT( sizeScaleFieldSelected( QAction* ) ) );
00255 }
00256 
00257 void QgsRendererV2DataDefinedMenus::rotationFieldSelected( QAction* a )
00258 {
00259   if ( a == NULL )
00260     return;
00261 
00262   QString fldName = a->text();
00263 #if 0
00264   updateMenu( mRotationAttributeActionGroup, fldName );
00265 #endif
00266   if ( fldName == tr( "- no field -" ) )
00267     fldName = QString();
00268 
00269   emit rotationFieldChanged( fldName );
00270 }
00271 
00272 void QgsRendererV2DataDefinedMenus::sizeScaleFieldSelected( QAction* a )
00273 {
00274   if ( a == NULL )
00275     return;
00276 
00277   QString fldName = a->text();
00278 #if 0
00279   updateMenu( mSizeAttributeActionGroup, fldName );
00280 #endif
00281   if ( fldName == tr( "- no field -" ) )
00282     fldName = QString();
00283 
00284   emit sizeScaleFieldChanged( fldName );
00285 }
00286 
00287 void QgsRendererV2DataDefinedMenus::scaleMethodSelected( QAction* a )
00288 {
00289   if ( a == NULL )
00290     return;
00291 
00292   if ( a->text() == tr( "Scale area" ) )
00293   {
00294     emit scaleMethodChanged( QgsSymbolV2::ScaleArea );
00295   }
00296   else if ( a->text() == tr( "Scale diameter" ) )
00297   {
00298     emit scaleMethodChanged( QgsSymbolV2::ScaleDiameter );
00299   }
00300 }
00301 #if 0 // MK: is there any reason for this?
00302 void QgsRendererV2DataDefinedMenus::updateMenu( QActionGroup* actionGroup, QString fieldName )
00303 {
00304   foreach ( QAction* a, actionGroup->actions() )
00305   {
00306     a->setChecked( a->text() == fieldName );
00307   }
00308 }
00309 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines