┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/kitemviews
diff options
context:
space:
mode:
authorPeter Penz <[email protected]>2011-10-15 22:55:01 +0200
committerPeter Penz <[email protected]>2011-10-15 22:55:01 +0200
commit283f97ac27c3cfe5c72682b0843503e31643a612 (patch)
tree35325115a5e5c001e1e307acc580af572bad0ac1 /src/kitemviews
parenta49109b09a191b73f3fda8b65c29e9c6c9bd33d8 (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.cpp32
-rw-r--r--src/kitemviews/kfileitemmodel.h18
-rw-r--r--src/kitemviews/kitemlistview.cpp11
-rw-r--r--src/kitemviews/kitemlistview.h1
-rw-r--r--src/kitemviews/kitemlistviewlayouter.cpp26
-rw-r--r--src/kitemviews/kitemmodelbase.cpp43
-rw-r--r--src/kitemviews/kitemmodelbase.h45
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;
};