mirror of
https://github.com/Drezil/imgui.git
synced 2024-11-15 01:17:00 +00:00
InputText: Reworked prev/next-word behavior . Include period as delimiter and tweak prev/next words logic. (#6067)
This commit is contained in:
parent
89d09070e3
commit
821814b450
@ -44,6 +44,9 @@ Other changes:
|
|||||||
retaining underlying data. While we don't really want to encourage user not retaining
|
retaining underlying data. While we don't really want to encourage user not retaining
|
||||||
underlying data, in the absence of a "late commit" behavior/flag we understand it may
|
underlying data, in the absence of a "late commit" behavior/flag we understand it may
|
||||||
be desirable to take advantage of this trick. (#4714)
|
be desirable to take advantage of this trick. (#4714)
|
||||||
|
- InputText: Reworked prev/next-word behavior to more closely match Visual Studio
|
||||||
|
text editor. Include '.' as a delimiter and alter varying subtle behavior with how
|
||||||
|
blanks and separators are treated when skipping words. (#6067) [@ajweeks]
|
||||||
- Drag, Sliders: Fixed parsing of text input when '+' or '#' format flags are used
|
- Drag, Sliders: Fixed parsing of text input when '+' or '#' format flags are used
|
||||||
in the format string. (#6259) [@idbrii]
|
in the format string. (#6259) [@idbrii]
|
||||||
- Nav: Made Ctrl+Tab/Ctrl+Shift+Tab windowing register ownership to held modifier so
|
- Nav: Made Ctrl+Tab/Ctrl+Shift+Tab windowing register ownership to held modifier so
|
||||||
|
2
imgui.h
2
imgui.h
@ -23,7 +23,7 @@
|
|||||||
// Library Version
|
// Library Version
|
||||||
// (Integer encoded as XYYZZ for use in #if preprocessor conditionals, e.g. '#if IMGUI_VERSION_NUM > 12345')
|
// (Integer encoded as XYYZZ for use in #if preprocessor conditionals, e.g. '#if IMGUI_VERSION_NUM > 12345')
|
||||||
#define IMGUI_VERSION "1.89.5 WIP"
|
#define IMGUI_VERSION "1.89.5 WIP"
|
||||||
#define IMGUI_VERSION_NUM 18944
|
#define IMGUI_VERSION_NUM 18945
|
||||||
#define IMGUI_HAS_TABLE
|
#define IMGUI_HAS_TABLE
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -3700,10 +3700,34 @@ static void STB_TEXTEDIT_LAYOUTROW(StbTexteditRow* r, ImGuiInputTextState* ob
|
|||||||
r->num_chars = (int)(text_remaining - (text + line_start_idx));
|
r->num_chars = (int)(text_remaining - (text + line_start_idx));
|
||||||
}
|
}
|
||||||
|
|
||||||
// When ImGuiInputTextFlags_Password is set, we don't want actions such as CTRL+Arrow to leak the fact that underlying data are blanks or separators.
|
static bool is_separator(unsigned int c)
|
||||||
static bool is_separator(unsigned int c) { return ImCharIsBlankW(c) || c==',' || c==';' || c=='(' || c==')' || c=='{' || c=='}' || c=='[' || c==']' || c=='|' || c=='\n' || c=='\r'; }
|
{
|
||||||
static int is_word_boundary_from_right(ImGuiInputTextState* obj, int idx) { if (obj->Flags & ImGuiInputTextFlags_Password) return 0; return idx > 0 ? (is_separator(obj->TextW[idx - 1]) && !is_separator(obj->TextW[idx]) ) : 1; }
|
return c==',' || c==';' || c=='(' || c==')' || c=='{' || c=='}' || c=='[' || c==']' || c=='|' || c=='\n' || c=='\r' || c=='.' || c=='!';
|
||||||
static int is_word_boundary_from_left(ImGuiInputTextState* obj, int idx) { if (obj->Flags & ImGuiInputTextFlags_Password) return 0; return idx > 0 ? (!is_separator(obj->TextW[idx - 1]) && is_separator(obj->TextW[idx])) : 1; }
|
}
|
||||||
|
|
||||||
|
static int is_word_boundary_from_right(ImGuiInputTextState* obj, int idx)
|
||||||
|
{
|
||||||
|
// When ImGuiInputTextFlags_Password is set, we don't want actions such as CTRL+Arrow to leak the fact that underlying data are blanks or separators.
|
||||||
|
if ((obj->Flags & ImGuiInputTextFlags_Password) || idx <= 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
bool prev_white = ImCharIsBlankW(obj->TextW[idx - 1]);
|
||||||
|
bool prev_separ = is_separator(obj->TextW[idx - 1]);
|
||||||
|
bool curr_white = ImCharIsBlankW(obj->TextW[idx]);
|
||||||
|
bool curr_separ = is_separator(obj->TextW[idx]);
|
||||||
|
return ((prev_white || prev_separ) && !(curr_separ || curr_white)) || (curr_separ && !prev_separ);
|
||||||
|
}
|
||||||
|
static int is_word_boundary_from_left(ImGuiInputTextState* obj, int idx)
|
||||||
|
{
|
||||||
|
if ((obj->Flags & ImGuiInputTextFlags_Password) || idx <= 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
bool prev_white = ImCharIsBlankW(obj->TextW[idx]);
|
||||||
|
bool prev_separ = is_separator(obj->TextW[idx]);
|
||||||
|
bool curr_white = ImCharIsBlankW(obj->TextW[idx - 1]);
|
||||||
|
bool curr_separ = is_separator(obj->TextW[idx - 1]);
|
||||||
|
return ((prev_white) && !(curr_separ || curr_white)) || (curr_separ && !prev_separ);
|
||||||
|
}
|
||||||
static int STB_TEXTEDIT_MOVEWORDLEFT_IMPL(ImGuiInputTextState* obj, int idx) { idx--; while (idx >= 0 && !is_word_boundary_from_right(obj, idx)) idx--; return idx < 0 ? 0 : idx; }
|
static int STB_TEXTEDIT_MOVEWORDLEFT_IMPL(ImGuiInputTextState* obj, int idx) { idx--; while (idx >= 0 && !is_word_boundary_from_right(obj, idx)) idx--; return idx < 0 ? 0 : idx; }
|
||||||
static int STB_TEXTEDIT_MOVEWORDRIGHT_MAC(ImGuiInputTextState* obj, int idx) { idx++; int len = obj->CurLenW; while (idx < len && !is_word_boundary_from_left(obj, idx)) idx++; return idx > len ? len : idx; }
|
static int STB_TEXTEDIT_MOVEWORDRIGHT_MAC(ImGuiInputTextState* obj, int idx) { idx++; int len = obj->CurLenW; while (idx < len && !is_word_boundary_from_left(obj, idx)) idx++; return idx > len ? len : idx; }
|
||||||
static int STB_TEXTEDIT_MOVEWORDRIGHT_WIN(ImGuiInputTextState* obj, int idx) { idx++; int len = obj->CurLenW; while (idx < len && !is_word_boundary_from_right(obj, idx)) idx++; return idx > len ? len : idx; }
|
static int STB_TEXTEDIT_MOVEWORDRIGHT_WIN(ImGuiInputTextState* obj, int idx) { idx++; int len = obj->CurLenW; while (idx < len && !is_word_boundary_from_right(obj, idx)) idx++; return idx > len ? len : idx; }
|
||||||
|
Loading…
Reference in New Issue
Block a user