[QGIS Commit] r11758 - trunk/qgis/src/app

svn_qgis at osgeo.org svn_qgis at osgeo.org
Tue Oct 6 13:49:36 EDT 2009


Author: mhugent
Date: 2009-10-06 13:49:35 -0400 (Tue, 06 Oct 2009)
New Revision: 11758

Modified:
   trunk/qgis/src/app/qgsfieldcalculator.cpp
   trunk/qgis/src/app/qgsfieldcalculator.h
Log:
Field calculator: read available types from the provider (similar to QgsAddAttrDialog)

Modified: trunk/qgis/src/app/qgsfieldcalculator.cpp
===================================================================
--- trunk/qgis/src/app/qgsfieldcalculator.cpp	2009-10-05 13:34:10 UTC (rev 11757)
+++ trunk/qgis/src/app/qgsfieldcalculator.cpp	2009-10-06 17:49:35 UTC (rev 11758)
@@ -16,17 +16,16 @@
 #include "qgsfieldcalculator.h"
 #include "qgssearchtreenode.h"
 #include "qgssearchstring.h"
+#include "qgsvectordataprovider.h"
 #include "qgsvectorlayer.h"
 #include <QMessageBox>
 
 QgsFieldCalculator::QgsFieldCalculator( QgsVectorLayer* vl ): QDialog(), mVectorLayer( vl )
 {
   setupUi( this );
-  mOutputFieldTypeComboBox->addItem( tr( "Whole number (integer)" ), "Integer" );
-  mOutputFieldTypeComboBox->addItem( tr( "Decimal number (double)" ), "Double" );
-  mOutputFieldTypeComboBox->addItem( tr( "Text (string)" ), "String" );
 
   populateFields();
+  populateOutputFieldTypes();
 
   //default values for field width and precision
   mOuputFieldWidthSpinBox->setValue( 10 );
@@ -82,24 +81,12 @@
     else
     {
       //create new field
-      QgsField newField( mOutputFieldNameLineEdit->text() );
-      int index = mOutputFieldTypeComboBox->currentIndex();
-      if ( mOutputFieldTypeComboBox->itemData( index, Qt::UserRole ) ==  "Double" )
-      {
-        newField.setType( QVariant::Double );
-      }
-      else if ( mOutputFieldTypeComboBox->itemData( index, Qt::UserRole ) == "Integer"  )
-      {
-        newField.setType( QVariant::Int );
-      }
-      else if ( mOutputFieldTypeComboBox->itemData( index, Qt::UserRole ) == "String"  )
-      {
-        newField.setType( QVariant::String );
-      }
+      QgsField newField( mOutputFieldNameLineEdit->text(),
+                         ( QVariant::Type ) mOutputFieldTypeComboBox->itemData( mOutputFieldTypeComboBox->currentIndex(), Qt::UserRole ).toInt(),
+                         mOutputFieldTypeComboBox->itemData( mOutputFieldTypeComboBox->currentIndex(), Qt::UserRole + 1 ).toString(),
+                         mOuputFieldWidthSpinBox->value(),
+                         mOutputFieldPrecisionSpinBox->value() );
 
-      newField.setLength( mOuputFieldWidthSpinBox->value() );
-      newField.setPrecision( mOutputFieldPrecisionSpinBox->value() );
-
       if ( !mVectorLayer->addAttribute( newField ) )
       {
         QMessageBox::critical( 0, tr( "Provider error" ), tr( "Could not add the new field to the provider." ) );
@@ -200,6 +187,36 @@
   }
 }
 
+void QgsFieldCalculator::populateOutputFieldTypes()
+{
+  if ( !mVectorLayer )
+  {
+    return;
+  }
+
+  QgsVectorDataProvider* provider = mVectorLayer->dataProvider();
+  if ( !provider )
+  {
+    return;
+  }
+
+  mOutputFieldTypeComboBox->blockSignals( true );
+  const QList< QgsVectorDataProvider::NativeType > &typelist = provider->nativeTypes();
+  for ( int i = 0; i < typelist.size(); i++ )
+  {
+    mOutputFieldTypeComboBox->addItem( typelist[i].mTypeDesc );
+    mOutputFieldTypeComboBox->setItemData( i, static_cast<int>( typelist[i].mType ), Qt::UserRole );
+    mOutputFieldTypeComboBox->setItemData( i, typelist[i].mTypeName, Qt::UserRole + 1 );
+    mOutputFieldTypeComboBox->setItemData( i, typelist[i].mMinLen, Qt::UserRole + 2 );
+    mOutputFieldTypeComboBox->setItemData( i, typelist[i].mMaxLen, Qt::UserRole + 3 );
+    mOutputFieldTypeComboBox->setItemData( i, typelist[i].mMinPrec, Qt::UserRole + 4 );
+    mOutputFieldTypeComboBox->setItemData( i, typelist[i].mMaxPrec, Qt::UserRole + 5 );
+  }
+  mOutputFieldTypeComboBox->blockSignals( false );
+  mOutputFieldTypeComboBox->setCurrentIndex( 0 );
+  on_mOutputFieldTypeComboBox_activated( 0 );
+}
+
 void QgsFieldCalculator::on_mUpdateExistingFieldCheckBox_stateChanged( int state )
 {
   if ( state == Qt::Checked )
@@ -321,16 +338,23 @@
   setOkButtonState();
 }
 
-void QgsFieldCalculator::on_mOutputFieldTypeComboBox_currentIndexChanged( const QString& text )
+void QgsFieldCalculator::on_mOutputFieldTypeComboBox_activated( int index )
 {
-  if ( text == tr( "Double" ) )
-  {
-    mOutputFieldPrecisionSpinBox->setEnabled( true );
-  }
-  else
-  {
-    mOutputFieldPrecisionSpinBox->setEnabled( false );
-  }
+  mOuputFieldWidthSpinBox->setMinimum( mOutputFieldTypeComboBox->itemData( index, Qt::UserRole + 2 ).toInt() );
+  mOuputFieldWidthSpinBox->setMaximum( mOutputFieldTypeComboBox->itemData( index, Qt::UserRole + 3 ).toInt() );
+  mOuputFieldWidthSpinBox->setEnabled( mOuputFieldWidthSpinBox->minimum() < mOuputFieldWidthSpinBox->maximum() );
+  if ( mOuputFieldWidthSpinBox->value() < mOuputFieldWidthSpinBox->minimum() )
+    mOuputFieldWidthSpinBox->setValue( mOuputFieldWidthSpinBox->minimum() );
+  if ( mOuputFieldWidthSpinBox->value() > mOuputFieldWidthSpinBox->maximum() )
+    mOuputFieldWidthSpinBox->setValue( mOuputFieldWidthSpinBox->maximum() );
+
+  mOutputFieldPrecisionSpinBox->setMinimum( mOutputFieldTypeComboBox->itemData( index, Qt::UserRole + 4 ).toInt() );
+  mOutputFieldPrecisionSpinBox->setMaximum( mOutputFieldTypeComboBox->itemData( index, Qt::UserRole + 5 ).toInt() );
+  mOutputFieldPrecisionSpinBox->setEnabled( mOutputFieldPrecisionSpinBox->minimum() < mOutputFieldPrecisionSpinBox->maximum() );
+  if ( mOutputFieldPrecisionSpinBox->value() < mOutputFieldPrecisionSpinBox->minimum() )
+    mOutputFieldPrecisionSpinBox->setValue( mOutputFieldPrecisionSpinBox->minimum() );
+  if ( mOutputFieldPrecisionSpinBox->value() > mOutputFieldPrecisionSpinBox->maximum() )
+    mOutputFieldPrecisionSpinBox->setValue( mOutputFieldPrecisionSpinBox->maximum() );
 }
 
 void QgsFieldCalculator::getFieldValues( int limit )

Modified: trunk/qgis/src/app/qgsfieldcalculator.h
===================================================================
--- trunk/qgis/src/app/qgsfieldcalculator.h	2009-10-05 13:34:10 UTC (rev 11757)
+++ trunk/qgis/src/app/qgsfieldcalculator.h	2009-10-06 17:49:35 UTC (rev 11758)
@@ -52,12 +52,15 @@
     void on_mAllPushButton_clicked();
     void on_mOutputFieldNameLineEdit_textChanged( const QString& text );
     void on_mExpressionTextEdit_textChanged();
-    void on_mOutputFieldTypeComboBox_currentIndexChanged( const QString& text );
+    void on_mOutputFieldTypeComboBox_activated( int index );
 
   private:
     //default constructor forbidden
     QgsFieldCalculator();
+    /**Inserts existing fields into the combo box*/
     void populateFields();
+    /**Inserts the types supported by the provider into the combo box*/
+    void populateOutputFieldTypes();
     /**Gets field values and inserts them into mValueListWidget
     @limit 0: get all feature, != 0 stop after getting limit values*/
     void getFieldValues( int limit );



More information about the QGIS-commit mailing list