]> git.cworth.org Git - apitrace/blob - gui/graphing/frameaxiswidget.cpp
Merge remote-tracking branch 'github/master' into d2d
[apitrace] / gui / graphing / frameaxiswidget.cpp
1 #include "frameaxiswidget.h"
2
3 #include <QPainter>
4
5 FrameAxisWidget::FrameAxisWidget(QWidget* parent) :
6     GraphAxisWidget(parent),
7     m_data(NULL)
8 {
9     setSelectable(GraphAxisWidget::Range);
10 }
11
12 void FrameAxisWidget::setDataProvider(FrameDataProvider* data)
13 {
14     delete m_data;
15     m_data = data;
16 }
17
18 void FrameAxisWidget::paintEvent(QPaintEvent *)
19 {
20     if (!m_data || m_orientation != GraphAxisWidget::Horizontal) {
21         /* TODO: Vertical axis support */
22         return;
23     }
24
25     QPainter painter(this);
26     painter.setPen(Qt::black);
27     painter.setBrush(Qt::lightGray);
28     painter.drawRect(0, 0, width() - 1, height() - 1);
29
30     qint64 range = m_valueEnd - m_valueBegin;
31     double dxdv = width() / (double)range;
32     double scroll = dxdv * m_valueBegin;
33     int lastLabel = -9999;
34
35     /* Iterate over frames, drawing a label when there is space to do so */
36     for (unsigned i = 0; i < m_data->size(); ++i) {
37         static const int padding = 4;
38         qint64 start = m_data->frameStart(i);
39         qint64 end = m_data->frameEnd(i);
40         bool visible = false;
41
42         if (start > m_valueEnd) {
43             break;
44         }
45
46         if (end < m_valueBegin) {
47             visible = false;
48         }
49
50         double left = dxdv * start;
51         double right = dxdv * end;
52         QString text = QString("%1").arg(i);
53
54         int width = painter.fontMetrics().width(text) + padding * 2;
55
56         if (right > scroll) {
57             visible = true;
58         }
59
60         if (left - lastLabel > width) {
61             lastLabel = left + width;
62
63             if (visible) {
64                 int textX;
65
66                 if (left < scroll && right - left > width) {
67                     if (right - scroll > width) {
68                         textX = 0;
69                     } else {
70                         textX = right - scroll - width;
71                     }
72                 } else {
73                     textX = left - scroll;
74                 }
75
76                 painter.drawText(textX + padding, 0, width - padding, height() - 5, Qt::AlignLeft | Qt::AlignVCenter, text);
77                 painter.drawLine(left - scroll, height() / 2, left - scroll, height() - 1);
78             }
79         } else if (visible) {
80             painter.drawLine(left - scroll, height() * 3/4.0, left - scroll, height() - 1);
81         }
82     }
83
84     /* Draw selection */
85     if (hasSelection()) {
86         double left = (dxdv * m_selectionState->start) - scroll;
87         double right = (dxdv * m_selectionState->end) - scroll;
88
89         painter.setPen(Qt::green);
90
91         if (left >= 0 && left <= width()) {
92             painter.drawLine(left, 0, left, height());
93         }
94
95         if (right >= 0 && right <= width()) {
96             painter.drawLine(right, 0, right, height());
97         }
98     }
99 }