From fc8b3988619da4aeafc02aea40ea570978e1260b Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Fri, 27 Aug 2021 13:35:08 +0200
Subject: [PATCH] BUILD: Only place external headers in the precompiled header
 to avoid recompiling it every time a local header is changed

Also fix all the warnings present with clang and get ride of most of the
forward definitions when possible.
---
 CMakeLists.txt                          | 40 ++++++++++++++++++++++++-
 src/Lib/AbstractMediaContext.hh         | 11 ++-----
 src/Lib/Ass/Ass.hh                      |  1 -
 src/Lib/Ass/AssFactory.cc               |  3 --
 src/Lib/Ass/AssFactory.hh               | 12 +-------
 src/Lib/Ass/AssPrivate.hh               |  2 --
 src/Lib/Ass/Line.cc                     |  2 --
 src/Lib/Ass/Line.hh                     |  8 +----
 src/Lib/Ass/Style.cc                    |  5 +---
 src/Lib/Ass/Style.hh                    | 26 +++++++---------
 src/Lib/Ass/StyleProperties.hh          |  9 +-----
 src/Lib/Ass/Syl.hh                      |  4 +--
 src/Lib/Audio.hh                        | 24 +--------------
 src/Lib/Script/CRTPLuaScriptObject.hh   |  4 +--
 src/Lib/Script/LuaContext.cc            |  2 +-
 src/Lib/Script/LuaContext.hh            | 16 +++++-----
 src/Lib/Script/ScriptStore.hh           |  3 +-
 src/Lib/Video.cc                        |  3 --
 src/Lib/Video.hh                        | 15 +---------
 src/UI/AboutWindow.cc                   | 14 +++------
 src/UI/AboutWindow.hh                   |  4 ++-
 src/UI/DocumentViews/AssLinesModel.hh   |  6 ++--
 src/UI/DocumentViews/AssLinesView.hh    |  4 +--
 src/UI/DocumentViews/AudioVisualizer.hh |  2 +-
 src/UI/DocumentViews/TimingBar.hh       |  2 +-
 src/UI/DocumentViews/TimingView.hh      |  2 +-
 src/UI/FakeVim/FakeVimActions.cc        |  5 ++++
 src/UI/FakeVim/FakeVimActions.hh        |  6 +++-
 src/UI/MainWindow.hh                    |  5 +---
 src/UI/ScriptDocumentView.hh            | 23 ++++----------
 src/UI/VivyDocumentView.hh              | 13 ++++----
 src/VivyApplication.hh                  |  5 ++--
 32 files changed, 111 insertions(+), 170 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 472ec5de..8ecf5472 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -70,20 +70,57 @@ target_link_libraries(Vivy PRIVATE lua)
 target_include_directories(Vivy PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/inc)
 target_precompile_headers(Vivy PRIVATE
     # Private Vivy headers
-    ${Vivy_INC}
+    # ${Vivy_INC}
 
     # STL headers
     <memory>
     <vector>
     <atomic>
+    <algorithm>
+    <stdexcept>
+    <sstream>
+    <map>
+
 
     # Qt headers
+    <QtGlobal>
+    <QObject>
+    <QRegularExpression>
+    <QRegExp>
     <QString>
+    <QVariant>
+    <QFile>
+
     <QList>
     <QVector>
     <QMap>
+
+    <QJsonObject>
+    <QJsonArray>
+    <QJsonDocument>
+
+    <QTextDocument>
+    <QColor>
     <QWidget>
     <QIcon>
+    <QFont>
+    <QPixmap>
+    <QApplication>
+    <QCloseEvent>
+    <QLabel>
+    <QPushButton>
+    <QVBoxLayout>
+    <QHBoxLayout>
+    <QEvent>
+    <QMouseEvent>
+    <QTextEdit>
+    <QDockWidget>
+    <QMenu>
+    <QFileDialog>
+    <QMutex>
+    <QMainWindow>
+    <QPainter>
+    <QPlainTextEdit>
 )
 
 # Set Vivy's needed C++ features
