diff options
author | Nikita Baryshnikov <[email protected]> | 2025-02-28 16:41:19 +0300 |
---|---|---|
committer | Nikita Baryshnikov <[email protected]> | 2025-03-04 17:33:01 +0000 |
commit | 895af3d632d29f2e4d5ed6877ace08217880d2c8 (patch) | |
tree | 7c2bfe16bf54a7df47119e75fcbbeb0fec29c976 /src | |
parent | f9fa4255de098e7013a8f0162452464cc87e669a (diff) |
Utils: CamelCaseCursor further simplify templates
Improves b8ec1c4b03fbcf4999be12991325cb5348ae3cf4
Change-Id: Ib45e9a54f9526214abe87678e7b1e5b5bc68a4d4
Reviewed-by: André Hartmann <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/libs/utils/camelcasecursor.cpp | 120 | ||||
-rw-r--r-- | src/libs/utils/camelcasecursor.h | 1 |
2 files changed, 57 insertions, 64 deletions
diff --git a/src/libs/utils/camelcasecursor.cpp b/src/libs/utils/camelcasecursor.cpp index ded3ba4ef99..98a68ee9755 100644 --- a/src/libs/utils/camelcasecursor.cpp +++ b/src/libs/utils/camelcasecursor.cpp @@ -7,22 +7,22 @@ #include "multitextcursor.h" #include <QLineEdit> -#include <QPlainTextEdit> namespace Utils { +namespace { -template<typename C, typename E> -bool moveCursor(C *cursor, E edit, QTextCursor::MoveOperation direction, QTextCursor::MoveMode mode); +template<typename C> +bool moveCursor(C *cursor, QTextCursor::MoveOperation direction, QTextCursor::MoveMode mode); template<> -bool moveCursor(QTextCursor *cursor, std::nullptr_t, QTextCursor::MoveOperation direction, +bool moveCursor(QTextCursor *cursor, QTextCursor::MoveOperation direction, QTextCursor::MoveMode mode) { return cursor->movePosition(direction, mode); } -template<typename C> -bool moveCursor(C *, QLineEdit *edit, QTextCursor::MoveOperation direction, QTextCursor::MoveMode mode) +template<> +bool moveCursor(QLineEdit *edit, QTextCursor::MoveOperation direction, QTextCursor::MoveMode mode) { bool mark = (mode == QTextCursor::KeepAnchor); switch (direction) { @@ -44,17 +44,17 @@ bool moveCursor(C *, QLineEdit *edit, QTextCursor::MoveOperation direction, QTex return edit->cursorPosition() > 0 && edit->cursorPosition() < edit->text().size(); } -template<typename C, typename E> -QChar charUnderCursor(C *cursor, E edit); +template<typename C> +QChar charUnderCursor(C *cursor); template<> -QChar charUnderCursor(QTextCursor *cursor, std::nullptr_t) +QChar charUnderCursor(QTextCursor *cursor) { return cursor->document()->characterAt(cursor->position()); } -template<typename C> -QChar charUnderCursor(C *, QLineEdit *edit) +template<> +QChar charUnderCursor(QLineEdit *edit) { const int pos = edit->cursorPosition(); if (pos < 0 || pos >= edit->text().length()) @@ -63,17 +63,17 @@ QChar charUnderCursor(C *, QLineEdit *edit) return edit->text().at(pos); }; -template<typename C, typename E> -int position(C *cursor, E edit); +template<typename C> +int position(C *cursor); template<> -int position(QTextCursor *cursor, std::nullptr_t) +int position(QTextCursor *cursor) { return cursor->position(); } -template<typename C> -int position(C *, QLineEdit *edit) +template<> +int position(QLineEdit *edit) { return edit->cursorPosition(); } @@ -86,27 +86,32 @@ enum class Input { Other }; -template<typename C, typename E> -bool camelCaseLeft(C *cursor, E edit, QTextCursor::MoveMode mode) +static Input inputFromChar(QChar c) +{ + Input input = Input::Other; + if (c.isUpper()) + input = Input::Upper; + else if (c.isLower() || c.isDigit()) + input = Input::Lower; + else if (c == '_') + input = Input::Underscore; + else if (c.isSpace() && c != QChar::ParagraphSeparator) + input = Input::Space; + else + input = Input::Other; + return input; +} + +template<typename C> +bool camelCaseLeft(C *cursor, QTextCursor::MoveMode mode) { int state = 0; - if (!moveCursor(cursor, edit, QTextCursor::Left, mode)) + if (!moveCursor(cursor, QTextCursor::Left, mode)) return false; for (;;) { - QChar c = charUnderCursor(cursor, edit); - Input input = Input::Other; - if (c.isUpper()) - input = Input::Upper; - else if (c.isLower() || c.isDigit()) - input = Input::Lower; - else if (c == '_') - input = Input::Underscore; - else if (c.isSpace() && c != QChar::ParagraphSeparator) - input = Input::Space; - else - input = Input::Other; + const Input input = inputFromChar(charUnderCursor(cursor)); switch (state) { case 0: @@ -124,8 +129,8 @@ bool camelCaseLeft(C *cursor, E edit, QTextCursor::MoveMode mode) state = 4; break; default: - moveCursor(cursor, edit, QTextCursor::Right, mode); - return moveCursor(cursor, edit, QTextCursor::WordLeft, mode); + moveCursor(cursor, QTextCursor::Right, mode); + return moveCursor(cursor, QTextCursor::WordLeft, mode); } break; case 1: @@ -133,7 +138,7 @@ bool camelCaseLeft(C *cursor, E edit, QTextCursor::MoveMode mode) case Input::Upper: break; default: - moveCursor(cursor, edit, QTextCursor::Right, mode); + moveCursor(cursor, QTextCursor::Right, mode); return true; } break; @@ -144,7 +149,7 @@ bool camelCaseLeft(C *cursor, E edit, QTextCursor::MoveMode mode) case Input::Lower: break; default: - moveCursor(cursor, edit, QTextCursor::Right, mode); + moveCursor(cursor, QTextCursor::Right, mode); return true; } break; @@ -159,7 +164,7 @@ bool camelCaseLeft(C *cursor, E edit, QTextCursor::MoveMode mode) state = 2; break; default: - moveCursor(cursor, edit, QTextCursor::Right, mode); + moveCursor(cursor, QTextCursor::Right, mode); return true; } break; @@ -177,36 +182,25 @@ bool camelCaseLeft(C *cursor, E edit, QTextCursor::MoveMode mode) state = 3; break; default: - moveCursor(cursor, edit, QTextCursor::Right, mode); - if (position(cursor, edit) == 0) + moveCursor(cursor, QTextCursor::Right, mode); + if (position(cursor) == 0) return true; - return moveCursor(cursor, edit, QTextCursor::WordLeft, mode); + return moveCursor(cursor, QTextCursor::WordLeft, mode); } } - if (!moveCursor(cursor, edit, QTextCursor::Left, mode)) + if (!moveCursor(cursor, QTextCursor::Left, mode)) return true; } } -template<typename C, typename E> -bool camelCaseRight(C *cursor, E edit, QTextCursor::MoveMode mark) +template<typename C> +bool camelCaseRight(C *cursor, QTextCursor::MoveMode mark) { int state = 0; for (;;) { - QChar c = charUnderCursor(cursor, edit); - Input input = Input::Other; - if (c.isUpper()) - input = Input::Upper; - else if (c.isLower() || c.isDigit()) - input = Input::Lower; - else if (c == '_') - input = Input::Underscore; - else if (c.isSpace() && c != QChar::ParagraphSeparator) - input = Input::Space; - else - input = Input::Other; + const Input input = inputFromChar(charUnderCursor(cursor)); switch (state) { case 0: @@ -221,7 +215,7 @@ bool camelCaseRight(C *cursor, E edit, QTextCursor::MoveMode mark) state = 6; break; default: - return moveCursor(cursor, edit, QTextCursor::WordRight, mark); + return moveCursor(cursor, QTextCursor::WordRight, mark); } break; case 1: @@ -245,7 +239,7 @@ bool camelCaseRight(C *cursor, E edit, QTextCursor::MoveMode mark) case Input::Upper: break; case Input::Lower: - moveCursor(cursor, edit, QTextCursor::Left, mark); + moveCursor(cursor, QTextCursor::Left, mark); return true; case Input::Underscore: state = 6; @@ -295,14 +289,16 @@ bool camelCaseRight(C *cursor, E edit, QTextCursor::MoveMode mark) } break; } - if (!moveCursor(cursor, edit, QTextCursor::Right, mark)) + if (!moveCursor(cursor, QTextCursor::Right, mark)) return false; } } +} // anonymous namespace + bool CamelCaseCursor::left(QTextCursor *cursor, QTextCursor::MoveMode mode) { - return camelCaseLeft(cursor, nullptr, mode); + return camelCaseLeft(cursor, mode); } bool CamelCaseCursor::left(MultiTextCursor *cursor, QTextCursor::MoveMode mode) @@ -316,13 +312,12 @@ bool CamelCaseCursor::left(MultiTextCursor *cursor, QTextCursor::MoveMode mode) bool CamelCaseCursor::left(QLineEdit *edit, QTextCursor::MoveMode mode) { - QTextCursor temp; - return camelCaseLeft(&temp, edit, mode); + return camelCaseLeft(edit, mode); } bool CamelCaseCursor::right(QTextCursor *cursor, QTextCursor::MoveMode mode) { - return camelCaseRight(cursor, nullptr, mode); + return camelCaseRight(cursor, mode); } bool CamelCaseCursor::right(MultiTextCursor *cursor, QTextCursor::MoveMode mode) @@ -336,8 +331,7 @@ bool CamelCaseCursor::right(MultiTextCursor *cursor, QTextCursor::MoveMode mode) bool CamelCaseCursor::right(QLineEdit *edit, QTextCursor::MoveMode mode) { - QTextCursor temp; - return camelCaseRight(&temp, edit, mode); + return camelCaseRight(edit, mode); } } // namespace Utils diff --git a/src/libs/utils/camelcasecursor.h b/src/libs/utils/camelcasecursor.h index fd7fc5754c6..d4152971657 100644 --- a/src/libs/utils/camelcasecursor.h +++ b/src/libs/utils/camelcasecursor.h @@ -10,7 +10,6 @@ QT_BEGIN_NAMESPACE class QLineEdit; -class QPlainTextEdit; QT_END_NAMESPACE namespace Utils { |