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