mirror of
https://github.com/qgis/QGIS.git
synced 2025-02-28 00:17:30 -05:00
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:
parent
2e60214386
commit
e1b2e60c93
@ -383,7 +383,7 @@ bool QgsAttributeTable::rollBack(QgsVectorLayer* layer)
|
||||
{
|
||||
if(layer)
|
||||
{
|
||||
fillTable(layer);
|
||||
layer->fillTable(this);
|
||||
}
|
||||
mEdited=false;
|
||||
clearEditingStructures();
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user