QGIS API Documentation  master-6227475
src/gui/symbology-ng/qgssymbollevelsv2dialog.cpp
Go to the documentation of this file.
00001 /***************************************************************************
00002     qgssymbollevelsv2dialog.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 
00016 #include "qgssymbollevelsv2dialog.h"
00017 
00018 #include "qgssymbollayerv2utils.h"
00019 #include "qgssymbollayerv2.h"
00020 #include "qgssymbolv2.h"
00021 
00022 #include <QTableWidgetItem>
00023 #include <QItemDelegate>
00024 #include <QSpinBox>
00025 
00026 // delegate used from Qt Spin Box example
00027 class SpinBoxDelegate : public QItemDelegate
00028 {
00029   public:
00030     SpinBoxDelegate( QObject *parent = 0 ) : QItemDelegate( parent ) {}
00031 
00032     QWidget *createEditor( QWidget *parent, const QStyleOptionViewItem & /*option*/, const QModelIndex &/*index*/ ) const
00033     {
00034       QSpinBox *editor = new QSpinBox( parent );
00035       editor->setMinimum( 0 );
00036       editor->setMaximum( 999 );
00037       return editor;
00038     }
00039 
00040     void setEditorData( QWidget *editor, const QModelIndex &index ) const
00041     {
00042       int value = index.model()->data( index, Qt::EditRole ).toInt();
00043       QSpinBox *spinBox = static_cast<QSpinBox*>( editor );
00044       spinBox->setValue( value );
00045     }
00046 
00047     void setModelData( QWidget *editor, QAbstractItemModel *model, const QModelIndex &index ) const
00048     {
00049       QSpinBox *spinBox = static_cast<QSpinBox*>( editor );
00050       spinBox->interpretText();
00051       int value = spinBox->value();
00052 
00053       model->setData( index, value, Qt::EditRole );
00054     }
00055 
00056     void updateEditorGeometry( QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex & /*index*/ ) const
00057     {
00058       editor->setGeometry( option.rect );
00059     }
00060 
00061 };
00062 
00064 
00065 QgsSymbolLevelsV2Dialog::QgsSymbolLevelsV2Dialog( QgsLegendSymbolList list, bool usingSymbolLevels, QWidget* parent )
00066     : QDialog( parent ), mList( list ), mForceOrderingEnabled( false )
00067 {
00068   setupUi( this );
00069 
00070   tableLevels->setItemDelegate( new SpinBoxDelegate( this ) );
00071 
00072   chkEnable->setChecked( usingSymbolLevels );
00073 
00074   connect( chkEnable, SIGNAL( clicked() ), this, SLOT( updateUi() ) );
00075 
00076   if ( mList.count() > 0 && !mList[0].second )
00077   {
00078     // remove symbolless entry (probably classifier of categorized renderer)
00079     mList.removeFirst();
00080   }
00081 
00082   int maxLayers = 0;
00083   tableLevels->setRowCount( mList.count() );
00084   for ( int i = 0; i < mList.count(); i++ )
00085   {
00086     QgsSymbolV2* sym = mList[i].second;
00087     QString label = mList[i].first;
00088 
00089     // set icons for the rows
00090     QIcon icon = QgsSymbolLayerV2Utils::symbolPreviewIcon( sym, QSize( 16, 16 ) );
00091     tableLevels->setVerticalHeaderItem( i, new QTableWidgetItem( icon, label ) );
00092 
00093     // find out max. number of layers per symbol
00094     int layers = sym->symbolLayerCount();
00095     if ( layers > maxLayers )
00096       maxLayers = layers;
00097   }
00098 
00099   tableLevels->setColumnCount( maxLayers );
00100   for ( int i = 0; i < maxLayers; i++ )
00101   {
00102     QString name = tr( "Layer %1" ).arg( i );
00103     tableLevels->setHorizontalHeaderItem( i, new QTableWidgetItem( name ) );
00104   }
00105 
00106   mMaxLayers = maxLayers;
00107 
00108   updateUi();
00109 
00110   if ( !usingSymbolLevels )
00111     setDefaultLevels();
00112 
00113   populateTable();
00114 
00115   connect( tableLevels, SIGNAL( cellChanged( int, int ) ), this, SLOT( renderingPassChanged( int, int ) ) );
00116 }
00117 
00118 void QgsSymbolLevelsV2Dialog::populateTable()
00119 {
00120   for ( int row = 0; row < mList.count(); row++ )
00121   {
00122     QgsSymbolV2* sym = mList[row].second;
00123     for ( int layer = 0; layer < mMaxLayers; layer++ )
00124     {
00125       QTableWidgetItem* item;
00126       if ( layer >= sym->symbolLayerCount() )
00127       {
00128         item = new QTableWidgetItem();
00129         item->setFlags( Qt::ItemFlags() );
00130       }
00131       else
00132       {
00133         QgsSymbolLayerV2* sl = sym->symbolLayer( layer );
00134         QIcon icon = QgsSymbolLayerV2Utils::symbolLayerPreviewIcon( sl, QgsSymbolV2::MM, QSize( 16, 16 ) );
00135         item = new QTableWidgetItem( icon, QString::number( sl->renderingPass() ) );
00136       }
00137       tableLevels->setItem( row, layer, item );
00138     }
00139   }
00140 
00141 }
00142 
00143 void QgsSymbolLevelsV2Dialog::updateUi()
00144 {
00145   tableLevels->setEnabled( chkEnable->isChecked() );
00146 }
00147 
00148 void QgsSymbolLevelsV2Dialog::setDefaultLevels()
00149 {
00150   for ( int i = 0; i < mList.count(); i++ )
00151   {
00152     QgsSymbolV2* sym = mList[i].second;
00153     for ( int layer = 0; layer < sym->symbolLayerCount(); layer++ )
00154     {
00155       sym->symbolLayer( layer )->setRenderingPass( layer );
00156     }
00157   }
00158 }
00159 
00160 
00161 bool QgsSymbolLevelsV2Dialog::usingLevels() const
00162 {
00163   return chkEnable->isChecked();
00164 }
00165 
00166 void QgsSymbolLevelsV2Dialog::renderingPassChanged( int row, int column )
00167 {
00168   if ( row < 0 || row >= mList.count() )
00169     return;
00170   QgsSymbolV2* sym = mList[row].second;
00171   if ( column < 0 || column >= sym->symbolLayerCount() )
00172     return;
00173   sym->symbolLayer( column )->setRenderingPass( tableLevels->item( row, column )->text().toInt() );
00174 }
00175 
00176 void QgsSymbolLevelsV2Dialog::setForceOrderingEnabled( bool enabled )
00177 {
00178   mForceOrderingEnabled = enabled;
00179   if ( enabled )
00180   {
00181     chkEnable->setChecked( true );
00182     chkEnable->hide();
00183   }
00184   else
00185     chkEnable->show();
00186 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines