1902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
2902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com/*
3902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com * Copyright 2012 Google Inc.
4902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com *
5902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com * Use of this source code is governed by a BSD-style license that can be
6902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com * found in the LICENSE file.
7902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com */
8902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
9902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
10902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "SkListWidget.h"
11902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
12e565de4fad5598890124daadf385930043269415chudy@google.comvoid SkListWidget::paint (QPainter *painter,
1357f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org                          const QStyleOptionViewItem &option,
1457f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org                          const QModelIndex &index) const {
15e565de4fad5598890124daadf385930043269415chudy@google.com    /* We adjust the initial position of the list item so that
16902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com     * we don't have overlapping top and bottom borders of concurrent
17e565de4fad5598890124daadf385930043269415chudy@google.com     * widget items. */
18902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    QRect r = option.rect;
19902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    r.adjust(-1,-1,1,0);
20902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
21902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    QPen linePen(QColor::fromRgb(211,211,211), 1, Qt::SolidLine);
22902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    QPen fontPen(QColor::fromRgb(51,51,51), 1, Qt::SolidLine);
23902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    QPen fontMarkedPen(Qt::white, 1, Qt::SolidLine);
24902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
25e565de4fad5598890124daadf385930043269415chudy@google.com    // If selected
26902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    if(option.state & QStyle::State_Selected){
27902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        QLinearGradient gradientSelected(r.left(),r.top(),r.left(),r.height()+r.top());
28902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        gradientSelected.setColorAt(0.0, QColor::fromRgb(119,213,247));
29902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        gradientSelected.setColorAt(0.9, QColor::fromRgb(27,134,183));
30902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        gradientSelected.setColorAt(1.0, QColor::fromRgb(0,120,174));
31902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        painter->setBrush(gradientSelected);
32902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        painter->drawRect(r);
33902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
34902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        painter->setPen(linePen);
35902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        painter->drawLine(r.topLeft(),r.topRight());
36902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        painter->drawLine(r.topRight(),r.bottomRight());
37902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        painter->drawLine(r.bottomLeft(),r.bottomRight());
38902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        painter->drawLine(r.topLeft(),r.bottomLeft());
39902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
40902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        painter->setPen(fontMarkedPen);
41902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
42902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    } else {
43e565de4fad5598890124daadf385930043269415chudy@google.com        // Alternating background
44e565de4fad5598890124daadf385930043269415chudy@google.com        painter->setBrush((index.row() % 2) ? Qt::white : QColor(252,252,252));
45902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        painter->drawRect(r);
46902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
47902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        painter->setPen(linePen);
48902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        painter->drawLine(r.topLeft(),r.topRight());
49902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        painter->drawLine(r.topRight(),r.bottomRight());
50902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        painter->drawLine(r.bottomLeft(),r.bottomRight());
51902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        painter->drawLine(r.topLeft(),r.bottomLeft());
52902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
53902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        painter->setPen(fontPen);
54902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    }
55902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
56e565de4fad5598890124daadf385930043269415chudy@google.com    QIcon breakpointIcon =
57e565de4fad5598890124daadf385930043269415chudy@google.com            QIcon(qvariant_cast<QPixmap>(index.data(Qt::DecorationRole)));
58e565de4fad5598890124daadf385930043269415chudy@google.com    QIcon deleteIcon =
597e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com            QIcon(qvariant_cast<QPixmap>(index.data(Qt::UserRole + 2)));
6030d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com    int indent = index.data(Qt::UserRole + 3).toInt();
61e565de4fad5598890124daadf385930043269415chudy@google.com
62e565de4fad5598890124daadf385930043269415chudy@google.com    QString drawCommandText = index.data(Qt::DisplayRole).toString();
6357f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    QString drawCommandNumber;
6457f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    if (kIndex_IndexStyle == fIndexStyle) {
6557f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org        drawCommandNumber = index.data(Qt::UserRole + 1).toString();
6657f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    } else {
6757f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org        drawCommandNumber = index.data(Qt::UserRole + 5).toString();
6857f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    }
69d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com    float time = index.data(Qt::UserRole + 4).toFloat();
70d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com    QString drawTime;
71e099bc403ca85be61cf23e67661e6a795fbcc40arobertphillips@google.com    drawTime.setNum(time, 'f', 2);
7220beb481ec72b9723c63f9ed5480adad0ff5a9a0robertphillips@google.com    drawTime += "%";
73e565de4fad5598890124daadf385930043269415chudy@google.com
74e565de4fad5598890124daadf385930043269415chudy@google.com    /* option.rect is a struct that Qt uses as a target to draw into. Following
75e565de4fad5598890124daadf385930043269415chudy@google.com     * the format (x1,y1,x2,y2) x1 and y1 represent where the painter can start
76e565de4fad5598890124daadf385930043269415chudy@google.com     * drawing. x2 and y2 represent where the drawing area has to terminate
77e565de4fad5598890124daadf385930043269415chudy@google.com     * counting from the bottom right corner of each list item styled with this
78e565de4fad5598890124daadf385930043269415chudy@google.com     * widget. A (x1,y1,0,0) rect would mean that the item being drawn would
79e565de4fad5598890124daadf385930043269415chudy@google.com     * be pushed down into that bottom corner. Negative values in the x2,y2
80e565de4fad5598890124daadf385930043269415chudy@google.com     * spot act as a margin for the bottom and right sides. Positive values in
81e565de4fad5598890124daadf385930043269415chudy@google.com     * x1,y1 act as a margin for the top and left. The target area will not
82e565de4fad5598890124daadf385930043269415chudy@google.com     * affect size of text but will scale icons. */
8330d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com    static const int kImageSpace = 35;
84e099bc403ca85be61cf23e67661e6a795fbcc40arobertphillips@google.com    static const int kCommandNumberSpace = 33;
85d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com    static const int kTimeSpace = 30;
86e565de4fad5598890124daadf385930043269415chudy@google.com
87e565de4fad5598890124daadf385930043269415chudy@google.com    // Breakpoint Icon
88902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    r = option.rect.adjusted(5, 10, -10, -10);
89e565de4fad5598890124daadf385930043269415chudy@google.com    breakpointIcon.paint(painter, r, Qt::AlignVCenter|Qt::AlignLeft);
90e565de4fad5598890124daadf385930043269415chudy@google.com
91e565de4fad5598890124daadf385930043269415chudy@google.com    // Delete Icon
92e565de4fad5598890124daadf385930043269415chudy@google.com    r = option.rect.adjusted(19, 10, -10, -10);
93e565de4fad5598890124daadf385930043269415chudy@google.com    deleteIcon.paint(painter, r, Qt::AlignVCenter|Qt::AlignLeft);
94902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
95e565de4fad5598890124daadf385930043269415chudy@google.com    // Draw Command
96d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com    if (time >= 0.0) {
97d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com        r = option.rect.adjusted(kImageSpace+kCommandNumberSpace+kTimeSpace+indent, 0, -10, -7);
98d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com    } else {
99d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com        // don't need time offset
100d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com        r = option.rect.adjusted(kImageSpace+kCommandNumberSpace+indent, 0, -10, -7);
101d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com    }
102e565de4fad5598890124daadf385930043269415chudy@google.com    painter->drawText(r.left(), r.top(), r.width(), r.height(),
10330d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com            Qt::AlignBottom|Qt::AlignLeft, drawCommandText, &r);
104902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
105e565de4fad5598890124daadf385930043269415chudy@google.com    // Draw Command Number
10630d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com    r = option.rect.adjusted(kImageSpace, 0, -10, -7);
107e565de4fad5598890124daadf385930043269415chudy@google.com    painter->drawText(r.left(), r.top(), r.width(), r.height(),
10857f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org                      Qt::AlignBottom|Qt::AlignLeft, drawCommandNumber, &r);
109d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com
110d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com    if (time >= 0.0) {
111d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com        // Draw time
112d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com        r = option.rect.adjusted(kImageSpace+kCommandNumberSpace, 0, -10, -7);
113d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com        painter->drawText(r.left(), r.top(), r.width(), r.height(),
11457f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org                          Qt::AlignBottom|Qt::AlignLeft, drawTime, &r);
115d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com    }
116902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
117902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
11857f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.orgQSize SkListWidget::sizeHint (const QStyleOptionViewItem& option,
11957f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org                              const QModelIndex& index) const{
120902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    return QSize(200, 30);
121902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
122