• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  
paint(QPainter * painter,const QStyleOptionViewItem & option,const QModelIndex & index) const12  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  
sizeHint(const QStyleOptionViewItem & option,const QModelIndex & index) const114  QSize SkListWidget::sizeHint (const QStyleOptionViewItem& option,
115                                const QModelIndex& index) const{
116      return QSize(200, 30);
117  }
118