From f871e79500e72b00d77ab073fcded603573cde98 Mon Sep 17 00:00:00 2001 From: Elliu <goyard.louis@gmail.com> Date: Sun, 27 Jun 2021 15:52:36 +0200 Subject: [PATCH] Add newDocument button and functions To create a new empty Vivy document --- src/Document/VivyDocument.cc | 6 ------ src/Document/VivyDocument.hh | 6 ++---- src/Document/VivyDocumentStore.cc | 24 +++++++++++++++++++++--- src/Document/VivyDocumentStore.hh | 2 +- src/MainWindow.cc | 16 ++++++++++++++++ src/MainWindow.hh | 1 + src/MainWindow.xdef | 5 ++++- src/VivyDocumentView.cc | 23 ++++++++++++++--------- 8 files changed, 59 insertions(+), 24 deletions(-) diff --git a/src/Document/VivyDocument.cc b/src/Document/VivyDocument.cc index 60df47cb..1d077b83 100644 --- a/src/Document/VivyDocument.cc +++ b/src/Document/VivyDocument.cc @@ -149,12 +149,6 @@ VivyDocument::fromPath(const QString &path) noexcept return ret; } -VivyDocument * -VivyDocument::newEmpty([[maybe_unused]] const QString &name) noexcept -{ - return nullptr; -} - QString VivyDocument::getName() const noexcept { diff --git a/src/Document/VivyDocument.hh b/src/Document/VivyDocument.hh index cad06e31..970610d5 100644 --- a/src/Document/VivyDocument.hh +++ b/src/Document/VivyDocument.hh @@ -35,14 +35,12 @@ private: std::unique_ptr<VideoDocument> videoDocument{}; std::unique_ptr<AssDocument> assDocument{}; - /* Create an empty document */ - explicit VivyDocument(const QString &name); - static bool detectDocumentType(const QFileInfo &file, SubDocument *type); public: + /* Create an empty document */ + explicit VivyDocument(const QString &name); [[nodiscard("allocated")]] static VivyDocument *fromPath(const QString &path) noexcept; - [[nodiscard("allocated")]] static VivyDocument *newEmpty(const QString &name) noexcept; bool rename(const QString &) noexcept; bool loadSubDocument(const QString &) noexcept; diff --git a/src/Document/VivyDocumentStore.cc b/src/Document/VivyDocumentStore.cc index 361a4b4c..d7f6946c 100644 --- a/src/Document/VivyDocumentStore.cc +++ b/src/Document/VivyDocumentStore.cc @@ -15,7 +15,7 @@ VivyDocumentStore::loadDocument(const QString &file) } if (VivyDocument *ret = VivyDocument::fromPath(file)) { - qDebug() << "Register ument " << baseName; + qDebug() << "Register document " << baseName; documents[baseName] = std::shared_ptr<VivyDocument>(ret); return std::weak_ptr{ documents[baseName] }; } else { @@ -30,10 +30,28 @@ VivyDocumentStore::isDocumentPresent(const QString &name) noexcept return documents.count(name) >= 1; } + +#define NEW_DOCUMENT_BASENAME "Untitled " std::weak_ptr<VivyDocument> -VivyDocumentStore::newDocument(const QString & /* name */) +VivyDocumentStore::newDocument(QString &name) { - throw std::runtime_error("Not implemented"); + uint docNumber{1}; + QString newDocName; + + do { + newDocName = NEW_DOCUMENT_BASENAME + QString::number(docNumber); + docNumber++; + } while (documents.contains(newDocName)); + + name = newDocName; + if (auto ret = std::make_shared<VivyDocument>(newDocName)) { + qDebug() << "Create new document " << newDocName; + documents[newDocName] = ret; + return std::weak_ptr{ documents[newDocName] }; + } else { + qDebug() << "Failed to create new document " << newDocName; + throw std::runtime_error("Failed to create the document"); + } } void diff --git a/src/Document/VivyDocumentStore.hh b/src/Document/VivyDocumentStore.hh index ea419b78..e4495ab6 100644 --- a/src/Document/VivyDocumentStore.hh +++ b/src/Document/VivyDocumentStore.hh @@ -20,7 +20,7 @@ public: /* Create/load documents */ std::weak_ptr<VivyDocument> loadDocument(const QString &file); - std::weak_ptr<VivyDocument> newDocument(const QString &name); + std::weak_ptr<VivyDocument> newDocument(QString &name); /* Get to see if a document is already present or not */ [[nodiscard("handle-it")]] bool isDocumentPresent(const QString &name) noexcept; diff --git a/src/MainWindow.cc b/src/MainWindow.cc index f028b208..361299f3 100644 --- a/src/MainWindow.cc +++ b/src/MainWindow.cc @@ -86,6 +86,22 @@ MainWindow::closeDocument(int index) noexcept documents->removeTab(index); } +void +MainWindow::newDocument() noexcept +{ + QString baseName; + std::weak_ptr<VivyDocument> document = vivyApp->documentStore.newDocument(baseName); + + try { + VivyDocumentView *documentView = new VivyDocumentView(document); + qDebug() << "View constructed successfully"; + documents->addTab(documentView, document.lock()->getName()); + } catch (const std::runtime_error &e) { + qCritical() << "Failed to create the document view for the new document " << baseName; + throw; + } +} + void MainWindow::openDocument() noexcept { diff --git a/src/MainWindow.hh b/src/MainWindow.hh index e826c319..32c7ae46 100644 --- a/src/MainWindow.hh +++ b/src/MainWindow.hh @@ -26,6 +26,7 @@ public: std::weak_ptr<VivyDocument> getCurrentDocument() const; private slots: + void newDocument() noexcept; void openDocument() noexcept; void closeDocument(int index) noexcept; diff --git a/src/MainWindow.xdef b/src/MainWindow.xdef index a1354835..9275efae 100644 --- a/src/MainWindow.xdef +++ b/src/MainWindow.xdef @@ -45,16 +45,19 @@ MAIN_WINDOW_MENU(help, "&Help") MAIN_WINDOW_TOOLBAR(file, "File") MAIN_WINDOW_TOOLBAR(other, "Other") -MAIN_WINDOW_ACTION_ICON(openDocument, "&Open document", "Open a a document", file, "document-open") +MAIN_WINDOW_ACTION_ICON(newDocument, "&New document", "Create a new document", file, "document-new") +MAIN_WINDOW_ACTION_ICON(openDocument, "&Open document", "Open a document", file, "document-open") MAIN_WINDOW_ACTION_ICON(saveFile, "&Save file", "Save the current document", file, "document-save") MAIN_WINDOW_ACTION_ICON(saveFileAs, "&Save file as", "Save the current document as", file, "document-save-as") MAIN_WINDOW_ACTION_ICON(openDialogHelp, "&About", "Open the help dialog", help, "help-about") +MAIN_WINDOW_TOOLBAR_ADD_ACTION(file, newDocument) MAIN_WINDOW_TOOLBAR_ADD_ACTION(file, openDocument) MAIN_WINDOW_TOOLBAR_ADD_ACTION(file, saveFile) MAIN_WINDOW_TOOLBAR_ADD_ACTION(file, saveFileAs) MAIN_WINDOW_TOOLBAR_ADD_ACTION(other, openDialogHelp) +MAIN_WINDOW_ACTION_ADD_SHORTCUT(newDocument, QKeySequence::New) MAIN_WINDOW_ACTION_ADD_SHORTCUT(openDocument, QKeySequence::Open) MAIN_WINDOW_ACTION_ADD_SHORTCUT(saveFile, QKeySequence::Save) diff --git a/src/VivyDocumentView.cc b/src/VivyDocumentView.cc index 45cb9f7d..b11df389 100644 --- a/src/VivyDocumentView.cc +++ b/src/VivyDocumentView.cc @@ -9,17 +9,22 @@ VivyDocumentView::VivyDocumentView(std::weak_ptr<VivyDocument> docWeak, QWidget , document(docWeak) { if (auto doc = document.lock()) { - AudioDocument *const audioDocument = doc->getAudioSubDocument(); - qDebug() << "Create an audio vizualizer for the audio sub document " << audioDocument->getFilePath(); - if (audioDocument != nullptr) { - visualizer = AudioVisualizer::fromFile(audioDocument->getFilePath()); - assert(visualizer != nullptr); + int capabilities = doc->getDocumentCapabilities(); + + if (capabilities & VivyDocument::AudioAble){ + AudioDocument *const audioDocument = doc->getAudioSubDocument(); + qDebug() << "Create an audio vizualizer for the audio sub document " << audioDocument->getFilePath(); + if (audioDocument != nullptr) { + visualizer = AudioVisualizer::fromFile(audioDocument->getFilePath()); + assert(visualizer != nullptr); + } + + QVBoxLayout *layout = new QVBoxLayout; + if (visualizer != nullptr) + layout->addWidget(visualizer); + setLayout(layout); } - QVBoxLayout *layout = new QVBoxLayout; - if (visualizer != nullptr) - layout->addWidget(visualizer); - setLayout(layout); } } -- GitLab