mirror of
https://github.com/Drezil/imgui.git
synced 2024-11-25 21:17:01 +00:00
Internals: TempInputText: Tidying up DragScalar / SliderScalar / TempInputTextScalar.
This commit is contained in:
parent
0ca1675ff9
commit
dd15b44230
@ -1989,8 +1989,6 @@ bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* v, floa
|
|||||||
if (!ItemAdd(total_bb, id, &frame_bb))
|
if (!ItemAdd(total_bb, id, &frame_bb))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
const bool hovered = ItemHoverable(frame_bb, id);
|
|
||||||
|
|
||||||
// Default format string when passing NULL
|
// Default format string when passing NULL
|
||||||
// Patch old "%.0f" format string to use "%d", read function comments for more details.
|
// Patch old "%.0f" format string to use "%d", read function comments for more details.
|
||||||
IM_ASSERT(data_type >= 0 && data_type < ImGuiDataType_COUNT);
|
IM_ASSERT(data_type >= 0 && data_type < ImGuiDataType_COUNT);
|
||||||
@ -2000,38 +1998,38 @@ bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* v, floa
|
|||||||
format = PatchFormatStringFloatToInt(format);
|
format = PatchFormatStringFloatToInt(format);
|
||||||
|
|
||||||
// Tabbing or CTRL-clicking on Drag turns it into an input box
|
// Tabbing or CTRL-clicking on Drag turns it into an input box
|
||||||
|
const bool hovered = ItemHoverable(frame_bb, id);
|
||||||
bool temp_input_is_active = TempInputTextIsActive(id);
|
bool temp_input_is_active = TempInputTextIsActive(id);
|
||||||
bool temp_input_start = false;
|
bool temp_input_start = false;
|
||||||
const bool focus_requested = FocusableItemRegister(window, id);
|
if (!temp_input_is_active)
|
||||||
if (focus_requested || (hovered && (g.IO.MouseClicked[0] || g.IO.MouseDoubleClicked[0])) || g.NavActivateId == id || (g.NavInputId == id && !temp_input_is_active))
|
|
||||||
{
|
{
|
||||||
SetActiveID(id, window);
|
const bool focus_requested = FocusableItemRegister(window, id);
|
||||||
SetFocusID(id, window);
|
if (focus_requested || (hovered && (g.IO.MouseClicked[0] || g.IO.MouseDoubleClicked[0])) || g.NavActivateId == id || g.NavInputId == id)
|
||||||
FocusWindow(window);
|
|
||||||
g.ActiveIdAllowNavDirFlags = (1 << ImGuiDir_Up) | (1 << ImGuiDir_Down);
|
|
||||||
if (focus_requested || g.IO.KeyCtrl || g.IO.MouseDoubleClicked[0] || g.NavInputId == id)
|
|
||||||
{
|
{
|
||||||
temp_input_start = true;
|
SetActiveID(id, window);
|
||||||
g.TempInputTextId = 0;
|
SetFocusID(id, window);
|
||||||
|
FocusWindow(window);
|
||||||
|
g.ActiveIdAllowNavDirFlags = (1 << ImGuiDir_Up) | (1 << ImGuiDir_Down);
|
||||||
|
if (focus_requested || g.IO.KeyCtrl || g.IO.MouseDoubleClicked[0] || g.NavInputId == id)
|
||||||
|
{
|
||||||
|
temp_input_start = true;
|
||||||
|
FocusableItemUnregister(window);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (temp_input_is_active || temp_input_start)
|
if (temp_input_is_active || temp_input_start)
|
||||||
{
|
|
||||||
window->DC.CursorPos = frame_bb.Min;
|
|
||||||
FocusableItemUnregister(window);
|
|
||||||
return TempInputTextScalar(frame_bb, id, label, data_type, v, format);
|
return TempInputTextScalar(frame_bb, id, label, data_type, v, format);
|
||||||
}
|
|
||||||
|
|
||||||
// Actual drag behavior
|
|
||||||
const bool value_changed = DragBehavior(id, data_type, v, v_speed, v_min, v_max, format, power, ImGuiDragFlags_None);
|
|
||||||
if (value_changed)
|
|
||||||
MarkItemEdited(id);
|
|
||||||
|
|
||||||
// Draw frame
|
// Draw frame
|
||||||
const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : g.HoveredId == id ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg);
|
const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : g.HoveredId == id ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg);
|
||||||
RenderNavHighlight(frame_bb, id);
|
RenderNavHighlight(frame_bb, id);
|
||||||
RenderFrame(frame_bb.Min, frame_bb.Max, frame_col, true, style.FrameRounding);
|
RenderFrame(frame_bb.Min, frame_bb.Max, frame_col, true, style.FrameRounding);
|
||||||
|
|
||||||
|
// Drag behavior
|
||||||
|
const bool value_changed = DragBehavior(id, data_type, v, v_speed, v_min, v_max, format, power, ImGuiDragFlags_None);
|
||||||
|
if (value_changed)
|
||||||
|
MarkItemEdited(id);
|
||||||
|
|
||||||
// Display value using user-provided display format so user can add prefix/suffix/decorations to the value.
|
// Display value using user-provided display format so user can add prefix/suffix/decorations to the value.
|
||||||
char value_buf[64];
|
char value_buf[64];
|
||||||
const char* value_buf_end = value_buf + DataTypeFormatString(value_buf, IM_ARRAYSIZE(value_buf), data_type, v, format);
|
const char* value_buf_end = value_buf + DataTypeFormatString(value_buf, IM_ARRAYSIZE(value_buf), data_type, v, format);
|
||||||
@ -2443,28 +2441,27 @@ bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* v, co
|
|||||||
format = PatchFormatStringFloatToInt(format);
|
format = PatchFormatStringFloatToInt(format);
|
||||||
|
|
||||||
// Tabbing or CTRL-clicking on Slider turns it into an input box
|
// Tabbing or CTRL-clicking on Slider turns it into an input box
|
||||||
|
const bool hovered = ItemHoverable(frame_bb, id);
|
||||||
bool temp_input_is_active = TempInputTextIsActive(id);
|
bool temp_input_is_active = TempInputTextIsActive(id);
|
||||||
bool temp_input_start = false;
|
bool temp_input_start = false;
|
||||||
const bool focus_requested = FocusableItemRegister(window, id);
|
if (!temp_input_is_active)
|
||||||
const bool hovered = ItemHoverable(frame_bb, id);
|
|
||||||
if (focus_requested || (hovered && g.IO.MouseClicked[0]) || g.NavActivateId == id || (g.NavInputId == id && !temp_input_is_active))
|
|
||||||
{
|
{
|
||||||
SetActiveID(id, window);
|
const bool focus_requested = FocusableItemRegister(window, id);
|
||||||
SetFocusID(id, window);
|
if (focus_requested || (hovered && g.IO.MouseClicked[0]) || g.NavActivateId == id || g.NavInputId == id)
|
||||||
FocusWindow(window);
|
|
||||||
g.ActiveIdAllowNavDirFlags = (1 << ImGuiDir_Up) | (1 << ImGuiDir_Down);
|
|
||||||
if (focus_requested || g.IO.KeyCtrl || g.NavInputId == id)
|
|
||||||
{
|
{
|
||||||
temp_input_start = true;
|
SetActiveID(id, window);
|
||||||
g.TempInputTextId = 0;
|
SetFocusID(id, window);
|
||||||
|
FocusWindow(window);
|
||||||
|
g.ActiveIdAllowNavDirFlags = (1 << ImGuiDir_Up) | (1 << ImGuiDir_Down);
|
||||||
|
if (focus_requested || g.IO.KeyCtrl || g.NavInputId == id)
|
||||||
|
{
|
||||||
|
temp_input_start = true;
|
||||||
|
FocusableItemUnregister(window);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (temp_input_is_active || temp_input_start)
|
if (temp_input_is_active || temp_input_start)
|
||||||
{
|
|
||||||
window->DC.CursorPos = frame_bb.Min;
|
|
||||||
FocusableItemUnregister(window);
|
|
||||||
return TempInputTextScalar(frame_bb, id, label, data_type, v, format);
|
return TempInputTextScalar(frame_bb, id, label, data_type, v, format);
|
||||||
}
|
|
||||||
|
|
||||||
// Draw frame
|
// Draw frame
|
||||||
const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : g.HoveredId == id ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg);
|
const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : g.HoveredId == id ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg);
|
||||||
@ -2740,12 +2737,12 @@ int ImParseFormatPrecision(const char* fmt, int default_precision)
|
|||||||
// FIXME: Facilitate using this in variety of other situations.
|
// FIXME: Facilitate using this in variety of other situations.
|
||||||
bool ImGui::TempInputTextScalar(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* data_ptr, const char* format)
|
bool ImGui::TempInputTextScalar(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* data_ptr, const char* format)
|
||||||
{
|
{
|
||||||
IM_UNUSED(id);
|
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
|
|
||||||
// On the first frame, g.TempInputTextId == 0, then on subsequent frames it becomes == id.
|
// On the first frame, g.TempInputTextId == 0, then on subsequent frames it becomes == id.
|
||||||
// We clear ActiveID on the first frame to allow the InputText() taking it back.
|
// We clear ActiveID on the first frame to allow the InputText() taking it back.
|
||||||
if (g.TempInputTextId == 0)
|
const bool init = (g.TempInputTextId != id);
|
||||||
|
if (init)
|
||||||
ClearActiveID();
|
ClearActiveID();
|
||||||
|
|
||||||
char fmt_buf[32];
|
char fmt_buf[32];
|
||||||
@ -2753,9 +2750,11 @@ bool ImGui::TempInputTextScalar(const ImRect& bb, ImGuiID id, const char* label,
|
|||||||
format = ImParseFormatTrimDecorations(format, fmt_buf, IM_ARRAYSIZE(fmt_buf));
|
format = ImParseFormatTrimDecorations(format, fmt_buf, IM_ARRAYSIZE(fmt_buf));
|
||||||
DataTypeFormatString(data_buf, IM_ARRAYSIZE(data_buf), data_type, data_ptr, format);
|
DataTypeFormatString(data_buf, IM_ARRAYSIZE(data_buf), data_type, data_ptr, format);
|
||||||
ImStrTrimBlanks(data_buf);
|
ImStrTrimBlanks(data_buf);
|
||||||
|
|
||||||
|
g.CurrentWindow->DC.CursorPos = bb.Min;
|
||||||
ImGuiInputTextFlags flags = ImGuiInputTextFlags_AutoSelectAll | ((data_type == ImGuiDataType_Float || data_type == ImGuiDataType_Double) ? ImGuiInputTextFlags_CharsScientific : ImGuiInputTextFlags_CharsDecimal);
|
ImGuiInputTextFlags flags = ImGuiInputTextFlags_AutoSelectAll | ((data_type == ImGuiDataType_Float || data_type == ImGuiDataType_Double) ? ImGuiInputTextFlags_CharsScientific : ImGuiInputTextFlags_CharsDecimal);
|
||||||
bool value_changed = InputTextEx(label, NULL, data_buf, IM_ARRAYSIZE(data_buf), bb.GetSize(), flags);
|
bool value_changed = InputTextEx(label, NULL, data_buf, IM_ARRAYSIZE(data_buf), bb.GetSize(), flags);
|
||||||
if (g.TempInputTextId == 0)
|
if (init)
|
||||||
{
|
{
|
||||||
// First frame we started displaying the InputText widget, we expect it to take the active id.
|
// First frame we started displaying the InputText widget, we expect it to take the active id.
|
||||||
IM_ASSERT(g.ActiveId == id);
|
IM_ASSERT(g.ActiveId == id);
|
||||||
|
Loading…
Reference in New Issue
Block a user