@@ -133,6 +170,7 @@ if (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang")
         # Disable some things because we want C++20 and don't constrol some Qt
         # generated files... Also permit VLA
         -Wno-c++98-compat -Wno-c++98-c++11-c++14-c++17-compat-pedantic
+        -Wno-c++98-compat-pedantic -Wno-old-style-cast
         -Wno-extra-semi-stmt
         -Wno-redundant-parens
         -Wno-padded
diff --git a/src/Lib/AbstractMediaContext.hh b/src/Lib/AbstractMediaContext.hh
index a2611c1d..35ada2ed 100644
--- a/src/Lib/AbstractMediaContext.hh
+++ b/src/Lib/AbstractMediaContext.hh
@@ -14,13 +14,6 @@ extern "C" {
 }
 
 #include "Utils.hh"
-#include <QtGlobal>
-#include <QMap>
-#include <QVector>
-#include <QString>
-#include <QJsonObject>
-#include <QJsonDocument>
-#include <QJsonArray>
 
 namespace Vivy
 {
@@ -61,8 +54,8 @@ protected:
         : codecId(streamArg->codecpar->codec_id)
         , codec(streamCodec)
         , codecParams(streamArg->codecpar)
-        , stream(streamArg)
         , dataFormat(formatArg)
+        , stream(streamArg)
         , streamIndexInContext(index)
     {
         if (codec == nullptr)
@@ -166,6 +159,8 @@ public:
                  << "and default stream index" << defaultStreamIndex;
     }
 
+    virtual ~AbstractMediaContext() {}
+
     StreamWeakPtr getStream(int index) const noexcept
     {
         if (index < 0)
diff --git a/src/Lib/Ass/Ass.hh b/src/Lib/Ass/Ass.hh
index acb14ff2..d7081d6a 100644
--- a/src/Lib/Ass/Ass.hh
+++ b/src/Lib/Ass/Ass.hh
@@ -7,6 +7,5 @@
 #include "AssPrivate.hh"
 #include "AssFactory.hh"
 #include "StyleProperties.hh"
-#include <memory.h>
 
 #endif // VIVY_ASS_ASS_H
diff --git a/src/Lib/Ass/AssFactory.cc b/src/Lib/Ass/AssFactory.cc
index a8768767..08ca4b7e 100644
--- a/src/Lib/Ass/AssFactory.cc
+++ b/src/Lib/Ass/AssFactory.cc
@@ -1,8 +1,5 @@
 #include "AssFactory.hh"
 
-#include <algorithm>
-#include <stdexcept>
-
 using namespace Vivy::Ass;
 
 bool
diff --git a/src/Lib/Ass/AssFactory.hh b/src/Lib/Ass/AssFactory.hh
index f21fddb1..b220c0f1 100644
--- a/src/Lib/Ass/AssFactory.hh
+++ b/src/Lib/Ass/AssFactory.hh
@@ -6,12 +6,6 @@
 #include "Line.hh"
 #include "AssPrivate.hh"
 
-#include <memory>
-#include <QFile>
-#include <QMap>
-#include <QVariant>
-#include <QString>
-
 // An ASS file is basically an INI file, but some keys are present multiple
 // times (V4+ Styles/Style, Events/Dialogue, Events/Comment).
 
@@ -21,11 +15,7 @@ class AssFactory final {
     VIVY_UNMOVABLE_OBJECT(AssFactory)
 
 public:
-    enum class Section {
-        ScriptInfo = 1,
-        Styles     = 2,
-        Events     = 3,
-    };
+    enum class Section { ScriptInfo = 1, Styles = 2, Events = 3 };
 
     using SectionContent = QMap<QString, QVariant>;
 
diff --git a/src/Lib/Ass/AssPrivate.hh b/src/Lib/Ass/AssPrivate.hh
index 71f9c7ee..39d931a9 100644
--- a/src/Lib/Ass/AssPrivate.hh
+++ b/src/Lib/Ass/AssPrivate.hh
@@ -1,7 +1,5 @@
 #pragma once
 
-#include <memory>
-
 namespace Vivy::Ass
 {
 class Style;
diff --git a/src/Lib/Ass/Line.cc b/src/Lib/Ass/Line.cc
index c509af74..fe0b257a 100644
--- a/src/Lib/Ass/Line.cc
+++ b/src/Lib/Ass/Line.cc
@@ -1,8 +1,6 @@
 #include "Line.hh"
 #include "AssFactory.hh"
 
-#include <QRegularExpression>
-
 using namespace Vivy::Ass;
 
 Line::Line(AssFactory *const factory, const QString &lineString)
diff --git a/src/Lib/Ass/Line.hh b/src/Lib/Ass/Line.hh
index 7463dad6..15984da1 100644
--- a/src/Lib/Ass/Line.hh
+++ b/src/Lib/Ass/Line.hh
@@ -1,8 +1,5 @@
-#ifndef VIVY_ASS_LINE_H
-#define VIVY_ASS_LINE_H
+#pragma once
 
-#include <QString>
-#include <QtGlobal>
 #include "Syl.hh"
 #include "StyleProperties.hh"
 #include "Style.hh"
@@ -47,7 +44,4 @@ public:
 private:
     void initSylFromString(const QString &) noexcept;
 };
-
 }
-
-#endif // VIVY_ASS_LINE_H
diff --git a/src/Lib/Ass/Style.cc b/src/Lib/Ass/Style.cc
index 4c2fd133..73afcbb1 100644
--- a/src/Lib/Ass/Style.cc
+++ b/src/Lib/Ass/Style.cc
@@ -1,8 +1,5 @@
 #include "Style.hh"
-
-#include <stdexcept>
-#include <QJsonDocument>
-#include <QJsonObject>
+#include "../Utils.hh"
 
 using namespace Vivy::Ass;
 
diff --git a/src/Lib/Ass/Style.hh b/src/Lib/Ass/Style.hh
index 9b9bba68..696cfc79 100644
--- a/src/Lib/Ass/Style.hh
+++ b/src/Lib/Ass/Style.hh
@@ -1,20 +1,17 @@
-#ifndef VIVY_STYLE_H
-#define VIVY_STYLE_H
-
-#include <QString>
-#include <QVector>
-#include <QtGlobal>
-#include <QColor>
-#include <QObject>
+#pragma once
+
 #include "AssPrivate.hh"
 
 namespace Vivy::Ass
 {
-namespace Color
-{
-QColor fromString(const QString &) noexcept;
-QString toString(const QColor &) noexcept;
-static inline const QColor defaultValue = QColor(0, 0, 0, 0);
+struct Color {
+    static QColor fromString(const QString &) noexcept;
+    static QString toString(const QColor &) noexcept;
+
+    static inline const QColor defaultValue = QColor(0, 0, 0, 0);
+
+private:
+    Color() = default;
 };
 
 class Style final {
@@ -47,7 +44,4 @@ public:
     QString getElementName() const noexcept;
     QJsonDocument getProperties() const noexcept;
 };
-
 }
-
-#endif
diff --git a/src/Lib/Ass/StyleProperties.hh b/src/Lib/Ass/StyleProperties.hh
index 374d9e2a..a72acf98 100644
--- a/src/Lib/Ass/StyleProperties.hh
+++ b/src/Lib/Ass/StyleProperties.hh
@@ -1,8 +1,4 @@
-#ifndef VIVY_ASS_STYLE_PROPERTIES_H
-#define VIVY_ASS_STYLE_PROPERTIES_H
-
-#include <QColor>
-#include <QString>
+#pragma once
 #include "Style.hh"
 
 namespace Vivy::Ass
@@ -31,7 +27,4 @@ struct StyleProperties final {
     // Alignement is bottom center
     int alignment{ 2 };
 };
-
 }
-
-#endif // VIVY_ASS_STYLE_PROPERTIES_H
diff --git a/src/Lib/Ass/Syl.hh b/src/Lib/Ass/Syl.hh
index 79c7a9bc..084e14e5 100644
--- a/src/Lib/Ass/Syl.hh
+++ b/src/Lib/Ass/Syl.hh
@@ -21,8 +21,8 @@ public:
 
 public:
     enum class ConstructMode {
-        Raw,         // Don't read ASS tags
-        ReadAssTags, // Read ass tags
+        Raw,        // Don't read ASS tags
+        ReadAssTags // Read ass tags
     };
 
     explicit Syl(const Syl &) noexcept = default;
diff --git a/src/Lib/Audio.hh b/src/Lib/Audio.hh
index 1e34c494..a87e3dc2 100644
--- a/src/Lib/Audio.hh
+++ b/src/Lib/Audio.hh
@@ -4,20 +4,7 @@
 #error "This is a C++ header"
 #endif
 
-extern "C" {
-#include <libavutil/opt.h>
-#include <libavcodec/avcodec.h>
-#include <libavformat/avformat.h>
-#include <libswresample/swresample.h>
-#include <libavcodec/avfft.h>
-#include <memory.h>
-}
-
-#include "Utils.hh"
-#include <QtGlobal>
-#include <QMap>
-#include <QVector>
-#include <QString>
+#include "AbstractMediaContext.hh"
 
 namespace Vivy
 {
@@ -86,14 +73,5 @@ private:
 
     using AVFormatContextPtr = std::unique_ptr<AVFormatContext, decltype(avFormatContextDeleter)>;
     AVFormatContextPtr format{ avformat_alloc_context(), avFormatContextDeleter };
-
-    const QString filePath;               // Usefull information
-    QMap<uint, StreamPtr> audioStreams{}; // THe audio streams of the file
-
-    int defaultStreamIndex{ -1 };
-
-    // Spare always null shared pointer, to be used when the audioStream[i] was
-    // not found.
-    StreamPtr spareNullSreamPtr{ nullptr };
 };
 }
diff --git a/src/Lib/Script/CRTPLuaScriptObject.hh b/src/Lib/Script/CRTPLuaScriptObject.hh
index 8e9920da..671cd3ac 100644
--- a/src/Lib/Script/CRTPLuaScriptObject.hh
+++ b/src/Lib/Script/CRTPLuaScriptObject.hh
@@ -48,12 +48,12 @@ getJobIteratorTypeFromString(const std::string_view it) noexcept
 // CRTP to expose objects to Lua
 template <class Object> class CRTPLuaScriptObject {
 protected:
-    static void __attribute__((__noreturn__))
-    luaGlobalError(lua_State *const L, const std::string &str) noexcept
+    [[noreturn]] static void luaGlobalError(lua_State *const L, const std::string &str) noexcept
     {
         const auto *const context = LuaContext::getContext(L);
         lua_pushfstring(L, "%s:0:%s", context->getCurrentLuaFile().c_str(), str.c_str());
         lua_error(L);
+        exit(EXIT_FAILURE); // lua_error should not return anything
     }
 
     static bool PushFunctionFromRegistry(lua_State *const L, const int key) noexcept
diff --git a/src/Lib/Script/LuaContext.cc b/src/Lib/Script/LuaContext.cc
index f5b4d341..99c42e9c 100644
--- a/src/Lib/Script/LuaContext.cc
+++ b/src/Lib/Script/LuaContext.cc
@@ -10,7 +10,7 @@
 // LuaContext implementation
 using namespace Vivy::Script;
 
-LuaContext::LuaContext(ScriptStore::LoggerType &out, ScriptStore::LoggerType &err) noexcept
+LuaContext::LuaContext(LoggerType &out, LoggerType &err) noexcept
     : L(luaL_newstate())
     , streamOut(out)
     , streamErr(err)
diff --git a/src/Lib/Script/LuaContext.hh b/src/Lib/Script/LuaContext.hh
index a852aac6..161b01e7 100644
--- a/src/Lib/Script/LuaContext.hh
+++ b/src/Lib/Script/LuaContext.hh
@@ -1,9 +1,6 @@
 #pragma once
 
-#include "ScriptStore.hh"
-#include <sstream>
-#include <vector>
-#include <map>
+#include "../Utils.hh"
 
 struct lua_State;
 class QString;
@@ -15,6 +12,7 @@ class ScriptDocument;
 
 namespace Vivy::Script
 {
+class ScriptStore;
 class ModuleDeclaration;
 class FunctionDeclaration;
 class JobDeclaration;
@@ -26,6 +24,10 @@ namespace Vivy::Script
 class LuaContext final {
     VIVY_UNMOVABLE_OBJECT(LuaContext)
 
+public:
+    using LoggerType = std::stringstream;
+
+private:
     using string_view = const std::string_view;
 
     lua_State *L{ nullptr };
@@ -40,15 +42,15 @@ class LuaContext final {
 
     static inline std::map<const lua_State *const, LuaContext *const> contextList = {};
 
-    ScriptStore::LoggerType &streamOut;
-    ScriptStore::LoggerType &streamErr;
+    LoggerType &streamOut;
+    LoggerType &streamErr;
 
 public:
     enum class Code { Success, Error };
     static constexpr inline Code Success = Code::Success;
     static constexpr inline Code Error   = Code::Error;
 
-    LuaContext(ScriptStore::LoggerType &out, ScriptStore::LoggerType &err) noexcept;
+    LuaContext(LoggerType &out, LoggerType &err) noexcept;
     ~LuaContext() noexcept;
 
     Code loadDocument(std::shared_ptr<ScriptDocument>) noexcept;
diff --git a/src/Lib/Script/ScriptStore.hh b/src/Lib/Script/ScriptStore.hh
index dd4266a9..cbfe85d9 100644
--- a/src/Lib/Script/ScriptStore.hh
+++ b/src/Lib/Script/ScriptStore.hh
@@ -2,6 +2,7 @@
 
 #include "../CRTPStore.hh"
 #include "ScriptDocument.hh"
+#include "LuaContext.hh"
 #include <sstream>
 #include <optional>
 
@@ -20,7 +21,7 @@ class ScriptStore final : public CRTPStore<ScriptStore, ScriptDocument> {
 
 public:
     using Item       = std::tuple<Uuid, QString>;
-    using LoggerType = std::stringstream;
+    using LoggerType = Script::LuaContext::LoggerType;
 
     explicit ScriptStore() noexcept;
 
diff --git a/src/Lib/Video.cc b/src/Lib/Video.cc
index 390b82a7..467d562c 100644
--- a/src/Lib/Video.cc
+++ b/src/Lib/Video.cc
@@ -1,9 +1,6 @@
 #include "Video.hh"
 #include "Utils.hh"
 
-#include <QJsonObject>
-#include <QJsonArray>
-
 using namespace Vivy;
 
 VideoStream::VideoStream(AVCodec *streamCodec, AVFormatContext *formatArg, AVStream *streamArg,
diff --git a/src/Lib/Video.hh b/src/Lib/Video.hh
index 42032b88..3f52495f 100644
--- a/src/Lib/Video.hh
+++ b/src/Lib/Video.hh
@@ -4,20 +4,7 @@
 #error "This is a C++ header"
 #endif
 
-extern "C" {
-#include <libavutil/opt.h>
-#include <libavcodec/avcodec.h>
-#include <libavformat/avformat.h>
-#include <libswresample/swresample.h>
-#include <libavcodec/avfft.h>
-#include <memory.h>
-}
-
-#include "Utils.hh"
-#include <QtGlobal>
-#include <QMap>
-#include <QVector>
-#include <QString>
+#include "AbstractMediaContext.hh"
 
 namespace Vivy
 {
diff --git a/src/UI/AboutWindow.cc b/src/UI/AboutWindow.cc
index 85cb2e01..420dae7b 100644
--- a/src/UI/AboutWindow.cc
+++ b/src/UI/AboutWindow.cc
@@ -1,14 +1,5 @@
 #include "AboutWindow.hh"
-
-#include <QCloseEvent>
-#include <QLabel>
-#include <QPushButton>
-#include <QVBoxLayout>
-#include <QHBoxLayout>
-#include <QEvent>
-#include <QMouseEvent>
-#include <QApplication>
-#include <QTextEdit>
+#include "../VivyApplication.hh"
 
 using namespace Vivy;
 
@@ -46,6 +37,9 @@ static const char *libContent =
     "  </ul>"
     "</body>";
 
+AboutWindow::SimpleLabel::~SimpleLabel() noexcept {}
+AboutWindow::LicenceLabel::~LicenceLabel() noexcept {}
+
 AboutWindow::SimpleLabel::SimpleLabel(QWidget *parent, const char *text)
     : QLabel(parent)
 {
diff --git a/src/UI/AboutWindow.hh b/src/UI/AboutWindow.hh
index acbd437c..4d4aae15 100644
--- a/src/UI/AboutWindow.hh
+++ b/src/UI/AboutWindow.hh
@@ -20,17 +20,19 @@ class AboutWindow final : public QMainWindow {
     class SimpleLabel final : public QLabel {
     public:
         explicit SimpleLabel(QWidget *parent, const char *text);
+        ~SimpleLabel() noexcept override;
     };
 
     // Simple QLabel for licences
     class LicenceLabel final : public QTextEdit {
     public:
         explicit LicenceLabel(QWidget *parent, const QString &url, const Qt::TextFormat format);
+        ~LicenceLabel() noexcept override;
     };
 
 public:
     explicit AboutWindow(QWidget *parent) noexcept;
-    ~AboutWindow() noexcept = default;
+    ~AboutWindow() noexcept override = default;
 
 signals:
     void closed();
diff --git a/src/UI/DocumentViews/AssLinesModel.hh b/src/UI/DocumentViews/AssLinesModel.hh
index 2dfdbcd1..e797c3bf 100644
--- a/src/UI/DocumentViews/AssLinesModel.hh
+++ b/src/UI/DocumentViews/AssLinesModel.hh
@@ -21,9 +21,7 @@ private:
 
         enum class Field : int {
             Text,
-
-            // Last, the count
-            TotalFieldCount,
+            TotalFieldCount // Last, the count
         };
 
         bool getIsComment() const noexcept;
@@ -39,7 +37,7 @@ private:
 
 public:
     explicit AssLinesModel(const QVector<Ass::LinePtr> &) noexcept;
-    ~AssLinesModel() noexcept;
+    ~AssLinesModel() noexcept override;
 
     QVariant data(const QModelIndex &, int role) const noexcept override;
     bool setData(const QModelIndex &, const QVariant &v, int r = Qt::EditRole) noexcept override;
diff --git a/src/UI/DocumentViews/AssLinesView.hh b/src/UI/DocumentViews/AssLinesView.hh
index 54c58c66..549cc532 100644
--- a/src/UI/DocumentViews/AssLinesView.hh
+++ b/src/UI/DocumentViews/AssLinesView.hh
@@ -23,7 +23,7 @@ private:
 
     public:
         Delegate(AssLinesView *, QWidget *parent = nullptr) noexcept;
-        ~Delegate() noexcept = default;
+        ~Delegate() noexcept override = default;
 
         void initStyleOption(QStyleOptionViewItem *option,
                              const QModelIndex &index) const noexcept override;
@@ -38,7 +38,7 @@ private:
 
 public:
     AssLinesView(QAbstractItemModel *, QWidget *parent = nullptr) noexcept;
-    ~AssLinesView() noexcept = default;
+    ~AssLinesView() noexcept override = default;
 
     void paintEvent(QPaintEvent *) noexcept override;
 
diff --git a/src/UI/DocumentViews/AudioVisualizer.hh b/src/UI/DocumentViews/AudioVisualizer.hh
index 451d5080..695f6209 100644
--- a/src/UI/DocumentViews/AudioVisualizer.hh
+++ b/src/UI/DocumentViews/AudioVisualizer.hh
@@ -33,7 +33,7 @@ private:
 
 public:
     explicit AudioVisualizer(AudioContext::StreamPtr, QWidget *parent = nullptr);
-    ~AudioVisualizer() noexcept = default;
+    ~AudioVisualizer() noexcept override = default;
 
 public slots:
     void printSpectrum(QImage) noexcept;
diff --git a/src/UI/DocumentViews/TimingBar.hh b/src/UI/DocumentViews/TimingBar.hh
index 6edf64ee..f6fb18c6 100644
--- a/src/UI/DocumentViews/TimingBar.hh
+++ b/src/UI/DocumentViews/TimingBar.hh
@@ -13,7 +13,7 @@ namespace Vivy
 class TimingBar final : public QGraphicsLineItem {
 public:
     explicit TimingBar(QLine, QColor) noexcept;
-    ~TimingBar() noexcept = default;
+    ~TimingBar() noexcept override = default;
 
 private:
     static inline constexpr int bar_demi_width = 2;
diff --git a/src/UI/DocumentViews/TimingView.hh b/src/UI/DocumentViews/TimingView.hh
index 5b0fc0e0..b1ef4895 100644
--- a/src/UI/DocumentViews/TimingView.hh
+++ b/src/UI/DocumentViews/TimingView.hh
@@ -26,7 +26,7 @@ public:
     static inline constexpr QColor endColour   = QColor(0, 127, 0);
 
     explicit TimingView(QImage, quint64, QWidget * = nullptr) noexcept;
-    ~TimingView() noexcept = default;
+    ~TimingView() noexcept override = default;
 
     void wheelEvent(QWheelEvent *) noexcept override;
 
diff --git a/src/UI/FakeVim/FakeVimActions.cc b/src/UI/FakeVim/FakeVimActions.cc
index 1c36b444..2f3f7670 100644
--- a/src/UI/FakeVim/FakeVimActions.cc
+++ b/src/UI/FakeVim/FakeVimActions.cc
@@ -8,6 +8,11 @@ namespace FakeVim::Internal
 {
 #ifdef FAKEVIM_STANDALONE
 FvBaseAspect::FvBaseAspect() {}
+FvBaseAspect::~FvBaseAspect() {}
+FvBoolAspect::~FvBoolAspect() {}
+FvIntegerAspect::~FvIntegerAspect() {}
+FvStringAspect::~FvStringAspect() {}
+FvAspectContainer::~FvAspectContainer() {}
 
 void
 FvBaseAspect::setValue(const QVariant &value)
diff --git a/src/UI/FakeVim/FakeVimActions.hh b/src/UI/FakeVim/FakeVimActions.hh
index b1cea03d..ae872e4a 100644
--- a/src/UI/FakeVim/FakeVimActions.hh
+++ b/src/UI/FakeVim/FakeVimActions.hh
@@ -13,7 +13,7 @@ namespace FakeVim::Internal
 class FvBaseAspect {
 public:
     FvBaseAspect();
-    virtual ~FvBaseAspect() {}
+    virtual ~FvBaseAspect();
 
     void setValue(const QVariant &value);
     QVariant value() const;
@@ -34,21 +34,25 @@ private:
 
 class FvBoolAspect : public FvBaseAspect {
 public:
+    ~FvBoolAspect() override;
     bool value() const { return FvBaseAspect::value().toBool(); }
 };
 
 class FvIntegerAspect : public FvBaseAspect {
 public:
+    ~FvIntegerAspect() override;
     qint64 value() const { return FvBaseAspect::value().toLongLong(); }
 };
 
 class FvStringAspect : public FvBaseAspect {
 public:
+    ~FvStringAspect() override;
     QString value() const { return FvBaseAspect::value().toString(); }
 };
 
 class FvAspectContainer : public FvBaseAspect {
 public:
+    ~FvAspectContainer() override;
 };
 
 class FakeVimSettings final : public FvAspectContainer {
diff --git a/src/UI/MainWindow.hh b/src/UI/MainWindow.hh
index 1ce71fc2..16b379e8 100644
--- a/src/UI/MainWindow.hh
+++ b/src/UI/MainWindow.hh
@@ -9,11 +9,8 @@
 #include "../Lib/Document/VivyDocumentStore.hh"
 #include "DocumentViews/AudioVisualizer.hh"
 #include "VivyDocumentView.hh"
+#include "ScriptDocumentView.hh"
 #include "AboutWindow.hh"
-#include <QMenu>
-#include <QFileDialog>
-#include <QMutex>
-#include <QMainWindow>
 
 namespace Vivy
 {
diff --git a/src/UI/ScriptDocumentView.hh b/src/UI/ScriptDocumentView.hh
index 7f2c333b..c1acc9c3 100644
--- a/src/UI/ScriptDocumentView.hh
+++ b/src/UI/ScriptDocumentView.hh
@@ -6,25 +6,12 @@
 #endif
 
 #include "../Lib/Utils.hh"
+#include "../Lib/Script/ScriptDocument.hh"
 #include "AbstractDocumentView.hh"
-#include <QWidget>
-#include <QString>
-#include <memory>
-
-class QPlainTextEdit;
-
-namespace FakeVim::Internal
-{
-class FakeVimHandler;
-}
-
-namespace Vivy
-{
-class ScriptEditor;
-class ScriptHighlighter;
-class ScriptDocument;
-class EditorProxy;
-}
+#include "FakeVim/FakeVimHandler.hh"
+#include "ScriptViews/EditorProxy.hh"
+#include "ScriptViews/ScriptHighlighter.hh"
+#include "ScriptViews/ScriptEditor.hh"
 
 namespace Vivy
 {
diff --git a/src/UI/VivyDocumentView.hh b/src/UI/VivyDocumentView.hh
index 4cdcc8ef..b38bd6c0 100644
--- a/src/UI/VivyDocumentView.hh
+++ b/src/UI/VivyDocumentView.hh
@@ -6,17 +6,14 @@
 #endif
 
 #include "AbstractDocumentView.hh"
-
-class QDockWidget;
-class QWidget;
+#include "../Lib/Document/VivyDocument.hh"
+#include "DocumentViews/VideoView.hh"
+#include "DocumentViews/AssLinesView.hh"
+#include "DocumentViews/AssLinesModel.hh"
+#include "PropertyModel.hh"
 
 namespace Vivy
 {
-class PropertyModel;
-class AssLinesModel;
-class VivyDocument;
-class VideoView;
-
 class VivyDocumentView final : public AbstractDocumentView {
     Q_OBJECT
     VIVY_UNMOVABLE_OBJECT(VivyDocumentView)
diff --git a/src/VivyApplication.hh b/src/VivyApplication.hh
index 4c98c7b3..2f37a5d5 100644
--- a/src/VivyApplication.hh
+++ b/src/VivyApplication.hh
@@ -24,9 +24,7 @@
 #define VIVY_ICON_PAUSE   ":icons/dark/media-pause.svg"
 #define VIVY_ICON_STOP    ":icons/dark/media-stop.svg"
 
-#include <QApplication>
-#include <QPixmap>
-#include <QFont>
+#include "Lib/Script/ScriptStore.hh"
 
 // Detect MacOS
 #if defined(Q_OS_DARWIN) || defined(Q_OS_MACOS)
@@ -34,6 +32,7 @@
 #endif
 
 #include "Lib/Document/VivyDocumentStore.hh"
+#include "UI/MainWindow.hh"
 
 namespace Vivy
 {
-- 
GitLab