From 54f13a63adc08ecd2fa5bdcf37ba7866df066f7d Mon Sep 17 00:00:00 2001
From: Elliu <elliu@hashi.re>
Date: Thu, 3 Feb 2022 18:07:02 +0100
Subject: [PATCH] WIP: connect timingLine to AssLinesModel

---
 src/Lib/Ass/Line.cc                            |  7 +++++++
 src/Lib/Ass/Line.hh                            |  3 ++-
 src/UI/DocumentViews/AssLinesModel.cc          | 18 ++++++++++++++++++
 src/UI/DocumentViews/AssLinesModel.hh          |  5 +++++
 .../AudioVisualizer/TimingLine.cc              |  7 ++++++-
 .../AudioVisualizer/TimingLine.hh              |  6 +++++-
 .../AudioVisualizer/TimingScene.cc             |  8 ++++++--
 src/UI/VivyDocumentView.hh                     |  5 +++++
 8 files changed, 54 insertions(+), 5 deletions(-)

diff --git a/src/Lib/Ass/Line.cc b/src/Lib/Ass/Line.cc
index 18d2a983..652c3d64 100644
--- a/src/Lib/Ass/Line.cc
+++ b/src/Lib/Ass/Line.cc
@@ -59,6 +59,12 @@ Line::Line(AssFactory *const factory, const QString &lineString)
     initSylFromString(___contentAsText);
 }
 
+void
+Line::generateLineText() noexcept
+{
+    // TODO : generate ___contentAsText from content
+}
+
 void
 Line::initSylFromString(const QString &line) noexcept
 {
@@ -163,4 +169,5 @@ void
 Line::setContent(const QVector<Syl> &syls) noexcept
 {
     content = syls;
+    generateLineText();
 }
diff --git a/src/Lib/Ass/Line.hh b/src/Lib/Ass/Line.hh
index 3ec42714..8462b532 100644
--- a/src/Lib/Ass/Line.hh
+++ b/src/Lib/Ass/Line.hh
@@ -29,7 +29,7 @@ class Line final {
     AssFactory *const assFactory;
 
 public:
-    explicit Line(const Line &) = default;
+    //explicit Line(const Line &) = default;
     explicit Line(AssFactory *const, const QString &);
     Line &operator=(const Line &) = delete;
 
@@ -53,5 +53,6 @@ public:
 
 private:
     void initSylFromString(const QString &) noexcept;
+    void generateLineText() noexcept;
 };
 }
diff --git a/src/UI/DocumentViews/AssLinesModel.cc b/src/UI/DocumentViews/AssLinesModel.cc
index c02396a5..47c1febe 100644
--- a/src/UI/DocumentViews/AssLinesModel.cc
+++ b/src/UI/DocumentViews/AssLinesModel.cc
@@ -20,6 +20,9 @@ AssLinesModel::Item::getLineText() const noexcept
     if (auto ptr = line.lock()) {
         for (const auto &syl : ptr->getContent()) {
             ret.append(syl.getContent());
+            ret.append("(");
+            ret.append(QString::number(syl.getDuration()));
+            ret.append(")");
             ret.append("|");
         }
     }
@@ -46,6 +49,12 @@ AssLinesModel::Item::getLineStyle() const noexcept
     return "";
 }
 
+void
+AssLinesModel::Item::setLine(Ass::LineWeakPtr l) noexcept
+{
+    line = l;
+}
+
 AssLinesModel::AssLinesModel(const QVector<Ass::LinePtr> &lines) noexcept
     : lineRealData(lines)
 {
@@ -142,3 +151,12 @@ AssLinesModel::flags(const QModelIndex &index) const noexcept
     [[maybe_unused]] const Item *item = static_cast<const Item *>(index.internalPointer());
     return Qt::ItemNeverHasChildren | Qt::ItemIsSelectable | QAbstractItemModel::flags(index);
 }
+
+void
+AssLinesModel::updateLine(int lineIndex, Ass::LinePtr line)
+{
+    qDebug() << data(index(lineIndex, 0), Qt::DisplayRole);
+    childs[lineIndex]->setLine(line);
+    qDebug() << data(index(lineIndex, 0), Qt::DisplayRole);
+    qDebug() << "";
+}
diff --git a/src/UI/DocumentViews/AssLinesModel.hh b/src/UI/DocumentViews/AssLinesModel.hh
index 60cc550b..ad45d4bd 100644
--- a/src/UI/DocumentViews/AssLinesModel.hh
+++ b/src/UI/DocumentViews/AssLinesModel.hh
@@ -27,6 +27,8 @@ private:
         QString getLineText() const noexcept;
         QString getLineStyle() const noexcept;
 
