From e1b2e60c930a06ca89d598e89746d0a857f4c820 Mon Sep 17 00:00:00 2001 From: mhugent Date: Sat, 12 Feb 2005 22:21:11 +0000 Subject: [PATCH] some changes to display tables. Displaying the attribute table is now done in QgsVectorLayer::fillTable() with consideration of (not commited) added and deleted features git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@2792 c8812cc2-4d05-0410-92ff-de0c093fc19c --- src/qgsattributetable.cpp | 2 +- src/qgsvectorlayer.cpp | 112 ++++++++++++++++++++++++++++---------- src/qgsvectorlayer.h | 3 + 3 files changed, 86 insertions(+), 31 deletions(-) diff --git a/src/qgsattributetable.cpp b/src/qgsattributetable.cpp index d9040d2f908..6b519139a1c 100644 --- a/src/qgsattributetable.cpp +++ b/src/qgsattributetable.cpp @@ -383,7 +383,7 @@ bool QgsAttributeTable::rollBack(QgsVectorLayer* layer) { if(layer) { - fillTable(layer); + layer->fillTable(this); } mEdited=false; clearEditingStructures(); diff --git a/src/qgsvectorlayer.cpp b/src/qgsvectorlayer.cpp index fecdece083a..2e418f92cc4 100644 --- a/src/qgsvectorlayer.cpp +++ b/src/qgsvectorlayer.cpp @@ -608,37 +608,9 @@ void QgsVectorLayer::table() { // display the attribute table QApplication::setOverrideCursor(Qt::waitCursor); - dataProvider->reset(); - - QgsFeature *fet; - fet = dataProvider->getNextFeature(true); - std::vector < QgsFeatureAttribute > attributes = fet->attributeMap(); - int numFields = attributes.size(); tabledisplay = new QgsAttributeTableDisplay(this); connect(tabledisplay, SIGNAL(deleted()), this, SLOT(invalidateTableDisplay())); - tabledisplay->table()->setNumRows(dataProvider->featureCount()+mAddedFeatures.size()-mDeleted.size()); - tabledisplay->table()->setNumCols(numFields + 1); //+1 for the id-column - tabledisplay->table()->fillTable(this);//QgsAttributeTable fills itself now - - //also consider the not commited features - int row = 0; - for(std::list::iterator it=mAddedFeatures.begin();it!=mAddedFeatures.end();++it) - { - //id-field - tabledisplay->table()->setText(row, 0, QString::number((*it)->featureId())); - tabledisplay->table()->insertFeatureId((*it)->featureId(), row); //insert the id into the search tree of qgsattributetable - std::vector < QgsFeatureAttribute > attr = (*it)->attributeMap(); - for (int i = 0; i < attr.size(); i++) - { - // get the field values - tabledisplay->table()->setText(row, i + 1, attr[i].fieldValue()); - } - row++; - } - - // reset the pointer to start of fetabledisplayures so - // subsequent reads will not fail - dataProvider->reset(); + fillTable(tabledisplay->table()); tabledisplay->table()->setSorting(true); @@ -672,7 +644,87 @@ void QgsVectorLayer::table() } // QgsVectorLayer::table +void QgsVectorLayer::fillTable(QgsAttributeTable* t) +{ + if(t&&dataProvider) + { + int row = 0; + int id; + // set up the column headers + QHeader *colHeader = t->horizontalHeader(); + + dataProvider->reset(); + QgsFeature *fet; + fet = dataProvider->getNextFeature(true); + if(fet)//use the description of the feature to set up the column headers + { + std::vector < QgsFeatureAttribute > attributes = fet->attributeMap(); + int numFields = attributes.size(); + t->setNumCols(numFields+1); + t->setNumRows(dataProvider->featureCount()+mAddedFeatures.size()-mDeleted.size()); + colHeader->setLabel(0, "id"); + for (int h = 1; h <= numFields; h++) + { + colHeader->setLabel(h, attributes[h-1].fieldName()); + } + delete fet; + } + else//no feature yet, use the description of the provider to set up the column headers + { + std::vector < QgsField > fields = dataProvider->fields(); + int numFields = fields.size(); + t->setNumCols(numFields+1); + t->setNumRows(dataProvider->featureCount()+mAddedFeatures.size()-mDeleted.size()); + for (int h = 1; h <= numFields; h++) + { + colHeader->setLabel(h, fields[h - 1].name()); + } + } + + //go through the features and fill the values into the table + dataProvider->reset(); + while ((fet = dataProvider->getNextFeature(true))) + { + id=fet->featureId(); + if(mDeleted.find(id)==mDeleted.end()) + { + //id-field + t->setText(row, 0, QString::number(id)); + t->insertFeatureId(fet->featureId(), row); //insert the id into the search tree of qgsattributetable + std::vector < QgsFeatureAttribute > attr = fet->attributeMap(); + for (int i = 0; i < attr.size(); i++) + { + // get the field values + t->setText(row, i + 1, attr[i].fieldValue()); +#ifdef QGISDEBUG + //qWarning("Setting value for "+QString::number(i+1)+"//"+QString::number(row)+"//"+attr[i].fieldValue()); +#endif + } + row++; + } + delete fet; + } + + //also consider the not commited features + for(std::list::iterator it=mAddedFeatures.begin();it!=mAddedFeatures.end();++it) + { + //id-field + tabledisplay->table()->setText(row, 0, QString::number((*it)->featureId())); + tabledisplay->table()->insertFeatureId((*it)->featureId(), row); //insert the id into the search tree of qgsattributetable + std::vector < QgsFeatureAttribute > attr = (*it)->attributeMap(); + for (int i = 0; i < attr.size(); i++) + { + // get the field values + tabledisplay->table()->setText(row, i + 1, attr[i].fieldValue()); + } + row++; + } + + dataProvider->reset(); + + } +} void QgsVectorLayer::select(int number) { @@ -1316,7 +1368,7 @@ QString QgsVectorLayer::getDefaultValue(const QString& attr, bool QgsVectorLayer::deleteSelectedFeatures() { - if(dataProvider->capabilities()&QgsVectorDataProvider::DeleteFeatures) + if(!(dataProvider->capabilities()&QgsVectorDataProvider::DeleteFeatures)) { QMessageBox::information(0, tr("Provider does not support deletion"), tr("Data provider does not support deleting features")); return false; diff --git a/src/qgsvectorlayer.h b/src/qgsvectorlayer.h index 82aadc108a8..ebcc481832f 100644 --- a/src/qgsvectorlayer.h +++ b/src/qgsvectorlayer.h @@ -67,6 +67,9 @@ public: //! Display the attribute table void table(); + //! Resize and fill the attribute table + void fillTable(QgsAttributeTable* t); + //! Set the primary display field to be used in the identify results dialog void setDisplayField(QString fldName=0);