diff options
Diffstat (limited to 'chromium/third_party/skia/debugger/QT/SkListWidget.cpp')
-rw-r--r-- | chromium/third_party/skia/debugger/QT/SkListWidget.cpp | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/chromium/third_party/skia/debugger/QT/SkListWidget.cpp b/chromium/third_party/skia/debugger/QT/SkListWidget.cpp new file mode 100644 index 00000000000..b5f9038d692 --- /dev/null +++ b/chromium/third_party/skia/debugger/QT/SkListWidget.cpp @@ -0,0 +1,121 @@ + +/* + * 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); +} |