Path: blob/master/dep/imgui/include/imgui_internal.h
7502 views
// dear imgui, v1.92.6 WIP1// (internal structures/api)23// You may use this file to debug, understand or extend Dear ImGui features but we don't provide any guarantee of forward compatibility.45/*67Index of this file:89// [SECTION] Header mess10// [SECTION] Forward declarations11// [SECTION] Context pointer12// [SECTION] STB libraries includes13// [SECTION] Macros14// [SECTION] Generic helpers15// [SECTION] ImDrawList support16// [SECTION] Style support17// [SECTION] Data types support18// [SECTION] Widgets support: flags, enums, data structures19// [SECTION] Popup support20// [SECTION] Inputs support21// [SECTION] Clipper support22// [SECTION] Navigation support23// [SECTION] Typing-select support24// [SECTION] Columns support25// [SECTION] Box-select support26// [SECTION] Multi-select support27// [SECTION] Docking support28// [SECTION] Viewport support29// [SECTION] Settings support30// [SECTION] Localization support31// [SECTION] Error handling, State recovery support32// [SECTION] Metrics, Debug tools33// [SECTION] Generic context hooks34// [SECTION] ImGuiContext (main imgui context)35// [SECTION] ImGuiWindowTempData, ImGuiWindow36// [SECTION] Tab bar, Tab item support37// [SECTION] Table support38// [SECTION] ImGui internal API39// [SECTION] ImFontLoader40// [SECTION] ImFontAtlas internal API41// [SECTION] Test Engine specific hooks (imgui_test_engine)4243*/4445#pragma once46#ifndef IMGUI_DISABLE4748//-----------------------------------------------------------------------------49// [SECTION] Header mess50//-----------------------------------------------------------------------------5152#ifndef IMGUI_VERSION53#include "imgui.h"54#endif5556#include <stdio.h> // FILE*, sscanf57#include <stdlib.h> // NULL, malloc, free, qsort, atoi, atof58#include <math.h> // sqrtf, fabsf, fmodf, powf, floorf, ceilf, cosf, sinf59#include <limits.h> // INT_MIN, INT_MAX6061// Enable SSE intrinsics if available62#if (defined __SSE__ || defined __x86_64__ || defined _M_X64 || (defined(_M_IX86_FP) && (_M_IX86_FP >= 1))) && !defined(IMGUI_DISABLE_SSE)63#define IMGUI_ENABLE_SSE64#include <immintrin.h>65#if (defined __AVX__ || defined __SSE4_2__)66#define IMGUI_ENABLE_SSE4_267#include <nmmintrin.h>68#endif69#endif70// Emscripten has partial SSE 4.2 support where _mm_crc32_u32 is not available. See https://emscripten.org/docs/porting/simd.html#id11 and #821371#if defined(IMGUI_ENABLE_SSE4_2) && !defined(IMGUI_USE_LEGACY_CRC32_ADLER) && !defined(__EMSCRIPTEN__)72#define IMGUI_ENABLE_SSE4_2_CRC73#endif7475// Visual Studio warnings76#ifdef _MSC_VER77#pragma warning (push)78#pragma warning (disable: 4251) // class 'xxx' needs to have dll-interface to be used by clients of struct 'xxx' // when IMGUI_API is set to__declspec(dllexport)79#pragma warning (disable: 26495) // [Static Analyzer] Variable 'XXX' is uninitialized. Always initialize a member variable (type.6).80#pragma warning (disable: 26812) // [Static Analyzer] The enum type 'xxx' is unscoped. Prefer 'enum class' over 'enum' (Enum.3).81#if defined(_MSC_VER) && _MSC_VER >= 1922 // MSVC 2019 16.2 or later82#pragma warning (disable: 5054) // operator '|': deprecated between enumerations of different types83#endif84#endif8586// Clang/GCC warnings with -Weverything87#if defined(__clang__)88#pragma clang diagnostic push89#if __has_warning("-Wunknown-warning-option")90#pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx'91#endif92#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx'93#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants ok, for ImFloor()94#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast95#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning: zero as null pointer constant96#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function97#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision98#pragma clang diagnostic ignored "-Wmissing-noreturn" // warning: function 'xxx' could be declared with attribute 'noreturn'99#pragma clang diagnostic ignored "-Wdeprecated-enum-enum-conversion"// warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated100#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" // warning: 'xxx' is an unsafe pointer used for buffer access101#pragma clang diagnostic ignored "-Wnontrivial-memaccess" // warning: first argument in call to 'memset' is a pointer to non-trivially copyable type102#elif defined(__GNUC__)103#pragma GCC diagnostic push104#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind105#pragma GCC diagnostic ignored "-Wfloat-equal" // warning: comparing floating-point with '==' or '!=' is unsafe106#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead107#pragma GCC diagnostic ignored "-Wdeprecated-enum-enum-conversion" // warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated108#endif109110// In 1.89.4, we moved the implementation of "courtesy maths operators" from imgui_internal.h in imgui.h111// As they are frequently requested, we do not want to encourage to many people using imgui_internal.h112#if defined(IMGUI_DEFINE_MATH_OPERATORS) && !defined(IMGUI_DEFINE_MATH_OPERATORS_IMPLEMENTED)113#error Please '#define IMGUI_DEFINE_MATH_OPERATORS' _BEFORE_ including imgui.h!114#endif115116// Legacy defines117#ifdef IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS // Renamed in 1.74118#error Use IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS119#endif120#ifdef IMGUI_DISABLE_MATH_FUNCTIONS // Renamed in 1.74121#error Use IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS122#endif123124// Enable stb_truetype by default unless FreeType is enabled.125// You can compile with both by defining both IMGUI_ENABLE_FREETYPE and IMGUI_ENABLE_STB_TRUETYPE together.126#ifndef IMGUI_ENABLE_FREETYPE127#define IMGUI_ENABLE_STB_TRUETYPE128#endif129130//-----------------------------------------------------------------------------131// [SECTION] Forward declarations132//-----------------------------------------------------------------------------133134// Utilities135// (other types which are not forwarded declared are: ImBitArray<>, ImSpan<>, ImSpanAllocator<>, ImStableVector<>, ImPool<>, ImChunkStream<>)136struct ImBitVector; // Store 1-bit per value137struct ImRect; // An axis-aligned rectangle (2 points)138struct ImGuiTextIndex; // Maintain a line index for a text buffer.139140// ImDrawList/ImFontAtlas141struct ImDrawDataBuilder; // Helper to build a ImDrawData instance142struct ImDrawListSharedData; // Data shared between all ImDrawList instances143struct ImFontAtlasBuilder; // Internal storage for incrementally packing and building a ImFontAtlas144struct ImFontAtlasPostProcessData; // Data available to potential texture post-processing functions145struct ImFontAtlasRectEntry; // Packed rectangle lookup entry146147// ImGui148struct ImGuiBoxSelectState; // Box-selection state (currently used by multi-selection, could potentially be used by others)149struct ImGuiColorMod; // Stacked color modifier, backup of modified data so we can restore it150struct ImGuiContext; // Main Dear ImGui context151struct ImGuiContextHook; // Hook for extensions like ImGuiTestEngine152struct ImGuiDataTypeInfo; // Type information associated to a ImGuiDataType enum153struct ImGuiDeactivatedItemData; // Data for IsItemDeactivated()/IsItemDeactivatedAfterEdit() function.154struct ImGuiErrorRecoveryState; // Storage of stack sizes for error handling and recovery155struct ImGuiGroupData; // Stacked storage data for BeginGroup()/EndGroup()156struct ImGuiInputTextState; // Internal state of the currently focused/edited text input box157struct ImGuiInputTextDeactivateData;// Short term storage to backup text of a deactivating InputText() while another is stealing active id158struct ImGuiLastItemData; // Status storage for last submitted items159struct ImGuiLocEntry; // A localization entry.160struct ImGuiMenuColumns; // Simple column measurement, currently used for MenuItem() only161struct ImGuiMultiSelectState; // Multi-selection persistent state (for focused selection).162struct ImGuiMultiSelectTempData; // Multi-selection temporary state (while traversing).163struct ImGuiNavItemData; // Result of a keyboard/gamepad directional navigation move query result164struct ImGuiMetricsConfig; // Storage for ShowMetricsWindow() and DebugNodeXXX() functions165struct ImGuiNextWindowData; // Storage for SetNextWindow** functions166struct ImGuiNextItemData; // Storage for SetNextItem** functions167struct ImGuiOldColumnData; // Storage data for a single column for legacy Columns() api168struct ImGuiOldColumns; // Storage data for a columns set for legacy Columns() api169struct ImGuiPopupData; // Storage for current popup stack170struct ImGuiSettingsHandler; // Storage for one type registered in the .ini file171struct ImGuiStyleMod; // Stacked style modifier, backup of modified data so we can restore it172struct ImGuiStyleVarInfo; // Style variable information (e.g. to access style variables from an enum)173struct ImGuiTabBar; // Storage for a tab bar174struct ImGuiTabItem; // Storage for a tab item (within a tab bar)175struct ImGuiTable; // Storage for a table176struct ImGuiTableHeaderData; // Storage for TableAngledHeadersRow()177struct ImGuiTableColumn; // Storage for one column of a table178struct ImGuiTableInstanceData; // Storage for one instance of a same table179struct ImGuiTableTempData; // Temporary storage for one table (one per table in the stack), shared between tables.180struct ImGuiTableSettings; // Storage for a table .ini settings181struct ImGuiTableColumnsSettings; // Storage for a column .ini settings182struct ImGuiTreeNodeStackData; // Temporary storage for TreeNode().183struct ImGuiTypingSelectState; // Storage for GetTypingSelectRequest()184struct ImGuiTypingSelectRequest; // Storage for GetTypingSelectRequest() (aimed to be public)185struct ImGuiWindow; // Storage for one window186struct ImGuiWindowTempData; // Temporary storage for one window (that's the data which in theory we could ditch at the end of the frame, in practice we currently keep it for each window)187struct ImGuiWindowSettings; // Storage for a window .ini settings (we keep one of those even if the actual window wasn't instanced during this session)188189// Enumerations190// Use your programming IDE "Go to definition" facility on the names of the center columns to find the actual flags/enum lists.191enum ImGuiLocKey : int; // -> enum ImGuiLocKey // Enum: a localization entry for translation.192typedef int ImGuiLayoutType; // -> enum ImGuiLayoutType_ // Enum: Horizontal or vertical193194// Flags195typedef int ImDrawTextFlags; // -> enum ImDrawTextFlags_ // Flags: for ImTextCalcWordWrapPositionEx()196typedef int ImGuiActivateFlags; // -> enum ImGuiActivateFlags_ // Flags: for navigation/focus function (will be for ActivateItem() later)197typedef int ImGuiDebugLogFlags; // -> enum ImGuiDebugLogFlags_ // Flags: for ShowDebugLogWindow(), g.DebugLogFlags198typedef int ImGuiFocusRequestFlags; // -> enum ImGuiFocusRequestFlags_ // Flags: for FocusWindow()199typedef int ImGuiItemStatusFlags; // -> enum ImGuiItemStatusFlags_ // Flags: for g.LastItemData.StatusFlags200typedef int ImGuiOldColumnFlags; // -> enum ImGuiOldColumnFlags_ // Flags: for BeginColumns()201typedef int ImGuiLogFlags; // -> enum ImGuiLogFlags_ // Flags: for LogBegin() text capturing function202typedef int ImGuiNavRenderCursorFlags; // -> enum ImGuiNavRenderCursorFlags_//Flags: for RenderNavCursor()203typedef int ImGuiNavMoveFlags; // -> enum ImGuiNavMoveFlags_ // Flags: for navigation requests204typedef int ImGuiNextItemDataFlags; // -> enum ImGuiNextItemDataFlags_ // Flags: for SetNextItemXXX() functions205typedef int ImGuiNextWindowDataFlags; // -> enum ImGuiNextWindowDataFlags_// Flags: for SetNextWindowXXX() functions206typedef int ImGuiScrollFlags; // -> enum ImGuiScrollFlags_ // Flags: for ScrollToItem() and navigation requests207typedef int ImGuiSeparatorFlags; // -> enum ImGuiSeparatorFlags_ // Flags: for SeparatorEx()208typedef int ImGuiTextFlags; // -> enum ImGuiTextFlags_ // Flags: for TextEx()209typedef int ImGuiTooltipFlags; // -> enum ImGuiTooltipFlags_ // Flags: for BeginTooltipEx()210typedef int ImGuiTypingSelectFlags; // -> enum ImGuiTypingSelectFlags_ // Flags: for GetTypingSelectRequest()211typedef int ImGuiWindowBgClickFlags; // -> enum ImGuiWindowBgClickFlags_ // Flags: for overriding behavior of clicking on window background/void.212typedef int ImGuiWindowRefreshFlags; // -> enum ImGuiWindowRefreshFlags_ // Flags: for SetNextWindowRefreshPolicy()213214// Table column indexing215typedef ImS16 ImGuiTableColumnIdx;216typedef ImU16 ImGuiTableDrawChannelIdx;217218//-----------------------------------------------------------------------------219// [SECTION] Context pointer220// See implementation of this variable in imgui.cpp for comments and details.221//-----------------------------------------------------------------------------222223#ifndef GImGui224extern IMGUI_API ImGuiContext* GImGui; // Current implicit context pointer225#endif226227//-----------------------------------------------------------------------------228// [SECTION] Macros229//-----------------------------------------------------------------------------230231// Debug Printing Into TTY232// (since IMGUI_VERSION_NUM >= 18729: IMGUI_DEBUG_LOG was reworked into IMGUI_DEBUG_PRINTF (and removed framecount from it). If you were using a #define IMGUI_DEBUG_LOG please rename)233#ifndef IMGUI_DEBUG_PRINTF234#ifndef IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS235#define IMGUI_DEBUG_PRINTF(_FMT,...) printf(_FMT, __VA_ARGS__)236#else237#define IMGUI_DEBUG_PRINTF(_FMT,...) ((void)0)238#endif239#endif240241// Debug Logging for ShowDebugLogWindow(). This is designed for relatively rare events so please don't spam.242#define IMGUI_DEBUG_LOG_ERROR(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventError) IMGUI_DEBUG_LOG(__VA_ARGS__); else g.DebugLogSkippedErrors++; } while (0)243#define IMGUI_DEBUG_LOG_ACTIVEID(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventActiveId) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)244#define IMGUI_DEBUG_LOG_FOCUS(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventFocus) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)245#define IMGUI_DEBUG_LOG_POPUP(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventPopup) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)246#define IMGUI_DEBUG_LOG_NAV(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventNav) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)247#define IMGUI_DEBUG_LOG_SELECTION(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventSelection) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)248#define IMGUI_DEBUG_LOG_CLIPPER(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventClipper) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)249#define IMGUI_DEBUG_LOG_IO(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventIO) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)250#define IMGUI_DEBUG_LOG_FONT(...) do { ImGuiContext* g2 = GImGui; if (g2 && g2->DebugLogFlags & ImGuiDebugLogFlags_EventFont) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) // Called from ImFontAtlas function which may operate without a context.251#define IMGUI_DEBUG_LOG_INPUTROUTING(...) do{if (g.DebugLogFlags & ImGuiDebugLogFlags_EventInputRouting)IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)252253// Static Asserts254#define IM_STATIC_ASSERT(_COND) static_assert(_COND, "")255256// "Paranoid" Debug Asserts are meant to only be enabled during specific debugging/work, otherwise would slow down the code too much.257// We currently don't have many of those so the effect is currently negligible, but onward intent to add more aggressive ones in the code.258//#define IMGUI_DEBUG_PARANOID259#ifdef IMGUI_DEBUG_PARANOID260#define IM_ASSERT_PARANOID(_EXPR) IM_ASSERT(_EXPR)261#else262#define IM_ASSERT_PARANOID(_EXPR)263#endif264265// Misc Macros266#define IM_PI 3.14159265358979323846f267#ifdef _WIN32268#define IM_NEWLINE "\r\n" // Play it nice with Windows users (Update: since 2018-05, Notepad finally appears to support Unix-style carriage returns!)269#else270#define IM_NEWLINE "\n"271#endif272#ifndef IM_TABSIZE // Until we move this to runtime and/or add proper tab support, at least allow users to compile-time override273#define IM_TABSIZE (4)274#endif275#define IM_MEMALIGN(_OFF,_ALIGN) (((_OFF) + ((_ALIGN) - 1)) & ~((_ALIGN) - 1)) // Memory align e.g. IM_ALIGN(0,4)=0, IM_ALIGN(1,4)=4, IM_ALIGN(4,4)=4, IM_ALIGN(5,4)=8276#define IM_F32_TO_INT8_UNBOUND(_VAL) ((int)((_VAL) * 255.0f + ((_VAL)>=0 ? 0.5f : -0.5f))) // Unsaturated, for display purpose277#define IM_F32_TO_INT8_SAT(_VAL) ((int)(ImSaturate(_VAL) * 255.0f + 0.5f)) // Saturated, always output 0..255278#define IM_TRUNC(_VAL) ((float)(int)(_VAL)) // Positive values only! ImTrunc() is not inlined in MSVC debug builds279#define IM_ROUND(_VAL) ((float)(int)((_VAL) + 0.5f)) // Positive values only!280#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS281#define IM_FLOOR IM_TRUNC // [OBSOLETE] Renamed in 1.90.0 (Sept 2023)282#endif283284// Hint for branch prediction285#if (defined(__cplusplus) && (__cplusplus >= 202002L)) || (defined(_MSVC_LANG) && (_MSVC_LANG >= 202002L))286#define IM_LIKELY [[likely]]287#define IM_UNLIKELY [[unlikely]]288#else289#define IM_LIKELY290#define IM_UNLIKELY291#endif292293// Enforce cdecl calling convention for functions called by the standard library, in case compilation settings changed the default to e.g. __vectorcall294#ifdef _MSC_VER295#define IMGUI_CDECL __cdecl296#else297#define IMGUI_CDECL298#endif299300// Warnings301#if defined(_MSC_VER) && !defined(__clang__)302#define IM_MSVC_WARNING_SUPPRESS(XXXX) __pragma(warning(suppress: XXXX))303#else304#define IM_MSVC_WARNING_SUPPRESS(XXXX)305#endif306307// Debug Tools308// Use 'Metrics/Debugger->Tools->Item Picker' to break into the call-stack of a specific item.309// This will call IM_DEBUG_BREAK() which you may redefine yourself. See https://github.com/scottt/debugbreak for more reference.310#ifndef IM_DEBUG_BREAK311#if defined (_MSC_VER)312#define IM_DEBUG_BREAK() __debugbreak()313#elif defined(__clang__)314#define IM_DEBUG_BREAK() __builtin_debugtrap()315#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))316#define IM_DEBUG_BREAK() __asm__ volatile("int3;nop")317#elif defined(__GNUC__) && defined(__thumb__)318#define IM_DEBUG_BREAK() __asm__ volatile(".inst 0xde01")319#elif defined(__GNUC__) && defined(__arm__) && !defined(__thumb__)320#define IM_DEBUG_BREAK() __asm__ volatile(".inst 0xe7f001f0")321#else322#define IM_DEBUG_BREAK() IM_ASSERT(0) // It is expected that you define IM_DEBUG_BREAK() into something that will break nicely in a debugger!323#endif324#endif // #ifndef IM_DEBUG_BREAK325326// Format specifiers, printing 64-bit hasn't been decently standardized...327// In a real application you should be using PRId64 and PRIu64 from <inttypes.h> (non-windows) and on Windows define them yourself.328#if defined(_MSC_VER) && !defined(__clang__)329#define IM_PRId64 "I64d"330#define IM_PRIu64 "I64u"331#define IM_PRIX64 "I64X"332#else333#define IM_PRId64 "lld"334#define IM_PRIu64 "llu"335#define IM_PRIX64 "llX"336#endif337338//-----------------------------------------------------------------------------339// [SECTION] Generic helpers340// Note that the ImXXX helpers functions are lower-level than ImGui functions.341// ImGui functions or the ImGui context are never called/used from other ImXXX functions.342//-----------------------------------------------------------------------------343// - Helpers: Hashing344// - Helpers: Sorting345// - Helpers: Bit manipulation346// - Helpers: String347// - Helpers: Formatting348// - Helpers: UTF-8 <> wchar conversions349// - Helpers: ImVec2/ImVec4 operators350// - Helpers: Maths351// - Helpers: Geometry352// - Helper: ImVec1353// - Helper: ImVec2ih354// - Helper: ImRect355// - Helper: ImBitArray356// - Helper: ImBitVector357// - Helper: ImSpan<>, ImSpanAllocator<>358// - Helper: ImStableVector<>359// - Helper: ImPool<>360// - Helper: ImChunkStream<>361// - Helper: ImGuiTextIndex362// - Helper: ImGuiStorage363//-----------------------------------------------------------------------------364365// Helpers: Hashing366IMGUI_API ImGuiID ImHashData(const void* data, size_t data_size, ImGuiID seed = 0);367IMGUI_API ImGuiID ImHashStr(const char* data, size_t data_size = 0, ImGuiID seed = 0);368IMGUI_API const char* ImHashSkipUncontributingPrefix(const char* label);369370// Helpers: Sorting371#ifndef ImQsort372inline void ImQsort(void* base, size_t count, size_t size_of_element, int(IMGUI_CDECL *compare_func)(void const*, void const*)) { if (count > 1) qsort(base, count, size_of_element, compare_func); }373#endif374375// Helpers: Color Blending376IMGUI_API ImU32 ImAlphaBlendColors(ImU32 col_a, ImU32 col_b);377378// Helpers: Bit manipulation379inline bool ImIsPowerOfTwo(int v) { return v != 0 && (v & (v - 1)) == 0; }380inline bool ImIsPowerOfTwo(ImU64 v) { return v != 0 && (v & (v - 1)) == 0; }381inline int ImUpperPowerOfTwo(int v) { v--; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v++; return v; }382inline unsigned int ImCountSetBits(unsigned int v) { unsigned int count = 0; while (v > 0) { v = v & (v - 1); count++; } return count; }383384// Helpers: String385#define ImStrlen strlen386#define ImMemchr memchr387IMGUI_API int ImStricmp(const char* str1, const char* str2); // Case insensitive compare.388IMGUI_API int ImStrnicmp(const char* str1, const char* str2, size_t count); // Case insensitive compare to a certain count.389IMGUI_API void ImStrncpy(char* dst, const char* src, size_t count); // Copy to a certain count and always zero terminate (strncpy doesn't).390IMGUI_API char* ImStrdup(const char* str); // Duplicate a string.391IMGUI_API void* ImMemdup(const void* src, size_t size); // Duplicate a chunk of memory.392IMGUI_API char* ImStrdupcpy(char* dst, size_t* p_dst_size, const char* str); // Copy in provided buffer, recreate buffer if needed.393IMGUI_API const char* ImStrchrRange(const char* str_begin, const char* str_end, char c); // Find first occurrence of 'c' in string range.394IMGUI_API const char* ImStreolRange(const char* str, const char* str_end); // End end-of-line395IMGUI_API const char* ImStristr(const char* haystack, const char* haystack_end, const char* needle, const char* needle_end); // Find a substring in a string range.396IMGUI_API void ImStrTrimBlanks(char* str); // Remove leading and trailing blanks from a buffer.397IMGUI_API const char* ImStrSkipBlank(const char* str); // Find first non-blank character.398IMGUI_API int ImStrlenW(const ImWchar* str); // Computer string length (ImWchar string)399IMGUI_API const char* ImStrbol(const char* buf_mid_line, const char* buf_begin); // Find beginning-of-line400IM_MSVC_RUNTIME_CHECKS_OFF401inline char ImToUpper(char c) { return (c >= 'a' && c <= 'z') ? c &= ~32 : c; }402inline bool ImCharIsBlankA(char c) { return c == ' ' || c == '\t'; }403inline bool ImCharIsBlankW(unsigned int c) { return c == ' ' || c == '\t' || c == 0x3000; }404inline bool ImCharIsXdigitA(char c) { return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f'); }405IM_MSVC_RUNTIME_CHECKS_RESTORE406407// Helpers: Formatting408IMGUI_API int ImFormatString(char* buf, size_t buf_size, const char* fmt, ...) IM_FMTARGS(3);409IMGUI_API int ImFormatStringV(char* buf, size_t buf_size, const char* fmt, va_list args) IM_FMTLIST(3);410IMGUI_API void ImFormatStringToTempBuffer(const char** out_buf, const char** out_buf_end, const char* fmt, ...) IM_FMTARGS(3);411IMGUI_API void ImFormatStringToTempBufferV(const char** out_buf, const char** out_buf_end, const char* fmt, va_list args) IM_FMTLIST(3);412IMGUI_API const char* ImParseFormatFindStart(const char* format);413IMGUI_API const char* ImParseFormatFindEnd(const char* format);414IMGUI_API const char* ImParseFormatTrimDecorations(const char* format, char* buf, size_t buf_size);415IMGUI_API void ImParseFormatSanitizeForPrinting(const char* fmt_in, char* fmt_out, size_t fmt_out_size);416IMGUI_API const char* ImParseFormatSanitizeForScanning(const char* fmt_in, char* fmt_out, size_t fmt_out_size);417IMGUI_API int ImParseFormatPrecision(const char* format, int default_value);418419// Helpers: UTF-8 <> wchar conversions420IMGUI_API int ImTextCharToUtf8(char out_buf[5], unsigned int c); // return output UTF-8 bytes count421IMGUI_API int ImTextStrToUtf8(char* out_buf, int out_buf_size, const ImWchar* in_text, const ImWchar* in_text_end); // return output UTF-8 bytes count422IMGUI_API int ImTextCharFromUtf8(unsigned int* out_char, const char* in_text, const char* in_text_end); // read one character. return input UTF-8 bytes count423IMGUI_API int ImTextStrFromUtf8(ImWchar* out_buf, int out_buf_size, const char* in_text, const char* in_text_end, const char** in_remaining = NULL); // return input UTF-8 bytes count424IMGUI_API int ImTextCountCharsFromUtf8(const char* in_text, const char* in_text_end); // return number of UTF-8 code-points (NOT bytes count)425IMGUI_API int ImTextCountUtf8BytesFromChar(const char* in_text, const char* in_text_end); // return number of bytes to express one char in UTF-8426IMGUI_API int ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_end); // return number of bytes to express string in UTF-8427IMGUI_API const char* ImTextFindPreviousUtf8Codepoint(const char* in_text_start, const char* in_p); // return previous UTF-8 code-point.428IMGUI_API const char* ImTextFindValidUtf8CodepointEnd(const char* in_text_start, const char* in_text_end, const char* in_p); // return previous UTF-8 code-point if 'in_p' is not the end of a valid one.429IMGUI_API int ImTextCountLines(const char* in_text, const char* in_text_end); // return number of lines taken by text. trailing carriage return doesn't count as an extra line.430431// Helpers: High-level text functions (DO NOT USE!!! THIS IS A MINIMAL SUBSET OF LARGER UPCOMING CHANGES)432enum ImDrawTextFlags_433{434ImDrawTextFlags_None = 0,435ImDrawTextFlags_CpuFineClip = 1 << 0, // Must be == 1/true for legacy with 'bool cpu_fine_clip' arg to RenderText()436ImDrawTextFlags_WrapKeepBlanks = 1 << 1,437ImDrawTextFlags_StopOnNewLine = 1 << 2,438};439IMGUI_API ImVec2 ImFontCalcTextSizeEx(ImFont* font, float size, float weight, float max_width, float wrap_width, const char* text_begin, const char* text_end_display, const char* text_end, const char** out_remaining, ImVec2* out_offset, ImDrawTextFlags flags);440IMGUI_API const char* ImFontCalcWordWrapPositionEx(ImFont* font, float size, float weight, const char* text, const char* text_end, float wrap_width, ImDrawTextFlags flags = 0);441IMGUI_API const char* ImTextCalcWordWrapNextLineStart(const char* text, const char* text_end, ImDrawTextFlags flags = 0); // trim trailing space and find beginning of next line442443// Character classification for word-wrapping logic444enum ImWcharClass445{446ImWcharClass_Blank, ImWcharClass_Punct, ImWcharClass_Other447};448IMGUI_API void ImTextInitClassifiers();449IMGUI_API void ImTextClassifierClear(ImU32* bits, unsigned int codepoint_min, unsigned int codepoint_end, ImWcharClass char_class);450IMGUI_API void ImTextClassifierSetCharClass(ImU32* bits, unsigned int codepoint_min, unsigned int codepoint_end, ImWcharClass char_class, unsigned int c);451IMGUI_API void ImTextClassifierSetCharClassFromStr(ImU32* bits, unsigned int codepoint_min, unsigned int codepoint_end, ImWcharClass char_class, const char* s);452453// Helpers: File System454#ifdef IMGUI_DISABLE_FILE_FUNCTIONS455#define IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS456typedef void* ImFileHandle;457inline ImFileHandle ImFileOpen(const char*, const char*) { return NULL; }458inline bool ImFileClose(ImFileHandle) { return false; }459inline ImU64 ImFileGetSize(ImFileHandle) { return (ImU64)-1; }460inline ImU64 ImFileRead(void*, ImU64, ImU64, ImFileHandle) { return 0; }461inline ImU64 ImFileWrite(const void*, ImU64, ImU64, ImFileHandle) { return 0; }462#endif463#ifndef IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS464typedef FILE* ImFileHandle;465IMGUI_API ImFileHandle ImFileOpen(const char* filename, const char* mode);466IMGUI_API bool ImFileClose(ImFileHandle file);467IMGUI_API ImU64 ImFileGetSize(ImFileHandle file);468IMGUI_API ImU64 ImFileRead(void* data, ImU64 size, ImU64 count, ImFileHandle file);469IMGUI_API ImU64 ImFileWrite(const void* data, ImU64 size, ImU64 count, ImFileHandle file);470#else471#define IMGUI_DISABLE_TTY_FUNCTIONS // Can't use stdout, fflush if we are not using default file functions472#endif473IMGUI_API void* ImFileLoadToMemory(const char* filename, const char* mode, size_t* out_file_size = NULL, int padding_bytes = 0);474475// Helpers: Maths476IM_MSVC_RUNTIME_CHECKS_OFF477// - Wrapper for standard libs functions. (Note that imgui_demo.cpp does _not_ use them to keep the code easy to copy)478#ifndef IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS479#define ImFabs(X) fabsf(X)480#define ImSqrt(X) sqrtf(X)481#define ImFmod(X, Y) fmodf((X), (Y))482#define ImCos(X) cosf(X)483#define ImSin(X) sinf(X)484#define ImAcos(X) acosf(X)485#define ImAtan2(Y, X) atan2f((Y), (X))486#define ImAtof(STR) atof(STR)487#define ImCeil(X) ceilf(X)488inline float ImPow(float x, float y) { return powf(x, y); } // DragBehaviorT/SliderBehaviorT uses ImPow with either float/double and need the precision489inline double ImPow(double x, double y) { return pow(x, y); }490inline float ImLog(float x) { return logf(x); } // DragBehaviorT/SliderBehaviorT uses ImLog with either float/double and need the precision491inline double ImLog(double x) { return log(x); }492inline int ImAbs(int x) { return x < 0 ? -x : x; }493inline float ImAbs(float x) { return fabsf(x); }494inline double ImAbs(double x) { return fabs(x); }495inline float ImSign(float x) { return (x < 0.0f) ? -1.0f : (x > 0.0f) ? 1.0f : 0.0f; } // Sign operator - returns -1, 0 or 1 based on sign of argument496inline double ImSign(double x) { return (x < 0.0) ? -1.0 : (x > 0.0) ? 1.0 : 0.0; }497#ifdef IMGUI_ENABLE_SSE498inline float ImRsqrt(float x) { return _mm_cvtss_f32(_mm_rsqrt_ss(_mm_set_ss(x))); }499#else500inline float ImRsqrt(float x) { return 1.0f / sqrtf(x); }501#endif502inline double ImRsqrt(double x) { return 1.0 / sqrt(x); }503#endif504// - ImMin/ImMax/ImClamp/ImLerp/ImSwap are used by widgets which support variety of types: signed/unsigned int/long long float/double505// (Exceptionally using templates here but we could also redefine them for those types)506template<typename T> T ImMin(T lhs, T rhs) { return lhs < rhs ? lhs : rhs; }507template<typename T> T ImMax(T lhs, T rhs) { return lhs >= rhs ? lhs : rhs; }508template<typename T> T ImClamp(T v, T mn, T mx) { return (v < mn) ? mn : (v > mx) ? mx : v; }509template<typename T> T ImLerp(T a, T b, float t) { return (T)(a + (b - a) * t); }510template<typename T> void ImSwap(T& a, T& b) { T tmp = a; a = b; b = tmp; }511template<typename T> T ImAddClampOverflow(T a, T b, T mn, T mx) { if (b < 0 && (a < mn - b)) return mn; if (b > 0 && (a > mx - b)) return mx; return a + b; }512template<typename T> T ImSubClampOverflow(T a, T b, T mn, T mx) { if (b > 0 && (a < mn + b)) return mn; if (b < 0 && (a > mx + b)) return mx; return a - b; }513// - Misc maths helpers514inline ImVec2 ImMin(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x < rhs.x ? lhs.x : rhs.x, lhs.y < rhs.y ? lhs.y : rhs.y); }515inline ImVec2 ImMax(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x >= rhs.x ? lhs.x : rhs.x, lhs.y >= rhs.y ? lhs.y : rhs.y); }516inline ImVec2 ImClamp(const ImVec2& v, const ImVec2&mn, const ImVec2&mx){ return ImVec2((v.x < mn.x) ? mn.x : (v.x > mx.x) ? mx.x : v.x, (v.y < mn.y) ? mn.y : (v.y > mx.y) ? mx.y : v.y); }517inline ImVec2 ImLerp(const ImVec2& a, const ImVec2& b, float t) { return ImVec2(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t); }518inline ImVec2 ImLerp(const ImVec2& a, const ImVec2& b, const ImVec2& t) { return ImVec2(a.x + (b.x - a.x) * t.x, a.y + (b.y - a.y) * t.y); }519inline ImVec4 ImLerp(const ImVec4& a, const ImVec4& b, float t) { return ImVec4(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t, a.z + (b.z - a.z) * t, a.w + (b.w - a.w) * t); }520inline float ImSaturate(float f) { return (f < 0.0f) ? 0.0f : (f > 1.0f) ? 1.0f : f; }521inline float ImLengthSqr(const ImVec2& lhs) { return (lhs.x * lhs.x) + (lhs.y * lhs.y); }522inline float ImLengthSqr(const ImVec4& lhs) { return (lhs.x * lhs.x) + (lhs.y * lhs.y) + (lhs.z * lhs.z) + (lhs.w * lhs.w); }523inline float ImInvLength(const ImVec2& lhs, float fail_value) { float d = (lhs.x * lhs.x) + (lhs.y * lhs.y); if (d > 0.0f) return ImRsqrt(d); return fail_value; }524inline float ImTrunc(float f) { return (float)(int)(f); }525inline ImVec2 ImTrunc(const ImVec2& v) { return ImVec2((float)(int)(v.x), (float)(int)(v.y)); }526inline float ImFloor(float f) { return (float)((f >= 0 || (float)(int)f == f) ? (int)f : (int)f - 1); } // Decent replacement for floorf()527inline ImVec2 ImFloor(const ImVec2& v) { return ImVec2(ImFloor(v.x), ImFloor(v.y)); }528inline float ImTrunc64(float f) { return (float)(ImS64)(f); }529inline float ImRound64(float f) { return (float)(ImS64)(f + 0.5f); } // FIXME: Positive values only.530inline int ImModPositive(int a, int b) { return (a + b) % b; }531inline float ImDot(const ImVec2& a, const ImVec2& b) { return a.x * b.x + a.y * b.y; }532inline ImVec2 ImRotate(const ImVec2& v, float cos_a, float sin_a) { return ImVec2(v.x * cos_a - v.y * sin_a, v.x * sin_a + v.y * cos_a); }533inline float ImLinearSweep(float current, float target, float speed) { if (current < target) return ImMin(current + speed, target); if (current > target) return ImMax(current - speed, target); return current; }534inline float ImLinearRemapClamp(float s0, float s1, float d0, float d1, float x) { return ImSaturate((x - s0) / (s1 - s0)) * (d1 - d0) + d0; }535inline ImVec2 ImMul(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x * rhs.x, lhs.y * rhs.y); }536inline bool ImIsFloatAboveGuaranteedIntegerPrecision(float f) { return f <= -16777216 || f >= 16777216; }537inline float ImExponentialMovingAverage(float avg, float sample, int n){ avg -= avg / n; avg += sample / n; return avg; }538IM_MSVC_RUNTIME_CHECKS_RESTORE539540// Helpers: Geometry541IMGUI_API ImVec2 ImBezierCubicCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, float t);542IMGUI_API ImVec2 ImBezierCubicClosestPoint(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p, int num_segments); // For curves with explicit number of segments543IMGUI_API ImVec2 ImBezierCubicClosestPointCasteljau(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p, float tess_tol);// For auto-tessellated curves you can use tess_tol = style.CurveTessellationTol544IMGUI_API ImVec2 ImBezierQuadraticCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, float t);545IMGUI_API ImVec2 ImLineClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& p);546IMGUI_API bool ImTriangleContainsPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);547IMGUI_API ImVec2 ImTriangleClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);548IMGUI_API void ImTriangleBarycentricCoords(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p, float& out_u, float& out_v, float& out_w);549inline float ImTriangleArea(const ImVec2& a, const ImVec2& b, const ImVec2& c) { return ImFabs((a.x * (b.y - c.y)) + (b.x * (c.y - a.y)) + (c.x * (a.y - b.y))) * 0.5f; }550inline bool ImTriangleIsClockwise(const ImVec2& a, const ImVec2& b, const ImVec2& c) { return ((b.x - a.x) * (c.y - b.y)) - ((c.x - b.x) * (b.y - a.y)) > 0.0f; }551552// Helper: ImVec1 (1D vector)553// (this odd construct is used to facilitate the transition between 1D and 2D, and the maintenance of some branches/patches)554IM_MSVC_RUNTIME_CHECKS_OFF555struct ImVec1556{557float x;558constexpr ImVec1() : x(0.0f) { }559constexpr ImVec1(float _x) : x(_x) { }560};561562// Helper: ImVec2i (2D vector, integer)563struct ImVec2i564{565int x, y;566constexpr ImVec2i() : x(0), y(0) {}567constexpr ImVec2i(int _x, int _y) : x(_x), y(_y) {}568};569570// Helper: ImVec2ih (2D vector, half-size integer, for long-term packed storage)571struct ImVec2ih572{573short x, y;574constexpr ImVec2ih() : x(0), y(0) {}575constexpr ImVec2ih(short _x, short _y) : x(_x), y(_y) {}576constexpr explicit ImVec2ih(const ImVec2& rhs) : x((short)rhs.x), y((short)rhs.y) {}577};578579// Helper: ImRect (2D axis aligned bounding-box)580// NB: we can't rely on ImVec2 math operators being available here!581struct IMGUI_API ImRect582{583ImVec2 Min; // Upper-left584ImVec2 Max; // Lower-right585586constexpr ImRect() : Min(0.0f, 0.0f), Max(0.0f, 0.0f) {}587constexpr ImRect(const ImVec2& min, const ImVec2& max) : Min(min), Max(max) {}588constexpr ImRect(const ImVec4& v) : Min(v.x, v.y), Max(v.z, v.w) {}589constexpr ImRect(float x1, float y1, float x2, float y2) : Min(x1, y1), Max(x2, y2) {}590591ImVec2 GetCenter() const { return ImVec2((Min.x + Max.x) * 0.5f, (Min.y + Max.y) * 0.5f); }592ImVec2 GetSize() const { return ImVec2(Max.x - Min.x, Max.y - Min.y); }593float GetWidth() const { return Max.x - Min.x; }594float GetHeight() const { return Max.y - Min.y; }595float GetArea() const { return (Max.x - Min.x) * (Max.y - Min.y); }596ImVec2 GetTL() const { return Min; } // Top-left597ImVec2 GetTR() const { return ImVec2(Max.x, Min.y); } // Top-right598ImVec2 GetBL() const { return ImVec2(Min.x, Max.y); } // Bottom-left599ImVec2 GetBR() const { return Max; } // Bottom-right600bool Contains(const ImVec2& p) const { return p.x >= Min.x && p.y >= Min.y && p.x < Max.x && p.y < Max.y; }601bool Contains(const ImRect& r) const { return r.Min.x >= Min.x && r.Min.y >= Min.y && r.Max.x <= Max.x && r.Max.y <= Max.y; }602bool ContainsWithPad(const ImVec2& p, const ImVec2& pad) const { return p.x >= Min.x - pad.x && p.y >= Min.y - pad.y && p.x < Max.x + pad.x && p.y < Max.y + pad.y; }603bool Overlaps(const ImRect& r) const { return r.Min.y < Max.y && r.Max.y > Min.y && r.Min.x < Max.x && r.Max.x > Min.x; }604void Add(const ImVec2& p) { if (Min.x > p.x) Min.x = p.x; if (Min.y > p.y) Min.y = p.y; if (Max.x < p.x) Max.x = p.x; if (Max.y < p.y) Max.y = p.y; }605void Add(const ImRect& r) { if (Min.x > r.Min.x) Min.x = r.Min.x; if (Min.y > r.Min.y) Min.y = r.Min.y; if (Max.x < r.Max.x) Max.x = r.Max.x; if (Max.y < r.Max.y) Max.y = r.Max.y; }606void Expand(const float amount) { Min.x -= amount; Min.y -= amount; Max.x += amount; Max.y += amount; }607void Expand(const ImVec2& amount) { Min.x -= amount.x; Min.y -= amount.y; Max.x += amount.x; Max.y += amount.y; }608void Translate(const ImVec2& d) { Min.x += d.x; Min.y += d.y; Max.x += d.x; Max.y += d.y; }609void TranslateX(float dx) { Min.x += dx; Max.x += dx; }610void TranslateY(float dy) { Min.y += dy; Max.y += dy; }611void ClipWith(const ImRect& r) { Min = ImMax(Min, r.Min); Max = ImMin(Max, r.Max); } // Simple version, may lead to an inverted rectangle, which is fine for Contains/Overlaps test but not for display.612void ClipWithFull(const ImRect& r) { Min = ImClamp(Min, r.Min, r.Max); Max = ImClamp(Max, r.Min, r.Max); } // Full version, ensure both points are fully clipped.613bool IsInverted() const { return Min.x > Max.x || Min.y > Max.y; }614ImVec4 ToVec4() const { return ImVec4(Min.x, Min.y, Max.x, Max.y); }615const ImVec4& AsVec4() const { return *(const ImVec4*)&Min.x; }616};617618// Helper: ImBitArray619#define IM_BITARRAY_TESTBIT(_ARRAY, _N) ((_ARRAY[(_N) >> 5] & ((ImU32)1 << ((_N) & 31))) != 0) // Macro version of ImBitArrayTestBit(): ensure args have side-effect or are costly!620#define IM_BITARRAY_CLEARBIT(_ARRAY, _N) ((_ARRAY[(_N) >> 5] &= ~((ImU32)1 << ((_N) & 31)))) // Macro version of ImBitArrayClearBit(): ensure args have side-effect or are costly!621inline size_t ImBitArrayGetStorageSizeInBytes(int bitcount) { return (size_t)((bitcount + 31) >> 5) << 2; }622inline void ImBitArrayClearAllBits(ImU32* arr, int bitcount){ memset(arr, 0, ImBitArrayGetStorageSizeInBytes(bitcount)); }623inline bool ImBitArrayTestBit(const ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); return (arr[n >> 5] & mask) != 0; }624inline void ImBitArrayClearBit(ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); arr[n >> 5] &= ~mask; }625inline void ImBitArraySetBit(ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); arr[n >> 5] |= mask; }626inline void ImBitArraySetBitRange(ImU32* arr, int n, int n2) // Works on range [n..n2)627{628n2--;629while (n <= n2)630{631int a_mod = (n & 31);632int b_mod = (n2 > (n | 31) ? 31 : (n2 & 31)) + 1;633ImU32 mask = (ImU32)(((ImU64)1 << b_mod) - 1) & ~(ImU32)(((ImU64)1 << a_mod) - 1);634arr[n >> 5] |= mask;635n = (n + 32) & ~31;636}637}638639typedef ImU32* ImBitArrayPtr; // Name for use in structs640641// Helper: ImBitArray class (wrapper over ImBitArray functions)642// Store 1-bit per value.643template<int BITCOUNT, int OFFSET = 0>644struct ImBitArray645{646ImU32 Data[(BITCOUNT + 31) >> 5];647ImBitArray() { ClearAllBits(); }648void ClearAllBits() { memset(Data, 0, sizeof(Data)); }649void SetAllBits() { memset(Data, 255, sizeof(Data)); }650bool TestBit(int n) const { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); return IM_BITARRAY_TESTBIT(Data, n); }651void SetBit(int n) { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); ImBitArraySetBit(Data, n); }652void ClearBit(int n) { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); ImBitArrayClearBit(Data, n); }653void SetBitRange(int n, int n2) { n += OFFSET; n2 += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT && n2 > n && n2 <= BITCOUNT); ImBitArraySetBitRange(Data, n, n2); } // Works on range [n..n2)654bool operator[](int n) const { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); return IM_BITARRAY_TESTBIT(Data, n); }655};656657// Helper: ImBitVector658// Store 1-bit per value.659struct IMGUI_API ImBitVector660{661ImVector<ImU32> Storage;662void Create(int sz) { Storage.resize((sz + 31) >> 5); memset(Storage.Data, 0, (size_t)Storage.Size * sizeof(Storage.Data[0])); }663void Clear() { Storage.clear(); }664bool TestBit(int n) const { IM_ASSERT(n < (Storage.Size << 5)); return IM_BITARRAY_TESTBIT(Storage.Data, n); }665void SetBit(int n) { IM_ASSERT(n < (Storage.Size << 5)); ImBitArraySetBit(Storage.Data, n); }666void ClearBit(int n) { IM_ASSERT(n < (Storage.Size << 5)); ImBitArrayClearBit(Storage.Data, n); }667};668IM_MSVC_RUNTIME_CHECKS_RESTORE669670// Helper: ImSpan<>671// Pointing to a span of data we don't own.672template<typename T>673struct ImSpan674{675T* Data;676T* DataEnd;677678// Constructors, destructor679inline ImSpan() { Data = DataEnd = NULL; }680inline ImSpan(T* data, int size) { Data = data; DataEnd = data + size; }681inline ImSpan(T* data, T* data_end) { Data = data; DataEnd = data_end; }682683inline void set(T* data, int size) { Data = data; DataEnd = data + size; }684inline void set(T* data, T* data_end) { Data = data; DataEnd = data_end; }685inline int size() const { return (int)(ptrdiff_t)(DataEnd - Data); }686inline int size_in_bytes() const { return (int)(ptrdiff_t)(DataEnd - Data) * (int)sizeof(T); }687inline T& operator[](int i) { T* p = Data + i; IM_ASSERT(p >= Data && p < DataEnd); return *p; }688inline const T& operator[](int i) const { const T* p = Data + i; IM_ASSERT(p >= Data && p < DataEnd); return *p; }689690inline T* begin() { return Data; }691inline const T* begin() const { return Data; }692inline T* end() { return DataEnd; }693inline const T* end() const { return DataEnd; }694695// Utilities696inline int index_from_ptr(const T* it) const { IM_ASSERT(it >= Data && it < DataEnd); const ptrdiff_t off = it - Data; return (int)off; }697};698699// Helper: ImSpanAllocator<>700// Facilitate storing multiple chunks into a single large block (the "arena")701// - Usage: call Reserve() N times, allocate GetArenaSizeInBytes() worth, pass it to SetArenaBasePtr(), call GetSpan() N times to retrieve the aligned ranges.702template<int CHUNKS>703struct ImSpanAllocator704{705char* BasePtr;706int CurrOff;707int CurrIdx;708int Offsets[CHUNKS];709int Sizes[CHUNKS];710711ImSpanAllocator() { memset(this, 0, sizeof(*this)); }712inline void Reserve(int n, size_t sz, int a=4) { IM_ASSERT(n == CurrIdx && n < CHUNKS); CurrOff = IM_MEMALIGN(CurrOff, a); Offsets[n] = CurrOff; Sizes[n] = (int)sz; CurrIdx++; CurrOff += (int)sz; }713inline int GetArenaSizeInBytes() { return CurrOff; }714inline void SetArenaBasePtr(void* base_ptr) { BasePtr = (char*)base_ptr; }715inline void* GetSpanPtrBegin(int n) { IM_ASSERT(n >= 0 && n < CHUNKS && CurrIdx == CHUNKS); return (void*)(BasePtr + Offsets[n]); }716inline void* GetSpanPtrEnd(int n) { IM_ASSERT(n >= 0 && n < CHUNKS && CurrIdx == CHUNKS); return (void*)(BasePtr + Offsets[n] + Sizes[n]); }717template<typename T>718inline void GetSpan(int n, ImSpan<T>* span) { span->set((T*)GetSpanPtrBegin(n), (T*)GetSpanPtrEnd(n)); }719};720721// Helper: ImStableVector<>722// Allocating chunks of BLOCKSIZE items. Objects pointers are never invalidated when growing, only by clear().723// Important: does not destruct anything!724// Implemented only the minimum set of functions we need for it.725template<typename T, int BLOCKSIZE>726struct ImStableVector727{728int Size = 0;729int Capacity = 0;730ImVector<T*> Blocks;731732// Functions733inline ~ImStableVector() { for (T* block : Blocks) IM_FREE(block); }734735inline void clear() { Size = Capacity = 0; Blocks.clear_delete(); }736inline void resize(int new_size) { if (new_size > Capacity) reserve(new_size); Size = new_size; }737inline void reserve(int new_cap)738{739new_cap = IM_MEMALIGN(new_cap, BLOCKSIZE);740int old_count = Capacity / BLOCKSIZE;741int new_count = new_cap / BLOCKSIZE;742if (new_count <= old_count)743return;744Blocks.resize(new_count);745for (int n = old_count; n < new_count; n++)746Blocks[n] = (T*)IM_ALLOC(sizeof(T) * BLOCKSIZE);747Capacity = new_cap;748}749inline T& operator[](int i) { IM_ASSERT(i >= 0 && i < Size); return Blocks[i / BLOCKSIZE][i % BLOCKSIZE]; }750inline const T& operator[](int i) const { IM_ASSERT(i >= 0 && i < Size); return Blocks[i / BLOCKSIZE][i % BLOCKSIZE]; }751inline T* push_back(const T& v) { int i = Size; IM_ASSERT(i >= 0); if (Size == Capacity) reserve(Capacity + BLOCKSIZE); void* ptr = &Blocks[i / BLOCKSIZE][i % BLOCKSIZE]; memcpy(ptr, &v, sizeof(v)); Size++; return (T*)ptr; }752};753754// Helper: ImPool<>755// Basic keyed storage for contiguous instances, slow/amortized insertion, O(1) indexable, O(Log N) queries by ID over a dense/hot buffer,756// Honor constructor/destructor. Add/remove invalidate all pointers. Indexes have the same lifetime as the associated object.757typedef int ImPoolIdx;758template<typename T>759struct ImPool760{761ImVector<T> Buf; // Contiguous data762ImGuiStorage Map; // ID->Index763ImPoolIdx FreeIdx; // Next free idx to use764ImPoolIdx AliveCount; // Number of active/alive items (for display purpose)765766ImPool() { FreeIdx = AliveCount = 0; }767~ImPool() { Clear(); }768T* GetByKey(ImGuiID key) { int idx = Map.GetInt(key, -1); return (idx != -1) ? &Buf[idx] : NULL; }769T* GetByIndex(ImPoolIdx n) { return &Buf[n]; }770ImPoolIdx GetIndex(const T* p) const { IM_ASSERT(p >= Buf.Data && p < Buf.Data + Buf.Size); return (ImPoolIdx)(p - Buf.Data); }771T* GetOrAddByKey(ImGuiID key) { int* p_idx = Map.GetIntRef(key, -1); if (*p_idx != -1) return &Buf[*p_idx]; *p_idx = FreeIdx; return Add(); }772bool Contains(const T* p) const { return (p >= Buf.Data && p < Buf.Data + Buf.Size); }773void Clear() { for (int n = 0; n < Map.Data.Size; n++) { int idx = Map.Data[n].val_i; if (idx != -1) Buf[idx].~T(); } Map.Clear(); Buf.clear(); FreeIdx = AliveCount = 0; }774T* Add() { int idx = FreeIdx; if (idx == Buf.Size) { Buf.resize(Buf.Size + 1); FreeIdx++; } else { FreeIdx = *(int*)&Buf[idx]; } IM_PLACEMENT_NEW(&Buf[idx]) T(); AliveCount++; return &Buf[idx]; }775void Remove(ImGuiID key, const T* p) { Remove(key, GetIndex(p)); }776void Remove(ImGuiID key, ImPoolIdx idx) { Buf[idx].~T(); *(int*)&Buf[idx] = FreeIdx; FreeIdx = idx; Map.SetInt(key, -1); AliveCount--; }777void Reserve(int capacity) { Buf.reserve(capacity); Map.Data.reserve(capacity); }778779// To iterate a ImPool: for (int n = 0; n < pool.GetMapSize(); n++) if (T* t = pool.TryGetMapData(n)) { ... }780// Can be avoided if you know .Remove() has never been called on the pool, or AliveCount == GetMapSize()781int GetAliveCount() const { return AliveCount; } // Number of active/alive items in the pool (for display purpose)782int GetBufSize() const { return Buf.Size; }783int GetMapSize() const { return Map.Data.Size; } // It is the map we need iterate to find valid items, since we don't have "alive" storage anywhere784T* TryGetMapData(ImPoolIdx n) { int idx = Map.Data[n].val_i; if (idx == -1) return NULL; return GetByIndex(idx); }785};786787// Helper: ImChunkStream<>788// Build and iterate a contiguous stream of variable-sized structures.789// This is used by Settings to store persistent data while reducing allocation count.790// We store the chunk size first, and align the final size on 4 bytes boundaries.791// The tedious/zealous amount of casting is to avoid -Wcast-align warnings.792template<typename T>793struct ImChunkStream794{795ImVector<char> Buf;796797void clear() { Buf.clear(); }798bool empty() const { return Buf.Size == 0; }799int size() const { return Buf.Size; }800T* alloc_chunk(size_t sz) { size_t HDR_SZ = 4; sz = IM_MEMALIGN(HDR_SZ + sz, 4u); int off = Buf.Size; Buf.resize(off + (int)sz); ((int*)(void*)(Buf.Data + off))[0] = (int)sz; return (T*)(void*)(Buf.Data + off + (int)HDR_SZ); }801T* begin() { size_t HDR_SZ = 4; if (!Buf.Data) return NULL; return (T*)(void*)(Buf.Data + HDR_SZ); }802T* next_chunk(T* p) { size_t HDR_SZ = 4; IM_ASSERT(p >= begin() && p < end()); p = (T*)(void*)((char*)(void*)p + chunk_size(p)); if (p == (T*)(void*)((char*)end() + HDR_SZ)) return (T*)0; IM_ASSERT(p < end()); return p; }803int chunk_size(const T* p) { return ((const int*)p)[-1]; }804T* end() { return (T*)(void*)(Buf.Data + Buf.Size); }805int offset_from_ptr(const T* p) { IM_ASSERT(p >= begin() && p < end()); const ptrdiff_t off = (const char*)p - Buf.Data; return (int)off; }806T* ptr_from_offset(int off) { IM_ASSERT(off >= 4 && off < Buf.Size); return (T*)(void*)(Buf.Data + off); }807void swap(ImChunkStream<T>& rhs) { rhs.Buf.swap(Buf); }808};809810// Helper: ImGuiTextIndex811// Maintain a line index for a text buffer. This is a strong candidate to be moved into the public API.812struct ImGuiTextIndex813{814ImVector<int> Offsets;815int EndOffset = 0; // Because we don't own text buffer we need to maintain EndOffset (may bake in LineOffsets?)816817void clear() { Offsets.clear(); EndOffset = 0; }818int size() { return Offsets.Size; }819const char* get_line_begin(const char* base, int n) { return base + (Offsets.Size != 0 ? Offsets[n] : 0); }820const char* get_line_end(const char* base, int n) { return base + (n + 1 < Offsets.Size ? (Offsets[n + 1] - 1) : EndOffset); }821void append(const char* base, int old_size, int new_size);822};823824// Helper: ImGuiStorage825IMGUI_API ImGuiStoragePair* ImLowerBound(ImGuiStoragePair* in_begin, ImGuiStoragePair* in_end, ImGuiID key);826827//-----------------------------------------------------------------------------828// [SECTION] ImDrawList support829//-----------------------------------------------------------------------------830831// ImDrawList: Helper function to calculate a circle's segment count given its radius and a "maximum error" value.832// Estimation of number of circle segment based on error is derived using method described in https://stackoverflow.com/a/2244088/15194693833// Number of segments (N) is calculated using equation:834// N = ceil ( pi / acos(1 - error / r) ) where r > 0, error <= r835// Our equation is significantly simpler that one in the post thanks for choosing segment that is836// perpendicular to X axis. Follow steps in the article from this starting condition and you will837// will get this result.838//839// Rendering circles with an odd number of segments, while mathematically correct will produce840// asymmetrical results on the raster grid. Therefore we're rounding N to next even number (7->8, 8->8, 9->10 etc.)841#define IM_ROUNDUP_TO_EVEN(_V) ((((_V) + 1) / 2) * 2)842#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MIN 4843#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX 512844#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC(_RAD,_MAXERROR) ImClamp(IM_ROUNDUP_TO_EVEN((int)ImCeil(IM_PI / ImAcos(1 - ImMin((_MAXERROR), (_RAD)) / (_RAD)))), IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MIN, IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX)845846// Raw equation from IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC rewritten for 'r' and 'error'.847#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_R(_N,_MAXERROR) ((_MAXERROR) / (1 - ImCos(IM_PI / ImMax((float)(_N), IM_PI))))848#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_ERROR(_N,_RAD) ((1 - ImCos(IM_PI / ImMax((float)(_N), IM_PI))) / (_RAD))849850// ImDrawList: Lookup table size for adaptive arc drawing, cover full circle.851#ifndef IM_DRAWLIST_ARCFAST_TABLE_SIZE852#define IM_DRAWLIST_ARCFAST_TABLE_SIZE 48 // Number of samples in lookup table.853#endif854#define IM_DRAWLIST_ARCFAST_SAMPLE_MAX IM_DRAWLIST_ARCFAST_TABLE_SIZE // Sample index _PathArcToFastEx() for 360 angle.855856// Data shared between all ImDrawList instances857// Conceptually this could have been called e.g. ImDrawListSharedContext858// Typically one ImGui context would create and maintain one of this.859// You may want to create your own instance of you try to ImDrawList completely without ImGui. In that case, watch out for future changes to this structure.860struct IMGUI_API ImDrawListSharedData861{862ImVec2 TexUvWhitePixel; // UV of white pixel in the atlas (== FontAtlas->TexUvWhitePixel)863const ImVec4* TexUvLines; // UV of anti-aliased lines in the atlas (== FontAtlas->TexUvLines)864ImFontAtlas* FontAtlas; // Current font atlas865ImFont* Font; // Current font (used for simplified AddText overload)866float FontSize; // Current font size (used for for simplified AddText overload)867float FontScale; // Current font scale (== FontSize / Font->FontSize)868float FontWeight; // Current/default font weight869float CurveTessellationTol; // Tessellation tolerance when using PathBezierCurveTo()870float CircleSegmentMaxError; // Number of circle segments to use per pixel of radius for AddCircle() etc871float InitialFringeScale; // Initial scale to apply to AA fringe872ImDrawListFlags InitialFlags; // Initial flags at the beginning of the frame (it is possible to alter flags on a per-drawlist basis afterwards)873ImVec4 ClipRectFullscreen; // Value for PushClipRectFullscreen()874ImVector<ImVec2> TempBuffer; // Temporary write buffer875ImVector<ImDrawList*> DrawLists; // All draw lists associated to this ImDrawListSharedData876ImGuiContext* Context; // [OPTIONAL] Link to Dear ImGui context. 99% of ImDrawList/ImFontAtlas can function without an ImGui context, but this facilitate handling one legacy edge case.877878// Lookup tables879ImVec2 ArcFastVtx[IM_DRAWLIST_ARCFAST_TABLE_SIZE]; // Sample points on the quarter of the circle.880float ArcFastRadiusCutoff; // Cutoff radius after which arc drawing will fallback to slower PathArcTo()881ImU8 CircleSegmentCounts[64]; // Precomputed segment count for given radius before we calculate it dynamically (to avoid calculation overhead)882883ImDrawListSharedData();884~ImDrawListSharedData();885void SetCircleTessellationMaxError(float max_error);886};887888struct ImDrawDataBuilder889{890ImVector<ImDrawList*>* Layers[2]; // Pointers to global layers for: regular, tooltip. LayersP[0] is owned by DrawData.891ImVector<ImDrawList*> LayerData1;892893ImDrawDataBuilder() { memset(this, 0, sizeof(*this)); }894};895896struct ImFontStackData897{898ImFont* Font;899float FontSizeBeforeScaling; // ~~ style.FontSizeBase900float FontSizeAfterScaling; // ~~ g.FontSize901float FontWeight;902};903904//-----------------------------------------------------------------------------905// [SECTION] Style support906//-----------------------------------------------------------------------------907908struct ImGuiStyleVarInfo909{910ImU32 Count : 8; // 1+911ImGuiDataType DataType : 8;912ImU32 Offset : 16; // Offset in parent structure913void* GetVarPtr(void* parent) const { return (void*)((unsigned char*)parent + Offset); }914};915916// Stacked color modifier, backup of modified data so we can restore it917struct ImGuiColorMod918{919ImGuiCol Col;920ImVec4 BackupValue;921};922923// Stacked style modifier, backup of modified data so we can restore it. Data type inferred from the variable.924struct ImGuiStyleMod925{926ImGuiStyleVar VarIdx;927union { int BackupInt[2]; float BackupFloat[2]; };928ImGuiStyleMod(ImGuiStyleVar idx, int v) { VarIdx = idx; BackupInt[0] = v; }929ImGuiStyleMod(ImGuiStyleVar idx, float v) { VarIdx = idx; BackupFloat[0] = v; }930ImGuiStyleMod(ImGuiStyleVar idx, ImVec2 v) { VarIdx = idx; BackupFloat[0] = v.x; BackupFloat[1] = v.y; }931};932933//-----------------------------------------------------------------------------934// [SECTION] Data types support935//-----------------------------------------------------------------------------936937struct ImGuiDataTypeStorage938{939ImU8 Data[8]; // Opaque storage to fit any data up to ImGuiDataType_COUNT940};941942// Type information associated to one ImGuiDataType. Retrieve with DataTypeGetInfo().943struct ImGuiDataTypeInfo944{945size_t Size; // Size in bytes946const char* Name; // Short descriptive name for the type, for debugging947const char* PrintFmt; // Default printf format for the type948const char* ScanFmt; // Default scanf format for the type949};950951// Extend ImGuiDataType_952enum ImGuiDataTypePrivate_953{954ImGuiDataType_Pointer = ImGuiDataType_COUNT,955ImGuiDataType_ID,956};957958//-----------------------------------------------------------------------------959// [SECTION] Widgets support: flags, enums, data structures960//-----------------------------------------------------------------------------961962// Extend ImGuiItemFlags963// - input: PushItemFlag() manipulates g.CurrentItemFlags, g.NextItemData.ItemFlags, ItemAdd() calls may add extra flags too.964// - output: stored in g.LastItemData.ItemFlags965enum ImGuiItemFlagsPrivate_966{967// Controlled by user968ImGuiItemFlags_ReadOnly = 1 << 11, // false // [ALPHA] Allow hovering interactions but underlying value is not changed.969ImGuiItemFlags_MixedValue = 1 << 12, // false // [BETA] Represent a mixed/indeterminate value, generally multi-selection where values differ. Currently only supported by Checkbox() (later should support all sorts of widgets)970ImGuiItemFlags_NoWindowHoverableCheck = 1 << 13, // false // Disable hoverable check in ItemHoverable()971ImGuiItemFlags_AllowOverlap = 1 << 14, // false // Allow being overlapped by another widget. Not-hovered to Hovered transition deferred by a frame.972ImGuiItemFlags_NoNavDisableMouseHover = 1 << 15, // false // Nav keyboard/gamepad mode doesn't disable hover highlight (behave as if NavHighlightItemUnderNav==false).973ImGuiItemFlags_NoMarkEdited = 1 << 16, // false // Skip calling MarkItemEdited()974ImGuiItemFlags_NoFocus = 1 << 17, // false // [EXPERIMENTAL: Not very well specced] Clicking doesn't take focus. Automatically sets ImGuiButtonFlags_NoFocus + ImGuiButtonFlags_NoNavFocus in ButtonBehavior().975976// Controlled by widget code977ImGuiItemFlags_Inputable = 1 << 20, // false // [WIP] Auto-activate input mode when tab focused. Currently only used and supported by a few items before it becomes a generic feature.978ImGuiItemFlags_HasSelectionUserData = 1 << 21, // false // Set by SetNextItemSelectionUserData()979ImGuiItemFlags_IsMultiSelect = 1 << 22, // false // Set by SetNextItemSelectionUserData()980981ImGuiItemFlags_Default_ = ImGuiItemFlags_AutoClosePopups, // Please don't change, use PushItemFlag() instead.982983// Obsolete984//ImGuiItemFlags_SelectableDontClosePopup = !ImGuiItemFlags_AutoClosePopups, // Can't have a redirect as we inverted the behavior985};986987// Status flags for an already submitted item988// - output: stored in g.LastItemData.StatusFlags989enum ImGuiItemStatusFlags_990{991ImGuiItemStatusFlags_None = 0,992ImGuiItemStatusFlags_HoveredRect = 1 << 0, // Mouse position is within item rectangle (does NOT mean that the window is in correct z-order and can be hovered!, this is only one part of the most-common IsItemHovered test)993ImGuiItemStatusFlags_HasDisplayRect = 1 << 1, // g.LastItemData.DisplayRect is valid994ImGuiItemStatusFlags_Edited = 1 << 2, // Value exposed by item was edited in the current frame (should match the bool return value of most widgets)995ImGuiItemStatusFlags_ToggledSelection = 1 << 3, // Set when Selectable(), TreeNode() reports toggling a selection. We can't report "Selected", only state changes, in order to easily handle clipping with less issues.996ImGuiItemStatusFlags_ToggledOpen = 1 << 4, // Set when TreeNode() reports toggling their open state.997ImGuiItemStatusFlags_HasDeactivated = 1 << 5, // Set if the widget/group is able to provide data for the ImGuiItemStatusFlags_Deactivated flag.998ImGuiItemStatusFlags_Deactivated = 1 << 6, // Only valid if ImGuiItemStatusFlags_HasDeactivated is set.999ImGuiItemStatusFlags_HoveredWindow = 1 << 7, // Override the HoveredWindow test to allow cross-window hover testing.1000ImGuiItemStatusFlags_Visible = 1 << 8, // [WIP] Set when item is overlapping the current clipping rectangle (Used internally. Please don't use yet: API/system will change as we refactor Itemadd()).1001ImGuiItemStatusFlags_HasClipRect = 1 << 9, // g.LastItemData.ClipRect is valid.1002ImGuiItemStatusFlags_HasShortcut = 1 << 10, // g.LastItemData.Shortcut valid. Set by SetNextItemShortcut() -> ItemAdd().1003//ImGuiItemStatusFlags_FocusedByTabbing = 1 << 8, // Removed IN 1.90.1 (Dec 2023). The trigger is part of g.NavActivateId. See commit 54c1bdeceb.10041005// Additional status + semantic for ImGuiTestEngine1006#ifdef IMGUI_ENABLE_TEST_ENGINE1007ImGuiItemStatusFlags_Openable = 1 << 20, // Item is an openable (e.g. TreeNode)1008ImGuiItemStatusFlags_Opened = 1 << 21, // Opened status1009ImGuiItemStatusFlags_Checkable = 1 << 22, // Item is a checkable (e.g. CheckBox, MenuItem)1010ImGuiItemStatusFlags_Checked = 1 << 23, // Checked status1011ImGuiItemStatusFlags_Inputable = 1 << 24, // Item is a text-inputable (e.g. InputText, SliderXXX, DragXXX)1012#endif1013};10141015// Extend ImGuiHoveredFlags_1016enum ImGuiHoveredFlagsPrivate_1017{1018ImGuiHoveredFlags_DelayMask_ = ImGuiHoveredFlags_DelayNone | ImGuiHoveredFlags_DelayShort | ImGuiHoveredFlags_DelayNormal | ImGuiHoveredFlags_NoSharedDelay,1019ImGuiHoveredFlags_AllowedMaskForIsWindowHovered = ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_AnyWindow | ImGuiHoveredFlags_NoPopupHierarchy | ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem | ImGuiHoveredFlags_ForTooltip | ImGuiHoveredFlags_Stationary,1020ImGuiHoveredFlags_AllowedMaskForIsItemHovered = ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem | ImGuiHoveredFlags_AllowWhenOverlapped | ImGuiHoveredFlags_AllowWhenDisabled | ImGuiHoveredFlags_NoNavOverride | ImGuiHoveredFlags_ForTooltip | ImGuiHoveredFlags_Stationary | ImGuiHoveredFlags_DelayMask_,1021};10221023// Extend ImGuiInputTextFlags_1024enum ImGuiInputTextFlagsPrivate_1025{1026// [Internal]1027ImGuiInputTextFlags_Multiline = 1 << 26, // For internal use by InputTextMultiline()1028ImGuiInputTextFlags_MergedItem = 1 << 27, // For internal use by TempInputText(), will skip calling ItemAdd(). Require bounding-box to strictly match.1029ImGuiInputTextFlags_LocalizeDecimalPoint= 1 << 28, // For internal use by InputScalar() and TempInputScalar()1030};10311032// Extend ImGuiButtonFlags_1033enum ImGuiButtonFlagsPrivate_1034{1035ImGuiButtonFlags_PressedOnClick = 1 << 4, // return true on click (mouse down event)1036ImGuiButtonFlags_PressedOnClickRelease = 1 << 5, // [Default] return true on click + release on same item <-- this is what the majority of Button are using1037ImGuiButtonFlags_PressedOnClickReleaseAnywhere = 1 << 6, // return true on click + release even if the release event is not done while hovering the item1038ImGuiButtonFlags_PressedOnRelease = 1 << 7, // return true on release (default requires click+release)1039ImGuiButtonFlags_PressedOnDoubleClick = 1 << 8, // return true on double-click (default requires click+release)1040ImGuiButtonFlags_PressedOnDragDropHold = 1 << 9, // return true when held into while we are drag and dropping another item (used by e.g. tree nodes, collapsing headers)1041//ImGuiButtonFlags_Repeat = 1 << 10, // hold to repeat -> use ImGuiItemFlags_ButtonRepeat instead.1042ImGuiButtonFlags_FlattenChildren = 1 << 11, // allow interactions even if a child window is overlapping1043ImGuiButtonFlags_AllowOverlap = 1 << 12, // require previous frame HoveredId to either match id or be null before being usable.1044//ImGuiButtonFlags_DontClosePopups = 1 << 13, // disable automatically closing parent popup on press1045//ImGuiButtonFlags_Disabled = 1 << 14, // disable interactions -> use BeginDisabled() or ImGuiItemFlags_Disabled1046ImGuiButtonFlags_AlignTextBaseLine = 1 << 15, // vertically align button to match text baseline - ButtonEx() only // FIXME: Should be removed and handled by SmallButton(), not possible currently because of DC.CursorPosPrevLine1047ImGuiButtonFlags_NoKeyModsAllowed = 1 << 16, // disable mouse interaction if a key modifier is held1048ImGuiButtonFlags_NoHoldingActiveId = 1 << 17, // don't set ActiveId while holding the mouse (ImGuiButtonFlags_PressedOnClick only)1049ImGuiButtonFlags_NoNavFocus = 1 << 18, // don't override navigation focus when activated (FIXME: this is essentially used every time an item uses ImGuiItemFlags_NoNav, but because legacy specs don't requires LastItemData to be set ButtonBehavior(), we can't poll g.LastItemData.ItemFlags)1050ImGuiButtonFlags_NoHoveredOnFocus = 1 << 19, // don't report as hovered when nav focus is on this item1051ImGuiButtonFlags_NoSetKeyOwner = 1 << 20, // don't set key/input owner on the initial click (note: mouse buttons are keys! often, the key in question will be ImGuiKey_MouseLeft!)1052ImGuiButtonFlags_NoTestKeyOwner = 1 << 21, // don't test key/input owner when polling the key (note: mouse buttons are keys! often, the key in question will be ImGuiKey_MouseLeft!)1053ImGuiButtonFlags_NoFocus = 1 << 22, // [EXPERIMENTAL: Not very well specced]. Don't focus parent window when clicking.1054ImGuiButtonFlags_PressedOnMask_ = ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnClickReleaseAnywhere | ImGuiButtonFlags_PressedOnRelease | ImGuiButtonFlags_PressedOnDoubleClick | ImGuiButtonFlags_PressedOnDragDropHold,1055ImGuiButtonFlags_PressedOnDefault_ = ImGuiButtonFlags_PressedOnClickRelease,1056//ImGuiButtonFlags_NoKeyModifiers = ImGuiButtonFlags_NoKeyModsAllowed, // Renamed in 1.91.41057};10581059// Extend ImGuiComboFlags_1060enum ImGuiComboFlagsPrivate_1061{1062ImGuiComboFlags_CustomPreview = 1 << 20, // enable BeginComboPreview()1063};10641065// Extend ImGuiSliderFlags_1066enum ImGuiSliderFlagsPrivate_1067{1068ImGuiSliderFlags_Vertical = 1 << 20, // Should this slider be orientated vertically?1069ImGuiSliderFlags_ReadOnly = 1 << 21, // Consider using g.NextItemData.ItemFlags |= ImGuiItemFlags_ReadOnly instead.1070};10711072// Extend ImGuiSelectableFlags_1073enum ImGuiSelectableFlagsPrivate_1074{1075// NB: need to be in sync with last value of ImGuiSelectableFlags_1076ImGuiSelectableFlags_NoHoldingActiveID = 1 << 20,1077ImGuiSelectableFlags_SelectOnClick = 1 << 22, // Override button behavior to react on Click (default is Click+Release)1078ImGuiSelectableFlags_SelectOnRelease = 1 << 23, // Override button behavior to react on Release (default is Click+Release)1079ImGuiSelectableFlags_SpanAvailWidth = 1 << 24, // Span all avail width even if we declared less for layout purpose. FIXME: We may be able to remove this (added in 6251d379, 2bcafc86 for menus)1080ImGuiSelectableFlags_SetNavIdOnHover = 1 << 25, // Set Nav/Focus ID on mouse hover (used by MenuItem)1081ImGuiSelectableFlags_NoPadWithHalfSpacing = 1 << 26, // Disable padding each side with ItemSpacing * 0.5f1082ImGuiSelectableFlags_NoSetKeyOwner = 1 << 27, // Don't set key/input owner on the initial click (note: mouse buttons are keys! often, the key in question will be ImGuiKey_MouseLeft!)1083};10841085// Extend ImGuiTreeNodeFlags_1086enum ImGuiTreeNodeFlagsPrivate_1087{1088ImGuiTreeNodeFlags_NoNavFocus = 1 << 27,// Don't claim nav focus when interacting with this item (#8551)1089ImGuiTreeNodeFlags_ClipLabelForTrailingButton = 1 << 28,// FIXME-WIP: Hard-coded for CollapsingHeader()1090ImGuiTreeNodeFlags_UpsideDownArrow = 1 << 29,// FIXME-WIP: Turn Down arrow into an Up arrow, for reversed trees (#6517)1091ImGuiTreeNodeFlags_OpenOnMask_ = ImGuiTreeNodeFlags_OpenOnDoubleClick | ImGuiTreeNodeFlags_OpenOnArrow,1092ImGuiTreeNodeFlags_DrawLinesMask_ = ImGuiTreeNodeFlags_DrawLinesNone | ImGuiTreeNodeFlags_DrawLinesFull | ImGuiTreeNodeFlags_DrawLinesToNodes,1093};10941095enum ImGuiSeparatorFlags_1096{1097ImGuiSeparatorFlags_None = 0,1098ImGuiSeparatorFlags_Horizontal = 1 << 0, // Axis default to current layout type, so generally Horizontal unless e.g. in a menu bar1099ImGuiSeparatorFlags_Vertical = 1 << 1,1100ImGuiSeparatorFlags_SpanAllColumns = 1 << 2, // Make separator cover all columns of a legacy Columns() set.1101};11021103// Flags for FocusWindow(). This is not called ImGuiFocusFlags to avoid confusion with public-facing ImGuiFocusedFlags.1104// FIXME: Once we finishing replacing more uses of GetTopMostPopupModal()+IsWindowWithinBeginStackOf()1105// and FindBlockingModal() with this, we may want to change the flag to be opt-out instead of opt-in.1106enum ImGuiFocusRequestFlags_1107{1108ImGuiFocusRequestFlags_None = 0,1109ImGuiFocusRequestFlags_RestoreFocusedChild = 1 << 0, // Find last focused child (if any) and focus it instead.1110ImGuiFocusRequestFlags_UnlessBelowModal = 1 << 1, // Do not set focus if the window is below a modal.1111};11121113enum ImGuiTextFlags_1114{1115ImGuiTextFlags_None = 0,1116ImGuiTextFlags_NoWidthForLargeClippedText = 1 << 0,1117};11181119enum ImGuiTooltipFlags_1120{1121ImGuiTooltipFlags_None = 0,1122ImGuiTooltipFlags_OverridePrevious = 1 << 1, // Clear/ignore previously submitted tooltip (defaults to append)1123};11241125// FIXME: this is in development, not exposed/functional as a generic feature yet.1126// Horizontal/Vertical enums are fixed to 0/1 so they may be used to index ImVec21127enum ImGuiLayoutType_1128{1129ImGuiLayoutType_Horizontal = 0,1130ImGuiLayoutType_Vertical = 11131};11321133// Flags for LogBegin() text capturing function1134enum ImGuiLogFlags_1135{1136ImGuiLogFlags_None = 0,11371138ImGuiLogFlags_OutputTTY = 1 << 0,1139ImGuiLogFlags_OutputFile = 1 << 1,1140ImGuiLogFlags_OutputBuffer = 1 << 2,1141ImGuiLogFlags_OutputClipboard = 1 << 3,1142ImGuiLogFlags_OutputMask_ = ImGuiLogFlags_OutputTTY | ImGuiLogFlags_OutputFile | ImGuiLogFlags_OutputBuffer | ImGuiLogFlags_OutputClipboard,1143};11441145// X/Y enums are fixed to 0/1 so they may be used to index ImVec21146enum ImGuiAxis1147{1148ImGuiAxis_None = -1,1149ImGuiAxis_X = 0,1150ImGuiAxis_Y = 11151};11521153enum ImGuiPlotType1154{1155ImGuiPlotType_Lines,1156ImGuiPlotType_Histogram,1157};11581159// Storage data for BeginComboPreview()/EndComboPreview()1160struct IMGUI_API ImGuiComboPreviewData1161{1162ImRect PreviewRect;1163ImVec2 BackupCursorPos;1164ImVec2 BackupCursorMaxPos;1165ImVec2 BackupCursorPosPrevLine;1166float BackupPrevLineTextBaseOffset;1167ImGuiLayoutType BackupLayout;11681169ImGuiComboPreviewData() { memset(this, 0, sizeof(*this)); }1170};11711172// Stacked storage data for BeginGroup()/EndGroup()1173struct IMGUI_API ImGuiGroupData1174{1175ImGuiID WindowID;1176ImVec2 BackupCursorPos;1177ImVec2 BackupCursorMaxPos;1178ImVec2 BackupCursorPosPrevLine;1179ImVec1 BackupIndent;1180ImVec1 BackupGroupOffset;1181ImVec2 BackupCurrLineSize;1182float BackupCurrLineTextBaseOffset;1183ImGuiID BackupActiveIdIsAlive;1184bool BackupActiveIdHasBeenEditedThisFrame;1185bool BackupDeactivatedIdIsAlive;1186bool BackupHoveredIdIsAlive;1187bool BackupIsSameLine;1188bool EmitItem;1189};11901191// Simple column measurement, currently used for MenuItem() only.. This is very short-sighted/throw-away code and NOT a generic helper.1192struct IMGUI_API ImGuiMenuColumns1193{1194ImU32 TotalWidth;1195ImU32 NextTotalWidth;1196ImU16 Spacing;1197ImU16 OffsetIcon; // Always zero for now1198ImU16 OffsetLabel; // Offsets are locked in Update()1199ImU16 OffsetShortcut;1200ImU16 OffsetMark;1201ImU16 Widths[4]; // Width of: Icon, Label, Shortcut, Mark (accumulators for current frame)12021203ImGuiMenuColumns() { memset(this, 0, sizeof(*this)); }1204void Update(float spacing, bool window_reappearing);1205float DeclColumns(float w_icon, float w_label, float w_shortcut, float w_mark);1206void CalcNextTotalWidth(bool update_offsets);1207};12081209// Internal temporary state for deactivating InputText() instances.1210struct IMGUI_API ImGuiInputTextDeactivatedState1211{1212ImGuiID ID; // widget id owning the text state (which just got deactivated)1213ImVector<char> TextA; // text buffer12141215ImGuiInputTextDeactivatedState() { memset(this, 0, sizeof(*this)); }1216void ClearFreeMemory() { ID = 0; TextA.clear(); }1217};12181219// Forward declare imstb_textedit.h structure + make its main configuration define accessible1220#undef IMSTB_TEXTEDIT_STRING1221#undef IMSTB_TEXTEDIT_CHARTYPE1222#define IMSTB_TEXTEDIT_STRING ImGuiInputTextState1223#define IMSTB_TEXTEDIT_CHARTYPE char1224#define IMSTB_TEXTEDIT_GETWIDTH_NEWLINE (-1.0f)1225#define IMSTB_TEXTEDIT_UNDOSTATECOUNT 991226#define IMSTB_TEXTEDIT_UNDOCHARCOUNT 9991227namespace ImStb { struct STB_TexteditState; }1228typedef ImStb::STB_TexteditState ImStbTexteditState;12291230// Internal state of the currently focused/edited text input box1231// For a given item ID, access with ImGui::GetInputTextState()1232struct IMGUI_API ImGuiInputTextState1233{1234ImGuiContext* Ctx; // parent UI context (needs to be set explicitly by parent).1235ImStbTexteditState* Stb; // State for stb_textedit.h1236ImGuiInputTextFlags Flags; // copy of InputText() flags. may be used to check if e.g. ImGuiInputTextFlags_Password is set.1237ImGuiID ID; // widget id owning the text state1238int TextLen; // UTF-8 length of the string in TextA (in bytes)1239const char* TextSrc; // == TextA.Data unless read-only, in which case == buf passed to InputText(). Field only set and valid _inside_ the call InputText() call.1240ImVector<char> TextA; // main UTF8 buffer. TextA.Size is a buffer size! Should always be >= buf_size passed by user (and of course >= CurLenA + 1).1241ImVector<char> TextToRevertTo; // value to revert to when pressing Escape = backup of end-user buffer at the time of focus (in UTF-8, unaltered)1242ImVector<char> CallbackTextBackup; // temporary storage for callback to support automatic reconcile of undo-stack1243int BufCapacity; // end-user buffer capacity (include zero terminator)1244ImVec2 Scroll; // horizontal offset (managed manually) + vertical scrolling (pulled from child window's own Scroll.y)1245int LineCount; // last line count (solely for debugging)1246float WrapWidth; // word-wrapping width1247float CursorAnim; // timer for cursor blink, reset on every user action so the cursor reappears immediately1248bool CursorFollow; // set when we want scrolling to follow the current cursor position (not always!)1249bool CursorCenterY; // set when we want scrolling to be centered over the cursor position (while resizing a word-wrapping field)1250bool SelectedAllMouseLock; // after a double-click to select all, we ignore further mouse drags to update selection1251bool Edited; // edited this frame1252bool WantReloadUserBuf; // force a reload of user buf so it may be modified externally. may be automatic in future version.1253ImS8 LastMoveDirectionLR; // ImGuiDir_Left or ImGuiDir_Right. track last movement direction so when cursor cross over a word-wrapping boundaries we can display it on either line depending on last move.s1254int ReloadSelectionStart;1255int ReloadSelectionEnd;12561257ImGuiInputTextState();1258~ImGuiInputTextState();1259void ClearText() { TextLen = 0; TextA[0] = 0; CursorClamp(); }1260void ClearFreeMemory() { TextA.clear(); TextToRevertTo.clear(); }1261void OnKeyPressed(int key); // Cannot be inline because we call in code in stb_textedit.h implementation1262void OnCharPressed(unsigned int c);1263float GetPreferredOffsetX() const;12641265// Cursor & Selection1266void CursorAnimReset();1267void CursorClamp();1268bool HasSelection() const;1269void ClearSelection();1270int GetCursorPos() const;1271int GetSelectionStart() const;1272int GetSelectionEnd() const;1273void SelectAll();12741275// Reload user buf (WIP #2890)1276// If you modify underlying user-passed const char* while active you need to call this (InputText V2 may lift this)1277// strcpy(my_buf, "hello");1278// if (ImGuiInputTextState* state = ImGui::GetInputTextState(id)) // id may be ImGui::GetItemID() is last item1279// state->ReloadUserBufAndSelectAll();1280void ReloadUserBufAndSelectAll();1281void ReloadUserBufAndKeepSelection();1282void ReloadUserBufAndMoveToEnd();1283};12841285enum ImGuiWindowRefreshFlags_1286{1287ImGuiWindowRefreshFlags_None = 0,1288ImGuiWindowRefreshFlags_TryToAvoidRefresh = 1 << 0, // [EXPERIMENTAL] Try to keep existing contents, USER MUST NOT HONOR BEGIN() RETURNING FALSE AND NOT APPEND.1289ImGuiWindowRefreshFlags_RefreshOnHover = 1 << 1, // [EXPERIMENTAL] Always refresh on hover1290ImGuiWindowRefreshFlags_RefreshOnFocus = 1 << 2, // [EXPERIMENTAL] Always refresh on focus1291// Refresh policy/frequency, Load Balancing etc.1292};12931294enum ImGuiWindowBgClickFlags_1295{1296ImGuiWindowBgClickFlags_None = 0,1297ImGuiWindowBgClickFlags_Move = 1 << 0, // Click on bg/void + drag to move window. Cleared by default when using io.ConfigWindowsMoveFromTitleBarOnly.1298};12991300enum ImGuiNextWindowDataFlags_1301{1302ImGuiNextWindowDataFlags_None = 0,1303ImGuiNextWindowDataFlags_HasPos = 1 << 0,1304ImGuiNextWindowDataFlags_HasSize = 1 << 1,1305ImGuiNextWindowDataFlags_HasContentSize = 1 << 2,1306ImGuiNextWindowDataFlags_HasCollapsed = 1 << 3,1307ImGuiNextWindowDataFlags_HasSizeConstraint = 1 << 4,1308ImGuiNextWindowDataFlags_HasFocus = 1 << 5,1309ImGuiNextWindowDataFlags_HasBgAlpha = 1 << 6,1310ImGuiNextWindowDataFlags_HasScroll = 1 << 7,1311ImGuiNextWindowDataFlags_HasWindowFlags = 1 << 8,1312ImGuiNextWindowDataFlags_HasChildFlags = 1 << 9,1313ImGuiNextWindowDataFlags_HasRefreshPolicy = 1 << 10,1314};13151316// Storage for SetNexWindow** functions1317struct ImGuiNextWindowData1318{1319ImGuiNextWindowDataFlags HasFlags;13201321// Members below are NOT cleared. Always rely on HasFlags.1322ImGuiCond PosCond;1323ImGuiCond SizeCond;1324ImGuiCond CollapsedCond;1325ImVec2 PosVal;1326ImVec2 PosPivotVal;1327ImVec2 SizeVal;1328ImVec2 ContentSizeVal;1329ImVec2 ScrollVal;1330ImGuiWindowFlags WindowFlags; // Only honored by BeginTable()1331ImGuiChildFlags ChildFlags;1332bool CollapsedVal;1333ImRect SizeConstraintRect;1334ImGuiSizeCallback SizeCallback;1335void* SizeCallbackUserData;1336float BgAlphaVal; // Override background alpha1337ImVec2 MenuBarOffsetMinVal; // (Always on) This is not exposed publicly, so we don't clear it and it doesn't have a corresponding flag (could we? for consistency?)1338ImGuiWindowRefreshFlags RefreshFlagsVal;13391340ImGuiNextWindowData() { memset(this, 0, sizeof(*this)); }1341inline void ClearFlags() { HasFlags = ImGuiNextWindowDataFlags_None; }1342};13431344enum ImGuiNextItemDataFlags_1345{1346ImGuiNextItemDataFlags_None = 0,1347ImGuiNextItemDataFlags_HasWidth = 1 << 0,1348ImGuiNextItemDataFlags_HasOpen = 1 << 1,1349ImGuiNextItemDataFlags_HasShortcut = 1 << 2,1350ImGuiNextItemDataFlags_HasRefVal = 1 << 3,1351ImGuiNextItemDataFlags_HasStorageID = 1 << 4,1352ImGuiNextItemDataFlags_HasColorMarker = 1 << 5,1353};13541355struct ImGuiNextItemData1356{1357ImGuiNextItemDataFlags HasFlags; // Called HasFlags instead of Flags to avoid mistaking this1358ImGuiItemFlags ItemFlags; // Currently only tested/used for ImGuiItemFlags_AllowOverlap and ImGuiItemFlags_HasSelectionUserData.13591360// Members below are NOT cleared by ItemAdd() meaning they are still valid during e.g. NavProcessItem(). Always rely on HasFlags.1361ImGuiID FocusScopeId; // Set by SetNextItemSelectionUserData()1362ImGuiSelectionUserData SelectionUserData; // Set by SetNextItemSelectionUserData() (note that NULL/0 is a valid value, we use -1 == ImGuiSelectionUserData_Invalid to mark invalid values)1363float Width; // Set by SetNextItemWidth()1364ImGuiKeyChord Shortcut; // Set by SetNextItemShortcut()1365ImGuiInputFlags ShortcutFlags; // Set by SetNextItemShortcut()1366bool OpenVal; // Set by SetNextItemOpen()1367ImU8 OpenCond; // Set by SetNextItemOpen()1368ImGuiDataTypeStorage RefVal; // Not exposed yet, for ImGuiInputTextFlags_ParseEmptyAsRefVal1369ImGuiID StorageId; // Set by SetNextItemStorageID()1370ImU32 ColorMarker; // Set by SetNextItemColorMarker(). Not exposed yet, supported by DragScalar,SliderScalar and for ImGuiSliderFlags_ColorMarkers.13711372ImGuiNextItemData() { memset(this, 0, sizeof(*this)); SelectionUserData = -1; }1373inline void ClearFlags() { HasFlags = ImGuiNextItemDataFlags_None; ItemFlags = ImGuiItemFlags_None; } // Also cleared manually by ItemAdd()!1374};13751376// Status storage for the last submitted item1377struct ImGuiLastItemData1378{1379ImGuiID ID;1380ImGuiItemFlags ItemFlags; // See ImGuiItemFlags_ (called 'InFlags' before v1.91.4).1381ImGuiItemStatusFlags StatusFlags; // See ImGuiItemStatusFlags_1382ImRect Rect; // Full rectangle1383ImRect NavRect; // Navigation scoring rectangle (not displayed)1384// Rarely used fields are not explicitly cleared, only valid when the corresponding ImGuiItemStatusFlags are set.1385ImRect DisplayRect; // Display rectangle. ONLY VALID IF (StatusFlags & ImGuiItemStatusFlags_HasDisplayRect) is set.1386ImRect ClipRect; // Clip rectangle at the time of submitting item. ONLY VALID IF (StatusFlags & ImGuiItemStatusFlags_HasClipRect) is set..1387ImGuiKeyChord Shortcut; // Shortcut at the time of submitting item. ONLY VALID IF (StatusFlags & ImGuiItemStatusFlags_HasShortcut) is set..13881389ImGuiLastItemData() { memset(this, 0, sizeof(*this)); }1390};13911392// Store data emitted by TreeNode() for usage by TreePop()1393// - To implement ImGuiTreeNodeFlags_NavLeftJumpsToParent: store the minimum amount of data1394// which we can't infer in TreePop(), to perform the equivalent of NavApplyItemToResult().1395// Only stored when the node is a potential candidate for landing on a Left arrow jump.1396struct ImGuiTreeNodeStackData1397{1398ImGuiID ID;1399ImGuiTreeNodeFlags TreeFlags;1400ImGuiItemFlags ItemFlags; // Used for nav landing1401ImRect NavRect; // Used for nav landing1402float DrawLinesX1;1403float DrawLinesToNodesY2;1404ImGuiTableColumnIdx DrawLinesTableColumn;1405};14061407// sizeof() = 201408struct IMGUI_API ImGuiErrorRecoveryState1409{1410short SizeOfWindowStack;1411short SizeOfIDStack;1412short SizeOfTreeStack;1413short SizeOfColorStack;1414short SizeOfStyleVarStack;1415short SizeOfFontStack;1416short SizeOfFocusScopeStack;1417short SizeOfGroupStack;1418short SizeOfItemFlagsStack;1419short SizeOfBeginPopupStack;1420short SizeOfDisabledStack;14211422ImGuiErrorRecoveryState() { memset(this, 0, sizeof(*this)); }1423};14241425// Data saved for each window pushed into the stack1426struct ImGuiWindowStackData1427{1428ImGuiWindow* Window;1429ImGuiLastItemData ParentLastItemDataBackup;1430ImGuiErrorRecoveryState StackSizesInBegin; // Store size of various stacks for asserting1431bool DisabledOverrideReenable; // Non-child window override disabled flag1432float DisabledOverrideReenableAlphaBackup;1433};14341435struct ImGuiShrinkWidthItem1436{1437int Index;1438float Width;1439float InitialWidth;1440};14411442struct ImGuiPtrOrIndex1443{1444void* Ptr; // Either field can be set, not both. e.g. Dock node tab bars are loose while BeginTabBar() ones are in a pool.1445int Index; // Usually index in a main pool.14461447ImGuiPtrOrIndex(void* ptr) { Ptr = ptr; Index = -1; }1448ImGuiPtrOrIndex(int index) { Ptr = NULL; Index = index; }1449};14501451// Data used by IsItemDeactivated()/IsItemDeactivatedAfterEdit() functions1452struct ImGuiDeactivatedItemData1453{1454ImGuiID ID;1455int ElapseFrame;1456bool HasBeenEditedBefore;1457bool IsAlive;1458};14591460//-----------------------------------------------------------------------------1461// [SECTION] Popup support1462//-----------------------------------------------------------------------------14631464enum ImGuiPopupPositionPolicy1465{1466ImGuiPopupPositionPolicy_Default,1467ImGuiPopupPositionPolicy_ComboBox,1468ImGuiPopupPositionPolicy_Tooltip,1469};14701471// Storage for popup stacks (g.OpenPopupStack and g.BeginPopupStack)1472struct ImGuiPopupData1473{1474ImGuiID PopupId; // Set on OpenPopup()1475ImGuiWindow* Window; // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup()1476ImGuiWindow* RestoreNavWindow;// Set on OpenPopup(), a NavWindow that will be restored on popup close1477int ParentNavLayer; // Resolved on BeginPopup(). Actually a ImGuiNavLayer type (declared down below), initialized to -1 which is not part of an enum, but serves well-enough as "not any of layers" value1478int OpenFrameCount; // Set on OpenPopup()1479ImGuiID OpenParentId; // Set on OpenPopup(), we need this to differentiate multiple menu sets from each others (e.g. inside menu bar vs loose menu items)1480ImVec2 OpenPopupPos; // Set on OpenPopup(), preferred popup position (typically == OpenMousePos when using mouse)1481ImVec2 OpenMousePos; // Set on OpenPopup(), copy of mouse position at the time of opening popup14821483ImGuiPopupData() { memset(this, 0, sizeof(*this)); ParentNavLayer = OpenFrameCount = -1; }1484};14851486//-----------------------------------------------------------------------------1487// [SECTION] Inputs support1488//-----------------------------------------------------------------------------14891490// Bit array for named keys1491typedef ImBitArray<ImGuiKey_NamedKey_COUNT, -ImGuiKey_NamedKey_BEGIN> ImBitArrayForNamedKeys;14921493// [Internal] Key ranges1494#define ImGuiKey_LegacyNativeKey_BEGIN 01495#define ImGuiKey_LegacyNativeKey_END 5121496#define ImGuiKey_Keyboard_BEGIN (ImGuiKey_NamedKey_BEGIN)1497#define ImGuiKey_Keyboard_END (ImGuiKey_GamepadStart)1498#define ImGuiKey_Gamepad_BEGIN (ImGuiKey_GamepadStart)1499#define ImGuiKey_Gamepad_END (ImGuiKey_GamepadRStickDown + 1)1500#define ImGuiKey_Mouse_BEGIN (ImGuiKey_MouseLeft)1501#define ImGuiKey_Mouse_END (ImGuiKey_MouseWheelY + 1)1502#define ImGuiKey_Aliases_BEGIN (ImGuiKey_Mouse_BEGIN)1503#define ImGuiKey_Aliases_END (ImGuiKey_Mouse_END)15041505// [Internal] Named shortcuts for Navigation1506#define ImGuiKey_NavKeyboardTweakSlow ImGuiMod_Ctrl1507#define ImGuiKey_NavKeyboardTweakFast ImGuiMod_Shift1508#define ImGuiKey_NavGamepadTweakSlow ImGuiKey_GamepadL11509#define ImGuiKey_NavGamepadTweakFast ImGuiKey_GamepadR11510#define ImGuiKey_NavGamepadActivate (g.IO.ConfigNavSwapGamepadButtons ? ImGuiKey_GamepadFaceRight : ImGuiKey_GamepadFaceDown)1511#define ImGuiKey_NavGamepadCancel (g.IO.ConfigNavSwapGamepadButtons ? ImGuiKey_GamepadFaceDown : ImGuiKey_GamepadFaceRight)1512#define ImGuiKey_NavGamepadMenu ImGuiKey_GamepadFaceLeft1513#define ImGuiKey_NavGamepadInput ImGuiKey_GamepadFaceUp15141515enum ImGuiInputEventType1516{1517ImGuiInputEventType_None = 0,1518ImGuiInputEventType_MousePos,1519ImGuiInputEventType_MouseWheel,1520ImGuiInputEventType_MouseButton,1521ImGuiInputEventType_Key,1522ImGuiInputEventType_Text,1523ImGuiInputEventType_Focus,1524ImGuiInputEventType_COUNT1525};15261527enum ImGuiInputSource : int1528{1529ImGuiInputSource_None = 0,1530ImGuiInputSource_Mouse, // Note: may be Mouse or TouchScreen or Pen. See io.MouseSource to distinguish them.1531ImGuiInputSource_Keyboard,1532ImGuiInputSource_Gamepad,1533ImGuiInputSource_COUNT1534};15351536// FIXME: Structures in the union below need to be declared as anonymous unions appears to be an extension?1537// Using ImVec2() would fail on Clang 'union member 'MousePos' has a non-trivial default constructor'1538struct ImGuiInputEventMousePos { float PosX, PosY; ImGuiMouseSource MouseSource; };1539struct ImGuiInputEventMouseWheel { float WheelX, WheelY; ImGuiMouseSource MouseSource; };1540struct ImGuiInputEventMouseButton { int Button; bool Down; ImGuiMouseSource MouseSource; };1541struct ImGuiInputEventKey { ImGuiKey Key; bool Down; float AnalogValue; };1542struct ImGuiInputEventText { unsigned int Char; };1543struct ImGuiInputEventAppFocused { bool Focused; };15441545struct ImGuiInputEvent1546{1547ImGuiInputEventType Type;1548ImGuiInputSource Source;1549ImU32 EventId; // Unique, sequential increasing integer to identify an event (if you need to correlate them to other data).1550union1551{1552ImGuiInputEventMousePos MousePos; // if Type == ImGuiInputEventType_MousePos1553ImGuiInputEventMouseWheel MouseWheel; // if Type == ImGuiInputEventType_MouseWheel1554ImGuiInputEventMouseButton MouseButton; // if Type == ImGuiInputEventType_MouseButton1555ImGuiInputEventKey Key; // if Type == ImGuiInputEventType_Key1556ImGuiInputEventText Text; // if Type == ImGuiInputEventType_Text1557ImGuiInputEventAppFocused AppFocused; // if Type == ImGuiInputEventType_Focus1558};1559bool AddedByTestEngine;15601561ImGuiInputEvent() { memset(this, 0, sizeof(*this)); }1562};15631564// Input function taking an 'ImGuiID owner_id' argument defaults to (ImGuiKeyOwner_Any == 0) aka don't test ownership, which matches legacy behavior.1565#define ImGuiKeyOwner_Any ((ImGuiID)0) // Accept key that have an owner, UNLESS a call to SetKeyOwner() explicitly used ImGuiInputFlags_LockThisFrame or ImGuiInputFlags_LockUntilRelease.1566#define ImGuiKeyOwner_NoOwner ((ImGuiID)-1) // Require key to have no owner.1567//#define ImGuiKeyOwner_None ImGuiKeyOwner_NoOwner // We previously called this 'ImGuiKeyOwner_None' but it was inconsistent with our pattern that _None values == 0 and quite dangerous. Also using _NoOwner makes the IsKeyPressed() calls more explicit.15681569typedef ImS16 ImGuiKeyRoutingIndex;15701571// Routing table entry (sizeof() == 16 bytes)1572struct ImGuiKeyRoutingData1573{1574ImGuiKeyRoutingIndex NextEntryIndex;1575ImU16 Mods; // Technically we'd only need 4-bits but for simplify we store ImGuiMod_ values which need 16-bits.1576ImU16 RoutingCurrScore; // [DEBUG] For debug display1577ImU16 RoutingNextScore; // Lower is better (0: perfect score)1578ImGuiID RoutingCurr;1579ImGuiID RoutingNext;15801581ImGuiKeyRoutingData() { NextEntryIndex = -1; Mods = 0; RoutingCurrScore = RoutingNextScore = 0; RoutingCurr = RoutingNext = ImGuiKeyOwner_NoOwner; }1582};15831584// Routing table: maintain a desired owner for each possible key-chord (key + mods), and setup owner in NewFrame() when mods are matching.1585// Stored in main context (1 instance)1586struct ImGuiKeyRoutingTable1587{1588ImGuiKeyRoutingIndex Index[ImGuiKey_NamedKey_COUNT]; // Index of first entry in Entries[]1589ImVector<ImGuiKeyRoutingData> Entries;1590ImVector<ImGuiKeyRoutingData> EntriesNext; // Double-buffer to avoid reallocation (could use a shared buffer)15911592ImGuiKeyRoutingTable() { Clear(); }1593void Clear() { for (int n = 0; n < IM_COUNTOF(Index); n++) Index[n] = -1; Entries.clear(); EntriesNext.clear(); }1594};15951596// This extends ImGuiKeyData but only for named keys (legacy keys don't support the new features)1597// Stored in main context (1 per named key). In the future it might be merged into ImGuiKeyData.1598struct ImGuiKeyOwnerData1599{1600ImGuiID OwnerCurr;1601ImGuiID OwnerNext;1602bool LockThisFrame; // Reading this key requires explicit owner id (until end of frame). Set by ImGuiInputFlags_LockThisFrame.1603bool LockUntilRelease; // Reading this key requires explicit owner id (until key is released). Set by ImGuiInputFlags_LockUntilRelease. When this is true LockThisFrame is always true as well.16041605ImGuiKeyOwnerData() { OwnerCurr = OwnerNext = ImGuiKeyOwner_NoOwner; LockThisFrame = LockUntilRelease = false; }1606};16071608// Extend ImGuiInputFlags_1609// Flags for extended versions of IsKeyPressed(), IsMouseClicked(), Shortcut(), SetKeyOwner(), SetItemKeyOwner()1610// Don't mistake with ImGuiInputTextFlags! (which is for ImGui::InputText() function)1611enum ImGuiInputFlagsPrivate_1612{1613// Flags for IsKeyPressed(), IsKeyChordPressed(), IsMouseClicked(), Shortcut()1614// - Repeat mode: Repeat rate selection1615ImGuiInputFlags_RepeatRateDefault = 1 << 1, // Repeat rate: Regular (default)1616ImGuiInputFlags_RepeatRateNavMove = 1 << 2, // Repeat rate: Fast1617ImGuiInputFlags_RepeatRateNavTweak = 1 << 3, // Repeat rate: Faster1618// - Repeat mode: Specify when repeating key pressed can be interrupted.1619// - In theory ImGuiInputFlags_RepeatUntilOtherKeyPress may be a desirable default, but it would break too many behavior so everything is opt-in.1620ImGuiInputFlags_RepeatUntilRelease = 1 << 4, // Stop repeating when released (default for all functions except Shortcut). This only exists to allow overriding Shortcut() default behavior.1621ImGuiInputFlags_RepeatUntilKeyModsChange = 1 << 5, // Stop repeating when released OR if keyboard mods are changed (default for Shortcut)1622ImGuiInputFlags_RepeatUntilKeyModsChangeFromNone = 1 << 6, // Stop repeating when released OR if keyboard mods are leaving the None state. Allows going from Mod+Key to Key by releasing Mod.1623ImGuiInputFlags_RepeatUntilOtherKeyPress = 1 << 7, // Stop repeating when released OR if any other keyboard key is pressed during the repeat16241625// Flags for SetKeyOwner(), SetItemKeyOwner()1626// - Locking key away from non-input aware code. Locking is useful to make input-owner-aware code steal keys from non-input-owner-aware code. If all code is input-owner-aware locking would never be necessary.1627ImGuiInputFlags_LockThisFrame = 1 << 20, // Further accesses to key data will require EXPLICIT owner ID (ImGuiKeyOwner_Any/0 will NOT accepted for polling). Cleared at end of frame.1628ImGuiInputFlags_LockUntilRelease = 1 << 21, // Further accesses to key data will require EXPLICIT owner ID (ImGuiKeyOwner_Any/0 will NOT accepted for polling). Cleared when the key is released or at end of each frame if key is released.16291630// - Condition for SetItemKeyOwner()1631ImGuiInputFlags_CondHovered = 1 << 22, // Only set if item is hovered (default to both)1632ImGuiInputFlags_CondActive = 1 << 23, // Only set if item is active (default to both)1633ImGuiInputFlags_CondDefault_ = ImGuiInputFlags_CondHovered | ImGuiInputFlags_CondActive,16341635// [Internal] Mask of which function support which flags1636ImGuiInputFlags_RepeatRateMask_ = ImGuiInputFlags_RepeatRateDefault | ImGuiInputFlags_RepeatRateNavMove | ImGuiInputFlags_RepeatRateNavTweak,1637ImGuiInputFlags_RepeatUntilMask_ = ImGuiInputFlags_RepeatUntilRelease | ImGuiInputFlags_RepeatUntilKeyModsChange | ImGuiInputFlags_RepeatUntilKeyModsChangeFromNone | ImGuiInputFlags_RepeatUntilOtherKeyPress,1638ImGuiInputFlags_RepeatMask_ = ImGuiInputFlags_Repeat | ImGuiInputFlags_RepeatRateMask_ | ImGuiInputFlags_RepeatUntilMask_,1639ImGuiInputFlags_CondMask_ = ImGuiInputFlags_CondHovered | ImGuiInputFlags_CondActive,1640ImGuiInputFlags_RouteTypeMask_ = ImGuiInputFlags_RouteActive | ImGuiInputFlags_RouteFocused | ImGuiInputFlags_RouteGlobal | ImGuiInputFlags_RouteAlways,1641ImGuiInputFlags_RouteOptionsMask_ = ImGuiInputFlags_RouteOverFocused | ImGuiInputFlags_RouteOverActive | ImGuiInputFlags_RouteUnlessBgFocused | ImGuiInputFlags_RouteFromRootWindow,1642ImGuiInputFlags_SupportedByIsKeyPressed = ImGuiInputFlags_RepeatMask_,1643ImGuiInputFlags_SupportedByIsMouseClicked = ImGuiInputFlags_Repeat,1644ImGuiInputFlags_SupportedByShortcut = ImGuiInputFlags_RepeatMask_ | ImGuiInputFlags_RouteTypeMask_ | ImGuiInputFlags_RouteOptionsMask_,1645ImGuiInputFlags_SupportedBySetNextItemShortcut = ImGuiInputFlags_RepeatMask_ | ImGuiInputFlags_RouteTypeMask_ | ImGuiInputFlags_RouteOptionsMask_ | ImGuiInputFlags_Tooltip,1646ImGuiInputFlags_SupportedBySetKeyOwner = ImGuiInputFlags_LockThisFrame | ImGuiInputFlags_LockUntilRelease,1647ImGuiInputFlags_SupportedBySetItemKeyOwner = ImGuiInputFlags_SupportedBySetKeyOwner | ImGuiInputFlags_CondMask_,1648};16491650//-----------------------------------------------------------------------------1651// [SECTION] Clipper support1652//-----------------------------------------------------------------------------16531654// Note that Max is exclusive, so perhaps should be using a Begin/End convention.1655struct ImGuiListClipperRange1656{1657int Min;1658int Max;1659bool PosToIndexConvert; // Begin/End are absolute position (will be converted to indices later)1660ImS8 PosToIndexOffsetMin; // Add to Min after converting to indices1661ImS8 PosToIndexOffsetMax; // Add to Min after converting to indices16621663static ImGuiListClipperRange FromIndices(int min, int max) { ImGuiListClipperRange r = { min, max, false, 0, 0 }; return r; }1664static ImGuiListClipperRange FromPositions(float y1, float y2, int off_min, int off_max) { ImGuiListClipperRange r = { (int)y1, (int)y2, true, (ImS8)off_min, (ImS8)off_max }; return r; }1665};16661667// Temporary clipper data, buffers shared/reused between instances1668struct ImGuiListClipperData1669{1670ImGuiListClipper* ListClipper;1671float LossynessOffset;1672int StepNo;1673int ItemsFrozen;1674ImVector<ImGuiListClipperRange> Ranges;16751676ImGuiListClipperData() { memset(this, 0, sizeof(*this)); }1677void Reset(ImGuiListClipper* clipper) { ListClipper = clipper; StepNo = ItemsFrozen = 0; Ranges.resize(0); }1678};16791680//-----------------------------------------------------------------------------1681// [SECTION] Navigation support1682//-----------------------------------------------------------------------------16831684enum ImGuiActivateFlags_1685{1686ImGuiActivateFlags_None = 0,1687ImGuiActivateFlags_PreferInput = 1 << 0, // Favor activation that requires keyboard text input (e.g. for Slider/Drag). Default for Enter key.1688ImGuiActivateFlags_PreferTweak = 1 << 1, // Favor activation for tweaking with arrows or gamepad (e.g. for Slider/Drag). Default for Space key and if keyboard is not used.1689ImGuiActivateFlags_TryToPreserveState = 1 << 2, // Request widget to preserve state if it can (e.g. InputText will try to preserve cursor/selection)1690ImGuiActivateFlags_FromTabbing = 1 << 3, // Activation requested by a tabbing request (ImGuiNavMoveFlags_IsTabbing)1691ImGuiActivateFlags_FromShortcut = 1 << 4, // Activation requested by an item shortcut via SetNextItemShortcut() function.1692ImGuiActivateFlags_FromFocusApi = 1 << 5, // Activation requested by an api request (ImGuiNavMoveFlags_FocusApi)1693};16941695// Early work-in-progress API for ScrollToItem()1696enum ImGuiScrollFlags_1697{1698ImGuiScrollFlags_None = 0,1699ImGuiScrollFlags_KeepVisibleEdgeX = 1 << 0, // If item is not visible: scroll as little as possible on X axis to bring item back into view [default for X axis]1700ImGuiScrollFlags_KeepVisibleEdgeY = 1 << 1, // If item is not visible: scroll as little as possible on Y axis to bring item back into view [default for Y axis for windows that are already visible]1701ImGuiScrollFlags_KeepVisibleCenterX = 1 << 2, // If item is not visible: scroll to make the item centered on X axis [rarely used]1702ImGuiScrollFlags_KeepVisibleCenterY = 1 << 3, // If item is not visible: scroll to make the item centered on Y axis1703ImGuiScrollFlags_AlwaysCenterX = 1 << 4, // Always center the result item on X axis [rarely used]1704ImGuiScrollFlags_AlwaysCenterY = 1 << 5, // Always center the result item on Y axis [default for Y axis for appearing window)1705ImGuiScrollFlags_NoScrollParent = 1 << 6, // Disable forwarding scrolling to parent window if required to keep item/rect visible (only scroll window the function was applied to).1706ImGuiScrollFlags_MaskX_ = ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_KeepVisibleCenterX | ImGuiScrollFlags_AlwaysCenterX,1707ImGuiScrollFlags_MaskY_ = ImGuiScrollFlags_KeepVisibleEdgeY | ImGuiScrollFlags_KeepVisibleCenterY | ImGuiScrollFlags_AlwaysCenterY,1708};17091710enum ImGuiNavRenderCursorFlags_1711{1712ImGuiNavRenderCursorFlags_None = 0,1713ImGuiNavRenderCursorFlags_Compact = 1 << 1, // Compact highlight, no padding/distance from focused item1714ImGuiNavRenderCursorFlags_AlwaysDraw = 1 << 2, // Draw rectangular highlight if (g.NavId == id) even when g.NavCursorVisible == false, aka even when using the mouse.1715ImGuiNavRenderCursorFlags_NoRounding = 1 << 3,1716#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS1717ImGuiNavHighlightFlags_None = ImGuiNavRenderCursorFlags_None, // Renamed in 1.91.41718ImGuiNavHighlightFlags_Compact = ImGuiNavRenderCursorFlags_Compact, // Renamed in 1.91.41719ImGuiNavHighlightFlags_AlwaysDraw = ImGuiNavRenderCursorFlags_AlwaysDraw, // Renamed in 1.91.41720ImGuiNavHighlightFlags_NoRounding = ImGuiNavRenderCursorFlags_NoRounding, // Renamed in 1.91.41721//ImGuiNavHighlightFlags_TypeThin = ImGuiNavRenderCursorFlags_Compact, // Renamed in 1.90.21722#endif1723};17241725enum ImGuiNavMoveFlags_1726{1727ImGuiNavMoveFlags_None = 0,1728ImGuiNavMoveFlags_LoopX = 1 << 0, // On failed request, restart from opposite side1729ImGuiNavMoveFlags_LoopY = 1 << 1,1730ImGuiNavMoveFlags_WrapX = 1 << 2, // On failed request, request from opposite side one line down (when NavDir==right) or one line up (when NavDir==left)1731ImGuiNavMoveFlags_WrapY = 1 << 3, // This is not super useful but provided for completeness1732ImGuiNavMoveFlags_WrapMask_ = ImGuiNavMoveFlags_LoopX | ImGuiNavMoveFlags_LoopY | ImGuiNavMoveFlags_WrapX | ImGuiNavMoveFlags_WrapY,1733ImGuiNavMoveFlags_AllowCurrentNavId = 1 << 4, // Allow scoring and considering the current NavId as a move target candidate. This is used when the move source is offset (e.g. pressing PageDown actually needs to send a Up move request, if we are pressing PageDown from the bottom-most item we need to stay in place)1734ImGuiNavMoveFlags_AlsoScoreVisibleSet = 1 << 5, // Store alternate result in NavMoveResultLocalVisible that only comprise elements that are already fully visible (used by PageUp/PageDown)1735ImGuiNavMoveFlags_ScrollToEdgeY = 1 << 6, // Force scrolling to min/max (used by Home/End) // FIXME-NAV: Aim to remove or reword as ImGuiScrollFlags1736ImGuiNavMoveFlags_Forwarded = 1 << 7,1737ImGuiNavMoveFlags_DebugNoResult = 1 << 8, // Dummy scoring for debug purpose, don't apply result1738ImGuiNavMoveFlags_FocusApi = 1 << 9, // Requests from focus API can land/focus/activate items even if they are marked with _NoTabStop (see NavProcessItemForTabbingRequest() for details)1739ImGuiNavMoveFlags_IsTabbing = 1 << 10, // == Focus + Activate if item is Inputable + DontChangeNavHighlight1740ImGuiNavMoveFlags_IsPageMove = 1 << 11, // Identify a PageDown/PageUp request.1741ImGuiNavMoveFlags_Activate = 1 << 12, // Activate/select target item.1742ImGuiNavMoveFlags_NoSelect = 1 << 13, // Don't trigger selection by not setting g.NavJustMovedTo1743ImGuiNavMoveFlags_NoSetNavCursorVisible = 1 << 14, // Do not alter the nav cursor visible state1744ImGuiNavMoveFlags_NoClearActiveId = 1 << 15, // (Experimental) Do not clear active id when applying move result1745};17461747enum ImGuiNavLayer1748{1749ImGuiNavLayer_Main = 0, // Main scrolling layer1750ImGuiNavLayer_Menu = 1, // Menu layer (access with Alt)1751ImGuiNavLayer_COUNT1752};17531754// Storage for navigation query/results1755struct ImGuiNavItemData1756{1757ImGuiWindow* Window; // Init,Move // Best candidate window (result->ItemWindow->RootWindowForNav == request->Window)1758ImGuiID ID; // Init,Move // Best candidate item ID1759ImGuiID FocusScopeId; // Init,Move // Best candidate focus scope ID1760ImRect RectRel; // Init,Move // Best candidate bounding box in window relative space1761ImGuiItemFlags ItemFlags; // ????,Move // Best candidate item flags1762float DistBox; // Move // Best candidate box distance to current NavId1763float DistCenter; // Move // Best candidate center distance to current NavId1764float DistAxial; // Move // Best candidate axial distance to current NavId1765ImGuiSelectionUserData SelectionUserData;//I+Mov // Best candidate SetNextItemSelectionUserData() value. Valid if (ItemFlags & ImGuiItemFlags_HasSelectionUserData)17661767ImGuiNavItemData() { Clear(); }1768void Clear() { Window = NULL; ID = FocusScopeId = 0; ItemFlags = 0; SelectionUserData = -1; DistBox = DistCenter = DistAxial = FLT_MAX; }1769};17701771// Storage for PushFocusScope(), g.FocusScopeStack[], g.NavFocusRoute[]1772struct ImGuiFocusScopeData1773{1774ImGuiID ID;1775ImGuiID WindowID;1776};17771778//-----------------------------------------------------------------------------1779// [SECTION] Typing-select support1780//-----------------------------------------------------------------------------17811782// Flags for GetTypingSelectRequest()1783enum ImGuiTypingSelectFlags_1784{1785ImGuiTypingSelectFlags_None = 0,1786ImGuiTypingSelectFlags_AllowBackspace = 1 << 0, // Backspace to delete character inputs. If using: ensure GetTypingSelectRequest() is not called more than once per frame (filter by e.g. focus state)1787ImGuiTypingSelectFlags_AllowSingleCharMode = 1 << 1, // Allow "single char" search mode which is activated when pressing the same character multiple times.1788};17891790// Returned by GetTypingSelectRequest(), designed to eventually be public.1791struct IMGUI_API ImGuiTypingSelectRequest1792{1793ImGuiTypingSelectFlags Flags; // Flags passed to GetTypingSelectRequest()1794int SearchBufferLen;1795const char* SearchBuffer; // Search buffer contents (use full string. unless SingleCharMode is set, in which case use SingleCharSize).1796bool SelectRequest; // Set when buffer was modified this frame, requesting a selection.1797bool SingleCharMode; // Notify when buffer contains same character repeated, to implement special mode. In this situation it preferred to not display any on-screen search indication.1798ImS8 SingleCharSize; // Length in bytes of first letter codepoint (1 for ascii, 2-4 for UTF-8). If (SearchBufferLen==RepeatCharSize) only 1 letter has been input.1799};18001801// Storage for GetTypingSelectRequest()1802struct IMGUI_API ImGuiTypingSelectState1803{1804ImGuiTypingSelectRequest Request; // User-facing data1805char SearchBuffer[64]; // Search buffer: no need to make dynamic as this search is very transient.1806ImGuiID FocusScope;1807int LastRequestFrame = 0;1808float LastRequestTime = 0.0f;1809bool SingleCharModeLock = false; // After a certain single char repeat count we lock into SingleCharMode. Two benefits: 1) buffer never fill, 2) we can provide an immediate SingleChar mode without timer elapsing.18101811ImGuiTypingSelectState() { memset(this, 0, sizeof(*this)); }1812void Clear() { SearchBuffer[0] = 0; SingleCharModeLock = false; } // We preserve remaining data for easier debugging1813};18141815//-----------------------------------------------------------------------------1816// [SECTION] Columns support1817//-----------------------------------------------------------------------------18181819// Flags for internal's BeginColumns(). This is an obsolete API. Prefer using BeginTable() nowadays!1820enum ImGuiOldColumnFlags_1821{1822ImGuiOldColumnFlags_None = 0,1823ImGuiOldColumnFlags_NoBorder = 1 << 0, // Disable column dividers1824ImGuiOldColumnFlags_NoResize = 1 << 1, // Disable resizing columns when clicking on the dividers1825ImGuiOldColumnFlags_NoPreserveWidths = 1 << 2, // Disable column width preservation when adjusting columns1826ImGuiOldColumnFlags_NoForceWithinWindow = 1 << 3, // Disable forcing columns to fit within window1827ImGuiOldColumnFlags_GrowParentContentsSize = 1 << 4, // Restore pre-1.51 behavior of extending the parent window contents size but _without affecting the columns width at all_. Will eventually remove.18281829// Obsolete names (will be removed)1830#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS1831//ImGuiColumnsFlags_None = ImGuiOldColumnFlags_None,1832//ImGuiColumnsFlags_NoBorder = ImGuiOldColumnFlags_NoBorder,1833//ImGuiColumnsFlags_NoResize = ImGuiOldColumnFlags_NoResize,1834//ImGuiColumnsFlags_NoPreserveWidths = ImGuiOldColumnFlags_NoPreserveWidths,1835//ImGuiColumnsFlags_NoForceWithinWindow = ImGuiOldColumnFlags_NoForceWithinWindow,1836//ImGuiColumnsFlags_GrowParentContentsSize = ImGuiOldColumnFlags_GrowParentContentsSize,1837#endif1838};18391840struct ImGuiOldColumnData1841{1842float OffsetNorm; // Column start offset, normalized 0.0 (far left) -> 1.0 (far right)1843float OffsetNormBeforeResize;1844ImGuiOldColumnFlags Flags; // Not exposed1845ImRect ClipRect;18461847ImGuiOldColumnData() { memset(this, 0, sizeof(*this)); }1848};18491850struct ImGuiOldColumns1851{1852ImGuiID ID;1853ImGuiOldColumnFlags Flags;1854bool IsFirstFrame;1855bool IsBeingResized;1856int Current;1857int Count;1858float OffMinX, OffMaxX; // Offsets from HostWorkRect.Min.x1859float LineMinY, LineMaxY;1860float HostCursorPosY; // Backup of CursorPos at the time of BeginColumns()1861float HostCursorMaxPosX; // Backup of CursorMaxPos at the time of BeginColumns()1862ImRect HostInitialClipRect; // Backup of ClipRect at the time of BeginColumns()1863ImRect HostBackupClipRect; // Backup of ClipRect during PushColumnsBackground()/PopColumnsBackground()1864ImRect HostBackupParentWorkRect;//Backup of WorkRect at the time of BeginColumns()1865ImVector<ImGuiOldColumnData> Columns;1866ImDrawListSplitter Splitter;18671868ImGuiOldColumns() { memset(this, 0, sizeof(*this)); }1869};18701871//-----------------------------------------------------------------------------1872// [SECTION] Box-select support1873//-----------------------------------------------------------------------------18741875struct ImGuiBoxSelectState1876{1877// Active box-selection data (persistent, 1 active at a time)1878ImGuiID ID;1879bool IsActive;1880bool IsStarting;1881bool IsStartedFromVoid; // Starting click was not from an item.1882bool IsStartedSetNavIdOnce;1883bool RequestClear;1884ImGuiKeyChord KeyMods : 16; // Latched key-mods for box-select logic.1885ImVec2 StartPosRel; // Start position in window-contents relative space (to support scrolling)1886ImVec2 EndPosRel; // End position in window-contents relative space1887ImVec2 ScrollAccum; // Scrolling accumulator (to behave at high-frame spaces)1888ImGuiWindow* Window;18891890// Temporary/Transient data1891bool UnclipMode; // (Temp/Transient, here in hot area). Set/cleared by the BeginMultiSelect()/EndMultiSelect() owning active box-select.1892ImRect UnclipRect; // Rectangle where ItemAdd() clipping may be temporarily disabled. Need support by multi-select supporting widgets.1893ImRect BoxSelectRectPrev; // Selection rectangle in absolute coordinates (derived every frame from BoxSelectStartPosRel and MousePos)1894ImRect BoxSelectRectCurr;18951896ImGuiBoxSelectState() { memset(this, 0, sizeof(*this)); }1897};18981899//-----------------------------------------------------------------------------1900// [SECTION] Multi-select support1901//-----------------------------------------------------------------------------19021903// We always assume that -1 is an invalid value (which works for indices and pointers)1904#define ImGuiSelectionUserData_Invalid ((ImGuiSelectionUserData)-1)19051906// Temporary storage for multi-select1907struct IMGUI_API ImGuiMultiSelectTempData1908{1909ImGuiMultiSelectIO IO; // MUST BE FIRST FIELD. Requests are set and returned by BeginMultiSelect()/EndMultiSelect() + written to by user during the loop.1910ImGuiMultiSelectState* Storage;1911ImGuiID FocusScopeId; // Copied from g.CurrentFocusScopeId (unless another selection scope was pushed manually)1912ImGuiMultiSelectFlags Flags;1913ImVec2 ScopeRectMin;1914ImVec2 BackupCursorMaxPos;1915ImGuiSelectionUserData LastSubmittedItem; // Copy of last submitted item data, used to merge output ranges.1916ImGuiID BoxSelectId;1917ImGuiKeyChord KeyMods;1918ImS8 LoopRequestSetAll; // -1: no operation, 0: clear all, 1: select all.1919bool IsEndIO; // Set when switching IO from BeginMultiSelect() to EndMultiSelect() state.1920bool IsFocused; // Set if currently focusing the selection scope (any item of the selection). May be used if you have custom shortcut associated to selection.1921bool IsKeyboardSetRange; // Set by BeginMultiSelect() when using Shift+Navigation. Because scrolling may be affected we can't afford a frame of lag with Shift+Navigation.1922bool NavIdPassedBy;1923bool RangeSrcPassedBy; // Set by the item that matches RangeSrcItem.1924bool RangeDstPassedBy; // Set by the item that matches NavJustMovedToId when IsSetRange is set.19251926ImGuiMultiSelectTempData() { Clear(); }1927void Clear() { size_t io_sz = sizeof(IO); ClearIO(); memset((void*)(&IO + 1), 0, sizeof(*this) - io_sz); } // Zero-clear except IO as we preserve IO.Requests[] buffer allocation.1928void ClearIO() { IO.Requests.resize(0); IO.RangeSrcItem = IO.NavIdItem = ImGuiSelectionUserData_Invalid; IO.NavIdSelected = IO.RangeSrcReset = false; }1929};19301931// Persistent storage for multi-select (as long as selection is alive)1932struct IMGUI_API ImGuiMultiSelectState1933{1934ImGuiWindow* Window;1935ImGuiID ID;1936int LastFrameActive; // Last used frame-count, for GC.1937int LastSelectionSize; // Set by BeginMultiSelect() based on optional info provided by user. May be -1 if unknown.1938ImS8 RangeSelected; // -1 (don't have) or true/false1939ImS8 NavIdSelected; // -1 (don't have) or true/false1940ImGuiSelectionUserData RangeSrcItem; //1941ImGuiSelectionUserData NavIdItem; // SetNextItemSelectionUserData() value for NavId (if part of submitted items)19421943ImGuiMultiSelectState() { Window = NULL; ID = 0; LastFrameActive = LastSelectionSize = 0; RangeSelected = NavIdSelected = -1; RangeSrcItem = NavIdItem = ImGuiSelectionUserData_Invalid; }1944};19451946//-----------------------------------------------------------------------------1947// [SECTION] Docking support1948//-----------------------------------------------------------------------------19491950#ifdef IMGUI_HAS_DOCK1951// <this is filled in 'docking' branch>1952#endif // #ifdef IMGUI_HAS_DOCK19531954//-----------------------------------------------------------------------------1955// [SECTION] Viewport support1956//-----------------------------------------------------------------------------19571958// ImGuiViewport Private/Internals fields (cardinal sin: we are using inheritance!)1959// Every instance of ImGuiViewport is in fact a ImGuiViewportP.1960struct ImGuiViewportP : public ImGuiViewport1961{1962int BgFgDrawListsLastFrame[2]; // Last frame number the background (0) and foreground (1) draw lists were used1963ImDrawList* BgFgDrawLists[2]; // Convenience background (0) and foreground (1) draw lists. We use them to draw software mouser cursor when io.MouseDrawCursor is set and to draw most debug overlays.1964ImDrawData DrawDataP;1965ImDrawDataBuilder DrawDataBuilder; // Temporary data while building final ImDrawData19661967// Per-viewport work area1968// - Insets are >= 0.0f values, distance from viewport corners to work area.1969// - BeginMainMenuBar() and DockspaceOverViewport() tend to use work area to avoid stepping over existing contents.1970// - Generally 'safeAreaInsets' in iOS land, 'DisplayCutout' in Android land.1971ImVec2 WorkInsetMin; // Work Area inset locked for the frame. GetWorkRect() always fits within GetMainRect().1972ImVec2 WorkInsetMax; // "1973ImVec2 BuildWorkInsetMin; // Work Area inset accumulator for current frame, to become next frame's WorkInset1974ImVec2 BuildWorkInsetMax; // "19751976ImGuiViewportP() { BgFgDrawListsLastFrame[0] = BgFgDrawListsLastFrame[1] = -1; BgFgDrawLists[0] = BgFgDrawLists[1] = NULL; }1977~ImGuiViewportP() { if (BgFgDrawLists[0]) IM_DELETE(BgFgDrawLists[0]); if (BgFgDrawLists[1]) IM_DELETE(BgFgDrawLists[1]); }19781979// Calculate work rect pos/size given a set of offset (we have 1 pair of offset for rect locked from last frame data, and 1 pair for currently building rect)1980ImVec2 CalcWorkRectPos(const ImVec2& inset_min) const { return ImVec2(Pos.x + inset_min.x, Pos.y + inset_min.y); }1981ImVec2 CalcWorkRectSize(const ImVec2& inset_min, const ImVec2& inset_max) const { return ImVec2(ImMax(0.0f, Size.x - inset_min.x - inset_max.x), ImMax(0.0f, Size.y - inset_min.y - inset_max.y)); }1982void UpdateWorkRect() { WorkPos = CalcWorkRectPos(WorkInsetMin); WorkSize = CalcWorkRectSize(WorkInsetMin, WorkInsetMax); } // Update public fields19831984// Helpers to retrieve ImRect (we don't need to store BuildWorkRect as every access tend to change it, hence the code asymmetry)1985ImRect GetMainRect() const { return ImRect(Pos.x, Pos.y, Pos.x + Size.x, Pos.y + Size.y); }1986ImRect GetWorkRect() const { return ImRect(WorkPos.x, WorkPos.y, WorkPos.x + WorkSize.x, WorkPos.y + WorkSize.y); }1987ImRect GetBuildWorkRect() const { ImVec2 pos = CalcWorkRectPos(BuildWorkInsetMin); ImVec2 size = CalcWorkRectSize(BuildWorkInsetMin, BuildWorkInsetMax); return ImRect(pos.x, pos.y, pos.x + size.x, pos.y + size.y); }1988};19891990//-----------------------------------------------------------------------------1991// [SECTION] Settings support1992//-----------------------------------------------------------------------------19931994// Windows data saved in imgui.ini file1995// Because we never destroy or rename ImGuiWindowSettings, we can store the names in a separate buffer easily.1996// (this is designed to be stored in a ImChunkStream buffer, with the variable-length Name following our structure)1997struct ImGuiWindowSettings1998{1999ImGuiID ID;2000ImVec2ih Pos;2001ImVec2ih Size;2002bool Collapsed;2003bool IsChild;2004bool WantApply; // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context)2005bool WantDelete; // Set to invalidate/delete the settings entry20062007ImGuiWindowSettings() { memset(this, 0, sizeof(*this)); }2008char* GetName() { return (char*)(this + 1); }2009};20102011struct ImGuiSettingsHandler2012{2013const char* TypeName; // Short description stored in .ini file. Disallowed characters: '[' ']'2014ImGuiID TypeHash; // == ImHashStr(TypeName)2015void (*ClearAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Clear all settings data2016void (*ReadInitFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Read: Called before reading (in registration order)2017void* (*ReadOpenFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, const char* name); // Read: Called when entering into a new ini entry e.g. "[Window][Name]"2018void (*ReadLineFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, void* entry, const char* line); // Read: Called for every line of text within an ini entry2019void (*ApplyAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Read: Called after reading (in registration order)2020void (*WriteAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* out_buf); // Write: Output every entries into 'out_buf'2021void* UserData;20222023ImGuiSettingsHandler() { memset(this, 0, sizeof(*this)); }2024};20252026//-----------------------------------------------------------------------------2027// [SECTION] Localization support2028//-----------------------------------------------------------------------------20292030// This is experimental and not officially supported, it'll probably fall short of features, if/when it does we may backtrack.2031enum ImGuiLocKey : int2032{2033ImGuiLocKey_VersionStr,2034ImGuiLocKey_TableSizeOne,2035ImGuiLocKey_TableSizeAllFit,2036ImGuiLocKey_TableSizeAllDefault,2037ImGuiLocKey_TableResetOrder,2038ImGuiLocKey_WindowingMainMenuBar,2039ImGuiLocKey_WindowingPopup,2040ImGuiLocKey_WindowingUntitled,2041ImGuiLocKey_OpenLink_s,2042ImGuiLocKey_CopyLink,2043ImGuiLocKey_COUNT2044};20452046struct ImGuiLocEntry2047{2048ImGuiLocKey Key;2049const char* Text;2050};20512052//-----------------------------------------------------------------------------2053// [SECTION] Error handling, State recovery support2054//-----------------------------------------------------------------------------20552056// Macros used by Recoverable Error handling2057// - Only dispatch error if _EXPR: evaluate as assert (similar to an assert macro).2058// - The message will always be a string literal, in order to increase likelihood of being display by an assert handler.2059// - See 'Demo->Configuration->Error Handling' and ImGuiIO definitions for details on error handling.2060// - Read https://github.com/ocornut/imgui/wiki/Error-Handling for details on error handling.2061#ifndef IM_ASSERT_USER_ERROR2062#define IM_ASSERT_USER_ERROR(_EXPR,_MSG) do { if (!(_EXPR) && ImGui::ErrorLog(_MSG)) { IM_ASSERT((_EXPR) && _MSG); } } while (0) // Recoverable User Error2063#endif20642065// The error callback is currently not public, as it is expected that only advanced users will rely on it.2066typedef void (*ImGuiErrorCallback)(ImGuiContext* ctx, void* user_data, const char* msg); // Function signature for g.ErrorCallback20672068//-----------------------------------------------------------------------------2069// [SECTION] Metrics, Debug Tools2070//-----------------------------------------------------------------------------20712072// See IMGUI_DEBUG_LOG() and IMGUI_DEBUG_LOG_XXX() macros.2073enum ImGuiDebugLogFlags_2074{2075// Event types2076ImGuiDebugLogFlags_None = 0,2077ImGuiDebugLogFlags_EventError = 1 << 0, // Error submitted by IM_ASSERT_USER_ERROR()2078ImGuiDebugLogFlags_EventActiveId = 1 << 1,2079ImGuiDebugLogFlags_EventFocus = 1 << 2,2080ImGuiDebugLogFlags_EventPopup = 1 << 3,2081ImGuiDebugLogFlags_EventNav = 1 << 4,2082ImGuiDebugLogFlags_EventClipper = 1 << 5,2083ImGuiDebugLogFlags_EventSelection = 1 << 6,2084ImGuiDebugLogFlags_EventIO = 1 << 7,2085ImGuiDebugLogFlags_EventFont = 1 << 8,2086ImGuiDebugLogFlags_EventInputRouting = 1 << 9,2087ImGuiDebugLogFlags_EventDocking = 1 << 10, // Unused in this branch2088ImGuiDebugLogFlags_EventViewport = 1 << 11, // Unused in this branch20892090ImGuiDebugLogFlags_EventMask_ = ImGuiDebugLogFlags_EventError | ImGuiDebugLogFlags_EventActiveId | ImGuiDebugLogFlags_EventFocus | ImGuiDebugLogFlags_EventPopup | ImGuiDebugLogFlags_EventNav | ImGuiDebugLogFlags_EventClipper | ImGuiDebugLogFlags_EventSelection | ImGuiDebugLogFlags_EventIO | ImGuiDebugLogFlags_EventFont | ImGuiDebugLogFlags_EventInputRouting | ImGuiDebugLogFlags_EventDocking | ImGuiDebugLogFlags_EventViewport,2091ImGuiDebugLogFlags_OutputToTTY = 1 << 20, // Also send output to TTY2092ImGuiDebugLogFlags_OutputToDebugger = 1 << 21, // Also send output to Debugger Console [Windows only]2093ImGuiDebugLogFlags_OutputToTestEngine = 1 << 22, // Also send output to Dear ImGui Test Engine2094};20952096struct ImGuiDebugAllocEntry2097{2098int FrameCount;2099ImS16 AllocCount;2100ImS16 FreeCount;2101};21022103struct ImGuiDebugAllocInfo2104{2105int TotalAllocCount; // Number of call to MemAlloc().2106int TotalFreeCount;2107ImS16 LastEntriesIdx; // Current index in buffer2108ImGuiDebugAllocEntry LastEntriesBuf[6]; // Track last 6 frames that had allocations21092110ImGuiDebugAllocInfo() { memset(this, 0, sizeof(*this)); }2111};21122113struct ImGuiMetricsConfig2114{2115bool ShowDebugLog = false;2116bool ShowIDStackTool = false;2117bool ShowWindowsRects = false;2118bool ShowWindowsBeginOrder = false;2119bool ShowTablesRects = false;2120bool ShowDrawCmdMesh = true;2121bool ShowDrawCmdBoundingBoxes = true;2122bool ShowTextEncodingViewer = false;2123bool ShowTextureUsedRect = false;2124int ShowWindowsRectsType = -1;2125int ShowTablesRectsType = -1;2126int HighlightMonitorIdx = -1;2127ImGuiID HighlightViewportID = 0;2128bool ShowFontPreview = true;2129};21302131struct ImGuiStackLevelInfo2132{2133ImGuiID ID;2134ImS8 QueryFrameCount; // >= 1: Sub-query in progress2135bool QuerySuccess; // Sub-query obtained result from DebugHookIdInfo()2136ImS8 DataType; // ImGuiDataType2137int DescOffset; // -1 or offset into parent's ResultsPathsBuf21382139ImGuiStackLevelInfo() { memset(this, 0, sizeof(*this)); DataType = -1; DescOffset = -1; }2140};21412142struct ImGuiDebugItemPathQuery2143{2144ImGuiID MainID; // ID to query details for.2145bool Active; // Used to disambiguate the case when ID == 0 and e.g. some code calls PushOverrideID(0).2146bool Complete; // All sub-queries are finished (some may have failed).2147ImS8 Step; // -1: query stack + init Results, >= 0: filling individual stack level.2148ImVector<ImGuiStackLevelInfo> Results;2149ImGuiTextBuffer ResultsDescBuf;2150ImGuiTextBuffer ResultPathBuf;21512152ImGuiDebugItemPathQuery() { memset(this, 0, sizeof(*this)); }2153};21542155// State for ID Stack tool queries2156struct ImGuiIDStackTool2157{2158bool OptHexEncodeNonAsciiChars;2159bool OptCopyToClipboardOnCtrlC;2160int LastActiveFrame;2161float CopyToClipboardLastTime;21622163ImGuiIDStackTool() { memset(this, 0, sizeof(*this)); LastActiveFrame = -1; OptHexEncodeNonAsciiChars = true; CopyToClipboardLastTime = -FLT_MAX; }2164};21652166//-----------------------------------------------------------------------------2167// [SECTION] Generic context hooks2168//-----------------------------------------------------------------------------21692170typedef void (*ImGuiContextHookCallback)(ImGuiContext* ctx, ImGuiContextHook* hook);2171enum ImGuiContextHookType { ImGuiContextHookType_NewFramePre, ImGuiContextHookType_NewFramePost, ImGuiContextHookType_EndFramePre, ImGuiContextHookType_EndFramePost, ImGuiContextHookType_RenderPre, ImGuiContextHookType_RenderPost, ImGuiContextHookType_Shutdown, ImGuiContextHookType_PendingRemoval_ };21722173struct ImGuiContextHook2174{2175ImGuiID HookId; // A unique ID assigned by AddContextHook()2176ImGuiContextHookType Type;2177ImGuiID Owner;2178ImGuiContextHookCallback Callback;2179void* UserData;21802181ImGuiContextHook() { memset(this, 0, sizeof(*this)); }2182};21832184//-----------------------------------------------------------------------------2185// [SECTION] ImGuiContext (main Dear ImGui context)2186//-----------------------------------------------------------------------------21872188struct ImGuiContext2189{2190bool Initialized;2191bool WithinFrameScope; // Set by NewFrame(), cleared by EndFrame()2192bool WithinFrameScopeWithImplicitWindow; // Set by NewFrame(), cleared by EndFrame() when the implicit debug window has been pushed2193bool TestEngineHookItems; // Will call test engine hooks: ImGuiTestEngineHook_ItemAdd(), ImGuiTestEngineHook_ItemInfo(), ImGuiTestEngineHook_Log()2194int FrameCount;2195int FrameCountEnded;2196int FrameCountRendered;2197double Time;2198char ContextName[16]; // Storage for a context name (to facilitate debugging multi-context setups)2199ImGuiIO IO;2200ImGuiPlatformIO PlatformIO;2201ImGuiStyle Style;2202ImVector<ImFontAtlas*> FontAtlases; // List of font atlases used by the context (generally only contains g.IO.Fonts aka the main font atlas)2203ImFont* Font; // Currently bound font. (== FontStack.back().Font)2204ImFontBaked* FontBaked; // Currently bound font at currently bound size. (== Font->GetFontBaked(FontSize))2205float FontSize; // Currently bound font size == line height (== FontSizeBase + externals scales applied in the UpdateCurrentFontSize() function).2206float FontSizeBase; // Font size before scaling == style.FontSizeBase == value passed to PushFont() when specified.2207float FontBakedScale; // == FontBaked->Size / FontSize. Scale factor over baked size. Rarely used nowadays, very often == 1.0f.2208float FontRasterizerDensity; // Current font density. Used by all calls to GetFontBaked().2209float FontWeight;2210float CurrentDpiScale; // Current window/viewport DpiScale == CurrentViewport->DpiScale2211ImDrawListSharedData DrawListSharedData;2212ImGuiID WithinEndChildID; // Set within EndChild()2213void* TestEngine; // Test engine user data22142215// Inputs2216ImVector<ImGuiInputEvent> InputEventsQueue; // Input events which will be trickled/written into IO structure.2217ImVector<ImGuiInputEvent> InputEventsTrail; // Past input events processed in NewFrame(). This is to allow domain-specific application to access e.g mouse/pen trail.2218ImGuiMouseSource InputEventsNextMouseSource;2219ImU32 InputEventsNextEventId;22202221// Windows state2222ImVector<ImGuiWindow*> Windows; // Windows, sorted in display order, back to front2223ImVector<ImGuiWindow*> WindowsFocusOrder; // Root windows, sorted in focus order, back to front.2224ImVector<ImGuiWindow*> WindowsTempSortBuffer; // Temporary buffer used in EndFrame() to reorder windows so parents are kept before their child2225ImVector<ImGuiWindowStackData> CurrentWindowStack;2226ImGuiStorage WindowsById; // Map window's ImGuiID to ImGuiWindow*2227int WindowsActiveCount; // Number of unique windows submitted by frame2228float WindowsBorderHoverPadding; // Padding around resizable windows for which hovering on counts as hovering the window == ImMax(style.TouchExtraPadding, style.WindowBorderHoverPadding). This isn't so multi-dpi friendly.2229ImGuiID DebugBreakInWindow; // Set to break in Begin() call.2230ImGuiWindow* CurrentWindow; // Window being drawn into2231ImGuiWindow* HoveredWindow; // Window the mouse is hovering. Will typically catch mouse inputs.2232ImGuiWindow* HoveredWindowUnderMovingWindow; // Hovered window ignoring MovingWindow. Only set if MovingWindow is set.2233ImGuiWindow* HoveredWindowBeforeClear; // Window the mouse is hovering. Filled even with _NoMouse. This is currently useful for multi-context compositors.2234ImGuiWindow* MovingWindow; // Track the window we clicked on (in order to preserve focus). The actual window that is moved is generally MovingWindow->RootWindow.2235ImGuiWindow* WheelingWindow; // Track the window we started mouse-wheeling on. Until a timer elapse or mouse has moved, generally keep scrolling the same window even if during the course of scrolling the mouse ends up hovering a child window.2236ImVec2 WheelingWindowRefMousePos;2237int WheelingWindowStartFrame; // This may be set one frame before WheelingWindow is != NULL2238int WheelingWindowScrolledFrame;2239float WheelingWindowReleaseTimer;2240ImVec2 WheelingWindowWheelRemainder;2241ImVec2 WheelingAxisAvg;22422243// Item/widgets state and tracking information2244ImGuiID DebugDrawIdConflictsId; // Set when we detect multiple items with the same identifier2245ImGuiID DebugHookIdInfoId; // Will call core hooks: DebugHookIdInfo() from GetID functions, used by ID Stack Tool [next HoveredId/ActiveId to not pull in an extra cache-line]2246ImGuiID HoveredId; // Hovered widget, filled during the frame2247ImGuiID HoveredIdPreviousFrame;2248int HoveredIdPreviousFrameItemCount; // Count numbers of items using the same ID as last frame's hovered id2249float HoveredIdTimer; // Measure contiguous hovering time2250float HoveredIdNotActiveTimer; // Measure contiguous hovering time where the item has not been active2251bool HoveredIdAllowOverlap;2252bool HoveredIdIsDisabled; // At least one widget passed the rect test, but has been discarded by disabled flag or popup inhibit. May be true even if HoveredId == 0.2253bool ItemUnclipByLog; // Disable ItemAdd() clipping, essentially a memory-locality friendly copy of LogEnabled2254ImGuiID ActiveId; // Active widget2255ImGuiID ActiveIdIsAlive; // Active widget has been seen this frame (we can't use a bool as the ActiveId may change within the frame)2256float ActiveIdTimer;2257bool ActiveIdIsJustActivated; // Set at the time of activation for one frame2258bool ActiveIdAllowOverlap; // Active widget allows another widget to steal active id (generally for overlapping widgets, but not always)2259bool ActiveIdNoClearOnFocusLoss; // Disable losing active id if the active id window gets unfocused.2260bool ActiveIdHasBeenPressedBefore; // Track whether the active id led to a press (this is to allow changing between PressOnClick and PressOnRelease without pressing twice). Used by range_select branch.2261bool ActiveIdHasBeenEditedBefore; // Was the value associated to the widget Edited over the course of the Active state.2262bool ActiveIdHasBeenEditedThisFrame;2263bool ActiveIdFromShortcut;2264ImS8 ActiveIdMouseButton;2265ImGuiID ActiveIdDisabledId; // When clicking a disabled item we set ActiveId=window->MoveId to avoid interference with widget code. Actual item ID is stored here.2266ImVec2 ActiveIdClickOffset; // Clicked offset from upper-left corner, if applicable (currently only set by ButtonBehavior)2267ImGuiInputSource ActiveIdSource; // Activating source: ImGuiInputSource_Mouse OR ImGuiInputSource_Keyboard OR ImGuiInputSource_Gamepad2268ImGuiWindow* ActiveIdWindow;2269ImGuiID ActiveIdPreviousFrame;2270ImGuiDeactivatedItemData DeactivatedItemData;2271ImGuiDataTypeStorage ActiveIdValueOnActivation; // Backup of initial value at the time of activation. ONLY SET BY SPECIFIC WIDGETS: DragXXX and SliderXXX.2272ImGuiID LastActiveId; // Store the last non-zero ActiveId, useful for animation.2273float LastActiveIdTimer; // Store the last non-zero ActiveId timer since the beginning of activation, useful for animation.22742275// Key/Input Ownership + Shortcut Routing system2276// - The idea is that instead of "eating" a given key, we can link to an owner.2277// - Input query can then read input by specifying ImGuiKeyOwner_Any (== 0), ImGuiKeyOwner_NoOwner (== -1) or a custom ID.2278// - Routing is requested ahead of time for a given chord (Key + Mods) and granted in NewFrame().2279double LastKeyModsChangeTime; // Record the last time key mods changed (affect repeat delay when using shortcut logic)2280double LastKeyModsChangeFromNoneTime; // Record the last time key mods changed away from being 0 (affect repeat delay when using shortcut logic)2281double LastKeyboardKeyPressTime; // Record the last time a keyboard key (ignore mouse/gamepad ones) was pressed.2282ImBitArrayForNamedKeys KeysMayBeCharInput; // Lookup to tell if a key can emit char input, see IsKeyChordPotentiallyCharInput(). sizeof() = 20 bytes2283ImGuiKeyOwnerData KeysOwnerData[ImGuiKey_NamedKey_COUNT];2284ImGuiKeyRoutingTable KeysRoutingTable;2285ImU32 ActiveIdUsingNavDirMask; // Active widget will want to read those nav move requests (e.g. can activate a button and move away from it)2286bool ActiveIdUsingAllKeyboardKeys; // Active widget will want to read all keyboard keys inputs. (this is a shortcut for not taking ownership of 100+ keys, frequently used by drag operations)2287ImGuiKeyChord DebugBreakInShortcutRouting; // Set to break in SetShortcutRouting()/Shortcut() calls.2288//ImU32 ActiveIdUsingNavInputMask; // [OBSOLETE] Since (IMGUI_VERSION_NUM >= 18804) : 'g.ActiveIdUsingNavInputMask |= (1 << ImGuiNavInput_Cancel);' becomes --> 'SetKeyOwner(ImGuiKey_Escape, g.ActiveId) and/or SetKeyOwner(ImGuiKey_NavGamepadCancel, g.ActiveId);'22892290// Next window/item data2291ImGuiID CurrentFocusScopeId; // Value for currently appending items == g.FocusScopeStack.back(). Not to be mistaken with g.NavFocusScopeId.2292ImGuiItemFlags CurrentItemFlags; // Value for currently appending items == g.ItemFlagsStack.back()2293ImGuiID DebugLocateId; // Storage for DebugLocateItemOnHover() feature: this is read by ItemAdd() so we keep it in a hot/cached location2294ImGuiNextItemData NextItemData; // Storage for SetNextItem** functions2295ImGuiLastItemData LastItemData; // Storage for last submitted item (setup by ItemAdd)2296ImGuiNextWindowData NextWindowData; // Storage for SetNextWindow** functions2297bool DebugShowGroupRects;2298bool GcCompactAll; // Request full GC22992300// Shared stacks2301ImGuiCol DebugFlashStyleColorIdx; // (Keep close to ColorStack to share cache line)2302ImVector<ImGuiColorMod> ColorStack; // Stack for PushStyleColor()/PopStyleColor() - inherited by Begin()2303ImVector<ImGuiStyleMod> StyleVarStack; // Stack for PushStyleVar()/PopStyleVar() - inherited by Begin()2304ImVector<ImFontStackData> FontStack; // Stack for PushFont()/PopFont() - inherited by Begin()2305ImVector<ImGuiFocusScopeData> FocusScopeStack; // Stack for PushFocusScope()/PopFocusScope() - inherited by BeginChild(), pushed into by Begin()2306ImVector<ImGuiItemFlags> ItemFlagsStack; // Stack for PushItemFlag()/PopItemFlag() - inherited by Begin()2307ImVector<ImGuiGroupData> GroupStack; // Stack for BeginGroup()/EndGroup() - not inherited by Begin()2308ImVector<ImGuiPopupData> OpenPopupStack; // Which popups are open (persistent)2309ImVector<ImGuiPopupData> BeginPopupStack; // Which level of BeginPopup() we are in (reset every frame)2310ImVector<ImGuiTreeNodeStackData>TreeNodeStack; // Stack for TreeNode()23112312// Viewports2313ImVector<ImGuiViewportP*> Viewports; // Active viewports (Size==1 in 'master' branch). Each viewports hold their copy of ImDrawData.23142315// Keyboard/Gamepad Navigation2316bool NavCursorVisible; // Nav focus cursor/rectangle is visible? We hide it after a mouse click. We show it after a nav move.2317bool NavHighlightItemUnderNav; // Disable mouse hovering highlight. Highlight navigation focused item instead of mouse hovered item.2318//bool NavDisableHighlight; // Old name for !g.NavCursorVisible before 1.91.4 (2024/10/18). OPPOSITE VALUE (g.NavDisableHighlight == !g.NavCursorVisible)2319//bool NavDisableMouseHover; // Old name for g.NavHighlightItemUnderNav before 1.91.1 (2024/10/18) this was called When user starts using keyboard/gamepad, we hide mouse hovering highlight until mouse is touched again.2320bool NavMousePosDirty; // When set we will update mouse position if io.ConfigNavMoveSetMousePos is set (not enabled by default)2321bool NavIdIsAlive; // Nav widget has been seen this frame ~~ NavRectRel is valid2322ImGuiID NavId; // Focused item for navigation2323ImGuiWindow* NavWindow; // Focused window for navigation. Could be called 'FocusedWindow'2324ImGuiID NavFocusScopeId; // Focused focus scope (e.g. selection code often wants to "clear other items" when landing on an item of the same scope)2325ImGuiNavLayer NavLayer; // Focused layer (main scrolling layer, or menu/title bar layer)2326ImGuiID NavActivateId; // ~~ (g.ActiveId == 0) && (IsKeyPressed(ImGuiKey_Space) || IsKeyDown(ImGuiKey_Enter) || IsKeyPressed(ImGuiKey_NavGamepadActivate)) ? NavId : 0, also set when calling ActivateItemByID()2327ImGuiID NavActivateDownId; // ~~ IsKeyDown(ImGuiKey_Space) || IsKeyDown(ImGuiKey_Enter) || IsKeyDown(ImGuiKey_NavGamepadActivate) ? NavId : 02328ImGuiID NavActivatePressedId; // ~~ IsKeyPressed(ImGuiKey_Space) || IsKeyPressed(ImGuiKey_Enter) || IsKeyPressed(ImGuiKey_NavGamepadActivate) ? NavId : 0 (no repeat)2329ImGuiActivateFlags NavActivateFlags;2330ImVector<ImGuiFocusScopeData> NavFocusRoute; // Reversed copy focus scope stack for NavId (should contains NavFocusScopeId). This essentially follow the window->ParentWindowForFocusRoute chain.2331ImGuiID NavHighlightActivatedId;2332float NavHighlightActivatedTimer;2333ImGuiID NavNextActivateId; // Set by ActivateItemByID(), queued until next frame.2334ImGuiActivateFlags NavNextActivateFlags;2335ImGuiInputSource NavInputSource; // Keyboard or Gamepad mode? THIS CAN ONLY BE ImGuiInputSource_Keyboard or ImGuiInputSource_Gamepad2336ImGuiSelectionUserData NavLastValidSelectionUserData; // Last valid data passed to SetNextItemSelectionUser(), or -1. For current window. Not reset when focusing an item that doesn't have selection data.2337ImS8 NavCursorHideFrames;2338//ImGuiID NavActivateInputId; // Removed in 1.89.4 (July 2023). This is now part of g.NavActivateId and sets g.NavActivateFlags |= ImGuiActivateFlags_PreferInput. See commit c9a53aa74, issue #5606.23392340// Navigation: Init & Move Requests2341bool NavAnyRequest; // ~~ NavMoveRequest || NavInitRequest this is to perform early out in ItemAdd()2342bool NavInitRequest; // Init request for appearing window to select first item2343bool NavInitRequestFromMove;2344ImGuiNavItemData NavInitResult; // Init request result (first item of the window, or one for which SetItemDefaultFocus() was called)2345bool NavMoveSubmitted; // Move request submitted, will process result on next NewFrame()2346bool NavMoveScoringItems; // Move request submitted, still scoring incoming items2347bool NavMoveForwardToNextFrame;2348ImGuiNavMoveFlags NavMoveFlags;2349ImGuiScrollFlags NavMoveScrollFlags;2350ImGuiKeyChord NavMoveKeyMods;2351ImGuiDir NavMoveDir; // Direction of the move request (left/right/up/down)2352ImGuiDir NavMoveDirForDebug;2353ImGuiDir NavMoveClipDir; // FIXME-NAV: Describe the purpose of this better. Might want to rename?2354ImRect NavScoringRect; // Rectangle used for scoring, in screen space. Based of window->NavRectRel[], modified for directional navigation scoring.2355ImRect NavScoringNoClipRect; // Some nav operations (such as PageUp/PageDown) enforce a region which clipper will attempt to always keep submitted2356int NavScoringDebugCount; // Metrics for debugging2357int NavTabbingDir; // Generally -1 or +1, 0 when tabbing without a nav id2358int NavTabbingCounter; // >0 when counting items for tabbing2359ImGuiNavItemData NavMoveResultLocal; // Best move request candidate within NavWindow2360ImGuiNavItemData NavMoveResultLocalVisible; // Best move request candidate within NavWindow that are mostly visible (when using ImGuiNavMoveFlags_AlsoScoreVisibleSet flag)2361ImGuiNavItemData NavMoveResultOther; // Best move request candidate within NavWindow's flattened hierarchy (when using ImGuiWindowFlags_NavFlattened flag)2362ImGuiNavItemData NavTabbingResultFirst; // First tabbing request candidate within NavWindow and flattened hierarchy23632364// Navigation: record of last move request2365ImGuiID NavJustMovedFromFocusScopeId; // Just navigated from this focus scope id (result of a successfully MoveRequest).2366ImGuiID NavJustMovedToId; // Just navigated to this id (result of a successfully MoveRequest).2367ImGuiID NavJustMovedToFocusScopeId; // Just navigated to this focus scope id (result of a successfully MoveRequest).2368ImGuiKeyChord NavJustMovedToKeyMods;2369bool NavJustMovedToIsTabbing; // Copy of ImGuiNavMoveFlags_IsTabbing. Maybe we should store whole flags.2370bool NavJustMovedToHasSelectionData; // Copy of move result's ItemFlags & ImGuiItemFlags_HasSelectionUserData). Maybe we should just store ImGuiNavItemData.23712372// Navigation: Windowing (Ctrl+Tab for list, or Menu button + keys or directional pads to move/resize)2373bool ConfigNavWindowingWithGamepad; // = true. Enable Ctrl+Tab by holding ImGuiKey_GamepadFaceLeft (== ImGuiKey_NavGamepadMenu). When false, the button may still be used to toggle Menu layer.2374ImGuiKeyChord ConfigNavWindowingKeyNext; // = ImGuiMod_Ctrl | ImGuiKey_Tab (or ImGuiMod_Super | ImGuiKey_Tab on OS X). For reconfiguration (see #4828)2375ImGuiKeyChord ConfigNavWindowingKeyPrev; // = ImGuiMod_Ctrl | ImGuiMod_Shift | ImGuiKey_Tab (or ImGuiMod_Super | ImGuiMod_Shift | ImGuiKey_Tab on OS X)2376ImGuiWindow* NavWindowingTarget; // Target window when doing Ctrl+Tab (or Pad Menu + FocusPrev/Next), this window is temporarily displayed top-most!2377ImGuiWindow* NavWindowingTargetAnim; // Record of last valid NavWindowingTarget until DimBgRatio and NavWindowingHighlightAlpha becomes 0.0f, so the fade-out can stay on it.2378ImGuiWindow* NavWindowingListWindow; // Internal window actually listing the Ctrl+Tab contents2379float NavWindowingTimer;2380float NavWindowingHighlightAlpha;2381ImGuiInputSource NavWindowingInputSource;2382bool NavWindowingToggleLayer; // Set while Alt or GamepadMenu is held, may be cleared by other operations, and processed when releasing the key.2383ImGuiKey NavWindowingToggleKey; // Keyboard/gamepad key used when toggling to menu layer.2384ImVec2 NavWindowingAccumDeltaPos;2385ImVec2 NavWindowingAccumDeltaSize;23862387// Render2388float DimBgRatio; // 0.0..1.0 animation when fading in a dimming background (for modal window and Ctrl+Tab list)23892390// Drag and Drop2391bool DragDropActive;2392bool DragDropWithinSource; // Set when within a BeginDragDropXXX/EndDragDropXXX block for a drag source.2393bool DragDropWithinTarget; // Set when within a BeginDragDropXXX/EndDragDropXXX block for a drag target.2394ImGuiDragDropFlags DragDropSourceFlags;2395int DragDropSourceFrameCount;2396int DragDropMouseButton;2397ImGuiPayload DragDropPayload;2398ImRect DragDropTargetRect; // Store rectangle of current target candidate (we favor small targets when overlapping)2399ImRect DragDropTargetClipRect; // Store ClipRect at the time of item's drawing2400ImGuiID DragDropTargetId;2401ImGuiID DragDropTargetFullViewport;2402ImGuiDragDropFlags DragDropAcceptFlagsCurr;2403ImGuiDragDropFlags DragDropAcceptFlagsPrev;2404float DragDropAcceptIdCurrRectSurface; // Target item surface (we resolve overlapping targets by prioritizing the smaller surface)2405ImGuiID DragDropAcceptIdCurr; // Target item id (set at the time of accepting the payload)2406ImGuiID DragDropAcceptIdPrev; // Target item id from previous frame (we need to store this to allow for overlapping drag and drop targets)2407int DragDropAcceptFrameCount; // Last time a target expressed a desire to accept the source2408ImGuiID DragDropHoldJustPressedId; // Set when holding a payload just made ButtonBehavior() return a press.2409ImVector<unsigned char> DragDropPayloadBufHeap; // We don't expose the ImVector<> directly, ImGuiPayload only holds pointer+size2410unsigned char DragDropPayloadBufLocal[16]; // Local buffer for small payloads24112412// Clipper2413int ClipperTempDataStacked;2414ImVector<ImGuiListClipperData> ClipperTempData;24152416// Tables2417ImGuiTable* CurrentTable;2418ImGuiID DebugBreakInTable; // Set to break in BeginTable() call.2419int TablesTempDataStacked; // Temporary table data size (because we leave previous instances undestructed, we generally don't use TablesTempData.Size)2420ImVector<ImGuiTableTempData> TablesTempData; // Temporary table data (buffers reused/shared across instances, support nesting)2421ImPool<ImGuiTable> Tables; // Persistent table data2422ImVector<float> TablesLastTimeActive; // Last used timestamp of each tables (SOA, for efficient GC)2423ImVector<ImDrawChannel> DrawChannelsTempMergeBuffer;24242425// Tab bars2426ImGuiTabBar* CurrentTabBar;2427ImPool<ImGuiTabBar> TabBars;2428ImVector<ImGuiPtrOrIndex> CurrentTabBarStack;2429ImVector<ImGuiShrinkWidthItem> ShrinkWidthBuffer;24302431// Multi-Select state2432ImGuiBoxSelectState BoxSelectState;2433ImGuiMultiSelectTempData* CurrentMultiSelect;2434int MultiSelectTempDataStacked; // Temporary multi-select data size (because we leave previous instances undestructed, we generally don't use MultiSelectTempData.Size)2435ImVector<ImGuiMultiSelectTempData> MultiSelectTempData;2436ImPool<ImGuiMultiSelectState> MultiSelectStorage;24372438// Hover Delay system2439ImGuiID HoverItemDelayId;2440ImGuiID HoverItemDelayIdPreviousFrame;2441float HoverItemDelayTimer; // Currently used by IsItemHovered()2442float HoverItemDelayClearTimer; // Currently used by IsItemHovered(): grace time before g.TooltipHoverTimer gets cleared.2443ImGuiID HoverItemUnlockedStationaryId; // Mouse has once been stationary on this item. Only reset after departing the item.2444ImGuiID HoverWindowUnlockedStationaryId; // Mouse has once been stationary on this window. Only reset after departing the window.24452446// Mouse state2447ImGuiMouseCursor MouseCursor;2448float MouseStationaryTimer; // Time the mouse has been stationary (with some loose heuristic)2449ImVec2 MouseLastValidPos;24502451// Widget state2452ImGuiInputTextState InputTextState;2453ImGuiTextIndex InputTextLineIndex; // Temporary storage2454ImGuiInputTextDeactivatedState InputTextDeactivatedState;2455ImFontBaked InputTextPasswordFontBackupBaked;2456ImFontFlags InputTextPasswordFontBackupFlags;2457ImGuiID TempInputId; // Temporary text input when using Ctrl+Click on a slider, etc.2458ImGuiDataTypeStorage DataTypeZeroValue; // 0 for all data types2459int BeginMenuDepth;2460int BeginComboDepth;2461ImGuiColorEditFlags ColorEditOptions; // Store user options for color edit widgets2462ImGuiID ColorEditCurrentID; // Set temporarily while inside of the parent-most ColorEdit4/ColorPicker4 (because they call each others).2463ImGuiID ColorEditSavedID; // ID we are saving/restoring HS for2464float ColorEditSavedHue; // Backup of last Hue associated to LastColor, so we can restore Hue in lossy RGB<>HSV round trips2465float ColorEditSavedSat; // Backup of last Saturation associated to LastColor, so we can restore Saturation in lossy RGB<>HSV round trips2466ImU32 ColorEditSavedColor; // RGB value with alpha set to 0.2467ImVec4 ColorPickerRef; // Initial/reference color at the time of opening the color picker.2468ImGuiComboPreviewData ComboPreviewData;2469ImRect WindowResizeBorderExpectedRect; // Expected border rect, switch to relative edit if moving2470bool WindowResizeRelativeMode;2471unsigned char ScrollbarHeld; // Is the scrollbar scrolling the window?2472short ScrollbarSeekMode; // 0: scroll to clicked location, -1/+1: prev/next page.2473float ScrollbarClickDeltaToGrabCenter; // When scrolling to mouse location: distance between mouse and center of grab box, normalized in parent space.2474float SliderGrabClickOffset;2475float SliderCurrentAccum; // Accumulated slider delta when using navigation controls.2476bool SliderCurrentAccumDirty; // Has the accumulated slider delta changed since last time we tried to apply it?2477bool DragCurrentAccumDirty;2478float DragCurrentAccum; // Accumulator for dragging modification. Always high-precision, not rounded by end-user precision settings2479float DragSpeedDefaultRatio; // If speed == 0.0f, uses (max-min) * DragSpeedDefaultRatio2480float DisabledAlphaBackup; // Backup for style.Alpha for BeginDisabled()2481short DisabledStackSize;2482short TooltipOverrideCount;2483ImGuiWindow* TooltipPreviousWindow; // Window of last tooltip submitted during the frame2484ImVector<char> ClipboardHandlerData; // If no custom clipboard handler is defined2485ImVector<ImGuiID> MenusIdSubmittedThisFrame; // A list of menu IDs that were rendered at least once2486ImGuiTypingSelectState TypingSelectState; // State for GetTypingSelectRequest()24872488// Platform support2489ImGuiPlatformImeData PlatformImeData; // Data updated by current frame. Will be applied at end of the frame. For some backends, this is required to have WantVisible=true in order to receive text message.2490ImGuiPlatformImeData PlatformImeDataPrev; // Previous frame data. When changed we call the platform_io.Platform_SetImeDataFn() handler.24912492// Extensions2493// FIXME: We could provide an API to register one slot in an array held in ImGuiContext?2494ImVector<ImTextureData*> UserTextures; // List of textures created/managed by user or third-party extension. Automatically appended into platform_io.Textures[].24952496// Settings2497bool SettingsLoaded;2498float SettingsDirtyTimer; // Save .ini Settings to memory when time reaches zero2499ImGuiTextBuffer SettingsIniData; // In memory .ini settings2500ImVector<ImGuiSettingsHandler> SettingsHandlers; // List of .ini settings handlers2501ImChunkStream<ImGuiWindowSettings> SettingsWindows; // ImGuiWindow .ini settings entries2502ImChunkStream<ImGuiTableSettings> SettingsTables; // ImGuiTable .ini settings entries2503ImVector<ImGuiContextHook> Hooks; // Hooks for extensions (e.g. test engine)2504ImGuiID HookIdNext; // Next available HookId25052506// Localization2507const char* LocalizationTable[ImGuiLocKey_COUNT];25082509// Capture/Logging2510bool LogEnabled; // Currently capturing2511bool LogLineFirstItem;2512ImGuiLogFlags LogFlags; // Capture flags/type2513ImGuiWindow* LogWindow;2514ImFileHandle LogFile; // If != NULL log to stdout/ file2515ImGuiTextBuffer LogBuffer; // Accumulation buffer when log to clipboard. This is pointer so our GImGui static constructor doesn't call heap allocators.2516const char* LogNextPrefix; // See comment in LogSetNextTextDecoration(): doesn't copy underlying data, use carefully!2517const char* LogNextSuffix;2518float LogLinePosY;2519int LogDepthRef;2520int LogDepthToExpand;2521int LogDepthToExpandDefault; // Default/stored value for LogDepthMaxExpand if not specified in the LogXXX function call.25222523// Error Handling2524ImGuiErrorCallback ErrorCallback; // = NULL. May be exposed in public API eventually.2525void* ErrorCallbackUserData; // = NULL2526ImVec2 ErrorTooltipLockedPos;2527bool ErrorFirst;2528int ErrorCountCurrentFrame; // [Internal] Number of errors submitted this frame.2529ImGuiErrorRecoveryState StackSizesInNewFrame; // [Internal]2530ImGuiErrorRecoveryState*StackSizesInBeginForCurrentWindow; // [Internal]25312532// Debug Tools2533// (some of the highly frequently used data are interleaved in other structures above: DebugBreakXXX fields, DebugHookIdInfo, DebugLocateId etc.)2534int DebugDrawIdConflictsCount; // Locked count (preserved when holding Ctrl)2535ImGuiDebugLogFlags DebugLogFlags;2536ImGuiTextBuffer DebugLogBuf;2537ImGuiTextIndex DebugLogIndex;2538int DebugLogSkippedErrors;2539ImGuiDebugLogFlags DebugLogAutoDisableFlags;2540ImU8 DebugLogAutoDisableFrames;2541ImU8 DebugLocateFrames; // For DebugLocateItemOnHover(). This is used together with DebugLocateId which is in a hot/cached spot above.2542bool DebugBreakInLocateId; // Debug break in ItemAdd() call for g.DebugLocateId.2543ImGuiKeyChord DebugBreakKeyChord; // = ImGuiKey_Pause2544ImS8 DebugBeginReturnValueCullDepth; // Cycle between 0..9 then wrap around.2545bool DebugItemPickerActive; // Item picker is active (started with DebugStartItemPicker())2546ImU8 DebugItemPickerMouseButton;2547ImGuiID DebugItemPickerBreakId; // Will call IM_DEBUG_BREAK() when encountering this ID2548float DebugFlashStyleColorTime;2549ImVec4 DebugFlashStyleColorBackup;2550ImGuiMetricsConfig DebugMetricsConfig;2551ImGuiDebugItemPathQuery DebugItemPathQuery;2552ImGuiIDStackTool DebugIDStackTool;2553ImGuiDebugAllocInfo DebugAllocInfo;2554#if defined(IMGUI_DEBUG_HIGHLIGHT_ALL_ID_CONFLICTS) && !defined(IMGUI_DISABLE_DEBUG_TOOLS)2555ImGuiStorage DebugDrawIdConflictsAliveCount;2556ImGuiStorage DebugDrawIdConflictsHighlightSet;2557#endif25582559// Misc2560float FramerateSecPerFrame[60]; // Calculate estimate of framerate for user over the last 60 frames..2561int FramerateSecPerFrameIdx;2562int FramerateSecPerFrameCount;2563float FramerateSecPerFrameAccum;2564int WantCaptureMouseNextFrame; // Explicit capture override via SetNextFrameWantCaptureMouse()/SetNextFrameWantCaptureKeyboard(). Default to -1.2565int WantCaptureKeyboardNextFrame; // "2566int WantTextInputNextFrame; // Copied in EndFrame() from g.PlatformImeData.WantTextInput. Needs to be set for some backends (SDL3) to emit character inputs.2567ImVector<char> TempBuffer; // Temporary text buffer2568char TempKeychordName[64];25692570ImGuiContext(ImFontAtlas* shared_font_atlas);2571~ImGuiContext();2572};25732574//-----------------------------------------------------------------------------2575// [SECTION] ImGuiWindowTempData, ImGuiWindow2576//-----------------------------------------------------------------------------25772578#define IMGUI_WINDOW_HARD_MIN_SIZE 4.0f25792580// Transient per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the DC variable name in ImGuiWindow.2581// (That's theory, in practice the delimitation between ImGuiWindow and ImGuiWindowTempData is quite tenuous and could be reconsidered..)2582// (This doesn't need a constructor because we zero-clear it as part of ImGuiWindow and all frame-temporary data are setup on Begin)2583struct IMGUI_API ImGuiWindowTempData2584{2585// Layout2586ImVec2 CursorPos; // Current emitting position, in absolute coordinates.2587ImVec2 CursorPosPrevLine;2588ImVec2 CursorStartPos; // Initial position after Begin(), generally ~ window position + WindowPadding.2589ImVec2 CursorMaxPos; // Used to implicitly calculate ContentSize at the beginning of next frame, for scrolling range and auto-resize. Always growing during the frame.2590ImVec2 IdealMaxPos; // Used to implicitly calculate ContentSizeIdeal at the beginning of next frame, for auto-resize only. Always growing during the frame.2591ImVec2 CurrLineSize;2592ImVec2 PrevLineSize;2593float CurrLineTextBaseOffset; // Baseline offset (0.0f by default on a new line, generally == style.FramePadding.y when a framed item has been added).2594float PrevLineTextBaseOffset;2595bool IsSameLine;2596bool IsSetPos;2597ImVec1 Indent; // Indentation / start position from left of window (increased by TreePush/TreePop, etc.)2598ImVec1 ColumnsOffset; // Offset to the current column (if ColumnsCurrent > 0). FIXME: This and the above should be a stack to allow use cases like Tree->Column->Tree. Need revamp columns API.2599ImVec1 GroupOffset;2600ImVec2 CursorStartPosLossyness;// Record the loss of precision of CursorStartPos due to really large scrolling amount. This is used by clipper to compensate and fix the most common use case of large scroll area.26012602// Keyboard/Gamepad navigation2603ImGuiNavLayer NavLayerCurrent; // Current layer, 0..31 (we currently only use 0..1)2604short NavLayersActiveMask; // Which layers have been written to (result from previous frame)2605short NavLayersActiveMaskNext;// Which layers have been written to (accumulator for current frame)2606bool NavIsScrollPushableX; // Set when current work location may be scrolled horizontally when moving left / right. This is generally always true UNLESS within a column.2607bool NavHideHighlightOneFrame;2608bool NavWindowHasScrollY; // Set per window when scrolling can be used (== ScrollMax.y > 0.0f)26092610// Miscellaneous2611bool MenuBarAppending; // FIXME: Remove this2612ImVec2 MenuBarOffset; // MenuBarOffset.x is sort of equivalent of a per-layer CursorPos.x, saved/restored as we switch to the menu bar. The only situation when MenuBarOffset.y is > 0 if when (SafeAreaPadding.y > FramePadding.y), often used on TVs.2613ImGuiMenuColumns MenuColumns; // Simplified columns storage for menu items measurement2614int TreeDepth; // Current tree depth.2615ImU32 TreeHasStackDataDepthMask; // Store whether given depth has ImGuiTreeNodeStackData data. Could be turned into a ImU64 if necessary.2616ImU32 TreeRecordsClippedNodesY2Mask; // Store whether we should keep recording Y2. Cleared when passing clip max. Equivalent TreeHasStackDataDepthMask value should always be set.2617ImVector<ImGuiWindow*> ChildWindows;2618ImGuiStorage* StateStorage; // Current persistent per-window storage (store e.g. tree node open/close state)2619ImGuiOldColumns* CurrentColumns; // Current columns set2620int CurrentTableIdx; // Current table index (into g.Tables)2621ImGuiLayoutType LayoutType;2622ImGuiLayoutType ParentLayoutType; // Layout type of parent window at the time of Begin()2623ImU32 ModalDimBgColor;2624ImGuiItemStatusFlags WindowItemStatusFlags;2625ImGuiItemStatusFlags ChildItemStatusFlags;26262627// Local parameters stacks2628// We store the current settings outside of the vectors to increase memory locality (reduce cache misses). The vectors are rarely modified. Also it allows us to not heap allocate for short-lived windows which are not using those settings.2629float ItemWidth; // Current item width (>0.0: width in pixels, <0.0: align xx pixels to the right of window).2630float TextWrapPos; // Current text wrap pos.2631ImVector<float> ItemWidthStack; // Store item widths to restore (attention: .back() is not == ItemWidth)2632ImVector<float> TextWrapPosStack; // Store text wrap pos to restore (attention: .back() is not == TextWrapPos)2633};26342635// Storage for one window2636struct IMGUI_API ImGuiWindow2637{2638ImGuiContext* Ctx; // Parent UI context (needs to be set explicitly by parent).2639char* Name; // Window name, owned by the window.2640ImGuiID ID; // == ImHashStr(Name)2641ImGuiWindowFlags Flags; // See enum ImGuiWindowFlags_2642ImGuiChildFlags ChildFlags; // Set when window is a child window. See enum ImGuiChildFlags_2643ImGuiViewportP* Viewport; // Always set in Begin(). Inactive windows may have a NULL value here if their viewport was discarded.2644ImVec2 Pos; // Position (always rounded-up to nearest pixel)2645ImVec2 Size; // Current size (==SizeFull or collapsed title bar size)2646ImVec2 SizeFull; // Size when non collapsed2647ImVec2 ContentSize; // Size of contents/scrollable client area (calculated from the extents reach of the cursor) from previous frame. Does not include window decoration or window padding.2648ImVec2 ContentSizeIdeal;2649ImVec2 ContentSizeExplicit; // Size of contents/scrollable client area explicitly request by the user via SetNextWindowContentSize().2650ImVec2 WindowPadding; // Window padding at the time of Begin().2651float WindowRounding; // Window rounding at the time of Begin(). May be clamped lower to avoid rendering artifacts with title bar, menu bar etc.2652float WindowBorderSize; // Window border size at the time of Begin().2653float TitleBarHeight, MenuBarHeight; // Note that those used to be function before 2024/05/28. If you have old code calling TitleBarHeight() you can change it to TitleBarHeight.2654float DecoOuterSizeX1, DecoOuterSizeY1; // Left/Up offsets. Sum of non-scrolling outer decorations (X1 generally == 0.0f. Y1 generally = TitleBarHeight + MenuBarHeight). Locked during Begin().2655float DecoOuterSizeX2, DecoOuterSizeY2; // Right/Down offsets (X2 generally == ScrollbarSize.x, Y2 == ScrollbarSizes.y).2656float DecoInnerSizeX1, DecoInnerSizeY1; // Applied AFTER/OVER InnerRect. Specialized for Tables as they use specialized form of clipping and frozen rows/columns are inside InnerRect (and not part of regular decoration sizes).2657int NameBufLen; // Size of buffer storing Name. May be larger than strlen(Name)!2658ImGuiID MoveId; // == window->GetID("#MOVE")2659ImGuiID ChildId; // ID of corresponding item in parent window (for navigation to return from child window to parent window)2660ImGuiID PopupId; // ID in the popup stack when this window is used as a popup/menu (because we use generic Name/ID for recycling)2661ImVec2 Scroll; // Current Visible Scroll position2662ImVec2 ScrollExpected; // Current Expected Scroll position2663ImVec2 ScrollMax;2664ImVec2 ScrollStepSize;2665ImVec2 ScrollTarget; // target scroll position. stored as cursor position with scrolling canceled out, so the highest point is always 0.0f. (FLT_MAX for no change)2666ImVec2 ScrollTargetCenterRatio; // 0.0f = scroll so that target position is at top, 0.5f = scroll so that target position is centered2667ImVec2 ScrollTargetEdgeSnapDist; // 0.0f = no snapping, >0.0f snapping threshold2668ImVec2 ScrollbarSizes; // Size taken by each scrollbars on their smaller axis. Pay attention! ScrollbarSizes.x == width of the vertical scrollbar, ScrollbarSizes.y = height of the horizontal scrollbar.2669bool ScrollbarX, ScrollbarY; // Are scrollbars visible?2670bool ScrollbarXStabilizeEnabled; // Was ScrollbarX previously auto-stabilized?2671ImU8 ScrollbarXStabilizeToggledHistory; // Used to stabilize scrollbar visibility in case of feedback loops2672bool Active; // Set to true on Begin(), unless Collapsed2673bool WasActive;2674bool WriteAccessed; // Set to true when any widget access the current window2675bool Collapsed; // Set when collapsing window to become only title-bar2676bool WantCollapseToggle;2677bool SkipItems; // Set when items can safely be all clipped (e.g. window not visible or collapsed)2678bool SkipRefresh; // [EXPERIMENTAL] Reuse previous frame drawn contents, Begin() returns false.2679bool Appearing; // Set during the frame where the window is appearing (or re-appearing)2680bool Hidden; // Do not display (== HiddenFrames*** > 0)2681bool IsFallbackWindow; // Set on the "Debug##Default" window.2682bool IsExplicitChild; // Set when passed _ChildWindow, left to false by BeginDocked()2683bool HasCloseButton; // Set when the window has a close button (p_open != NULL)2684signed char ResizeBorderHovered; // Current border being hovered for resize (-1: none, otherwise 0-3)2685signed char ResizeBorderHeld; // Current border being held for resize (-1: none, otherwise 0-3)2686short BeginCount; // Number of Begin() during the current frame (generally 0 or 1, 1+ if appending via multiple Begin/End pairs)2687short BeginCountPreviousFrame; // Number of Begin() during the previous frame2688short BeginOrderWithinParent; // Begin() order within immediate parent window, if we are a child window. Otherwise 0.2689short BeginOrderWithinContext; // Begin() order within entire imgui context. This is mostly used for debugging submission order related issues.2690short FocusOrder; // Order within WindowsFocusOrder[], altered when windows are focused.2691ImGuiDir AutoPosLastDirection;2692ImS8 AutoFitFramesX, AutoFitFramesY;2693bool AutoFitOnlyGrows;2694ImS8 HiddenFramesCanSkipItems; // Hide the window for N frames2695ImS8 HiddenFramesCannotSkipItems; // Hide the window for N frames while allowing items to be submitted so we can measure their size2696ImS8 HiddenFramesForRenderOnly; // Hide the window until frame N at Render() time only2697ImS8 DisableInputsFrames; // Disable window interactions for N frames2698ImGuiWindowBgClickFlags BgClickFlags : 8; // Configure behavior of click+dragging on window bg/void or over items. Default sets by io.ConfigWindowsMoveFromTitleBarOnly. If you use this please report in #3379.2699ImGuiCond SetWindowPosAllowFlags : 8; // store acceptable condition flags for SetNextWindowPos() use.2700ImGuiCond SetWindowSizeAllowFlags : 8; // store acceptable condition flags for SetNextWindowSize() use.2701ImGuiCond SetWindowCollapsedAllowFlags : 8; // store acceptable condition flags for SetNextWindowCollapsed() use.2702ImVec2 SetWindowPosVal; // store window position when using a non-zero Pivot (position set needs to be processed when we know the window size)2703ImVec2 SetWindowPosPivot; // store window pivot for positioning. ImVec2(0, 0) when positioning from top-left corner; ImVec2(0.5f, 0.5f) for centering; ImVec2(1, 1) for bottom right.27042705ImVector<ImGuiID> IDStack; // ID stack. ID are hashes seeded with the value at the top of the stack. (In theory this should be in the TempData structure)2706ImGuiWindowTempData DC; // Temporary per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the "DC" variable name.27072708// The best way to understand what those rectangles are is to use the 'Metrics->Tools->Show Windows Rectangles' viewer.2709// The main 'OuterRect', omitted as a field, is window->Rect().2710ImRect OuterRectClipped; // == Window->Rect() just after setup in Begin(). == window->Rect() for root window.2711ImRect InnerRect; // Inner rectangle (omit title bar, menu bar, scroll bar)2712ImRect InnerClipRect; // == InnerRect shrunk by WindowPadding*0.5f on each side, clipped within viewport or parent clip rect.2713ImRect WorkRect; // Initially covers the whole scrolling region. Reduced by containers e.g columns/tables when active. Shrunk by WindowPadding*1.0f on each side. This is meant to replace ContentRegionRect over time (from 1.71+ onward).2714ImRect ParentWorkRect; // Backup of WorkRect before entering a container such as columns/tables. Used by e.g. SpanAllColumns functions to easily access. Stacked containers are responsible for maintaining this. // FIXME-WORKRECT: Could be a stack?2715ImRect ClipRect; // Current clipping/scissoring rectangle, evolve as we are using PushClipRect(), etc. == DrawList->clip_rect_stack.back().2716ImRect ContentRegionRect; // FIXME: This is currently confusing/misleading. It is essentially WorkRect but not handling of scrolling. We currently rely on it as right/bottom aligned sizing operation need some size to rely on.2717ImVec2ih HitTestHoleSize; // Define an optional rectangular hole where mouse will pass-through the window.2718ImVec2ih HitTestHoleOffset;27192720int LastFrameActive; // Last frame number the window was Active.2721float LastTimeActive; // Last timestamp the window was Active (using float as we don't need high precision there)2722float ItemWidthDefault;2723ImGuiStorage StateStorage;2724ImVector<ImGuiOldColumns> ColumnsStorage;2725float FontWindowScale; // User scale multiplier per-window, via SetWindowFontScale()2726float FontWindowScaleParents;2727float FontRefSize; // This is a copy of window->CalcFontSize() at the time of Begin(), trying to phase out CalcFontSize() especially as it may be called on non-current window.2728int SettingsOffset; // Offset into SettingsWindows[] (offsets are always valid as we only grow the array from the back)27292730ImDrawList* DrawList; // == &DrawListInst (for backward compatibility reason with code using imgui_internal.h we keep this a pointer)2731ImDrawList DrawListInst;2732ImGuiWindow* ParentWindow; // If we are a child _or_ popup _or_ docked window, this is pointing to our parent. Otherwise NULL.2733ImGuiWindow* ParentWindowInBeginStack;2734ImGuiWindow* RootWindow; // Point to ourself or first ancestor that is not a child window. Doesn't cross through popups/dock nodes.2735ImGuiWindow* RootWindowPopupTree; // Point to ourself or first ancestor that is not a child window. Cross through popups parent<>child.2736ImGuiWindow* RootWindowForTitleBarHighlight; // Point to ourself or first ancestor which will display TitleBgActive color when this window is active.2737ImGuiWindow* RootWindowForNav; // Point to ourself or first ancestor which doesn't have the NavFlattened flag.2738ImGuiWindow* ParentWindowForFocusRoute; // Set to manual link a window to its logical parent so that Shortcut() chain are honored (e.g. Tool linked to Document)27392740ImGuiWindow* NavLastChildNavWindow; // When going to the menu bar, we remember the child window we came from. (This could probably be made implicit if we kept g.Windows sorted by last focused including child window.)2741ImGuiID NavLastIds[ImGuiNavLayer_COUNT]; // Last known NavId for this window, per layer (0/1)2742ImRect NavRectRel[ImGuiNavLayer_COUNT]; // Reference rectangle, in window relative space2743ImVec2 NavPreferredScoringPosRel[ImGuiNavLayer_COUNT]; // Preferred X/Y position updated when moving on a given axis, reset to FLT_MAX.2744ImGuiID NavRootFocusScopeId; // Focus Scope ID at the time of Begin()27452746int MemoryDrawListIdxCapacity; // Backup of last idx/vtx count, so when waking up the window we can preallocate and avoid iterative alloc/copy2747int MemoryDrawListVtxCapacity;2748bool MemoryCompacted; // Set when window extraneous data have been garbage collected27492750public:2751ImGuiWindow(ImGuiContext* context, const char* name);2752~ImGuiWindow();27532754ImGuiID GetID(const char* str, const char* str_end = NULL);2755ImGuiID GetID(const void* ptr);2756ImGuiID GetID(int n);2757ImGuiID GetIDFromPos(const ImVec2& p_abs);2758ImGuiID GetIDFromRectangle(const ImRect& r_abs);27592760// We don't use g.FontSize because the window may be != g.CurrentWindow.2761ImRect Rect() const { return ImRect(Pos.x, Pos.y, Pos.x + Size.x, Pos.y + Size.y); }2762ImRect TitleBarRect() const { return ImRect(Pos, ImVec2(Pos.x + SizeFull.x, Pos.y + TitleBarHeight)); }2763ImRect MenuBarRect() const { float y1 = Pos.y + TitleBarHeight; return ImRect(Pos.x, y1, Pos.x + SizeFull.x, y1 + MenuBarHeight); }27642765// [OBSOLETE] ImGuiWindow::CalcFontSize() was removed in 1.92.0 because error-prone/misleading. You can use window->FontRefSize for a copy of g.FontSize at the time of the last Begin() call for this window.2766//float CalcFontSize() const { ImGuiContext& g = *Ctx; return g.FontSizeBase * FontWindowScale * FontWindowScaleParents;2767};27682769//-----------------------------------------------------------------------------2770// [SECTION] Tab bar, Tab item support2771//-----------------------------------------------------------------------------27722773// Extend ImGuiTabBarFlags_2774enum ImGuiTabBarFlagsPrivate_2775{2776ImGuiTabBarFlags_DockNode = 1 << 20, // Part of a dock node [we don't use this in the master branch but it facilitate branch syncing to keep this around]2777ImGuiTabBarFlags_IsFocused = 1 << 21,2778ImGuiTabBarFlags_SaveSettings = 1 << 22, // FIXME: Settings are handled by the docking system, this only request the tab bar to mark settings dirty when reordering tabs2779};27802781// Extend ImGuiTabItemFlags_2782enum ImGuiTabItemFlagsPrivate_2783{2784ImGuiTabItemFlags_SectionMask_ = ImGuiTabItemFlags_Leading | ImGuiTabItemFlags_Trailing,2785ImGuiTabItemFlags_NoCloseButton = 1 << 20, // Track whether p_open was set or not (we'll need this info on the next frame to recompute ContentWidth during layout)2786ImGuiTabItemFlags_Button = 1 << 21, // Used by TabItemButton, change the tab item behavior to mimic a button2787ImGuiTabItemFlags_Invisible = 1 << 22, // To reserve space e.g. with ImGuiTabItemFlags_Leading2788//ImGuiTabItemFlags_Unsorted = 1 << 23, // [Docking] Trailing tabs with the _Unsorted flag will be sorted based on the DockOrder of their Window.2789};27902791// Storage for one active tab item (sizeof() 40 bytes)2792struct ImGuiTabItem2793{2794ImGuiID ID;2795ImGuiTabItemFlags Flags;2796int LastFrameVisible;2797int LastFrameSelected; // This allows us to infer an ordered list of the last activated tabs with little maintenance2798float Offset; // Position relative to beginning of tab2799float Width; // Width currently displayed2800float ContentWidth; // Width of label + padding, stored during BeginTabItem() call (misnamed as "Content" would normally imply width of label only)2801float RequestedWidth; // Width optionally requested by caller, -1.0f is unused2802ImS32 NameOffset; // When Window==NULL, offset to name within parent ImGuiTabBar::TabsNames2803ImS16 BeginOrder; // BeginTabItem() order, used to re-order tabs after toggling ImGuiTabBarFlags_Reorderable2804ImS16 IndexDuringLayout; // Index only used during TabBarLayout(). Tabs gets reordered so 'Tabs[n].IndexDuringLayout == n' but may mismatch during additions.2805bool WantClose; // Marked as closed by SetTabItemClosed()28062807ImGuiTabItem() { memset(this, 0, sizeof(*this)); LastFrameVisible = LastFrameSelected = -1; RequestedWidth = -1.0f; NameOffset = -1; BeginOrder = IndexDuringLayout = -1; }2808};28092810// Storage for a tab bar (sizeof() 160 bytes)2811struct IMGUI_API ImGuiTabBar2812{2813ImGuiWindow* Window;2814ImVector<ImGuiTabItem> Tabs;2815ImGuiTabBarFlags Flags;2816ImGuiID ID; // Zero for tab-bars used by docking2817ImGuiID SelectedTabId; // Selected tab/window2818ImGuiID NextSelectedTabId; // Next selected tab/window. Will also trigger a scrolling animation2819ImGuiID VisibleTabId; // Can occasionally be != SelectedTabId (e.g. when previewing contents for Ctrl+Tab preview)2820int CurrFrameVisible;2821int PrevFrameVisible;2822ImRect BarRect;2823float BarRectPrevWidth; // Backup of previous width. When width change we enforce keep horizontal scroll on focused tab.2824float CurrTabsContentsHeight;2825float PrevTabsContentsHeight; // Record the height of contents submitted below the tab bar2826float WidthAllTabs; // Actual width of all tabs (locked during layout)2827float WidthAllTabsIdeal; // Ideal width if all tabs were visible and not clipped2828float ScrollingAnim;2829float ScrollingTarget;2830float ScrollingTargetDistToVisibility;2831float ScrollingSpeed;2832float ScrollingRectMinX;2833float ScrollingRectMaxX;2834float SeparatorMinX;2835float SeparatorMaxX;2836ImGuiID ReorderRequestTabId;2837ImS16 ReorderRequestOffset;2838ImS8 BeginCount;2839bool WantLayout;2840bool VisibleTabWasSubmitted;2841bool TabsAddedNew; // Set to true when a new tab item or button has been added to the tab bar during last frame2842bool ScrollButtonEnabled;2843ImS16 TabsActiveCount; // Number of tabs submitted this frame.2844ImS16 LastTabItemIdx; // Index of last BeginTabItem() tab for use by EndTabItem()2845float ItemSpacingY;2846ImVec2 FramePadding; // style.FramePadding locked at the time of BeginTabBar()2847ImVec2 BackupCursorPos;2848ImGuiTextBuffer TabsNames; // For non-docking tab bar we re-append names in a contiguous buffer.28492850ImGuiTabBar();2851};28522853//-----------------------------------------------------------------------------2854// [SECTION] Table support2855//-----------------------------------------------------------------------------28562857#define IM_COL32_DISABLE IM_COL32(0,0,0,1) // Special sentinel code which cannot be used as a regular color.2858#define IMGUI_TABLE_MAX_COLUMNS 512 // Arbitrary "safety" maximum, may be lifted in the future if needed. Must fit in ImGuiTableColumnIdx/ImGuiTableDrawChannelIdx.28592860// [Internal] sizeof() ~ 1122861// We use the terminology "Enabled" to refer to a column that is not Hidden by user/api.2862// We use the terminology "Clipped" to refer to a column that is out of sight because of scrolling/clipping.2863// This is in contrast with some user-facing api such as IsItemVisible() / IsRectVisible() which use "Visible" to mean "not clipped".2864struct ImGuiTableColumn2865{2866ImGuiTableColumnFlags Flags; // Flags after some patching (not directly same as provided by user). See ImGuiTableColumnFlags_2867float WidthGiven; // Final/actual width visible == (MaxX - MinX), locked in TableUpdateLayout(). May be > WidthRequest to honor minimum width, may be < WidthRequest to honor shrinking columns down in tight space.2868float MinX; // Absolute positions2869float MaxX;2870float WidthRequest; // Master width absolute value when !(Flags & _WidthStretch). When Stretch this is derived every frame from StretchWeight in TableUpdateLayout()2871float WidthAuto; // Automatic width2872float WidthMax; // Maximum width (FIXME: overwritten by each instance)2873float StretchWeight; // Master width weight when (Flags & _WidthStretch). Often around ~1.0f initially.2874float InitStretchWeightOrWidth; // Value passed to TableSetupColumn(). For Width it is a content width (_without padding_).2875ImRect ClipRect; // Clipping rectangle for the column2876ImGuiID UserID; // Optional, value passed to TableSetupColumn()2877float WorkMinX; // Contents region min ~(MinX + CellPaddingX + CellSpacingX1) == cursor start position when entering column2878float WorkMaxX; // Contents region max ~(MaxX - CellPaddingX - CellSpacingX2)2879float ItemWidth; // Current item width for the column, preserved across rows2880float ContentMaxXFrozen; // Contents maximum position for frozen rows (apart from headers), from which we can infer content width.2881float ContentMaxXUnfrozen;2882float ContentMaxXHeadersUsed; // Contents maximum position for headers rows (regardless of freezing). TableHeader() automatically softclip itself + report ideal desired size, to avoid creating extraneous draw calls2883float ContentMaxXHeadersIdeal;2884ImS16 NameOffset; // Offset into parent ColumnsNames[]2885ImGuiTableColumnIdx DisplayOrder; // Index within Table's IndexToDisplayOrder[] (column may be reordered by users)2886ImGuiTableColumnIdx IndexWithinEnabledSet; // Index within enabled/visible set (<= IndexToDisplayOrder)2887ImGuiTableColumnIdx PrevEnabledColumn; // Index of prev enabled/visible column within Columns[], -1 if first enabled/visible column2888ImGuiTableColumnIdx NextEnabledColumn; // Index of next enabled/visible column within Columns[], -1 if last enabled/visible column2889ImGuiTableColumnIdx SortOrder; // Index of this column within sort specs, -1 if not sorting on this column, 0 for single-sort, may be >0 on multi-sort2890ImGuiTableDrawChannelIdx DrawChannelCurrent; // Index within DrawSplitter.Channels[]2891ImGuiTableDrawChannelIdx DrawChannelFrozen; // Draw channels for frozen rows (often headers)2892ImGuiTableDrawChannelIdx DrawChannelUnfrozen; // Draw channels for unfrozen rows2893bool IsEnabled; // IsUserEnabled && (Flags & ImGuiTableColumnFlags_Disabled) == 02894bool IsUserEnabled; // Is the column not marked Hidden by the user? (unrelated to being off view, e.g. clipped by scrolling).2895bool IsUserEnabledNextFrame;2896bool IsVisibleX; // Is actually in view (e.g. overlapping the host window clipping rectangle, not scrolled).2897bool IsVisibleY;2898bool IsRequestOutput; // Return value for TableSetColumnIndex() / TableNextColumn(): whether we request user to output contents or not.2899bool IsSkipItems; // Do we want item submissions to this column to be completely ignored (no layout will happen).2900bool IsPreserveWidthAuto;2901ImS8 NavLayerCurrent; // ImGuiNavLayer in 1 byte2902ImU8 AutoFitQueue; // Queue of 8 values for the next 8 frames to request auto-fit2903ImU8 CannotSkipItemsQueue; // Queue of 8 values for the next 8 frames to disable Clipped/SkipItem2904ImU8 SortDirection : 2; // ImGuiSortDirection_Ascending or ImGuiSortDirection_Descending2905ImU8 SortDirectionsAvailCount : 2; // Number of available sort directions (0 to 3)2906ImU8 SortDirectionsAvailMask : 4; // Mask of available sort directions (1-bit each)2907ImU8 SortDirectionsAvailList; // Ordered list of available sort directions (2-bits each, total 8-bits)29082909ImGuiTableColumn()2910{2911memset(this, 0, sizeof(*this));2912StretchWeight = WidthRequest = -1.0f;2913NameOffset = -1;2914DisplayOrder = IndexWithinEnabledSet = -1;2915PrevEnabledColumn = NextEnabledColumn = -1;2916SortOrder = -1;2917SortDirection = ImGuiSortDirection_None;2918DrawChannelCurrent = DrawChannelFrozen = DrawChannelUnfrozen = (ImU8)-1;2919}2920};29212922// Transient cell data stored per row.2923// sizeof() ~ 6 bytes2924struct ImGuiTableCellData2925{2926ImU32 BgColor; // Actual color2927ImGuiTableColumnIdx Column; // Column number2928};29292930// Parameters for TableAngledHeadersRowEx()2931// This may end up being refactored for more general purpose.2932// sizeof() ~ 12 bytes2933struct ImGuiTableHeaderData2934{2935ImGuiTableColumnIdx Index; // Column index2936ImU32 TextColor;2937ImU32 BgColor0;2938ImU32 BgColor1;2939};29402941// Per-instance data that needs preserving across frames (seemingly most others do not need to be preserved aside from debug needs. Does that means they could be moved to ImGuiTableTempData?)2942// sizeof() ~ 24 bytes2943struct ImGuiTableInstanceData2944{2945ImGuiID TableInstanceID;2946float LastOuterHeight; // Outer height from last frame2947float LastTopHeadersRowHeight; // Height of first consecutive header rows from last frame (FIXME: this is used assuming consecutive headers are in same frozen set)2948float LastFrozenHeight; // Height of frozen section from last frame2949int HoveredRowLast; // Index of row which was hovered last frame.2950int HoveredRowNext; // Index of row hovered this frame, set after encountering it.29512952ImGuiTableInstanceData() { TableInstanceID = 0; LastOuterHeight = LastTopHeadersRowHeight = LastFrozenHeight = 0.0f; HoveredRowLast = HoveredRowNext = -1; }2953};29542955// sizeof() ~ 592 bytes + heap allocs described in TableBeginInitMemory()2956struct IMGUI_API ImGuiTable2957{2958ImGuiID ID;2959ImGuiTableFlags Flags;2960void* RawData; // Single allocation to hold Columns[], DisplayOrderToIndex[], and RowCellData[]2961ImGuiTableTempData* TempData; // Transient data while table is active. Point within g.CurrentTableStack[]2962ImSpan<ImGuiTableColumn> Columns; // Point within RawData[]2963ImSpan<ImGuiTableColumnIdx> DisplayOrderToIndex; // Point within RawData[]. Store display order of columns (when not reordered, the values are 0...Count-1)2964ImSpan<ImGuiTableCellData> RowCellData; // Point within RawData[]. Store cells background requests for current row.2965ImBitArrayPtr EnabledMaskByDisplayOrder; // Column DisplayOrder -> IsEnabled map2966ImBitArrayPtr EnabledMaskByIndex; // Column Index -> IsEnabled map (== not hidden by user/api) in a format adequate for iterating column without touching cold data2967ImBitArrayPtr VisibleMaskByIndex; // Column Index -> IsVisibleX|IsVisibleY map (== not hidden by user/api && not hidden by scrolling/cliprect)2968ImGuiTableFlags SettingsLoadedFlags; // Which data were loaded from the .ini file (e.g. when order is not altered we won't save order)2969int SettingsOffset; // Offset in g.SettingsTables2970int LastFrameActive;2971int ColumnsCount; // Number of columns declared in BeginTable()2972int CurrentRow;2973int CurrentColumn;2974ImS16 InstanceCurrent; // Count of BeginTable() calls with same ID in the same frame (generally 0). This is a little bit similar to BeginCount for a window, but multiple tables with the same ID are multiple tables, they are just synced.2975ImS16 InstanceInteracted; // Mark which instance (generally 0) of the same ID is being interacted with2976float RowPosY1;2977float RowPosY2;2978float RowMinHeight; // Height submitted to TableNextRow()2979float RowCellPaddingY; // Top and bottom padding. Reloaded during row change.2980float RowTextBaseline;2981float RowIndentOffsetX;2982ImGuiTableRowFlags RowFlags : 16; // Current row flags, see ImGuiTableRowFlags_2983ImGuiTableRowFlags LastRowFlags : 16;2984int RowBgColorCounter; // Counter for alternating background colors (can be fast-forwarded by e.g clipper), not same as CurrentRow because header rows typically don't increase this.2985ImU32 RowBgColor[2]; // Background color override for current row.2986ImU32 BorderColorStrong;2987ImU32 BorderColorLight;2988float BorderX1;2989float BorderX2;2990float HostIndentX;2991float MinColumnWidth;2992float OuterPaddingX;2993float CellPaddingX; // Padding from each borders. Locked in BeginTable()/Layout.2994float CellSpacingX1; // Spacing between non-bordered cells. Locked in BeginTable()/Layout.2995float CellSpacingX2;2996float InnerWidth; // User value passed to BeginTable(), see comments at the top of BeginTable() for details.2997float ColumnsGivenWidth; // Sum of current column width2998float ColumnsAutoFitWidth; // Sum of ideal column width in order nothing to be clipped, used for auto-fitting and content width submission in outer window2999float ColumnsStretchSumWeights; // Sum of weight of all enabled stretching columns3000float ResizedColumnNextWidth;3001float ResizeLockMinContentsX2; // Lock minimum contents width while resizing down in order to not create feedback loops. But we allow growing the table.3002float RefScale; // Reference scale to be able to rescale columns on font/dpi changes.3003float AngledHeadersHeight; // Set by TableAngledHeadersRow(), used in TableUpdateLayout()3004float AngledHeadersSlope; // Set by TableAngledHeadersRow(), used in TableUpdateLayout()3005ImRect OuterRect; // Note: for non-scrolling table, OuterRect.Max.y is often FLT_MAX until EndTable(), unless a height has been specified in BeginTable().3006ImRect InnerRect; // InnerRect but without decoration. As with OuterRect, for non-scrolling tables, InnerRect.Max.y is "3007ImRect WorkRect;3008ImRect InnerClipRect;3009ImRect BgClipRect; // We use this to cpu-clip cell background color fill, evolve during the frame as we cross frozen rows boundaries3010ImRect Bg0ClipRectForDrawCmd; // Actual ImDrawCmd clip rect for BG0/1 channel. This tends to be == OuterWindow->ClipRect at BeginTable() because output in BG0/BG1 is cpu-clipped3011ImRect Bg2ClipRectForDrawCmd; // Actual ImDrawCmd clip rect for BG2 channel. This tends to be a correct, tight-fit, because output to BG2 are done by widgets relying on regular ClipRect.3012ImRect HostClipRect; // This is used to check if we can eventually merge our columns draw calls into the current draw call of the current window.3013ImRect HostBackupInnerClipRect; // Backup of InnerWindow->ClipRect during PushTableBackground()/PopTableBackground()3014ImGuiWindow* OuterWindow; // Parent window for the table3015ImGuiWindow* InnerWindow; // Window holding the table data (== OuterWindow or a child window)3016ImGuiTextBuffer ColumnsNames; // Contiguous buffer holding columns names3017ImDrawListSplitter* DrawSplitter; // Shortcut to TempData->DrawSplitter while in table. Isolate draw commands per columns to avoid switching clip rect constantly3018ImGuiTableInstanceData InstanceDataFirst;3019ImVector<ImGuiTableInstanceData> InstanceDataExtra; // FIXME-OPT: Using a small-vector pattern would be good.3020ImGuiTableColumnSortSpecs SortSpecsSingle;3021ImVector<ImGuiTableColumnSortSpecs> SortSpecsMulti; // FIXME-OPT: Using a small-vector pattern would be good.3022ImGuiTableSortSpecs SortSpecs; // Public facing sorts specs, this is what we return in TableGetSortSpecs()3023ImGuiTableColumnIdx SortSpecsCount;3024ImGuiTableColumnIdx ColumnsEnabledCount; // Number of enabled columns (<= ColumnsCount)3025ImGuiTableColumnIdx ColumnsEnabledFixedCount; // Number of enabled columns using fixed width (<= ColumnsCount)3026ImGuiTableColumnIdx DeclColumnsCount; // Count calls to TableSetupColumn()3027ImGuiTableColumnIdx AngledHeadersCount; // Count columns with angled headers3028ImGuiTableColumnIdx HoveredColumnBody; // Index of column whose visible region is being hovered. Important: == ColumnsCount when hovering empty region after the right-most column!3029ImGuiTableColumnIdx HoveredColumnBorder; // Index of column whose right-border is being hovered (for resizing).3030ImGuiTableColumnIdx HighlightColumnHeader; // Index of column which should be highlighted.3031ImGuiTableColumnIdx AutoFitSingleColumn; // Index of single column requesting auto-fit.3032ImGuiTableColumnIdx ResizedColumn; // Index of column being resized. Reset when InstanceCurrent==0.3033ImGuiTableColumnIdx LastResizedColumn; // Index of column being resized from previous frame.3034ImGuiTableColumnIdx HeldHeaderColumn; // Index of column header being held.3035ImGuiTableColumnIdx ReorderColumn; // Index of column being reordered. (not cleared)3036ImGuiTableColumnIdx ReorderColumnDir; // -1 or +13037ImGuiTableColumnIdx LeftMostEnabledColumn; // Index of left-most non-hidden column.3038ImGuiTableColumnIdx RightMostEnabledColumn; // Index of right-most non-hidden column.3039ImGuiTableColumnIdx LeftMostStretchedColumn; // Index of left-most stretched column.3040ImGuiTableColumnIdx RightMostStretchedColumn; // Index of right-most stretched column.3041ImGuiTableColumnIdx ContextPopupColumn; // Column right-clicked on, of -1 if opening context menu from a neutral/empty spot3042ImGuiTableColumnIdx FreezeRowsRequest; // Requested frozen rows count3043ImGuiTableColumnIdx FreezeRowsCount; // Actual frozen row count (== FreezeRowsRequest, or == 0 when no scrolling offset)3044ImGuiTableColumnIdx FreezeColumnsRequest; // Requested frozen columns count3045ImGuiTableColumnIdx FreezeColumnsCount; // Actual frozen columns count (== FreezeColumnsRequest, or == 0 when no scrolling offset)3046ImGuiTableColumnIdx RowCellDataCurrent; // Index of current RowCellData[] entry in current row3047ImGuiTableDrawChannelIdx DummyDrawChannel; // Redirect non-visible columns here.3048ImGuiTableDrawChannelIdx Bg2DrawChannelCurrent; // For Selectable() and other widgets drawing across columns after the freezing line. Index within DrawSplitter.Channels[]3049ImGuiTableDrawChannelIdx Bg2DrawChannelUnfrozen;3050ImS8 NavLayer; // ImGuiNavLayer at the time of BeginTable().3051bool IsLayoutLocked; // Set by TableUpdateLayout() which is called when beginning the first row.3052bool IsInsideRow; // Set when inside TableBeginRow()/TableEndRow().3053bool IsInitializing;3054bool IsSortSpecsDirty;3055bool IsUsingHeaders; // Set when the first row had the ImGuiTableRowFlags_Headers flag.3056bool IsContextPopupOpen; // Set when default context menu is open (also see: ContextPopupColumn, InstanceInteracted).3057bool DisableDefaultContextMenu; // Disable default context menu. You may submit your own using TableBeginContextMenuPopup()/EndPopup()3058bool IsSettingsRequestLoad;3059bool IsSettingsDirty; // Set when table settings have changed and needs to be reported into ImGuiTableSettings data.3060bool IsDefaultDisplayOrder; // Set when display order is unchanged from default (DisplayOrder contains 0...Count-1)3061bool IsResetAllRequest;3062bool IsResetDisplayOrderRequest;3063bool IsUnfrozenRows; // Set when we got past the frozen row.3064bool IsDefaultSizingPolicy; // Set if user didn't explicitly set a sizing policy in BeginTable()3065bool IsActiveIdAliveBeforeTable;3066bool IsActiveIdInTable;3067bool HasScrollbarYCurr; // Whether ANY instance of this table had a vertical scrollbar during the current frame.3068bool HasScrollbarYPrev; // Whether ANY instance of this table had a vertical scrollbar during the previous.3069bool MemoryCompacted;3070bool HostSkipItems; // Backup of InnerWindow->SkipItem at the end of BeginTable(), because we will overwrite InnerWindow->SkipItem on a per-column basis30713072ImGuiTable() { memset(this, 0, sizeof(*this)); LastFrameActive = -1; }3073~ImGuiTable() { IM_FREE(RawData); }3074};30753076// Transient data that are only needed between BeginTable() and EndTable(), those buffers are shared (1 per level of stacked table).3077// - Accessing those requires chasing an extra pointer so for very frequently used data we leave them in the main table structure.3078// - We also leave out of this structure data that tend to be particularly useful for debugging/metrics.3079// FIXME-TABLE: more transient data could be stored in a stacked ImGuiTableTempData: e.g. SortSpecs.3080// sizeof() ~ 136 bytes.3081struct IMGUI_API ImGuiTableTempData3082{3083ImGuiID WindowID; // Shortcut to g.Tables[TableIndex]->OuterWindow->ID.3084int TableIndex; // Index in g.Tables.Buf[] pool3085float LastTimeActive; // Last timestamp this structure was used3086float AngledHeadersExtraWidth; // Used in EndTable()3087ImVector<ImGuiTableHeaderData> AngledHeadersRequests; // Used in TableAngledHeadersRow()30883089ImVec2 UserOuterSize; // outer_size.x passed to BeginTable()3090ImDrawListSplitter DrawSplitter;30913092ImRect HostBackupWorkRect; // Backup of InnerWindow->WorkRect at the end of BeginTable()3093ImRect HostBackupParentWorkRect; // Backup of InnerWindow->ParentWorkRect at the end of BeginTable()3094ImVec2 HostBackupPrevLineSize; // Backup of InnerWindow->DC.PrevLineSize at the end of BeginTable()3095ImVec2 HostBackupCurrLineSize; // Backup of InnerWindow->DC.CurrLineSize at the end of BeginTable()3096ImVec2 HostBackupCursorMaxPos; // Backup of InnerWindow->DC.CursorMaxPos at the end of BeginTable()3097ImVec1 HostBackupColumnsOffset; // Backup of OuterWindow->DC.ColumnsOffset at the end of BeginTable()3098float HostBackupItemWidth; // Backup of OuterWindow->DC.ItemWidth at the end of BeginTable()3099int HostBackupItemWidthStackSize;//Backup of OuterWindow->DC.ItemWidthStack.Size at the end of BeginTable()31003101ImGuiTableTempData() { memset(this, 0, sizeof(*this)); LastTimeActive = -1.0f; }3102};31033104// sizeof() ~ 163105struct ImGuiTableColumnSettings3106{3107float WidthOrWeight;3108ImGuiID UserID;3109ImGuiTableColumnIdx Index;3110ImGuiTableColumnIdx DisplayOrder;3111ImGuiTableColumnIdx SortOrder;3112ImU8 SortDirection : 2;3113ImS8 IsEnabled : 2; // "Visible" in ini file3114ImU8 IsStretch : 1;31153116ImGuiTableColumnSettings()3117{3118WidthOrWeight = 0.0f;3119UserID = 0;3120Index = -1;3121DisplayOrder = SortOrder = -1;3122SortDirection = ImGuiSortDirection_None;3123IsEnabled = -1;3124IsStretch = 0;3125}3126};31273128// This is designed to be stored in a single ImChunkStream (1 header followed by N ImGuiTableColumnSettings, etc.)3129struct ImGuiTableSettings3130{3131ImGuiID ID; // Set to 0 to invalidate/delete the setting3132ImGuiTableFlags SaveFlags; // Indicate data we want to save using the Resizable/Reorderable/Sortable/Hideable flags (could be using its own flags..)3133float RefScale; // Reference scale to be able to rescale columns on font/dpi changes.3134ImGuiTableColumnIdx ColumnsCount;3135ImGuiTableColumnIdx ColumnsCountMax; // Maximum number of columns this settings instance can store, we can recycle a settings instance with lower number of columns but not higher3136bool WantApply; // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context)31373138ImGuiTableSettings() { memset(this, 0, sizeof(*this)); }3139ImGuiTableColumnSettings* GetColumnSettings() { return (ImGuiTableColumnSettings*)(this + 1); }3140};31413142//-----------------------------------------------------------------------------3143// [SECTION] ImGui internal API3144// No guarantee of forward compatibility here!3145//-----------------------------------------------------------------------------31463147namespace ImGui3148{3149// Windows3150// We should always have a CurrentWindow in the stack (there is an implicit "Debug" window)3151// If this ever crashes because g.CurrentWindow is NULL, it means that either:3152// - ImGui::NewFrame() has never been called, which is illegal.3153// - You are calling ImGui functions after ImGui::EndFrame()/ImGui::Render() and before the next ImGui::NewFrame(), which is also illegal.3154IMGUI_API ImGuiIO& GetIO(ImGuiContext* ctx);3155IMGUI_API ImGuiPlatformIO& GetPlatformIO(ImGuiContext* ctx);3156inline ImGuiWindow* GetCurrentWindowRead() { ImGuiContext& g = *GImGui; return g.CurrentWindow; }3157inline ImGuiWindow* GetCurrentWindow() { ImGuiContext& g = *GImGui; g.CurrentWindow->WriteAccessed = true; return g.CurrentWindow; }3158IMGUI_API ImGuiWindow* FindWindowByID(ImGuiID id);3159IMGUI_API ImGuiWindow* FindWindowByName(const char* name);3160IMGUI_API void UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags flags, ImGuiWindow* parent_window);3161IMGUI_API void UpdateWindowSkipRefresh(ImGuiWindow* window);3162IMGUI_API ImVec2 CalcWindowNextAutoFitSize(ImGuiWindow* window);3163IMGUI_API bool IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent, bool popup_hierarchy);3164IMGUI_API bool IsWindowInBeginStack(ImGuiWindow* window);3165IMGUI_API bool IsWindowWithinBeginStackOf(ImGuiWindow* window, ImGuiWindow* potential_parent);3166IMGUI_API bool IsWindowAbove(ImGuiWindow* potential_above, ImGuiWindow* potential_below);3167IMGUI_API bool IsWindowNavFocusable(ImGuiWindow* window);3168IMGUI_API void SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond = 0);3169IMGUI_API void SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond cond = 0);3170IMGUI_API void SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiCond cond = 0);3171IMGUI_API void SetWindowHitTestHole(ImGuiWindow* window, const ImVec2& pos, const ImVec2& size);3172IMGUI_API void SetWindowHiddenAndSkipItemsForCurrentFrame(ImGuiWindow* window);3173inline void SetWindowParentWindowForFocusRoute(ImGuiWindow* window, ImGuiWindow* parent_window) { window->ParentWindowForFocusRoute = parent_window; }3174inline ImRect WindowRectAbsToRel(ImGuiWindow* window, const ImRect& r) { ImVec2 off = window->DC.CursorStartPos; return ImRect(r.Min.x - off.x, r.Min.y - off.y, r.Max.x - off.x, r.Max.y - off.y); }3175inline ImRect WindowRectRelToAbs(ImGuiWindow* window, const ImRect& r) { ImVec2 off = window->DC.CursorStartPos; return ImRect(r.Min.x + off.x, r.Min.y + off.y, r.Max.x + off.x, r.Max.y + off.y); }3176inline ImVec2 WindowPosAbsToRel(ImGuiWindow* window, const ImVec2& p) { ImVec2 off = window->DC.CursorStartPos; return ImVec2(p.x - off.x, p.y - off.y); }3177inline ImVec2 WindowPosRelToAbs(ImGuiWindow* window, const ImVec2& p) { ImVec2 off = window->DC.CursorStartPos; return ImVec2(p.x + off.x, p.y + off.y); }31783179// Windows: Display Order and Focus Order3180IMGUI_API void FocusWindow(ImGuiWindow* window, ImGuiFocusRequestFlags flags = 0);3181IMGUI_API void FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWindow* ignore_window, ImGuiViewport* filter_viewport, ImGuiFocusRequestFlags flags);3182IMGUI_API void BringWindowToFocusFront(ImGuiWindow* window);3183IMGUI_API void BringWindowToDisplayFront(ImGuiWindow* window);3184IMGUI_API void BringWindowToDisplayBack(ImGuiWindow* window);3185IMGUI_API void BringWindowToDisplayBehind(ImGuiWindow* window, ImGuiWindow* above_window);3186IMGUI_API int FindWindowDisplayIndex(ImGuiWindow* window);3187IMGUI_API ImGuiWindow* FindBottomMostVisibleWindowWithinBeginStack(ImGuiWindow* window);31883189// Windows: Idle, Refresh Policies [EXPERIMENTAL]3190IMGUI_API void SetNextWindowRefreshPolicy(ImGuiWindowRefreshFlags flags);31913192// Fonts, drawing3193IMGUI_API void RegisterUserTexture(ImTextureData* tex); // Register external texture. EXPERIMENTAL: DO NOT USE YET.3194IMGUI_API void UnregisterUserTexture(ImTextureData* tex);3195IMGUI_API void RegisterFontAtlas(ImFontAtlas* atlas);3196IMGUI_API void UnregisterFontAtlas(ImFontAtlas* atlas);3197IMGUI_API void SetCurrentFont(ImFont* font, float font_size_before_scaling, float font_size_after_scaling, float font_weight);3198IMGUI_API void UpdateCurrentFontSize(float restore_font_size_after_scaling);3199IMGUI_API void SetFontRasterizerDensity(float rasterizer_density);3200inline float GetFontRasterizerDensity() { return GImGui->FontRasterizerDensity; }3201inline float GetRoundedFontSize(float size) { return IM_ROUND(size); }3202IMGUI_API ImFont* GetDefaultFont();3203IMGUI_API void PushPasswordFont();3204IMGUI_API void PopPasswordFont();3205inline ImDrawList* GetForegroundDrawList(ImGuiWindow* window) { IM_UNUSED(window); return GetForegroundDrawList(); } // This seemingly unnecessary wrapper simplifies compatibility between the 'master' and 'docking' branches.3206IMGUI_API ImDrawList* GetBackgroundDrawList(ImGuiViewport* viewport); // get background draw list for the given viewport. this draw list will be the first rendering one. Useful to quickly draw shapes/text behind dear imgui contents.3207IMGUI_API ImDrawList* GetForegroundDrawList(ImGuiViewport* viewport); // get foreground draw list for the given viewport. this draw list will be the last rendered one. Useful to quickly draw shapes/text over dear imgui contents.3208IMGUI_API void AddDrawListToDrawDataEx(ImDrawData* draw_data, ImVector<ImDrawList*>* out_list, ImDrawList* draw_list);32093210// Init3211IMGUI_API void Initialize();3212IMGUI_API void Shutdown(); // Since 1.60 this is a _private_ function. You can call DestroyContext() to destroy the context created by CreateContext().32133214// Context name & generic context hooks3215IMGUI_API void SetContextName(ImGuiContext* ctx, const char* name);3216IMGUI_API ImGuiID AddContextHook(ImGuiContext* ctx, const ImGuiContextHook* hook);3217IMGUI_API void RemoveContextHook(ImGuiContext* ctx, ImGuiID hook_to_remove);3218IMGUI_API void CallContextHooks(ImGuiContext* ctx, ImGuiContextHookType type);32193220// NewFrame3221IMGUI_API void UpdateInputEvents(bool trickle_fast_inputs);3222IMGUI_API void UpdateHoveredWindowAndCaptureFlags(const ImVec2& mouse_pos);3223IMGUI_API void FindHoveredWindowEx(const ImVec2& pos, bool find_first_and_in_any_viewport, ImGuiWindow** out_hovered_window, ImGuiWindow** out_hovered_window_under_moving_window);3224IMGUI_API void StartMouseMovingWindow(ImGuiWindow* window);3225IMGUI_API void StopMouseMovingWindow();3226IMGUI_API void UpdateMouseMovingWindowNewFrame();3227IMGUI_API void UpdateMouseMovingWindowEndFrame();32283229// Viewports3230IMGUI_API void ScaleWindowsInViewport(ImGuiViewportP* viewport, float scale);3231IMGUI_API void SetWindowViewport(ImGuiWindow* window, ImGuiViewportP* viewport);32323233// Settings3234IMGUI_API void MarkIniSettingsDirty();3235IMGUI_API void MarkIniSettingsDirty(ImGuiWindow* window);3236IMGUI_API void ClearIniSettings();3237IMGUI_API void AddSettingsHandler(const ImGuiSettingsHandler* handler);3238IMGUI_API void RemoveSettingsHandler(const char* type_name);3239IMGUI_API ImGuiSettingsHandler* FindSettingsHandler(const char* type_name);32403241// Settings - Windows3242IMGUI_API ImGuiWindowSettings* CreateNewWindowSettings(const char* name);3243IMGUI_API ImGuiWindowSettings* FindWindowSettingsByID(ImGuiID id);3244IMGUI_API ImGuiWindowSettings* FindWindowSettingsByWindow(ImGuiWindow* window);3245IMGUI_API void ClearWindowSettings(const char* name);32463247// Localization3248IMGUI_API void LocalizeRegisterEntries(const ImGuiLocEntry* entries, int count);3249inline const char* LocalizeGetMsg(ImGuiLocKey key) { ImGuiContext& g = *GImGui; const char* msg = g.LocalizationTable[key]; return msg ? msg : "*Missing Text*"; }32503251// Scrolling3252IMGUI_API void SetScrollX(ImGuiWindow* window, float scroll_x);3253IMGUI_API void SetScrollY(ImGuiWindow* window, float scroll_y);3254IMGUI_API void SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x_ratio);3255IMGUI_API void SetScrollFromPosY(ImGuiWindow* window, float local_y, float center_y_ratio);32563257// Early work-in-progress API (ScrollToItem() will become public)3258IMGUI_API void ScrollToItem(ImGuiScrollFlags flags = 0);3259IMGUI_API void ScrollToRect(ImGuiWindow* window, const ImRect& rect, ImGuiScrollFlags flags = 0);3260IMGUI_API ImVec2 ScrollToRectEx(ImGuiWindow* window, const ImRect& rect, ImGuiScrollFlags flags = 0);3261//#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS3262inline void ScrollToBringRectIntoView(ImGuiWindow* window, const ImRect& rect) { ScrollToRect(window, rect, ImGuiScrollFlags_KeepVisibleEdgeY); }3263//#endif32643265// Basic Accessors3266inline ImGuiItemStatusFlags GetItemStatusFlags() { ImGuiContext& g = *GImGui; return g.LastItemData.StatusFlags; }3267inline ImGuiID GetActiveID() { ImGuiContext& g = *GImGui; return g.ActiveId; }3268inline ImGuiID GetFocusID() { ImGuiContext& g = *GImGui; return g.NavId; }3269IMGUI_API void SetActiveID(ImGuiID id, ImGuiWindow* window);3270IMGUI_API void SetFocusID(ImGuiID id, ImGuiWindow* window);3271IMGUI_API void ClearActiveID();3272IMGUI_API ImGuiID GetHoveredID();3273IMGUI_API void SetHoveredID(ImGuiID id);3274IMGUI_API void KeepAliveID(ImGuiID id);3275IMGUI_API void MarkItemEdited(ImGuiID id); // Mark data associated to given item as "edited", used by IsItemDeactivatedAfterEdit() function.3276IMGUI_API void PushOverrideID(ImGuiID id); // Push given value as-is at the top of the ID stack (whereas PushID combines old and new hashes)3277IMGUI_API ImGuiID GetIDWithSeed(const char* str_id_begin, const char* str_id_end, ImGuiID seed);3278IMGUI_API ImGuiID GetIDWithSeed(int n, ImGuiID seed);32793280// Basic Helpers for widget code3281IMGUI_API void ItemSize(const ImVec2& size, float text_baseline_y = -1.0f);3282inline void ItemSize(const ImRect& bb, float text_baseline_y = -1.0f) { ItemSize(bb.GetSize(), text_baseline_y); } // FIXME: This is a misleading API since we expect CursorPos to be bb.Min.3283IMGUI_API bool ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb = NULL, ImGuiItemFlags extra_flags = 0);3284IMGUI_API bool ItemHoverable(const ImRect& bb, ImGuiID id, ImGuiItemFlags item_flags);3285IMGUI_API bool IsWindowContentHoverable(ImGuiWindow* window, ImGuiHoveredFlags flags = 0);3286IMGUI_API bool IsClippedEx(const ImRect& bb, ImGuiID id);3287IMGUI_API void SetLastItemData(ImGuiID item_id, ImGuiItemFlags item_flags, ImGuiItemStatusFlags status_flags, const ImRect& item_rect);3288IMGUI_API ImVec2 CalcItemSize(ImVec2 size, float default_w, float default_h);3289IMGUI_API float CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x);3290IMGUI_API void PushMultiItemsWidths(int components, float width_full);3291IMGUI_API void ShrinkWidths(ImGuiShrinkWidthItem* items, int count, float width_excess, float width_min);3292IMGUI_API void CalcClipRectVisibleItemsY(const ImRect& clip_rect, const ImVec2& pos, float items_height, int* out_visible_start, int* out_visible_end);32933294// Parameter stacks (shared)3295IMGUI_API const ImGuiStyleVarInfo* GetStyleVarInfo(ImGuiStyleVar idx);3296IMGUI_API void BeginDisabledOverrideReenable();3297IMGUI_API void EndDisabledOverrideReenable();32983299// Logging/Capture3300IMGUI_API void LogBegin(ImGuiLogFlags flags, int auto_open_depth); // -> BeginCapture() when we design v2 api, for now stay under the radar by using the old name.3301IMGUI_API void LogToBuffer(int auto_open_depth = -1); // Start logging/capturing to internal buffer3302IMGUI_API void LogRenderedText(const ImVec2* ref_pos, const char* text, const char* text_end = NULL);3303IMGUI_API void LogSetNextTextDecoration(const char* prefix, const char* suffix);33043305// Childs3306IMGUI_API bool BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, ImGuiChildFlags child_flags, ImGuiWindowFlags window_flags);33073308// Popups, Modals3309IMGUI_API bool BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_window_flags);3310IMGUI_API bool BeginPopupMenuEx(ImGuiID id, const char* label, ImGuiWindowFlags extra_window_flags);3311IMGUI_API void OpenPopupEx(ImGuiID id, ImGuiPopupFlags popup_flags = ImGuiPopupFlags_None);3312IMGUI_API void ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_popup);3313IMGUI_API void ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to_window_under_popup);3314IMGUI_API void ClosePopupsExceptModals();3315IMGUI_API bool IsPopupOpen(ImGuiID id, ImGuiPopupFlags popup_flags);3316IMGUI_API ImRect GetPopupAllowedExtentRect(ImGuiWindow* window);3317IMGUI_API ImGuiWindow* GetTopMostPopupModal();3318IMGUI_API ImGuiWindow* GetTopMostAndVisiblePopupModal();3319IMGUI_API ImGuiWindow* FindBlockingModal(ImGuiWindow* window);3320IMGUI_API ImVec2 FindBestWindowPosForPopup(ImGuiWindow* window);3321IMGUI_API ImVec2 FindBestWindowPosForPopupEx(const ImVec2& ref_pos, const ImVec2& size, ImGuiDir* last_dir, const ImRect& r_outer, const ImRect& r_avoid, ImGuiPopupPositionPolicy policy);33223323// Tooltips3324IMGUI_API bool BeginTooltipEx(ImGuiTooltipFlags tooltip_flags, ImGuiWindowFlags extra_window_flags);3325IMGUI_API bool BeginTooltipHidden();33263327// Menus3328IMGUI_API bool BeginViewportSideBar(const char* name, ImGuiViewport* viewport, ImGuiDir dir, float size, ImGuiWindowFlags window_flags);3329IMGUI_API bool BeginMenuEx(const char* label, const char* icon, bool enabled = true);3330IMGUI_API bool MenuItemEx(const char* label, const char* icon, const char* shortcut = NULL, bool selected = false, bool enabled = true);33313332// Combos3333IMGUI_API bool BeginComboPopup(ImGuiID popup_id, const ImRect& bb, ImGuiComboFlags flags);3334IMGUI_API bool BeginComboPreview();3335IMGUI_API void EndComboPreview();33363337// Keyboard/Gamepad Navigation3338IMGUI_API void NavInitWindow(ImGuiWindow* window, bool force_reinit);3339IMGUI_API void NavInitRequestApplyResult();3340IMGUI_API bool NavMoveRequestButNoResultYet();3341IMGUI_API void NavMoveRequestSubmit(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags);3342IMGUI_API void NavMoveRequestForward(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags);3343IMGUI_API void NavMoveRequestResolveWithLastItem(ImGuiNavItemData* result);3344IMGUI_API void NavMoveRequestResolveWithPastTreeNode(ImGuiNavItemData* result, const ImGuiTreeNodeStackData* tree_node_data);3345IMGUI_API void NavMoveRequestCancel();3346IMGUI_API void NavMoveRequestApplyResult();3347IMGUI_API void NavMoveRequestTryWrapping(ImGuiWindow* window, ImGuiNavMoveFlags move_flags);3348IMGUI_API void NavHighlightActivated(ImGuiID id);3349IMGUI_API void NavClearPreferredPosForAxis(ImGuiAxis axis);3350IMGUI_API void SetNavCursorVisibleAfterMove();3351IMGUI_API void NavUpdateCurrentWindowIsScrollPushableX();3352IMGUI_API void SetNavWindow(ImGuiWindow* window);3353IMGUI_API void SetNavID(ImGuiID id, ImGuiNavLayer nav_layer, ImGuiID focus_scope_id, const ImRect& rect_rel);3354IMGUI_API void SetNavFocusScope(ImGuiID focus_scope_id);33553356// Focus/Activation3357// This should be part of a larger set of API: FocusItem(offset = -1), FocusItemByID(id), ActivateItem(offset = -1), ActivateItemByID(id) etc. which are3358// much harder to design and implement than expected. I have a couple of private branches on this matter but it's not simple. For now implementing the easy ones.3359IMGUI_API void FocusItem(); // Focus last item (no selection/activation).3360IMGUI_API void ActivateItemByID(ImGuiID id); // Activate an item by ID (button, checkbox, tree node etc.). Activation is queued and processed on the next frame when the item is encountered again. Was called 'ActivateItem()' before 1.89.7.33613362// Inputs3363// FIXME: Eventually we should aim to move e.g. IsActiveIdUsingKey() into IsKeyXXX functions.3364inline bool IsNamedKey(ImGuiKey key) { return key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END; }3365inline bool IsNamedKeyOrMod(ImGuiKey key) { return (key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END) || key == ImGuiMod_Ctrl || key == ImGuiMod_Shift || key == ImGuiMod_Alt || key == ImGuiMod_Super; }3366inline bool IsLegacyKey(ImGuiKey key) { return key >= ImGuiKey_LegacyNativeKey_BEGIN && key < ImGuiKey_LegacyNativeKey_END; }3367inline bool IsKeyboardKey(ImGuiKey key) { return key >= ImGuiKey_Keyboard_BEGIN && key < ImGuiKey_Keyboard_END; }3368inline bool IsGamepadKey(ImGuiKey key) { return key >= ImGuiKey_Gamepad_BEGIN && key < ImGuiKey_Gamepad_END; }3369inline bool IsMouseKey(ImGuiKey key) { return key >= ImGuiKey_Mouse_BEGIN && key < ImGuiKey_Mouse_END; }3370inline bool IsAliasKey(ImGuiKey key) { return key >= ImGuiKey_Aliases_BEGIN && key < ImGuiKey_Aliases_END; }3371inline bool IsLRModKey(ImGuiKey key) { return key >= ImGuiKey_LeftCtrl && key <= ImGuiKey_RightSuper; }3372ImGuiKeyChord FixupKeyChord(ImGuiKeyChord key_chord);3373inline ImGuiKey ConvertSingleModFlagToKey(ImGuiKey key)3374{3375if (key == ImGuiMod_Ctrl) return ImGuiKey_ReservedForModCtrl;3376if (key == ImGuiMod_Shift) return ImGuiKey_ReservedForModShift;3377if (key == ImGuiMod_Alt) return ImGuiKey_ReservedForModAlt;3378if (key == ImGuiMod_Super) return ImGuiKey_ReservedForModSuper;3379return key;3380}33813382IMGUI_API ImGuiKeyData* GetKeyData(ImGuiContext* ctx, ImGuiKey key);3383inline ImGuiKeyData* GetKeyData(ImGuiKey key) { ImGuiContext& g = *GImGui; return GetKeyData(&g, key); }3384IMGUI_API const char* GetKeyChordName(ImGuiKeyChord key_chord);3385inline ImGuiKey MouseButtonToKey(ImGuiMouseButton button) { IM_ASSERT(button >= 0 && button < ImGuiMouseButton_COUNT); return (ImGuiKey)(ImGuiKey_MouseLeft + button); }3386IMGUI_API bool IsMouseDragPastThreshold(ImGuiMouseButton button, float lock_threshold = -1.0f);3387IMGUI_API ImVec2 GetKeyMagnitude2d(ImGuiKey key_left, ImGuiKey key_right, ImGuiKey key_up, ImGuiKey key_down);3388IMGUI_API float GetNavTweakPressedAmount(ImGuiAxis axis);3389IMGUI_API int CalcTypematicRepeatAmount(float t0, float t1, float repeat_delay, float repeat_rate);3390IMGUI_API void GetTypematicRepeatRate(ImGuiInputFlags flags, float* repeat_delay, float* repeat_rate);3391IMGUI_API void TeleportMousePos(const ImVec2& pos);3392IMGUI_API void SetActiveIdUsingAllKeyboardKeys();3393inline bool IsActiveIdUsingNavDir(ImGuiDir dir) { ImGuiContext& g = *GImGui; return (g.ActiveIdUsingNavDirMask & (1 << dir)) != 0; }33943395// [EXPERIMENTAL] Low-Level: Key/Input Ownership3396// - The idea is that instead of "eating" a given input, we can link to an owner id.3397// - Ownership is most often claimed as a result of reacting to a press/down event (but occasionally may be claimed ahead).3398// - Input queries can then read input by specifying ImGuiKeyOwner_Any (== 0), ImGuiKeyOwner_NoOwner (== -1) or a custom ID.3399// - Legacy input queries (without specifying an owner or _Any or _None) are equivalent to using ImGuiKeyOwner_Any (== 0).3400// - Input ownership is automatically released on the frame after a key is released. Therefore:3401// - for ownership registration happening as a result of a down/press event, the SetKeyOwner() call may be done once (common case).3402// - for ownership registration happening ahead of a down/press event, the SetKeyOwner() call needs to be made every frame (happens if e.g. claiming ownership on hover).3403// - SetItemKeyOwner() is a shortcut for common simple case. A custom widget will probably want to call SetKeyOwner() multiple times directly based on its interaction state.3404// - This is marked experimental because not all widgets are fully honoring the Set/Test idioms. We will need to move forward step by step.3405// Please open a GitHub Issue to submit your usage scenario or if there's a use case you need solved.3406IMGUI_API ImGuiID GetKeyOwner(ImGuiKey key);3407IMGUI_API void SetKeyOwner(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags = 0);3408IMGUI_API void SetKeyOwnersForKeyChord(ImGuiKeyChord key, ImGuiID owner_id, ImGuiInputFlags flags = 0);3409IMGUI_API void SetItemKeyOwner(ImGuiKey key, ImGuiInputFlags flags); // Set key owner to last item if it is hovered or active. Equivalent to 'if (IsItemHovered() || IsItemActive()) { SetKeyOwner(key, GetItemID());'.3410IMGUI_API bool TestKeyOwner(ImGuiKey key, ImGuiID owner_id); // Test that key is either not owned, either owned by 'owner_id'3411inline ImGuiKeyOwnerData* GetKeyOwnerData(ImGuiContext* ctx, ImGuiKey key) { if (key & ImGuiMod_Mask_) key = ConvertSingleModFlagToKey(key); IM_ASSERT(IsNamedKey(key)); return &ctx->KeysOwnerData[key - ImGuiKey_NamedKey_BEGIN]; }34123413// [EXPERIMENTAL] High-Level: Input Access functions w/ support for Key/Input Ownership3414// - Important: legacy IsKeyPressed(ImGuiKey, bool repeat=true) _DEFAULTS_ to repeat, new IsKeyPressed() requires _EXPLICIT_ ImGuiInputFlags_Repeat flag.3415// - Expected to be later promoted to public API, the prototypes are designed to replace existing ones (since owner_id can default to Any == 0)3416// - Specifying a value for 'ImGuiID owner' will test that EITHER the key is NOT owned (UNLESS locked), EITHER the key is owned by 'owner'.3417// Legacy functions use ImGuiKeyOwner_Any meaning that they typically ignore ownership, unless a call to SetKeyOwner() explicitly used ImGuiInputFlags_LockThisFrame or ImGuiInputFlags_LockUntilRelease.3418// - Binding generators may want to ignore those for now, or suffix them with Ex() until we decide if this gets moved into public API.3419IMGUI_API bool IsKeyDown(ImGuiKey key, ImGuiID owner_id);3420IMGUI_API bool IsKeyPressed(ImGuiKey key, ImGuiInputFlags flags, ImGuiID owner_id = 0); // Important: when transitioning from old to new IsKeyPressed(): old API has "bool repeat = true", so would default to repeat. New API requires explicit ImGuiInputFlags_Repeat.3421IMGUI_API bool IsKeyReleased(ImGuiKey key, ImGuiID owner_id);3422IMGUI_API bool IsKeyChordPressed(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID owner_id = 0);3423IMGUI_API bool IsMouseDown(ImGuiMouseButton button, ImGuiID owner_id);3424IMGUI_API bool IsMouseClicked(ImGuiMouseButton button, ImGuiInputFlags flags, ImGuiID owner_id = 0);3425IMGUI_API bool IsMouseReleased(ImGuiMouseButton button, ImGuiID owner_id);3426IMGUI_API bool IsMouseDoubleClicked(ImGuiMouseButton button, ImGuiID owner_id);34273428// Shortcut Testing & Routing3429// - Set Shortcut() and SetNextItemShortcut() in imgui.h3430// - When a policy (except for ImGuiInputFlags_RouteAlways *) is set, Shortcut() will register itself with SetShortcutRouting(),3431// allowing the system to decide where to route the input among other route-aware calls.3432// (* using ImGuiInputFlags_RouteAlways is roughly equivalent to calling IsKeyChordPressed(key) and bypassing route registration and check)3433// - When using one of the routing option:3434// - The default route is ImGuiInputFlags_RouteFocused (accept inputs if window is in focus stack. Deep-most focused window takes inputs. ActiveId takes inputs over deep-most focused window.)3435// - Routes are requested given a chord (key + modifiers) and a routing policy.3436// - Routes are resolved during NewFrame(): if keyboard modifiers are matching current ones: SetKeyOwner() is called + route is granted for the frame.3437// - Each route may be granted to a single owner. When multiple requests are made we have policies to select the winning route (e.g. deep most window).3438// - Multiple read sites may use the same owner id can all access the granted route.3439// - When owner_id is 0 we use the current Focus Scope ID as a owner ID in order to identify our location.3440// - You can chain two unrelated windows in the focus stack using SetWindowParentWindowForFocusRoute()3441// e.g. if you have a tool window associated to a document, and you want document shortcuts to run when the tool is focused.3442IMGUI_API bool Shortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID owner_id);3443IMGUI_API bool SetShortcutRouting(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID owner_id); // owner_id needs to be explicit and cannot be 03444IMGUI_API bool TestShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id);3445IMGUI_API ImGuiKeyRoutingData* GetShortcutRoutingData(ImGuiKeyChord key_chord);34463447// [EXPERIMENTAL] Focus Scope3448// This is generally used to identify a unique input location (for e.g. a selection set)3449// There is one per window (automatically set in Begin), but:3450// - Selection patterns generally need to react (e.g. clear a selection) when landing on one item of the set.3451// So in order to identify a set multiple lists in same window may each need a focus scope.3452// If you imagine an hypothetical BeginSelectionGroup()/EndSelectionGroup() api, it would likely call PushFocusScope()/EndFocusScope()3453// - Shortcut routing also use focus scope as a default location identifier if an owner is not provided.3454// We don't use the ID Stack for this as it is common to want them separate.3455IMGUI_API void PushFocusScope(ImGuiID id);3456IMGUI_API void PopFocusScope();3457inline ImGuiID GetCurrentFocusScope() { ImGuiContext& g = *GImGui; return g.CurrentFocusScopeId; } // Focus scope we are outputting into, set by PushFocusScope()34583459// Drag and Drop3460IMGUI_API bool IsDragDropActive();3461IMGUI_API bool BeginDragDropTargetCustom(const ImRect& bb, ImGuiID id);3462IMGUI_API bool BeginDragDropTargetViewport(ImGuiViewport* viewport, const ImRect* p_bb = NULL);3463IMGUI_API void ClearDragDrop();3464IMGUI_API bool IsDragDropPayloadBeingAccepted();3465IMGUI_API void RenderDragDropTargetRectForItem(const ImRect& bb);3466IMGUI_API void RenderDragDropTargetRectEx(ImDrawList* draw_list, const ImRect& bb);34673468// Typing-Select API3469// (provide Windows Explorer style "select items by typing partial name" + "cycle through items by typing same letter" feature)3470// (this is currently not documented nor used by main library, but should work. See "widgets_typingselect" in imgui_test_suite for usage code. Please let us know if you use this!)3471IMGUI_API ImGuiTypingSelectRequest* GetTypingSelectRequest(ImGuiTypingSelectFlags flags = ImGuiTypingSelectFlags_None);3472IMGUI_API int TypingSelectFindMatch(ImGuiTypingSelectRequest* req, int items_count, const char* (*get_item_name_func)(void*, int), void* user_data, int nav_item_idx);3473IMGUI_API int TypingSelectFindNextSingleCharMatch(ImGuiTypingSelectRequest* req, int items_count, const char* (*get_item_name_func)(void*, int), void* user_data, int nav_item_idx);3474IMGUI_API int TypingSelectFindBestLeadingMatch(ImGuiTypingSelectRequest* req, int items_count, const char* (*get_item_name_func)(void*, int), void* user_data);34753476// Box-Select API3477IMGUI_API bool BeginBoxSelect(const ImRect& scope_rect, ImGuiWindow* window, ImGuiID box_select_id, ImGuiMultiSelectFlags ms_flags);3478IMGUI_API void EndBoxSelect(const ImRect& scope_rect, ImGuiMultiSelectFlags ms_flags);34793480// Multi-Select API3481IMGUI_API void MultiSelectItemHeader(ImGuiID id, bool* p_selected, ImGuiButtonFlags* p_button_flags);3482IMGUI_API void MultiSelectItemFooter(ImGuiID id, bool* p_selected, bool* p_pressed);3483IMGUI_API void MultiSelectAddSetAll(ImGuiMultiSelectTempData* ms, bool selected);3484IMGUI_API void MultiSelectAddSetRange(ImGuiMultiSelectTempData* ms, bool selected, int range_dir, ImGuiSelectionUserData first_item, ImGuiSelectionUserData last_item);3485inline ImGuiBoxSelectState* GetBoxSelectState(ImGuiID id) { ImGuiContext& g = *GImGui; return (id != 0 && g.BoxSelectState.ID == id && g.BoxSelectState.IsActive) ? &g.BoxSelectState : NULL; }3486inline ImGuiMultiSelectState* GetMultiSelectState(ImGuiID id) { ImGuiContext& g = *GImGui; return g.MultiSelectStorage.GetByKey(id); }34873488// Internal Columns API (this is not exposed because we will encourage transitioning to the Tables API)3489IMGUI_API void SetWindowClipRectBeforeSetChannel(ImGuiWindow* window, const ImRect& clip_rect);3490IMGUI_API void BeginColumns(const char* str_id, int count, ImGuiOldColumnFlags flags = 0); // setup number of columns. use an identifier to distinguish multiple column sets. close with EndColumns().3491IMGUI_API void EndColumns(); // close columns3492IMGUI_API void PushColumnClipRect(int column_index);3493IMGUI_API void PushColumnsBackground();3494IMGUI_API void PopColumnsBackground();3495IMGUI_API ImGuiID GetColumnsID(const char* str_id, int count);3496IMGUI_API ImGuiOldColumns* FindOrCreateColumns(ImGuiWindow* window, ImGuiID id);3497IMGUI_API float GetColumnOffsetFromNorm(const ImGuiOldColumns* columns, float offset_norm);3498IMGUI_API float GetColumnNormFromOffset(const ImGuiOldColumns* columns, float offset);34993500// Tables: Candidates for public API3501IMGUI_API void TableOpenContextMenu(int column_n = -1);3502IMGUI_API void TableSetColumnWidth(int column_n, float width);3503IMGUI_API void TableSetColumnSortDirection(int column_n, ImGuiSortDirection sort_direction, bool append_to_sort_specs);3504IMGUI_API int TableGetHoveredRow(); // Retrieve *PREVIOUS FRAME* hovered row. This difference with TableGetHoveredColumn() is the reason why this is not public yet.3505IMGUI_API float TableGetHeaderRowHeight();3506IMGUI_API float TableGetHeaderAngledMaxLabelWidth();3507IMGUI_API void TablePushBackgroundChannel();3508IMGUI_API void TablePopBackgroundChannel();3509IMGUI_API void TablePushColumnChannel(int column_n);3510IMGUI_API void TablePopColumnChannel();3511IMGUI_API void TableAngledHeadersRowEx(ImGuiID row_id, float angle, float max_label_width, const ImGuiTableHeaderData* data, int data_count);35123513// Tables: Internals3514inline ImGuiTable* GetCurrentTable() { ImGuiContext& g = *GImGui; return g.CurrentTable; }3515IMGUI_API ImGuiTable* TableFindByID(ImGuiID id);3516IMGUI_API bool BeginTableEx(const char* name, ImGuiID id, int columns_count, ImGuiTableFlags flags = 0, const ImVec2& outer_size = ImVec2(0, 0), float inner_width = 0.0f);3517IMGUI_API void TableBeginInitMemory(ImGuiTable* table, int columns_count);3518IMGUI_API void TableBeginApplyRequests(ImGuiTable* table);3519IMGUI_API void TableSetupDrawChannels(ImGuiTable* table);3520IMGUI_API void TableUpdateLayout(ImGuiTable* table);3521IMGUI_API void TableUpdateBorders(ImGuiTable* table);3522IMGUI_API void TableUpdateColumnsWeightFromWidth(ImGuiTable* table);3523IMGUI_API void TableDrawBorders(ImGuiTable* table);3524IMGUI_API void TableDrawDefaultContextMenu(ImGuiTable* table, ImGuiTableFlags flags_for_section_to_display);3525IMGUI_API bool TableBeginContextMenuPopup(ImGuiTable* table);3526IMGUI_API void TableMergeDrawChannels(ImGuiTable* table);3527inline ImGuiTableInstanceData* TableGetInstanceData(ImGuiTable* table, int instance_no) { if (instance_no == 0) return &table->InstanceDataFirst; return &table->InstanceDataExtra[instance_no - 1]; }3528inline ImGuiID TableGetInstanceID(ImGuiTable* table, int instance_no) { return TableGetInstanceData(table, instance_no)->TableInstanceID; }3529IMGUI_API void TableFixDisplayOrder(ImGuiTable* table);3530IMGUI_API void TableSortSpecsSanitize(ImGuiTable* table);3531IMGUI_API void TableSortSpecsBuild(ImGuiTable* table);3532IMGUI_API ImGuiSortDirection TableGetColumnNextSortDirection(ImGuiTableColumn* column);3533IMGUI_API void TableFixColumnSortDirection(ImGuiTable* table, ImGuiTableColumn* column);3534IMGUI_API float TableGetColumnWidthAuto(ImGuiTable* table, ImGuiTableColumn* column);3535IMGUI_API void TableBeginRow(ImGuiTable* table);3536IMGUI_API void TableEndRow(ImGuiTable* table);3537IMGUI_API void TableBeginCell(ImGuiTable* table, int column_n);3538IMGUI_API void TableEndCell(ImGuiTable* table);3539IMGUI_API ImRect TableGetCellBgRect(const ImGuiTable* table, int column_n);3540IMGUI_API const char* TableGetColumnName(const ImGuiTable* table, int column_n);3541IMGUI_API ImGuiID TableGetColumnResizeID(ImGuiTable* table, int column_n, int instance_no = 0);3542IMGUI_API float TableCalcMaxColumnWidth(const ImGuiTable* table, int column_n);3543IMGUI_API void TableSetColumnWidthAutoSingle(ImGuiTable* table, int column_n);3544IMGUI_API void TableSetColumnWidthAutoAll(ImGuiTable* table);3545IMGUI_API void TableRemove(ImGuiTable* table);3546IMGUI_API void TableGcCompactTransientBuffers(ImGuiTable* table);3547IMGUI_API void TableGcCompactTransientBuffers(ImGuiTableTempData* table);3548IMGUI_API void TableGcCompactSettings();35493550// Tables: Settings3551IMGUI_API void TableLoadSettings(ImGuiTable* table);3552IMGUI_API void TableSaveSettings(ImGuiTable* table);3553IMGUI_API void TableResetSettings(ImGuiTable* table);3554IMGUI_API ImGuiTableSettings* TableGetBoundSettings(ImGuiTable* table);3555IMGUI_API void TableSettingsAddSettingsHandler();3556IMGUI_API ImGuiTableSettings* TableSettingsCreate(ImGuiID id, int columns_count);3557IMGUI_API ImGuiTableSettings* TableSettingsFindByID(ImGuiID id);35583559// Tab Bars3560inline ImGuiTabBar* GetCurrentTabBar() { ImGuiContext& g = *GImGui; return g.CurrentTabBar; }3561IMGUI_API ImGuiTabBar* TabBarFindByID(ImGuiID id);3562IMGUI_API void TabBarRemove(ImGuiTabBar* tab_bar);3563IMGUI_API bool BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& bb, ImGuiTabBarFlags flags);3564IMGUI_API ImGuiTabItem* TabBarFindTabByID(ImGuiTabBar* tab_bar, ImGuiID tab_id);3565IMGUI_API ImGuiTabItem* TabBarFindTabByOrder(ImGuiTabBar* tab_bar, int order);3566IMGUI_API ImGuiTabItem* TabBarGetCurrentTab(ImGuiTabBar* tab_bar);3567inline int TabBarGetTabOrder(ImGuiTabBar* tab_bar, ImGuiTabItem* tab) { return tab_bar->Tabs.index_from_ptr(tab); }3568IMGUI_API const char* TabBarGetTabName(ImGuiTabBar* tab_bar, ImGuiTabItem* tab);3569IMGUI_API void TabBarRemoveTab(ImGuiTabBar* tab_bar, ImGuiID tab_id);3570IMGUI_API void TabBarCloseTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab);3571IMGUI_API void TabBarQueueFocus(ImGuiTabBar* tab_bar, ImGuiTabItem* tab);3572IMGUI_API void TabBarQueueFocus(ImGuiTabBar* tab_bar, const char* tab_name);3573IMGUI_API void TabBarQueueReorder(ImGuiTabBar* tab_bar, ImGuiTabItem* tab, int offset);3574IMGUI_API void TabBarQueueReorderFromMousePos(ImGuiTabBar* tab_bar, ImGuiTabItem* tab, ImVec2 mouse_pos);3575IMGUI_API bool TabBarProcessReorder(ImGuiTabBar* tab_bar);3576IMGUI_API bool TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, ImGuiTabItemFlags flags, ImGuiWindow* docked_window);3577IMGUI_API void TabItemSpacing(const char* str_id, ImGuiTabItemFlags flags, float width);3578IMGUI_API ImVec2 TabItemCalcSize(const char* label, bool has_close_button_or_unsaved_marker);3579IMGUI_API ImVec2 TabItemCalcSize(ImGuiWindow* window);3580IMGUI_API void TabItemBackground(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImU32 col);3581IMGUI_API void TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImVec2 frame_padding, const char* label, ImGuiID tab_id, ImGuiID close_button_id, bool is_contents_visible, bool* out_just_closed, bool* out_text_clipped);35823583// Render helpers3584// AVOID USING OUTSIDE OF IMGUI.CPP! NOT FOR PUBLIC CONSUMPTION. THOSE FUNCTIONS ARE A MESS. THEIR SIGNATURE AND BEHAVIOR WILL CHANGE, THEY NEED TO BE REFACTORED INTO SOMETHING DECENT.3585// NB: All position are in absolute pixels coordinates (we are never using window coordinates internally)3586IMGUI_API void RenderText(ImVec2 pos, const char* text, const char* text_end = NULL, bool hide_text_after_hash = true);3587IMGUI_API void RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end, float wrap_width);3588IMGUI_API void RenderTextClipped(const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align = ImVec2(0, 0), const ImRect* clip_rect = NULL);3589IMGUI_API void RenderTextClippedEx(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align = ImVec2(0, 0), const ImRect* clip_rect = NULL);3590IMGUI_API void RenderTextEllipsis(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, float ellipsis_max_x, const char* text, const char* text_end, const ImVec2* text_size_if_known);3591IMGUI_API void RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool borders = true, float rounding = 0.0f);3592IMGUI_API void RenderFrameBorder(ImVec2 p_min, ImVec2 p_max, float rounding = 0.0f);3593IMGUI_API void RenderColorComponentMarker(const ImRect& bb, ImU32 col, float rounding);3594IMGUI_API void RenderColorRectWithAlphaCheckerboard(ImDrawList* draw_list, ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, float grid_step, ImVec2 grid_off, float rounding = 0.0f, ImDrawFlags flags = 0);3595IMGUI_API void RenderNavCursor(const ImRect& bb, ImGuiID id, ImGuiNavRenderCursorFlags flags = ImGuiNavRenderCursorFlags_None); // Navigation highlight3596#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS3597inline void RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavRenderCursorFlags flags = ImGuiNavRenderCursorFlags_None) { RenderNavCursor(bb, id, flags); } // Renamed in 1.91.43598#endif3599IMGUI_API const char* FindRenderedTextEnd(const char* text, const char* text_end = NULL); // Find the optional ## from which we stop displaying text.3600IMGUI_API void RenderMouseCursor(ImVec2 pos, float scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow);36013602// Render helpers (those functions don't access any ImGui state!)3603IMGUI_API void RenderArrow(ImDrawList* draw_list, ImVec2 pos, ImU32 col, ImGuiDir dir, float scale = 1.0f);3604IMGUI_API void RenderBullet(ImDrawList* draw_list, ImVec2 pos, ImU32 col);3605IMGUI_API void RenderCheckMark(ImDrawList* draw_list, ImVec2 pos, ImU32 col, float sz);3606IMGUI_API void RenderArrowPointingAt(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, ImGuiDir direction, ImU32 col);3607IMGUI_API void RenderRectFilledInRangeH(ImDrawList* draw_list, const ImRect& rect, ImU32 col, float fill_x0, float fill_x1, float rounding);3608IMGUI_API void RenderRectFilledWithHole(ImDrawList* draw_list, const ImRect& outer, const ImRect& inner, ImU32 col, float rounding);36093610// Widgets: Text3611IMGUI_API void TextEx(const char* text, const char* text_end = NULL, ImGuiTextFlags flags = 0);3612IMGUI_API void TextAligned(float align_x, float size_x, const char* fmt, ...); // FIXME-WIP: Works but API is likely to be reworked. This is designed for 1 item on the line. (#7024)3613IMGUI_API void TextAlignedV(float align_x, float size_x, const char* fmt, va_list args);36143615// Widgets3616IMGUI_API bool ButtonEx(const char* label, const ImVec2& size_arg = ImVec2(0, 0), ImGuiButtonFlags flags = 0);3617IMGUI_API bool ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size_arg, ImGuiButtonFlags flags = 0);3618IMGUI_API bool ImageButtonEx(ImGuiID id, ImTextureRef tex_ref, const ImVec2& image_size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& bg_col, const ImVec4& tint_col, ImGuiButtonFlags flags = 0);3619IMGUI_API void SeparatorEx(ImGuiSeparatorFlags flags, float thickness = 1.0f);3620IMGUI_API void SeparatorTextEx(ImGuiID id, const char* label, const char* label_end, float extra_width);3621IMGUI_API bool CheckboxFlags(const char* label, ImS64* flags, ImS64 flags_value);3622IMGUI_API bool CheckboxFlags(const char* label, ImU64* flags, ImU64 flags_value);36233624// Widgets: Window Decorations3625IMGUI_API bool CloseButton(ImGuiID id, const ImVec2& pos);3626IMGUI_API bool CollapseButton(ImGuiID id, const ImVec2& pos);3627IMGUI_API void Scrollbar(ImGuiAxis axis);3628IMGUI_API bool ScrollbarEx(const ImRect& bb, ImGuiID id, ImGuiAxis axis, ImS64* p_scroll_v, ImS64 avail_v, ImS64 contents_v, ImDrawFlags draw_rounding_flags = 0);3629IMGUI_API ImRect GetWindowScrollbarRect(ImGuiWindow* window, ImGuiAxis axis);3630IMGUI_API ImGuiID GetWindowScrollbarID(ImGuiWindow* window, ImGuiAxis axis);3631IMGUI_API ImGuiID GetWindowResizeCornerID(ImGuiWindow* window, int n); // 0..3: corners3632IMGUI_API ImGuiID GetWindowResizeBorderID(ImGuiWindow* window, ImGuiDir dir);36333634// Widgets low-level behaviors3635IMGUI_API bool ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags = 0);3636IMGUI_API bool DragBehavior(ImGuiID id, ImGuiDataType data_type, void* p_v, float v_speed, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags);3637IMGUI_API bool SliderBehavior(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, void* p_v, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags, ImRect* out_grab_bb);3638IMGUI_API bool SplitterBehavior(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float* size1, float* size2, float min_size1, float min_size2, float hover_extend = 0.0f, float hover_visibility_delay = 0.0f, ImU32 bg_col = 0);36393640// Widgets: Tree Nodes3641IMGUI_API bool TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* label, const char* label_end = NULL);3642IMGUI_API void TreeNodeDrawLineToChildNode(const ImVec2& target_pos);3643IMGUI_API void TreeNodeDrawLineToTreePop(const ImGuiTreeNodeStackData* data);3644IMGUI_API void TreePushOverrideID(ImGuiID id);3645IMGUI_API bool TreeNodeGetOpen(ImGuiID storage_id);3646IMGUI_API void TreeNodeSetOpen(ImGuiID storage_id, bool open);3647IMGUI_API bool TreeNodeUpdateNextOpen(ImGuiID storage_id, ImGuiTreeNodeFlags flags); // Return open state. Consume previous SetNextItemOpen() data, if any. May return true when logging.36483649// Template functions are instantiated in imgui_widgets.cpp for a finite number of types.3650// To use them externally (for custom widget) you may need an "extern template" statement in your code in order to link to existing instances and silence Clang warnings (see #2036).3651// e.g. " extern template IMGUI_API float RoundScalarWithFormatT<float, float>(const char* format, ImGuiDataType data_type, float v); "3652template<typename T, typename SIGNED_T, typename FLOAT_T> IMGUI_API float ScaleRatioFromValueT(ImGuiDataType data_type, T v, T v_min, T v_max, bool is_logarithmic, float logarithmic_zero_epsilon, float zero_deadzone_size);3653template<typename T, typename SIGNED_T, typename FLOAT_T> IMGUI_API T ScaleValueFromRatioT(ImGuiDataType data_type, float t, T v_min, T v_max, bool is_logarithmic, float logarithmic_zero_epsilon, float zero_deadzone_size);3654template<typename T, typename SIGNED_T, typename FLOAT_T> IMGUI_API bool DragBehaviorT(ImGuiDataType data_type, T* v, float v_speed, T v_min, T v_max, const char* format, ImGuiSliderFlags flags);3655template<typename T, typename SIGNED_T, typename FLOAT_T> IMGUI_API bool SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, T* v, T v_min, T v_max, const char* format, ImGuiSliderFlags flags, ImRect* out_grab_bb);3656template<typename T> IMGUI_API T RoundScalarWithFormatT(const char* format, ImGuiDataType data_type, T v);3657template<typename T> IMGUI_API bool CheckboxFlagsT(const char* label, T* flags, T flags_value);36583659// Data type helpers3660IMGUI_API const ImGuiDataTypeInfo* DataTypeGetInfo(ImGuiDataType data_type);3661IMGUI_API int DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* p_data, const char* format);3662IMGUI_API void DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, const void* arg_1, const void* arg_2);3663IMGUI_API bool DataTypeApplyFromText(const char* buf, ImGuiDataType data_type, void* p_data, const char* format, void* p_data_when_empty = NULL);3664IMGUI_API int DataTypeCompare(ImGuiDataType data_type, const void* arg_1, const void* arg_2);3665IMGUI_API bool DataTypeClamp(ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max);3666IMGUI_API bool DataTypeIsZero(ImGuiDataType data_type, const void* p_data);36673668// InputText3669IMGUI_API bool InputTextEx(const char* label, const char* hint, char* buf, int buf_size, const ImVec2& size_arg, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback = NULL, void* user_data = NULL);3670IMGUI_API void InputTextDeactivateHook(ImGuiID id);3671IMGUI_API bool TempInputText(const ImRect& bb, ImGuiID id, const char* label, char* buf, int buf_size, ImGuiInputTextFlags flags);3672IMGUI_API bool TempInputScalar(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* p_data, const char* format, const void* p_clamp_min = NULL, const void* p_clamp_max = NULL);3673inline bool TempInputIsActive(ImGuiID id) { ImGuiContext& g = *GImGui; return g.ActiveId == id && g.TempInputId == id; }3674inline ImGuiInputTextState* GetInputTextState(ImGuiID id) { ImGuiContext& g = *GImGui; return (id != 0 && g.InputTextState.ID == id) ? &g.InputTextState : NULL; } // Get input text state if active3675IMGUI_API void SetNextItemRefVal(ImGuiDataType data_type, void* p_data);3676inline bool IsItemActiveAsInputText() { ImGuiContext& g = *GImGui; return g.ActiveId != 0 && g.ActiveId == g.LastItemData.ID && g.InputTextState.ID == g.LastItemData.ID; } // This may be useful to apply workaround that a based on distinguish whenever an item is active as a text input field.36773678// Color3679IMGUI_API void ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags flags);3680IMGUI_API void ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags);3681IMGUI_API void ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags flags);3682inline void SetNextItemColorMarker(ImU32 col) { ImGuiContext& g = *GImGui; g.NextItemData.HasFlags |= ImGuiNextItemDataFlags_HasColorMarker; g.NextItemData.ColorMarker = col; }36833684// Plot3685IMGUI_API int PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, const ImVec2& size_arg);36863687// Shade functions (write over already created vertices)3688IMGUI_API void ShadeVertsLinearColorGradientKeepAlpha(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, ImVec2 gradient_p0, ImVec2 gradient_p1, ImU32 col0, ImU32 col1);3689IMGUI_API void ShadeVertsLinearUV(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, bool clamp);3690IMGUI_API void ShadeVertsTransformPos(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, const ImVec2& pivot_in, float cos_a, float sin_a, const ImVec2& pivot_out);36913692// Garbage collection3693IMGUI_API void GcCompactTransientMiscBuffers();3694IMGUI_API void GcCompactTransientWindowBuffers(ImGuiWindow* window);3695IMGUI_API void GcAwakeTransientWindowBuffers(ImGuiWindow* window);36963697// Error handling, State Recovery3698IMGUI_API bool ErrorLog(const char* msg);3699IMGUI_API void ErrorRecoveryStoreState(ImGuiErrorRecoveryState* state_out);3700IMGUI_API void ErrorRecoveryTryToRecoverState(const ImGuiErrorRecoveryState* state_in);3701IMGUI_API void ErrorRecoveryTryToRecoverWindowState(const ImGuiErrorRecoveryState* state_in);3702IMGUI_API void ErrorCheckUsingSetCursorPosToExtendParentBoundaries();3703IMGUI_API void ErrorCheckEndFrameFinalizeErrorTooltip();3704IMGUI_API bool BeginErrorTooltip();3705IMGUI_API void EndErrorTooltip();37063707// Debug Tools3708IMGUI_API void DebugAllocHook(ImGuiDebugAllocInfo* info, int frame_count, void* ptr, size_t size); // size >= 0 : alloc, size = -1 : free3709IMGUI_API void DebugDrawCursorPos(ImU32 col = IM_COL32(255, 0, 0, 255));3710IMGUI_API void DebugDrawLineExtents(ImU32 col = IM_COL32(255, 0, 0, 255));3711IMGUI_API void DebugDrawItemRect(ImU32 col = IM_COL32(255, 0, 0, 255));3712IMGUI_API void DebugTextUnformattedWithLocateItem(const char* line_begin, const char* line_end);3713IMGUI_API void DebugLocateItem(ImGuiID target_id); // Call sparingly: only 1 at the same time!3714IMGUI_API void DebugLocateItemOnHover(ImGuiID target_id); // Only call on reaction to a mouse Hover: because only 1 at the same time!3715IMGUI_API void DebugLocateItemResolveWithLastItem();3716IMGUI_API void DebugBreakClearData();3717IMGUI_API bool DebugBreakButton(const char* label, const char* description_of_location);3718IMGUI_API void DebugBreakButtonTooltip(bool keyboard_only, const char* description_of_location);3719IMGUI_API void ShowFontAtlas(ImFontAtlas* atlas);3720IMGUI_API ImU64 DebugTextureIDToU64(ImTextureID tex_id);3721IMGUI_API void DebugHookIdInfo(ImGuiID id, ImGuiDataType data_type, const void* data_id, const void* data_id_end);3722IMGUI_API void DebugNodeColumns(ImGuiOldColumns* columns);3723IMGUI_API void DebugNodeDrawList(ImGuiWindow* window, ImGuiViewportP* viewport, const ImDrawList* draw_list, const char* label);3724IMGUI_API void DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList* out_draw_list, const ImDrawList* draw_list, const ImDrawCmd* draw_cmd, bool show_mesh, bool show_aabb);3725IMGUI_API void DebugNodeFont(ImFont* font);3726IMGUI_API void DebugNodeFontGlyphesForSrcMask(ImFont* font, ImFontBaked* baked, int src_mask);3727IMGUI_API void DebugNodeFontGlyph(ImFont* font, const ImFontGlyph* glyph);3728IMGUI_API void DebugNodeTexture(ImTextureData* tex, int int_id, const ImFontAtlasRect* highlight_rect = NULL); // ID used to facilitate persisting the "current" texture.3729IMGUI_API void DebugNodeStorage(ImGuiStorage* storage, const char* label);3730IMGUI_API void DebugNodeTabBar(ImGuiTabBar* tab_bar, const char* label);3731IMGUI_API void DebugNodeTable(ImGuiTable* table);3732IMGUI_API void DebugNodeTableSettings(ImGuiTableSettings* settings);3733IMGUI_API void DebugNodeInputTextState(ImGuiInputTextState* state);3734IMGUI_API void DebugNodeTypingSelectState(ImGuiTypingSelectState* state);3735IMGUI_API void DebugNodeMultiSelectState(ImGuiMultiSelectState* state);3736IMGUI_API void DebugNodeWindow(ImGuiWindow* window, const char* label);3737IMGUI_API void DebugNodeWindowSettings(ImGuiWindowSettings* settings);3738IMGUI_API void DebugNodeWindowsList(ImVector<ImGuiWindow*>* windows, const char* label);3739IMGUI_API void DebugNodeWindowsListByBeginStackParent(ImGuiWindow** windows, int windows_size, ImGuiWindow* parent_in_begin_stack);3740IMGUI_API void DebugNodeViewport(ImGuiViewportP* viewport);3741IMGUI_API void DebugRenderKeyboardPreview(ImDrawList* draw_list);3742IMGUI_API void DebugRenderViewportThumbnail(ImDrawList* draw_list, ImGuiViewportP* viewport, const ImRect& bb);37433744// Obsolete functions3745#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS3746//inline void SetItemUsingMouseWheel() { SetItemKeyOwner(ImGuiKey_MouseWheelY); } // Changed in 1.893747//inline bool TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags = 0) { return TreeNodeUpdateNextOpen(id, flags); } // Renamed in 1.893748//inline bool IsKeyPressedMap(ImGuiKey key, bool repeat = true) { IM_ASSERT(IsNamedKey(key)); return IsKeyPressed(key, repeat); } // Removed in 1.87: Mapping from named key is always identity!37493750// Refactored focus/nav/tabbing system in 1.82 and 1.84. If you have old/custom copy-and-pasted widgets which used FocusableItemRegister():3751// (Old) IMGUI_VERSION_NUM < 18209: using 'ItemAdd(....)' and 'bool tab_focused = FocusableItemRegister(...)'3752// (Old) IMGUI_VERSION_NUM >= 18209: using 'ItemAdd(..., ImGuiItemAddFlags_Focusable)' and 'bool tab_focused = (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_Focused) != 0'3753// (New) IMGUI_VERSION_NUM >= 18413: using 'ItemAdd(..., ImGuiItemFlags_Inputable)' and 'bool tab_focused = (g.NavActivateId == id && (g.NavActivateFlags & ImGuiActivateFlags_PreferInput))'3754//inline bool FocusableItemRegister(ImGuiWindow* window, ImGuiID id) // -> pass ImGuiItemAddFlags_Inputable flag to ItemAdd()3755//inline void FocusableItemUnregister(ImGuiWindow* window) // -> unnecessary: TempInputText() uses ImGuiInputTextFlags_MergedItem3756#endif37573758} // namespace ImGui375937603761//-----------------------------------------------------------------------------3762// [SECTION] ImFontLoader3763//-----------------------------------------------------------------------------37643765// Hooks and storage for a given font backend.3766// This structure is likely to evolve as we add support for incremental atlas updates.3767// Conceptually this could be public, but API is still going to be evolve.3768struct ImFontLoader3769{3770const char* Name;3771bool (*LoaderInit)(ImFontAtlas* atlas);3772void (*LoaderShutdown)(ImFontAtlas* atlas);3773bool (*FontSrcInit)(ImFontAtlas* atlas, ImFontConfig* src);3774void (*FontSrcDestroy)(ImFontAtlas* atlas, ImFontConfig* src);3775bool (*FontSrcContainsGlyph)(ImFontAtlas* atlas, ImFontConfig* src, ImWchar codepoint);3776bool (*FontBakedInit)(ImFontAtlas* atlas, ImFontConfig* src, ImFontBaked* baked, void* loader_data_for_baked_src);3777void (*FontBakedDestroy)(ImFontAtlas* atlas, ImFontConfig* src, ImFontBaked* baked, void* loader_data_for_baked_src);3778bool (*FontBakedLoadGlyph)(ImFontAtlas* atlas, ImFontConfig* src, ImFontBaked* baked, void* loader_data_for_baked_src, ImWchar codepoint, ImFontGlyph* out_glyph, float* out_advance_x);37793780// Size of backend data, Per Baked * Per Source. Buffers are managed by core to avoid excessive allocations.3781// FIXME: At this point the two other types of buffers may be managed by core to be consistent?3782size_t FontBakedSrcLoaderDataSize;37833784ImFontLoader() { memset(this, 0, sizeof(*this)); }3785};37863787#ifdef IMGUI_ENABLE_STB_TRUETYPE3788IMGUI_API const ImFontLoader* ImFontAtlasGetFontLoaderForStbTruetype();3789#endif3790#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS3791typedef ImFontLoader ImFontBuilderIO; // [renamed/changed in 1.92] The types are not actually compatible but we provide this as a compile-time error report helper.3792#endif37933794//-----------------------------------------------------------------------------3795// [SECTION] ImFontAtlas internal API3796//-----------------------------------------------------------------------------37973798#define IMGUI_FONT_SIZE_MAX (512.0f)3799#define IMGUI_FONT_SIZE_THRESHOLD_FOR_LOADADVANCEXONLYMODE (128.0f)38003801// Helpers: ImTextureRef ==/!= operators provided as convenience3802// (note that _TexID and _TexData are never set simultaneously)3803inline bool operator==(const ImTextureRef& lhs, const ImTextureRef& rhs) { return lhs._TexID == rhs._TexID && lhs._TexData == rhs._TexData; }3804inline bool operator!=(const ImTextureRef& lhs, const ImTextureRef& rhs) { return lhs._TexID != rhs._TexID || lhs._TexData != rhs._TexData; }38053806// Refer to ImFontAtlasPackGetRect() to better understand how this works.3807#define ImFontAtlasRectId_IndexMask_ (0x0007FFFF) // 20-bits signed: index to access builder->RectsIndex[].3808#define ImFontAtlasRectId_GenerationMask_ (0x3FF00000) // 10-bits: entry generation, so each ID is unique and get can safely detected old identifiers.3809#define ImFontAtlasRectId_GenerationShift_ (20)3810inline int ImFontAtlasRectId_GetIndex(ImFontAtlasRectId id) { return (id & ImFontAtlasRectId_IndexMask_); }3811inline unsigned int ImFontAtlasRectId_GetGeneration(ImFontAtlasRectId id) { return (unsigned int)(id & ImFontAtlasRectId_GenerationMask_) >> ImFontAtlasRectId_GenerationShift_; }3812inline ImFontAtlasRectId ImFontAtlasRectId_Make(int index_idx, int gen_idx) { IM_ASSERT(index_idx >= 0 && index_idx <= ImFontAtlasRectId_IndexMask_ && gen_idx <= (ImFontAtlasRectId_GenerationMask_ >> ImFontAtlasRectId_GenerationShift_)); return (ImFontAtlasRectId)(index_idx | (gen_idx << ImFontAtlasRectId_GenerationShift_)); }38133814// Packed rectangle lookup entry (we need an indirection to allow removing/reordering rectangles)3815// User are returned ImFontAtlasRectId values which are meant to be persistent.3816// We handle this with an indirection. While Rects[] may be in theory shuffled, compacted etc., RectsIndex[] cannot it is keyed by ImFontAtlasRectId.3817// RectsIndex[] is used both as an index into Rects[] and an index into itself. This is basically a free-list. See ImFontAtlasBuildAllocRectIndexEntry() code.3818// Having this also makes it easier to e.g. sort rectangles during repack.3819struct ImFontAtlasRectEntry3820{3821int TargetIndex : 20; // When Used: ImFontAtlasRectId -> into Rects[]. When unused: index to next unused RectsIndex[] slot to consume free-list.3822unsigned int Generation : 10; // Increased each time the entry is reused for a new rectangle.3823unsigned int IsUsed : 1;3824};38253826// Data available to potential texture post-processing functions3827struct ImFontAtlasPostProcessData3828{3829ImFontAtlas* FontAtlas;3830ImFont* Font;3831ImFontConfig* FontSrc;3832ImFontBaked* FontBaked;3833ImFontGlyph* Glyph;38343835// Pixel data3836void* Pixels;3837ImTextureFormat Format;3838int Pitch;3839int Width;3840int Height;3841};38423843// We avoid dragging imstb_rectpack.h into public header (partly because binding generators are having issues with it)3844#ifdef IMGUI_STB_NAMESPACE3845namespace IMGUI_STB_NAMESPACE { struct stbrp_node; }3846typedef IMGUI_STB_NAMESPACE::stbrp_node stbrp_node_im;3847#else3848struct stbrp_node;3849typedef stbrp_node stbrp_node_im;3850#endif3851struct stbrp_context_opaque { char data[80]; };38523853// Internal storage for incrementally packing and building a ImFontAtlas3854struct ImFontAtlasBuilder3855{3856stbrp_context_opaque PackContext; // Actually 'stbrp_context' but we don't want to define this in the header file.3857ImVector<stbrp_node_im> PackNodes;3858ImVector<ImTextureRect> Rects;3859ImVector<ImFontAtlasRectEntry> RectsIndex; // ImFontAtlasRectId -> index into Rects[]3860ImVector<unsigned char> TempBuffer; // Misc scratch buffer3861int RectsIndexFreeListStart;// First unused entry3862int RectsPackedCount; // Number of packed rectangles.3863int RectsPackedSurface; // Number of packed pixels. Used when compacting to heuristically find the ideal texture size.3864int RectsDiscardedCount;3865int RectsDiscardedSurface;3866int FrameCount; // Current frame count3867ImVec2i MaxRectSize; // Largest rectangle to pack (de-facto used as a "minimum texture size")3868ImVec2i MaxRectBounds; // Bottom-right most used pixels3869bool LockDisableResize; // Disable resizing texture3870bool PreloadedAllGlyphsRanges; // Set when missing ImGuiBackendFlags_RendererHasTextures features forces atlas to preload everything.38713872// Cache of all ImFontBaked3873ImStableVector<ImFontBaked,32> BakedPool;3874ImGuiStorage BakedMap; // BakedId --> ImFontBaked*3875int BakedDiscardedCount;38763877// Custom rectangle identifiers3878ImFontAtlasRectId PackIdMouseCursors; // White pixel + mouse cursors. Also happen to be fallback in case of packing failure.3879ImFontAtlasRectId PackIdLinesTexData;38803881ImFontAtlasBuilder() { memset(this, 0, sizeof(*this)); FrameCount = -1; RectsIndexFreeListStart = -1; PackIdMouseCursors = PackIdLinesTexData = -1; }3882};38833884IMGUI_API void ImFontAtlasBuildInit(ImFontAtlas* atlas);3885IMGUI_API void ImFontAtlasBuildDestroy(ImFontAtlas* atlas);3886IMGUI_API void ImFontAtlasBuildMain(ImFontAtlas* atlas);3887IMGUI_API void ImFontAtlasBuildSetupFontLoader(ImFontAtlas* atlas, const ImFontLoader* font_loader);3888IMGUI_API void ImFontAtlasBuildNotifySetFont(ImFontAtlas* atlas, ImFont* old_font, ImFont* new_font);3889IMGUI_API void ImFontAtlasBuildUpdatePointers(ImFontAtlas* atlas);3890IMGUI_API void ImFontAtlasBuildRenderBitmapFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char);3891IMGUI_API void ImFontAtlasBuildClear(ImFontAtlas* atlas); // Clear output and custom rects38923893IMGUI_API ImTextureData* ImFontAtlasTextureAdd(ImFontAtlas* atlas, int w, int h);3894IMGUI_API void ImFontAtlasTextureMakeSpace(ImFontAtlas* atlas);3895IMGUI_API void ImFontAtlasTextureRepack(ImFontAtlas* atlas, int w, int h);3896IMGUI_API void ImFontAtlasTextureGrow(ImFontAtlas* atlas, int old_w = -1, int old_h = -1);3897IMGUI_API void ImFontAtlasTextureCompact(ImFontAtlas* atlas);3898IMGUI_API ImVec2i ImFontAtlasTextureGetSizeEstimate(ImFontAtlas* atlas);38993900IMGUI_API void ImFontAtlasBuildSetupFontSpecialGlyphs(ImFontAtlas* atlas, ImFont* font, ImFontConfig* src);3901IMGUI_API void ImFontAtlasBuildLegacyPreloadAllGlyphRanges(ImFontAtlas* atlas); // Legacy3902IMGUI_API void ImFontAtlasBuildGetOversampleFactors(ImFontConfig* src, ImFontBaked* baked, int* out_oversample_h, int* out_oversample_v);3903IMGUI_API void ImFontAtlasBuildDiscardBakes(ImFontAtlas* atlas, int unused_frames);39043905IMGUI_API bool ImFontAtlasFontSourceInit(ImFontAtlas* atlas, ImFontConfig* src);3906IMGUI_API void ImFontAtlasFontSourceAddToFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* src);3907IMGUI_API void ImFontAtlasFontDestroySourceData(ImFontAtlas* atlas, ImFontConfig* src);3908IMGUI_API bool ImFontAtlasFontInitOutput(ImFontAtlas* atlas, ImFont* font); // Using FontDestroyOutput/FontInitOutput sequence useful notably if font loader params have changed3909IMGUI_API void ImFontAtlasFontDestroyOutput(ImFontAtlas* atlas, ImFont* font);3910IMGUI_API void ImFontAtlasFontRebuildOutput(ImFontAtlas* atlas, ImFont* font);3911IMGUI_API void ImFontAtlasFontDiscardBakes(ImFontAtlas* atlas, ImFont* font, int unused_frames);39123913IMGUI_API ImGuiID ImFontAtlasBakedGetId(ImGuiID font_id, float baked_size, float baked_weight, float rasterizer_density);3914IMGUI_API ImFontBaked* ImFontAtlasBakedGetOrAdd(ImFontAtlas* atlas, ImFont* font, float font_size, float font_weight, float font_rasterizer_density);3915IMGUI_API ImFontBaked* ImFontAtlasBakedGetClosestMatch(ImFontAtlas* atlas, ImFont* font, float font_size, float font_weight, float font_rasterizer_density);3916IMGUI_API ImFontBaked* ImFontAtlasBakedAdd(ImFontAtlas* atlas, ImFont* font, float font_size, float font_weight, float font_rasterizer_density, ImGuiID baked_id);3917IMGUI_API void ImFontAtlasBakedDiscard(ImFontAtlas* atlas, ImFont* font, ImFontBaked* baked);3918IMGUI_API ImFontGlyph* ImFontAtlasBakedAddFontGlyph(ImFontAtlas* atlas, ImFontBaked* baked, ImFontConfig* src, const ImFontGlyph* in_glyph);3919IMGUI_API void ImFontAtlasBakedAddFontGlyphAdvancedX(ImFontAtlas* atlas, ImFontBaked* baked, ImFontConfig* src, ImWchar codepoint, float advance_x);3920IMGUI_API void ImFontAtlasBakedDiscardFontGlyph(ImFontAtlas* atlas, ImFont* font, ImFontBaked* baked, ImFontGlyph* glyph);3921IMGUI_API void ImFontAtlasBakedSetFontGlyphBitmap(ImFontAtlas* atlas, ImFontBaked* baked, ImFontConfig* src, ImFontGlyph* glyph, ImTextureRect* r, const unsigned char* src_pixels, ImTextureFormat src_fmt, int src_pitch);39223923IMGUI_API void ImFontAtlasPackInit(ImFontAtlas* atlas);3924IMGUI_API ImFontAtlasRectId ImFontAtlasPackAddRect(ImFontAtlas* atlas, int w, int h, ImFontAtlasRectEntry* overwrite_entry = NULL);3925IMGUI_API ImTextureRect* ImFontAtlasPackGetRect(ImFontAtlas* atlas, ImFontAtlasRectId id);3926IMGUI_API ImTextureRect* ImFontAtlasPackGetRectSafe(ImFontAtlas* atlas, ImFontAtlasRectId id);3927IMGUI_API void ImFontAtlasPackDiscardRect(ImFontAtlas* atlas, ImFontAtlasRectId id);39283929IMGUI_API void ImFontAtlasUpdateNewFrame(ImFontAtlas* atlas, int frame_count, bool renderer_has_textures);3930IMGUI_API void ImFontAtlasAddDrawListSharedData(ImFontAtlas* atlas, ImDrawListSharedData* data);3931IMGUI_API void ImFontAtlasRemoveDrawListSharedData(ImFontAtlas* atlas, ImDrawListSharedData* data);3932IMGUI_API void ImFontAtlasUpdateDrawListsTextures(ImFontAtlas* atlas, ImTextureRef old_tex, ImTextureRef new_tex);3933IMGUI_API void ImFontAtlasUpdateDrawListsSharedData(ImFontAtlas* atlas);39343935IMGUI_API void ImFontAtlasTextureBlockConvert(const unsigned char* src_pixels, ImTextureFormat src_fmt, int src_pitch, unsigned char* dst_pixels, ImTextureFormat dst_fmt, int dst_pitch, int w, int h);3936IMGUI_API void ImFontAtlasTextureBlockPostProcess(ImFontAtlasPostProcessData* data);3937IMGUI_API void ImFontAtlasTextureBlockPostProcessMultiply(ImFontAtlasPostProcessData* data, float multiply_factor);3938IMGUI_API void ImFontAtlasTextureBlockFill(ImTextureData* dst_tex, int dst_x, int dst_y, int w, int h, ImU32 col);3939IMGUI_API void ImFontAtlasTextureBlockCopy(ImTextureData* src_tex, int src_x, int src_y, ImTextureData* dst_tex, int dst_x, int dst_y, int w, int h);3940IMGUI_API void ImFontAtlasTextureBlockQueueUpload(ImFontAtlas* atlas, ImTextureData* tex, int x, int y, int w, int h);39413942IMGUI_API int ImTextureDataGetFormatBytesPerPixel(ImTextureFormat format);3943IMGUI_API const char* ImTextureDataGetStatusName(ImTextureStatus status);3944IMGUI_API const char* ImTextureDataGetFormatName(ImTextureFormat format);39453946#ifndef IMGUI_DISABLE_DEBUG_TOOLS3947IMGUI_API void ImFontAtlasDebugLogTextureRequests(ImFontAtlas* atlas);3948#endif39493950IMGUI_API bool ImFontAtlasGetMouseCursorTexData(ImFontAtlas* atlas, ImGuiMouseCursor cursor_type, ImVec2* out_offset, ImVec2* out_size, ImVec2 out_uv_border[2], ImVec2 out_uv_fill[2]);39513952//-----------------------------------------------------------------------------3953// [SECTION] Test Engine specific hooks (imgui_test_engine)3954//-----------------------------------------------------------------------------39553956#ifdef IMGUI_ENABLE_TEST_ENGINE3957extern void ImGuiTestEngineHook_ItemAdd(ImGuiContext* ctx, ImGuiID id, const ImRect& bb, const ImGuiLastItemData* item_data); // item_data may be NULL3958extern void ImGuiTestEngineHook_ItemInfo(ImGuiContext* ctx, ImGuiID id, const char* label, ImGuiItemStatusFlags flags);3959extern void ImGuiTestEngineHook_Log(ImGuiContext* ctx, const char* fmt, ...);3960extern const char* ImGuiTestEngine_FindItemDebugLabel(ImGuiContext* ctx, ImGuiID id);39613962// In IMGUI_VERSION_NUM >= 18934: changed IMGUI_TEST_ENGINE_ITEM_ADD(bb,id) to IMGUI_TEST_ENGINE_ITEM_ADD(id,bb,item_data);3963#define IMGUI_TEST_ENGINE_ITEM_ADD(_ID,_BB,_ITEM_DATA) if (g.TestEngineHookItems) ImGuiTestEngineHook_ItemAdd(&g, _ID, _BB, _ITEM_DATA) // Register item bounding box3964#define IMGUI_TEST_ENGINE_ITEM_INFO(_ID,_LABEL,_FLAGS) if (g.TestEngineHookItems) ImGuiTestEngineHook_ItemInfo(&g, _ID, _LABEL, _FLAGS) // Register item label and status flags (optional)3965#define IMGUI_TEST_ENGINE_LOG(_FMT,...) ImGuiTestEngineHook_Log(&g, _FMT, __VA_ARGS__) // Custom log entry from user land into test log3966#else3967#define IMGUI_TEST_ENGINE_ITEM_ADD(_ID,_BB,_ITEM_DATA) ((void)0)3968#define IMGUI_TEST_ENGINE_ITEM_INFO(_ID,_LABEL,_FLAGS) ((void)g)3969#endif39703971//-----------------------------------------------------------------------------39723973#if defined(__clang__)3974#pragma clang diagnostic pop3975#elif defined(__GNUC__)3976#pragma GCC diagnostic pop3977#endif39783979#ifdef _MSC_VER3980#pragma warning (pop)3981#endif39823983#endif // #ifndef IMGUI_DISABLE398439853986