diff --git a/src/UI/DocumentViews/AudioVisualizer.cc b/src/UI/DocumentViews/AudioVisualizer.cc index e34843b825f2b27cda75351bcf59778beb79fcb7..c5c5e69f58072e7c8e9f37c99c0254bc9e1ff4cb 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 a8d7c55aa09fe353f3bfbe236750d3e4ac96fb0b..646a48f23d73d6d65a86723856618d2bda65a874 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 47e764e107ac56bf06c4912a9360098dda7200dd..08dc1cd9b4151e5441984624d55281195e6a4a17 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 30a31af108f94ceb43ce3dc34aa06f905ab33c91..b8738dc4d7dd9d0392b832b1080f6a5caadaf083 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 e80887cee598d54bc021b1c8ce49f0d157ed6bcc..25505b3a0f06e0128132fd9b35444ecd34b86629 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 a17d1c34c8a0cdbb61d9ae12807d10a96c383266..ad5ab51d6c5cc42ffc2b468df2cc42ce3001d09c 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)