From f15e52f18f541f968ac12a1a9d874b7d4e3f8439 Mon Sep 17 00:00:00 2001 From: Ashar Date: Sun, 30 Aug 2020 14:19:44 +0530 Subject: [PATCH 01/17] Add Vim Cursor Vim Cursor is a rectangle with the character inside of it. This commit adds a member function called `setVimCursor()` and `vimCursor()` that sets and retrieves the cursor type the QCodeEditor is presenting. This cursor is only visible when FakeVim is attached to the Editor. The Rectangle is visible when in Normal/Visual mode and a zero width line is visible when in insert mode. --- include/internal/QCodeEditor.hpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/include/internal/QCodeEditor.hpp b/include/internal/QCodeEditor.hpp index c1c0f1d..d390f3a 100644 --- a/include/internal/QCodeEditor.hpp +++ b/include/internal/QCodeEditor.hpp @@ -143,6 +143,16 @@ class QCodeEditor : public QTextEdit */ void clearSquiggle(); + /** + * @brief Enables or disables Vim Like cursor + */ + void setVimCursor(bool value); + + /** + * @brief Checks if cursor type is Vim Cursor + */ + bool vimCursor() const; + Q_SIGNALS: /** * @brief Signal, the font is changed by the wheel event. @@ -384,10 +394,11 @@ class QCodeEditor : public QTextEdit bool m_autoIndentation; bool m_replaceTab; bool m_extraBottomMargin; + bool m_vimCursor; QString m_tabReplace; QList extra1, extra2, extra_squiggles; - + QRect m_cursorRect; QVector m_squiggler; QVector m_parentheses; From c43d11d350f131bfe0b515d59311edad59cc9d2b Mon Sep 17 00:00:00 2001 From: Ashar Date: Sun, 30 Aug 2020 14:23:28 +0530 Subject: [PATCH 02/17] Update QCodeEditor.cpp --- src/internal/QCodeEditor.cpp | 45 ++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/src/internal/QCodeEditor.cpp b/src/internal/QCodeEditor.cpp index 54dc9fc..ff93673 100644 --- a/src/internal/QCodeEditor.cpp +++ b/src/internal/QCodeEditor.cpp @@ -23,11 +23,12 @@ #include #include #include +#include QCodeEditor::QCodeEditor(QWidget *widget) : QTextEdit(widget), m_highlighter(nullptr), m_syntaxStyle(nullptr), m_lineNumberArea(new QLineNumberArea(this)), - m_completer(nullptr), m_autoIndentation(true), m_replaceTab(true), m_extraBottomMargin(true), - m_tabReplace(QString(4, ' ')), extra1(), extra2(), extra_squiggles(), m_squiggler(), + m_completer(nullptr), m_autoIndentation(true), m_replaceTab(true), m_extraBottomMargin(true), m_vimCursor(false), + m_tabReplace(QString(4, ' ')), extra1(), extra2(), extra_squiggles(), m_cursorRect(), m_squiggler(), m_parentheses({{'(', ')'}, {'{', '}'}, {'[', ']'}, {'\"', '\"'}, {'\'', '\''}}) { initFont(); @@ -544,6 +545,36 @@ void QCodeEditor::paintEvent(QPaintEvent *e) { updateLineNumberArea(e->rect()); QTextEdit::paintEvent(e); + + if (m_vimCursor){ + if ( !m_cursorRect.isNull() && e->rect().intersects(m_cursorRect) ) { + QRect rect = m_cursorRect; + m_cursorRect = QRect(); + QTextEdit::viewport()->update(rect); + } + + // Draw text cursor. + QRect rect = QTextEdit::cursorRect(); + if ( e->rect().intersects(rect) ) { + QPainter painter(QTextEdit::viewport()); + + if ( QTextEdit::overwriteMode() ) { + QFontMetrics fm(QTextEdit::font()); + const int position = QTextEdit::textCursor().position(); + const QChar c = QTextEdit::document()->characterAt(position); + rect.setWidth(fm.horizontalAdvance(c)); + painter.setPen(Qt::NoPen); + painter.setBrush(QTextEdit::palette().color(QPalette::Base)); + painter.setCompositionMode(QPainter::CompositionMode_Difference); + } else { + rect.setWidth(QTextEdit::cursorWidth()); + painter.setPen(QTextEdit::palette().color(QPalette::Text)); + } + + painter.drawRect(rect); + m_cursorRect = rect; + } + } } int QCodeEditor::getFirstVisibleBlock() @@ -875,6 +906,16 @@ void QCodeEditor::setTabReplace(bool enabled) m_replaceTab = enabled; } +void QCodeEditor::setVimCursor(bool enabled) +{ + m_vimCursor = enabled; +} + +bool QCodeEditor::vimCursor() const +{ + return m_vimCursor; +} + bool QCodeEditor::tabReplace() const { return m_replaceTab; From 371af6d1c58650d69fcdf50b91bfb194e896c7e3 Mon Sep 17 00:00:00 2001 From: Ashar Khan Date: Sun, 30 Aug 2020 14:27:03 +0530 Subject: [PATCH 03/17] Format Code --- src/internal/QCodeEditor.cpp | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/internal/QCodeEditor.cpp b/src/internal/QCodeEditor.cpp index ff93673..e3f736b 100644 --- a/src/internal/QCodeEditor.cpp +++ b/src/internal/QCodeEditor.cpp @@ -17,13 +17,13 @@ #include #include #include +#include #include #include #include #include #include #include -#include QCodeEditor::QCodeEditor(QWidget *widget) : QTextEdit(widget), m_highlighter(nullptr), m_syntaxStyle(nullptr), m_lineNumberArea(new QLineNumberArea(this)), @@ -546,8 +546,10 @@ void QCodeEditor::paintEvent(QPaintEvent *e) updateLineNumberArea(e->rect()); QTextEdit::paintEvent(e); - if (m_vimCursor){ - if ( !m_cursorRect.isNull() && e->rect().intersects(m_cursorRect) ) { + if (m_vimCursor) + { + if (!m_cursorRect.isNull() && e->rect().intersects(m_cursorRect)) + { QRect rect = m_cursorRect; m_cursorRect = QRect(); QTextEdit::viewport()->update(rect); @@ -555,10 +557,12 @@ void QCodeEditor::paintEvent(QPaintEvent *e) // Draw text cursor. QRect rect = QTextEdit::cursorRect(); - if ( e->rect().intersects(rect) ) { + if (e->rect().intersects(rect)) + { QPainter painter(QTextEdit::viewport()); - if ( QTextEdit::overwriteMode() ) { + if (QTextEdit::overwriteMode()) + { QFontMetrics fm(QTextEdit::font()); const int position = QTextEdit::textCursor().position(); const QChar c = QTextEdit::document()->characterAt(position); @@ -566,7 +570,9 @@ void QCodeEditor::paintEvent(QPaintEvent *e) painter.setPen(Qt::NoPen); painter.setBrush(QTextEdit::palette().color(QPalette::Base)); painter.setCompositionMode(QPainter::CompositionMode_Difference); - } else { + } + else + { rect.setWidth(QTextEdit::cursorWidth()); painter.setPen(QTextEdit::palette().color(QPalette::Text)); } @@ -908,12 +914,12 @@ void QCodeEditor::setTabReplace(bool enabled) void QCodeEditor::setVimCursor(bool enabled) { - m_vimCursor = enabled; + m_vimCursor = enabled; } -bool QCodeEditor::vimCursor() const +bool QCodeEditor::vimCursor() const { - return m_vimCursor; + return m_vimCursor; } bool QCodeEditor::tabReplace() const From eb807d2867f709ea744d47aa93b2040d3de5212f Mon Sep 17 00:00:00 2001 From: Ashar Khan Date: Tue, 1 Sep 2020 15:56:31 +0530 Subject: [PATCH 04/17] Do not paint cursor in insert mode --- src/internal/QCodeEditor.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/internal/QCodeEditor.cpp b/src/internal/QCodeEditor.cpp index e3f736b..b309bd5 100644 --- a/src/internal/QCodeEditor.cpp +++ b/src/internal/QCodeEditor.cpp @@ -571,11 +571,6 @@ void QCodeEditor::paintEvent(QPaintEvent *e) painter.setBrush(QTextEdit::palette().color(QPalette::Base)); painter.setCompositionMode(QPainter::CompositionMode_Difference); } - else - { - rect.setWidth(QTextEdit::cursorWidth()); - painter.setPen(QTextEdit::palette().color(QPalette::Text)); - } painter.drawRect(rect); m_cursorRect = rect; From a0484a6b2bef4a314150818635bf3a8695ebd8c6 Mon Sep 17 00:00:00 2001 From: Ashar Khan Date: Sat, 12 Sep 2020 14:48:48 +0530 Subject: [PATCH 05/17] Add overwrite mode support on INS press --- src/internal/QCodeEditor.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/internal/QCodeEditor.cpp b/src/internal/QCodeEditor.cpp index b309bd5..0bf475b 100644 --- a/src/internal/QCodeEditor.cpp +++ b/src/internal/QCodeEditor.cpp @@ -772,6 +772,27 @@ void QCodeEditor::keyPressEvent(QKeyEvent *e) return; } + // Toggle Overwrite and insert mode in non-vim modes. + if (e->key() == Qt::Key_Insert && !m_vimCursor) + { + setOverwriteMode(!overwriteMode()); + if (overwriteMode()) + { + QFontMetrics fm(QTextEdit::font()); + const int position = QTextEdit::textCursor().position(); + const QChar c = QTextEdit::document()->characterAt(position); + setCursorWidth(fm.horizontalAdvance(c)); + } + else + { + auto rect = cursorRect(); + setCursorWidth(1); + viewport()->update(rect); + } + + return; + } + if (e->key() == Qt::Key_Backspace && e->modifiers() == Qt::NoModifier && !textCursor().hasSelection()) { auto pre = charUnderCursor(-1); From f193800e77cb6135059b55008f390180eec59443 Mon Sep 17 00:00:00 2001 From: Ashar Khan Date: Sun, 13 Sep 2020 11:10:30 +0530 Subject: [PATCH 06/17] Vim cursor resets overwrite mode and sets cursor width to 0 --- src/internal/QCodeEditor.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/internal/QCodeEditor.cpp b/src/internal/QCodeEditor.cpp index 0bf475b..f15840f 100644 --- a/src/internal/QCodeEditor.cpp +++ b/src/internal/QCodeEditor.cpp @@ -931,6 +931,9 @@ void QCodeEditor::setTabReplace(bool enabled) void QCodeEditor::setVimCursor(bool enabled) { m_vimCursor = enabled; + + setOverwriteMode(false); + setCursorWidth(0); } bool QCodeEditor::vimCursor() const From 9714044f03ab6130f8400e51efe2111210da4a88 Mon Sep 17 00:00:00 2001 From: Ashar Khan Date: Tue, 15 Sep 2020 21:29:38 +0530 Subject: [PATCH 07/17] Disable line highlighting in vim mode --- src/internal/QCodeEditor.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/internal/QCodeEditor.cpp b/src/internal/QCodeEditor.cpp index f15840f..be20baf 100644 --- a/src/internal/QCodeEditor.cpp +++ b/src/internal/QCodeEditor.cpp @@ -499,16 +499,15 @@ void QCodeEditor::highlightParenthesis() void QCodeEditor::highlightCurrentLine() { - if (!isReadOnly()) + if (!isReadOnly() && !m_vimCursor) { QTextEdit::ExtraSelection selection{}; selection.format = m_syntaxStyle->getFormat("CurrentLine"); selection.format.setForeground(QBrush()); selection.format.setProperty(QTextFormat::FullWidthSelection, true); - selection.cursor = textCursor(); - selection.cursor.clearSelection(); - + selection.cursor = textCursor(); + selection.cursor.clearSelection(); extra1.append(selection); } } From 11b2683947a34e635422bccb0436c36e626af1e8 Mon Sep 17 00:00:00 2001 From: Ashar Khan Date: Thu, 17 Sep 2020 15:29:09 +0530 Subject: [PATCH 08/17] Add highlight line option and fix update of cursor color on theme change --- include/internal/QCodeEditor.hpp | 12 ++++++++++++ src/internal/QCodeEditor.cpp | 24 ++++++++++++++++++------ 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/include/internal/QCodeEditor.hpp b/include/internal/QCodeEditor.hpp index d390f3a..e9a2b5d 100644 --- a/include/internal/QCodeEditor.hpp +++ b/include/internal/QCodeEditor.hpp @@ -153,6 +153,17 @@ class QCodeEditor : public QTextEdit */ bool vimCursor() const; + /** + * @brief Enables or disables current line highlighting + * @note In vim mode this cannot enable line highlighting + */ + void setHighlightCurrentLine(bool enabled); + + /** + * @brief Checks if current line is being higlighted in non vim mode + */ + bool isHighlightingCurrentLine() const; + Q_SIGNALS: /** * @brief Signal, the font is changed by the wheel event. @@ -395,6 +406,7 @@ class QCodeEditor : public QTextEdit bool m_replaceTab; bool m_extraBottomMargin; bool m_vimCursor; + bool m_highlightCurrentLine; QString m_tabReplace; QList extra1, extra2, extra_squiggles; diff --git a/src/internal/QCodeEditor.cpp b/src/internal/QCodeEditor.cpp index be20baf..9d77c4b 100644 --- a/src/internal/QCodeEditor.cpp +++ b/src/internal/QCodeEditor.cpp @@ -24,12 +24,13 @@ #include #include #include +#include QCodeEditor::QCodeEditor(QWidget *widget) : QTextEdit(widget), m_highlighter(nullptr), m_syntaxStyle(nullptr), m_lineNumberArea(new QLineNumberArea(this)), m_completer(nullptr), m_autoIndentation(true), m_replaceTab(true), m_extraBottomMargin(true), m_vimCursor(false), - m_tabReplace(QString(4, ' ')), extra1(), extra2(), extra_squiggles(), m_cursorRect(), m_squiggler(), - m_parentheses({{'(', ')'}, {'{', '}'}, {'[', ']'}, {'\"', '\"'}, {'\'', '\''}}) + m_highlightCurrentLine(true), m_tabReplace(QString(4, ' ')), extra1(), extra2(), extra_squiggles(), + m_cursorRect(), m_squiggler(), m_parentheses({{'(', ')'}, {'{', '}'}, {'[', ']'}, {'\"', '\"'}, {'\'', '\''}}) { initFont(); performConnections(); @@ -499,15 +500,15 @@ void QCodeEditor::highlightParenthesis() void QCodeEditor::highlightCurrentLine() { - if (!isReadOnly() && !m_vimCursor) + if (m_highlightCurrentLine && !isReadOnly() && !m_vimCursor) { QTextEdit::ExtraSelection selection{}; selection.format = m_syntaxStyle->getFormat("CurrentLine"); selection.format.setForeground(QBrush()); selection.format.setProperty(QTextFormat::FullWidthSelection, true); - selection.cursor = textCursor(); - selection.cursor.clearSelection(); + selection.cursor = textCursor(); + selection.cursor.clearSelection(); extra1.append(selection); } } @@ -567,7 +568,8 @@ void QCodeEditor::paintEvent(QPaintEvent *e) const QChar c = QTextEdit::document()->characterAt(position); rect.setWidth(fm.horizontalAdvance(c)); painter.setPen(Qt::NoPen); - painter.setBrush(QTextEdit::palette().color(QPalette::Base)); + auto cursorColor = m_syntaxStyle->getFormat("Text").foreground().color(); + painter.setBrush(m_syntaxStyle->name() == "Default" ? Qt::white : cursorColor); painter.setCompositionMode(QPainter::CompositionMode_Difference); } @@ -927,6 +929,11 @@ void QCodeEditor::setTabReplace(bool enabled) m_replaceTab = enabled; } +void QCodeEditor::setHighlightCurrentLine(bool enabled) +{ + m_highlightCurrentLine = enabled; +} + void QCodeEditor::setVimCursor(bool enabled) { m_vimCursor = enabled; @@ -935,6 +942,11 @@ void QCodeEditor::setVimCursor(bool enabled) setCursorWidth(0); } +bool QCodeEditor::isHighlightingCurrentLine() const +{ + return m_highlightCurrentLine; +} + bool QCodeEditor::vimCursor() const { return m_vimCursor; From 71d64cff979a7cacd99ce95d1759a445b338b2cc Mon Sep 17 00:00:00 2001 From: Ashar Khan Date: Thu, 17 Sep 2020 15:33:46 +0530 Subject: [PATCH 09/17] Fix code format --- src/internal/QCodeEditor.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/internal/QCodeEditor.cpp b/src/internal/QCodeEditor.cpp index 9d77c4b..021103d 100644 --- a/src/internal/QCodeEditor.cpp +++ b/src/internal/QCodeEditor.cpp @@ -568,8 +568,8 @@ void QCodeEditor::paintEvent(QPaintEvent *e) const QChar c = QTextEdit::document()->characterAt(position); rect.setWidth(fm.horizontalAdvance(c)); painter.setPen(Qt::NoPen); - auto cursorColor = m_syntaxStyle->getFormat("Text").foreground().color(); - painter.setBrush(m_syntaxStyle->name() == "Default" ? Qt::white : cursorColor); + auto cursorColor = m_syntaxStyle->getFormat("Text").foreground().color(); + painter.setBrush(m_syntaxStyle->name() == "Default" ? Qt::white : cursorColor); painter.setCompositionMode(QPainter::CompositionMode_Difference); } From b181035e2398d9e084cf488714344dabf72eb589 Mon Sep 17 00:00:00 2001 From: Ashar Khan Date: Sat, 7 Nov 2020 21:54:17 +0530 Subject: [PATCH 10/17] remove unused include --- src/internal/QCodeEditor.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/internal/QCodeEditor.cpp b/src/internal/QCodeEditor.cpp index 021103d..ad4178b 100644 --- a/src/internal/QCodeEditor.cpp +++ b/src/internal/QCodeEditor.cpp @@ -24,7 +24,6 @@ #include #include #include -#include QCodeEditor::QCodeEditor(QWidget *widget) : QTextEdit(widget), m_highlighter(nullptr), m_syntaxStyle(nullptr), m_lineNumberArea(new QLineNumberArea(this)), From e6b6adc96dfde9b9dd9ef3a815f7337cf74bb416 Mon Sep 17 00:00:00 2001 From: Yufan You Date: Tue, 10 Nov 2020 12:47:36 +0800 Subject: [PATCH 11/17] fix: show cursor in non-vim mode --- src/internal/QCodeEditor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/internal/QCodeEditor.cpp b/src/internal/QCodeEditor.cpp index ad4178b..2389643 100644 --- a/src/internal/QCodeEditor.cpp +++ b/src/internal/QCodeEditor.cpp @@ -938,7 +938,7 @@ void QCodeEditor::setVimCursor(bool enabled) m_vimCursor = enabled; setOverwriteMode(false); - setCursorWidth(0); + setCursorWidth(enabled ? 0 : 1); } bool QCodeEditor::isHighlightingCurrentLine() const From 40d75a18a0c16f3d9962ca6ede155495069cb96a Mon Sep 17 00:00:00 2001 From: Yufan You Date: Tue, 10 Nov 2020 12:48:19 +0800 Subject: [PATCH 12/17] feat: better matching parentheses highlighting --- src/internal/QCodeEditor.cpp | 121 +++++++++++++++++------------------ 1 file changed, 59 insertions(+), 62 deletions(-) diff --git a/src/internal/QCodeEditor.cpp b/src/internal/QCodeEditor.cpp index 2389643..eb57b4a 100644 --- a/src/internal/QCodeEditor.cpp +++ b/src/internal/QCodeEditor.cpp @@ -419,81 +419,78 @@ void QCodeEditor::toggleBlockComment() void QCodeEditor::highlightParenthesis() { - auto currentSymbol = charUnderCursor(); - auto prevSymbol = charUnderCursor(-1); + const auto text = toPlainText(); + const int currentPosition = textCursor().position(); - for (auto &p : m_parentheses) - { - int direction; - - QChar counterSymbol; - QChar activeSymbol; - auto position = textCursor().position(); + QChar activeSymbol; + int activePosition; + QChar counterSymbol; + int direction = 0; - if (p.left == currentSymbol) - { - direction = 1; - counterSymbol = p.right; - activeSymbol = currentSymbol; - } - else if (p.right == prevSymbol) - { - direction = -1; - counterSymbol = p.left; - activeSymbol = prevSymbol; - position--; - } - else - { + // check both the current character and the previous character if the cursor is between two characters + for (activePosition = currentPosition; activePosition >= (overwriteMode() ? currentPosition : currentPosition - 1); + --activePosition) + { + if (activePosition < 0 || activePosition >= text.length()) continue; - } - auto counter = 1; + activeSymbol = text[activePosition]; - while (counter != 0 && position > 0 && position < (document()->characterCount() - 1)) + for (const auto &p : m_parentheses) { - // Moving position - position += direction; - - auto character = document()->characterAt(position); - // Checking symbol under position - if (character == activeSymbol) + if (p.left == p.right) + continue; + if (activeSymbol == p.left) { - ++counter; + direction = 1; + counterSymbol = p.right; + break; } - else if (character == counterSymbol) + if (activeSymbol == p.right) { - --counter; + direction = -1; + counterSymbol = p.left; + break; } } - auto format = m_syntaxStyle->getFormat("Parentheses"); - - // Found - if (counter == 0) - { - ExtraSelection selection{}; - - auto directionEnum = direction < 0 ? QTextCursor::MoveOperation::Left : QTextCursor::MoveOperation::Right; + if (direction != 0) + break; + } - selection.format = format; - selection.cursor = textCursor(); - selection.cursor.clearSelection(); - selection.cursor.movePosition(directionEnum, QTextCursor::MoveMode::MoveAnchor, - qAbs(textCursor().position() - position)); + if (direction == 0) // not a parenthesis + return; - selection.cursor.movePosition(QTextCursor::MoveOperation::Right, QTextCursor::MoveMode::KeepAnchor, 1); + int matchPosition = -1; + int count = 1; - extra1.append(selection); + for (int i = activePosition + direction; i >= 0 && i < text.length(); i += direction) + { + if (text[i] == activeSymbol) + ++count; + else if (text[i] == counterSymbol) + --count; + if (count == 0) + { + matchPosition = i; + break; + } + } + if (matchPosition >= 0) // Match found + { + auto addExtra = [&](int pos) { + ExtraSelection selection; + selection.format = m_syntaxStyle->getFormat("Parentheses"); selection.cursor = textCursor(); selection.cursor.clearSelection(); - selection.cursor.movePosition(directionEnum, QTextCursor::MoveMode::KeepAnchor, 1); - + selection.cursor.setPosition(pos); + selection.cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor); extra1.append(selection); - } + }; - break; + addExtra(activePosition); + addExtra(matchPosition); } } @@ -551,20 +548,20 @@ void QCodeEditor::paintEvent(QPaintEvent *e) { QRect rect = m_cursorRect; m_cursorRect = QRect(); - QTextEdit::viewport()->update(rect); + viewport()->update(rect); } // Draw text cursor. - QRect rect = QTextEdit::cursorRect(); + QRect rect = cursorRect(); if (e->rect().intersects(rect)) { - QPainter painter(QTextEdit::viewport()); + QPainter painter(viewport()); - if (QTextEdit::overwriteMode()) + if (overwriteMode()) { - QFontMetrics fm(QTextEdit::font()); - const int position = QTextEdit::textCursor().position(); - const QChar c = QTextEdit::document()->characterAt(position); + QFontMetrics fm(font()); + const int position = textCursor().position(); + const QChar c = document()->characterAt(position); rect.setWidth(fm.horizontalAdvance(c)); painter.setPen(Qt::NoPen); auto cursorColor = m_syntaxStyle->getFormat("Text").foreground().color(); From e5f042e7bad7a1f668d9c2a72f6301574b7f8326 Mon Sep 17 00:00:00 2001 From: Ashar Khan Date: Tue, 10 Nov 2020 17:05:37 +0530 Subject: [PATCH 13/17] Make cursor block when vim mode loses focus --- include/internal/QCodeEditor.hpp | 7 +++++++ src/internal/QCodeEditor.cpp | 10 ++++++++++ 2 files changed, 17 insertions(+) diff --git a/include/internal/QCodeEditor.hpp b/include/internal/QCodeEditor.hpp index e9a2b5d..7362d35 100644 --- a/include/internal/QCodeEditor.hpp +++ b/include/internal/QCodeEditor.hpp @@ -295,6 +295,13 @@ class QCodeEditor : public QTextEdit */ void focusInEvent(QFocusEvent *e) override; + /** + * @brief Method, that's called on focus loss + * It's required for setting block cursor + * in fakevim mode. + */ + void focusOutEvent(QFocusEvent *e) override; + /** * @brief Method for tooltip generation */ diff --git a/src/internal/QCodeEditor.cpp b/src/internal/QCodeEditor.cpp index eb57b4a..13e9c64 100644 --- a/src/internal/QCodeEditor.cpp +++ b/src/internal/QCodeEditor.cpp @@ -994,6 +994,16 @@ void QCodeEditor::focusInEvent(QFocusEvent *e) QTextEdit::focusInEvent(e); } +void QCodeEditor::focusOutEvent(QFocusEvent *e) +{ + if (m_vimCursor) + { + setOverwriteMode(true); // makes a block cursor when focus is lost + } + + QTextEdit::focusOutEvent(e); +} + bool QCodeEditor::event(QEvent *event) { if (event->type() == QEvent::ToolTip) From cf9a2179775996a1f7b50764d8c4ca514ec0717a Mon Sep 17 00:00:00 2001 From: Ashar Khan Date: Fri, 13 Nov 2020 21:56:32 +0530 Subject: [PATCH 14/17] Update paintEvent for fakevim --- src/internal/QCodeEditor.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/internal/QCodeEditor.cpp b/src/internal/QCodeEditor.cpp index 13e9c64..fab9de0 100644 --- a/src/internal/QCodeEditor.cpp +++ b/src/internal/QCodeEditor.cpp @@ -568,6 +568,11 @@ void QCodeEditor::paintEvent(QPaintEvent *e) painter.setBrush(m_syntaxStyle->name() == "Default" ? Qt::white : cursorColor); painter.setCompositionMode(QPainter::CompositionMode_Difference); } + else + { + rect.setWidth(cursorWidth()); + painter.setPen(m_syntaxStyle->getFormat("Text").foreground().color()); + } painter.drawRect(rect); m_cursorRect = rect; From dad1203cd228378f8e2a8510b5926503813fe0be Mon Sep 17 00:00:00 2001 From: Ashar Khan Date: Sun, 15 Nov 2020 16:23:18 +0530 Subject: [PATCH 15/17] Ignore highlighting parenthesis in single and double quotes --- src/internal/QCodeEditor.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/internal/QCodeEditor.cpp b/src/internal/QCodeEditor.cpp index fab9de0..fda944b 100644 --- a/src/internal/QCodeEditor.cpp +++ b/src/internal/QCodeEditor.cpp @@ -463,12 +463,18 @@ void QCodeEditor::highlightParenthesis() int matchPosition = -1; int count = 1; + int singleQuoteCounter = 0; + int doubleQuoteCounter = 0; for (int i = activePosition + direction; i >= 0 && i < text.length(); i += direction) { - if (text[i] == activeSymbol) + if (text[i] == "'") + singleQuoteCounter++; + else if (text[i] == "\"") + doubleQuoteCounter++; + else if (text[i] == activeSymbol && singleQuoteCounter % 2 == 0 && doubleQuoteCounter % 2 == 0) ++count; - else if (text[i] == counterSymbol) + else if (text[i] == counterSymbol && singleQuoteCounter % 2 == 0 && doubleQuoteCounter % 2 == 0) --count; if (count == 0) { From 533855a63efe86c272fbc5c6838e5c228fd868a2 Mon Sep 17 00:00:00 2001 From: Ashar Khan Date: Thu, 26 Nov 2020 20:18:08 +0530 Subject: [PATCH 16/17] Do not modify kepressevents with vim mode --- src/internal/QCodeEditor.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/internal/QCodeEditor.cpp b/src/internal/QCodeEditor.cpp index fda944b..cea935d 100644 --- a/src/internal/QCodeEditor.cpp +++ b/src/internal/QCodeEditor.cpp @@ -682,6 +682,12 @@ void QCodeEditor::keyPressEvent(QKeyEvent *e) if (!completerSkip) { + if(m_vimCursor) + { + QTextEdit::keyPressEvent(e); + proceedCompleterEnd(e); + return; + } if ((e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter) && e->modifiers() != Qt::NoModifier) { QKeyEvent pureEnter(QEvent::KeyPress, Qt::Key_Enter, Qt::NoModifier); From f9f40801b3806934df78c12e759e0096d76bf5a4 Mon Sep 17 00:00:00 2001 From: Ashar Khan Date: Sat, 5 Dec 2020 18:53:47 +0530 Subject: [PATCH 17/17] format code --- src/internal/QCodeEditor.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/internal/QCodeEditor.cpp b/src/internal/QCodeEditor.cpp index cea935d..a571b94 100644 --- a/src/internal/QCodeEditor.cpp +++ b/src/internal/QCodeEditor.cpp @@ -682,12 +682,12 @@ void QCodeEditor::keyPressEvent(QKeyEvent *e) if (!completerSkip) { - if(m_vimCursor) - { - QTextEdit::keyPressEvent(e); - proceedCompleterEnd(e); - return; - } + if (m_vimCursor) + { + QTextEdit::keyPressEvent(e); + proceedCompleterEnd(e); + return; + } if ((e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter) && e->modifiers() != Qt::NoModifier) { QKeyEvent pureEnter(QEvent::KeyPress, Qt::Key_Enter, Qt::NoModifier);