+        void setLine(Ass::LineWeakPtr) noexcept;
+
     private:
         Ass::LineWeakPtr line;
     };
@@ -52,5 +54,8 @@ public:
 private:
     QVector<Item *> childs;
     const QVector<Ass::LinePtr> &lineRealData;
+
+public slots:
+    void updateLine(int, Ass::LinePtr);
 };
 }
diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingLine.cc b/src/UI/DocumentViews/AudioVisualizer/TimingLine.cc
index 29cd6c30..752b8d40 100644
--- a/src/UI/DocumentViews/AudioVisualizer/TimingLine.cc
+++ b/src/UI/DocumentViews/AudioVisualizer/TimingLine.cc
@@ -12,9 +12,10 @@ using namespace Vivy;
     connect(sep, &TimingSeparator::enterPress, this, &TimingLine::sepEnterPress);                  \
     connect(sep, &TimingSeparator::exitPress, this, &TimingLine::sepExitPress);
 
-TimingLine::TimingLine(Ass::Line *lineptr, QGraphicsItem *parent)
+TimingLine::TimingLine(Ass::Line *lineptr, int index, QGraphicsItem *parent)
     : QGraphicsObject(parent)
     , line(*lineptr)
+      , lineIndex(index)
 {
     setPos(TimingUtils::posFromMs(int(line.getStart()) * 10), TimingUtils::axisHeight());
     int currentTime = 0;
@@ -164,5 +165,9 @@ TimingLine::requestMove(int sepIndex, qreal x)
 
     line.setContent(syls);
 
+    if (given){
+        emit lineChanged(lineIndex, std::make_shared<Ass::Line>(line));
+    }
+
     return given;
 }
diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingLine.hh b/src/UI/DocumentViews/AudioVisualizer/TimingLine.hh
index 18e68323..cda92bd8 100644
--- a/src/UI/DocumentViews/AudioVisualizer/TimingLine.hh
+++ b/src/UI/DocumentViews/AudioVisualizer/TimingLine.hh
@@ -11,7 +11,7 @@ namespace Vivy
 class TimingLine final : public QGraphicsObject {
     Q_OBJECT
 public:
-    explicit TimingLine(Ass::Line *, QGraphicsItem * = nullptr);
+    explicit TimingLine(Ass::Line *, int, QGraphicsItem * = nullptr);
 
     QRectF boundingRect() const override;
     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
@@ -20,12 +20,16 @@ private:
     Ass::Line line;
     QVector<TimingSeparator *> seps;
     QVector<TimingSyl *> timingSyls;
+    int lineIndex;
 
     qreal tempOffset{ 0 };
 
 public:
     qreal requestMove(int, qreal);
 
+signals:
+    void lineChanged(int, Ass::LinePtr);
+
 public slots:
     void timingSeparatorHasChanged(int, qreal);
     void sepEnterPress(int);
diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingScene.cc b/src/UI/DocumentViews/AudioVisualizer/TimingScene.cc
index f602b328..e1ddba5e 100644
--- a/src/UI/DocumentViews/AudioVisualizer/TimingScene.cc
+++ b/src/UI/DocumentViews/AudioVisualizer/TimingScene.cc
@@ -90,11 +90,15 @@ TimingScene::rebuildScene()
         QVector<Ass::LinePtr> lines = assDocument->getLines();
         for (int i = 0; i < lines.size(); ++i) {
             if (auto line = lines.at(i).get()) {
-                TimingLine *l = new TimingLine(line);
+                TimingLine *l = new TimingLine(line, i);
                 l->setVisible(false);
                 addItem(l);
                 timingLines.append(l);
-                // TODO: Here connect timingLine.linechanged to lineassmodel or something
+                if (auto p = rootView.lock()) {
+                    if (auto assLinesModel = p->getAssLinesModel()) {
+                        connect(l, &TimingLine::lineChanged, assLinesModel, &AssLinesModel::updateLine);
+                    }
+                }
             }
         }
     }
diff --git a/src/UI/VivyDocumentView.hh b/src/UI/VivyDocumentView.hh
index ea6b8bfd..72a3c025 100644
--- a/src/UI/VivyDocumentView.hh
+++ b/src/UI/VivyDocumentView.hh
@@ -63,5 +63,10 @@ public:
     {
         return assLines == nullptr ? nullptr : reinterpret_cast<AssLinesView *>(assLines->widget());
     }
+
+    AssLinesModel *getAssLinesModel() const noexcept
+    {
+        return assModel.get();
+    }
 };
 }
-- 
GitLab