|
Quantum GIS API Documentation
master-ce49b66
|
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