mirror of
https://github.com/ocornut/imgui.git
synced 2026-04-02 13:37:40 -05:00
Merge branch 'master' into docking
This commit is contained in:
@@ -51,7 +51,14 @@ Other Changes:
|
|||||||
disable the assumption that 1 clipper item == 1 table row, which breaks when
|
disable the assumption that 1 clipper item == 1 table row, which breaks when
|
||||||
e.g. using clipper with ItemsHeight=1 in order to clip in pixel units. (#8886)
|
e.g. using clipper with ItemsHeight=1 in order to clip in pixel units. (#8886)
|
||||||
- Fixed Bullet() fixed tesselation amount which looked out of place in very large sizes.
|
- Fixed Bullet() fixed tesselation amount which looked out of place in very large sizes.
|
||||||
- DrawList: Fixed CloneOutput() unnecessarily taking a copy of the ImDrawListSharedData
|
- InputText: allow passing an empty string with buf_size==0. (#8907)
|
||||||
|
In theory the buffer size should always account for a zero-terminator, but idioms
|
||||||
|
such as using InputTextMultiline() with ImGuiInputTextFlags_ReadOnly to display
|
||||||
|
a text blob are facilitated by allowing this.
|
||||||
|
- InputText: revert a change in 1.79 where pressing Down or PageDown on the last line
|
||||||
|
of a multi-line buffer without a trailing carriage return would keep the cursor
|
||||||
|
unmoved. We revert back to move to the end of line in this situation.
|
||||||
|
- DrawList: fixed CloneOutput() unnecessarily taking a copy of the ImDrawListSharedData
|
||||||
pointer, which could to issue when deleting the cloned list. (#8894, #1860)
|
pointer, which could to issue when deleting the cloned list. (#8894, #1860)
|
||||||
- Debug Tools: ID Stack Tool: fixed using fixed-size buffers preventing long identifiers
|
- Debug Tools: ID Stack Tool: fixed using fixed-size buffers preventing long identifiers
|
||||||
from being displayed in the tool. (#8905, #4631)
|
from being displayed in the tool. (#8905, #4631)
|
||||||
|
|||||||
@@ -3205,10 +3205,9 @@ static void ImGuiListClipper_SeekCursorAndSetupPrevLine(ImGuiListClipper* clippe
|
|||||||
{
|
{
|
||||||
if (table->IsInsideRow)
|
if (table->IsInsideRow)
|
||||||
ImGui::TableEndRow(table);
|
ImGui::TableEndRow(table);
|
||||||
if ((clipper->Flags & ImGuiListClipperFlags_NoSetTableRowCounters) == 0)
|
const int row_increase = (int)((off_y / line_height) + 0.5f);
|
||||||
|
if (row_increase > 0 && (clipper->Flags & ImGuiListClipperFlags_NoSetTableRowCounters) == 0) // If your clipper item height is != from actual table row height, consider using ImGuiListClipperFlags_NoSetTableRowCounters. See #8886.
|
||||||
{
|
{
|
||||||
const int row_increase = (int)((off_y / line_height) + 0.5f);
|
|
||||||
IM_ASSERT(row_increase >= 0); // If your clipper item height is != from actual table row height, consider using ImGuiListClipperFlags_NoSetTableRowCounters. See #8886.
|
|
||||||
table->CurrentRow += row_increase;
|
table->CurrentRow += row_increase;
|
||||||
table->RowBgColorCounter += row_increase;
|
table->RowBgColorCounter += row_increase;
|
||||||
}
|
}
|
||||||
|
|||||||
2
imgui.h
2
imgui.h
@@ -3953,7 +3953,7 @@ struct ImFont
|
|||||||
// 'max_width' stops rendering after a certain width (could be turned into a 2d size). FLT_MAX to disable.
|
// 'max_width' stops rendering after a certain width (could be turned into a 2d size). FLT_MAX to disable.
|
||||||
// 'wrap_width' enable automatic word-wrapping across multiple lines to fit into given width. 0.0f to disable.
|
// 'wrap_width' enable automatic word-wrapping across multiple lines to fit into given width. 0.0f to disable.
|
||||||
IMGUI_API ImFontBaked* GetFontBaked(float font_size, float density = -1.0f); // Get or create baked data for given size
|
IMGUI_API ImFontBaked* GetFontBaked(float font_size, float density = -1.0f); // Get or create baked data for given size
|
||||||
IMGUI_API ImVec2 CalcTextSizeA(float size, float max_width, float wrap_width, const char* text_begin, const char* text_end = NULL, const char** remaining = NULL); // utf8
|
IMGUI_API ImVec2 CalcTextSizeA(float size, float max_width, float wrap_width, const char* text_begin, const char* text_end = NULL, const char** out_remaining = NULL);
|
||||||
IMGUI_API const char* CalcWordWrapPosition(float size, const char* text, const char* text_end, float wrap_width);
|
IMGUI_API const char* CalcWordWrapPosition(float size, const char* text, const char* text_end, float wrap_width);
|
||||||
IMGUI_API void RenderChar(ImDrawList* draw_list, float size, const ImVec2& pos, ImU32 col, ImWchar c, const ImVec4* cpu_fine_clip = NULL);
|
IMGUI_API void RenderChar(ImDrawList* draw_list, float size, const ImVec2& pos, ImU32 col, ImWchar c, const ImVec4* cpu_fine_clip = NULL);
|
||||||
IMGUI_API void RenderText(ImDrawList* draw_list, float size, const ImVec2& pos, ImU32 col, const ImVec4& clip_rect, const char* text_begin, const char* text_end, float wrap_width = 0.0f, bool cpu_fine_clip = false);
|
IMGUI_API void RenderText(ImDrawList* draw_list, float size, const ImVec2& pos, ImU32 col, const ImVec4& clip_rect, const char* text_begin, const char* text_end, float wrap_width = 0.0f, bool cpu_fine_clip = false);
|
||||||
|
|||||||
@@ -5464,7 +5464,7 @@ const char* ImFont::CalcWordWrapPosition(float size, const char* text, const cha
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
ImVec2 ImFont::CalcTextSizeA(float size, float max_width, float wrap_width, const char* text_begin, const char* text_end, const char** remaining)
|
ImVec2 ImFont::CalcTextSizeA(float size, float max_width, float wrap_width, const char* text_begin, const char* text_end, const char** out_remaining)
|
||||||
{
|
{
|
||||||
if (!text_end)
|
if (!text_end)
|
||||||
text_end = text_begin + ImStrlen(text_begin); // FIXME-OPT: Need to avoid this.
|
text_end = text_begin + ImStrlen(text_begin); // FIXME-OPT: Need to avoid this.
|
||||||
@@ -5542,8 +5542,8 @@ ImVec2 ImFont::CalcTextSizeA(float size, float max_width, float wrap_width, cons
|
|||||||
if (line_width > 0 || text_size.y == 0.0f)
|
if (line_width > 0 || text_size.y == 0.0f)
|
||||||
text_size.y += line_height;
|
text_size.y += line_height;
|
||||||
|
|
||||||
if (remaining)
|
if (out_remaining != NULL)
|
||||||
*remaining = s;
|
*out_remaining = s;
|
||||||
|
|
||||||
return text_size;
|
return text_size;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -603,6 +603,7 @@ struct IMGUI_API ImRect
|
|||||||
void Floor() { Min.x = IM_TRUNC(Min.x); Min.y = IM_TRUNC(Min.y); Max.x = IM_TRUNC(Max.x); Max.y = IM_TRUNC(Max.y); }
|
void Floor() { Min.x = IM_TRUNC(Min.x); Min.y = IM_TRUNC(Min.y); Max.x = IM_TRUNC(Max.x); Max.y = IM_TRUNC(Max.y); }
|
||||||
bool IsInverted() const { return Min.x > Max.x || Min.y > Max.y; }
|
bool IsInverted() const { return Min.x > Max.x || Min.y > Max.y; }
|
||||||
ImVec4 ToVec4() const { return ImVec4(Min.x, Min.y, Max.x, Max.y); }
|
ImVec4 ToVec4() const { return ImVec4(Min.x, Min.y, Max.x, Max.y); }
|
||||||
|
const ImVec4& AsVec4() const { return *(const ImVec4*)&Min.x; }
|
||||||
};
|
};
|
||||||
|
|
||||||
// Helper: ImBitArray
|
// Helper: ImBitArray
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ static const ImU64 IM_U64_MAX = (2ULL * 9223372036854775807LL + 1);
|
|||||||
|
|
||||||
// For InputTextEx()
|
// For InputTextEx()
|
||||||
static bool InputTextFilterCharacter(ImGuiContext* ctx, unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data, bool input_source_is_clipboard = false);
|
static bool InputTextFilterCharacter(ImGuiContext* ctx, unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data, bool input_source_is_clipboard = false);
|
||||||
static int InputTextCalcTextLenAndLineCount(const char* text_begin, const char** out_text_end);
|
static int InputTextCalcTextLenAndLineCount(ImGuiContext* ctx, const char* text_begin, const char** out_text_end);
|
||||||
static ImVec2 InputTextCalcTextSize(ImGuiContext* ctx, const char* text_begin, const char* text_end, const char** remaining = NULL, ImVec2* out_offset = NULL, bool stop_on_new_line = false);
|
static ImVec2 InputTextCalcTextSize(ImGuiContext* ctx, const char* text_begin, const char* text_end, const char** remaining = NULL, ImVec2* out_offset = NULL, bool stop_on_new_line = false);
|
||||||
|
|
||||||
//-------------------------------------------------------------------------
|
//-------------------------------------------------------------------------
|
||||||
@@ -3947,20 +3947,22 @@ bool ImGui::InputTextWithHint(const char* label, const char* hint, char* buf, si
|
|||||||
}
|
}
|
||||||
|
|
||||||
// This is only used in the path where the multiline widget is inactive.
|
// This is only used in the path where the multiline widget is inactive.
|
||||||
static int InputTextCalcTextLenAndLineCount(const char* text_begin, const char** out_text_end)
|
static int InputTextCalcTextLenAndLineCount(ImGuiContext*, const char* text_begin, const char** out_text_end)
|
||||||
{
|
{
|
||||||
int line_count = 0;
|
int line_count = 0;
|
||||||
const char* s = text_begin;
|
const char* s = text_begin;
|
||||||
while (true)
|
|
||||||
{
|
{
|
||||||
const char* s_eol = strchr(s, '\n');
|
while (true)
|
||||||
line_count++;
|
|
||||||
if (s_eol == NULL)
|
|
||||||
{
|
{
|
||||||
s = s + ImStrlen(s);
|
const char* s_eol = strchr(s, '\n');
|
||||||
break;
|
line_count++;
|
||||||
|
if (s_eol == NULL)
|
||||||
|
{
|
||||||
|
s = s + ImStrlen(s);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
s = s_eol + 1;
|
||||||
}
|
}
|
||||||
s = s_eol + 1;
|
|
||||||
}
|
}
|
||||||
*out_text_end = s;
|
*out_text_end = s;
|
||||||
return line_count;
|
return line_count;
|
||||||
@@ -4659,7 +4661,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
|||||||
// Take a copy of the initial buffer value.
|
// Take a copy of the initial buffer value.
|
||||||
// From the moment we focused we are normally ignoring the content of 'buf' (unless we are in read-only mode)
|
// From the moment we focused we are normally ignoring the content of 'buf' (unless we are in read-only mode)
|
||||||
const int buf_len = (int)ImStrlen(buf);
|
const int buf_len = (int)ImStrlen(buf);
|
||||||
IM_ASSERT(buf_len + 1 <= buf_size && "Is your input buffer properly zero-terminated?");
|
IM_ASSERT(((buf_len + 1 <= buf_size) || (buf_len == 0 && buf_size == 0)) && "Is your input buffer properly zero-terminated?");
|
||||||
state->TextToRevertTo.resize(buf_len + 1); // UTF-8. we use +1 to make sure that .Data is always pointing to at least an empty string.
|
state->TextToRevertTo.resize(buf_len + 1); // UTF-8. we use +1 to make sure that .Data is always pointing to at least an empty string.
|
||||||
memcpy(state->TextToRevertTo.Data, buf, buf_len + 1);
|
memcpy(state->TextToRevertTo.Data, buf, buf_len + 1);
|
||||||
|
|
||||||
@@ -5236,7 +5238,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
|||||||
RenderFrame(frame_bb.Min, frame_bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding);
|
RenderFrame(frame_bb.Min, frame_bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding);
|
||||||
}
|
}
|
||||||
|
|
||||||
const ImVec4 clip_rect(frame_bb.Min.x, frame_bb.Min.y, frame_bb.Min.x + inner_size.x, frame_bb.Min.y + inner_size.y); // Not using frame_bb.Max because we have adjusted size
|
const ImRect clip_rect(frame_bb.Min.x, frame_bb.Min.y, frame_bb.Min.x + inner_size.x, frame_bb.Min.y + inner_size.y); // Not using frame_bb.Max because we have adjusted size
|
||||||
ImVec2 draw_pos = is_multiline ? draw_window->DC.CursorPos : frame_bb.Min + style.FramePadding;
|
ImVec2 draw_pos = is_multiline ? draw_window->DC.CursorPos : frame_bb.Min + style.FramePadding;
|
||||||
ImVec2 text_size(0.0f, 0.0f);
|
ImVec2 text_size(0.0f, 0.0f);
|
||||||
|
|
||||||
@@ -5265,7 +5267,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Render text. We currently only render selection when the widget is active or while scrolling.
|
// Render text. We currently only render selection when the widget is active or while scrolling.
|
||||||
// FIXME: We could remove the '&& render_cursor' to keep rendering selection when inactive.
|
// FIXME: This is one of the messiest piece of the whole codebase.
|
||||||
if (render_cursor || render_selection)
|
if (render_cursor || render_selection)
|
||||||
{
|
{
|
||||||
IM_ASSERT(state != NULL);
|
IM_ASSERT(state != NULL);
|
||||||
@@ -5291,14 +5293,17 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
|||||||
const char* selmin_ptr = render_selection ? text_begin + ImMin(state->Stb->select_start, state->Stb->select_end) : NULL;
|
const char* selmin_ptr = render_selection ? text_begin + ImMin(state->Stb->select_start, state->Stb->select_end) : NULL;
|
||||||
|
|
||||||
// Count lines and find line number for cursor and selection ends
|
// Count lines and find line number for cursor and selection ends
|
||||||
|
// FIXME: Switch to zero-based index to reduce confusion.
|
||||||
int line_count = 1;
|
int line_count = 1;
|
||||||
if (is_multiline)
|
if (is_multiline)
|
||||||
{
|
{
|
||||||
for (const char* s = text_begin; (s = (const char*)ImMemchr(s, '\n', (size_t)(text_end - s))) != NULL; s++)
|
|
||||||
{
|
{
|
||||||
if (cursor_line_no == -1 && s >= cursor_ptr) { cursor_line_no = line_count; }
|
for (const char* s = text_begin; (s = (const char*)ImMemchr(s, '\n', (size_t)(text_end - s))) != NULL; s++)
|
||||||
if (selmin_line_no == -1 && s >= selmin_ptr) { selmin_line_no = line_count; }
|
{
|
||||||
line_count++;
|
if (cursor_line_no == -1 && s >= cursor_ptr) { cursor_line_no = line_count; }
|
||||||
|
if (selmin_line_no == -1 && s >= selmin_ptr) { selmin_line_no = line_count; }
|
||||||
|
line_count++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (cursor_line_no == -1)
|
if (cursor_line_no == -1)
|
||||||
@@ -5368,9 +5373,9 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
|||||||
ImVec2 rect_pos = draw_pos + select_start_offset - draw_scroll;
|
ImVec2 rect_pos = draw_pos + select_start_offset - draw_scroll;
|
||||||
for (const char* p = text_selected_begin; p < text_selected_end; )
|
for (const char* p = text_selected_begin; p < text_selected_end; )
|
||||||
{
|
{
|
||||||
if (rect_pos.y > clip_rect.w + g.FontSize)
|
if (rect_pos.y > clip_rect.Max.y + g.FontSize)
|
||||||
break;
|
break;
|
||||||
if (rect_pos.y < clip_rect.y)
|
if (rect_pos.y < clip_rect.Min.y)
|
||||||
{
|
{
|
||||||
p = (const char*)ImMemchr((void*)p, '\n', text_selected_end - p);
|
p = (const char*)ImMemchr((void*)p, '\n', text_selected_end - p);
|
||||||
p = p ? p + 1 : text_selected_end;
|
p = p ? p + 1 : text_selected_end;
|
||||||
@@ -5378,7 +5383,8 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
ImVec2 rect_size = InputTextCalcTextSize(&g, p, text_selected_end, &p, NULL, true);
|
ImVec2 rect_size = InputTextCalcTextSize(&g, p, text_selected_end, &p, NULL, true);
|
||||||
if (rect_size.x <= 0.0f) rect_size.x = IM_TRUNC(g.FontBaked->GetCharAdvance((ImWchar)' ') * 0.50f); // So we can see selected empty lines
|
if (rect_size.x <= 0.0f)
|
||||||
|
rect_size.x = IM_TRUNC(g.FontBaked->GetCharAdvance((ImWchar)' ') * 0.50f); // So we can see selected empty lines
|
||||||
ImRect rect(rect_pos + ImVec2(0.0f, bg_offy_up - g.FontSize), rect_pos + ImVec2(rect_size.x, bg_offy_dn));
|
ImRect rect(rect_pos + ImVec2(0.0f, bg_offy_up - g.FontSize), rect_pos + ImVec2(rect_size.x, bg_offy_dn));
|
||||||
rect.ClipWith(clip_rect);
|
rect.ClipWith(clip_rect);
|
||||||
if (rect.Overlaps(clip_rect))
|
if (rect.Overlaps(clip_rect))
|
||||||
@@ -5394,7 +5400,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
|||||||
if (is_multiline || (buf_display_end - buf_display) < buf_display_max_length)
|
if (is_multiline || (buf_display_end - buf_display) < buf_display_max_length)
|
||||||
{
|
{
|
||||||
ImU32 col = GetColorU32(is_displaying_hint ? ImGuiCol_TextDisabled : ImGuiCol_Text);
|
ImU32 col = GetColorU32(is_displaying_hint ? ImGuiCol_TextDisabled : ImGuiCol_Text);
|
||||||
draw_window->DrawList->AddText(g.Font, g.FontSize, draw_pos - draw_scroll, col, buf_display, buf_display_end, 0.0f, is_multiline ? NULL : &clip_rect);
|
draw_window->DrawList->AddText(g.Font, g.FontSize, draw_pos - draw_scroll, col, buf_display, buf_display_end, 0.0f, is_multiline ? NULL : &clip_rect.AsVec4());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw blinking cursor
|
// Draw blinking cursor
|
||||||
@@ -5425,7 +5431,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
|||||||
{
|
{
|
||||||
// Render text only (no selection, no cursor)
|
// Render text only (no selection, no cursor)
|
||||||
if (is_multiline)
|
if (is_multiline)
|
||||||
text_size = ImVec2(inner_size.x, InputTextCalcTextLenAndLineCount(buf_display, &buf_display_end) * g.FontSize); // We don't need width
|
text_size = ImVec2(inner_size.x, InputTextCalcTextLenAndLineCount(&g, buf_display, &buf_display_end) * g.FontSize); // We don't need width
|
||||||
else if (!is_displaying_hint && g.ActiveId == id)
|
else if (!is_displaying_hint && g.ActiveId == id)
|
||||||
buf_display_end = buf_display + state->TextLen;
|
buf_display_end = buf_display + state->TextLen;
|
||||||
else if (!is_displaying_hint)
|
else if (!is_displaying_hint)
|
||||||
@@ -5439,7 +5445,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
|||||||
|
|
||||||
const ImVec2 draw_scroll = /*state ? ImVec2(state->Scroll.x, 0.0f) :*/ ImVec2(0.0f, 0.0f); // Preserve scroll when inactive?
|
const ImVec2 draw_scroll = /*state ? ImVec2(state->Scroll.x, 0.0f) :*/ ImVec2(0.0f, 0.0f); // Preserve scroll when inactive?
|
||||||
ImU32 col = GetColorU32(is_displaying_hint ? ImGuiCol_TextDisabled : ImGuiCol_Text);
|
ImU32 col = GetColorU32(is_displaying_hint ? ImGuiCol_TextDisabled : ImGuiCol_Text);
|
||||||
draw_window->DrawList->AddText(g.Font, g.FontSize, draw_pos - draw_scroll, col, buf_display, buf_display_end, 0.0f, is_multiline ? NULL : &clip_rect);
|
draw_window->DrawList->AddText(g.Font, g.FontSize, draw_pos - draw_scroll, col, buf_display, buf_display_end, 0.0f, is_multiline ? NULL : &clip_rect.AsVec4());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -181,10 +181,10 @@
|
|||||||
//
|
//
|
||||||
// To support UTF-8:
|
// To support UTF-8:
|
||||||
//
|
//
|
||||||
// STB_TEXTEDIT_GETPREVCHARINDEX returns index of previous character
|
// STB_TEXTEDIT_GETPREVCHARINDEX returns index of previous character
|
||||||
// STB_TEXTEDIT_GETNEXTCHARINDEX returns index of next character
|
// STB_TEXTEDIT_GETNEXTCHARINDEX returns index of next character
|
||||||
// Do NOT define STB_TEXTEDIT_KEYTOTEXT.
|
// Do NOT define STB_TEXTEDIT_KEYTOTEXT.
|
||||||
// Instead, call stb_textedit_text() directly for text contents.
|
// Instead, call stb_textedit_text() directly for text contents.
|
||||||
//
|
//
|
||||||
// Keyboard input must be encoded as a single integer value; e.g. a character code
|
// Keyboard input must be encoded as a single integer value; e.g. a character code
|
||||||
// and some bitflags that represent shift states. to simplify the interface, SHIFT must
|
// and some bitflags that represent shift states. to simplify the interface, SHIFT must
|
||||||
@@ -260,7 +260,7 @@
|
|||||||
//
|
//
|
||||||
// text: (added 2025)
|
// text: (added 2025)
|
||||||
// call this to directly send text input the textfield, which is required
|
// call this to directly send text input the textfield, which is required
|
||||||
// for UTF-8 support, because stb_textedit_key() + STB_TEXTEDIT_KEYTOTEXT()
|
// for UTF-8 support, because stb_textedit_key() + STB_TEXTEDIT_KEYTOTEXT()
|
||||||
// cannot infer text length.
|
// cannot infer text length.
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
@@ -921,8 +921,8 @@ retry:
|
|||||||
|
|
||||||
// [DEAR IMGUI]
|
// [DEAR IMGUI]
|
||||||
// going down while being on the last line shouldn't bring us to that line end
|
// going down while being on the last line shouldn't bring us to that line end
|
||||||
if (STB_TEXTEDIT_GETCHAR(str, find.first_char + find.length - 1) != STB_TEXTEDIT_NEWLINE)
|
//if (STB_TEXTEDIT_GETCHAR(str, find.first_char + find.length - 1) != STB_TEXTEDIT_NEWLINE)
|
||||||
break;
|
// break;
|
||||||
|
|
||||||
// now find character position down a row
|
// now find character position down a row
|
||||||
state->cursor = start;
|
state->cursor = start;
|
||||||
@@ -1100,8 +1100,12 @@ retry:
|
|||||||
stb_textedit_move_to_first(state);
|
stb_textedit_move_to_first(state);
|
||||||
if (state->single_line)
|
if (state->single_line)
|
||||||
state->cursor = 0;
|
state->cursor = 0;
|
||||||
else while (state->cursor > 0 && STB_TEXTEDIT_GETCHAR(str, state->cursor-1) != STB_TEXTEDIT_NEWLINE)
|
else while (state->cursor > 0) {
|
||||||
state->cursor = IMSTB_TEXTEDIT_GETPREVCHARINDEX(str, state->cursor);
|
int prev = IMSTB_TEXTEDIT_GETPREVCHARINDEX(str, state->cursor);
|
||||||
|
if (STB_TEXTEDIT_GETCHAR(str, prev) == STB_TEXTEDIT_NEWLINE)
|
||||||
|
break;
|
||||||
|
state->cursor = prev;
|
||||||
|
}
|
||||||
state->has_preferred_x = 0;
|
state->has_preferred_x = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -1128,8 +1132,12 @@ retry:
|
|||||||
stb_textedit_prep_selection_at_cursor(state);
|
stb_textedit_prep_selection_at_cursor(state);
|
||||||
if (state->single_line)
|
if (state->single_line)
|
||||||
state->cursor = 0;
|
state->cursor = 0;
|
||||||
else while (state->cursor > 0 && STB_TEXTEDIT_GETCHAR(str, state->cursor-1) != STB_TEXTEDIT_NEWLINE)
|
else while (state->cursor > 0) {
|
||||||
state->cursor = IMSTB_TEXTEDIT_GETPREVCHARINDEX(str, state->cursor);
|
int prev = IMSTB_TEXTEDIT_GETPREVCHARINDEX(str, state->cursor);
|
||||||
|
if (STB_TEXTEDIT_GETCHAR(str, prev) == STB_TEXTEDIT_NEWLINE)
|
||||||
|
break;
|
||||||
|
state->cursor = prev;
|
||||||
|
}
|
||||||
state->select_end = state->cursor;
|
state->select_end = state->cursor;
|
||||||
state->has_preferred_x = 0;
|
state->has_preferred_x = 0;
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user