diff --git a/src/UI/DocumentViews/TimingAxis.cc b/src/UI/DocumentViews/TimingAxis.cc index 797750ebc52648a27fdcc8d2b1cdd15e14cfbaab..5dc681100755406c8bfffb879bb3a2dda7e86e83 100644 --- a/src/UI/DocumentViews/TimingAxis.cc +++ b/src/UI/DocumentViews/TimingAxis.cc @@ -9,6 +9,7 @@ #include <QScrollArea> #include <QScrollBar> #include <QVBoxLayout> +#include <QTime> using namespace Vivy; @@ -56,13 +57,31 @@ void TimingAxis::paint(QPainter *painter, const QStyleOptionGraphicsItem *option if (audioLength == 0) return; - painter->drawLine(x0, y, x1, y); + int ticks_base = y+ticksBase; + int yText = ticks_base - majorTicksHeight - timeDigitsMargin; + int majorTicksUp = ticks_base - majorTicksHeight; + int minorTicksUp = ticks_base - minorTicksHeight; - for (qreal i = majorTicks; i < x1-x0; i += majorTicks){ - painter->drawLine(int(x0+i), y-5, int(x0+i), y+5); + 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); } if (minorTicks >= 0) - for (qreal i = minorTicks; i < x1-x0; i += minorTicks) + for (int i = minorTicks; i < x1-x0; i += minorTicks) if (fmod(i, majorTicks) != 0) - painter->drawLine(int(x0+i), y-2, int(x0+i), y+2); + painter->drawLine(int(x0+i), minorTicksUp, int(x0+i), ticks_base); +} + +QString +TimingAxis::msToString(int t) 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(":")); + return ret; } diff --git a/src/UI/DocumentViews/TimingAxis.hh b/src/UI/DocumentViews/TimingAxis.hh index b7502729460c0da84963d4aeb7b810681d039b94..05d9a3b4fd37b67340af8f8ffedec2ed9ca3bd41 100644 --- a/src/UI/DocumentViews/TimingAxis.hh +++ b/src/UI/DocumentViews/TimingAxis.hh @@ -25,17 +25,31 @@ public: private: static inline constexpr QColor axisColour = QColor(0, 0, 127); - QVector<qreal> availableTicks = { 10, 100, 1000, 10000, 60000, 3600000, 86400000 }; - qreal minBetweenMinor{ 5 }; - qreal minorTicks; - qreal majorTicks; - qreal penWidth{ 1 }; quint64 audioLength{ 0 }; + + /* + * We use ints here because + * 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; + + int minorTicksHeight { 3 }; + int majorTicksHeight { 7 }; + int timeDigitsHeight { 20 }; + int timeDigitsMargin { 3 }; + int ticksBase { 30 }; + int x0{ 0 }; int x1{ 0 }; int y { 0 }; + QString msToString(int t) const noexcept; + protected: public slots: diff --git a/src/UI/DocumentViews/TimingScene.cc b/src/UI/DocumentViews/TimingScene.cc index 4dc4b2e72ff65d0de6b537ad4addddd18a69d898..8ed4ac68974a1a4560cc7e74cd71a14cd89a2bc9 100644 --- a/src/UI/DocumentViews/TimingScene.cc +++ b/src/UI/DocumentViews/TimingScene.cc @@ -75,14 +75,20 @@ TimingScene::handleMousePressEventChar(QGraphicsSceneMouseEvent *, Ass::LinePtr) { } -qreal -TimingScene::timeFromPos(qreal x) +quint64 +TimingScene::timeFromPos(qreal x) const { - if (const qreal w = width(); x <= 0 || w <= 0) { + return timeFromPos(quint64(x)); +} + +quint64 +TimingScene::timeFromPos(quint64 x) const +{ + if (const quint64 w = quint64(width()); x <= 0 || w <= 0) { qCritical() << "Try avoid possible divide by zero in the time from position"; return 0; } else { - return x * qreal(soundLength) / w; + return x * soundLength / w; } } diff --git a/src/UI/DocumentViews/TimingScene.hh b/src/UI/DocumentViews/TimingScene.hh index 7c8f4bbde044dd61f6d9f10b0cda44f16b270f2f..1e9bda5e64945c6bb9c158f9a445644ab509e6a1 100644 --- a/src/UI/DocumentViews/TimingScene.hh +++ b/src/UI/DocumentViews/TimingScene.hh @@ -44,7 +44,8 @@ public: TimingAxis* getAxis(); private: - quint64 timeFromPos(qreal x); + inline quint64 timeFromPos(qreal x) const; + quint64 timeFromPos(quint64 x) const; void handleMousePressEventLine(QGraphicsSceneMouseEvent *, Ass::LinePtr) noexcept; void handleMousePressEventSyl(QGraphicsSceneMouseEvent *, Ass::LinePtr) noexcept; void handleMousePressEventChar(QGraphicsSceneMouseEvent *, Ass::LinePtr) noexcept;