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