From 816b83feed66679f22764dd01e4f294bc9b02db6 Mon Sep 17 00:00:00 2001 From: hjk <qtc-committer@nokia.com> Date: Fri, 9 Jan 2009 12:51:10 +0100 Subject: [PATCH] use ',' as "Escape to Application" schortcut --- src/plugins/fakevim/handler.cpp | 51 ++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 16 deletions(-) diff --git a/src/plugins/fakevim/handler.cpp b/src/plugins/fakevim/handler.cpp index 37c67f491ee..b756c353449 100644 --- a/src/plugins/fakevim/handler.cpp +++ b/src/plugins/fakevim/handler.cpp @@ -84,6 +84,7 @@ enum Mode ExMode, SearchForwardMode, SearchBackwardMode, + PassingMode, // lets keyevents to be passed to the main application }; enum SubMode @@ -200,6 +201,7 @@ public: public: QTextEdit *m_textedit; QPlainTextEdit *m_plaintextedit; + bool m_wasReadOnly; // saves read-only state of document private: FakeVimHandler *q; @@ -284,8 +286,13 @@ FakeVimHandler::Private::Private(FakeVimHandler *parent) bool FakeVimHandler::Private::handleEvent(QKeyEvent *ev) { - QKeyEvent *keyEvent = static_cast<QKeyEvent *>(ev); - int key = keyEvent->key(); + int key = ev->key(); + + if (m_mode == PassingMode && key != Qt::Key_Control && key != Qt::Key_Shift) { + enterCommandMode(); + return false; + } + if (key == Key_Shift || key == Key_Alt || key == Key_Control || key == Key_Alt || key == Key_AltGr || key == Key_Meta) return false; @@ -297,11 +304,11 @@ bool FakeVimHandler::Private::handleEvent(QKeyEvent *ev) m_tc.movePosition(Right, MoveAnchor, 1); if (key >= Key_A && key <= Key_Z - && (keyEvent->modifiers() & Qt::ShiftModifier) == 0) + && (ev->modifiers() & Qt::ShiftModifier) == 0) key += 32; - if ((keyEvent->modifiers() & Qt::ControlModifier) != 0) + if ((ev->modifiers() & Qt::ControlModifier) != 0) key += 256; - bool handled = handleKey(key, keyEvent->text()); + bool handled = handleKey(key, ev->text()); // We fake vi-style end-of-line behaviour m_fakeEnd = (atEol() && m_mode == CommandMode); @@ -316,8 +323,8 @@ bool FakeVimHandler::Private::handleEvent(QKeyEvent *ev) bool FakeVimHandler::Private::handleKey(int key, const QString &text) { - qDebug() << "KEY: " << key << text << "POS: " << m_tc.position(); - qDebug() << "\nUNDO: " << m_undoStack << "\nREDO: " << m_redoStack; + //qDebug() << "KEY: " << key << text << "POS: " << m_tc.position(); + //qDebug() << "\nUNDO: " << m_undoStack << "\nREDO: " << m_redoStack; if (m_mode == InsertMode) return handleInsertMode(key, text); if (m_mode == CommandMode) @@ -422,7 +429,9 @@ void FakeVimHandler::Private::updateSelection() void FakeVimHandler::Private::updateMiniBuffer() { QString msg; - if (!m_currentMessage.isEmpty()) { + if (m_mode == PassingMode) { + msg = "-- PASSING --"; + } else if (!m_currentMessage.isEmpty()) { msg = m_currentMessage; m_currentMessage.clear(); } else if (m_mode == CommandMode && m_visualMode != NoVisualMode) { @@ -580,6 +589,10 @@ bool FakeVimHandler::Private::handleCommandMode(int key, const QString &text) } else if (key == '$' || key == Key_End) { m_tc.movePosition(EndOfLine, KeepAnchor); finishMovement(); + } else if (key == ',') { + // FIXME: use some other mechanism + m_mode = PassingMode; + updateMiniBuffer(); } else if (key == '.') { qDebug() << "REPEATING" << m_dotCommand; for (int i = count(); --i >= 0; ) @@ -1482,13 +1495,12 @@ bool FakeVimHandler::eventFilter(QObject *ob, QEvent *ev) if (ev->type() == QEvent::ShortcutOverride && ob == d->editor()) { QKeyEvent *kev = static_cast<QKeyEvent *>(ev); - bool handleIt = kev->key() == Qt::Key_Escape - || (kev->key() == Key_B && kev->modifiers() == Qt::ControlModifier) - || (kev->key() == Key_F && kev->modifiers() == Qt::ControlModifier) - || (kev->key() == Key_R && kev->modifiers() == Qt::ControlModifier) - || (kev->key() == Key_V && kev->modifiers() == Qt::ControlModifier); - if (handleIt) { - d->handleEvent(kev); + int key = kev->key(); + int mods = kev->modifiers(); + bool handleIt = (key == Qt::Key_Escape) + || (key >= Key_A && key <= Key_Z && mods == Qt::ControlModifier); + if (handleIt && d->handleEvent(kev)) { + d->enterCommandMode(); ev->accept(); return true; } @@ -1505,20 +1517,27 @@ void FakeVimHandler::addWidget(QWidget *widget) if (QTextEdit *ed = qobject_cast<QTextEdit *>(widget)) { //ed->setCursorWidth(QFontMetrics(ed->font()).width(QChar('x'))); ed->setLineWrapMode(QTextEdit::NoWrap); + d->m_wasReadOnly = ed->isReadOnly(); } else if (QPlainTextEdit *ed = qobject_cast<QPlainTextEdit *>(widget)) { //ed->setCursorWidth(QFontMetrics(ed->font()).width(QChar('x'))); ed->setLineWrapMode(QPlainTextEdit::NoWrap); + d->m_wasReadOnly = ed->isReadOnly(); } - //d->showBlackMessage("vi emulation mode. Hit <Shift+Esc>:q<Return> to quit"); d->showBlackMessage("vi emulation mode."); d->updateMiniBuffer(); } void FakeVimHandler::removeWidget(QWidget *widget) { + d->setWidget(widget); d->showBlackMessage(QString()); d->updateMiniBuffer(); widget->removeEventFilter(this); + if (QTextEdit *ed = qobject_cast<QTextEdit *>(widget)) { + ed->setReadOnly(d->m_wasReadOnly); + } else if (QPlainTextEdit *ed = qobject_cast<QPlainTextEdit *>(widget)) { + ed->setReadOnly(d->m_wasReadOnly); + } } void FakeVimHandler::handleCommand(QWidget *widget, const QString &cmd) -- GitLab