|
16 | 16 | #include "qgsfieldcalculator.h"
|
17 | 17 | #include "qgssearchtreenode.h"
|
18 | 18 | #include "qgssearchstring.h"
|
| 19 | +#include "qgsvectordataprovider.h" |
19 | 20 | #include "qgsvectorlayer.h"
|
20 | 21 | #include <QMessageBox>
|
21 | 22 |
|
22 | 23 | QgsFieldCalculator::QgsFieldCalculator( QgsVectorLayer* vl ): QDialog(), mVectorLayer( vl )
|
23 | 24 | {
|
24 | 25 | setupUi( this );
|
25 |
| - mOutputFieldTypeComboBox->addItem( tr( "Whole number (integer)" ), "Integer" ); |
26 |
| - mOutputFieldTypeComboBox->addItem( tr( "Decimal number (double)" ), "Double" ); |
27 |
| - mOutputFieldTypeComboBox->addItem( tr( "Text (string)" ), "String" ); |
28 | 26 |
|
29 | 27 | populateFields();
|
| 28 | + populateOutputFieldTypes(); |
30 | 29 |
|
31 | 30 | //default values for field width and precision
|
32 | 31 | mOuputFieldWidthSpinBox->setValue( 10 );
|
@@ -82,23 +81,11 @@ void QgsFieldCalculator::accept()
|
82 | 81 | else
|
83 | 82 | {
|
84 | 83 | //create new field
|
85 |
| - QgsField newField( mOutputFieldNameLineEdit->text() ); |
86 |
| - int index = mOutputFieldTypeComboBox->currentIndex(); |
87 |
| - if ( mOutputFieldTypeComboBox->itemData( index, Qt::UserRole ) == "Double" ) |
88 |
| - { |
89 |
| - newField.setType( QVariant::Double ); |
90 |
| - } |
91 |
| - else if ( mOutputFieldTypeComboBox->itemData( index, Qt::UserRole ) == "Integer" ) |
92 |
| - { |
93 |
| - newField.setType( QVariant::Int ); |
94 |
| - } |
95 |
| - else if ( mOutputFieldTypeComboBox->itemData( index, Qt::UserRole ) == "String" ) |
96 |
| - { |
97 |
| - newField.setType( QVariant::String ); |
98 |
| - } |
99 |
| - |
100 |
| - newField.setLength( mOuputFieldWidthSpinBox->value() ); |
101 |
| - newField.setPrecision( mOutputFieldPrecisionSpinBox->value() ); |
| 84 | + QgsField newField( mOutputFieldNameLineEdit->text(), |
| 85 | + ( QVariant::Type ) mOutputFieldTypeComboBox->itemData( mOutputFieldTypeComboBox->currentIndex(), Qt::UserRole ).toInt(), |
| 86 | + mOutputFieldTypeComboBox->itemData( mOutputFieldTypeComboBox->currentIndex(), Qt::UserRole + 1 ).toString(), |
| 87 | + mOuputFieldWidthSpinBox->value(), |
| 88 | + mOutputFieldPrecisionSpinBox->value() ); |
102 | 89 |
|
103 | 90 | if ( !mVectorLayer->addAttribute( newField ) )
|
104 | 91 | {
|
@@ -200,6 +187,36 @@ void QgsFieldCalculator::populateFields()
|
200 | 187 | }
|
201 | 188 | }
|
202 | 189 |
|
| 190 | +void QgsFieldCalculator::populateOutputFieldTypes() |
| 191 | +{ |
| 192 | + if ( !mVectorLayer ) |
| 193 | + { |
| 194 | + return; |
| 195 | + } |
| 196 | + |
| 197 | + QgsVectorDataProvider* provider = mVectorLayer->dataProvider(); |
| 198 | + if ( !provider ) |
| 199 | + { |
| 200 | + return; |
| 201 | + } |
| 202 | + |
| 203 | + mOutputFieldTypeComboBox->blockSignals( true ); |
| 204 | + const QList< QgsVectorDataProvider::NativeType > &typelist = provider->nativeTypes(); |
| 205 | + for ( int i = 0; i < typelist.size(); i++ ) |
| 206 | + { |
| 207 | + mOutputFieldTypeComboBox->addItem( typelist[i].mTypeDesc ); |
| 208 | + mOutputFieldTypeComboBox->setItemData( i, static_cast<int>( typelist[i].mType ), Qt::UserRole ); |
| 209 | + mOutputFieldTypeComboBox->setItemData( i, typelist[i].mTypeName, Qt::UserRole + 1 ); |
| 210 | + mOutputFieldTypeComboBox->setItemData( i, typelist[i].mMinLen, Qt::UserRole + 2 ); |
| 211 | + mOutputFieldTypeComboBox->setItemData( i, typelist[i].mMaxLen, Qt::UserRole + 3 ); |
| 212 | + mOutputFieldTypeComboBox->setItemData( i, typelist[i].mMinPrec, Qt::UserRole + 4 ); |
| 213 | + mOutputFieldTypeComboBox->setItemData( i, typelist[i].mMaxPrec, Qt::UserRole + 5 ); |
| 214 | + } |
| 215 | + mOutputFieldTypeComboBox->blockSignals( false ); |
| 216 | + mOutputFieldTypeComboBox->setCurrentIndex( 0 ); |
| 217 | + on_mOutputFieldTypeComboBox_activated( 0 ); |
| 218 | +} |
| 219 | + |
203 | 220 | void QgsFieldCalculator::on_mUpdateExistingFieldCheckBox_stateChanged( int state )
|
204 | 221 | {
|
205 | 222 | if ( state == Qt::Checked )
|
@@ -321,16 +338,23 @@ void QgsFieldCalculator::on_mExpressionTextEdit_textChanged()
|
321 | 338 | setOkButtonState();
|
322 | 339 | }
|
323 | 340 |
|
324 |
| -void QgsFieldCalculator::on_mOutputFieldTypeComboBox_currentIndexChanged( const QString& text ) |
| 341 | +void QgsFieldCalculator::on_mOutputFieldTypeComboBox_activated( int index ) |
325 | 342 | {
|
326 |
| - if ( text == tr( "Double" ) ) |
327 |
| - { |
328 |
| - mOutputFieldPrecisionSpinBox->setEnabled( true ); |
329 |
| - } |
330 |
| - else |
331 |
| - { |
332 |
| - mOutputFieldPrecisionSpinBox->setEnabled( false ); |
333 |
| - } |
| 343 | + mOuputFieldWidthSpinBox->setMinimum( mOutputFieldTypeComboBox->itemData( index, Qt::UserRole + 2 ).toInt() ); |
| 344 | + mOuputFieldWidthSpinBox->setMaximum( mOutputFieldTypeComboBox->itemData( index, Qt::UserRole + 3 ).toInt() ); |
| 345 | + mOuputFieldWidthSpinBox->setEnabled( mOuputFieldWidthSpinBox->minimum() < mOuputFieldWidthSpinBox->maximum() ); |
| 346 | + if ( mOuputFieldWidthSpinBox->value() < mOuputFieldWidthSpinBox->minimum() ) |
| 347 | + mOuputFieldWidthSpinBox->setValue( mOuputFieldWidthSpinBox->minimum() ); |
| 348 | + if ( mOuputFieldWidthSpinBox->value() > mOuputFieldWidthSpinBox->maximum() ) |
| 349 | + mOuputFieldWidthSpinBox->setValue( mOuputFieldWidthSpinBox->maximum() ); |
| 350 | + |
| 351 | + mOutputFieldPrecisionSpinBox->setMinimum( mOutputFieldTypeComboBox->itemData( index, Qt::UserRole + 4 ).toInt() ); |
| 352 | + mOutputFieldPrecisionSpinBox->setMaximum( mOutputFieldTypeComboBox->itemData( index, Qt::UserRole + 5 ).toInt() ); |
| 353 | + mOutputFieldPrecisionSpinBox->setEnabled( mOutputFieldPrecisionSpinBox->minimum() < mOutputFieldPrecisionSpinBox->maximum() ); |
| 354 | + if ( mOutputFieldPrecisionSpinBox->value() < mOutputFieldPrecisionSpinBox->minimum() ) |
| 355 | + mOutputFieldPrecisionSpinBox->setValue( mOutputFieldPrecisionSpinBox->minimum() ); |
| 356 | + if ( mOutputFieldPrecisionSpinBox->value() > mOutputFieldPrecisionSpinBox->maximum() ) |
| 357 | + mOutputFieldPrecisionSpinBox->setValue( mOutputFieldPrecisionSpinBox->maximum() ); |
334 | 358 | }
|
335 | 359 |
|
336 | 360 | void QgsFieldCalculator::getFieldValues( int limit )
|
|
0 commit comments