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 
paint(QPainter * painter,const QStyleOptionViewItem & option,const QModelIndex & index) const12 void 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     drawCommandNumber = index.data(Qt::UserRole + 1).toString();
65     float time = index.data(Qt::UserRole + 4).toFloat();
66     QString drawTime;
67     drawTime.setNum(time, 'f', 2);
68     drawTime += "%";
69 
70     /* option.rect is a struct that Qt uses as a target to draw into. Following
71      * the format (x1,y1,x2,y2) x1 and y1 represent where the painter can start
72      * drawing. x2 and y2 represent where the drawing area has to terminate
73      * counting from the bottom right corner of each list item styled with this
74      * widget. A (x1,y1,0,0) rect would mean that the item being drawn would
75      * be pushed down into that bottom corner. Negative values in the x2,y2
76      * spot act as a margin for the bottom and right sides. Positive values in
77      * x1,y1 act as a margin for the top and left. The target area will not
78      * affect size of text but will scale icons. */
79     static const int kImageSpace = 35;
80     static const int kCommandNumberSpace = 33;
81     static const int kTimeSpace = 30;
82 
83     // Breakpoint Icon
84     r = option.rect.adjusted(5, 10, -10, -10);
85     breakpointIcon.paint(painter, r, Qt::AlignVCenter|Qt::AlignLeft);
86 
87     // Delete Icon
88     r = option.rect.adjusted(19, 10, -10, -10);
89     deleteIcon.paint(painter, r, Qt::AlignVCenter|Qt::AlignLeft);
90 
91     // Draw Command
92     if (time >= 0.0) {
93         r = option.rect.adjusted(kImageSpace+kCommandNumberSpace+kTimeSpace+indent, 0, -10, -7);
94     } else {
95         // don't need time offset
96         r = option.rect.adjusted(kImageSpace+kCommandNumberSpace+indent, 0, -10, -7);
97     }
98     painter->drawText(r.left(), r.top(), r.width(), r.height(),
99             Qt::AlignBottom|Qt::AlignLeft, drawCommandText, &r);
100 
101     // Draw Command Number
102     r = option.rect.adjusted(kImageSpace, 0, -10, -7);
103     painter->drawText(r.left(), r.top(), r.width(), r.height(),
104                       Qt::AlignBottom|Qt::AlignLeft, drawCommandNumber, &r);
105 
106     if (time >= 0.0) {
107         // Draw time
108         r = option.rect.adjusted(kImageSpace+kCommandNumberSpace, 0, -10, -7);
109         painter->drawText(r.left(), r.top(), r.width(), r.height(),
110                           Qt::AlignBottom|Qt::AlignLeft, drawTime, &r);
111     }
112 }
113 
sizeHint(const QStyleOptionViewItem & option,const QModelIndex & index) const114 QSize SkListWidget::sizeHint (const QStyleOptionViewItem& option,
115                               const QModelIndex& index) const{
116     return QSize(200, 30);
117 }
118