QGIS API Documentation  master-59fd5e0
src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.cpp
Go to the documentation of this file.
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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines