diff --git a/src/UI/DocumentViews/TimingAxis.cc b/src/UI/DocumentViews/TimingAxis.cc index f9b861cf84786594acc5d9f8bace303dd8dd4ce4..d21b81144b13e092493d06032ebb987d87effad2 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; @@ -63,13 +64,31 @@ TimingAxis::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget * 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 50a3bad06d1dc80082308628cdfc028d5cded516..b045a0028a28dfce91b1090c4fc495df55a3aef6 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: void refreshTicks(); diff --git a/src/UI/DocumentViews/TimingScene.cc b/src/UI/DocumentViews/TimingScene.cc index 45fbec78198019f5bc87d562c73ff24f6cabb2b8..a83996580a72b0f78c620f7f4f13db7e21d7bb6c 100644 --- a/src/UI/DocumentViews/TimingScene.cc +++ b/src/UI/DocumentViews/TimingScene.cc @@ -70,14 +70,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 6d28bf1775967966a19e50e99ec07895be9ec863..3dc3f26cc0931d234032e0749e22a53483ddf0ec 100644 --- a/src/UI/DocumentViews/TimingScene.hh +++ b/src/UI/DocumentViews/TimingScene.hh @@ -36,6 +36,8 @@ public: TimingAxis *getAxis(); private: + 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;