Skip to content

Commit d0bea60

Browse files
committed
Separate symbols when moving textcursor by word
1 parent 2dc58eb commit d0bea60

File tree

1 file changed

+18
-7
lines changed

1 file changed

+18
-7
lines changed

src/engraving/dom/textbase.cpp

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,11 @@ void TextCursor::setFormat(FormatId id, FormatValue val)
444444

445445
bool TextCursor::movePosition(TextCursor::MoveOperation op, TextCursor::MoveMode mode, int count)
446446
{
447+
auto isWordBoundaryCharacter = [this](bool lettersOrDigits) -> bool {
448+
Char c = currentCharacter();
449+
return c.isSpace() || lettersOrDigits != (c.isLetter() || c.isDigit());
450+
};
451+
447452
for (int i = 0; i < count; i++) {
448453
switch (op) {
449454
case TextCursor::MoveOperation::Left:
@@ -534,26 +539,29 @@ bool TextCursor::movePosition(TextCursor::MoveOperation op, TextCursor::MoveMode
534539

535540
break;
536541

537-
case TextCursor::MoveOperation::WordLeft:
542+
case TextCursor::MoveOperation::WordLeft: {
538543
if (m_column > 0) {
539544
--m_column;
540545
while (m_column > 0 && currentCharacter().isSpace()) {
541546
--m_column;
542547
}
543-
while (m_column > 0 && !currentCharacter().isSpace()) {
548+
bool isWordOrDigit = currentCharacter().isLetter() || currentCharacter().isDigit();
549+
while (m_column > 0 && !isWordBoundaryCharacter(isWordOrDigit)) {
544550
--m_column;
545551
}
546-
if (currentCharacter().isSpace()) {
552+
if (isWordBoundaryCharacter(isWordOrDigit)) {
547553
++m_column;
548554
}
549555
}
550-
break;
556+
}
557+
break;
551558

552559
case TextCursor::MoveOperation::NextWord: {
553560
size_t cols = columns();
554561
if (m_column < cols) {
555562
++m_column;
556-
while (m_column < cols && !currentCharacter().isSpace()) {
563+
bool isWordOrDigit = currentCharacter().isLetter() || currentCharacter().isDigit();
564+
while (m_column < cols && !isWordBoundaryCharacter(isWordOrDigit)) {
557565
++m_column;
558566
}
559567
while (m_column < cols && currentCharacter().isSpace()) {
@@ -593,7 +601,9 @@ void TextCursor::selectWord()
593601
//handle double-clicking inside a word
594602
size_t startPosition = m_column;
595603

596-
while (m_column > 0 && currentCharacter().isSpace() == selectSpaces) {
604+
bool parseLetters = (currentCharacter().isLetter() || currentCharacter().isDigit());
605+
while (m_column > 0 && currentCharacter().isSpace() == selectSpaces
606+
&& parseLetters == (currentCharacter().isLetter() || currentCharacter().isDigit())) {
597607
--m_column;
598608
}
599609

@@ -604,7 +614,8 @@ void TextCursor::selectWord()
604614
m_selectColumn = m_column;
605615

606616
m_column = startPosition;
607-
while (m_column < curLine().columns() && currentCharacter().isSpace() == selectSpaces) {
617+
while (m_column < curLine().columns() && currentCharacter().isSpace() == selectSpaces
618+
&& parseLetters == (currentCharacter().isLetter() || currentCharacter().isDigit())) {
608619
++m_column;
609620
}
610621

0 commit comments

Comments
 (0)