From: Peter Penz Date: Thu, 22 Sep 2011 19:32:59 +0000 (+0200) Subject: KItemListHeader: Allow resizing and change of the sorting X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/ba1993af7cdf752ea0c25d5f439c6fc279699ed4?ds=inline 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. --- 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 +#include #include #include #include @@ -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 KItemListHeader::visibleRoles() const void KItemListHeader::setVisibleRolesWidths(const QHash rolesWidths) { m_visibleRolesWidths = rolesWidths; + + // Assure that no width is smaller than the minimum allowed width + const qreal minWidth = minimumRoleWidth(); + QMutableHashIterator 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 m_visibleRoles; QHash m_visibleRolesWidths; int m_hoveredRoleIndex; int m_pressedRoleIndex; - bool m_resizePressedRole; + RoleOperation m_roleOperation; + QPointF m_pressedMousePos; }; #endif