From 708b96c6558293717b7d503cf9f5c20f5f9daf3e Mon Sep 17 00:00:00 2001 From: Kubat <mael.martin31@gmail.com> Date: Sun, 4 Jul 2021 21:40:02 +0200 Subject: [PATCH] [WIP] UI: Add the property popup when double-clicking on tag TODO: Open a new tab with the properties instead of a new window --- CMakeLists.txt | 7 ++----- src/Document/CRTPSubDocument.cc | 21 +++++++++++++++++++ src/Document/CRTPSubDocument.hh | 3 +++ src/UI/MainWindow.cc | 36 ++++++++++++++++++++++++++++++++- src/UI/PropertyView.cc | 4 ++-- 5 files changed, 63 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bc73970b..576c6196 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -90,13 +90,10 @@ target_precompile_headers(Vivy PRIVATE # More options and warnings target_compile_options(Vivy PRIVATE -Wall -Wextra -Wshadow -pedantic - -Wcast-align -Wconversion -Wsign-conversion + -Wcast-align -Wconversion -Wsign-conversion -Wunused-variable -Wmisleading-indentation -Wnull-dereference -Wdouble-promotion -Wformat=2 - $<$<COMPILE_LANGUAGE:CXX>: - -Woverloaded-virtual - -Wnon-virtual-dtor - > + -Woverloaded-virtual -Wnon-virtual-dtor ) if (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang") diff --git a/src/Document/CRTPSubDocument.cc b/src/Document/CRTPSubDocument.cc index 85983b5e..0f293d92 100644 --- a/src/Document/CRTPSubDocument.cc +++ b/src/Document/CRTPSubDocument.cc @@ -1,5 +1,8 @@ #include "CRTPSubDocument.hh" +#include <QJsonObject> +#include <QJsonDocument> + using namespace Vivy; // AudioSubDocument implementation @@ -55,6 +58,24 @@ AudioSubDocument::initFromPath(const QString &path) qDebug() << "Audio OK for" << path; } +QString +AudioSubDocument::getElementName() const noexcept +{ + return "AudioSubDocument"; +} + +QJsonDocument +AudioSubDocument::getProperties() const noexcept +{ + QJsonDocument ret; + QJsonObject object; + const QJsonDocument contextDocument = contextPtr->getProperties(); + object.insert("File path", filePath); + object.insert("Audio context", contextDocument.object()); + ret.setObject(object); + return ret; +} + // VideoSubDocument implementation // Init a video sub-document from a file diff --git a/src/Document/CRTPSubDocument.hh b/src/Document/CRTPSubDocument.hh index 29b1c620..8189e7b2 100644 --- a/src/Document/CRTPSubDocument.hh +++ b/src/Document/CRTPSubDocument.hh @@ -77,6 +77,9 @@ public: AudioContext::StreamPtr getDefaultStream() const noexcept; int getStreamCount() const noexcept; AudioContext::StreamPtr getStream(int index) const noexcept; + + QString getElementName() const noexcept; + QJsonDocument getProperties() const noexcept; }; // Video document diff --git a/src/UI/MainWindow.cc b/src/UI/MainWindow.cc index 5e870b9c..f1ba85a1 100644 --- a/src/UI/MainWindow.cc +++ b/src/UI/MainWindow.cc @@ -1,11 +1,14 @@ #include "MainWindow.hh" #include "DialogHelp.hh" +#include "PropertyView.hh" #include "VivyDocumentView.hh" #include "../Lib/Utils.hh" #include "../VivyApplication.hh" #include <functional> +#include <QWindow> #include <optional> +#include <QTreeView> #include <QFileInfo> #include <QStandardPaths> #include <QPixmap> @@ -125,9 +128,40 @@ MainWindow::MainWindow(QWidget *parent) noexcept void MainWindow::openProperties(int index) noexcept { - if (index < 0) + if (index < 0) { + // TODO: May may want to do something when the user is clicking where + // no tab bar is openned (like open document?) return; + } + qDebug().nospace() << "Tab n°" << index << " was double clicked"; + VivyDocumentView *current = getTab(index); + if (auto document = current->getDocument().lock()) { + // FIXME: For now only display the audio document + if (auto audioDocuement = document->getAudioSubDocument()) { + QWidget *propertyWindow = new QWidget(this); + QVBoxLayout *layout = new QVBoxLayout(propertyWindow); + QTreeView *view = new QTreeView(); + const QJsonDocument doc = audioDocuement->getProperties(); + PropertyModel *model = new PropertyModel(&doc, view); + + view->setModel(model); + layout->addWidget(view); + propertyWindow->setWindowFlags(Qt::Window | Qt::Popup); + propertyWindow->setLayout(layout); + + propertyWindow->show(); + + // Wait until the window is closed + QEventLoop loop; + connect(propertyWindow, SIGNAL(destroyed()), &loop, SLOT(quit())); + loop.exec(); + } + } + + else { + qCritical().nospace() << "The document from the tab n°" << index << " was already deleted"; + } } std::weak_ptr<VivyDocument> diff --git a/src/UI/PropertyView.cc b/src/UI/PropertyView.cc index 43f42f9c..ee019246 100644 --- a/src/UI/PropertyView.cc +++ b/src/UI/PropertyView.cc @@ -122,13 +122,13 @@ PropertyModel::PropertyModel(QObject *parent) noexcept headers.append("value"); } -PropertyModel::PropertyModel(const QJsonDocument *json, QObject *parent) noexcept +PropertyModel::PropertyModel(const QJsonDocument *properties, QObject *parent) noexcept : QAbstractItemModel(parent) { headers.append("key"); headers.append("value"); try { - loadJson(json); + loadJson(properties); } catch (const std::runtime_error &e) { qCritical() << "Failed to create the property model object:" << e.what(); } -- GitLab