diff options
| author | Peter Penz <[email protected]> | 2011-10-15 22:55:01 +0200 |
|---|---|---|
| committer | Peter Penz <[email protected]> | 2011-10-15 22:55:01 +0200 |
| commit | 283f97ac27c3cfe5c72682b0843503e31643a612 (patch) | |
| tree | 35325115a5e5c001e1e307acc580af572bad0ac1 /src/kitemviews | |
| parent | a49109b09a191b73f3fda8b65c29e9c6c9bd33d8 (diff) | |
Interface cleanups to prepare the return of "grouped sorting"
- Rename setCategorizedSorting() to setGroupedSorting()
- Change the model interface to allow enabling/disabling grouping
without the need to declare a role (the sort role will be taken).
- Add dummy group role implementation in KFileItemModel
The grouping code itself requires some cleanups and might crash
at the moment or lead to weird layouts.
Diffstat (limited to 'src/kitemviews')
| -rw-r--r-- | src/kitemviews/kfileitemmodel.cpp | 32 | ||||
| -rw-r--r-- | src/kitemviews/kfileitemmodel.h | 18 | ||||
| -rw-r--r-- | src/kitemviews/kitemlistview.cpp | 11 | ||||
| -rw-r--r-- | src/kitemviews/kitemlistview.h | 1 | ||||
| -rw-r--r-- | src/kitemviews/kitemlistviewlayouter.cpp | 26 | ||||
| -rw-r--r-- | src/kitemviews/kitemmodelbase.cpp | 43 | ||||
| -rw-r--r-- | src/kitemviews/kitemmodelbase.h | 45 |
7 files changed, 76 insertions, 100 deletions
diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp index ddb89533c..3a49135f9 100644 --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -31,11 +31,10 @@ #define KFILEITEMMODEL_DEBUG KFileItemModel::KFileItemModel(KDirLister* dirLister, QObject* parent) : - KItemModelBase(QByteArray(), "name", parent), + KItemModelBase("name", parent), m_dirLister(dirLister), m_naturalSorting(true), m_sortFoldersFirst(true), - m_groupRole(NoRole), m_sortRole(NameRole), m_caseSensitivity(Qt::CaseInsensitive), m_sortedItems(), @@ -127,16 +126,6 @@ bool KFileItemModel::setData(int index, const QHash<QByteArray, QVariant>& value return false; } -bool KFileItemModel::supportsGrouping() const -{ - return true; -} - -bool KFileItemModel::supportsSorting() const -{ - return true; -} - void KFileItemModel::setSortFoldersFirst(bool foldersFirst) { if (foldersFirst != m_sortFoldersFirst) { @@ -234,6 +223,20 @@ QString KFileItemModel::roleDescription(const QByteArray& role) const return descr; } +QList<QPair<int, QVariant> > KFileItemModel::groups() const +{ + // TODO: + QPair<int, QVariant> group1(0, "Group 1"); + QPair<int, QVariant> group2(5, "Group 2"); + QPair<int, QVariant> group3(10, "Group 3"); + + QList<QPair<int, QVariant> > groups; + groups.append(group1); + groups.append(group2); + groups.append(group3); + return groups; +} + KFileItem KFileItemModel::fileItem(int index) const { if (index >= 0 && index < count()) { @@ -403,10 +406,9 @@ void KFileItemModel::restoreExpandedUrls(const QSet<KUrl>& urls) m_restoredExpandedUrls = urls; } -void KFileItemModel::onGroupRoleChanged(const QByteArray& current, const QByteArray& previous) +void KFileItemModel::onGroupedSortingChanged(bool current) { - Q_UNUSED(previous); - m_groupRole = roleIndex(current); + Q_UNUSED(current); } void KFileItemModel::onSortRoleChanged(const QByteArray& current, const QByteArray& previous) diff --git a/src/kitemviews/kfileitemmodel.h b/src/kitemviews/kfileitemmodel.h index 4c36a2c21..7d10aad8e 100644 --- a/src/kitemviews/kfileitemmodel.h +++ b/src/kitemviews/kfileitemmodel.h @@ -55,18 +55,6 @@ public: virtual bool setData(int index, const QHash<QByteArray, QVariant>& values); /** - * @return True - * @reimp - */ - virtual bool supportsGrouping() const; - - /** - * @return True - * @reimp - */ - 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); @@ -84,6 +72,9 @@ public: /** @reimp */ virtual QString roleDescription(const QByteArray& role) const; + /** @reimp */ + virtual QList<QPair<int, QVariant> > groups() const; + /** * @return The file-item for the index \a index. If the index is in a valid * range it is assured that the file-item is not null. The runtime @@ -135,7 +126,7 @@ signals: void loadingCompleted(); protected: - virtual void onGroupRoleChanged(const QByteArray& current, const QByteArray& previous); + virtual void onGroupedSortingChanged(bool current); virtual void onSortRoleChanged(const QByteArray& current, const QByteArray& previous); virtual void onSortOrderChanged(Qt::SortOrder current, Qt::SortOrder previous); @@ -209,7 +200,6 @@ private: bool m_naturalSorting; bool m_sortFoldersFirst; - Role m_groupRole; Role m_sortRole; Qt::CaseSensitivity m_caseSensitivity; diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp index 6d1aeca24..a4cb4b041 100644 --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -845,6 +845,11 @@ void KItemListView::slotItemsChanged(const KItemRangeList& itemRanges, } } +void KItemListView::slotGroupedSortingChanged(bool current) +{ + m_grouped = current; +} + void KItemListView::slotCurrentChanged(int current, int previous) { Q_UNUSED(previous); @@ -1101,11 +1106,13 @@ void KItemListView::setModel(KItemModelBase* model) this, SLOT(slotItemsRemoved(KItemRangeList))); disconnect(m_model, SIGNAL(itemsMoved(KItemRange,QList<int>)), this, SLOT(slotItemsMoved(KItemRange,QList<int>))); + disconnect(m_model, SIGNAL(groupedSortingChanged(bool)), + this, SLOT(slotGroupedSortingChanged(bool))); } m_model = model; m_layouter->setModel(model); - m_grouped = !model->groupRole().isEmpty(); + m_grouped = model->groupedSorting(); if (m_model) { connect(m_model, SIGNAL(itemsChanged(KItemRangeList,QSet<QByteArray>)), @@ -1116,6 +1123,8 @@ void KItemListView::setModel(KItemModelBase* model) this, SLOT(slotItemsRemoved(KItemRangeList))); connect(m_model, SIGNAL(itemsMoved(KItemRange,QList<int>)), this, SLOT(slotItemsMoved(KItemRange,QList<int>))); + connect(m_model, SIGNAL(groupedSortingChanged(bool)), + this, SLOT(slotGroupedSortingChanged(bool))); } onModelChanged(model, previous); diff --git a/src/kitemviews/kitemlistview.h b/src/kitemviews/kitemlistview.h index e1678145d..c18f8cb84 100644 --- a/src/kitemviews/kitemlistview.h +++ b/src/kitemviews/kitemlistview.h @@ -253,6 +253,7 @@ protected slots: const QSet<QByteArray>& roles); private slots: + void slotGroupedSortingChanged(bool current); void slotCurrentChanged(int current, int previous); void slotSelectionChanged(const QSet<int>& current, const QSet<int>& previous); void slotAnimationFinished(QGraphicsWidget* widget, diff --git a/src/kitemviews/kitemlistviewlayouter.cpp b/src/kitemviews/kitemlistviewlayouter.cpp index f829824f0..30881abfd 100644 --- a/src/kitemviews/kitemlistviewlayouter.cpp +++ b/src/kitemviews/kitemlistviewlayouter.cpp @@ -332,18 +332,16 @@ void KItemListViewLayouter::doLayout() m_maximumItemOffset = 0; } - m_grouped = !m_model->groupRole().isEmpty(); - /*if (m_grouped) { + m_grouped = m_model->groupedSorting(); + if (m_grouped) { createGroupHeaders(); const int lastGroupItemCount = m_model->count() - m_groups.last().firstItemIndex; - m_maximumOffset = m_groups.last().y + (lastGroupItemCount / m_columnCount) * m_rowHeight; + m_maximumScrollOffset = m_groups.last().y + (lastGroupItemCount / m_columnCount) * itemSize.height(); if (lastGroupItemCount % m_columnCount != 0) { - m_maximumOffset += m_rowHeight; + m_maximumScrollOffset += itemSize.height(); } - } else {*/ - // m_maximumOffset = m_minimumRowHeight * rowCount; - //} + } #ifdef KITEMLISTVIEWLAYOUTER_DEBUG kDebug() << "[TIME] doLayout() for " << m_model->count() << "items:" << timer.elapsed(); @@ -480,7 +478,6 @@ void KItemListViewLayouter::updateGroupedVisibleIndexes() m_lastVisibleIndex = nextGroupIndex - 1; } } - //Q_ASSERT(m_lastVisibleIndex < m_model->count()); m_lastVisibleIndex = qBound(0, m_lastVisibleIndex, maxIndex); m_visibleIndexesDirty = false; @@ -491,14 +488,13 @@ void KItemListViewLayouter::createGroupHeaders() m_groups.clear(); m_groupIndexes.clear(); - // TODO: - QList<int> numbers; - numbers << 0 << 5 << 6 << 13 << 20 << 25 << 30 << 35 << 50; + const QList<QPair<int, QVariant> > groups = m_model->groups(); qreal y = 0; - for (int i = 0; i < numbers.count(); ++i) { + for (int i = 0; i < groups.count(); ++i) { + const int firstItemIndex = groups.at(i).first; if (i > 0) { - const int previousGroupItemCount = numbers[i] - m_groups.last().firstItemIndex; + const int previousGroupItemCount = firstItemIndex - m_groups.last().firstItemIndex; int previousGroupRowCount = previousGroupItemCount / m_columnCount; if (previousGroupItemCount % m_columnCount != 0) { ++previousGroupRowCount; @@ -509,11 +505,11 @@ void KItemListViewLayouter::createGroupHeaders() y += HeaderHeight; ItemGroup itemGroup; - itemGroup.firstItemIndex = numbers[i]; + itemGroup.firstItemIndex = firstItemIndex; itemGroup.y = y; m_groups.append(itemGroup); - m_groupIndexes.insert(itemGroup.firstItemIndex); + m_groupIndexes.insert(firstItemIndex); } } diff --git a/src/kitemviews/kitemmodelbase.cpp b/src/kitemviews/kitemmodelbase.cpp index 7bfe607a4..3e6114027 100644 --- a/src/kitemviews/kitemmodelbase.cpp +++ b/src/kitemviews/kitemmodelbase.cpp @@ -35,15 +35,15 @@ bool KItemRange::operator == (const KItemRange& other) const KItemModelBase::KItemModelBase(QObject* parent) : QObject(parent), - m_groupRole(), + m_groupedSorting(false), m_sortRole(), m_sortOrder(Qt::AscendingOrder) { } -KItemModelBase::KItemModelBase(const QByteArray& groupRole, const QByteArray& sortRole, QObject* parent) : +KItemModelBase::KItemModelBase(const QByteArray& sortRole, QObject* parent) : QObject(parent), - m_groupRole(groupRole), + m_groupedSorting(false), m_sortRole(sortRole), m_sortOrder(Qt::AscendingOrder) { @@ -60,34 +60,23 @@ bool KItemModelBase::setData(int index, const QHash<QByteArray, QVariant> &value return false; } -bool KItemModelBase::supportsGrouping() const +void KItemModelBase::setGroupedSorting(bool grouped) { - return false; -} - -void KItemModelBase::setGroupRole(const QByteArray& role) -{ - if (supportsGrouping() && role != m_groupRole) { - const QByteArray previous = m_groupRole; - m_groupRole = role; - onGroupRoleChanged(role, previous); - emit groupRoleChanged(role, previous); + if (m_groupedSorting != grouped) { + m_groupedSorting = grouped; + onGroupedSortingChanged(grouped); + emit groupedSortingChanged(grouped); } } -QByteArray KItemModelBase::groupRole() const -{ - return m_groupRole; -} - -bool KItemModelBase::supportsSorting() const +bool KItemModelBase::groupedSorting() const { - return false; + return m_groupedSorting; } void KItemModelBase::setSortRole(const QByteArray& role) { - if (supportsSorting() && role != m_sortRole) { + if (role != m_sortRole) { const QByteArray previous = m_sortRole; m_sortRole = role; onSortRoleChanged(role, previous); @@ -102,7 +91,7 @@ QByteArray KItemModelBase::sortRole() const void KItemModelBase::setSortOrder(Qt::SortOrder order) { - if (supportsSorting() && order != m_sortOrder) { + if (order != m_sortOrder) { const Qt::SortOrder previous = m_sortOrder; m_sortOrder = order; onSortOrderChanged(order, previous); @@ -115,6 +104,11 @@ QString KItemModelBase::roleDescription(const QByteArray& role) const return role; } +QList<QPair<int, QVariant> > KItemModelBase::groups() const +{ + return QList<QPair<int, QVariant> >(); +} + QMimeData* KItemModelBase::createMimeData(const QSet<int>& indexes) const { Q_UNUSED(indexes); @@ -134,10 +128,9 @@ bool KItemModelBase::supportsDropping(int index) const return false; } -void KItemModelBase::onGroupRoleChanged(const QByteArray& current, const QByteArray& previous) +void KItemModelBase::onGroupedSortingChanged(bool current) { Q_UNUSED(current); - Q_UNUSED(previous); } void KItemModelBase::onSortRoleChanged(const QByteArray& current, const QByteArray& previous) diff --git a/src/kitemviews/kitemmodelbase.h b/src/kitemviews/kitemmodelbase.h index 763a02efd..693ffb763 100644 --- a/src/kitemviews/kitemmodelbase.h +++ b/src/kitemviews/kitemmodelbase.h @@ -52,7 +52,7 @@ typedef QList<KItemRange> KItemRangeList; * * One item consists of a variable number of role/value-pairs. * - * A model can optionally provide sorting- and/or grouping-capabilities. + * A model can optionally provide sorting- and grouping-capabilities. */ class LIBDOLPHINPRIVATE_EXPORT KItemModelBase : public QObject { @@ -60,7 +60,7 @@ class LIBDOLPHINPRIVATE_EXPORT KItemModelBase : public QObject public: KItemModelBase(QObject* parent = 0); - KItemModelBase(const QByteArray& groupRole, const QByteArray& sortRole, QObject* parent = 0); + KItemModelBase(const QByteArray& sortRole, QObject* parent = 0); virtual ~KItemModelBase(); /** @return The number of items. */ @@ -78,26 +78,13 @@ public: virtual bool setData(int index, const QHash<QByteArray, QVariant>& values); /** - * @return True if the model supports grouping of data. Per default false is returned. - * If the model should support grouping it is necessary to overwrite - * this method to return true and to implement KItemModelBase::onGroupRoleChanged(). + * Enables/disables the grouped sorting. The method KItemModelBase::onGroupedSortingChanged() will be + * called so that model-implementations can react on the grouped-sorting change. Afterwards the + * signal groupedSortingChanged() will be emitted. If the grouped sorting is enabled, the method + * KItemModelBase::groups() must be implemented. */ - virtual bool supportsGrouping() const; - - /** - * Sets the group-role to \a role. The method KItemModelBase::onGroupRoleChanged() will be - * called so that model-implementations can react on the group-role change. Afterwards the - * signal groupRoleChanged() will be emitted. - */ - void setGroupRole(const QByteArray& role); - QByteArray groupRole() const; - - /** - * @return True if the model supports sorting of data. Per default false is returned. - * If the model should support sorting it is necessary to overwrite - * this method to return true and to implement KItemModelBase::onSortRoleChanged(). - */ - virtual bool supportsSorting() const; + void setGroupedSorting(bool grouped); + bool groupedSorting() const; /** * Sets the sort-role to \a role. The method KItemModelBase::onSortRoleChanged() will be @@ -121,6 +108,8 @@ public: */ virtual QString roleDescription(const QByteArray& role) const; + virtual QList<QPair<int, QVariant> > groups() const; + /** * @return MIME-data for the items given by \a indexes. The default implementation * returns 0. The ownership of the returned instance is in the hand of the @@ -192,20 +181,16 @@ signals: void itemsChanged(const KItemRangeList& itemRanges, const QSet<QByteArray>& roles); - void groupRoleChanged(const QByteArray& current, const QByteArray& previous); + void groupedSortingChanged(bool current); void sortRoleChanged(const QByteArray& current, const QByteArray& previous); void sortOrderChanged(Qt::SortOrder current, Qt::SortOrder previous); protected: /** - * Is invoked if the group role has been changed by KItemModelBase::setGroupRole(). Allows - * to react on the changed group role before the signal groupRoleChanged() will be emitted. - * The implementation must assure that the items are sorted in a way that they are grouped - * by the role 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. + * Is invoked if the grouped sorting has been changed by KItemModelBase::setGroupedSorting(). Allows + * to react on the changed grouped sorting before the signal groupedSortingChanged() will be emitted. */ - virtual void onGroupRoleChanged(const QByteArray& current, const QByteArray& previous); + virtual void onGroupedSortingChanged(bool current); /** * Is invoked if the sort role has been changed by KItemModelBase::setSortRole(). Allows @@ -228,7 +213,7 @@ protected: virtual void onSortOrderChanged(Qt::SortOrder current, Qt::SortOrder previous); private: - QByteArray m_groupRole; + bool m_groupedSorting; QByteArray m_sortRole; Qt::SortOrder m_sortOrder; }; |
