|
QGIS API Documentation
master-6227475
|
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 }