|
@@ -1903,7 +1903,6 @@ bool ImGui::Combo(const char* label, int* current_item, const char* items_separa
|
|
|
//-------------------------------------------------------------------------
|
|
|
// [SECTION] Data Type and Data Formatting Helpers [Internal]
|
|
|
//-------------------------------------------------------------------------
|
|
|
-// - PatchFormatStringFloatToInt()
|
|
|
// - DataTypeGetInfo()
|
|
|
// - DataTypeFormatString()
|
|
|
// - DataTypeApplyOp()
|
|
@@ -1934,30 +1933,6 @@ static const ImGuiDataTypeInfo GDataTypeInfo[] =
|
|
|
};
|
|
|
IM_STATIC_ASSERT(IM_ARRAYSIZE(GDataTypeInfo) == ImGuiDataType_COUNT);
|
|
|
|
|
|
-// FIXME-LEGACY: Prior to 1.61 our DragInt() function internally used floats and because of this the compile-time default value for format was "%.0f".
|
|
|
-// Even though we changed the compile-time default, we expect users to have carried %f around, which would break the display of DragInt() calls.
|
|
|
-// To honor backward compatibility we are rewriting the format string, unless IMGUI_DISABLE_OBSOLETE_FUNCTIONS is enabled. What could possibly go wrong?!
|
|
|
-static const char* PatchFormatStringFloatToInt(const char* fmt)
|
|
|
-{
|
|
|
- if (fmt[0] == '%' && fmt[1] == '.' && fmt[2] == '0' && fmt[3] == 'f' && fmt[4] == 0) // Fast legacy path for "%.0f" which is expected to be the most common case.
|
|
|
- return "%d";
|
|
|
- const char* fmt_start = ImParseFormatFindStart(fmt); // Find % (if any, and ignore %%)
|
|
|
- const char* fmt_end = ImParseFormatFindEnd(fmt_start); // Find end of format specifier, which itself is an exercise of confidence/recklessness (because snprintf is dependent on libc or user).
|
|
|
- if (fmt_end > fmt_start && fmt_end[-1] == 'f')
|
|
|
- {
|
|
|
-#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
|
|
|
- if (fmt_start == fmt && fmt_end[0] == 0)
|
|
|
- return "%d";
|
|
|
- const char* tmp_format;
|
|
|
- ImFormatStringToTempBuffer(&tmp_format, NULL, "%.*s%%d%s", (int)(fmt_start - fmt), fmt, fmt_end); // Honor leading and trailing decorations, but lose alignment/precision.
|
|
|
- return tmp_format;
|
|
|
-#else
|
|
|
- IM_ASSERT(0 && "DragInt(): Invalid format string!"); // Old versions used a default parameter of "%.0f", please replace with e.g. "%d"
|
|
|
-#endif
|
|
|
- }
|
|
|
- return fmt;
|
|
|
-}
|
|
|
-
|
|
|
const ImGuiDataTypeInfo* ImGui::DataTypeGetInfo(ImGuiDataType data_type)
|
|
|
{
|
|
|
IM_ASSERT(data_type >= 0 && data_type < ImGuiDataType_COUNT);
|
|
@@ -2371,8 +2346,6 @@ bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* p_data,
|
|
|
// Default format string when passing NULL
|
|
|
if (format == NULL)
|
|
|
format = DataTypeGetInfo(data_type)->PrintFmt;
|
|
|
- else if (data_type == ImGuiDataType_S32 && strcmp(format, "%d") != 0) // (FIXME-LEGACY: Patch old "%.0f" format string to use "%d", read function more details.)
|
|
|
- format = PatchFormatStringFloatToInt(format);
|
|
|
|
|
|
const bool hovered = ItemHoverable(frame_bb, id);
|
|
|
bool temp_input_is_active = temp_input_allowed && TempInputIsActive(id);
|
|
@@ -2964,8 +2937,6 @@ bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* p_dat
|
|
|
// Default format string when passing NULL
|
|
|
if (format == NULL)
|
|
|
format = DataTypeGetInfo(data_type)->PrintFmt;
|
|
|
- else if (data_type == ImGuiDataType_S32 && strcmp(format, "%d") != 0) // (FIXME-LEGACY: Patch old "%.0f" format string to use "%d", read function more details.)
|
|
|
- format = PatchFormatStringFloatToInt(format);
|
|
|
|
|
|
const bool hovered = ItemHoverable(frame_bb, id);
|
|
|
bool temp_input_is_active = temp_input_allowed && TempInputIsActive(id);
|
|
@@ -3131,8 +3102,6 @@ bool ImGui::VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType d
|
|
|
// Default format string when passing NULL
|
|
|
if (format == NULL)
|
|
|
format = DataTypeGetInfo(data_type)->PrintFmt;
|
|
|
- else if (data_type == ImGuiDataType_S32 && strcmp(format, "%d") != 0) // (FIXME-LEGACY: Patch old "%.0f" format string to use "%d", read function more details.)
|
|
|
- format = PatchFormatStringFloatToInt(format);
|
|
|
|
|
|
const bool hovered = ItemHoverable(frame_bb, id);
|
|
|
if ((hovered && g.IO.MouseClicked[0]) || g.NavActivateId == id || g.NavActivateInputId == id)
|
|
@@ -7169,11 +7138,19 @@ bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled)
|
|
|
|
|
|
if (menu_is_open)
|
|
|
{
|
|
|
- // FIXME: This technically breaks functions relying on LastItemData, somehow nobody complained yet. Should backup/restore LastItemData.
|
|
|
+ ImGuiLastItemData last_item_in_parent = g.LastItemData;
|
|
|
SetNextWindowPos(popup_pos, ImGuiCond_Always); // Note: misleading: the value will serve as reference for FindBestWindowPosForPopup(), not actual pos.
|
|
|
PushStyleVar(ImGuiStyleVar_ChildRounding, style.PopupRounding); // First level will use _PopupRounding, subsequent will use _ChildRounding
|
|
|
menu_is_open = BeginPopupEx(id, flags); // menu_is_open can be 'false' when the popup is completely clipped (e.g. zero size display)
|
|
|
PopStyleVar();
|
|
|
+ if (menu_is_open)
|
|
|
+ {
|
|
|
+ // Restore LastItemData so IsItemXXXX functions can work after BeginMenu()/EndMenu()
|
|
|
+ // (This fixes using IsItemClicked() and IsItemHovered(), but IsItemHovered() also relies on its support for ImGuiItemFlags_NoWindowHoverableCheck)
|
|
|
+ g.LastItemData = last_item_in_parent;
|
|
|
+ if (g.HoveredWindow == window)
|
|
|
+ g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HoveredWindow;
|
|
|
+ }
|
|
|
}
|
|
|
else
|
|
|
{
|