From 481cdd43de1629d3cee34f9541ca98a069614c6c Mon Sep 17 00:00:00 2001
From: Elliu <elliu@hashi.re>
Date: Tue, 19 Jul 2022 20:19:09 +0200
Subject: [PATCH] AudioVisualizer: correctly always display ASS lines

Display the ASS lines on the AudioVisualizer no matter the construction
order of AudioVisualizer and AssDocumentView (connect it to
assSubDocumentChanged())
---
 src/UI/DocumentViews/AudioVisualizer.cc          |  6 ++++++
 .../DocumentViews/AudioVisualizer/TimingScene.cc | 16 +++++++++-------
 src/UI/VivyDocumentView.cc                       |  2 ++
 src/UI/VivyDocumentView.hh                       |  6 ++++++
 4 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/src/UI/DocumentViews/AudioVisualizer.cc b/src/UI/DocumentViews/AudioVisualizer.cc
index 74df942f..6e6dabd0 100644
--- a/src/UI/DocumentViews/AudioVisualizer.cc
+++ b/src/UI/DocumentViews/AudioVisualizer.cc
@@ -85,4 +85,10 @@ AudioVisualizer::printSpectrum(QImage pixmap, AudioContext::StreamPtr stream) no
             &TimingAxis::refreshTicks);
     connect(params->getRebuildSceneButton(), &QPushButton::released, timingScene,
             &TimingScene::rebuildScene);
+    // FIXME: should we replace rootView with a shared_ptr
+    // or is this expected weak_ptr usage?
+    if (auto p = rootView.lock())
+        if (auto sp = p.get())
+            connect(sp, &VivyDocumentView::assSubDocumentChanged, timingScene,
+                    &TimingScene::rebuildScene);
 }
diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingScene.cc b/src/UI/DocumentViews/AudioVisualizer/TimingScene.cc
index 3f16407d..3aee8bbc 100644
--- a/src/UI/DocumentViews/AudioVisualizer/TimingScene.cc
+++ b/src/UI/DocumentViews/AudioVisualizer/TimingScene.cc
@@ -38,13 +38,6 @@ TimingScene::TimingScene(QImage img_, AudioContext::StreamPtr stream,
     , audioStream(stream)
 {
     rebuildScene();
-
-    if (auto p = rootView.lock()) {
-        if (auto assLinesView = p->getAssLinesView()) {
-            connect(assLinesView, &AssLinesView::updateSelectedLines, this,
-                    &TimingScene::updateSelectedLines);
-        }
-    }
 }
 
 void
@@ -105,6 +98,15 @@ TimingScene::rebuildScene()
             }
         }
     }
+
+    // FIXME: do we need to "disconnect" it when assLinesView or *this is destroyed,
+    // or is this taken care of by Qt alone?
+    if (auto p = rootView.lock()) {
+        if (auto assLinesView = p->getAssLinesView()) {
+            connect(assLinesView, &AssLinesView::updateSelectedLines, this,
+                    &TimingScene::updateSelectedLines);
+        }
+    }
 }
 
 void
diff --git a/src/UI/VivyDocumentView.cc b/src/UI/VivyDocumentView.cc
index 0e977afe..dcc34cde 100644
--- a/src/UI/VivyDocumentView.cc
+++ b/src/UI/VivyDocumentView.cc
@@ -125,6 +125,8 @@ VivyDocumentView::loadAssView() noexcept
     assModel.reset(new AssLinesModel(document->getAssSubDocument()->getLines()));
     Utils::deleteInternalWidget(assLines);
     assLines->setWidget(new AssLinesView(assModel.get(), assLines));
+
+    emit assSubDocumentChanged();
 }
 
 void
diff --git a/src/UI/VivyDocumentView.hh b/src/UI/VivyDocumentView.hh
index c0dab04d..54adc495 100644
--- a/src/UI/VivyDocumentView.hh
+++ b/src/UI/VivyDocumentView.hh
@@ -65,5 +65,11 @@ public:
     }
 
     AssLinesModel *getAssLinesModel() const noexcept { return assModel.get(); }
+
+signals:
+    // FIXME: fix default value or just send void?
+    void audioSubDocumentChanged(std::shared_ptr<AudioSubDocument> = nullptr);
+    void videoSubDocumentChanged(std::shared_ptr<VideoSubDocument> = nullptr);
+    void assSubDocumentChanged(std::shared_ptr<AssSubDocument> = nullptr);
 };
 }
-- 
GitLab