|
@@ -2315,8 +2315,9 @@ bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* p_data,
|
|
|
const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y * 2.0f));
|
|
|
const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f));
|
|
|
|
|
|
+ const bool temp_input_allowed = (flags & ImGuiSliderFlags_NoInput) == 0;
|
|
|
ItemSize(total_bb, style.FramePadding.y);
|
|
|
- if (!ItemAdd(total_bb, id, &frame_bb))
|
|
|
+ if (!ItemAdd(total_bb, id, &frame_bb, temp_input_allowed ? ImGuiItemAddFlags_Focusable : 0))
|
|
|
return false;
|
|
|
|
|
|
// Default format string when passing NULL
|
|
@@ -2327,11 +2328,10 @@ bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* p_data,
|
|
|
|
|
|
// Tabbing or CTRL-clicking on Drag turns it into an InputText
|
|
|
const bool hovered = ItemHoverable(frame_bb, id);
|
|
|
- const bool temp_input_allowed = (flags & ImGuiSliderFlags_NoInput) == 0;
|
|
|
bool temp_input_is_active = temp_input_allowed && TempInputIsActive(id);
|
|
|
if (!temp_input_is_active)
|
|
|
{
|
|
|
- const bool focus_requested = temp_input_allowed && FocusableItemRegister(window, id);
|
|
|
+ const bool focus_requested = temp_input_allowed && (window->DC.LastItemStatusFlags & ImGuiItemStatusFlags_Focused) != 0;
|
|
|
const bool clicked = (hovered && g.IO.MouseClicked[0]);
|
|
|
const bool double_clicked = (hovered && g.IO.MouseDoubleClicked[0]);
|
|
|
if (focus_requested || clicked || double_clicked || g.NavActivateId == id || g.NavInputId == id)
|
|
@@ -2341,10 +2341,7 @@ bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* p_data,
|
|
|
FocusWindow(window);
|
|
|
g.ActiveIdUsingNavDirMask = (1 << ImGuiDir_Left) | (1 << ImGuiDir_Right);
|
|
|
if (temp_input_allowed && (focus_requested || (clicked && g.IO.KeyCtrl) || double_clicked || g.NavInputId == id))
|
|
|
- {
|
|
|
temp_input_is_active = true;
|
|
|
- FocusableItemUnregister(window);
|
|
|
- }
|
|
|
}
|
|
|
// Experimental: simple click (without moving) turns Drag into an InputText
|
|
|
// FIXME: Currently polling ImGuiConfigFlags_IsTouchScreen, may either poll an hypothetical ImGuiBackendFlags_HasKeyboard and/or an explicit drag settings.
|
|
@@ -2353,7 +2350,6 @@ bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* p_data,
|
|
|
{
|
|
|
g.NavInputId = id;
|
|
|
temp_input_is_active = true;
|
|
|
- FocusableItemUnregister(window);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -2934,8 +2930,9 @@ bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* p_dat
|
|
|
const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y * 2.0f));
|
|
|
const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f));
|
|
|
|
|
|
+ const bool temp_input_allowed = (flags & ImGuiSliderFlags_NoInput) == 0;
|
|
|
ItemSize(total_bb, style.FramePadding.y);
|
|
|
- if (!ItemAdd(total_bb, id, &frame_bb))
|
|
|
+ if (!ItemAdd(total_bb, id, &frame_bb, temp_input_allowed ? ImGuiItemAddFlags_Focusable : 0))
|
|
|
return false;
|
|
|
|
|
|
// Default format string when passing NULL
|
|
@@ -2946,11 +2943,10 @@ bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* p_dat
|
|
|
|
|
|
// Tabbing or CTRL-clicking on Slider turns it into an input box
|
|
|
const bool hovered = ItemHoverable(frame_bb, id);
|
|
|
- const bool temp_input_allowed = (flags & ImGuiSliderFlags_NoInput) == 0;
|
|
|
bool temp_input_is_active = temp_input_allowed && TempInputIsActive(id);
|
|
|
if (!temp_input_is_active)
|
|
|
{
|
|
|
- const bool focus_requested = temp_input_allowed && FocusableItemRegister(window, id);
|
|
|
+ const bool focus_requested = temp_input_allowed && (window->DC.LastItemStatusFlags & ImGuiItemStatusFlags_Focused) != 0;
|
|
|
const bool clicked = (hovered && g.IO.MouseClicked[0]);
|
|
|
if (focus_requested || clicked || g.NavActivateId == id || g.NavInputId == id)
|
|
|
{
|
|
@@ -2959,10 +2955,7 @@ bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* p_dat
|
|
|
FocusWindow(window);
|
|
|
g.ActiveIdUsingNavDirMask |= (1 << ImGuiDir_Left) | (1 << ImGuiDir_Right);
|
|
|
if (temp_input_allowed && (focus_requested || (clicked && g.IO.KeyCtrl) || g.NavInputId == id))
|
|
|
- {
|
|
|
temp_input_is_active = true;
|
|
|
- FocusableItemUnregister(window);
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -3289,7 +3282,7 @@ bool ImGui::TempInputText(const ImRect& bb, ImGuiID id, const char* label, char*
|
|
|
ClearActiveID();
|
|
|
|
|
|
g.CurrentWindow->DC.CursorPos = bb.Min;
|
|
|
- bool value_changed = InputTextEx(label, NULL, buf, buf_size, bb.GetSize(), flags);
|
|
|
+ bool value_changed = InputTextEx(label, NULL, buf, buf_size, bb.GetSize(), flags | ImGuiInputTextFlags_MergedItem);
|
|
|
if (init)
|
|
|
{
|
|
|
// First frame we started displaying the InputText widget, we expect it to take the active id.
|
|
@@ -3901,7 +3894,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
|
|
ImVec2 inner_size = frame_size;
|
|
|
if (is_multiline)
|
|
|
{
|
|
|
- if (!ItemAdd(total_bb, id, &frame_bb))
|
|
|
+ if (!ItemAdd(total_bb, id, &frame_bb, ImGuiItemAddFlags_Focusable))
|
|
|
{
|
|
|
ItemSize(total_bb, style.FramePadding.y);
|
|
|
EndGroup();
|
|
@@ -3928,9 +3921,11 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
+ // Support for internal ImGuiInputTextFlags_MergedItem flag, which could be redesigned as an ItemFlags if needed (with test performed in ItemAdd)
|
|
|
ItemSize(total_bb, style.FramePadding.y);
|
|
|
- if (!ItemAdd(total_bb, id, &frame_bb))
|
|
|
- return false;
|
|
|
+ if (!(flags & ImGuiInputTextFlags_MergedItem))
|
|
|
+ if (!ItemAdd(total_bb, id, &frame_bb, ImGuiItemAddFlags_Focusable))
|
|
|
+ return false;
|
|
|
}
|
|
|
const bool hovered = ItemHoverable(frame_bb, id);
|
|
|
if (hovered)
|
|
@@ -3939,9 +3934,8 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
|
|
// We are only allowed to access the state if we are already the active widget.
|
|
|
ImGuiInputTextState* state = GetInputTextState(id);
|
|
|
|
|
|
- const bool focus_requested = FocusableItemRegister(window, id);
|
|
|
- const bool focus_requested_by_code = focus_requested && (g.TabFocusRequestCurrWindow == window && g.TabFocusRequestCurrCounterRegular == window->DC.FocusCounterRegular);
|
|
|
- const bool focus_requested_by_tab = focus_requested && !focus_requested_by_code;
|
|
|
+ const bool focus_requested_by_code = (window->DC.LastItemStatusFlags & ImGuiItemStatusFlags_FocusedByCode) != 0;
|
|
|
+ const bool focus_requested_by_tabbing = (window->DC.LastItemStatusFlags & ImGuiItemStatusFlags_FocusedByTabbing) != 0;
|
|
|
|
|
|
const bool user_clicked = hovered && io.MouseClicked[0];
|
|
|
const bool user_nav_input_start = (g.ActiveId != id) && ((g.NavInputId == id) || (g.NavActivateId == id && g.NavInputSource == ImGuiInputSource_Keyboard));
|
|
@@ -3954,7 +3948,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
|
|
float scroll_y = is_multiline ? draw_window->Scroll.y : FLT_MAX;
|
|
|
|
|
|
const bool init_changed_specs = (state != NULL && state->Stb.single_line != !is_multiline);
|
|
|
- const bool init_make_active = (focus_requested || user_clicked || user_scroll_finish || user_nav_input_start);
|
|
|
+ const bool init_make_active = (user_clicked || user_scroll_finish || user_nav_input_start || focus_requested_by_code || focus_requested_by_tabbing);
|
|
|
const bool init_state = (init_make_active || user_scroll_active);
|
|
|
if ((init_state && g.ActiveId != id) || init_changed_specs)
|
|
|
{
|
|
@@ -3995,7 +3989,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
|
|
}
|
|
|
if (flags & ImGuiInputTextFlags_AlwaysOverwrite)
|
|
|
state->Stb.insert_mode = 1; // stb field name is indeed incorrect (see #2863)
|
|
|
- if (!is_multiline && (focus_requested_by_tab || (user_clicked && io.KeyCtrl)))
|
|
|
+ if (!is_multiline && (focus_requested_by_tabbing || (user_clicked && io.KeyCtrl)))
|
|
|
select_all = true;
|
|
|
}
|
|
|
|