[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [ktexteditor] src/vimode: Begin to make sense of the handleKeyPress() - organise it as:
From: Simon St James <kdedevel () etotheipiplusone ! com>
Date: 2016-06-17 8:18:10
Message-ID: E1bDoyg-0002ZN-34 () scm ! kde ! org
[Download RAW message or body]
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/emulatedcommandbar.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* keyEvent )
+{
+ if (keyEvent->modifiers() == Qt::ControlModifier && (keyEvent->key() == \
Qt::Key_C || keyEvent->key() == Qt::Key_BracketLeft)) + {
+ if (m_currentCompletionType != None && m_completer->popup()->isVisible())
+ {
+ abortCompletionAndResetToPreCompletion();
+ return true;
+ }
+ }
+ if (keyEvent->modifiers() == Qt::ControlModifier && keyEvent->key() == \
Qt::Key_Space) { + CompletionStartParams completionStartParams = \
activateWordFromDocumentCompletion(); + \
startCompletion(completionStartParams); + return true;
+ }
+ if ((keyEvent->modifiers() == Qt::ControlModifier && keyEvent->key() == \
Qt::Key_P) || keyEvent->key() == Qt::Key_Down) { + if \
(!m_completer->popup()->isVisible()) { + CompletionStartParams \
completionStartParams; + if (m_mode == Command) {
+ completionStartParams = \
m_commandMode->completionInvoked(CompletionInvocation::ExtraContext); + } \
else { + completionStartParams = activateSearchHistoryCompletion();
+ }
+ startCompletion(completionStartParams);
+ if (m_currentCompletionType != None) {
+ setCompletionIndex(0);
+ }
+ } else {
+ // Descend to next row, wrapping around if necessary.
+ if (m_completer->currentRow() + 1 == m_completer->completionCount()) {
+ setCompletionIndex(0);
+ } else {
+ setCompletionIndex(m_completer->currentRow() + 1);
+ }
+ }
+ return true;
+ }
+ if ((keyEvent->modifiers() == Qt::ControlModifier && keyEvent->key() == \
Qt::Key_N) || keyEvent->key() == Qt::Key_Up) { + if \
(!m_completer->popup()->isVisible()) { + CompletionStartParams \
completionStartParams; + if (m_mode == Command) {
+ completionStartParams = \
m_commandMode->completionInvoked(CompletionInvocation::NormalContext); + } \
else { + completionStartParams = activateSearchHistoryCompletion();
+ }
+ startCompletion(completionStartParams);
+ setCompletionIndex(m_completer->completionCount() - 1);
+ } else {
+ // Ascend to previous row, wrapping around if necessary.
+ if (m_completer->currentRow() == 0) {
+ setCompletionIndex(m_completer->completionCount() - 1);
+ } else {
+ setCompletionIndex(m_completer->currentRow() - 1);
+ }
+ }
+ return true;
+ }
+ if (keyEvent->key() == Qt::Key_Enter || keyEvent->key() == Qt::Key_Return) {
+ if (m_completer->popup()->isVisible() && m_currentCompletionType == \
EmulatedCommandBar::WordFromDocument) { + deactivateCompletion();
+ } else {
+ m_wasAborted = false;
+ deactivateCompletion();
+ if (m_mode == Command) {
+ m_commandMode->completionChosen();
+ } else {
+ emit hideMe();
+ }
+ }
+ return true;
+ }
+ return false;
+}
+
+bool EmulatedCommandBar::barHandledKeypress ( const QKeyEvent* keyEvent )
+{
+ if ((keyEvent->modifiers() == Qt::ControlModifier && keyEvent->key() == \
Qt::Key_H) || keyEvent->key() == Qt::Key_Backspace) { + if \
(m_edit->text().isEmpty()) { + emit hideMe();
+ }
+ m_edit->backspace();
+ return true;
+ }
+ if (keyEvent->modifiers() != Qt::ControlModifier)
+ return false;
+ if (keyEvent->key() == Qt::Key_B) {
+ m_edit->setCursorPosition(0);
+ return true;
+ } else if (keyEvent->key() == Qt::Key_E) {
+ m_edit->setCursorPosition(m_edit->text().length());
+ return true;
+ } else if (keyEvent->key() == Qt::Key_W) {
+ deleteSpacesToLeftOfCursor();
+ if (!deleteNonWordCharsToLeftOfCursor()) {
+ deleteWordCharsToLeftOfCursor();
+ }
+ return true;
+ } else if (keyEvent->key() == Qt::Key_R || keyEvent->key() == Qt::Key_G) {
+ m_waitingForRegister = true;
+ m_waitingForRegisterIndicator->setVisible(true);
+ if (keyEvent->key() == Qt::Key_G) {
+ m_insertedTextShouldBeEscapedForSearchingAsLiteral = true;
+ }
+ return true;
+ }
+ return false;
+}
+
+void EmulatedCommandBar::insertRegisterContents(const QKeyEvent *keyEvent)
+{
+ if (keyEvent->key() != Qt::Key_Shift && keyEvent->key() != Qt::Key_Control) {
+ const QChar key = KeyParser::self()->KeyEventToQChar(*keyEvent).toLower();
+
+ const int oldCursorPosition = m_edit->cursorPosition();
+ QString textToInsert;
+ if (keyEvent->modifiers() == Qt::ControlModifier && keyEvent->key() == \
Qt::Key_W) { + textToInsert = \
m_view->doc()->wordAt(m_view->cursorPosition()); + } else {
+ textToInsert = \
m_viInputModeManager->globalState()->registers()->getContent(key); + }
+ if (m_insertedTextShouldBeEscapedForSearchingAsLiteral) {
+ textToInsert = escapedForSearchingAsLiteral(textToInsert);
+ m_insertedTextShouldBeEscapedForSearchingAsLiteral = false;
+ }
+ m_edit->setText(m_edit->text().insert(m_edit->cursorPosition(), \
textToInsert)); + m_edit->setCursorPosition(oldCursorPosition + \
textToInsert.length()); + m_waitingForRegister = false;
+ m_waitingForRegisterIndicator->setVisible(false);
+ }
+}
+
bool EmulatedCommandBar::eventFilter(QObject *object, QEvent *event)
{
Q_ASSERT(object == m_edit || object == m_completer->popup());
@@ -609,155 +740,57 @@ void EmulatedCommandBar::setCompletionIndex(int index)
bool EmulatedCommandBar::handleKeyPress(const QKeyEvent *keyEvent)
{
- if (keyEvent->modifiers() == Qt::ControlModifier && (keyEvent->key() == \
Qt::Key_C || keyEvent->key() == Qt::Key_BracketLeft) && \
!m_waitingForRegister) {
- if (m_currentCompletionType == 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() == Qt::ControlModifier && keyEvent->key() == \
Qt::Key_Space) {
- CompletionStartParams completionStartParams = \
activateWordFromDocumentCompletion();
- startCompletion(completionStartParams);
- return true;
+ const bool handled = m_interactiveSedReplaceMode->handleKeyPress(keyEvent);
+ if (handled)
+ return true;
}
- if ((keyEvent->modifiers() == Qt::ControlModifier && keyEvent->key() == \
Qt::Key_P) || keyEvent->key() == Qt::Key_Down) {
- if (!m_completer->popup()->isVisible()) {
- CompletionStartParams completionStartParams;
- if (m_mode == Command) {
- completionStartParams = \
m_commandMode->completionInvoked(CompletionInvocation::ExtraContext);
- } else {
- completionStartParams = activateSearchHistoryCompletion();
- }
- startCompletion(completionStartParams);
- if (m_currentCompletionType != None) {
- setCompletionIndex(0);
- }
+ if (keyEvent->modifiers() == Qt::ControlModifier && (keyEvent->key() == \
Qt::Key_C || keyEvent->key() == Qt::Key_BracketLeft)) { + const bool handled = \
completerHandledKeypress(keyEvent); + if (handled)
+ return true;
+ if (m_currentCompletionType == None || !m_completer->popup()->isVisible()) {
+ emit hideMe();
} else {
- // Descend to next row, wrapping around if necessary.
- if (m_completer->currentRow() + 1 == m_completer->completionCount()) {
- setCompletionIndex(0);
- } else {
- setCompletionIndex(m_completer->currentRow() + 1);
- }
+ abortCompletionAndResetToPreCompletion();
}
return true;
}
- if ((keyEvent->modifiers() == Qt::ControlModifier && keyEvent->key() == \
Qt::Key_N) || keyEvent->key() == Qt::Key_Up) {
- if (!m_completer->popup()->isVisible()) {
- CompletionStartParams completionStartParams;
- if (m_mode == Command) {
- completionStartParams = \
m_commandMode->completionInvoked(CompletionInvocation::NormalContext);
- } else {
- completionStartParams = activateSearchHistoryCompletion();
- }
- startCompletion(completionStartParams);
- setCompletionIndex(m_completer->completionCount() - 1);
- } else {
- // Ascend to previous row, wrapping around if necessary.
- if (m_completer->currentRow() == 0) {
- setCompletionIndex(m_completer->completionCount() - 1);
- } else {
- setCompletionIndex(m_completer->currentRow() - 1);
- }
- }
- return true;
+ if (!m_interactiveSedReplaceMode->isActive())
+ {
+ const bool handled = completerHandledKeypress(keyEvent);
+ if (handled)
+ return true;
}
- if (m_waitingForRegister) {
- if (keyEvent->key() != Qt::Key_Shift && keyEvent->key() != Qt::Key_Control) \
{
- const QChar key = \
KeyParser::self()->KeyEventToQChar(*keyEvent).toLower();
-
- const int oldCursorPosition = m_edit->cursorPosition();
- QString textToInsert;
- if (keyEvent->modifiers() == Qt::ControlModifier && keyEvent->key() == \
Qt::Key_W) {
- textToInsert = m_view->doc()->wordAt(m_view->cursorPosition());
- } else {
- textToInsert = \
m_viInputModeManager->globalState()->registers()->getContent(key);
- }
- if (m_insertedTextShouldBeEscapedForSearchingAsLiteral) {
- textToInsert = escapedForSearchingAsLiteral(textToInsert);
- m_insertedTextShouldBeEscapedForSearchingAsLiteral = false;
- }
- m_edit->setText(m_edit->text().insert(m_edit->cursorPosition(), \
textToInsert));
- m_edit->setCursorPosition(oldCursorPosition + textToInsert.length());
- m_waitingForRegister = false;
- m_waitingForRegisterIndicator->setVisible(false);
- }
- } else if ((keyEvent->modifiers() == Qt::ControlModifier && keyEvent->key() == \
Qt::Key_H) || keyEvent->key() == 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 register, \
ctrl-h, etc? + const bool barHandled = barHandledKeypress(keyEvent);
+ if (barHandled)
return true;
- } else if (keyEvent->modifiers() == Qt::ControlModifier) {
- if (keyEvent->key() == Qt::Key_B) {
- m_edit->setCursorPosition(0);
- return true;
- } else if (keyEvent->key() == Qt::Key_E) {
- m_edit->setCursorPosition(m_edit->text().length());
- return true;
- } else if (keyEvent->key() == Qt::Key_W) {
- deleteSpacesToLeftOfCursor();
- if (!deleteNonWordCharsToLeftOfCursor()) {
- deleteWordCharsToLeftOfCursor();
- }
- return true;
- } else if (keyEvent->key() == Qt::Key_R || keyEvent->key() == Qt::Key_G) {
- m_waitingForRegister = true;
- m_waitingForRegisterIndicator->setVisible(true);
- if (keyEvent->key() == Qt::Key_G) {
- m_insertedTextShouldBeEscapedForSearchingAsLiteral = true;
- }
- return true;
- } else if (keyEvent->key() == Qt::Key_D || keyEvent->key() == Qt::Key_F) {
- if (m_mode == Command) {
- CommandMode::ParsedSedExpression parsedSedExpression = \
m_commandMode->parseAsSedExpression();
- if (parsedSedExpression.parsedSuccessfully) {
- const bool clearFindTerm = (keyEvent->key() == Qt::Key_D);
- if (clearFindTerm) {
- m_edit->setSelection(parsedSedExpression.findBeginPos, \
parsedSedExpression.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());
- }
- }
- }
+
+ // Can the current mode handle it?
+ if (m_mode == Command) {
+ const bool commandModeHandled = m_commandMode->handleKeyPress(keyEvent);
+ if (commandModeHandled)
return true;
- }
- return false;
- } else if (keyEvent->key() == Qt::Key_Enter || keyEvent->key() == \
Qt::Key_Return) {
- if (m_completer->popup()->isVisible() && m_currentCompletionType == \
EmulatedCommandBar::WordFromDocument) {
- deactivateCompletion();
- } else {
- m_wasAborted = false;
- deactivateCompletion();
- if (m_mode == Command) {
- m_commandMode->completionChosen();
- } else {
- emit hideMe();
- }
- }
- return true;
- } else {
- m_suspendEditEventFiltering = true;
- // 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 Mode), \
and the keypress that causes it
- // is not dispatched from within KateViInputModeHandler::handleKeypress(...)
- // (so KateViInputModeManager::isHandlingKeypress() returns false), we lose \
information about whether we are
- // in Visual Mode, Visual Line Mode, etc. See \
VisualViMode::updateSelection( ).
- 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 = 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 Mode), and the keypress that causes it + // is \
not dispatched from within KateViInputModeHandler::handleKeypress(...) + // (so \
KateViInputModeManager::isHandlingKeypress() returns false), we lose information \
about whether we are + // in Visual Mode, Visual Line Mode, etc. See \
VisualViMode::updateSelection( ). + m_suspendEditEventFiltering = true;
+ 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 = false;
return true;
}
@@ -947,19 +980,24 @@ bool \
EmulatedCommandBar::InteractiveSedReplaceMode::handleKeyPress(const QKeyEve \
moveCursorTo(cursorPosIfFinalMatch); finishInteractiveSedReplace();
}
+ qDebug() << "y/n";
return true;
} else if (keyEvent->text() == QLatin1String("l")) {
m_interactiveSedReplacer->replaceCurrentMatch();
finishInteractiveSedReplace();
+ qDebug() << "l";
return true;
} else if (keyEvent->text() == QLatin1String("q")) {
finishInteractiveSedReplace();
+ qDebug() << "q";
return true;
} else if (keyEvent->text() == QLatin1String("a")) {
m_interactiveSedReplacer->replaceAllRemaining();
finishInteractiveSedReplace();
+ qDebug() << "a";
return true;
}
+ qDebug() << "Returning false";
return false;
}
@@ -1148,7 +1186,21 @@ void EmulatedCommandBar::CommandMode::setViInputModeManager ( \
InputModeManager*
bool EmulatedCommandBar::CommandMode::handleKeyPress ( const QKeyEvent* keyEvent )
{
- Q_UNUSED(keyEvent);
+ if (keyEvent->modifiers() == Qt::ControlModifier && (keyEvent->key() == \
Qt::Key_D || keyEvent->key() == Qt::Key_F)) { + \
CommandMode::ParsedSedExpression parsedSedExpression = parseAsSedExpression(); + \
if (parsedSedExpression.parsedSuccessfully) { + const bool clearFindTerm = \
(keyEvent->key() == Qt::Key_D); + if (clearFindTerm) {
+ m_edit->setSelection(parsedSedExpression.findBeginPos, \
parsedSedExpression.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/emulatedcommandbar.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();
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic