InputText() last active preserve scrolling position. Reset scroll if widget size becomes bigger than contents.
This commit is contained in:
parent
d1aca79f4e
commit
ff5378bd66
24
imgui.cpp
24
imgui.cpp
@ -5562,6 +5562,18 @@ void ImGuiTextEditState::UpdateScrollOffset()
|
|||||||
// Scroll in chunks of quarter width
|
// Scroll in chunks of quarter width
|
||||||
const float scroll_x_increment = Width * 0.25f;
|
const float scroll_x_increment = Width * 0.25f;
|
||||||
const float cursor_offset_x = Font->CalcTextSizeW(FontSize, FLT_MAX, Text, Text+StbState.cursor, NULL).x;
|
const float cursor_offset_x = Font->CalcTextSizeW(FontSize, FLT_MAX, Text, Text+StbState.cursor, NULL).x;
|
||||||
|
|
||||||
|
// If widget became bigger than text (because of a resize), reset horizontal scrolling
|
||||||
|
if (ScrollX > 0.0f)
|
||||||
|
{
|
||||||
|
const float text_width = cursor_offset_x + Font->CalcTextSizeW(FontSize, FLT_MAX, Text+StbState.cursor, NULL, NULL).x;
|
||||||
|
if (text_width < Width)
|
||||||
|
{
|
||||||
|
ScrollX = 0.0f;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (cursor_offset_x < ScrollX)
|
if (cursor_offset_x < ScrollX)
|
||||||
ScrollX = ImMax(0.0f, cursor_offset_x - scroll_x_increment);
|
ScrollX = ImMax(0.0f, cursor_offset_x - scroll_x_increment);
|
||||||
else if (cursor_offset_x - Width >= ScrollX)
|
else if (cursor_offset_x - Width >= ScrollX)
|
||||||
@ -5873,14 +5885,18 @@ bool ImGui::InputText(const char* label, char* buf, size_t buf_size, ImGuiInputT
|
|||||||
bool cancel_edit = false;
|
bool cancel_edit = false;
|
||||||
bool enter_pressed = false;
|
bool enter_pressed = false;
|
||||||
if (g.ActiveId == id)
|
if (g.ActiveId == id)
|
||||||
|
//if (edit_state.Id == id) // Works, but double-click to select-all sets cursors to end which in turn tends to scroll toward the right when shrinking widget.
|
||||||
{
|
{
|
||||||
// Edit in progress
|
// Update some data if we are active or last active
|
||||||
edit_state.Width = w + style.FramePadding.x;
|
edit_state.Width = w + style.FramePadding.x;
|
||||||
edit_state.BufSizeA = buf_size;
|
edit_state.BufSizeA = buf_size;
|
||||||
edit_state.Font = window->Font();
|
edit_state.Font = window->Font();
|
||||||
edit_state.FontSize = window->FontSize();
|
edit_state.FontSize = window->FontSize();
|
||||||
edit_state.UpdateScrollOffset();
|
edit_state.UpdateScrollOffset();
|
||||||
|
}
|
||||||
|
if (g.ActiveId == id)
|
||||||
|
{
|
||||||
|
// Edit in progress
|
||||||
const float mx = g.IO.MousePos.x - frame_bb.Min.x - style.FramePadding.x;
|
const float mx = g.IO.MousePos.x - frame_bb.Min.x - style.FramePadding.x;
|
||||||
const float my = window->FontSize()*0.5f; // Flatten mouse because we are doing a single-line edit
|
const float my = window->FontSize()*0.5f; // Flatten mouse because we are doing a single-line edit
|
||||||
|
|
||||||
@ -6083,8 +6099,8 @@ bool ImGui::InputText(const char* label, char* buf, size_t buf_size, ImGuiInputT
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const float render_scroll_x = (g.ActiveId == id) ? edit_state.ScrollX : 0.0f;
|
//const float render_scroll_x = (g.ActiveId == id) ? edit_state.ScrollX : 0.0f;
|
||||||
//const float render_scroll_x = (edit_state.Id == id) ? edit_state.ScrollX : 0.0f;
|
const float render_scroll_x = (edit_state.Id == id) ? edit_state.ScrollX : 0.0f;
|
||||||
ImGuiTextEditState::RenderTextScrolledClipped(window->Font(), window->FontSize(), buf, frame_bb.Min + style.FramePadding, w + style.FramePadding.x, render_scroll_x);
|
ImGuiTextEditState::RenderTextScrolledClipped(window->Font(), window->FontSize(), buf, frame_bb.Min + style.FramePadding, w + style.FramePadding.x, render_scroll_x);
|
||||||
|
|
||||||
if (g.ActiveId == id)
|
if (g.ActiveId == id)
|
||||||
|
Loading…
Reference in New Issue
Block a user