Fix word selection failing when the selected word boundary wasn't space
Double-clicking between alpha-numeric & punctuation for e.g. did nothing instead of selecting the word. Instead of a special check for white-space, use the enum values as a priority so alpha-numeric characters are priories above others in a way that doesn't prevent groups of other character types from being selected.
This commit is contained in:
@@ -17,6 +17,18 @@
|
||||
# pragma GCC diagnostic error "-Wsign-conversion"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* The category of character as returned by #cursor_delim_type_unicode.
|
||||
*
|
||||
* \note Don't compare with any values besides #STRCUR_DELIM_NONE as cursor motion
|
||||
* should only delimit on changes, not treat some groups differently.
|
||||
*
|
||||
* For range calculation the order prioritizes expansion direction,
|
||||
* when the cursor is between two different categories, "hug" the smaller values.
|
||||
* Where white-space gets lowest priority. See #BLI_str_cursor_step_bounds_utf8.
|
||||
* This is done so expanding the range at a word boundary always chooses the word instead
|
||||
* of the white-space before or after it.
|
||||
*/
|
||||
typedef enum eStrCursorDelimType {
|
||||
STRCUR_DELIM_NONE,
|
||||
STRCUR_DELIM_ALPHANUMERIC,
|
||||
@@ -24,8 +36,8 @@ typedef enum eStrCursorDelimType {
|
||||
STRCUR_DELIM_BRACE,
|
||||
STRCUR_DELIM_OPERATOR,
|
||||
STRCUR_DELIM_QUOTE,
|
||||
STRCUR_DELIM_WHITESPACE,
|
||||
STRCUR_DELIM_OTHER,
|
||||
STRCUR_DELIM_WHITESPACE,
|
||||
} eStrCursorDelimType;
|
||||
|
||||
static eStrCursorDelimType cursor_delim_type_unicode(const uint uch)
|
||||
@@ -318,7 +330,7 @@ void BLI_str_cursor_step_utf32(const char32_t *str,
|
||||
void BLI_str_cursor_step_bounds_utf8(
|
||||
const char *str, const size_t str_maxlen, const int pos, int *r_start, int *r_end)
|
||||
{
|
||||
/* What type of characters are on either side of the current cursor position? */
|
||||
/* Identify the type of characters are on either side of the current cursor position. */
|
||||
const eStrCursorDelimType prev = (pos > 0) ? cursor_delim_type_utf8(str, str_maxlen, pos - 1) :
|
||||
STRCUR_DELIM_NONE;
|
||||
const eStrCursorDelimType next = (pos < str_maxlen) ?
|
||||
@@ -327,11 +339,11 @@ void BLI_str_cursor_step_bounds_utf8(
|
||||
*r_start = pos;
|
||||
*r_end = pos;
|
||||
|
||||
if (prev == next || ELEM(next, STRCUR_DELIM_WHITESPACE, STRCUR_DELIM_NONE)) {
|
||||
/* Expand backward if we are between similar content, before whitespace, or at end. */
|
||||
if ((prev <= next) && (prev != STRCUR_DELIM_NONE)) {
|
||||
/* Expand backward if we are between similar content. */
|
||||
BLI_str_cursor_step_utf8(str, str_maxlen, r_start, STRCUR_DIR_PREV, STRCUR_JUMP_DELIM, false);
|
||||
}
|
||||
if (prev == next || ELEM(prev, STRCUR_DELIM_WHITESPACE, STRCUR_DELIM_NONE)) {
|
||||
if ((prev >= next) && (next != STRCUR_DELIM_NONE)) {
|
||||
/* Expand forward if we are between similar content, after whitespace, or at beginning. */
|
||||
BLI_str_cursor_step_utf8(str, str_maxlen, r_end, STRCUR_DIR_NEXT, STRCUR_JUMP_DELIM, false);
|
||||
}
|
||||
@@ -340,7 +352,7 @@ void BLI_str_cursor_step_bounds_utf8(
|
||||
void BLI_str_cursor_step_bounds_utf32(
|
||||
const char32_t *str, const size_t str_maxlen, const int pos, int *r_start, int *r_end)
|
||||
{
|
||||
/* What type of characters are on either side of the current cursor position? */
|
||||
/* Identify the type of characters are on either side of the current cursor position. */
|
||||
const eStrCursorDelimType prev = (pos > 0) ? cursor_delim_type_unicode(str[pos - 1]) :
|
||||
STRCUR_DELIM_NONE;
|
||||
const eStrCursorDelimType next = (pos < str_maxlen) ? cursor_delim_type_unicode(str[pos]) :
|
||||
@@ -348,11 +360,11 @@ void BLI_str_cursor_step_bounds_utf32(
|
||||
*r_start = pos;
|
||||
*r_end = pos;
|
||||
|
||||
if (prev == next || ELEM(next, STRCUR_DELIM_WHITESPACE, STRCUR_DELIM_NONE)) {
|
||||
if ((prev <= next) && (prev != STRCUR_DELIM_NONE)) {
|
||||
/* Expand backward if we are between similar content, before whitespace, or at end. */
|
||||
BLI_str_cursor_step_utf32(str, str_maxlen, r_start, STRCUR_DIR_PREV, STRCUR_JUMP_DELIM, false);
|
||||
}
|
||||
if (prev == next || ELEM(prev, STRCUR_DELIM_WHITESPACE, STRCUR_DELIM_NONE)) {
|
||||
if ((prev >= next) && (next != STRCUR_DELIM_NONE)) {
|
||||
/* Expand forward if we are between similar content, after whitespace, or at beginning. */
|
||||
BLI_str_cursor_step_utf32(str, str_maxlen, r_end, STRCUR_DIR_NEXT, STRCUR_JUMP_DELIM, false);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user