#include "frameaxiswidget.h" #include 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()); } } }