From 3b4c0d949354c7d5336b179eba8d9f4a5c70b440 Mon Sep 17 00:00:00 2001
From: Elliu <elliu@hashi.re>
Date: Mon, 17 Jan 2022 00:23:34 +0100
Subject: [PATCH] Properly (for the eyes) draw all lines, syl, and separators

---
 src/Lib/Ass/Syl.cc                            |  6 +++
 src/Lib/Ass/Syl.hh                            |  3 +-
 .../AudioVisualizer/TimingLine.cc             | 21 ++++++++-
 .../AudioVisualizer/TimingLine.hh             | 12 +++--
 .../AudioVisualizer/TimingScene.cc            | 12 ++++-
 .../AudioVisualizer/TimingScene.hh            |  1 -
 .../AudioVisualizer/TimingSeparator.cc        | 44 +++++++++++++++++--
 .../AudioVisualizer/TimingSeparator.hh        | 19 ++++++--
 .../AudioVisualizer/TimingSyl.cc              | 10 +++--
 .../AudioVisualizer/TimingSyl.hh              | 12 +++--
 10 files changed, 119 insertions(+), 21 deletions(-)

diff --git a/src/Lib/Ass/Syl.cc b/src/Lib/Ass/Syl.cc
index 65d29a85..2c5a3d21 100644
--- a/src/Lib/Ass/Syl.cc
+++ b/src/Lib/Ass/Syl.cc
@@ -35,3 +35,9 @@ Syl::getContent() const noexcept
 {
     return content;
 }
+
+quint64
+Syl::getDuration() const noexcept
+{
+    return duration;
+}
diff --git a/src/Lib/Ass/Syl.hh b/src/Lib/Ass/Syl.hh
index 461746e9..e112eef3 100644
--- a/src/Lib/Ass/Syl.hh
+++ b/src/Lib/Ass/Syl.hh
@@ -21,7 +21,7 @@ public:
         ReadAssTags // Read ass tags
     };
 
-    explicit Syl(const Syl &) noexcept = default;
+    //explicit Syl(const Syl &) noexcept = default; // FIXME: define copy contructor
     explicit Syl(Line *const, const QString &,
                  ConstructMode mode = ConstructMode::ReadAssTags) noexcept;
 
@@ -29,6 +29,7 @@ public:
     ~Syl() noexcept             = default;
 
     QString getContent() const noexcept;
+    quint64 getDuration() const noexcept;
 
 private:
     static quint64 getDurationFromString(const QString &) noexcept;
diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingLine.cc b/src/UI/DocumentViews/AudioVisualizer/TimingLine.cc
index 5d1b702a..12e2df3a 100644
--- a/src/UI/DocumentViews/AudioVisualizer/TimingLine.cc
+++ b/src/UI/DocumentViews/AudioVisualizer/TimingLine.cc
@@ -4,12 +4,29 @@
 #include <QGraphicsScene>
 
 #include "TimingUtils.hh"
+#include "TimingSyl.hh"
+#include "TimingSeparator.hh"
 
 using namespace Vivy;
 
-TimingLine::TimingLine(QGraphicsItem *parent)
-    : QGraphicsItem(parent)
+TimingLine::TimingLine(Ass::Line *lineptr, QGraphicsItem *parent)
+    : QGraphicsObject(parent)
+      , line(*lineptr)
 {
+    setPos(TimingUtils::posFromMs(int(line.getStart())*10), TimingUtils::axisHeight());
+    int currentTime = 0;
+    QVector<Ass::Syl> syls = line.getContent();
+    for (int i = 0; i < syls.size(); ++i){
+        int endSyl = currentTime + 10 * int(syls.at(i).getDuration());
+
+        TimingSyl* timingSyl = new TimingSyl(syls.at(i), currentTime, this);
+
+        // TODO: Here create the TimingSeparator and connect
+        TimingSeparator* timingSeparatorStart = new TimingSeparator(currentTime, i != 0 ? TimingSeparator::SeparatorStyle::Middle : TimingSeparator::SeparatorStyle::Start, this);
+        TimingSeparator* timingSeparatorEnd = new TimingSeparator(endSyl, i != syls.size()-1 ? TimingSeparator::SeparatorStyle::Middle : TimingSeparator::SeparatorStyle::End, this);
+
+        currentTime = endSyl;
+    }
 }
 
 QRectF
diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingLine.hh b/src/UI/DocumentViews/AudioVisualizer/TimingLine.hh
index 894a1431..6b8be066 100644
--- a/src/UI/DocumentViews/AudioVisualizer/TimingLine.hh
+++ b/src/UI/DocumentViews/AudioVisualizer/TimingLine.hh
@@ -1,15 +1,21 @@
 #pragma once
 
-#include <QGraphicsItem>
+#include <QGraphicsObject>
+
+#include "../../../Lib/Ass/Ass.hh"
 
 namespace Vivy
 {
-class TimingLine final : public QGraphicsItem {
+class TimingLine final : public QGraphicsObject {
+    Q_OBJECT
 public:
-    explicit TimingLine(QGraphicsItem *parent = nullptr);
+    explicit TimingLine(Ass::Line*, QGraphicsItem* = nullptr);
 
     QRectF boundingRect() const override;
     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
+
+private:
+    Ass::Line line;
 };
 
 }
diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingScene.cc b/src/UI/DocumentViews/AudioVisualizer/TimingScene.cc
index 78f5195e..53ea04fc 100644
--- a/src/UI/DocumentViews/AudioVisualizer/TimingScene.cc
+++ b/src/UI/DocumentViews/AudioVisualizer/TimingScene.cc
@@ -20,6 +20,10 @@
 
 #include "TimingUtils.hh"
 
+#include "TimingAxis.hh"
+#include "TimingCursor.hh"
+#include "TimingLine.hh"
+
 using namespace Vivy;
 
 TimingScene::TimingScene(QWidget *parent) noexcept
@@ -60,7 +64,7 @@ TimingScene::rebuildScene()
 
     TimingUtils::setAudioHeight(pixmap.height());
     TimingUtils::setAudioWidth(img.width());
-    TimingUtils::setAudioLength(audioStream->getLength());
+    TimingUtils::setAudioLength(int(audioStream->getLength()));
 
     ax = new TimingAxis();
     addItem(ax);
@@ -76,7 +80,11 @@ TimingScene::rebuildScene()
     if (auto assDocument = currentVivyDocument->getAssSubDocument()) {
         QVector<Ass::LinePtr> lines = assDocument->getLines();
         for (int i = 0; i < lines.size(); ++i) {
-            if (auto line = lines.at(i).get()) {}
+            if (auto line = lines.at(i).get()) {
+                TimingLine* timingLine = new TimingLine(line);
+                addItem(timingLine);
+                // TODO: Here connect timingLine.linechanged to lineassmodel or something
+            }
         }
     }
 }
diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingScene.hh b/src/UI/DocumentViews/AudioVisualizer/TimingScene.hh
index 832923b1..bfa2f3ba 100644
--- a/src/UI/DocumentViews/AudioVisualizer/TimingScene.hh
+++ b/src/UI/DocumentViews/AudioVisualizer/TimingScene.hh
@@ -3,7 +3,6 @@
 #include "../../../Lib/Utils.hh"
 #include "../../../Lib/Audio.hh"
 #include "../../../Lib/Ass/Ass.hh"
-#include "TimingBar.hh"
 #include "TimingAxis.hh"
 #include "TimingCursor.hh"
 
diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingSeparator.cc b/src/UI/DocumentViews/AudioVisualizer/TimingSeparator.cc
index a06827c5..aae1083b 100644
--- a/src/UI/DocumentViews/AudioVisualizer/TimingSeparator.cc
+++ b/src/UI/DocumentViews/AudioVisualizer/TimingSeparator.cc
@@ -7,18 +7,56 @@
 
 using namespace Vivy;
 
