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