]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/kitemlistgroupheader.cpp
Group header improvements
[dolphin.git] / src / kitemviews / kitemlistgroupheader.cpp
index a63ad8d0913c79025a19dc206485020e5265fc3c..8eff399011ff37a19b00be012ee701b0952c85f5 100644 (file)
@@ -36,15 +36,13 @@ KItemListGroupHeader::KItemListGroupHeader(QGraphicsWidget* parent) :
     m_data(),
     m_styleOption(),
     m_scrollOrientation(Qt::Vertical),
-    m_leftBorderCache(0),
-    m_rightBorderCache(0),
-    m_outlineColor()
+    m_roleColor(),
+    m_roleBounds()
 {
 }
 
 KItemListGroupHeader::~KItemListGroupHeader()
 {
-    deleteCache();
 }
 
 void KItemListGroupHeader::setRole(const QByteArray& role)
@@ -97,8 +95,6 @@ void KItemListGroupHeader::setScrollOrientation(Qt::Orientation orientation)
         m_scrollOrientation = orientation;
         if (orientation == Qt::Vertical) {
             m_dirtyCache = true;
-        } else {
-            deleteCache();
         }
         scrollOrientationChanged(orientation, previous);
     }
@@ -114,24 +110,25 @@ void KItemListGroupHeader::paint(QPainter* painter, const QStyleOptionGraphicsIt
     Q_UNUSED(option);
     Q_UNUSED(widget);
 
-    if (m_scrollOrientation == Qt::Horizontal) {
-        Q_ASSERT(!m_leftBorderCache);
-        Q_ASSERT(!m_rightBorderCache);
-        return;
-    }
-
     if (m_dirtyCache) {
         updateCache();
     }
 
-    const int leftBorderX = m_leftBorderCache->width() + 1;
-    const int rightBorderX = size().width() - m_rightBorderCache->width() - 2;
+    if (m_scrollOrientation != Qt::Horizontal) {
+        painter->setPen(m_roleColor);
+        const qreal y = m_roleBounds.y() - m_styleOption.margin;
+        painter->drawLine(0, y, size().width() - 1, y);
+    }
+}
 
-    painter->setPen(m_outlineColor);
-    painter->drawLine(leftBorderX, 1, rightBorderX, 1);
+QRectF KItemListGroupHeader::roleBounds() const
+{
+    return m_roleBounds;
+}
 
-    painter->drawPixmap(1, 1, *m_leftBorderCache);
-    painter->drawPixmap(rightBorderX, 1, *m_rightBorderCache);
+QColor KItemListGroupHeader::roleColor() const
+{
+    return m_roleColor;
 }
 
 void KItemListGroupHeader::roleChanged(const QByteArray& current, const QByteArray& previous)
@@ -170,82 +167,26 @@ void KItemListGroupHeader::updateCache()
 {
     Q_ASSERT(m_dirtyCache);
 
-    deleteCache();
-
-    const int length = qMax(int(size().height() - 1), 1);
-    m_leftBorderCache = new QPixmap(length, length);
-    m_leftBorderCache->fill(Qt::transparent);
-
-    m_rightBorderCache = new QPixmap(length, length);
-    m_rightBorderCache->fill(Qt::transparent);
-
     // Calculate the outline color. No alphablending is used for
     // performance reasons.
     const QColor c1 = m_styleOption.palette.text().color();
     const QColor c2 = m_styleOption.palette.background().color();
     const int p1 = 35;
     const int p2 = 100 - p1;
-    m_outlineColor = QColor((c1.red()   * p1 + c2.red()   * p2) / 100,
-                            (c1.green() * p1 + c2.green() * p2) / 100,
-                            (c1.blue()  * p1 + c2.blue()  * p2) / 100);
-
-    // The drawing code is based on the code of DolphinCategoryDrawer from Dolphin 1.7
-    // Copyright (C) 2007 Rafael Fernández López <ereslibre@kde.org>
-    {
-        // Cache the left border as pixmap
-        QPainter painter(m_leftBorderCache);
-        painter.setPen(m_outlineColor);
-
-        // 1. Draw top horizontal line
-        painter.drawLine(3, 0, length, 0);
-
-        // 2. Draw vertical line with gradient
-        const QPoint start(0, 3);
-        QLinearGradient gradient(start, QPoint(0, length));
-        gradient.setColorAt(0, m_outlineColor);
-        gradient.setColorAt(1, Qt::transparent);
-        painter.fillRect(QRect(start, QSize(1, length - start.y())), gradient);
-
-        // 3. Draw arc
-        painter.setRenderHint(QPainter::Antialiasing);
-        QRectF arc(QPointF(0, 0), QSizeF(4, 4));
-        arc.translate(0.5, 0.5);
-        painter.drawArc(arc, 1440, 1440);
-    }
-
-    {
-        // Cache the right border as pixmap
-        QPainter painter(m_rightBorderCache);
-        painter.setPen(m_outlineColor);
-
-        // 1. Draw top horizontal line
-        painter.drawLine(0, 0, length - 3, 0);
-
-        // 2. Draw vertical line with gradient
-        const int right = length - 1;
-        const QPoint start(right, 3);
-        QLinearGradient gradient(start, QPoint(right, length));
-        gradient.setColorAt(0, m_outlineColor);
-        gradient.setColorAt(1, Qt::transparent);
-        painter.fillRect(QRect(start, QSize(1, length - start.y())), gradient);
-
-        // 3. Draw arc
-        painter.setRenderHint(QPainter::Antialiasing);
-        QRectF arc(QPointF(length - 5, 0), QSizeF(4, 4));
-        arc.translate(0.5, 0.5);
-        painter.drawArc(arc, 0, 1440);
-    }
+    m_roleColor = QColor((c1.red()   * p1 + c2.red()   * p2) / 100,
+                         (c1.green() * p1 + c2.green() * p2) / 100,
+                         (c1.blue()  * p1 + c2.blue()  * p2) / 100);
 
-    m_dirtyCache = false;
-}
+    const int margin = m_styleOption.margin;
+    const QFontMetrics fontMetrics(m_styleOption.font);
+    const qreal roleHeight = fontMetrics.height();
 
-void KItemListGroupHeader::deleteCache()
-{
-    delete m_leftBorderCache;
-    m_leftBorderCache = 0;
+    m_roleBounds = QRectF(margin,
+                          size().height() - roleHeight - margin,
+                          size().width() - 2 * margin,
+                          roleHeight);
 
-    delete m_rightBorderCache;
-    m_rightBorderCache = 0;
+    m_dirtyCache = false;
 }
 
 #include "kitemlistgroupheader.moc"