-TimingSeparator::TimingSeparator(QGraphicsItem *parent)
-    : QGraphicsItem(parent)
+TimingSeparator::TimingSeparator(int time, SeparatorStyle style_, QGraphicsItem* parent)
+    : QGraphicsObject(parent)
+    , style(style_)
 {
+    setPos(TimingUtils::posFromMs(time), 0);
+
+    switch(style){
+    case SeparatorStyle::Start:
+        pen = QPen(QColor(0, 0, 255));
+        break;
+    case SeparatorStyle::Middle:
+        pen = QPen(QColor(180, 0, 180));
+        break;
+    case SeparatorStyle::End:
+        pen = QPen(QColor(255, 0, 0));
+        break;
+    }
+    // Putting even-size width seems to be undefined behaviour for pixel drawing : stick to odd
+    pen.setWidth(1);
 }
 
 QRectF
 TimingSeparator::boundingRect() const
 {
-    return QRectF();
+    return QRectF(-widthPaw, 0, 2*widthPaw, TimingUtils::audioHeight());
 }
 
 void
 TimingSeparator::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
 {
+    painter->setPen(pen);
+    int height = TimingUtils::audioHeight();
+
+    int top = 1 + pen.width()/2;
+    int bottom = height - 1 - pen.width()/2;
+
+    painter->drawLine(0, top, 0, bottom);
+
+    switch(style){
+    case SeparatorStyle::Start:
+        painter->drawLine(0, top, widthPaw, top);
+        painter->drawLine(0, bottom, widthPaw, bottom);
+        break;
+    case SeparatorStyle::Middle:
+        painter->drawLine(-widthPaw, top, widthPaw, top);
+        painter->drawLine(-widthPaw, bottom, widthPaw, bottom);
+        break;
+    case SeparatorStyle::End:
+        painter->drawLine(-widthPaw, top, 0, top);
+        painter->drawLine(-widthPaw, bottom, 0, bottom);
+        break;
+    }
 }
diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingSeparator.hh b/src/UI/DocumentViews/AudioVisualizer/TimingSeparator.hh
index a86b8e93..72d648c7 100644
--- a/src/UI/DocumentViews/AudioVisualizer/TimingSeparator.hh
+++ b/src/UI/DocumentViews/AudioVisualizer/TimingSeparator.hh
@@ -1,15 +1,28 @@
 #pragma once
 
-#include <QGraphicsItem>
+#include <QGraphicsObject>
 
 namespace Vivy
 {
-class TimingSeparator final : public QGraphicsItem {
+class TimingSeparator final : public QGraphicsObject {
+    Q_OBJECT
 public:
-    explicit TimingSeparator(QGraphicsItem *parent = nullptr);
+    enum class SeparatorStyle {
+        Start,
+        Middle,
+        End
+    };
+
+public:
+    explicit TimingSeparator(int, SeparatorStyle style = SeparatorStyle::Middle, QGraphicsItem *parent = nullptr);
 
     QRectF boundingRect() const override;
     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
+
+private:
+    SeparatorStyle style;
+    int widthPaw = 5;
+    QPen pen;
 };
 
 }
diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingSyl.cc b/src/UI/DocumentViews/AudioVisualizer/TimingSyl.cc
index 93dcc959..80ec74e1 100644
--- a/src/UI/DocumentViews/AudioVisualizer/TimingSyl.cc
+++ b/src/UI/DocumentViews/AudioVisualizer/TimingSyl.cc
@@ -4,21 +4,25 @@
 #include <QGraphicsScene>
 
 #include "TimingUtils.hh"
+#include "TimingSeparator.hh"
 
 using namespace Vivy;
 
-TimingSyl::TimingSyl(QGraphicsItem *parent)
-    : QGraphicsItem(parent)
+TimingSyl::TimingSyl(Ass::Syl syl_, int startTime, QGraphicsItem *parent)
+    : QGraphicsObject(parent)
+      , syl(syl_)
 {
+    setPos(TimingUtils::posFromMs(startTime), 0);
 }
 
 QRectF
 TimingSyl::boundingRect() const
 {
-    return QRectF();
+    return QRectF(0, 0, int(syl.getDuration()),TimingUtils::audioHeight());
 }
 
 void
 TimingSyl::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
 {
+    painter->drawText(boundingRect(), Qt::AlignCenter, syl.getContent());
 }
diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingSyl.hh b/src/UI/DocumentViews/AudioVisualizer/TimingSyl.hh
index 768beb42..fcf74aea 100644
--- a/src/UI/DocumentViews/AudioVisualizer/TimingSyl.hh
+++ b/src/UI/DocumentViews/AudioVisualizer/TimingSyl.hh
@@ -1,15 +1,21 @@
 #pragma once
 
-#include <QGraphicsItem>
+#include <QGraphicsObject>
+
+#include "../../../Lib/Ass/Ass.hh"
 
 namespace Vivy
 {
-class TimingSyl final : public QGraphicsItem {
+class TimingSyl final : public QGraphicsObject {
+    Q_OBJECT
 public:
-    explicit TimingSyl(QGraphicsItem *parent = nullptr);
+    explicit TimingSyl(Ass::Syl, int, QGraphicsItem *parent = nullptr);
 
     QRectF boundingRect() const override;
     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
+
+private:
+    Ass::Syl syl;
 };
 
 }
-- 
GitLab