Git commit a32c237eb45c5f3988b88387d9711db246e2f6d3 by Simon St James. Committed on 17/06/2016 at 08:14. Pushed by sstjames into branch 'master'. Begin to make sense of the handleKeyPress() - organise it as: - Is completer active? If so, and it handles the event, return true. - Is the keypress a built-in thing recognisable by EmulatedCommandBar (e.g.= ctrl-r)? If so, return true. - Waiting for register? Return true. - Else, hand off to current mode. M +190 -138 src/vimode/emulatedcommandbar.cpp M +3 -0 src/vimode/emulatedcommandbar.h http://commits.kde.org/ktexteditor/a32c237eb45c5f3988b88387d9711db246e2f6d3 diff --git a/src/vimode/emulatedcommandbar.cpp b/src/vimode/emulatedcommand= bar.cpp index 3a3b24f..63012f0 100644 --- a/src/vimode/emulatedcommandbar.cpp +++ b/src/vimode/emulatedcommandbar.cpp @@ -430,6 +430,137 @@ void EmulatedCommandBar::updateMatchHighlightAttrib() m_matchHighligher->updateMatchHighlightAttrib(); } = +bool EmulatedCommandBar::completerHandledKeypress ( const QKeyEvent* keyEv= ent ) +{ + if (keyEvent->modifiers() =3D=3D Qt::ControlModifier && (keyEvent->key= () =3D=3D Qt::Key_C || keyEvent->key() =3D=3D Qt::Key_BracketLeft)) + { + if (m_currentCompletionType !=3D None && m_completer->popup()->isV= isible()) + { + abortCompletionAndResetToPreCompletion(); + return true; + } + } + if (keyEvent->modifiers() =3D=3D Qt::ControlModifier && keyEvent->key(= ) =3D=3D Qt::Key_Space) { + CompletionStartParams completionStartParams =3D activateWordFromDo= cumentCompletion(); + startCompletion(completionStartParams); + return true; + } + if ((keyEvent->modifiers() =3D=3D Qt::ControlModifier && keyEvent->key= () =3D=3D Qt::Key_P) || keyEvent->key() =3D=3D Qt::Key_Down) { + if (!m_completer->popup()->isVisible()) { + CompletionStartParams completionStartParams; + if (m_mode =3D=3D Command) { + completionStartParams =3D m_commandMode->completionInvoked= (CompletionInvocation::ExtraContext); + } else { + completionStartParams =3D activateSearchHistoryCompletion(= ); + } + startCompletion(completionStartParams); + if (m_currentCompletionType !=3D None) { + setCompletionIndex(0); + } + } else { + // Descend to next row, wrapping around if necessary. + if (m_completer->currentRow() + 1 =3D=3D m_completer->completi= onCount()) { + setCompletionIndex(0); + } else { + setCompletionIndex(m_completer->currentRow() + 1); + } + } + return true; + } + if ((keyEvent->modifiers() =3D=3D Qt::ControlModifier && keyEvent->key= () =3D=3D Qt::Key_N) || keyEvent->key() =3D=3D Qt::Key_Up) { + if (!m_completer->popup()->isVisible()) { + CompletionStartParams completionStartParams; + if (m_mode =3D=3D Command) { + completionStartParams =3D m_commandMode->completionInvoked= (CompletionInvocation::NormalContext); + } else { + completionStartParams =3D activateSearchHistoryCompletion(= ); + } + startCompletion(completionStartParams); + setCompletionIndex(m_completer->completionCount() - 1); + } else { + // Ascend to previous row, wrapping around if necessary. + if (m_completer->currentRow() =3D=3D 0) { + setCompletionIndex(m_completer->completionCount() - 1); + } else { + setCompletionIndex(m_completer->currentRow() - 1); + } + } + return true; + } + if (keyEvent->key() =3D=3D Qt::Key_Enter || keyEvent->key() =3D=3D Qt:= :Key_Return) { + if (m_completer->popup()->isVisible() && m_currentCompletionType = =3D=3D EmulatedCommandBar::WordFromDocument) { + deactivateCompletion(); + } else { + m_wasAborted =3D false; + deactivateCompletion(); + if (m_mode =3D=3D Command) { + m_commandMode->completionChosen(); + } else { + emit hideMe(); + } + } + return true; + } + return false; +} + +bool EmulatedCommandBar::barHandledKeypress ( const QKeyEvent* keyEvent ) +{ + if ((keyEvent->modifiers() =3D=3D Qt::ControlModifier && keyEvent->key= () =3D=3D Qt::Key_H) || keyEvent->key() =3D=3D Qt::Key_Backspace) { + if (m_edit->text().isEmpty()) { + emit hideMe(); + } + m_edit->backspace(); + return true; + } + if (keyEvent->modifiers() !=3D Qt::ControlModifier) + return false; + if (keyEvent->key() =3D=3D Qt::Key_B) { + m_edit->setCursorPosition(0); + return true; + } else if (keyEvent->key() =3D=3D Qt::Key_E) { + m_edit->setCursorPosition(m_edit->text().length()); + return true; + } else if (keyEvent->key() =3D=3D Qt::Key_W) { + deleteSpacesToLeftOfCursor(); + if (!deleteNonWordCharsToLeftOfCursor()) { + deleteWordCharsToLeftOfCursor(); + } + return true; + } else if (keyEvent->key() =3D=3D Qt::Key_R || keyEvent->key() =3D=3D = Qt::Key_G) { + m_waitingForRegister =3D true; + m_waitingForRegisterIndicator->setVisible(true); + if (keyEvent->key() =3D=3D Qt::Key_G) { + m_insertedTextShouldBeEscapedForSearchingAsLiteral =3D true; + } + return true; + } + return false; +} + +void EmulatedCommandBar::insertRegisterContents(const QKeyEvent *keyEvent) +{ + if (keyEvent->key() !=3D Qt::Key_Shift && keyEvent->key() !=3D Qt::Key= _Control) { + const QChar key =3D KeyParser::self()->KeyEventToQChar(*keyEvent).= toLower(); + + const int oldCursorPosition =3D m_edit->cursorPosition(); + QString textToInsert; + if (keyEvent->modifiers() =3D=3D Qt::ControlModifier && keyEvent->= key() =3D=3D Qt::Key_W) { + textToInsert =3D m_view->doc()->wordAt(m_view->cursorPosition(= )); + } else { + textToInsert =3D m_viInputModeManager->globalState()->register= s()->getContent(key); + } + if (m_insertedTextShouldBeEscapedForSearchingAsLiteral) { + textToInsert =3D escapedForSearchingAsLiteral(textToInsert); + m_insertedTextShouldBeEscapedForSearchingAsLiteral =3D false; + } + m_edit->setText(m_edit->text().insert(m_edit->cursorPosition(), te= xtToInsert)); + m_edit->setCursorPosition(oldCursorPosition + textToInsert.length(= )); + m_waitingForRegister =3D false; + m_waitingForRegisterIndicator->setVisible(false); + } +} + bool EmulatedCommandBar::eventFilter(QObject *object, QEvent *event) { Q_ASSERT(object =3D=3D m_edit || object =3D=3D m_completer->popup()); @@ -609,155 +740,57 @@ void EmulatedCommandBar::setCompletionIndex(int inde= x) = bool EmulatedCommandBar::handleKeyPress(const QKeyEvent *keyEvent) { - if (keyEvent->modifiers() =3D=3D Qt::ControlModifier && (keyEvent->key= () =3D=3D Qt::Key_C || keyEvent->key() =3D=3D Qt::Key_BracketLeft) && !m_wa= itingForRegister) { - if (m_currentCompletionType =3D=3D None || !m_completer->popup()->= isVisible()) { - emit hideMe(); - } else { - abortCompletionAndResetToPreCompletion(); - } + if (m_waitingForRegister) { + insertRegisterContents(keyEvent); return true; } if (m_interactiveSedReplaceMode->isActive()) { - return m_interactiveSedReplaceMode->handleKeyPress(keyEvent); - } - if (keyEvent->modifiers() =3D=3D Qt::ControlModifier && keyEvent->key(= ) =3D=3D Qt::Key_Space) { - CompletionStartParams completionStartParams =3D activateWordFromDo= cumentCompletion(); - startCompletion(completionStartParams); - return true; + const bool handled =3D m_interactiveSedReplaceMode->handleKeyPress= (keyEvent); + if (handled) + return true; } - if ((keyEvent->modifiers() =3D=3D Qt::ControlModifier && keyEvent->key= () =3D=3D Qt::Key_P) || keyEvent->key() =3D=3D Qt::Key_Down) { - if (!m_completer->popup()->isVisible()) { - CompletionStartParams completionStartParams; - if (m_mode =3D=3D Command) { - completionStartParams =3D m_commandMode->completionInvoked= (CompletionInvocation::ExtraContext); - } else { - completionStartParams =3D activateSearchHistoryCompletion(= ); - } - startCompletion(completionStartParams); - if (m_currentCompletionType !=3D None) { - setCompletionIndex(0); - } + if (keyEvent->modifiers() =3D=3D Qt::ControlModifier && (keyEvent->key= () =3D=3D Qt::Key_C || keyEvent->key() =3D=3D Qt::Key_BracketLeft)) { + const bool handled =3D completerHandledKeypress(keyEvent); + if (handled) + return true; + if (m_currentCompletionType =3D=3D None || !m_completer->popup()->= isVisible()) { + emit hideMe(); } else { - // Descend to next row, wrapping around if necessary. - if (m_completer->currentRow() + 1 =3D=3D m_completer->completi= onCount()) { - setCompletionIndex(0); - } else { - setCompletionIndex(m_completer->currentRow() + 1); - } + abortCompletionAndResetToPreCompletion(); } return true; } - if ((keyEvent->modifiers() =3D=3D Qt::ControlModifier && keyEvent->key= () =3D=3D Qt::Key_N) || keyEvent->key() =3D=3D Qt::Key_Up) { - if (!m_completer->popup()->isVisible()) { - CompletionStartParams completionStartParams; - if (m_mode =3D=3D Command) { - completionStartParams =3D m_commandMode->completionInvoked= (CompletionInvocation::NormalContext); - } else { - completionStartParams =3D activateSearchHistoryCompletion(= ); - } - startCompletion(completionStartParams); - setCompletionIndex(m_completer->completionCount() - 1); - } else { - // Ascend to previous row, wrapping around if necessary. - if (m_completer->currentRow() =3D=3D 0) { - setCompletionIndex(m_completer->completionCount() - 1); - } else { - setCompletionIndex(m_completer->currentRow() - 1); - } - } - return true; + if (!m_interactiveSedReplaceMode->isActive()) + { + const bool handled =3D completerHandledKeypress(keyEvent); + if (handled) + return true; } - if (m_waitingForRegister) { - if (keyEvent->key() !=3D Qt::Key_Shift && keyEvent->key() !=3D Qt:= :Key_Control) { - const QChar key =3D KeyParser::self()->KeyEventToQChar(*keyEve= nt).toLower(); - - const int oldCursorPosition =3D m_edit->cursorPosition(); - QString textToInsert; - if (keyEvent->modifiers() =3D=3D Qt::ControlModifier && keyEve= nt->key() =3D=3D Qt::Key_W) { - textToInsert =3D m_view->doc()->wordAt(m_view->cursorPosit= ion()); - } else { - textToInsert =3D m_viInputModeManager->globalState()->regi= sters()->getContent(key); - } - if (m_insertedTextShouldBeEscapedForSearchingAsLiteral) { - textToInsert =3D escapedForSearchingAsLiteral(textToInsert= ); - m_insertedTextShouldBeEscapedForSearchingAsLiteral =3D fal= se; - } - m_edit->setText(m_edit->text().insert(m_edit->cursorPosition()= , textToInsert)); - m_edit->setCursorPosition(oldCursorPosition + textToInsert.len= gth()); - m_waitingForRegister =3D false; - m_waitingForRegisterIndicator->setVisible(false); - } - } else if ((keyEvent->modifiers() =3D=3D Qt::ControlModifier && keyEve= nt->key() =3D=3D Qt::Key_H) || keyEvent->key() =3D=3D Qt::Key_Backspace) { - if (m_edit->text().isEmpty()) { - emit hideMe(); - } - m_edit->backspace(); + // Is this a built-in Emulated Command Bar keypress e.g. insert from r= egister, ctrl-h, etc? + const bool barHandled =3D barHandledKeypress(keyEvent); + if (barHandled) return true; - } else if (keyEvent->modifiers() =3D=3D Qt::ControlModifier) { - if (keyEvent->key() =3D=3D Qt::Key_B) { - m_edit->setCursorPosition(0); - return true; - } else if (keyEvent->key() =3D=3D Qt::Key_E) { - m_edit->setCursorPosition(m_edit->text().length()); - return true; - } else if (keyEvent->key() =3D=3D Qt::Key_W) { - deleteSpacesToLeftOfCursor(); - if (!deleteNonWordCharsToLeftOfCursor()) { - deleteWordCharsToLeftOfCursor(); - } - return true; - } else if (keyEvent->key() =3D=3D Qt::Key_R || keyEvent->key() =3D= =3D Qt::Key_G) { - m_waitingForRegister =3D true; - m_waitingForRegisterIndicator->setVisible(true); - if (keyEvent->key() =3D=3D Qt::Key_G) { - m_insertedTextShouldBeEscapedForSearchingAsLiteral =3D tru= e; - } - return true; - } else if (keyEvent->key() =3D=3D Qt::Key_D || keyEvent->key() =3D= =3D Qt::Key_F) { - if (m_mode =3D=3D Command) { - CommandMode::ParsedSedExpression parsedSedExpression =3D m= _commandMode->parseAsSedExpression(); - if (parsedSedExpression.parsedSuccessfully) { - const bool clearFindTerm =3D (keyEvent->key() =3D=3D Q= t::Key_D); - if (clearFindTerm) { - m_edit->setSelection(parsedSedExpression.findBegin= Pos, parsedSedExpression.findEndPos - parsedSedExpression.findBeginPos + 1); - m_edit->insert(QString()); - } else { - // Clear replace term. - m_edit->setSelection(parsedSedExpression.replaceBe= ginPos, parsedSedExpression.replaceEndPos - parsedSedExpression.replaceBegi= nPos + 1); - m_edit->insert(QString()); - } - } - } + + // Can the current mode handle it? + if (m_mode =3D=3D Command) { + const bool commandModeHandled =3D m_commandMode->handleKeyPress(ke= yEvent); + if (commandModeHandled) return true; - } - return false; - } else if (keyEvent->key() =3D=3D Qt::Key_Enter || keyEvent->key() =3D= =3D Qt::Key_Return) { - if (m_completer->popup()->isVisible() && m_currentCompletionType = =3D=3D EmulatedCommandBar::WordFromDocument) { - deactivateCompletion(); - } else { - m_wasAborted =3D false; - deactivateCompletion(); - if (m_mode =3D=3D Command) { - m_commandMode->completionChosen(); - } else { - emit hideMe(); - } - } - return true; - } else { - m_suspendEditEventFiltering =3D true; - // Send the keypress back to the QLineEdit. Ideally, instead of d= oing this, we would simply return "false" - // and let Qt re-dispatch the event itself; however, there is a co= rner case in that if the selection - // changes (as a result of e.g. incremental searches during Visual= Mode), and the keypress that causes it - // is not dispatched from within KateViInputModeHandler::handleKey= press(...) - // (so KateViInputModeManager::isHandlingKeypress() returns false)= , we lose information about whether we are - // in Visual Mode, Visual Line Mode, etc. See VisualViMode::updat= eSelection( ). - QKeyEvent keyEventCopy(keyEvent->type(), keyEvent->key(), keyEvent= ->modifiers(), keyEvent->text(), keyEvent->isAutoRepeat(), keyEvent->count(= )); - if (!m_interactiveSedReplaceMode->isActive()) { - qApp->notify(m_edit, &keyEventCopy); - } - m_suspendEditEventFiltering =3D false; } + + // Couldn't handle this key event. + // Send the keypress back to the QLineEdit. Ideally, instead of doing= this, we would simply return "false" + // and let Qt re-dispatch the event itself; however, there is a corner= case in that if the selection + // changes (as a result of e.g. incremental searches during Visual Mod= e), and the keypress that causes it + // is not dispatched from within KateViInputModeHandler::handleKeypres= s(...) + // (so KateViInputModeManager::isHandlingKeypress() returns false), we= lose information about whether we are + // in Visual Mode, Visual Line Mode, etc. See VisualViMode::updateSel= ection( ). + m_suspendEditEventFiltering =3D true; + QKeyEvent keyEventCopy(keyEvent->type(), keyEvent->key(), keyEvent->mo= difiers(), keyEvent->text(), keyEvent->isAutoRepeat(), keyEvent->count()); + if (!m_interactiveSedReplaceMode->isActive()) { + qApp->notify(m_edit, &keyEventCopy); + } + m_suspendEditEventFiltering =3D false; return true; } = @@ -947,19 +980,24 @@ bool EmulatedCommandBar::InteractiveSedReplaceMode::h= andleKeyPress(const QKeyEve moveCursorTo(cursorPosIfFinalMatch); finishInteractiveSedReplace(); } + qDebug() << "y/n"; return true; } else if (keyEvent->text() =3D=3D QLatin1String("l")) { m_interactiveSedReplacer->replaceCurrentMatch(); finishInteractiveSedReplace(); + qDebug() << "l"; return true; } else if (keyEvent->text() =3D=3D QLatin1String("q")) { finishInteractiveSedReplace(); + qDebug() << "q"; return true; } else if (keyEvent->text() =3D=3D QLatin1String("a")) { m_interactiveSedReplacer->replaceAllRemaining(); finishInteractiveSedReplace(); + qDebug() << "a"; return true; } + qDebug() << "Returning false"; return false; } = @@ -1148,7 +1186,21 @@ void EmulatedCommandBar::CommandMode::setViInputMode= Manager ( InputModeManager* = bool EmulatedCommandBar::CommandMode::handleKeyPress ( const QKeyEvent* ke= yEvent ) { - Q_UNUSED(keyEvent); + if (keyEvent->modifiers() =3D=3D Qt::ControlModifier && (keyEvent->key= () =3D=3D Qt::Key_D || keyEvent->key() =3D=3D Qt::Key_F)) { + CommandMode::ParsedSedExpression parsedSedExpression =3D parseAsSe= dExpression(); + if (parsedSedExpression.parsedSuccessfully) { + const bool clearFindTerm =3D (keyEvent->key() =3D=3D Qt::Key_D= ); + if (clearFindTerm) { + m_edit->setSelection(parsedSedExpression.findBeginPos, par= sedSedExpression.findEndPos - parsedSedExpression.findBeginPos + 1); + m_edit->insert(QString()); + } else { + // Clear replace term. + m_edit->setSelection(parsedSedExpression.replaceBeginPos, = parsedSedExpression.replaceEndPos - parsedSedExpression.replaceBeginPos + 1= ); + m_edit->insert(QString()); + } + } + return true; + } return false; } = diff --git a/src/vimode/emulatedcommandbar.h b/src/vimode/emulatedcommandba= r.h index ffd05ea..a9a5705 100644 --- a/src/vimode/emulatedcommandbar.h +++ b/src/vimode/emulatedcommandbar.h @@ -260,6 +260,9 @@ private: int m_cursorPosToRevertToIfCompletionAborted; CompletionStartParams m_currentCompletionStartParams; = + bool completerHandledKeypress(const QKeyEvent* keyEvent); + bool barHandledKeypress(const QKeyEvent* keyEvent); + void insertRegisterContents(const QKeyEvent *keyEvent); bool eventFilter(QObject *object, QEvent *event) Q_DECL_OVERRIDE; void deleteSpacesToLeftOfCursor(); void deleteWordCharsToLeftOfCursor();