From c68c245fd1a6200b50b8daeeba12a4a97270a641 Mon Sep 17 00:00:00 2001
From: hluk <hluk@email.cz>
Date: Wed, 20 Nov 2013 20:16:04 +0100
Subject: [PATCH] FakeVim: Reset FakeVim properly after user command

If FakeVim mode is disabled, enable it just for the single requested
user command.

Keep useful messages shown for few seconds.

Task-number: QTCREATORBUG-10460
Change-Id: I89c1722542f47befbf2c24a663bf3d1c455b77d9
Reviewed-by: Mitch Curtis <mitch.curtis@digia.com>
Reviewed-by: hjk <hjk121@nokiamail.com>
---
 src/plugins/fakevim/fakevimplugin.cpp | 69 +++++++++++++++++++--------
 1 file changed, 49 insertions(+), 20 deletions(-)

diff --git a/src/plugins/fakevim/fakevimplugin.cpp b/src/plugins/fakevim/fakevimplugin.cpp
index b94bfe697c6..00d996166a7 100644
--- a/src/plugins/fakevim/fakevimplugin.cpp
+++ b/src/plugins/fakevim/fakevimplugin.cpp
@@ -99,6 +99,7 @@
 #include <QTextBlock>
 #include <QTextCursor>
 #include <QTextEdit>
+#include <QTimer>
 #include <QTreeWidgetItem>
 
 using namespace TextEditor;
@@ -120,7 +121,11 @@ class MiniBuffer : public QStackedWidget
     Q_OBJECT
 
 public:
-    MiniBuffer() : m_label(new QLabel(this)), m_edit(new QLineEdit(this)), m_eventFilter(0)
+    MiniBuffer()
+        : m_label(new QLabel(this))
+        , m_edit(new QLineEdit(this))
+        , m_eventFilter(0)
+        , m_lastMessageLevel(MessageMode)
     {
         connect(m_edit, SIGNAL(textEdited(QString)), SLOT(changed()));
         connect(m_edit, SIGNAL(cursorPositionChanged(int,int)), SLOT(changed()));
@@ -129,6 +134,10 @@ public:
 
         addWidget(m_label);
         addWidget(m_edit);
+
+        m_hideTimer.setSingleShot(true);
+        m_hideTimer.setInterval(8000);
+        connect(&m_hideTimer, SIGNAL(timeout()), SLOT(hide()));
     }
 
     void setContents(const QString &contents, int cursorPos, int anchorPos,
@@ -145,25 +154,32 @@ public:
             m_edit->blockSignals(false);
             setCurrentWidget(m_edit);
             m_edit->setFocus();
-        } else if (contents.isEmpty() && messageLevel != MessageShowCmd) {
-            hide();
         } else {
-            show();
-            m_label->setText(contents);
-
-            QString css;
-            if (messageLevel == MessageError) {
-                css = _("border:1px solid rgba(255,255,255,150);"
-                        "background-color:rgba(255,0,0,100);");
-            } else if (messageLevel == MessageWarning) {
-                css = _("border:1px solid rgba(255,255,255,120);"
-                        "background-color:rgba(255,255,0,20);");
-            } else if (messageLevel == MessageShowCmd) {
-                css = _("border:1px solid rgba(255,255,255,120);"
-                        "background-color:rgba(100,255,100,30);");
+            if (contents.isEmpty()) {
+                if (m_lastMessageLevel == MessageMode)
+                    hide();
+                else
+                    m_hideTimer.start();
+            } else {
+                m_hideTimer.stop();
+                show();
+
+                m_label->setText(contents);
+
+                QString css;
+                if (messageLevel == MessageError) {
+                    css = _("border:1px solid rgba(255,255,255,150);"
+                            "background-color:rgba(255,0,0,100);");
+                } else if (messageLevel == MessageWarning) {
+                    css = _("border:1px solid rgba(255,255,255,120);"
+                            "background-color:rgba(255,255,0,20);");
+                } else if (messageLevel == MessageShowCmd) {
+                    css = _("border:1px solid rgba(255,255,255,120);"
+                            "background-color:rgba(100,255,100,30);");
+                }
+                m_label->setStyleSheet(QString::fromLatin1(
+                    "*{border-radius:2px;padding-left:4px;padding-right:4px;%1}").arg(css));
             }
-            m_label->setStyleSheet(QString::fromLatin1(
-                "*{border-radius:2px;padding-left:4px;padding-right:4px;%1}").arg(css));
 
             if (m_edit->hasFocus())
                 emit edited(QString(), -1, -1);
@@ -183,6 +199,8 @@ public:
             }
             m_eventFilter = eventFilter;
         }
+
+        m_lastMessageLevel = messageLevel;
     }
 
     QSize sizeHint() const
@@ -209,6 +227,8 @@ private:
     QLabel *m_label;
     QLineEdit *m_edit;
     QObject *m_eventFilter;
+    QTimer m_hideTimer;
+    int m_lastMessageLevel;
 };
 
 ///////////////////////////////////////////////////////////////////////
@@ -1124,11 +1144,20 @@ void FakeVimPluginPrivate::userActionTriggered()
     const int key = act->data().toInt();
     if (!key)
         return;
-    QString cmd = userCommandMap().value(key);
     IEditor *editor = EditorManager::currentEditor();
     FakeVimHandler *handler = m_editorToHandler[editor];
-    if (handler)
+    if (handler) {
+        // If disabled, enable FakeVim mode just for single user command.
+        bool enableFakeVim = !theFakeVimSetting(ConfigUseFakeVim)->value().toBool();
+        if (enableFakeVim)
+            setUseFakeVimInternal(true);
+
+        const QString cmd = userCommandMap().value(key);
         handler->handleInput(cmd);
+
+        if (enableFakeVim)
+            setUseFakeVimInternal(false);
+    }
 }
 
 
-- 
GitLab