diff --git a/src/UI/DocumentViews/AudioVisualizer.cc b/src/UI/DocumentViews/AudioVisualizer.cc index f48c885e230a0d43675bf75c0e05066c24722018..1ce4b217ee353b8c9c5bfe6374c717f7160aefd5 100644 --- a/src/UI/DocumentViews/AudioVisualizer.cc +++ b/src/UI/DocumentViews/AudioVisualizer.cc @@ -6,8 +6,8 @@ using namespace Vivy; #define MAXPIXVALUE 7 // Some magix AV magic stuff AudioVisualizer::AudioVisualizer(AudioContext::StreamPtr stream, QWidget *parent) - : audioStream(stream), - QWidget(parent) + : QWidget(parent) + , audioStream(stream) { if (!audioStream->isDecoded()) { qDebug() << "Need to decode data for stream" << audioStream->getStreamIndex(); diff --git a/src/UI/DocumentViews/TimingAxis.cc b/src/UI/DocumentViews/TimingAxis.cc index ca0ed613859d1a18f265dadbb45ea7f758825046..f7bdb827cd322f72df84fab3f6c085fbf12620f2 100644 --- a/src/UI/DocumentViews/TimingAxis.cc +++ b/src/UI/DocumentViews/TimingAxis.cc @@ -37,12 +37,13 @@ TimingAxis::refreshTicks() { qDebug() << "Refreshing ticks..."; int nbAvailableTicks = availableTicks.size(); - int minorTicksIndex = 0; QGraphicsScene *parentScene = scene(); + int minorTicksIndex = 0; + quint64 length { audioStream->getLength() }; + quint64 width { quint64(scene()->width()) }; if (parentScene != nullptr){ for (minorTicksIndex = 0; minorTicksIndex < nbAvailableTicks; minorTicksIndex++){ - if (parentScene->width() / (qreal(audioStream->getLength()) * availableTicks[minorTicksIndex]) < minBetweenMinor){ - minorTicksIndex = minorTicksIndex == 0 ? 0 : minorTicksIndex - 1; + if (width * quint64(availableTicks[minorTicksIndex]) / length >= minBetweenMinor){ break; } } @@ -52,7 +53,7 @@ TimingAxis::refreshTicks() minorTicks = availableTicks[minorTicksIndex]; majorTicks = availableTicks[minorTicksIndex + 1]; } else { - minorTicks = -1; + minorTicks = 0; majorTicks = availableTicks[minorTicksIndex]; } } @@ -61,31 +62,43 @@ void TimingAxis::paint(QPainter *painter, const QStyleOptionGraphicsItem *option if (audioStream->getLength() == 0) return; + qDebug() << "Painting axis..."; int ticks_base = y+ticksBase; int yText = ticks_base - majorTicksHeight - timeDigitsMargin; int majorTicksUp = ticks_base - majorTicksHeight; int minorTicksUp = ticks_base - minorTicksHeight; + quint64 length { audioStream->getLength() }; + quint64 width { quint64(scene()->width()) }; painter->drawLine(x0, ticks_base, x1, ticks_base); - for (int i = majorTicks; i < x1-x0; i += majorTicks){ - painter->drawText(QPoint(x0+i, yText), msToString(i)); - painter->drawLine(int(x0+i), majorTicksUp, int(x0+i), ticks_base); + for (quint64 i = 0; i < length; i += majorTicks){ + int pos = x0 + int(posFromMs(i, width, length)); + painter->drawText(QPoint(pos, yText), msToString(i)); + painter->drawLine(int(pos), majorTicksUp, int(pos), ticks_base); } - if (minorTicks >= 0) - for (int i = minorTicks; i < x1-x0; i += minorTicks) + if (minorTicks > 0){ + for (quint64 i = 0; i < length; i += minorTicks){ + quint64 pos = quint64(x0) + posFromMs(i, width, length); if (fmod(i, majorTicks) != 0) - painter->drawLine(int(x0+i), minorTicksUp, int(x0+i), ticks_base); + painter->drawLine(int(pos), minorTicksUp, int(pos), ticks_base); + } + } } QString -TimingAxis::msToString(int t) const noexcept +TimingAxis::msToString(quint64 i) const noexcept { - qDebug() << "GOT " << t; - QString ret(QString::number(t/1000) + QString(".") + QString::number(t % 1000 / majorTicks)); - if (t >= 60000) - ret.prepend(QString::number(t/60000) + QString(":")); - if (t >= 360000) - ret.prepend(QString::number(t/360000) + QString(":")); + QString ret(QStringLiteral("%1").arg(i % 60000 / 1000, i>= 60000 ? 2 : 1, 10, QLatin1Char('0')) + QString(".") + QString::number(i % 1000 / majorTicks)); + if (i >= 60000) + ret.prepend(QString::number(i/60000) + QString(":")); + if (i >= 360000) + ret.prepend(QString::number(i/360000) + QString(":")); return ret; } + +inline quint64 +TimingAxis::posFromMs(quint64 t, quint64 width, quint64 length) const noexcept +{ + return t * width / length; +} diff --git a/src/UI/DocumentViews/TimingAxis.hh b/src/UI/DocumentViews/TimingAxis.hh index 6a8ec7ef96cddc174228f616ccda6ff70bc7f1e1..c8694985e22cc82f464f910c5463c9fd050c58a9 100644 --- a/src/UI/DocumentViews/TimingAxis.hh +++ b/src/UI/DocumentViews/TimingAxis.hh @@ -34,10 +34,10 @@ private: * qPainter->drawLine() and qPainter->drawText() * restrict us to ints anyways */ - QVector<int> availableTicks = { 10, 100, 1000, 10000, 60000, 3600000, 86400000 }; - qreal minBetweenMinor{ 5 }; - int minorTicks; - int majorTicks; + QVector<quint64> availableTicks = { 10, 100, 1000, 10000, 60000, 3600000, 86400000 }; + quint64 minBetweenMinor{ 10 }; + quint64 minorTicks; + quint64 majorTicks; int minorTicksHeight { 3 }; int majorTicksHeight { 7 }; @@ -49,7 +49,8 @@ private: int x1{ 0 }; int y{ 0 }; - QString msToString(int t) const noexcept; + QString msToString(quint64 i) const noexcept; + inline quint64 posFromMs(quint64 t, quint64 width, quint64 length) const noexcept; protected: public slots: