SkListWidget.cpp revision 30d35f23ae390043462e2aa5fc6863a4621aa74d
1
2/*
3 * Copyright 2012 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9
10#include "SkListWidget.h"
11
12SkListWidget::SkListWidget(QObject *parent) {}
13
14SkListWidget::~SkListWidget() {}
15
16void SkListWidget::paint (QPainter *painter,
17        const QStyleOptionViewItem &option,
18        const QModelIndex &index) const {
19    /* We adjust the initial position of the list item so that
20     * we don't have overlapping top and bottom borders of concurrent
21     * widget items. */
22    QRect r = option.rect;
23    r.adjust(-1,-1,1,0);
24
25    QPen linePen(QColor::fromRgb(211,211,211), 1, Qt::SolidLine);
26    QPen fontPen(QColor::fromRgb(51,51,51), 1, Qt::SolidLine);
27    QPen fontMarkedPen(Qt::white, 1, Qt::SolidLine);
28
29    // If selected
30    if(option.state & QStyle::State_Selected){
31        QLinearGradient gradientSelected(r.left(),r.top(),r.left(),r.height()+r.top());
32        gradientSelected.setColorAt(0.0, QColor::fromRgb(119,213,247));
33        gradientSelected.setColorAt(0.9, QColor::fromRgb(27,134,183));
34        gradientSelected.setColorAt(1.0, QColor::fromRgb(0,120,174));
35        painter->setBrush(gradientSelected);
36        painter->drawRect(r);
37
38        painter->setPen(linePen);
39        painter->drawLine(r.topLeft(),r.topRight());
40        painter->drawLine(r.topRight(),r.bottomRight());
41        painter->drawLine(r.bottomLeft(),r.bottomRight());
42        painter->drawLine(r.topLeft(),r.bottomLeft());
43
44        painter->setPen(fontMarkedPen);
45
46    } else {
47        // Alternating background
48        painter->setBrush((index.row() % 2) ? Qt::white : QColor(252,252,252));
49        painter->drawRect(r);
50
51        painter->setPen(linePen);
52        painter->drawLine(r.topLeft(),r.topRight());
53        painter->drawLine(r.topRight(),r.bottomRight());
54        painter->drawLine(r.bottomLeft(),r.bottomRight());
55        painter->drawLine(r.topLeft(),r.bottomLeft());
56
57        painter->setPen(fontPen);
58    }
59
60    QIcon breakpointIcon =
61            QIcon(qvariant_cast<QPixmap>(index.data(Qt::DecorationRole)));
62    QIcon deleteIcon =
63            QIcon(qvariant_cast<QPixmap>(index.data(Qt::UserRole + 2)));
64    int indent = index.data(Qt::UserRole + 3).toInt();
65
66    QString drawCommandText = index.data(Qt::DisplayRole).toString();
67    QString drawCommandNumber = index.data(Qt::UserRole + 1).toString();
68
69    /* option.rect is a struct that Qt uses as a target to draw into. Following
70     * the format (x1,y1,x2,y2) x1 and y1 represent where the painter can start
71     * drawing. x2 and y2 represent where the drawing area has to terminate
72     * counting from the bottom right corner of each list item styled with this
73     * widget. A (x1,y1,0,0) rect would mean that the item being drawn would
74     * be pushed down into that bottom corner. Negative values in the x2,y2
75     * spot act as a margin for the bottom and right sides. Positive values in
76     * x1,y1 act as a margin for the top and left. The target area will not
77     * affect size of text but will scale icons. */
78    static const int kImageSpace = 35;
79    static const int kCommandNumberSpace = 30;
80
81    // Breakpoint Icon
82    r = option.rect.adjusted(5, 10, -10, -10);
83    breakpointIcon.paint(painter, r, Qt::AlignVCenter|Qt::AlignLeft);
84
85    // Delete Icon
86    r = option.rect.adjusted(19, 10, -10, -10);
87    deleteIcon.paint(painter, r, Qt::AlignVCenter|Qt::AlignLeft);
88
89    // Draw Command
90    r = option.rect.adjusted(kImageSpace+kCommandNumberSpace+indent, 0, -10, -7);
91    painter->drawText(r.left(), r.top(), r.width(), r.height(),
92            Qt::AlignBottom|Qt::AlignLeft, drawCommandText, &r);
93
94    // Draw Command Number
95    r = option.rect.adjusted(kImageSpace, 0, -10, -7);
96    painter->drawText(r.left(), r.top(), r.width(), r.height(),
97            Qt::AlignBottom|Qt::AlignLeft, drawCommandNumber, &r);
98}
99
100QSize SkListWidget::sizeHint ( const QStyleOptionViewItem & option,
101        const QModelIndex & index ) const{
102    return QSize(200, 30);
103}
104