Skip to content

Commit 24e34ca

Browse files
author
wonder
committedOct 22, 2009
[UPDATE] Added field calculator also to attribute table to make it easier to discover.
git-svn-id: http://svn.osgeo.org/qgis/trunk@11829 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 6497f10 commit 24e34ca

File tree

4 files changed

+135
-91
lines changed

4 files changed

+135
-91
lines changed
 

‎src/app/attributetable/qgsattributetabledialog.cpp

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
#include "qgssearchquerybuilder.h"
3232
#include "qgslogger.h"
3333
#include "qgsmapcanvas.h"
34-
34+
#include "qgsfieldcalculator.h"
3535

3636
class QgsAttributeTableDock : public QDockWidget
3737
{
@@ -87,9 +87,12 @@ QgsAttributeTableDialog::QgsAttributeTableDialog( QgsVectorLayer *theLayer, QWid
8787
mZoomMapToSelectedRowsButton->setIcon( getThemeIcon( "/mActionZoomToSelected.png" ) );
8888
mInvertSelectionButton->setIcon( getThemeIcon( "/mActionInvertSelection.png" ) );
8989
mToggleEditingButton->setIcon( getThemeIcon( "/mActionToggleEditing.png" ) );
90+
mOpenFieldCalculator->setIcon( getThemeIcon( "/mActionCalculateField.png" ) );
9091
// toggle editing
92+
bool canChangeAttributes = mLayer->dataProvider()->capabilities() & QgsVectorDataProvider::ChangeAttributeValues;
9193
mToggleEditingButton->setCheckable( true );
92-
mToggleEditingButton->setEnabled( mLayer->dataProvider()->capabilities() & QgsVectorDataProvider::ChangeAttributeValues );
94+
mToggleEditingButton->setEnabled( canChangeAttributes );
95+
mOpenFieldCalculator->setEnabled( canChangeAttributes && mLayer->isEditable() );
9396

9497
// info from table to application
9598
connect( this, SIGNAL( editingToggled( QgsMapLayer * ) ), QgisApp::instance(), SLOT( toggleEditing( QgsMapLayer * ) ) );
@@ -522,6 +525,9 @@ void QgsAttributeTableDialog::editingToggled()
522525
mToggleEditingButton->setChecked( mLayer->isEditable() );
523526
mToggleEditingButton->blockSignals( false );
524527

528+
bool canChangeAttributes = mLayer->dataProvider()->capabilities() & QgsVectorDataProvider::ChangeAttributeValues;
529+
mOpenFieldCalculator->setEnabled( canChangeAttributes && mLayer->isEditable() );
530+
525531
// (probably reload data if user stopped editing - possible revert)
526532
mModel->reload( mModel->index( 0, 0 ), mModel->index( mModel->rowCount(), mModel->columnCount() ) );
527533

@@ -548,3 +554,13 @@ void QgsAttributeTableDialog::revert()
548554
mModel->revert();
549555
mModel->reload( mModel->index( 0, 0 ), mModel->index( mModel->rowCount(), mModel->columnCount() ) );
550556
}
557+
558+
void QgsAttributeTableDialog::on_mOpenFieldCalculator_clicked()
559+
{
560+
QgsFieldCalculator calc( mLayer );
561+
if ( calc.exec() )
562+
{
563+
// update model - a field has been added or updated
564+
mModel->reload( mModel->index( 0, 0 ), mModel->index( mModel->rowCount(), mModel->columnCount() ) );
565+
}
566+
}

‎src/app/attributetable/qgsattributetabledialog.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,10 @@ class QgsAttributeTableDialog : public QDialog, private Ui::QgsAttributeTableDia
132132
* Starts editing mode
133133
*/
134134
void startEditing();
135+
/**
136+
* Opens field calculator dialog
137+
*/
138+
void on_mOpenFieldCalculator_clicked();
135139

136140
signals:
137141
/**

‎src/app/qgsfieldcalculator.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,8 @@ void QgsFieldCalculator::accept()
130130
bool onlySelected = ( mOnlyUpdateSelectedCheckBox->checkState() == Qt::Checked );
131131
QgsFeatureIds selectedIds = mVectorLayer->selectedFeaturesIds();
132132

133+
// block layerModified signals (that would trigger table update)
134+
mVectorLayer->blockSignals( true );
133135

134136
mVectorLayer->select( mVectorLayer->pendingAllAttributesList(), QgsRectangle(), false, false );
135137
while ( mVectorLayer->nextFeature( feature ) )
@@ -157,6 +159,10 @@ void QgsFieldCalculator::accept()
157159
mVectorLayer->changeAttributeValue( feature.id(), attributeId, value.string(), false );
158160
}
159161

162+
// stop blocking layerModified signals and make sure that one layerModified signal is emitted
163+
mVectorLayer->blockSignals( true );
164+
mVectorLayer->setModified( true, false );
165+
160166
}
161167

162168
if ( !calculationSuccess )

0 commit comments

Comments
 (0)
Please sign in to comment.