|
QGIS API Documentation
master-59fd5e0
|
00001 /*************************************************************************** 00002 qgsgraduatedsymbolrendererv2widget.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 "qgsgraduatedsymbolrendererv2widget.h" 00016 00017 #include "qgssymbolv2.h" 00018 #include "qgssymbollayerv2utils.h" 00019 #include "qgsvectorcolorrampv2.h" 00020 #include "qgsstylev2.h" 00021 00022 #include "qgsvectorlayer.h" 00023 00024 #include "qgssymbolv2selectordialog.h" 00025 00026 #include "qgsludialog.h" 00027 00028 #include "qgsproject.h" 00029 00030 #include <QMenu> 00031 #include <QMessageBox> 00032 #include <QStandardItemModel> 00033 #include <QStandardItem> 00034 #include <QPen> 00035 #include <QPainter> 00036 00037 // ------------------------------ Model ------------------------------------ 00038 00039 QgsGraduatedSymbolRendererV2Model::QgsGraduatedSymbolRendererV2Model( QObject * parent ) : QAbstractItemModel( parent ) 00040 , mRenderer( 0 ) 00041 , mMimeFormat( "application/x-qgsgraduatedsymbolrendererv2model" ) 00042 { 00043 } 00044 00045 void QgsGraduatedSymbolRendererV2Model::setRenderer( QgsGraduatedSymbolRendererV2* renderer ) 00046 { 00047 if ( mRenderer ) 00048 { 00049 beginRemoveRows( QModelIndex(), 0, mRenderer->ranges().size() - 1 ); 00050 mRenderer = 0; 00051 endRemoveRows(); 00052 } 00053 if ( renderer ) 00054 { 00055 beginInsertRows( QModelIndex(), 0, renderer->ranges().size() - 1 ); 00056 mRenderer = renderer; 00057 endInsertRows(); 00058 } 00059 } 00060 00061 void QgsGraduatedSymbolRendererV2Model::addClass( QgsSymbolV2* symbol ) 00062 { 00063 if ( !mRenderer ) return; 00064 int idx = mRenderer->ranges().size(); 00065 beginInsertRows( QModelIndex(), idx, idx ); 00066 mRenderer->addClass( symbol ); 00067 endInsertRows(); 00068 } 00069 00070 Qt::ItemFlags QgsGraduatedSymbolRendererV2Model::flags( const QModelIndex & index ) const 00071 { 00072 Qt::ItemFlags flags = Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled; 00073 00074 if ( index.column() == 2 ) 00075 { 00076 flags |= Qt::ItemIsEditable; 00077 } 00078 00079 return flags; 00080 } 00081 00082 Qt::DropActions QgsGraduatedSymbolRendererV2Model::supportedDropActions() const 00083 { 00084 return Qt::MoveAction; 00085 } 00086 00087 QVariant QgsGraduatedSymbolRendererV2Model::data( const QModelIndex &index, int role ) const 00088 { 00089 if ( !index.isValid() || !mRenderer ) return QVariant(); 00090 00091 const QgsRendererRangeV2 range = mRenderer->ranges().value( index.row() ); 00092 QString rangeStr = QString::number( range.lowerValue(), 'f', 4 ) + " - " + QString::number( range.upperValue(), 'f', 4 ); 00093 00094 if ( role == Qt::DisplayRole || role == Qt::ToolTipRole ) 00095 { 00096 switch ( index.column() ) 00097 { 00098 case 1: return rangeStr; 00099 case 2: return range.label(); 00100 default: return QVariant(); 00101 } 00102 } 00103 else if ( role == Qt::DecorationRole && index.column() == 0 && range.symbol() ) 00104 { 00105 return QgsSymbolLayerV2Utils::symbolPreviewIcon( range.symbol(), QSize( 16, 16 ) ); 00106 } 00107 else if ( role == Qt::TextAlignmentRole ) 00108 { 00109 return ( index.column() == 0 ) ? Qt::AlignHCenter : Qt::AlignLeft; 00110 } 00111 else if ( role == Qt::EditRole ) 00112 { 00113 switch ( index.column() ) 00114 { 00115 case 1: return rangeStr; 00116 case 2: return range.label(); 00117 default: return QVariant(); 00118 } 00119 } 00120 00121 return QVariant(); 00122 } 00123 00124 bool QgsGraduatedSymbolRendererV2Model::setData( const QModelIndex & index, const QVariant & value, int role ) 00125 { 00126 if ( !index.isValid() || role != Qt::EditRole ) 00127 return false; 00128 00129 switch ( index.column() ) 00130 { 00131 case 1: // range 00132 return false; // range is edited in popup dialog 00133 break; 00134 case 2: // label 00135 mRenderer->updateRangeLabel( index.row(), value.toString() ); 00136 break; 00137 default: 00138 return false; 00139 } 00140 00141 emit dataChanged( index, index ); 00142 return true; 00143 } 00144 00145 QVariant QgsGraduatedSymbolRendererV2Model::headerData( int section, Qt::Orientation orientation, int role ) const 00146 { 00147 if ( orientation == Qt::Horizontal && role == Qt::DisplayRole && section >= 0 && section < 3 ) 00148 { 00149 QStringList lst; lst << tr( "Symbol" ) << tr( "Value" ) << tr( "Label" ); 00150 return lst.value( section ); 00151 } 00152 return QVariant(); 00153 } 00154 00155 int QgsGraduatedSymbolRendererV2Model::rowCount( const QModelIndex &parent ) const 00156 { 00157 if ( parent.column() > 0 || !mRenderer ) return 0; 00158 return mRenderer->ranges().size(); 00159 } 00160 00161 int QgsGraduatedSymbolRendererV2Model::columnCount( const QModelIndex & index ) const 00162 { 00163 Q_UNUSED( index ); 00164 return 3; 00165 } 00166 00167 QModelIndex QgsGraduatedSymbolRendererV2Model::index( int row, int column, const QModelIndex &parent ) const 00168 { 00169 if ( hasIndex( row, column, parent ) ) 00170 { 00171 return createIndex( row, column, 0 ); 00172 } 00173 return QModelIndex(); 00174 } 00175 00176 QModelIndex QgsGraduatedSymbolRendererV2Model::parent( const QModelIndex &index ) const 00177 { 00178 Q_UNUSED( index ); 00179 return QModelIndex(); 00180 } 00181 00182 QStringList QgsGraduatedSymbolRendererV2Model::mimeTypes() const 00183 { 00184 QStringList types; 00185 types << mMimeFormat; 00186 return types; 00187 } 00188 00189 QMimeData *QgsGraduatedSymbolRendererV2Model::mimeData( const QModelIndexList &indexes ) const 00190 { 00191 QMimeData *mimeData = new QMimeData(); 00192 QByteArray encodedData; 00193 00194 QDataStream stream( &encodedData, QIODevice::WriteOnly ); 00195 00196 // Create list of rows 00197 foreach ( const QModelIndex &index, indexes ) 00198 { 00199 if ( !index.isValid() || index.column() != 0 ) 00200 continue; 00201 00202 stream << index.row(); 00203 } 00204 mimeData->setData( mMimeFormat, encodedData ); 00205 return mimeData; 00206 } 00207 00208 bool QgsGraduatedSymbolRendererV2Model::dropMimeData( const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent ) 00209 { 00210 Q_UNUSED( row ); 00211 Q_UNUSED( column ); 00212 if ( action != Qt::MoveAction ) return true; 00213 00214 if ( !data->hasFormat( mMimeFormat ) ) return false; 00215 00216 QByteArray encodedData = data->data( mMimeFormat ); 00217 QDataStream stream( &encodedData, QIODevice::ReadOnly ); 00218 00219 QVector<int> rows; 00220 while ( !stream.atEnd() ) 00221 { 00222 int r; 00223 stream >> r; 00224 rows.append( r ); 00225 } 00226 00227 int to = parent.row(); 00228 // to is -1 if dragged outside items, i.e. below any item, 00229 // then move to the last position 00230 if ( to == -1 ) to = mRenderer->ranges().size(); // out of rang ok, will be decreased 00231 for ( int i = rows.size() - 1; i >= 0; i-- ) 00232 { 00233 QgsDebugMsg( QString( "move %1 to %2" ).arg( rows[i] ).arg( to ) ); 00234 int t = to; 00235 // moveCategory first removes and then inserts 00236 if ( rows[i] < to ) t--; 00237 mRenderer->moveClass( rows[i], t ); 00238 // current moved under another, shift its index up 00239 for ( int j = 0; j < i; j++ ) 00240 { 00241 if ( to < rows[j] && rows[i] > rows[j] ) rows[j] += 1; 00242 } 00243 // removed under 'to' so the target shifted down 00244 if ( rows[i] < to ) to--; 00245 } 00246 emit dataChanged( createIndex( 0, 0, 0 ), createIndex( mRenderer->ranges().size(), 0 ) ); 00247 emit rowsMoved(); 00248 return false; 00249 } 00250 00251 void QgsGraduatedSymbolRendererV2Model::deleteRows( QList<int> rows ) 00252 { 00253 for ( int i = rows.size() - 1; i >= 0; i-- ) 00254 { 00255 beginRemoveRows( QModelIndex(), rows[i], rows[i] ); 00256 mRenderer->deleteClass( rows[i] ); 00257 endRemoveRows(); 00258 } 00259 } 00260 00261 void QgsGraduatedSymbolRendererV2Model::removeAllRows( ) 00262 { 00263 beginRemoveRows( QModelIndex(), 0, mRenderer->ranges().size() - 1 ); 00264 mRenderer->deleteAllClasses(); 00265 endRemoveRows(); 00266 } 00267 00268 void QgsGraduatedSymbolRendererV2Model::sort( int column, Qt::SortOrder order ) 00269 { 00270 QgsDebugMsg( "Entered" ); 00271 if ( column == 0 ) 00272 { 00273 return; 00274 } 00275 if ( column == 1 ) 00276 { 00277 mRenderer->sortByValue( order ); 00278 } 00279 else if ( column == 2 ) 00280 { 00281 mRenderer->sortByLabel( order ); 00282 } 00283 emit dataChanged( createIndex( 0, 0, 0 ), createIndex( mRenderer->ranges().size(), 0 ) ); 00284 QgsDebugMsg( "Done" ); 00285 } 00286 00287 // ------------------------------ View style -------------------------------- 00288 QgsGraduatedSymbolRendererV2ViewStyle::QgsGraduatedSymbolRendererV2ViewStyle( QStyle* style ) 00289 : QProxyStyle( style ) 00290 {} 00291 00292 void QgsGraduatedSymbolRendererV2ViewStyle::drawPrimitive( PrimitiveElement element, const QStyleOption * option, QPainter * painter, const QWidget * widget ) const 00293 { 00294 if ( element == QStyle::PE_IndicatorItemViewItemDrop && !option->rect.isNull() ) 00295 { 00296 QStyleOption opt( *option ); 00297 opt.rect.setLeft( 0 ); 00298 // draw always as line above, because we move item to that index 00299 opt.rect.setHeight( 0 ); 00300 if ( widget ) opt.rect.setRight( widget->width() ); 00301 QProxyStyle::drawPrimitive( element, &opt, painter, widget ); 00302 return; 00303 } 00304 QProxyStyle::drawPrimitive( element, option, painter, widget ); 00305 } 00306 00307 // ------------------------------ Widget ------------------------------------ 00308 00309 QgsRendererV2Widget* QgsGraduatedSymbolRendererV2Widget::create( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer ) 00310 { 00311 return new QgsGraduatedSymbolRendererV2Widget( layer, style, renderer ); 00312 } 00313 00314 QgsGraduatedSymbolRendererV2Widget::QgsGraduatedSymbolRendererV2Widget( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer ) 00315 : QgsRendererV2Widget( layer, style ) 00316 , mRenderer( 0 ) 00317 , mModel( 0 ) 00318 { 00319 00320 // try to recognize the previous renderer 00321 // (null renderer means "no previous renderer") 00322 if ( !renderer || renderer->type() != "graduatedSymbol" ) 00323 { 00324 // we're not going to use it - so let's delete the renderer 00325 delete renderer; 00326 00327 mRenderer = new QgsGraduatedSymbolRendererV2( "", QgsRangeList() ); 00328 } 00329 else 00330 { 00331 mRenderer = static_cast<QgsGraduatedSymbolRendererV2*>( renderer ); 00332 } 00333 00334 // setup user interface 00335 setupUi( this ); 00336 00337 populateColumns(); 00338 00339 cboGraduatedColorRamp->populate( mStyle ); 00340 00341 // set project default color ramp 00342 QString defaultColorRamp = QgsProject::instance()->readEntry( "DefaultStyles", "/ColorRamp", "" ); 00343 if ( defaultColorRamp != "" ) 00344 { 00345 int index = cboGraduatedColorRamp->findText( defaultColorRamp, Qt::MatchCaseSensitive ); 00346 if ( index >= 0 ) 00347 cboGraduatedColorRamp->setCurrentIndex( index ); 00348 } 00349 00350 mModel = new QgsGraduatedSymbolRendererV2Model( this ); 00351 mModel->setRenderer( mRenderer ); 00352 viewGraduated->setModel( mModel ); 00353 viewGraduated->resizeColumnToContents( 0 ); 00354 viewGraduated->resizeColumnToContents( 1 ); 00355 viewGraduated->resizeColumnToContents( 2 ); 00356 00357 viewGraduated->setStyle( new QgsGraduatedSymbolRendererV2ViewStyle( viewGraduated->style() ) ); 00358 00359 mGraduatedSymbol = QgsSymbolV2::defaultSymbol( mLayer->geometryType() ); 00360 00361 connect( cboGraduatedColumn, SIGNAL( currentIndexChanged( int ) ), this, SLOT( graduatedColumnChanged() ) ); 00362 connect( viewGraduated, SIGNAL( doubleClicked( const QModelIndex & ) ), this, SLOT( rangesDoubleClicked( const QModelIndex & ) ) ); 00363 connect( viewGraduated, SIGNAL( clicked( const QModelIndex & ) ), this, SLOT( rangesClicked( const QModelIndex & ) ) ); 00364 connect( viewGraduated, SIGNAL( customContextMenuRequested( const QPoint& ) ), this, SLOT( contextMenuViewCategories( const QPoint& ) ) ); 00365 00366 connect( mModel, SIGNAL( rowsMoved() ), this, SLOT( rowsMoved() ) ); 00367 00368 connect( btnGraduatedClassify, SIGNAL( clicked() ), this, SLOT( classifyGraduated() ) ); 00369 connect( btnChangeGraduatedSymbol, SIGNAL( clicked() ), this, SLOT( changeGraduatedSymbol() ) ); 00370 connect( btnGraduatedDelete, SIGNAL( clicked() ), this, SLOT( deleteClasses() ) ); 00371 connect( btnDeleteAllClasses, SIGNAL( clicked() ), this, SLOT( deleteAllClasses() ) ); 00372 connect( btnGraduatedAdd, SIGNAL( clicked() ), this, SLOT( addClass() ) ); 00373 00374 // initialize from previously set renderer 00375 updateUiFromRenderer(); 00376 00377 connect( spinGraduatedClasses, SIGNAL( valueChanged( int ) ) , this, SLOT( classifyGraduated() ) ); 00378 connect( cboGraduatedMode, SIGNAL( currentIndexChanged( int ) ) , this, SLOT( classifyGraduated() ) ); 00379 connect( cboGraduatedColorRamp, SIGNAL( currentIndexChanged( int ) ) , this, SLOT( reapplyColorRamp() ) ); 00380 00381 // menus for data-defined rotation/size 00382 QMenu* advMenu = new QMenu; 00383 00384 advMenu->addAction( tr( "Symbol levels..." ), this, SLOT( showSymbolLevels() ) ); 00385 00386 mDataDefinedMenus = new QgsRendererV2DataDefinedMenus( advMenu, mLayer->pendingFields(), 00387 mRenderer->rotationField(), mRenderer->sizeScaleField(), mRenderer->scaleMethod() ); 00388 connect( mDataDefinedMenus, SIGNAL( rotationFieldChanged( QString ) ), this, SLOT( rotationFieldChanged( QString ) ) ); 00389 connect( mDataDefinedMenus, SIGNAL( sizeScaleFieldChanged( QString ) ), this, SLOT( sizeScaleFieldChanged( QString ) ) ); 00390 connect( mDataDefinedMenus, SIGNAL( scaleMethodChanged( QgsSymbolV2::ScaleMethod ) ), this, SLOT( scaleMethodChanged( QgsSymbolV2::ScaleMethod ) ) ); 00391 btnAdvanced->setMenu( advMenu ); 00392 } 00393 00394 QgsGraduatedSymbolRendererV2Widget::~QgsGraduatedSymbolRendererV2Widget() 00395 { 00396 delete mRenderer; 00397 delete mModel; 00398 } 00399 00400 QgsFeatureRendererV2* QgsGraduatedSymbolRendererV2Widget::renderer() 00401 { 00402 return mRenderer; 00403 } 00404 00405 00406 void QgsGraduatedSymbolRendererV2Widget::updateUiFromRenderer() 00407 { 00408 updateGraduatedSymbolIcon(); 00409 00410 // update UI from the graduated renderer (update combo boxes, view) 00411 if ( mRenderer->mode() < cboGraduatedMode->count() ) 00412 cboGraduatedMode->setCurrentIndex( mRenderer->mode() ); 00413 if ( mRenderer->ranges().count() ) 00414 spinGraduatedClasses->setValue( mRenderer->ranges().count() ); 00415 00416 // set column 00417 disconnect( cboGraduatedColumn, SIGNAL( currentIndexChanged( int ) ), this, SLOT( graduatedColumnChanged() ) ); 00418 QString attrName = mRenderer->classAttribute(); 00419 int idx = cboGraduatedColumn->findText( attrName, Qt::MatchExactly ); 00420 cboGraduatedColumn->setCurrentIndex( idx >= 0 ? idx : 0 ); 00421 connect( cboGraduatedColumn, SIGNAL( currentIndexChanged( int ) ), this, SLOT( graduatedColumnChanged() ) ); 00422 00423 // set source symbol 00424 if ( mRenderer->sourceSymbol() ) 00425 { 00426 delete mGraduatedSymbol; 00427 mGraduatedSymbol = mRenderer->sourceSymbol()->clone(); 00428 updateGraduatedSymbolIcon(); 00429 } 00430 00431 // set source color ramp 00432 if ( mRenderer->sourceColorRamp() ) 00433 { 00434 cboGraduatedColorRamp->setSourceColorRamp( mRenderer->sourceColorRamp() ); 00435 } 00436 } 00437 00438 void QgsGraduatedSymbolRendererV2Widget::populateColumns() 00439 { 00440 cboGraduatedColumn->clear(); 00441 const QgsFields& flds = mLayer->pendingFields(); 00442 for ( int idx = 0; idx < flds.count(); ++idx ) 00443 { 00444 if ( flds[idx].type() == QVariant::Double || flds[idx].type() == QVariant::Int || flds[idx].type() == QVariant::LongLong ) 00445 cboGraduatedColumn->addItem( flds[idx].name() ); 00446 } 00447 } 00448 00449 void QgsGraduatedSymbolRendererV2Widget::graduatedColumnChanged() 00450 { 00451 mRenderer->setClassAttribute( cboGraduatedColumn->currentText() ); 00452 classifyGraduated(); 00453 } 00454 00455 00456 void QgsGraduatedSymbolRendererV2Widget::classifyGraduated() 00457 { 00458 QString attrName = cboGraduatedColumn->currentText(); 00459 00460 int classes = spinGraduatedClasses->value(); 00461 00462 QgsVectorColorRampV2* ramp = cboGraduatedColorRamp->currentColorRamp(); 00463 00464 if ( ramp == NULL ) 00465 { 00466 if ( cboGraduatedColorRamp->count() == 0 ) 00467 QMessageBox::critical( this, tr( "Error" ), tr( "There are no available color ramps. You can add them in Style Manager." ) ); 00468 else 00469 QMessageBox::critical( this, tr( "Error" ), tr( "The selected color ramp is not available." ) ); 00470 return; 00471 } 00472 00473 QgsGraduatedSymbolRendererV2::Mode mode; 00474 if ( cboGraduatedMode->currentIndex() == 0 ) 00475 mode = QgsGraduatedSymbolRendererV2::EqualInterval; 00476 else if ( cboGraduatedMode->currentIndex() == 2 ) 00477 mode = QgsGraduatedSymbolRendererV2::Jenks; 00478 else if ( cboGraduatedMode->currentIndex() == 3 ) 00479 mode = QgsGraduatedSymbolRendererV2::StdDev; 00480 else if ( cboGraduatedMode->currentIndex() == 4 ) 00481 mode = QgsGraduatedSymbolRendererV2::Pretty; 00482 else // default should be quantile for now 00483 mode = QgsGraduatedSymbolRendererV2::Quantile; 00484 00485 // create and set new renderer 00486 QApplication::setOverrideCursor( Qt::WaitCursor ); 00487 QgsGraduatedSymbolRendererV2* r = QgsGraduatedSymbolRendererV2::createRenderer( 00488 mLayer, attrName, classes, mode, mGraduatedSymbol, ramp ); 00489 QApplication::restoreOverrideCursor(); 00490 if ( !r ) 00491 { 00492 QMessageBox::critical( this, tr( "Error" ), tr( "Renderer creation has failed." ) ); 00493 return; 00494 } 00495 00496 r->setSizeScaleField( mRenderer->sizeScaleField() ); 00497 r->setRotationField( mRenderer->rotationField() ); 00498 r->setScaleMethod( mRenderer->scaleMethod() ); 00499 00500 if ( mModel ) 00501 { 00502 mModel->setRenderer( r ); 00503 } 00504 delete mRenderer; 00505 mRenderer = r; 00506 } 00507 00508 void QgsGraduatedSymbolRendererV2Widget::reapplyColorRamp() 00509 { 00510 QgsVectorColorRampV2* ramp = cboGraduatedColorRamp->currentColorRamp(); 00511 if ( ramp == NULL ) 00512 return; 00513 00514 mRenderer->updateColorRamp( ramp ); 00515 refreshSymbolView(); 00516 } 00517 00518 void QgsGraduatedSymbolRendererV2Widget::changeGraduatedSymbol() 00519 { 00520 // Change the selected symbols alone if anything is selected 00521 QItemSelectionModel* m = viewGraduated->selectionModel(); 00522 QModelIndexList i = m->selectedRows(); 00523 if ( m && i.size() > 0 ) 00524 { 00525 changeSelectedSymbols(); 00526 return; 00527 } 00528 00529 // Otherwise change the base mGraduatedSymbol 00530 QgsSymbolV2* newSymbol = mGraduatedSymbol->clone(); 00531 00532 QgsSymbolV2SelectorDialog dlg( newSymbol, mStyle, mLayer, this ); 00533 if ( !dlg.exec() ) 00534 { 00535 delete newSymbol; 00536 return; 00537 } 00538 00539 mGraduatedSymbol = newSymbol; 00540 00541 updateGraduatedSymbolIcon(); 00542 mRenderer->updateSymbols( mGraduatedSymbol ); 00543 refreshSymbolView(); 00544 } 00545 00546 void QgsGraduatedSymbolRendererV2Widget::updateGraduatedSymbolIcon() 00547 { 00548 QIcon icon = QgsSymbolLayerV2Utils::symbolPreviewIcon( mGraduatedSymbol, btnChangeGraduatedSymbol->iconSize() ); 00549 btnChangeGraduatedSymbol->setIcon( icon ); 00550 } 00551 00552 #if 0 00553 int QgsRendererV2PropertiesDialog::currentRangeRow() 00554 { 00555 QModelIndex idx = viewGraduated->selectionModel()->currentIndex(); 00556 if ( !idx.isValid() ) 00557 return -1; 00558 return idx.row(); 00559 } 00560 #endif 00561 00562 QList<int> QgsGraduatedSymbolRendererV2Widget::selectedClasses() 00563 { 00564 QList<int> rows; 00565 QModelIndexList selectedRows = viewGraduated->selectionModel()->selectedRows(); 00566 00567 foreach ( QModelIndex r, selectedRows ) 00568 { 00569 if ( r.isValid() ) 00570 { 00571 rows.append( r.row() ); 00572 } 00573 } 00574 return rows; 00575 } 00576 00577 void QgsGraduatedSymbolRendererV2Widget::rangesDoubleClicked( const QModelIndex & idx ) 00578 { 00579 if ( idx.isValid() && idx.column() == 0 ) 00580 changeRangeSymbol( idx.row() ); 00581 if ( idx.isValid() && idx.column() == 1 ) 00582 changeRange( idx.row() ); 00583 } 00584 00585 void QgsGraduatedSymbolRendererV2Widget::rangesClicked( const QModelIndex & idx ) 00586 { 00587 if ( !idx.isValid() ) 00588 mRowSelected = -1; 00589 else 00590 mRowSelected = idx.row(); 00591 } 00592 00593 void QgsGraduatedSymbolRendererV2Widget::changeSelectedSymbols() 00594 { 00595 QItemSelectionModel* m = viewGraduated->selectionModel(); 00596 QModelIndexList selectedIndexes = m->selectedRows( 1 ); 00597 if ( m && selectedIndexes.size() > 0 ) 00598 { 00599 QgsSymbolV2* newSymbol = mGraduatedSymbol->clone(); 00600 QgsSymbolV2SelectorDialog dlg( newSymbol, mStyle, mLayer, this ); 00601 if ( !dlg.exec() ) 00602 { 00603 delete newSymbol; 00604 return; 00605 } 00606 00607 foreach ( QModelIndex idx, selectedIndexes ) 00608 { 00609 if ( idx.isValid() ) 00610 { 00611 int rangeIdx = idx.row(); 00612 QgsSymbolV2* newRangeSymbol = newSymbol->clone(); 00613 newRangeSymbol->setColor( mRenderer->ranges()[rangeIdx].symbol()->color() ); 00614 mRenderer->updateRangeSymbol( rangeIdx, newRangeSymbol ); 00615 } 00616 } 00617 } 00618 refreshSymbolView(); 00619 } 00620 00621 void QgsGraduatedSymbolRendererV2Widget::changeRangeSymbol( int rangeIdx ) 00622 { 00623 QgsSymbolV2* newSymbol = mRenderer->ranges()[rangeIdx].symbol()->clone(); 00624 00625 QgsSymbolV2SelectorDialog dlg( newSymbol, mStyle, mLayer, this ); 00626 if ( !dlg.exec() ) 00627 { 00628 delete newSymbol; 00629 return; 00630 } 00631 00632 mRenderer->updateRangeSymbol( rangeIdx, newSymbol ); 00633 } 00634 00635 void QgsGraduatedSymbolRendererV2Widget::changeRange( int rangeIdx ) 00636 { 00637 QgsLUDialog dialog( this ); 00638 00639 const QgsRendererRangeV2& range = mRenderer->ranges()[rangeIdx]; 00640 dialog.setLowerValue( QString::number( range.lowerValue(), 'f', 4 ) ); 00641 dialog.setUpperValue( QString::number( range.upperValue(), 'f', 4 ) ); 00642 00643 if ( dialog.exec() == QDialog::Accepted ) 00644 { 00645 double lowerValue = dialog.lowerValue().toDouble(); 00646 double upperValue = dialog.upperValue().toDouble(); 00647 mRenderer->updateRangeUpperValue( rangeIdx, upperValue ); 00648 mRenderer->updateRangeLowerValue( rangeIdx, lowerValue ); 00649 } 00650 } 00651 00652 void QgsGraduatedSymbolRendererV2Widget::addClass() 00653 { 00654 mModel->addClass( mGraduatedSymbol ); 00655 } 00656 00657 void QgsGraduatedSymbolRendererV2Widget::deleteClasses() 00658 { 00659 QList<int> classIndexes = selectedClasses(); 00660 mModel->deleteRows( classIndexes ); 00661 } 00662 00663 void QgsGraduatedSymbolRendererV2Widget::deleteAllClasses() 00664 { 00665 mModel->removeAllRows(); 00666 } 00667 00668 void QgsGraduatedSymbolRendererV2Widget::changeCurrentValue( QStandardItem * item ) 00669 { 00670 if ( item->column() == 2 ) 00671 { 00672 QString label = item->text(); 00673 int idx = item->row(); 00674 mRenderer->updateRangeLabel( idx, label ); 00675 } 00676 } 00677 00678 void QgsGraduatedSymbolRendererV2Widget::rotationFieldChanged( QString fldName ) 00679 { 00680 mRenderer->setRotationField( fldName ); 00681 } 00682 00683 void QgsGraduatedSymbolRendererV2Widget::sizeScaleFieldChanged( QString fldName ) 00684 { 00685 mRenderer->setSizeScaleField( fldName ); 00686 } 00687 00688 void QgsGraduatedSymbolRendererV2Widget::scaleMethodChanged( QgsSymbolV2::ScaleMethod scaleMethod ) 00689 { 00690 mRenderer->setScaleMethod( scaleMethod ); 00691 } 00692 00693 QList<QgsSymbolV2*> QgsGraduatedSymbolRendererV2Widget::selectedSymbols() 00694 { 00695 QList<QgsSymbolV2*> selectedSymbols; 00696 00697 QItemSelectionModel* m = viewGraduated->selectionModel(); 00698 QModelIndexList selectedIndexes = m->selectedRows( 1 ); 00699 if ( m && selectedIndexes.size() > 0 ) 00700 { 00701 const QgsRangeList& ranges = mRenderer->ranges(); 00702 QModelIndexList::const_iterator indexIt = selectedIndexes.constBegin(); 00703 for ( ; indexIt != selectedIndexes.constEnd(); ++indexIt ) 00704 { 00705 QStringList list = m->model()->data( *indexIt ).toString().split( " " ); 00706 if ( list.size() < 3 ) 00707 { 00708 continue; 00709 } 00710 00711 double lowerBound = list.at( 0 ).toDouble(); 00712 double upperBound = list.at( 2 ).toDouble(); 00713 QgsSymbolV2* s = findSymbolForRange( lowerBound, upperBound, ranges ); 00714 if ( s ) 00715 { 00716 selectedSymbols.append( s ); 00717 } 00718 } 00719 } 00720 return selectedSymbols; 00721 } 00722 00723 QgsSymbolV2* QgsGraduatedSymbolRendererV2Widget::findSymbolForRange( double lowerBound, double upperBound, const QgsRangeList& ranges ) const 00724 { 00725 for ( QgsRangeList::const_iterator it = ranges.begin(); it != ranges.end(); ++it ) 00726 { 00727 //range string has been created with option 'f',4 00728 if ( qgsDoubleNear( lowerBound, it->lowerValue(), 0.0001 ) && qgsDoubleNear( upperBound, it->upperValue(), 0.0001 ) ) 00729 { 00730 return it->symbol(); 00731 } 00732 } 00733 return 0; 00734 } 00735 00736 void QgsGraduatedSymbolRendererV2Widget::refreshSymbolView() 00737 { 00738 } 00739 00740 void QgsGraduatedSymbolRendererV2Widget::showSymbolLevels() 00741 { 00742 showSymbolLevelsDialog( mRenderer ); 00743 } 00744 00745 void QgsGraduatedSymbolRendererV2Widget::rowsMoved() 00746 { 00747 viewGraduated->selectionModel()->clear(); 00748 }