From 474f3786f81c7bcdc677511de4118821888e5a6b Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Wed, 25 Aug 2021 09:39:54 +0200
Subject: [PATCH] UI: Enable the FakeVim by default!

---
 src/UI/ScriptDocumentView.cc      | 33 +++++++++++++++++++++++
 src/UI/ScriptDocumentView.hh      | 18 +++++++++++++
 src/UI/ScriptViews/EditorProxy.cc | 45 +++++++++++--------------------
 src/UI/ScriptViews/EditorProxy.hh | 15 +++++------
 4 files changed, 72 insertions(+), 39 deletions(-)

diff --git a/src/UI/ScriptDocumentView.cc b/src/UI/ScriptDocumentView.cc
index eea78736..bd82c101 100644
--- a/src/UI/ScriptDocumentView.cc
+++ b/src/UI/ScriptDocumentView.cc
@@ -23,9 +23,42 @@ ScriptDocumentView::ScriptDocumentView(std::shared_ptr<ScriptDocument> ptr, QWid
     setCentralWidget(editor);
     editor->setFocus(Qt::OtherFocusReason);
 
+    // FakeVim
+    {
+        handler = new FakeVimHandler(editor, this);
+        proxy   = EditorProxy::connectSignals(handler, editor);
+        connect(proxy, &EditorProxy::handleInput, handler, &FakeVimHandler::handleInput);
+        // connect(proxy, &EditorProxy::requestSave, document, &AbstractDocument::save); // TODO
+        // connect(proxy, &EditorProxy::requestSaveAndQuit, document, &AbstractDocument::save + &MainWindow::closeTab); // TODO
+        // connect(proxy, &EditorProxy::requestQuit, document, &MainWindow::closeTab); // TODO
+        initHandler(handler);
+        handler->handleCommand(QStringLiteral("set expandtab"));
+        handler->handleCommand(QStringLiteral("set shiftwidth=4"));
+        handler->handleCommand(QStringLiteral("set tabstop=4"));
+        handler->handleCommand(QStringLiteral("set autoindent"));
+        handler->handleCommand(QStringLiteral("set smartindent"));
+        clearUndoRedo(editor);
+    }
+
     connect(this, &ScriptDocumentView::luaErrorFound, editor, &ScriptEditor::updateLastLuaError);
 }
 
