#2148 AppFwk : Move creation of QModelIndex after insertion of new items

This commit is contained in:
Magne Sjaastad 2017-12-06 10:47:18 +01:00
parent 9cbd0973dc
commit c1f8487666

View File

@ -197,14 +197,14 @@ void PdmUiTreeViewModel::updateSubTree(PdmUiItem* pdmRoot)
class RecursiveUpdateData class RecursiveUpdateData
{ {
public: public:
RecursiveUpdateData(QModelIndex mi, PdmUiTreeOrdering* existingChild, PdmUiTreeOrdering* sourceChild) RecursiveUpdateData(int row, PdmUiTreeOrdering* existingChild, PdmUiTreeOrdering* sourceChild)
: m_modelIndex(mi), : m_row(row),
m_existingChild(existingChild), m_existingChild(existingChild),
m_sourceChild(sourceChild) m_sourceChild(sourceChild)
{ {
}; };
QModelIndex m_modelIndex; int m_row;
PdmUiTreeOrdering* m_existingChild; PdmUiTreeOrdering* m_existingChild;
PdmUiTreeOrdering* m_sourceChild; PdmUiTreeOrdering* m_sourceChild;
}; };
@ -214,7 +214,9 @@ public:
/// calling begin..() end..() to make the UI update accordingly. /// calling begin..() end..() to make the UI update accordingly.
/// This assumes that all the items have a pointer an unique PdmObject /// This assumes that all the items have a pointer an unique PdmObject
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void PdmUiTreeViewModel::updateSubTreeRecursive(const QModelIndex& existingSubTreeRootModIdx, PdmUiTreeOrdering* existingSubTreeRoot, PdmUiTreeOrdering* sourceSubTreeRoot) void PdmUiTreeViewModel::updateSubTreeRecursive(const QModelIndex& existingSubTreeRootModIdx,
PdmUiTreeOrdering* existingSubTreeRoot,
PdmUiTreeOrdering* sourceSubTreeRoot)
{ {
// Build map for source items // Build map for source items
std::map<caf::PdmUiItem*, int> sourceTreeMap; std::map<caf::PdmUiItem*, int> sourceTreeMap;
@ -309,13 +311,10 @@ void PdmUiTreeViewModel::updateSubTreeRecursive(const QModelIndex& existingSubTr
{ {
newMergedOrdering.push_back(existingSubTreeRoot->child(it->second)); newMergedOrdering.push_back(existingSubTreeRoot->child(it->second));
QModelIndex mi = index(static_cast<int>(newMergedOrdering.size() - 1), 0, existingSubTreeRootModIdx); int rowIndexToBeUpdated = static_cast<int>(newMergedOrdering.size() - 1);
if (mi.isValid()) recursiveUpdateData.push_back(RecursiveUpdateData(rowIndexToBeUpdated,
{ existingSubTreeRoot->child(it->second),
// Do not insert an invalid index, as this causes flickering and reset of project tree expanded state sourceChild));
recursiveUpdateData.push_back(RecursiveUpdateData(mi, existingSubTreeRoot->child(it->second), sourceChild));
}
} }
else else
{ {
@ -361,7 +360,12 @@ void PdmUiTreeViewModel::updateSubTreeRecursive(const QModelIndex& existingSubTr
for (size_t i = 0; i < recursiveUpdateData.size(); i++) for (size_t i = 0; i < recursiveUpdateData.size(); i++)
{ {
updateSubTreeRecursive(recursiveUpdateData[i].m_modelIndex, recursiveUpdateData[i].m_existingChild, recursiveUpdateData[i].m_sourceChild); // Using the index() function here is OK, as new items has been inserted in the previous for-loop
// This code used to be executed before insertion of new items, and caused creation of invalid indices
QModelIndex mi = index(recursiveUpdateData[i].m_row, 0, existingSubTreeRootModIdx);
CAF_ASSERT(mi.isValid());
updateSubTreeRecursive(mi, recursiveUpdateData[i].m_existingChild, recursiveUpdateData[i].m_sourceChild);
} }
} }
} }