From 37e02309fe47fbed05e1d048d003cb3f3bc29371 Mon Sep 17 00:00:00 2001 From: Elliu <elliu@hashi.re> Date: Wed, 26 Jan 2022 23:18:36 +0100 Subject: [PATCH] Keep shared_ptr to each DocumentViews to pass to child views --- src/UI/DocumentViews/AudioVisualizer.cc | 3 ++- src/UI/DocumentViews/AudioVisualizer.hh | 4 ++- src/UI/MainWindow.cc | 33 +++++++++++++++++-------- src/UI/MainWindow.hh | 2 ++ src/UI/VivyDocumentView.cc | 2 +- src/UI/VivyDocumentView.hh | 2 +- 6 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/UI/DocumentViews/AudioVisualizer.cc b/src/UI/DocumentViews/AudioVisualizer.cc index e34843b8..c5c5e69f 100644 --- a/src/UI/DocumentViews/AudioVisualizer.cc +++ b/src/UI/DocumentViews/AudioVisualizer.cc @@ -5,8 +5,9 @@ using namespace Vivy; #define MAXPIXVALUE 7 // Some magix AV magic stuff -AudioVisualizer::AudioVisualizer(AudioContext::StreamPtr stream, QWidget *parent) +AudioVisualizer::AudioVisualizer(AudioContext::StreamPtr stream, std::weak_ptr<VivyDocumentView> rootView_, QWidget *parent) : QWidget(parent) + , rootView(rootView_) , audioStream(stream) { if (!audioStream->isDecoded()) { diff --git a/src/UI/DocumentViews/AudioVisualizer.hh b/src/UI/DocumentViews/AudioVisualizer.hh index a8d7c55a..646a48f2 100644 --- a/src/UI/DocumentViews/AudioVisualizer.hh +++ b/src/UI/DocumentViews/AudioVisualizer.hh @@ -9,6 +9,7 @@ #include "AudioVisualizer/TimingView.hh" #include "AudioVisualizer/TimingParams.hh" #include "../../Lib/Audio.hh" +#include "../VivyDocumentView.hh" namespace Vivy { @@ -16,6 +17,7 @@ class AudioVisualizer final : public QWidget { Q_OBJECT private: + std::weak_ptr<VivyDocumentView> rootView; AudioContext::StreamPtr audioStream; private: @@ -35,7 +37,7 @@ private: using RDFTContextPtr = std::unique_ptr<RDFTContext, decltype(rdftContextDeleter)>; public: - explicit AudioVisualizer(AudioContext::StreamPtr, QWidget *parent = nullptr); + explicit AudioVisualizer(AudioContext::StreamPtr, std::weak_ptr<VivyDocumentView> rootView, QWidget *parent = nullptr); ~AudioVisualizer() noexcept override = default; public slots: diff --git a/src/UI/MainWindow.cc b/src/UI/MainWindow.cc index 47e764e1..08dc1cd9 100644 --- a/src/UI/MainWindow.cc +++ b/src/UI/MainWindow.cc @@ -301,8 +301,9 @@ MainWindow::closeDocument(int index) noexcept if (documentToClose) { logDebug() << "Delete document view " << VIVY_LOG_QUOTED(documentToClose->getDocumentTabName()); + documentToClose->closeDocument(); - delete documentToClose; + documentViewPtrs.remove(documentToClose); } } @@ -310,8 +311,11 @@ void MainWindow::newDocument() noexcept { try { - addTab(new VivyDocumentView( - vivyApp->documentStore->newDocument(VivyDocument::UntouchedByDefault), documents)); + auto viewPtr = std::shared_ptr<VivyDocumentView>(new VivyDocumentView(vivyApp->documentStore->newDocument(VivyDocument::UntouchedByDefault), documents)); + if (auto p = viewPtr.get()){ + documentViewPtrs.insert(p, viewPtr); + addTab(p); + } } catch (const std::runtime_error &e) { logError() << "Failed to create a new empty document: " << e.what(); } @@ -337,20 +341,29 @@ MainWindow::openDocument() noexcept // Handle the different types here try { - if (fileType == Utils::DocumentType::Vivy) - addTab(new VivyDocumentView(vivyApp->documentStore->loadDocument(filename), documents)); + if (fileType == Utils::DocumentType::Vivy){ + auto viewPtr = std::shared_ptr<VivyDocumentView>(new VivyDocumentView(vivyApp->documentStore->loadDocument(filename), documents)); + if (auto p = viewPtr.get()){ + documentViewPtrs.insert(p, viewPtr); + addTab(p); + } + } else if (fileType == Utils::DocumentType::VivyScript) { auto scriptDocument = vivyApp->scriptStore->loadDocument(filename); const bool rc = vivyApp->scriptStore->executeScript(scriptDocument->getUuid()); - ScriptDocumentView *newView = new ScriptDocumentView(scriptDocument, documents); + auto viewPtr = std::shared_ptr<ScriptDocumentView>(new ScriptDocumentView(scriptDocument, documents)); + + if (auto p = viewPtr.get()){ + if (!rc) { + const auto &[line, desc] = std::tuple{ 0, vivyApp->scriptStore->getLastLuaError() }; + emit p->luaErrorFound(line, desc); + } - if (!rc) { - const auto &[line, desc] = std::tuple{ 0, vivyApp->scriptStore->getLastLuaError() }; - emit newView->luaErrorFound(line, desc); + documentViewPtrs.insert(p, viewPtr); + addTab(p); } - addTab(newView); } } catch (const std::runtime_error &e) { logError() << "Failed to load document " << VIVY_LOG_QUOTED(filename) diff --git a/src/UI/MainWindow.hh b/src/UI/MainWindow.hh index 30a31af1..b8738dc4 100644 --- a/src/UI/MainWindow.hh +++ b/src/UI/MainWindow.hh @@ -96,6 +96,8 @@ private: } } + QMap<AbstractDocumentView*,std::shared_ptr<AbstractDocumentView>> documentViewPtrs; + protected: void closeEvent(QCloseEvent *) noexcept override; diff --git a/src/UI/VivyDocumentView.cc b/src/UI/VivyDocumentView.cc index e80887ce..25505b3a 100644 --- a/src/UI/VivyDocumentView.cc +++ b/src/UI/VivyDocumentView.cc @@ -148,7 +148,7 @@ VivyDocumentView::loadAudioView() noexcept // Kubat: don't check, may throw an error but don't think we can // recover from it. - AudioVisualizer *visualizerInner = new AudioVisualizer(stream, visualizer); + AudioVisualizer *visualizerInner = new AudioVisualizer(stream, shared_from_this(), visualizer); Utils::deleteInternalWidget(visualizer); visualizer->setWidget(visualizerInner); visualizer->layout()->setAlignment(visualizerInner, Qt::AlignTop); diff --git a/src/UI/VivyDocumentView.hh b/src/UI/VivyDocumentView.hh index a17d1c34..ad5ab51d 100644 --- a/src/UI/VivyDocumentView.hh +++ b/src/UI/VivyDocumentView.hh @@ -16,7 +16,7 @@ namespace Vivy { -class VivyDocumentView final : public AbstractDocumentView { +class VivyDocumentView final : public AbstractDocumentView, public std::enable_shared_from_this<VivyDocumentView> { Q_OBJECT VIVY_UNMOVABLE_OBJECT(VivyDocumentView) VIVY_APP_LOGGABLE_OBJECT(VivyDocumentView, logger) -- GitLab