+void
+ScriptDocumentView::initHandler(FakeVimHandler *handler) noexcept
+{
+    handler->handleCommand(QStringLiteral("set nopasskeys"));
+    handler->handleCommand(QStringLiteral("set nopasscontrolkey"));
+    handler->installEventFilter();
+    handler->setupWidget();
+}
+
+void
+ScriptDocumentView::clearUndoRedo(QPlainTextEdit *scriptEditor) noexcept
+{
+    scriptEditor->setUndoRedoEnabled(false);
+    scriptEditor->setUndoRedoEnabled(true);
+}
+
 void
 ScriptDocumentView::closeDocument() noexcept
 {
diff --git a/src/UI/ScriptDocumentView.hh b/src/UI/ScriptDocumentView.hh
index 8e595086..7b01ce08 100644
--- a/src/UI/ScriptDocumentView.hh
+++ b/src/UI/ScriptDocumentView.hh
@@ -11,16 +11,29 @@
 #include <QString>
 #include <memory>
 
+class QPlainTextEdit;
+
+namespace FakeVim::Internal
+{
+class FakeVimHandler;
+}
+
 namespace Vivy
 {
 class ScriptEditor;
 class ScriptHighlighter;
 class ScriptDocument;
+class EditorProxy;
+}
 
+namespace Vivy
+{
 class ScriptDocumentView final : public AbstractDocumentView {
     Q_OBJECT
     VIVY_UNMOVABLE_OBJECT(ScriptDocumentView)
 
+    using FakeVimHandler = FakeVim::Internal::FakeVimHandler;
+
 public:
     explicit ScriptDocumentView(std::shared_ptr<ScriptDocument>, QWidget *parent = nullptr);
 
@@ -37,10 +50,15 @@ signals:
 
 private:
     ScriptEditor *editor{ nullptr };
+    EditorProxy *proxy{ nullptr };
     ScriptHighlighter *syntax{ nullptr };
+    FakeVimHandler *handler{ nullptr };
     std::shared_ptr<ScriptDocument> document{ nullptr };
     QString lastLuaErrorMsg{};
     int lastLuaErrorLine{ -1 };
+
+    static void initHandler(FakeVimHandler *handler) noexcept;
+    static void clearUndoRedo(QPlainTextEdit *editor) noexcept;
 };
 }
 
diff --git a/src/UI/ScriptViews/EditorProxy.cc b/src/UI/ScriptViews/EditorProxy.cc
index 7187cb5c..aca744c0 100644
--- a/src/UI/ScriptViews/EditorProxy.cc
+++ b/src/UI/ScriptViews/EditorProxy.cc
@@ -1,6 +1,7 @@
 #include "EditorProxy.hh"
 #include "../FakeVim/FakeVimHandler.hh"
 #include "../FakeVim/FakeVimActions.hh"
+#include "../../VivyApplication.hh"
 
 #include <QMessageBox>
 #include <QStatusBar>
@@ -9,26 +10,10 @@
 
 using namespace Vivy;
 
-void
-Vivy::initHandler(FakeVimHandler *handler)
-{
-    handler->handleCommand(QStringLiteral("set nopasskeys"));
-    handler->handleCommand(QStringLiteral("set nopasscontrolkey"));
-    handler->installEventFilter();
-    handler->setupWidget();
-}
-
-void
-Vivy::clearUndoRedo(QPlainTextEdit *scriptEditor)
-{
-    scriptEditor->setUndoRedoEnabled(false);
-    scriptEditor->setUndoRedoEnabled(true);
-}
-
 Vivy::EditorProxy *
-Vivy::connectSignals(FakeVimHandler *handler, QMainWindow *mainWindow, QPlainTextEdit *editor)
+EditorProxy::connectSignals(FakeVimHandler *handler, QPlainTextEdit *editor) noexcept
 {
-    EditorProxy *proxy = new EditorProxy(editor, mainWindow, handler);
+    EditorProxy *proxy = new EditorProxy(editor, handler);
 
     handler->commandBufferChanged.connect([proxy](const QString &contents, int cursorPos,
                                                   int /* anchorPos */,
@@ -64,10 +49,9 @@ Vivy::connectSignals(FakeVimHandler *handler, QMainWindow *mainWindow, QPlainTex
     return proxy;
 }
 
-EditorProxy::EditorProxy(QPlainTextEdit *widg, QMainWindow *mainWin, QObject *parent) noexcept
+EditorProxy::EditorProxy(QPlainTextEdit *widg, QObject *parent) noexcept
     : QObject(parent)
     , widget(widg)
-    , mainWindow(mainWin)
 {
 }
 
@@ -143,26 +127,28 @@ EditorProxy::changeExtraInformation(const QString &info) noexcept
 void
 EditorProxy::updateStatusBar() noexcept
 {
-    static constexpr int msgMaxSize = 80;
-    int slack                       = msgMaxSize - statusMessage.size() - statusData.size();
-    QString msg                     = statusMessage + QString(slack, QLatin1Char(' ')) + statusData;
-    mainWindow->statusBar()->showMessage(msg);
+    vivyApp->getMainWindow()->statusBar()->showMessage(statusMessage); // + statusData
 }
 
 void
 EditorProxy::handleExCommand(bool *handled, const ExCommand &cmd) noexcept
 {
+    // :wq
     if (wantSaveAndQuit(cmd))
-        emit requestSaveAndQuit(); // :wq
+        emit requestSaveAndQuit();
 
+    // :w
     else if (wantSave(cmd))
-        emit requestSave(); // :w
+        emit requestSave();
 
     else if (wantQuit(cmd)) {
+        // :q!
         if (cmd.hasBang)
-            invalidate(); // :q!
+            invalidate();
+
+        // :q
         else
-            emit requestQuit(); // :q
+            emit requestQuit();
     }
 
     else if (wantRun(cmd))
@@ -380,8 +366,7 @@ EditorProxy::cancel(const QString &fileName) noexcept
 void
 EditorProxy::invalidate() noexcept
 {
-    TODO(Use a Vivy thing here !)
-    QApplication::quit();
+    TODO(Use a Vivy thing here : MainWindow->closeTab(this) !)
 }
 
 bool
diff --git a/src/UI/ScriptViews/EditorProxy.hh b/src/UI/ScriptViews/EditorProxy.hh
index 50a5b1e0..c088b268 100644
--- a/src/UI/ScriptViews/EditorProxy.hh
+++ b/src/UI/ScriptViews/EditorProxy.hh
@@ -24,10 +24,11 @@ using ExCommand      = FakeVim::Internal::ExCommand;
 
 class EditorProxy : public QObject {
     Q_OBJECT
+    VIVY_UNMOVABLE_OBJECT(EditorProxy)
+
+    explicit EditorProxy(QPlainTextEdit *widget, QObject *parent = nullptr) noexcept;
 
 public:
-    explicit EditorProxy(QPlainTextEdit *widget, QMainWindow *mw,
-                         QObject *parent = nullptr) noexcept;
     void openFile(const QString &fileName) noexcept;
 
     bool save(const QString &fileName) noexcept;
@@ -70,19 +71,15 @@ private:
     QString content() const noexcept;
 
     QPlainTextEdit *widget;
-    QMainWindow *mainWindow;
     QString statusMessage;
     QString statusData;
 
     QList<QTextEdit::ExtraSelection> searchSelection;
     QList<QTextEdit::ExtraSelection> clearSelection;
     QList<QTextEdit::ExtraSelection> blockSelection;
-};
 
-QWidget *createEditorWidget(bool usePlainTextEdit);
-void initHandler(FakeVimHandler *handler);
-void clearUndoRedo(QPlainTextEdit *editor);
-EditorProxy *connectSignals(FakeVimHandler *handler, QMainWindow *mainWindow,
-                            QPlainTextEdit *editor);
+public:
+    static EditorProxy *connectSignals(FakeVimHandler *handler, QPlainTextEdit *editor) noexcept;
+};
 
 }
-- 
GitLab