void KonqSidebarBookmarkModule::slotMoved(QListViewItem *i, QListViewItem*, QListViewItem *after) { KonqSidebarBookmarkItem *item = dynamic_cast<KonqSidebarBookmarkItem*>( i ); if (!item) return; KBookmark bookmark = item->bookmark(); KBookmark afterBookmark; KonqSidebarBookmarkItem *afterItem = dynamic_cast<KonqSidebarBookmarkItem*>(after); if (afterItem) afterBookmark = afterItem->bookmark(); KBookmarkGroup oldParentGroup = bookmark.parentGroup(); KBookmarkGroup parentGroup; // try to get the parent group (assume that the QListViewItem has been reparented by KListView)... // if anything goes wrong, use the root. if (item->parent()) { bool error = false; KonqSidebarBookmarkItem *parent = dynamic_cast<KonqSidebarBookmarkItem*>( (item->parent()) ); if (!parent) { error = true; } else { if (parent->bookmark().isGroup()) parentGroup = parent->bookmark().toGroup(); else error = true; } if (error) parentGroup = KonqBookmarkManager::self()->root(); } else { // No parent! This means the user dropped it before the top level item // And KListView has moved the item there, we need to correct it tree()->moveItem(item, m_topLevelItem, 0L); parentGroup = KonqBookmarkManager::self()->root(); } // remove the old reference. oldParentGroup.deleteBookmark( bookmark ); // insert the new item. parentGroup.moveItem(bookmark, afterBookmark); // inform others about the changed groups. quite expensive, so do // our best to update them in only one emitChanged call. QString oldAddress = oldParentGroup.address(); QString newAddress = parentGroup.address(); if (oldAddress == newAddress) { KonqBookmarkManager::self()->emitChanged( parentGroup ); } else { int i = 0; while (true) { QChar c1 = oldAddress[i]; QChar c2 = newAddress[i]; if (c1 == QChar::null) { // oldParentGroup is probably parent of parentGroup. KonqBookmarkManager::self()->emitChanged( oldParentGroup ); break; } else if (c2 == QChar::null) { // parentGroup is probably parent of oldParentGroup. KonqBookmarkManager::self()->emitChanged( parentGroup ); break; } else { if (c1 == c2) { // step to the next character. ++i; } else { // ugh... need to update both groups separately. KonqBookmarkManager::self()->emitChanged( oldParentGroup ); KonqBookmarkManager::self()->emitChanged( parentGroup ); break; } } } } }