Home | History | Annotate | Download | only in QT
      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     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 
    118 QSize SkListWidget::sizeHint (const QStyleOptionViewItem& option,
    119                               const QModelIndex& index) const{
    120     return QSize(200, 30);
    121 }
    122