]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/kitemlistheaderwidget.cpp
Allow showing Nepomuk metadata inside views
[dolphin.git] / src / kitemviews / kitemlistheaderwidget.cpp
index 2f3058ac730cdd9934744692966840039d6b6507..2105b674c132a17f2da7a6e64a9a074dc3353fd7 100644 (file)
 
 KItemListHeaderWidget::KItemListHeaderWidget(QGraphicsWidget* parent) :
     QGraphicsWidget(parent),
-    m_automaticColumnResizing(false),
+    m_automaticColumnResizing(true),
     m_model(0),
+    m_offset(0),
     m_columns(),
-    m_columnsWidths(),
+    m_columnWidths(),
+    m_preferredColumnWidths(),
     m_hoveredRoleIndex(-1),
     m_pressedRoleIndex(-1),
     m_roleOperation(NoRoleOperation),
@@ -47,10 +49,6 @@ KItemListHeaderWidget::KItemListHeaderWidget(QGraphicsWidget* parent) :
     m_movingRole.index = -1;
 
     setAcceptHoverEvents(true);
-
-    QStyleOptionHeader option;
-    const QSize headerSize = style()->sizeFromContents(QStyle::CT_HeaderSection, &option, QSize());
-    resize(0, headerSize.height());
 }
 
 KItemListHeaderWidget::~KItemListHeaderWidget()
@@ -97,6 +95,13 @@ bool KItemListHeaderWidget::automaticColumnResizing() const
 
 void KItemListHeaderWidget::setColumns(const QList<QByteArray>& roles)
 {
+    foreach (const QByteArray& role, roles) {
+        if (!m_columnWidths.contains(role)) {
+            m_columnWidths.remove(role);
+            m_preferredColumnWidths.remove(role);
+        }
+    }
+
     m_columns = roles;
     update();
 }
@@ -113,15 +118,38 @@ void KItemListHeaderWidget::setColumnWidth(const QByteArray& role, qreal width)
         width = minWidth;
     }
 
-    if (m_columnsWidths.value(role) != width) {
-        m_columnsWidths.insert(role, width);
+    if (m_columnWidths.value(role) != width) {
+        m_columnWidths.insert(role, width);
         update();
     }
 }
 
 qreal KItemListHeaderWidget::columnWidth(const QByteArray& role) const
 {
-    return m_columnsWidths.value(role);
+    return m_columnWidths.value(role);
+}
+
+void KItemListHeaderWidget::setPreferredColumnWidth(const QByteArray& role, qreal width)
+{
+    m_preferredColumnWidths.insert(role, width);
+}
+
+qreal KItemListHeaderWidget::preferredColumnWidth(const QByteArray& role) const
+{
+    return m_preferredColumnWidths.value(role);
+}
+
+void KItemListHeaderWidget::setOffset(qreal offset)
+{
+    if (m_offset != offset) {
+        m_offset = offset;
+        update();
+    }
+}
+
+qreal KItemListHeaderWidget::offset() const
+{
+    return m_offset;
 }
 
 qreal KItemListHeaderWidget::minimumColumnWidth() const
