From d4367c15843c891affa830974a159d3dc7add06f Mon Sep 17 00:00:00 2001
From: Elliu <elliu@hashi.re>
Date: Sun, 10 Oct 2021 19:25:40 +0200
Subject: [PATCH] Add time digits to the timingAxis

For now it's not correct as it's calculating from pixels instead of from
ms, will need to rethink the way audio information is stored to fix it
---
 src/UI/DocumentViews/TimingAxis.cc  | 29 ++++++++++++++++++++++++-----
 src/UI/DocumentViews/TimingAxis.hh  | 24 +++++++++++++++++++-----
 src/UI/DocumentViews/TimingScene.cc | 14 ++++++++++----
 src/UI/DocumentViews/TimingScene.hh |  2 ++
 4 files changed, 55 insertions(+), 14 deletions(-)

diff --git a/src/UI/DocumentViews/TimingAxis.cc b/src/UI/DocumentViews/TimingAxis.cc
index f9b861cf..d21b8114 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 50a3bad0..b045a002 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 45fbec78..a8399658 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 6d28bf17..3dc3f26c 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;
-- 
GitLab