Skip to content

Commit e70a40a

Browse files
author
mhugent
committedOct 6, 2009
Field calculator: read available types from the provider (similar to QgsAddAttrDialog)
git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@11758 c8812cc2-4d05-0410-92ff-de0c093fc19c

File tree

2 files changed

+57
-30
lines changed

2 files changed

+57
-30
lines changed
 

‎src/app/qgsfieldcalculator.cpp

Lines changed: 53 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,16 @@
1616
#include "qgsfieldcalculator.h"
1717
#include "qgssearchtreenode.h"
1818
#include "qgssearchstring.h"
19+
#include "qgsvectordataprovider.h"
1920
#include "qgsvectorlayer.h"
2021
#include <QMessageBox>
2122

2223
QgsFieldCalculator::QgsFieldCalculator( QgsVectorLayer* vl ): QDialog(), mVectorLayer( vl )
2324
{
2425
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" );
2826

2927
populateFields();
28+
populateOutputFieldTypes();
3029

3130
//default values for field width and precision
3231
mOuputFieldWidthSpinBox->setValue( 10 );
@@ -82,23 +81,11 @@ void QgsFieldCalculator::accept()
8281
else
8382
{
8483
//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() );
10289

10390
if ( !mVectorLayer->addAttribute( newField ) )
10491
{
@@ -200,6 +187,36 @@ void QgsFieldCalculator::populateFields()
200187
}
201188
}
202189

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+
203220
void QgsFieldCalculator::on_mUpdateExistingFieldCheckBox_stateChanged( int state )
204221
{
205222
if ( state == Qt::Checked )
@@ -321,16 +338,23 @@ void QgsFieldCalculator::on_mExpressionTextEdit_textChanged()
321338
setOkButtonState();
322339
}
323340

324-
void QgsFieldCalculator::on_mOutputFieldTypeComboBox_currentIndexChanged( const QString& text )
341+
void QgsFieldCalculator::on_mOutputFieldTypeComboBox_activated( int index )
325342
{
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() );
334358
}
335359

336360
void QgsFieldCalculator::getFieldValues( int limit )

‎src/app/qgsfieldcalculator.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,15 @@ class QgsFieldCalculator: public QDialog, private Ui::QgsFieldCalculatorBase
5252
void on_mAllPushButton_clicked();
5353
void on_mOutputFieldNameLineEdit_textChanged( const QString& text );
5454
void on_mExpressionTextEdit_textChanged();
55-
void on_mOutputFieldTypeComboBox_currentIndexChanged( const QString& text );
55+
void on_mOutputFieldTypeComboBox_activated( int index );
5656

5757
private:
5858
//default constructor forbidden
5959
QgsFieldCalculator();
60+
/**Inserts existing fields into the combo box*/
6061
void populateFields();
62+
/**Inserts the types supported by the provider into the combo box*/
63+
void populateOutputFieldTypes();
6164
/**Gets field values and inserts them into mValueListWidget
6265
@limit 0: get all feature, != 0 stop after getting limit values*/
6366
void getFieldValues( int limit );

0 commit comments

Comments
 (0)
Please sign in to comment.