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