diff --git a/src/plugins/fakevim/handler.cpp b/src/plugins/fakevim/handler.cpp index 5103db105c82489fc93f410effda595b89149953..37c67f491eef9732e998038e7f878ded7aea640e 100644 --- a/src/plugins/fakevim/handler.cpp +++ b/src/plugins/fakevim/handler.cpp @@ -141,7 +141,7 @@ class FakeVimHandler::Private public: Private(FakeVimHandler *parent); - bool eventFilter(QObject *ob, QEvent *ev); + bool handleEvent(QKeyEvent *ev); void handleExCommand(const QString &cmd); private: @@ -187,6 +187,7 @@ private: QTextCursor selectRange(int beginLine, int endLine); public: + void setWidget(QWidget *ob); void enterInsertMode(); void enterCommandMode(); void showRedMessage(const QString &msg); @@ -194,6 +195,7 @@ public: void updateMiniBuffer(); void updateSelection(); void quit(); + QWidget *editor() const; public: QTextEdit *m_textedit; @@ -214,7 +216,6 @@ private: bool m_fakeEnd; - QWidget *editor() const; bool isSearchMode() const { return m_mode == SearchForwardMode || m_mode == SearchBackwardMode; } int m_gflag; // whether current command started with 'g' @@ -281,7 +282,7 @@ FakeVimHandler::Private::Private(FakeVimHandler *parent) m_config[ConfigStartOfLine] = ConfigOn; } -bool FakeVimHandler::Private::eventFilter(QObject *ob, QEvent *ev) +bool FakeVimHandler::Private::handleEvent(QKeyEvent *ev) { QKeyEvent *keyEvent = static_cast<QKeyEvent *>(ev); int key = keyEvent->key(); @@ -290,11 +291,6 @@ bool FakeVimHandler::Private::eventFilter(QObject *ob, QEvent *ev) return false; // Fake "End of line" - m_textedit = qobject_cast<QTextEdit *>(ob); - m_plaintextedit = qobject_cast<QPlainTextEdit *>(ob); - if (!m_textedit && !m_plaintextedit) - return false; - m_tc = EDITOR(textCursor()); if (m_fakeEnd) @@ -320,8 +316,8 @@ bool FakeVimHandler::Private::eventFilter(QObject *ob, QEvent *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) @@ -1454,6 +1450,11 @@ void FakeVimHandler::Private::quit() q->quitRequested(editor()); } +void FakeVimHandler::Private::setWidget(QWidget *ob) +{ + m_textedit = qobject_cast<QTextEdit *>(ob); + m_plaintextedit = qobject_cast<QPlainTextEdit *>(ob); +} /////////////////////////////////////////////////////////////////////// // @@ -1472,14 +1473,34 @@ FakeVimHandler::~FakeVimHandler() bool FakeVimHandler::eventFilter(QObject *ob, QEvent *ev) { - if (ev->type() != QEvent::KeyPress) - return QObject::eventFilter(ob, ev); - return d->eventFilter(ob, ev); + //if (ev->type() == QEvent::KeyPress || ev->type() == QEvent::ShortcutOverride) + // qDebug() << ob << ev->type() << qApp << d->editor() + // << QEvent::KeyPress << QEvent::ShortcutOverride; + + if (ev->type() == QEvent::KeyPress && ob == d->editor()) + return d->handleEvent(static_cast<QKeyEvent *>(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); + ev->accept(); + return true; + } + } + + return QObject::eventFilter(ob, ev); } void FakeVimHandler::addWidget(QWidget *widget) { widget->installEventFilter(this); + d->setWidget(widget); d->enterCommandMode(); if (QTextEdit *ed = qobject_cast<QTextEdit *>(widget)) { //ed->setCursorWidth(QFontMetrics(ed->font()).width(QChar('x'))); @@ -1488,7 +1509,8 @@ void FakeVimHandler::addWidget(QWidget *widget) //ed->setCursorWidth(QFontMetrics(ed->font()).width(QChar('x'))); ed->setLineWrapMode(QPlainTextEdit::NoWrap); } - d->showBlackMessage("vi emulation mode. Hit <Shift+Esc>:q<Return> to quit"); + //d->showBlackMessage("vi emulation mode. Hit <Shift+Esc>:q<Return> to quit"); + d->showBlackMessage("vi emulation mode."); d->updateMiniBuffer(); } @@ -1501,8 +1523,7 @@ void FakeVimHandler::removeWidget(QWidget *widget) void FakeVimHandler::handleCommand(QWidget *widget, const QString &cmd) { - d->m_textedit = qobject_cast<QTextEdit *>(widget); - d->m_plaintextedit = qobject_cast<QPlainTextEdit *>(widget); + d->setWidget(widget); d->handleExCommand(cmd); }