mirror of
https://github.com/qgis/QGIS.git
synced 2025-02-25 00:58:06 -05:00
Fixes parts of bug #763 'problem editing postgis table'. But it is still a problem to add attributes and commit changes to the new attributes in one go
git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@7181 c8812cc2-4d05-0410-92ff-de0c093fc19c
This commit is contained in:
parent
0153c884bd
commit
1b601a884c
@ -426,10 +426,29 @@ bool QgsAttributeTable::commitChanges(QgsVectorLayer* layer)
|
||||
{
|
||||
deletedIds.insert(provider->indexFromFieldName(*it));
|
||||
}
|
||||
|
||||
QgsChangedAttributesMap attributeChanges; //convert mChangedValues to QgsChangedAttributesMap
|
||||
int fieldIndex;
|
||||
|
||||
QMap<int, QMap<QString, QString> >::const_iterator att_it = mChangedValues.constBegin();
|
||||
for(; att_it != mChangedValues.constEnd(); ++att_it)
|
||||
{
|
||||
QgsAttributeMap newAttMap;
|
||||
QMap<QString, QString>::const_iterator record_it = att_it->constBegin();
|
||||
for(; record_it != att_it->constEnd(); ++record_it)
|
||||
{
|
||||
fieldIndex = provider->indexFromFieldName(record_it.key());
|
||||
if(fieldIndex != -1)
|
||||
{
|
||||
newAttMap.insert(fieldIndex, record_it.value());
|
||||
}
|
||||
}
|
||||
attributeChanges.insert(att_it.key(), newAttMap);
|
||||
}
|
||||
|
||||
isSuccessful = layer->commitAttributeChanges(deletedIds,
|
||||
mAddedAttributes,
|
||||
mChangedValues);
|
||||
attributeChanges);
|
||||
}
|
||||
}
|
||||
|
||||
@ -528,52 +547,23 @@ void QgsAttributeTable::putFeatureInTable(int row, QgsFeature& fet)
|
||||
}
|
||||
}
|
||||
|
||||
int QgsAttributeTable::colIndexFromFieldIndex(int fieldId)
|
||||
{
|
||||
int colIndex = 1; // index 0 is feature ID
|
||||
QgsFieldMap::const_iterator it;
|
||||
for (it = mFields.begin(); it != mFields.end(); ++it, ++colIndex)
|
||||
{
|
||||
if (it.key() == fieldId)
|
||||
return colIndex;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
int QgsAttributeTable::fieldIndexFromColIndex(int colIndex)
|
||||
{
|
||||
colIndex--; // first one is feature ID
|
||||
QgsFieldMap::const_iterator it;
|
||||
for (it = mFields.begin(); it != mFields.end(); ++it, --colIndex)
|
||||
{
|
||||
if (colIndex == 0)
|
||||
return it.key();
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void QgsAttributeTable::storeChangedValue(int row, int column)
|
||||
{
|
||||
//id column is not editable
|
||||
if(column>0)
|
||||
//id column is not editable
|
||||
if(column>0)
|
||||
{
|
||||
//find feature id
|
||||
int id=text(row,0).toInt();
|
||||
int field = fieldIndexFromColIndex(column);
|
||||
|
||||
QgsDebugMsg("feature id: " + QString::number(id));
|
||||
QgsDebugMsg("attribute: " + QString::number(field) + ": " + mFields[field].name());
|
||||
|
||||
// add empty map for feature if doesn't exist
|
||||
if (!mChangedValues.contains(id))
|
||||
{
|
||||
mChangedValues.insert(id, QgsAttributeMap());
|
||||
}
|
||||
|
||||
mChangedValues[id].insert(field, QVariant(text(row,column)) );
|
||||
|
||||
QgsDebugMsg("value: " + text(row,column));
|
||||
mEdited=true;
|
||||
//find feature id
|
||||
int id=text(row,0).toInt();
|
||||
QString field = horizontalHeader()->label(column);
|
||||
|
||||
// add empty map for feature if doesn't exist
|
||||
if (!mChangedValues.contains(id))
|
||||
{
|
||||
mChangedValues.insert(id, QMap<QString, QString>());
|
||||
}
|
||||
|
||||
mChangedValues[id].insert(field, text(row,column));
|
||||
mEdited=true;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -133,7 +133,8 @@ class QgsAttributeTable:public Q3Table
|
||||
QSet<QString> mDeletedAttributes;
|
||||
/**Nested map containing the changed attribute values. The int is the feature id,
|
||||
the first QString the attribute name and the second QString the new value*/
|
||||
QgsChangedAttributesMap mChangedValues;
|
||||
QMap<int, QMap<QString, QString> > mChangedValues;
|
||||
|
||||
/**Stors the numbers of the last selected rows. This is used to check for selection changes before emit repaintRequested()*/
|
||||
std::set<int> mLastSelectedRows;
|
||||
|
||||
@ -154,11 +155,6 @@ class QgsAttributeTable:public Q3Table
|
||||
/**This function compares the current selection and the selection of the last repaint. Returns true if there are differences in the selection.
|
||||
Also, mLastSelectedRows is updated*/
|
||||
bool checkSelectionChanges();
|
||||
|
||||
/** returns column index for field index or -1 on invalid field index */
|
||||
int colIndexFromFieldIndex(int fieldId);
|
||||
/** returns field index for a column or -1 when on invalid column */
|
||||
int fieldIndexFromColIndex(int colIndex);
|
||||
|
||||
signals:
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user