X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/007907be20cc63e4c12320b0406cc255286e7792..4de8cf43e62e23b766d9d457e060670401ce6128:/src/kitemviews/kstandarditemmodel.cpp diff --git a/src/kitemviews/kstandarditemmodel.cpp b/src/kitemviews/kstandarditemmodel.cpp index 86ef9563b..060440aec 100644 --- a/src/kitemviews/kstandarditemmodel.cpp +++ b/src/kitemviews/kstandarditemmodel.cpp @@ -18,6 +18,8 @@ ***************************************************************************/ #include "kstandarditemmodel.h" + +#include #include "kstandarditem.h" KStandardItemModel::KStandardItemModel(QObject* parent) : @@ -29,36 +31,106 @@ KStandardItemModel::KStandardItemModel(QObject* parent) : KStandardItemModel::~KStandardItemModel() { + qDeleteAll(m_items); + m_items.clear(); + m_indexesForItems.clear(); } void KStandardItemModel::insertItem(int index, KStandardItem* item) { - if (!m_indexesForItems.contains(item) && !item->m_model) { + if (index < 0 || index > count() || !item) { + delete item; + return; + } + + if (!m_indexesForItems.contains(item)) { + item->m_model = this; m_items.insert(index, item); m_indexesForItems.insert(item, index); - item->m_model = this; + + // Inserting an item requires to update the indexes + // afterwards from m_indexesForItems. + for (int i = index + 1; i < m_items.count(); ++i) { + m_indexesForItems.insert(m_items[i], i); + } + // TODO: no hierarchical items are handled yet + onItemInserted(index); emit itemsInserted(KItemRangeList() << KItemRange(index, 1)); } } -void KStandardItemModel::appendItem(KStandardItem *item) +void KStandardItemModel::changeItem(int index, KStandardItem* item) { - insertItem(m_items.count(), item); + if (index < 0 || index >= count() || !item) { + delete item; + return; + } + + item->m_model = this; + + QSet changedRoles; + + KStandardItem* oldItem = m_items[index]; + const QHash oldData = oldItem->data(); + const QHash newData = item->data(); + + // Determine which roles have been changed + QHashIterator it(oldData); + while (it.hasNext()) { + it.next(); + const QByteArray role = it.key(); + const QVariant oldValue = it.value(); + if (newData.contains(role) && newData.value(role) != oldValue) { + changedRoles.insert(role); + } + } + + m_indexesForItems.remove(oldItem); + delete oldItem; + oldItem = 0; + + m_items[index] = item; + m_indexesForItems.insert(item, index); + + onItemChanged(index, changedRoles); + emit itemsChanged(KItemRangeList() << KItemRange(index, 1), changedRoles); } -void KStandardItemModel::removeItem(KStandardItem* item) +void KStandardItemModel::removeItem(int index) { - const int index = m_indexesForItems.value(item, -1); - if (index >= 0) { - m_items.removeAt(index); + if (index >= 0 && index < count()) { + KStandardItem* item = m_items[index]; m_indexesForItems.remove(item); + m_items.removeAt(index); + + // Removing an item requires to update the indexes + // afterwards from m_indexesForItems. + for (int i = index; i < m_items.count(); ++i) { + m_indexesForItems.insert(m_items[i], i); + } + + onItemRemoved(index, item); + delete item; + item = 0; + + emit itemsRemoved(KItemRangeList() << KItemRange(index, 1)); + // TODO: no hierarchical items are handled yet } } +void KStandardItemModel::clear() +{ + int size = m_items.size(); + m_items.clear(); + m_indexesForItems.clear(); + + emit itemsRemoved(KItemRangeList() << KItemRange(0, size)); +} + KStandardItem* KStandardItemModel::item(int index) const { if (index < 0 || index >= m_items.count()) { @@ -72,6 +144,11 @@ int KStandardItemModel::index(const KStandardItem* item) const return m_indexesForItems.value(item, -1); } +void KStandardItemModel::appendItem(KStandardItem *item) +{ + insertItem(m_items.count(), item); +} + int KStandardItemModel::count() const { return m_items.count(); @@ -79,9 +156,11 @@ int KStandardItemModel::count() const QHash KStandardItemModel::data(int index) const { - const KStandardItem* item = m_items[index]; - if (item) { - return item->data(); + if (index >= 0 && index < count()) { + const KStandardItem* item = m_items[index]; + if (item) { + return item->data(); + } } return QHash(); } @@ -96,7 +175,7 @@ bool KStandardItemModel::setData(int index, const QHash& v return true; } -QMimeData* KStandardItemModel::createMimeData(const QSet& indexes) const +QMimeData* KStandardItemModel::createMimeData(const KItemSet& indexes) const { Q_UNUSED(indexes); return 0; @@ -123,7 +202,38 @@ QString KStandardItemModel::roleDescription(const QByteArray& role) const QList > KStandardItemModel::groups() const { - return QList >(); + QList > groups; + + const QByteArray role = sortRole().isEmpty() ? "group" : sortRole(); + bool isFirstGroupValue = true; + QString groupValue; + const int maxIndex = count() - 1; + for (int i = 0; i <= maxIndex; ++i) { + const QString newGroupValue = m_items.at(i)->dataValue(role).toString(); + if (newGroupValue != groupValue || isFirstGroupValue) { + groupValue = newGroupValue; + groups.append(QPair(i, newGroupValue)); + isFirstGroupValue = false; + } + } + + return groups; +} + +void KStandardItemModel::onItemInserted(int index) +{ + Q_UNUSED(index); +} + +void KStandardItemModel::onItemChanged(int index, const QSet& changedRoles) +{ + Q_UNUSED(index); + Q_UNUSED(changedRoles); +} + +void KStandardItemModel::onItemRemoved(int index, KStandardItem* removedItem) +{ + Q_UNUSED(index); + Q_UNUSED(removedItem); } -#include "kstandarditemmodel.moc"