Remove child items when a parent item gets deleted

BUG: 289447
FIXED-IN: 4.8.0
This commit is contained in:
Peter Penz 2011-12-20 22:20:20 +01:00
parent 8012fe7da2
commit d9e1db6ea4
2 changed files with 32 additions and 2 deletions

View file

@ -719,13 +719,21 @@ void KFileItemModel::slotItemsDeleted(const KFileItemList& items)
{
dispatchPendingItemsToInsert();
if (!m_filteredItems.isEmpty()) {
KFileItemList itemsToRemove = items;
if (m_requestRole[ExpansionLevelRole] && m_rootExpansionLevel >= 0) {
// Assure that removing a parent item also results in removing all children
foreach (const KFileItem& item, items) {
itemsToRemove.append(childItems(item));
}
}
if (!m_filteredItems.isEmpty()) {
foreach (const KFileItem& item, itemsToRemove) {
m_filteredItems.remove(item);
}
}
removeItems(items);
removeItems(itemsToRemove);
}
void KFileItemModel::slotRefreshItems(const QList<QPair<KFileItem, KFileItem> >& items)
@ -1849,4 +1857,21 @@ QList<QPair<int, QVariant> > KFileItemModel::genericStringRoleGroups(const QByte
return groups;
}
KFileItemList KFileItemModel::childItems(const KFileItem& item) const
{
KFileItemList items;
int index = m_items.value(item.url(), -1);
if (index >= 0) {
const int parentLevel = m_itemData.at(index)->values.value("expansionLevel").toInt();
++index;
while (index < m_itemData.count() && m_itemData.at(index)->values.value("expansionLevel").toInt() > parentLevel) {
items.append(m_itemData.at(index)->item);
++index;
}
}
return items;
}
#include "kfileitemmodel.moc"

View file

@ -306,6 +306,11 @@ private:
*/
bool isChildItem(int index) const;
/**
* @return Recursive list of child items that have \a item as upper most parent.
*/
KFileItemList childItems(const KFileItem& item) const;
private:
QWeakPointer<KDirLister> m_dirLister;