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