From caa86284e17e2b95b2df92824a26f931ea5f344e Mon Sep 17 00:00:00 2001 From: Lirusaito Date: Wed, 27 Aug 2014 00:04:47 -0400 Subject: [PATCH] Ctrl-Backspace and Ctrl-Delete for removing whole words when editing text --- indra/llui/lllineeditor.cpp | 39 +++++++++++++++++++++++++++++++++- indra/llui/lllineeditor.h | 1 + indra/llui/lltexteditor.cpp | 42 ++++++++++++++++++++++++++++++++++++- indra/llui/lltexteditor.h | 1 + 4 files changed, 81 insertions(+), 2 deletions(-) diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index eb35f767c0..0f0992a659 100755 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -933,6 +933,32 @@ void LLLineEditor::removeChar() } } +// Remove a word (set of characters up to next space/punctuation) from the text +void LLLineEditor::removeWord(bool prev) +{ + const U32 pos(getCursor()); + if (prev ? pos > 0 : static_cast(pos) < getLength()) + { + U32 new_pos(prev ? prevWordPos(pos) : nextWordPos(pos)); + if (new_pos == pos) // Other character we don't jump over + new_pos = prev ? prevWordPos(new_pos-1) : nextWordPos(new_pos+1); + + const U32 diff(labs(pos - new_pos)); + if (prev) + { + mText.erase(new_pos, diff); + setCursor(new_pos); + } + else + { + mText.erase(pos, diff); + } + } + else + { + LLUI::reportBadKeystroke(); + } +} void LLLineEditor::addChar(const llwchar uni_char) { @@ -1381,7 +1407,10 @@ BOOL LLLineEditor::handleSpecialKey(KEY key, MASK mask) else if( 0 < getCursor() ) { - removeChar(); + if (mask == MASK_CONTROL) + removeWord(true); + else + removeChar(); } else { @@ -1391,6 +1420,14 @@ BOOL LLLineEditor::handleSpecialKey(KEY key, MASK mask) handled = TRUE; break; + case KEY_DELETE: + if (!mReadOnly && mask == MASK_CONTROL) + { + removeWord(false); + handled = true; + } + break; + case KEY_PAGE_UP: case KEY_HOME: if (!mIgnoreArrowKeys) diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h index 1ab5d25346..420f896535 100755 --- a/indra/llui/lllineeditor.h +++ b/indra/llui/lllineeditor.h @@ -285,6 +285,7 @@ private: void pasteHelper(bool is_primary); void removeChar(); + void removeWord(bool prev); void addChar(const llwchar c); void setCursorAtLocalPos(S32 local_mouse_x); S32 findPixelNearestPos(S32 cursor_offset = 0) const; diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index 119c92081e..3faa059db9 100755 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -1122,6 +1122,33 @@ void LLTextEditor::removeChar() } } +// Remove a word (set of characters up to next space/punctuation) from the text +void LLTextEditor::removeWord(bool prev) +{ + const U32 pos(mCursorPos); + if (prev ? pos > 0 : static_cast(pos) < getLength()) + { + U32 new_pos(prev ? prevWordPos(pos) : nextWordPos(pos)); + if (new_pos == pos) // Other character we don't jump over + new_pos = prev ? prevWordPos(new_pos-1) : nextWordPos(new_pos+1); + + const U32 diff(labs(pos - new_pos)); + if (prev) + { + remove(new_pos, diff, false); + setCursorPos(new_pos); + } + else + { + remove(pos, diff, false); + } + } + else + { + LLUI::reportBadKeystroke(); + } +} + // Add a single character to the text S32 LLTextEditor::addChar(S32 pos, llwchar wc) { @@ -1717,7 +1744,10 @@ BOOL LLTextEditor::handleSpecialKey(const KEY key, const MASK mask) else if( 0 < mCursorPos ) { - removeCharOrTab(); + if (mask == MASK_CONTROL) + removeWord(true); + else + removeCharOrTab(); } else { @@ -1725,6 +1755,16 @@ BOOL LLTextEditor::handleSpecialKey(const KEY key, const MASK mask) } break; + case KEY_DELETE: + if (getEnabled() && mask == MASK_CONTROL) + { + removeWord(false); + } + else + { + handled = false; + } + break; case KEY_RETURN: if (mask == MASK_NONE) diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h index d0d3b1e404..cc5f9d0aaf 100755 --- a/indra/llui/lltexteditor.h +++ b/indra/llui/lltexteditor.h @@ -262,6 +262,7 @@ protected: S32 overwriteChar(S32 pos, llwchar wc); void removeChar(); S32 removeChar(S32 pos); + void removeWord(bool prev); S32 insert(S32 pos, const LLWString &wstr, bool group_with_next_op, LLTextSegmentPtr segment); S32 remove(S32 pos, S32 length, bool group_with_next_op);