Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
add support to set fields to NULL in field calculator and fix followi…
…ng update of attribute table

git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@15179 c8812cc2-4d05-0410-92ff-de0c093fc19c
  • Loading branch information
jef committed Feb 16, 2011
1 parent ba79e61 commit 1162bce
Show file tree
Hide file tree
Showing 6 changed files with 45 additions and 16 deletions.
14 changes: 12 additions & 2 deletions src/app/attributetable/qgsattributetabledialog.cpp
Expand Up @@ -674,7 +674,7 @@ void QgsAttributeTableDialog::on_mAdvancedSearchButton_clicked()
QgsSearchQueryBuilder dlg( mLayer, this );
dlg.setSearchString( mQuery->displayText() );

if ( dlg.exec() )
if ( dlg.exec() == QDialog::Accepted )
doSearch( dlg.searchString() );
}

Expand Down Expand Up @@ -796,9 +796,19 @@ void QgsAttributeTableDialog::on_mRemoveAttribute_clicked()
void QgsAttributeTableDialog::on_mOpenFieldCalculator_clicked()
{
QgsFieldCalculator calc( mLayer );
calc.exec();
if ( calc.exec() == QDialog::Accepted )
{
int col = mModel->fieldCol( calc.changedAttributeId() );

if ( col >= 0 )
{
mModel->reload( mModel->index( 0, col ),
mModel->index( mModel->rowCount(), col ) );
}
}
}


void QgsAttributeTableDialog::addFeature()
{
if ( !mLayer->isEditable() )
Expand Down
7 changes: 6 additions & 1 deletion src/app/attributetable/qgsattributetablemodel.cpp
Expand Up @@ -149,7 +149,7 @@ void QgsAttributeTableModel::layerDeleted()

void QgsAttributeTableModel::attributeValueChanged( int fid, int idx, const QVariant &value )
{
setData( index( idToRow( fid ), mAttributes.indexOf( idx ) ), value, Qt::EditRole );
setData( index( idToRow( fid ), fieldCol( idx ) ), value, Qt::EditRole );
}

void QgsAttributeTableModel::loadAttributes()
Expand Down Expand Up @@ -297,6 +297,11 @@ int QgsAttributeTableModel::fieldIdx( int col ) const
return mAttributes[ col ];
}

int QgsAttributeTableModel::fieldCol( int idx ) const
{
return mAttributes.indexOf( idx );
}

