]> cloud.milkyroute.net Git - dolphin.git/commitdiff
KItemListHeader: Allow resizing and change of the sorting
authorPeter Penz <peter.penz19@gmail.com>
Thu, 22 Sep 2011 19:32:59 +0000 (21:32 +0200)
committerPeter Penz <peter.penz19@gmail.com>
Thu, 22 Sep 2011 19:35:14 +0000 (21:35 +0200)
KItemListView does not react on the resizing yet. Toggling the
sort order and changing the sort role is already possible.

src/kitemviews/kitemlistcontroller.cpp
src/kitemviews/kitemlistheader.cpp
src/kitemviews/kitemlistheader_p.h

index ed23dd1f7116d4d44cc44521b8686c87e84785cb..4a81eaaa59037244e1f29c05e08957d70fdba235 100644 (file)
@@ -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());
         // 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();
             }
         }
                 startDragging();
             }
         }
index ab66b5374285c20f91d8e2fab3fa31290cabb486..c0b48c1a06fca681ef9fca53107d5de1e5ad1845 100644 (file)
@@ -21,7 +21,7 @@
 
 #include "kitemmodelbase.h"
 
 
 #include "kitemmodelbase.h"
 
-#include <QFontMetricsF>
+#include <QApplication>
 #include <QGraphicsSceneHoverEvent>
 #include <QPainter>
 #include <QStyleOptionHeader>
 #include <QGraphicsSceneHoverEvent>
 #include <QPainter>
 #include <QStyleOptionHeader>
@@ -35,7 +35,8 @@ KItemListHeader::KItemListHeader(QGraphicsWidget* parent) :
     m_visibleRolesWidths(),
     m_hoveredRoleIndex(-1),
     m_pressedRoleIndex(-1),
     m_visibleRolesWidths(),
     m_hoveredRoleIndex(-1),
     m_pressedRoleIndex(-1),
-    m_resizePressedRole(false)
+    m_roleOperation(NoRoleOperation),
+    m_pressedMousePos()
 {
     setAcceptHoverEvents(true);
 
 {
     setAcceptHoverEvents(true);
 
@@ -90,6 +91,17 @@ QList<QByteArray> KItemListHeader::visibleRoles() const
 void KItemListHeader::setVisibleRolesWidths(const QHash<QByteArray, qreal> rolesWidths)
 {
     m_visibleRolesWidths = rolesWidths;
 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();
 }
 
     update();
 }
 
@@ -133,21 +145,57 @@ void KItemListHeader::mousePressEvent(QGraphicsSceneMouseEvent* event)
 {
     event->accept();
     updatePressedRoleIndex(event->pos());
 {
     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);
 }
 
 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);
 }
 
 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)
 }
 
 void KItemListHeader::hoverEnterEvent(QGraphicsSceneHoverEvent* event)
@@ -182,12 +230,14 @@ void KItemListHeader::slotSortRoleChanged(const QByteArray& current, const QByte
 {
     Q_UNUSED(current);
     Q_UNUSED(previous);
 {
     Q_UNUSED(current);
     Q_UNUSED(previous);
+    update();
 }
 
 void KItemListHeader::slotSortOrderChanged(Qt::SortOrder current, Qt::SortOrder previous)
 {
     Q_UNUSED(current);
     Q_UNUSED(previous);
 }
 
 void KItemListHeader::slotSortOrderChanged(Qt::SortOrder current, Qt::SortOrder previous)
 {
     Q_UNUSED(current);
     Q_UNUSED(previous);
+    update();
 }
 
 void KItemListHeader::paintRole(QPainter* painter,
 }
 
 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;
     // 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;
     }
     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_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.sortIndicator = (m_model->sortOrder() == Qt::AscendingOrder) ?
                                 QStyleOptionHeader::SortDown : QStyleOptionHeader::SortUp;
-    }*/
+    }
     option.rect = rect.toRect();
 
     if (m_visibleRoles.count() == 1) {
     option.rect = rect.toRect();
 
     if (m_visibleRoles.count() == 1) {
@@ -228,11 +278,9 @@ void KItemListHeader::paintRole(QPainter* painter,
         option.position = QStyleOptionHeader::Middle;
     }
 
         option.position = QStyleOptionHeader::Middle;
     }
 
+    option.orientation = Qt::Horizontal;
     option.selectedPosition = QStyleOptionHeader::NotAdjacent;
     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);
 }
 
     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;
 }
 
     return pos.x() >= (x - grip) && pos.x() <= x;
 }
 
+qreal KItemListHeader::minimumRoleWidth() const
+{
+    QFontMetricsF fontMetrics(font());
+    return fontMetrics.averageCharWidth() * 5;
+}
+
 #include "kitemlistheader_p.moc"
 #include "kitemlistheader_p.moc"
index 7219722a78449dd39c8f0d8d156e6f5abaf47069..79b988464163dea4dedfd93a81d1c0ed23171e66 100644 (file)
@@ -68,15 +68,24 @@ private:
     void updateHoveredRoleIndex(const QPointF& pos);
     int roleIndexAt(const QPointF& pos) const;
     bool isAboveRoleGrip(const QPointF& pos, int roleIndex) const;
     void updateHoveredRoleIndex(const QPointF& pos);
     int roleIndexAt(const QPointF& pos) const;
     bool isAboveRoleGrip(const QPointF& pos, int roleIndex) const;
+    qreal minimumRoleWidth() const;
 
 private:
 
 private:
+    enum RoleOperation
+    {
+        NoRoleOperation,
+        ResizeRoleOperation,
+        MoveRoleOperation
+    };
+
     KItemModelBase* m_model;
     QList<QByteArray> m_visibleRoles;
     QHash<QByteArray, qreal> m_visibleRolesWidths;
 
     int m_hoveredRoleIndex;
     int m_pressedRoleIndex;
     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
 };
 
 #endif