]> git.cworth.org Git - apitrace/blob - gui/graphing/heatmapverticalaxiswidget.cpp
Merge remote-tracking branch 'github/master' into d2d
[apitrace] / gui / graphing / heatmapverticalaxiswidget.cpp
1 #include "heatmapverticalaxiswidget.h"
2
3 #include <qmath.h>
4 #include <QPainter>
5 #include <QMouseEvent>
6
7 HeatmapVerticalAxisWidget::HeatmapVerticalAxisWidget(QWidget* parent) :
8     GraphAxisWidget(parent),
9     m_data(NULL)
10 {
11     m_rowHeight = 20;
12 }
13
14 void HeatmapVerticalAxisWidget::setDataProvider(HeatmapDataProvider* data)
15 {
16     delete m_data;
17     m_data = data;
18
19     m_valueMin = 0;
20     m_valueMax = (data->dataRows() + data->headerRows()) * m_rowHeight;
21
22     m_valueBegin = m_valueMin;
23     m_valueEnd = m_valueMax;
24
25     update();
26 }
27
28 void HeatmapVerticalAxisWidget::mouseDoubleClickEvent(QMouseEvent *e)
29 {
30     if (e->pos().y() < m_data->headerRows() * m_rowHeight) {
31         m_selectionState->type = SelectionState::None;
32         emit selectionChanged();
33     } else {
34         int row = e->pos().y();
35         row -= m_data->headerRows() * m_rowHeight;
36         row += m_valueBegin;
37         row /= m_rowHeight;
38
39         if (row >= m_data->dataRows()) {
40             m_selectionState->type = SelectionState::None;
41             emit selectionChanged();
42         } else {
43             m_selectionState->type = SelectionState::Vertical;
44             m_selectionState->start = m_data->dataRowAt(row);
45             m_selectionState->end = m_selectionState->start;
46             emit selectionChanged();
47         }
48     }
49 }
50
51 void HeatmapVerticalAxisWidget::paintEvent(QPaintEvent *)
52 {
53     if (!m_data) {
54         return;
55     }
56
57     QPainter painter(this);
58     painter.setPen(Qt::black);
59     painter.setBrush(Qt::lightGray);
60     painter.drawRect(0, 0, width() - 1, height() - 1);
61
62     /* Draw scrollable rows */
63     painter.translate(0, m_data->headerRows() * m_rowHeight - m_valueBegin % m_rowHeight);
64     int rowStart = m_valueBegin / m_rowHeight;
65     int rowEnd = qMin<int>(qCeil(m_valueEnd / (double)m_rowHeight), m_data->dataRows());
66
67     for (unsigned i = rowStart; i < rowEnd; ++i) {
68         painter.drawText(0, 0, width(), m_rowHeight, Qt::AlignHCenter | Qt::AlignVCenter, m_data->dataLabel(i));
69         painter.drawLine(0, m_rowHeight, width(), m_rowHeight);
70         painter.translate(0, m_rowHeight);
71     }
72
73     /* Draw fixed position headers */
74     painter.resetTransform();
75     painter.drawRect(0, 0, width() - 1, m_data->headerRows() * m_rowHeight);
76
77     for (unsigned i = 0; i < m_data->headerRows(); ++i) {
78         painter.drawText(0, 0, width(), m_rowHeight, Qt::AlignHCenter | Qt::AlignVCenter, m_data->headerLabel(i));
79         painter.drawLine(0, m_rowHeight, width(), m_rowHeight);
80         painter.translate(0, m_rowHeight);
81     }
82 }