diff --git a/src/UI/AbstractDocumentView.hh b/src/UI/AbstractDocumentView.hh index 7745665b35e2bc5f669c86c4223afc0b839a0060..8da2204c72a858621090013281c02f854dde14e7 100644 --- a/src/UI/AbstractDocumentView.hh +++ b/src/UI/AbstractDocumentView.hh @@ -39,6 +39,8 @@ public: bool isType(const Utils::DocumentType t) const noexcept; const QList<QAction *> &getViewsActions() const noexcept; + virtual void loadViews() noexcept = 0; + signals: void viewActionsChanged(); void documentPropertyChanged(); diff --git a/src/UI/MainWindow.cc b/src/UI/MainWindow.cc index 08dc1cd9b4151e5441984624d55281195e6a4a17..dffe974089d5a80830146351423bda2df6a52bd0 100644 --- a/src/UI/MainWindow.cc +++ b/src/UI/MainWindow.cc @@ -21,6 +21,16 @@ #define ACTION_ADD_SHORTCUT(action, shortcut) action##Act->setShortcut(shortcut); +#define ADD_TAB(view) \ + std::shared_ptr<AbstractDocumentView> viewPtr; \ + viewPtr.reset(view); \ + if (auto p = viewPtr.get()) { \ + p->loadViews(); \ + documentViewPtrs.insert(viewPtr.get(), viewPtr); \ + addTab(p); \ + } + + using namespace Vivy; MainWindow::MainWindow() noexcept @@ -301,7 +311,6 @@ MainWindow::closeDocument(int index) noexcept if (documentToClose) { logDebug() << "Delete document view " << VIVY_LOG_QUOTED(documentToClose->getDocumentTabName()); - documentToClose->closeDocument(); documentViewPtrs.remove(documentToClose); } @@ -311,11 +320,8 @@ void MainWindow::newDocument() noexcept { try { - 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); - } + ADD_TAB(new VivyDocumentView( + vivyApp->documentStore->newDocument(VivyDocument::UntouchedByDefault), documents)); } catch (const std::runtime_error &e) { logError() << "Failed to create a new empty document: " << e.what(); } @@ -342,28 +348,20 @@ MainWindow::openDocument() noexcept // Handle the different types here try { 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); - } + ADD_TAB(new VivyDocumentView(vivyApp->documentStore->loadDocument(filename), documents)); } else if (fileType == Utils::DocumentType::VivyScript) { auto scriptDocument = vivyApp->scriptStore->loadDocument(filename); const bool rc = vivyApp->scriptStore->executeScript(scriptDocument->getUuid()); - 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); - } + ScriptDocumentView *newView = new ScriptDocumentView(scriptDocument, documents); - documentViewPtrs.insert(p, viewPtr); - addTab(p); + if (!rc) { + const auto &[line, desc] = std::tuple{ 0, vivyApp->scriptStore->getLastLuaError() }; + emit newView->luaErrorFound(line, desc); } + ADD_TAB(newView); } } catch (const std::runtime_error &e) { logError() << "Failed to load document " << VIVY_LOG_QUOTED(filename) @@ -410,6 +408,7 @@ void MainWindow::addTab(AbstractDocumentView *const tab) { int index = -1; + if (const int untouched_index = findFirstUntouchedDocument(); untouched_index >= 0) { closeDocument(untouched_index); index = documents->insertTab(untouched_index, tab, tab->getDocumentTabIcon(), diff --git a/src/UI/ScriptDocumentView.hh b/src/UI/ScriptDocumentView.hh index 0f7907352447f3bcb82c1081c242b519141016fd..8d45158b2a2f4998048f831c3bda7c23f13848e0 100644 --- a/src/UI/ScriptDocumentView.hh +++ b/src/UI/ScriptDocumentView.hh @@ -34,6 +34,8 @@ public: QIcon getDocumentTabIcon() const noexcept override; AbstractDocument *getDocument() const noexcept override; + void loadViews() noexcept override {} ; + void setUseFakeVimEditor(bool yes) noexcept; signals: diff --git a/src/UI/VivyDocumentView.cc b/src/UI/VivyDocumentView.cc index 25505b3a0f06e0128132fd9b35444ecd34b86629..b1b4eb3b5f2edb98036ce57bc6358db3b0f6edce 100644 --- a/src/UI/VivyDocumentView.cc +++ b/src/UI/VivyDocumentView.cc @@ -27,10 +27,6 @@ VivyDocumentView::VivyDocumentView(std::shared_ptr<VivyDocument> doc, QWidget *p setDockNestingEnabled(true); - loadAudioView(); - loadVideoView(); - loadAssView(); - // Add some actions... openPropertiesAct = new QAction("Open properties", this); connect(openPropertiesAct, &QAction::triggered, this, &VivyDocumentView::openProperties); @@ -49,6 +45,13 @@ VivyDocumentView::VivyDocumentView(std::shared_ptr<VivyDocument> doc, QWidget *p VIVY_LOG_CTOR() << "View for " << doc->getUuid() << " done!"; } +void VivyDocumentView::loadViews() noexcept +{ + loadAudioView(); + loadVideoView(); + loadAssView(); +} + VivyDocumentView::~VivyDocumentView() noexcept { VIVY_LOG_DTOR() << "Deleting view for " << document->getUuid() << ", file name is " diff --git a/src/UI/VivyDocumentView.hh b/src/UI/VivyDocumentView.hh index ad5ab51d6c5cc42ffc2b468df2cc42ce3001d09c..bc777451fdfd57109990c9e276ca7b2c56dfbf36 100644 --- a/src/UI/VivyDocumentView.hh +++ b/src/UI/VivyDocumentView.hh @@ -40,6 +40,8 @@ public: VivyDocument *getDocument() const noexcept override; + void loadViews() noexcept override; + public slots: void loadAudioView() noexcept; void loadVideoView() noexcept;