diff -r 7f0462e8c3da -r 1e87eb3b400f contentstorage/caclient/src/caitemmodel.cpp --- a/contentstorage/caclient/src/caitemmodel.cpp Tue Mar 23 23:55:55 2010 +0200 +++ b/contentstorage/caclient/src/caitemmodel.cpp Wed Mar 24 03:15:43 2010 +0200 @@ -706,17 +706,19 @@ mEntries.updateEntry(id); QList ids = mService->getEntryIds(mQuery); - if (mEntries.indexOf(id) >= 0 && ids.indexOf(id) - == mEntries.indexOf(id)) { + if (mEntries.indexOf(id) >= 0 + && ids.indexOf(id) == mEntries.indexOf(id)) { emit m_q->dataChanged(index(mEntries.indexOf(id)), index( mEntries.indexOf(id))); + } else if (ids.indexOf(id) < 0){ + removeItem(id); + } else if (mEntries.indexOf(id) < 0){ + addItem(id); + } else if (mParentEntry && id == mParentEntry->id()) { + updateParentEntry(); + m_q->reset(); } else { - if (mParentEntry && id == mParentEntry->id()) { - updateParentEntry(); - m_q->reset(); - } else { - updateLayout(); - } + updateModel(); } CACLIENTTEST_FUNC_EXIT("CaItemModelPrivate::updateItemData"); } @@ -751,11 +753,25 @@ int entriesCount = mEntries.count(); if (entriesCount) { int lastRow = itemsList.indexOf(mEntries[entriesCount - 1]); - if (itemsList.count() == entriesCount && lastRow == (entriesCount - - 1)) { + if (itemsList.count() == entriesCount) { //count is same and last item is in same position //so we update whole model - updateModel(); + bool orderChanged(false); + while (entriesCount) { + if (itemsList.indexOf(mEntries[entriesCount - 1]) + != (entriesCount - 1)) { + orderChanged = true; + break; + } + entriesCount--; + } + if (orderChanged) { + updateLayout(); + } + else { + updateModel(); + } + } else if ((itemsList.count() - entriesCount) == 1 && lastRow == entriesCount) { //just one item added - collection @@ -773,15 +789,15 @@ i++; } } else { - //some items were inserted or reordered, - //so we update layout and emit signal with row number + //some items were inserted + //so we update model and emit signal with row number //of first moved/added item //signal is needed to scroll a view to proper position after //some items were added - updateLayout(); + updateModel(); emit m_q->scrollTo(lastRow + 1, QAbstractItemView::PositionAtTop); - } + } } else { updateModel(); } @@ -815,9 +831,8 @@ mEntries.remove(id); m_q->endRemoveRows(); } else { - updateLayout(); + updateModel(); } - CACLIENTTEST_FUNC_EXIT("CaItemModelPrivate::removeItem"); } @@ -843,13 +858,45 @@ /*! Layout update + NOTE: this method should be called only if the entries get rearranged + and do not change their contents! */ void CaItemModelPrivate::updateLayout() { CACLIENTTEST_FUNC_ENTRY("CaItemModelPrivate::updateLayout"); m_q->layoutAboutToBeChanged(); + + // get the ID list from before the update + QList oldOrderedIdList = mEntries.orderedIdList(); + + // do the update, the entries should only get rearranged mEntries.updateEntries(mQuery); - updateParentEntry(); + + // get the new ID list after the entries got rearranged + QList newOrderedIdList = mEntries.orderedIdList(); + // this list will contain the new position indices + QList newPositionsList; + int entry; + foreach (entry, oldOrderedIdList) { + newPositionsList << newOrderedIdList.indexOf(entry); + } + + // now check which items in the previous persistent index list changed + // their positions, make new indices for them and store in the new + // persistent index list + QModelIndexList oldPersistentIndexList = m_q->persistentIndexList(); + QModelIndexList newPersistentIndexList; + QModelIndex index; + foreach (index, oldPersistentIndexList) { + newPersistentIndexList << + m_q->createIndex( + newPositionsList.at(index.row()), + 0, + index.internalPointer()); + } + + m_q->changePersistentIndexList(oldPersistentIndexList, newPersistentIndexList); + m_q->layoutChanged(); CACLIENTTEST_FUNC_EXIT("CaItemModelPrivate::updateLayout"); }