From fe686ce3ae8039752765f4af8748effa94ba502b Mon Sep 17 00:00:00 2001
From: Elliu <goyard.louis@gmail.com>
Date: Thu, 24 Jun 2021 22:10:29 +0200
Subject: [PATCH] Add currentLine to TimingScene and basic placement action

---
 src/Ass/Line.h              | 11 +++++++++++
 src/AudioVisualizer.cc      |  2 +-
 src/Document/CRTPDocument.h |  3 ++-
 src/TimingScene.cc          | 24 +++++++++++++++++++-----
 src/TimingScene.hpp         | 10 ++++++++--
 src/TimingView.cc           |  4 ++--
 src/TimingView.hpp          |  2 +-
 7 files changed, 44 insertions(+), 12 deletions(-)

diff --git a/src/Ass/Line.h b/src/Ass/Line.h
index ce6c4e0c..6904659e 100644
--- a/src/Ass/Line.h
+++ b/src/Ass/Line.h
@@ -20,6 +20,17 @@ public:
     Line& operator=(const Line&) = delete;
 
     ~Line() noexcept = default;
+
+    inline void setStart(quint64 s){
+        start = s;
+        if (s > end)
+            end = s;
+    };
+    inline void setEnd(quint64 s){
+        end = s;
+        if (start > s)
+            start = s;
+    };
 };
 
 #endif // VIVY_ASS_LINE_H
diff --git a/src/AudioVisualizer.cc b/src/AudioVisualizer.cc
index 00c50feb..a4c664d4 100644
--- a/src/AudioVisualizer.cc
+++ b/src/AudioVisualizer.cc
@@ -16,7 +16,7 @@ AudioVisualizer::AudioVisualizer(QWidget *parent) noexcept
 void
 AudioVisualizer::printSpectrum(QImage pixmap) noexcept
 {
-    TimingView *timer        = new TimingView(pixmap);
+    TimingView *timer        = new TimingView(pixmap, 0);
     QVBoxLayout *layout = new QVBoxLayout;
 
     layout->addWidget(timer);
diff --git a/src/Document/CRTPDocument.h b/src/Document/CRTPDocument.h
index 51d2010e..2933f71b 100644
--- a/src/Document/CRTPDocument.h
+++ b/src/Document/CRTPDocument.h
@@ -8,6 +8,7 @@
 #include "../Utils.h"
 #include "../Ass/Ass.h"
 #include <QString>
+#include <memory>
 
 /* Types for the different documents */
 
@@ -100,7 +101,7 @@ class AssDocument final : public CRTPDocument<AssDocumentType, AssDocument> {
     friend CRTPDocument<AssDocumentType, AssDocument>;
 
 private:
-    QVector<Line> lines;
+    QVector<std::shared_ptr<Line>> lines;
 };
 
 #endif // VIVY_CRTP_DOCUMENT_H
diff --git a/src/TimingScene.cc b/src/TimingScene.cc
index a2e47d97..bffff44b 100644
--- a/src/TimingScene.cc
+++ b/src/TimingScene.cc
@@ -17,9 +17,10 @@ TimingScene::TimingScene(QWidget *parent) noexcept
 {
 }
 
-TimingScene::TimingScene(QImage img, QWidget *parent) noexcept
-    : QGraphicsScene(parent)
-    , img(img)
+TimingScene::TimingScene(QImage img, quint64 soundLength, QWidget *parent) noexcept
+    : QGraphicsScene(parent),
+    img(img),
+    soundLength(soundLength)
 {
     QPixmap pixmap(QPixmap::fromImage(img));
     backgroundImg = addPixmap(pixmap);
@@ -34,8 +35,21 @@ TimingScene::mousePressEvent(QGraphicsSceneMouseEvent *event) noexcept
 
     QGraphicsItem *got;
     if ((got = itemAt(pos, QTransform())) == nullptr || got == backgroundImg) {
-        addItem(new TimingBar(QLine(pos.x(), 0, pos.x(), height()),
-                                     event->button() == Qt::LeftButton ? startColour : endColour));
+        if (auto p = currentLine.lock()){
+            quint64 time = timeFromPos(pos.x());
+            switch (event->button()){
+                case Qt::LeftButton:
+                    p->setStart(time);
+                    break;
+
+                case Qt::RightButton:
+                    p->setEnd(time);
+                    break;
+
+                default:
+                    break;
+            }
+        }
     }
 
     QGraphicsScene::mousePressEvent(event);
diff --git a/src/TimingScene.hpp b/src/TimingScene.hpp
index 945e54a1..1858355b 100644
--- a/src/TimingScene.hpp
+++ b/src/TimingScene.hpp
@@ -2,12 +2,14 @@
 #define VIVY_TIMING_SCENE_H
 
 #include "TimingBar.h"
+#include "Ass/Line.h"
 
 #include <QWidget>
 #include <QColor>
 #include <QVector>
 #include <QGraphicsView>
 #include <QGraphicsScene>
+#include <memory>
 
 class QGraphicsPixmapItem;
 
@@ -19,19 +21,23 @@ public:
     static inline constexpr QColor endColour   = QColor(0, 127, 0);
 
     explicit TimingScene(QWidget *parent = nullptr) noexcept;
-    TimingScene(QImage img, QWidget *parent = nullptr) noexcept;
+    TimingScene(QImage, quint64, QWidget* = nullptr) noexcept;
     ~TimingScene() noexcept = default;
 
 private:
     QGraphicsPixmapItem *backgroundImg = nullptr;
     QImage img;
-    QVector<QLine> lines;
+    quint64 soundLength;
+    std::weak_ptr<Line> currentLine;
 
 public:
     inline QGraphicsPixmapItem* bg() { return backgroundImg; };
 
     void mousePressEvent(QGraphicsSceneMouseEvent *event) noexcept override;
 
+private:
+    inline quint64 timeFromPos(qreal x) { return x * soundLength / width(); };
+
 public slots:
 };
 
diff --git a/src/TimingView.cc b/src/TimingView.cc
index 9eedff0a..37827aa9 100644
--- a/src/TimingView.cc
+++ b/src/TimingView.cc
@@ -14,10 +14,10 @@
 
 #define TO_ADD_TO_IMAGE_HEIGHT 2 /* Used for alignement */
 
-TimingView::TimingView(QImage img, QWidget *parent) noexcept
+TimingView::TimingView(QImage img, quint64 soundLength, QWidget *parent) noexcept
     : QGraphicsView(parent)
 {
-    scene = new TimingScene(img);
+    scene = new TimingScene(img, soundLength);
     setFixedHeight(img.height());
     setMaximumHeight(img.height() + horizontalScrollBar()->height() - TO_ADD_TO_IMAGE_HEIGHT);
     setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
diff --git a/src/TimingView.hpp b/src/TimingView.hpp
index 74b4be8b..eb699282 100644
--- a/src/TimingView.hpp
+++ b/src/TimingView.hpp
@@ -22,7 +22,7 @@ public:
     static inline constexpr QColor startColour = QColor(127, 0, 127);
     static inline constexpr QColor endColour   = QColor(0, 127, 0);
 
-    explicit TimingView(QImage img, QWidget *parent = nullptr) noexcept;
+    explicit TimingView(QImage, quint64, QWidget* = nullptr) noexcept;
     ~TimingView() noexcept = default;
 
 private:
-- 
GitLab