@@ -143,10 +171,10 @@ void KItemListHeaderWidget::paint(QPainter* painter, const QStyleOptionGraphicsI
     painter->setFont(font());
     painter->setPen(palette().text().color());
 
-    qreal x = 0;
+    qreal x = -m_offset;
     int orderIndex = 0;
     foreach (const QByteArray& role, m_columns) {
-        const qreal roleWidth = m_columnsWidths.value(role);
+        const qreal roleWidth = m_columnWidths.value(role);
         const QRectF rect(x, 0, roleWidth, size().height());
         paintRole(painter, role, rect, orderIndex, widget);
         x += roleWidth;
@@ -247,10 +275,10 @@ void KItemListHeaderWidget::mouseMoveEvent(QGraphicsSceneMouseEvent* event)
             } else {
                 m_movingRole.pixmap = createRolePixmap(roleIndex);
 
-                qreal roleX = 0;
+                qreal roleX = -m_offset;
                 for (int i = 0; i < roleIndex; ++i) {
                     const QByteArray role = m_columns[i];
-                    roleX += m_columnsWidths.value(role);
+                    roleX += m_columnWidths.value(role);
                 }
 
                 m_movingRole.xDec = event->pos().x() - roleX;
@@ -263,12 +291,12 @@ void KItemListHeaderWidget::mouseMoveEvent(QGraphicsSceneMouseEvent* event)
     case ResizeRoleOperation: {
         const QByteArray pressedRole = m_columns[m_pressedRoleIndex];
 
-        qreal previousWidth = m_columnsWidths.value(pressedRole);
+        qreal previousWidth = m_columnWidths.value(pressedRole);
         qreal currentWidth = previousWidth;
         currentWidth += event->pos().x() - event->lastPos().x();
         currentWidth = qMax(minimumColumnWidth(), currentWidth);
 
-        m_columnsWidths.insert(pressedRole, currentWidth);
+        m_columnWidths.insert(pressedRole, currentWidth);
         update();
 
         emit columnWidthChanged(pressedRole, currentWidth, previousWidth);
@@ -344,10 +372,10 @@ void KItemListHeaderWidget::slotSortOrderChanged(Qt::SortOrder current, Qt::Sort
 }
 
 void KItemListHeaderWidget::paintRole(QPainter* painter,
-                                const QByteArray& role,
-                                const QRectF& rect,
-                                int orderIndex,
-                                QWidget* widget) const
+                                      const QByteArray& role,
+                                      const QRectF& rect,
+                                      int orderIndex,
+                                      QWidget* widget) const
 {
     // The following code is based on the code from QHeaderView::paintSection().
     // Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
@@ -411,10 +439,10 @@ int KItemListHeaderWidget::roleIndexAt(const QPointF& pos) const
 {
     int index = -1;
 
-    qreal x = 0;
+    qreal x = -m_offset;
     foreach (const QByteArray& role, m_columns) {
         ++index;
-        x += m_columnsWidths.value(role);
+        x += m_columnWidths.value(role);
         if (pos.x() <= x) {
             break;
         }
@@ -425,10 +453,10 @@ int KItemListHeaderWidget::roleIndexAt(const QPointF& pos) const
 
 bool KItemListHeaderWidget::isAboveRoleGrip(const QPointF& pos, int roleIndex) const
 {
-    qreal x = 0;
+    qreal x = -m_offset;
     for (int i = 0; i <= roleIndex; ++i) {
         const QByteArray role = m_columns[i];
-        x += m_columnsWidths.value(role);
+        x += m_columnWidths.value(role);
     }
 
     const int grip = style()->pixelMetric(QStyle::PM_HeaderGripMargin);
@@ -438,7 +466,7 @@ bool KItemListHeaderWidget::isAboveRoleGrip(const QPointF& pos, int roleIndex) c
 QPixmap KItemListHeaderWidget::createRolePixmap(int roleIndex) const
 {
     const QByteArray role = m_columns[roleIndex];
-    const qreal roleWidth = m_columnsWidths.value(role);
+    const qreal roleWidth = m_columnWidths.value(role);
     const QRect rect(0, 0, roleWidth, size().height());
 
     QImage image(rect.size(), QImage::Format_ARGB32_Premultiplied);
@@ -466,10 +494,10 @@ int KItemListHeaderWidget::targetOfMovingRole() const
     const int movingRight = movingLeft + movingWidth - 1;
 
     int targetIndex = 0;
-    qreal targetLeft = 0;
+    qreal targetLeft = -m_offset;
     while (targetIndex < m_columns.count()) {
         const QByteArray role = m_columns[targetIndex];
-        const qreal targetWidth = m_columnsWidths.value(role);
+        const qreal targetWidth = m_columnWidths.value(role);
         const qreal targetRight = targetLeft + targetWidth - 1;
 
         const bool isInTarget = (targetWidth >= movingWidth &&
@@ -492,13 +520,13 @@ int KItemListHeaderWidget::targetOfMovingRole() const
 
 qreal KItemListHeaderWidget::roleXPosition(const QByteArray& role) const
 {
-    qreal x = 0;
+    qreal x = -m_offset;
     foreach (const QByteArray& visibleRole, m_columns) {
         if (visibleRole == role) {
             return x;
         }
 
-        x += m_columnsWidths.value(visibleRole);
+        x += m_columnWidths.value(visibleRole);
     }
 
     return -1;