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 12 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 114 QSize SkListWidget::sizeHint (const QStyleOptionViewItem& option, 115 const QModelIndex& index) const{ 116 return QSize(200, 30); 117 } 118