blob: ad5d8683533884249c1fa2c9ab1e68eb1ea2dc77 [file] [log] [blame]
#include "frameaxiswidget.h"
#include <QPainter>
FrameAxisWidget::FrameAxisWidget(QWidget* parent) :
GraphAxisWidget(parent),
m_data(NULL)
{
setSelectable(GraphAxisWidget::Range);
}
void FrameAxisWidget::setDataProvider(FrameDataProvider* data)
{
delete m_data;
m_data = data;
}
void FrameAxisWidget::paintEvent(QPaintEvent *)
{
if (!m_data || m_orientation != GraphAxisWidget::Horizontal) {
/* TODO: Vertical axis support */
return;
}
QPainter painter(this);
painter.setPen(Qt::black);
painter.setBrush(Qt::lightGray);
painter.drawRect(0, 0, width() - 1, height() - 1);
qint64 range = m_valueEnd - m_valueBegin;
double dxdv = width() / (double)range;
double scroll = dxdv * m_valueBegin;
int lastLabel = -9999;
/* Iterate over frames, drawing a label when there is space to do so */
for (unsigned i = 0; i < m_data->size(); ++i) {
static const int padding = 4;
qint64 start = m_data->frameStart(i);
qint64 end = m_data->frameEnd(i);
bool visible = false;
if (start > m_valueEnd) {
break;
}
if (end < m_valueBegin) {
visible = false;
}
double left = dxdv * start;
double right = dxdv * end;
QString text = QString("%1").arg(i);
int width = painter.fontMetrics().width(text) + padding * 2;
if (right > scroll) {
visible = true;
}
if (left - lastLabel > width) {
lastLabel = left + width;
if (visible) {
int textX;
if (left < scroll && right - left > width) {
if (right - scroll > width) {
textX = 0;
} else {
textX = right - scroll - width;
}
} else {
textX = left - scroll;
}
painter.drawText(textX + padding, 0, width - padding, height() - 5, Qt::AlignLeft | Qt::AlignVCenter, text);
painter.drawLine(left - scroll, height() / 2, left - scroll, height() - 1);
}
} else if (visible) {
painter.drawLine(left - scroll, height() * 3/4.0, left - scroll, height() - 1);
}
}
/* Draw selection */
if (hasSelection()) {
double left = (dxdv * m_selectionState->start) - scroll;
double right = (dxdv * m_selectionState->end) - scroll;
painter.setPen(Qt::green);
if (left >= 0 && left <= width()) {
painter.drawLine(left, 0, left, height());
}
if (right >= 0 && right <= width()) {
painter.drawLine(right, 0, right, height());
}
}
}