diff options
| author | Frank Reininghaus <[email protected]> | 2011-09-18 15:03:45 +0200 |
|---|---|---|
| committer | Frank Reininghaus <[email protected]> | 2011-09-18 15:03:45 +0200 |
| commit | 31d3b91813c2b9d74d175876d2551cca4484ab5e (patch) | |
| tree | 8eba74dfe6075f3c45c7983b2ee1743823c3ae5b /src/kitemviews | |
| parent | 01d4b8d0820ee3ab9f05df23c31a8230acfe7083 (diff) | |
Implement some missing sorting options
Changing the sort order and enabling/disabling the
"Sort Folders First" option works now.
Diffstat (limited to 'src/kitemviews')
| -rw-r--r-- | src/kitemviews/kfileitemmodel.cpp | 72 | ||||
| -rw-r--r-- | src/kitemviews/kfileitemmodel.h | 9 | ||||
| -rw-r--r-- | src/kitemviews/kitemmodelbase.cpp | 22 | ||||
| -rw-r--r-- | src/kitemviews/kitemmodelbase.h | 27 |
4 files changed, 103 insertions, 27 deletions
diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp index f5d8d41a2..1391acb83 100644 --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -137,6 +137,19 @@ bool KFileItemModel::supportsSorting() const return true; } +void KFileItemModel::setSortFoldersFirst(bool foldersFirst) +{ + if (foldersFirst != m_sortFoldersFirst) { + m_sortFoldersFirst = foldersFirst; + resortAllItems(); + } +} + +bool KFileItemModel::sortFoldersFirst() const +{ + return m_sortFoldersFirst; +} + QMimeData* KFileItemModel::createMimeData(const QSet<int>& indexes) const { QMimeData* data = new QMimeData(); @@ -370,30 +383,15 @@ void KFileItemModel::onGroupRoleChanged(const QByteArray& current, const QByteAr void KFileItemModel::onSortRoleChanged(const QByteArray& current, const QByteArray& previous) { Q_UNUSED(previous); - const int itemCount = count(); - if (itemCount <= 0) { - return; - } - m_sortRole = roleIndex(current); + resortAllItems(); +} - KFileItemList sortedItems = m_sortedItems; - m_sortedItems.clear(); - m_items.clear(); - m_data.clear(); - emit itemsRemoved(KItemRangeList() << KItemRange(0, itemCount)); - - sort(sortedItems.begin(), sortedItems.end()); - int index = 0; - foreach (const KFileItem& item, sortedItems) { - m_sortedItems.append(item); - m_items.insert(item.url(), index); - m_data.append(retrieveData(item)); - - ++index; - } - - emit itemsInserted(KItemRangeList() << KItemRange(0, itemCount)); +void KFileItemModel::onSortOrderChanged(Qt::SortOrder current, Qt::SortOrder previous) +{ + Q_UNUSED(current); + Q_UNUSED(previous); + resortAllItems(); } void KFileItemModel::slotCompleted() @@ -698,6 +696,32 @@ void KFileItemModel::removeItems(const KFileItemList& items) emit itemsRemoved(itemRanges); } +void KFileItemModel::resortAllItems() +{ + const int itemCount = count(); + if (itemCount <= 0) { + return; + } + + KFileItemList sortedItems = m_sortedItems; + m_sortedItems.clear(); + m_items.clear(); + m_data.clear(); + emit itemsRemoved(KItemRangeList() << KItemRange(0, itemCount)); + + sort(sortedItems.begin(), sortedItems.end()); + int index = 0; + foreach (const KFileItem& item, sortedItems) { + m_sortedItems.append(item); + m_items.insert(item.url(), index); + m_data.append(retrieveData(item)); + + ++index; + } + + emit itemsInserted(KItemRangeList() << KItemRange(0, itemCount)); +} + void KFileItemModel::removeExpandedItems() { @@ -840,7 +864,7 @@ bool KFileItemModel::lessThan(const KFileItem& a, const KFileItem& b) const result = expansionLevelsCompare(a, b); if (result != 0) { // The items have parents with different expansion levels - return result < 0; + return (sortOrder() == Qt::AscendingOrder) ? result < 0 : result > 0; } } @@ -887,7 +911,7 @@ bool KFileItemModel::lessThan(const KFileItem& a, const KFileItem& b) const result = QString::compare(a.url().url(), b.url().url(), Qt::CaseSensitive); } - return result < 0; + return (sortOrder() == Qt::AscendingOrder) ? result < 0 : result > 0; } void KFileItemModel::sort(const KFileItemList::iterator& startIterator, const KFileItemList::iterator& endIterator) diff --git a/src/kitemviews/kfileitemmodel.h b/src/kitemviews/kfileitemmodel.h index 4156b2be8..b84cef216 100644 --- a/src/kitemviews/kfileitemmodel.h +++ b/src/kitemviews/kfileitemmodel.h @@ -66,6 +66,12 @@ public: */ virtual bool supportsSorting() const; + /** + * Sets a separate sorting with folders first (true) or a mixed sorting of files and folders (false). + */ + void setSortFoldersFirst(bool foldersFirst); + bool sortFoldersFirst() const; + /** @reimp */ virtual QMimeData* createMimeData(const QSet<int>& indexes) const; @@ -122,6 +128,7 @@ signals: protected: virtual void onGroupRoleChanged(const QByteArray& current, const QByteArray& previous); virtual void onSortRoleChanged(const QByteArray& current, const QByteArray& previous); + virtual void onSortOrderChanged(Qt::SortOrder current, Qt::SortOrder previous); private slots: void slotCompleted(); @@ -138,6 +145,8 @@ private: void insertItems(const KFileItemList& items); void removeItems(const KFileItemList& items); + void resortAllItems(); + void removeExpandedItems(); enum Role { diff --git a/src/kitemviews/kitemmodelbase.cpp b/src/kitemviews/kitemmodelbase.cpp index 541f802e3..7bfe607a4 100644 --- a/src/kitemviews/kitemmodelbase.cpp +++ b/src/kitemviews/kitemmodelbase.cpp @@ -36,14 +36,16 @@ bool KItemRange::operator == (const KItemRange& other) const KItemModelBase::KItemModelBase(QObject* parent) : QObject(parent), m_groupRole(), - m_sortRole() + m_sortRole(), + m_sortOrder(Qt::AscendingOrder) { } KItemModelBase::KItemModelBase(const QByteArray& groupRole, const QByteArray& sortRole, QObject* parent) : QObject(parent), m_groupRole(groupRole), - m_sortRole(sortRole) + m_sortRole(sortRole), + m_sortOrder(Qt::AscendingOrder) { } @@ -98,6 +100,16 @@ QByteArray KItemModelBase::sortRole() const return m_sortRole; } +void KItemModelBase::setSortOrder(Qt::SortOrder order) +{ + if (supportsSorting() && order != m_sortOrder) { + const Qt::SortOrder previous = m_sortOrder; + m_sortOrder = order; + onSortOrderChanged(order, previous); + emit sortOrderChanged(order, previous); + } +} + QString KItemModelBase::roleDescription(const QByteArray& role) const { return role; @@ -134,4 +146,10 @@ void KItemModelBase::onSortRoleChanged(const QByteArray& current, const QByteArr Q_UNUSED(previous); } +void KItemModelBase::onSortOrderChanged(Qt::SortOrder current, Qt::SortOrder previous) +{ + Q_UNUSED(current); + Q_UNUSED(previous); +} + #include "kitemmodelbase.moc" diff --git a/src/kitemviews/kitemmodelbase.h b/src/kitemviews/kitemmodelbase.h index de6e1bb1d..adb48669d 100644 --- a/src/kitemviews/kitemmodelbase.h +++ b/src/kitemviews/kitemmodelbase.h @@ -100,13 +100,21 @@ public: virtual bool supportsSorting() const; /** - * Sets the sor-role to \a role. The method KItemModelBase::onSortRoleChanged() will be + * Sets the sort-role to \a role. The method KItemModelBase::onSortRoleChanged() will be * called so that model-implementations can react on the sort-role change. Afterwards the * signal sortRoleChanged() will be emitted. */ void setSortRole(const QByteArray& role); QByteArray sortRole() const; + /** + * Sets the sort order to \a order. The method KItemModelBase::onSortOrderChanged() will be + * called so that model-implementations can react on the sort order change. Afterwards the + * signal sortOrderChanged() will be emitted. + */ + void setSortOrder(Qt::SortOrder order); + Qt::SortOrder sortOrder() const; + virtual QString roleDescription(const QByteArray& role) const; /** @@ -182,6 +190,7 @@ signals: void groupRoleChanged(const QByteArray& current, const QByteArray& previous); void sortRoleChanged(const QByteArray& current, const QByteArray& previous); + void sortOrderChanged(Qt::SortOrder current, Qt::SortOrder previous); protected: /** @@ -204,11 +213,27 @@ protected: */ virtual void onSortRoleChanged(const QByteArray& current, const QByteArray& previous); + /** + * Is invoked if the sort order has been changed by KItemModelBase::setSortOrder(). Allows + * to react on the changed sort order before the signal sortOrderChanged() will be emitted. + * The implementation must assure that the items are sorted by the order given by \a current. + * Usually the most efficient way is to emit a + * itemsRemoved() signal for all items, reorder the items internally and to emit a + * itemsInserted() signal afterwards. + */ + virtual void onSortOrderChanged(Qt::SortOrder current, Qt::SortOrder previous); + private: QByteArray m_groupRole; QByteArray m_sortRole; + Qt::SortOrder m_sortOrder; }; +inline Qt::SortOrder KItemModelBase::sortOrder() const +{ + return m_sortOrder; +} + #endif |