int QgsAttributeTableModel::rowCount( const QModelIndex &parent ) const
{
return mRowIdMap.size();
Expand Down
4 changes: 4 additions & 0 deletions src/app/attributetable/qgsattributetablemodel.h
Expand Up @@ -106,6 +106,10 @@ class QgsAttributeTableModel: public QAbstractTableModel
* get field index from column
*/
int fieldIdx( int col ) const;
/**
* get column from field index
*/
int fieldCol( int idx ) const;
/**
* Maps row to feature id
* @param row row number
Expand Down
28 changes: 16 additions & 12 deletions src/app/qgsfieldcalculator.cpp
Expand Up @@ -20,7 +20,10 @@
#include "qgsvectorlayer.h"
#include <QMessageBox>

QgsFieldCalculator::QgsFieldCalculator( QgsVectorLayer* vl ): QDialog(), mVectorLayer( vl )
QgsFieldCalculator::QgsFieldCalculator( QgsVectorLayer* vl )
: QDialog()
, mVectorLayer( vl )
, mAttributeId( -1 )
{
setupUi( this );

Expand Down Expand Up @@ -92,15 +95,13 @@ void QgsFieldCalculator::accept()

mVectorLayer->beginEditCommand( "Field calculator" );

int attributeId = -1; //id of the field (can be existing field or newly created one

//update existing field
if ( mUpdateExistingFieldCheckBox->checkState() == Qt::Checked )
{
QMap<QString, int>::const_iterator fieldIt = mFieldMap.find( mExistingFieldComboBox->currentText() );
if ( fieldIt != mFieldMap.end() )
{
attributeId = fieldIt.value();
mAttributeId = fieldIt.value();
}
}
//create new field
Expand Down Expand Up @@ -128,14 +129,13 @@ void QgsFieldCalculator::accept()
{
if ( it.value().name() == mOutputFieldNameLineEdit->text() )
{
attributeId = it.key();
mAttributeId = it.key();
break;
}
}
}


if ( attributeId == -1 )
if ( mAttributeId == -1 )
{
mVectorLayer->destroyEditCommand();
return;
Expand Down Expand Up @@ -172,9 +172,9 @@ void QgsFieldCalculator::accept()
if ( value.isError() )
{
//insert NULL value for this feature and continue the calculation
if( searchTree->errorMsg() == QObject::tr( "Division by zero." ) )
if ( searchTree->errorMsg() == QObject::tr( "Division by zero." ) )
{
mVectorLayer->changeAttributeValue( feature.id(), attributeId, QVariant(), false );
mVectorLayer->changeAttributeValue( feature.id(), mAttributeId, QVariant(), false );
}
else
{
Expand All @@ -184,11 +184,15 @@ void QgsFieldCalculator::accept()
}
else if ( value.isNumeric() )
{
mVectorLayer->changeAttributeValue( feature.id(), attributeId, value.number(), false );
mVectorLayer->changeAttributeValue( feature.id(), mAttributeId, value.number(), false );
}
else if ( value.isNull() )
{
mVectorLayer->changeAttributeValue( feature.id(), mAttributeId, QVariant(), false );
}
else
{
mVectorLayer->changeAttributeValue( feature.id(), attributeId, value.string(), false );
mVectorLayer->changeAttributeValue( feature.id(), mAttributeId, value.string(), false );
}

rownum++;
Expand Down Expand Up @@ -499,7 +503,7 @@ void QgsFieldCalculator::setOkButtonState()
}


void QgsFieldCalculator::on_mFieldsListWidget_currentItemChanged(QListWidgetItem * current, QListWidgetItem * previous )
void QgsFieldCalculator::on_mFieldsListWidget_currentItemChanged( QListWidgetItem * current, QListWidgetItem * previous )
{
getFieldValues( 25 );
}
7 changes: 6 additions & 1 deletion src/app/qgsfieldcalculator.h
Expand Up @@ -29,6 +29,8 @@ class QgsFieldCalculator: public QDialog, private Ui::QgsFieldCalculatorBase
QgsFieldCalculator( QgsVectorLayer* vl );
~QgsFieldCalculator();

int changedAttributeId() const { return mAttributeId; }

public slots:
void accept();

Expand Down Expand Up @@ -60,7 +62,7 @@ class QgsFieldCalculator: public QDialog, private Ui::QgsFieldCalculatorBase
void on_mOutputFieldNameLineEdit_textChanged( const QString& text );
void on_mExpressionTextEdit_textChanged();
void on_mOutputFieldTypeComboBox_activated( int index );
void on_mFieldsListWidget_currentItemChanged(QListWidgetItem * current, QListWidgetItem * previous );
void on_mFieldsListWidget_currentItemChanged( QListWidgetItem * current, QListWidgetItem * previous );

void on_mButtonBox_helpRequested() { QgsContextHelp::run( metaObject()->className() ); }

Expand All @@ -80,6 +82,9 @@ class QgsFieldCalculator: public QDialog, private Ui::QgsFieldCalculatorBase
QgsVectorLayer* mVectorLayer;
/**Key: field name, Value: field index*/
QMap<QString, int> mFieldMap;

/**idx of changed attribute*/
int mAttributeId;
};

#endif // QGSFIELDCALCULATOR_H
1 change: 1 addition & 0 deletions src/core/qgssearchstringparser.yy
Expand Up @@ -174,6 +174,7 @@ scalar_exp:
| ID { $$ = new QgsSearchTreeNode(QgsSearchTreeNode::opID, 0, 0); addToTmpNodes($$); }
| NUMBER { $$ = new QgsSearchTreeNode($1); addToTmpNodes($$); }
| STRING { $$ = new QgsSearchTreeNode(QString::fromUtf8(yytext), 0); addToTmpNodes($$); }
| NULLVALUE { $$ = new QgsSearchTreeNode(QString::null, 0); addToTmpNodes($$); }
| COLUMN_REF { $$ = new QgsSearchTreeNode(QString::fromUtf8(yytext), 1); addToTmpNodes($$); }
| scalar_exp IN '(' scalar_exp_list ')' { $$ = new QgsSearchTreeNode(QgsSearchTreeNode::opIN, $1, $4); joinTmpNodes($$,$1,$4); }
| scalar_exp NOT IN '(' scalar_exp_list ')' { $$ = new QgsSearchTreeNode(QgsSearchTreeNode::opNOTIN, $1, $5); joinTmpNodes($$,$1,$5); }
Expand Down

0 comments on commit 1162bce

Please sign in to comment.