SkListWidget.cpp revision 30d35f23ae390043462e2aa5fc6863a4621aa74d
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 12SkListWidget::SkListWidget(QObject *parent) {} 13 14SkListWidget::~SkListWidget() {} 15 16void SkListWidget::paint (QPainter *painter, 17 const QStyleOptionViewItem &option, 18 const QModelIndex &index) const { 19 /* We adjust the initial position of the list item so that 20 * we don't have overlapping top and bottom borders of concurrent 21 * widget items. */ 22 QRect r = option.rect; 23 r.adjust(-1,-1,1,0); 24 25 QPen linePen(QColor::fromRgb(211,211,211), 1, Qt::SolidLine); 26 QPen fontPen(QColor::fromRgb(51,51,51), 1, Qt::SolidLine); 27 QPen fontMarkedPen(Qt::white, 1, Qt::SolidLine); 28 29 // If selected 30 if(option.state & QStyle::State_Selected){ 31 QLinearGradient gradientSelected(r.left(),r.top(),r.left(),r.height()+r.top()); 32 gradientSelected.setColorAt(0.0, QColor::fromRgb(119,213,247)); 33 gradientSelected.setColorAt(0.9, QColor::fromRgb(27,134,183)); 34 gradientSelected.setColorAt(1.0, QColor::fromRgb(0,120,174)); 35 painter->setBrush(gradientSelected); 36 painter->drawRect(r); 37 38 painter->setPen(linePen); 39 painter->drawLine(r.topLeft(),r.topRight()); 40 painter->drawLine(r.topRight(),r.bottomRight()); 41 painter->drawLine(r.bottomLeft(),r.bottomRight()); 42 painter->drawLine(r.topLeft(),r.bottomLeft()); 43 44 painter->setPen(fontMarkedPen); 45 46 } else { 47 // Alternating background 48 painter->setBrush((index.row() % 2) ? Qt::white : QColor(252,252,252)); 49 painter->drawRect(r); 50 51 painter->setPen(linePen); 52 painter->drawLine(r.topLeft(),r.topRight()); 53 painter->drawLine(r.topRight(),r.bottomRight()); 54 painter->drawLine(r.bottomLeft(),r.bottomRight()); 55 painter->drawLine(r.topLeft(),r.bottomLeft()); 56 57 painter->setPen(fontPen); 58 } 59 60 QIcon breakpointIcon = 61 QIcon(qvariant_cast<QPixmap>(index.data(Qt::DecorationRole))); 62 QIcon deleteIcon = 63 QIcon(qvariant_cast<QPixmap>(index.data(Qt::UserRole + 2))); 64 int indent = index.data(Qt::UserRole + 3).toInt(); 65 66 QString drawCommandText = index.data(Qt::DisplayRole).toString(); 67 QString drawCommandNumber = index.data(Qt::UserRole + 1).toString(); 68 69 /* option.rect is a struct that Qt uses as a target to draw into. Following 70 * the format (x1,y1,x2,y2) x1 and y1 represent where the painter can start 71 * drawing. x2 and y2 represent where the drawing area has to terminate 72 * counting from the bottom right corner of each list item styled with this 73 * widget. A (x1,y1,0,0) rect would mean that the item being drawn would 74 * be pushed down into that bottom corner. Negative values in the x2,y2 75 * spot act as a margin for the bottom and right sides. Positive values in 76 * x1,y1 act as a margin for the top and left. The target area will not 77 * affect size of text but will scale icons. */ 78 static const int kImageSpace = 35; 79 static const int kCommandNumberSpace = 30; 80 81 // Breakpoint Icon 82 r = option.rect.adjusted(5, 10, -10, -10); 83 breakpointIcon.paint(painter, r, Qt::AlignVCenter|Qt::AlignLeft); 84 85 // Delete Icon 86 r = option.rect.adjusted(19, 10, -10, -10); 87 deleteIcon.paint(painter, r, Qt::AlignVCenter|Qt::AlignLeft); 88 89 // Draw Command 90 r = option.rect.adjusted(kImageSpace+kCommandNumberSpace+indent, 0, -10, -7); 91 painter->drawText(r.left(), r.top(), r.width(), r.height(), 92 Qt::AlignBottom|Qt::AlignLeft, drawCommandText, &r); 93 94 // Draw Command Number 95 r = option.rect.adjusted(kImageSpace, 0, -10, -7); 96 painter->drawText(r.left(), r.top(), r.width(), r.height(), 97 Qt::AlignBottom|Qt::AlignLeft, drawCommandNumber, &r); 98} 99 100QSize SkListWidget::sizeHint ( const QStyleOptionViewItem & option, 101 const QModelIndex & index ) const{ 102 return QSize(200, 30); 103} 104