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
This commit is contained in:
mhugent 2005-02-12 22:21:11 +00:00
parent 2e60214386
commit e1b2e60c93
3 changed files with 86 additions and 31 deletions

View File

@ -383,7 +383,7 @@ bool QgsAttributeTable::rollBack(QgsVectorLayer* layer)
{
if(layer)
{
fillTable(layer);
layer->fillTable(this);
}
mEdited=false;
clearEditingStructures();

View File

@ -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<QgsFeature*>::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<QgsFeature*>::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;

View File

@ -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);