| |
| /* |
| * Copyright 2012 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| |
| #include "SkListWidget.h" |
| |
| void SkListWidget::paint (QPainter *painter, |
| const QStyleOptionViewItem &option, |
| const QModelIndex &index) const { |
| /* We adjust the initial position of the list item so that |
| * we don't have overlapping top and bottom borders of concurrent |
| * widget items. */ |
| QRect r = option.rect; |
| r.adjust(-1,-1,1,0); |
| |
| QPen linePen(QColor::fromRgb(211,211,211), 1, Qt::SolidLine); |
| QPen fontPen(QColor::fromRgb(51,51,51), 1, Qt::SolidLine); |
| QPen fontMarkedPen(Qt::white, 1, Qt::SolidLine); |
| |
| // If selected |
| if(option.state & QStyle::State_Selected){ |
| QLinearGradient gradientSelected(r.left(),r.top(),r.left(),r.height()+r.top()); |
| gradientSelected.setColorAt(0.0, QColor::fromRgb(119,213,247)); |
| gradientSelected.setColorAt(0.9, QColor::fromRgb(27,134,183)); |
| gradientSelected.setColorAt(1.0, QColor::fromRgb(0,120,174)); |
| painter->setBrush(gradientSelected); |
| painter->drawRect(r); |
| |
| painter->setPen(linePen); |
| painter->drawLine(r.topLeft(),r.topRight()); |
| painter->drawLine(r.topRight(),r.bottomRight()); |
| painter->drawLine(r.bottomLeft(),r.bottomRight()); |
| painter->drawLine(r.topLeft(),r.bottomLeft()); |
| |
| painter->setPen(fontMarkedPen); |
| |
| } else { |
| // Alternating background |
| painter->setBrush((index.row() % 2) ? Qt::white : QColor(252,252,252)); |
| painter->drawRect(r); |
| |
| painter->setPen(linePen); |
| painter->drawLine(r.topLeft(),r.topRight()); |
| painter->drawLine(r.topRight(),r.bottomRight()); |
| painter->drawLine(r.bottomLeft(),r.bottomRight()); |
| painter->drawLine(r.topLeft(),r.bottomLeft()); |
| |
| painter->setPen(fontPen); |
| } |
| |
| QIcon breakpointIcon = |
| QIcon(qvariant_cast<QPixmap>(index.data(Qt::DecorationRole))); |
| QIcon deleteIcon = |
| QIcon(qvariant_cast<QPixmap>(index.data(Qt::UserRole + 2))); |
| int indent = index.data(Qt::UserRole + 3).toInt(); |
| |
| QString drawCommandText = index.data(Qt::DisplayRole).toString(); |
| QString drawCommandNumber; |
| if (kIndex_IndexStyle == fIndexStyle) { |
| drawCommandNumber = index.data(Qt::UserRole + 1).toString(); |
| } else { |
| drawCommandNumber = index.data(Qt::UserRole + 5).toString(); |
| } |
| float time = index.data(Qt::UserRole + 4).toFloat(); |
| QString drawTime; |
| drawTime.setNum(time, 'f', 2); |
| drawTime += "%"; |
| |
| /* option.rect is a struct that Qt uses as a target to draw into. Following |
| * the format (x1,y1,x2,y2) x1 and y1 represent where the painter can start |
| * drawing. x2 and y2 represent where the drawing area has to terminate |
| * counting from the bottom right corner of each list item styled with this |
| * widget. A (x1,y1,0,0) rect would mean that the item being drawn would |
| * be pushed down into that bottom corner. Negative values in the x2,y2 |
| * spot act as a margin for the bottom and right sides. Positive values in |
| * x1,y1 act as a margin for the top and left. The target area will not |
| * affect size of text but will scale icons. */ |
| static const int kImageSpace = 35; |
| static const int kCommandNumberSpace = 33; |
| static const int kTimeSpace = 30; |
| |
| // Breakpoint Icon |
| r = option.rect.adjusted(5, 10, -10, -10); |
| breakpointIcon.paint(painter, r, Qt::AlignVCenter|Qt::AlignLeft); |
| |
| // Delete Icon |
| r = option.rect.adjusted(19, 10, -10, -10); |
| deleteIcon.paint(painter, r, Qt::AlignVCenter|Qt::AlignLeft); |
| |
| // Draw Command |
| if (time >= 0.0) { |
| r = option.rect.adjusted(kImageSpace+kCommandNumberSpace+kTimeSpace+indent, 0, -10, -7); |
| } else { |
| // don't need time offset |
| r = option.rect.adjusted(kImageSpace+kCommandNumberSpace+indent, 0, -10, -7); |
| } |
| painter->drawText(r.left(), r.top(), r.width(), r.height(), |
| Qt::AlignBottom|Qt::AlignLeft, drawCommandText, &r); |
| |
| // Draw Command Number |
| r = option.rect.adjusted(kImageSpace, 0, -10, -7); |
| painter->drawText(r.left(), r.top(), r.width(), r.height(), |
| Qt::AlignBottom|Qt::AlignLeft, drawCommandNumber, &r); |
| |
| if (time >= 0.0) { |
| // Draw time |
| r = option.rect.adjusted(kImageSpace+kCommandNumberSpace, 0, -10, -7); |
| painter->drawText(r.left(), r.top(), r.width(), r.height(), |
| Qt::AlignBottom|Qt::AlignLeft, drawTime, &r); |
| } |
| } |
| |
| QSize SkListWidget::sizeHint (const QStyleOptionViewItem& option, |
| const QModelIndex& index) const{ |
| return QSize(200, 30); |
| } |