┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPeter Penz <[email protected]>2011-09-22 21:32:59 +0200
committerPeter Penz <[email protected]>2011-09-22 21:35:14 +0200
commitba1993af7cdf752ea0c25d5f439c6fc279699ed4 (patch)
tree46dbda6042699a33d3448b005ed51bcff51a5921 /src
parentf3c370de1981235aa843c35d03cead942a0cb58c (diff)
KItemListHeader: Allow resizing and change of the sorting
KItemListView does not react on the resizing yet. Toggling the sort order and changing the sort role is already possible.
Diffstat (limited to 'src')
-rw-r--r--src/kitemviews/kitemlistcontroller.cpp5
-rw-r--r--src/kitemviews/kitemlistheader.cpp80
-rw-r--r--src/kitemviews/kitemlistheader_p.h11
3 files changed, 78 insertions, 18 deletions
diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp
index ed23dd1f7..4a81eaaa5 100644
--- a/src/kitemviews/kitemlistcontroller.cpp
+++ b/src/kitemviews/kitemlistcontroller.cpp
@@ -362,10 +362,7 @@ bool KItemListController::mouseMoveEvent(QGraphicsSceneMouseEvent* event, const
// Check whether a dragging should be started
if (event->buttons() & Qt::LeftButton) {
const QPointF pos = transform.map(event->pos());
- const qreal minDragDiff = 4;
- const bool hasMinDragDiff = qAbs(pos.x() - m_pressedMousePos.x()) >= minDragDiff ||
- qAbs(pos.y() - m_pressedMousePos.y()) >= minDragDiff;
- if (hasMinDragDiff) {
+ if ((pos - m_pressedMousePos).manhattanLength() >= QApplication::startDragDistance()) {
startDragging();
}
}
diff --git a/src/kitemviews/kitemlistheader.cpp b/src/kitemviews/kitemlistheader.cpp
index ab66b5374..c0b48c1a0 100644
--- a/src/kitemviews/kitemlistheader.cpp
+++ b/src/kitemviews/kitemlistheader.cpp
@@ -21,7 +21,7 @@
#include "kitemmodelbase.h"
-#include <QFontMetricsF>
+#include <QApplication>
#include <QGraphicsSceneHoverEvent>
#include <QPainter>
#include <QStyleOptionHeader>
@@ -35,7 +35,8 @@ KItemListHeader::KItemListHeader(QGraphicsWidget* parent) :
m_visibleRolesWidths(),
m_hoveredRoleIndex(-1),
m_pressedRoleIndex(-1),
- m_resizePressedRole(false)
+ m_roleOperation(NoRoleOperation),
+ m_pressedMousePos()
{
setAcceptHoverEvents(true);
@@ -90,6 +91,17 @@ QList<QByteArray> KItemListHeader::visibleRoles() const
void KItemListHeader::setVisibleRolesWidths(const QHash<QByteArray, qreal> rolesWidths)
{
m_visibleRolesWidths = rolesWidths;
+
+ // Assure that no width is smaller than the minimum allowed width
+ const qreal minWidth = minimumRoleWidth();
+ QMutableHashIterator<QByteArray, qreal> it(m_visibleRolesWidths);
+ while (it.hasNext()) {
+ it.next();
+ if (it.value() < minWidth) {
+ m_visibleRolesWidths.insert(it.key(), minWidth);
+ }
+ }
+
update();
}
@@ -133,21 +145,57 @@ void KItemListHeader::mousePressEvent(QGraphicsSceneMouseEvent* event)
{
event->accept();
updatePressedRoleIndex(event->pos());
+ m_pressedMousePos = event->pos();
+ m_roleOperation = isAboveRoleGrip(m_pressedMousePos, m_pressedRoleIndex) ?
+ ResizeRoleOperation : NoRoleOperation;
}
void KItemListHeader::mouseReleaseEvent(QGraphicsSceneMouseEvent* event)
{
QGraphicsWidget::mouseReleaseEvent(event);
- if (m_pressedRoleIndex != -1) {
- m_pressedRoleIndex = -1;
- update();
+
+ if (m_pressedRoleIndex == -1) {
+ return;
}
+
+ if (m_roleOperation == NoRoleOperation) {
+ // Only a click has been done and no moving or resizing has been started
+ const QByteArray sortRole = m_model->sortRole();
+ const int sortRoleIndex = m_visibleRoles.indexOf(sortRole);
+ if (m_pressedRoleIndex == sortRoleIndex) {
+ // Toggle the sort order
+ const Qt::SortOrder toggled = (m_model->sortOrder() == Qt::AscendingOrder) ?
+ Qt::DescendingOrder : Qt::AscendingOrder;
+ m_model->setSortOrder(toggled);
+ } else {
+ // Change the sort role
+ const QByteArray sortRole = m_visibleRoles.at(m_pressedRoleIndex);
+ m_model->setSortRole(sortRole);
+ }
+ }
+
+ m_pressedRoleIndex = -1;
+ m_roleOperation = NoRoleOperation;
+ update();
}
void KItemListHeader::mouseMoveEvent(QGraphicsSceneMouseEvent* event)
{
QGraphicsWidget::mouseMoveEvent(event);
- updatePressedRoleIndex(event->pos());
+
+ if (m_roleOperation == ResizeRoleOperation) {
+ const QByteArray pressedRole = m_visibleRoles.at(m_pressedRoleIndex);
+
+ qreal roleWidth = m_visibleRolesWidths.value(pressedRole);
+ roleWidth += event->pos().x() - event->lastPos().x();
+ roleWidth = qMax(minimumRoleWidth(), roleWidth);
+
+ m_visibleRolesWidths.insert(pressedRole, roleWidth);
+ update();
+ } else if ((event->pos() - m_pressedMousePos).manhattanLength() >= QApplication::startDragDistance()) {
+ kDebug() << "Moving of role not supported yet";
+ m_roleOperation = MoveRoleOperation;
+ }
}
void KItemListHeader::hoverEnterEvent(QGraphicsSceneHoverEvent* event)
@@ -182,12 +230,14 @@ void KItemListHeader::slotSortRoleChanged(const QByteArray& current, const QByte
{
Q_UNUSED(current);
Q_UNUSED(previous);
+ update();
}
void KItemListHeader::slotSortOrderChanged(Qt::SortOrder current, Qt::SortOrder previous)
{
Q_UNUSED(current);
Q_UNUSED(previous);
+ update();
}
void KItemListHeader::paintRole(QPainter* painter,
@@ -199,7 +249,7 @@ void KItemListHeader::paintRole(QPainter* painter,
// Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
QStyleOptionHeader option;
option.section = orderIndex;
- option.state = QStyle::State_None | QStyle::State_Raised;
+ option.state = QStyle::State_None | QStyle::State_Raised | QStyle::State_Horizontal;
if (isEnabled()) {
option.state |= QStyle::State_Enabled;
}
@@ -212,10 +262,10 @@ void KItemListHeader::paintRole(QPainter* painter,
if (m_pressedRoleIndex == orderIndex) {
option.state |= QStyle::State_Sunken;
}
- /*if (m_model->sortRole() == role) {
+ if (m_model->sortRole() == role) {
option.sortIndicator = (m_model->sortOrder() == Qt::AscendingOrder) ?
QStyleOptionHeader::SortDown : QStyleOptionHeader::SortUp;
- }*/
+ }
option.rect = rect.toRect();
if (m_visibleRoles.count() == 1) {
@@ -228,11 +278,9 @@ void KItemListHeader::paintRole(QPainter* painter,
option.position = QStyleOptionHeader::Middle;
}
+ option.orientation = Qt::Horizontal;
option.selectedPosition = QStyleOptionHeader::NotAdjacent;
-
- const QString text = m_model->roleDescription(role);
- const int grip = style()->pixelMetric(QStyle::PM_HeaderGripMargin);
- option.text = option.fontMetrics.elidedText(text, Qt::ElideRight, option.rect.width() - grip);
+ option.text = m_model->roleDescription(role);
style()->drawControl(QStyle::CE_Header, &option, painter);
}
@@ -283,4 +331,10 @@ bool KItemListHeader::isAboveRoleGrip(const QPointF& pos, int roleIndex) const
return pos.x() >= (x - grip) && pos.x() <= x;
}
+qreal KItemListHeader::minimumRoleWidth() const
+{
+ QFontMetricsF fontMetrics(font());
+ return fontMetrics.averageCharWidth() * 5;
+}
+
#include "kitemlistheader_p.moc"
diff --git a/src/kitemviews/kitemlistheader_p.h b/src/kitemviews/kitemlistheader_p.h
index 7219722a7..79b988464 100644
--- a/src/kitemviews/kitemlistheader_p.h
+++ b/src/kitemviews/kitemlistheader_p.h
@@ -68,15 +68,24 @@ private:
void updateHoveredRoleIndex(const QPointF& pos);
int roleIndexAt(const QPointF& pos) const;
bool isAboveRoleGrip(const QPointF& pos, int roleIndex) const;
+ qreal minimumRoleWidth() const;
private:
+ enum RoleOperation
+ {
+ NoRoleOperation,
+ ResizeRoleOperation,
+ MoveRoleOperation
+ };
+
KItemModelBase* m_model;
QList<QByteArray> m_visibleRoles;
QHash<QByteArray, qreal> m_visibleRolesWidths;
int m_hoveredRoleIndex;
int m_pressedRoleIndex;
- bool m_resizePressedRole;
+ RoleOperation m_roleOperation;
+ QPointF m_pressedMousePos;
};
#endif