vsgImGui 0.7.0
VulkanSceneGraph, ImGui and ImPlot integration library
Loading...
Searching...
No Matches
imgui_internal.h
1// dear imgui, v1.91.6
2// (internal structures/api)
3
4// You may use this file to debug, understand or extend Dear ImGui features but we don't provide any guarantee of forward compatibility.
5
6/*
7
8Index of this file:
9
10// [SECTION] Header mess
11// [SECTION] Forward declarations
12// [SECTION] Context pointer
13// [SECTION] STB libraries includes
14// [SECTION] Macros
15// [SECTION] Generic helpers
16// [SECTION] ImDrawList support
17// [SECTION] Data types support
18// [SECTION] Widgets support: flags, enums, data structures
19// [SECTION] Popup support
20// [SECTION] Inputs support
21// [SECTION] Clipper support
22// [SECTION] Navigation support
23// [SECTION] Typing-select support
24// [SECTION] Columns support
25// [SECTION] Box-select support
26// [SECTION] Multi-select support
27// [SECTION] Docking support
28// [SECTION] Viewport support
29// [SECTION] Settings support
30// [SECTION] Localization support
31// [SECTION] Error handling, State recovery support
32// [SECTION] Metrics, Debug tools
33// [SECTION] Generic context hooks
34// [SECTION] ImGuiContext (main imgui context)
35// [SECTION] ImGuiWindowTempData, ImGuiWindow
36// [SECTION] Tab bar, Tab item support
37// [SECTION] Table support
38// [SECTION] ImGui internal API
39// [SECTION] ImFontAtlas internal API
40// [SECTION] Test Engine specific hooks (imgui_test_engine)
41
42*/
43
44#pragma once
45#ifndef IMGUI_DISABLE
46
47//-----------------------------------------------------------------------------
48// [SECTION] Header mess
49//-----------------------------------------------------------------------------
50
51#ifndef IMGUI_VERSION
52#include "imgui.h"
53#endif
54
55#include <stdio.h> // FILE*, sscanf
56#include <stdlib.h> // NULL, malloc, free, qsort, atoi, atof
57#include <math.h> // sqrtf, fabsf, fmodf, powf, floorf, ceilf, cosf, sinf
58#include <limits.h> // INT_MIN, INT_MAX
59
60// Enable SSE intrinsics if available
61#if (defined __SSE__ || defined __x86_64__ || defined _M_X64 || (defined(_M_IX86_FP) && (_M_IX86_FP >= 1))) && !defined(IMGUI_DISABLE_SSE)
62#define IMGUI_ENABLE_SSE
63#include <immintrin.h>
64#if (defined __AVX__ || defined __SSE4_2__)
65#define IMGUI_ENABLE_SSE4_2
66#include <nmmintrin.h>
67#endif
68#endif
69// Emscripten has partial SSE 4.2 support where _mm_crc32_u32 is not available. See https://emscripten.org/docs/porting/simd.html#id11 and #8213
70#if defined(IMGUI_ENABLE_SSE4_2) && !defined(IMGUI_USE_LEGACY_CRC32_ADLER) && !defined(__EMSCRIPTEN__)
71#define IMGUI_ENABLE_SSE4_2_CRC
72#endif
73
74// Visual Studio warnings
75#ifdef _MSC_VER
76#pragma warning (push)
77#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)
78#pragma warning (disable: 26812) // The enum type 'xxx' is unscoped. Prefer 'enum class' over 'enum' (Enum.3). [MSVC Static Analyzer)
79#pragma warning (disable: 26495) // [Static Analyzer] Variable 'XXX' is uninitialized. Always initialize a member variable (type.6).
80#if defined(_MSC_VER) && _MSC_VER >= 1922 // MSVC 2019 16.2 or later
81#pragma warning (disable: 5054) // operator '|': deprecated between enumerations of different types
82#endif
83#endif
84
85// Clang/GCC warnings with -Weverything
86#if defined(__clang__)
87#pragma clang diagnostic push
88#if __has_warning("-Wunknown-warning-option")
89#pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx'
90#endif
91#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx'
92#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants ok, for ImFloor()
93#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast
94#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning: zero as null pointer constant
95#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function
96#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision
97#pragma clang diagnostic ignored "-Wmissing-noreturn" // warning: function 'xxx' could be declared with attribute 'noreturn'
98#pragma clang diagnostic ignored "-Wdeprecated-enum-enum-conversion"// warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated
99#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" // warning: 'xxx' is an unsafe pointer used for buffer access
100#pragma clang diagnostic ignored "-Wnontrivial-memaccess" // warning: first argument in call to 'memset' is a pointer to non-trivially copyable type
101#elif defined(__GNUC__)
102#pragma GCC diagnostic push
103#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind
104#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 instead
105#pragma GCC diagnostic ignored "-Wdeprecated-enum-enum-conversion" // warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated
106#endif
107
108// In 1.89.4, we moved the implementation of "courtesy maths operators" from imgui_internal.h in imgui.h
109// As they are frequently requested, we do not want to encourage to many people using imgui_internal.h
110#if defined(IMGUI_DEFINE_MATH_OPERATORS) && !defined(IMGUI_DEFINE_MATH_OPERATORS_IMPLEMENTED)
111#error Please '#define IMGUI_DEFINE_MATH_OPERATORS' _BEFORE_ including imgui.h!
112#endif
113
114// Legacy defines
115#ifdef IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS // Renamed in 1.74
116#error Use IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS
117#endif
118#ifdef IMGUI_DISABLE_MATH_FUNCTIONS // Renamed in 1.74
119#error Use IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS
120#endif
121
122// Enable stb_truetype by default unless FreeType is enabled.
123// You can compile with both by defining both IMGUI_ENABLE_FREETYPE and IMGUI_ENABLE_STB_TRUETYPE together.
124#ifndef IMGUI_ENABLE_FREETYPE
125#define IMGUI_ENABLE_STB_TRUETYPE
126#endif
127
128//-----------------------------------------------------------------------------
129// [SECTION] Forward declarations
130//-----------------------------------------------------------------------------
131
132struct ImBitVector; // Store 1-bit per value
133struct ImRect; // An axis-aligned rectangle (2 points)
134struct ImDrawDataBuilder; // Helper to build a ImDrawData instance
135struct ImDrawListSharedData; // Data shared between all ImDrawList instances
136struct ImGuiBoxSelectState; // Box-selection state (currently used by multi-selection, could potentially be used by others)
137struct ImGuiColorMod; // Stacked color modifier, backup of modified data so we can restore it
138struct ImGuiContext; // Main Dear ImGui context
139struct ImGuiContextHook; // Hook for extensions like ImGuiTestEngine
140struct ImGuiDataVarInfo; // Variable information (e.g. to access style variables from an enum)
141struct ImGuiDataTypeInfo; // Type information associated to a ImGuiDataType enum
142struct ImGuiErrorRecoveryState; // Storage of stack sizes for error handling and recovery
143struct ImGuiGroupData; // Stacked storage data for BeginGroup()/EndGroup()
144struct ImGuiInputTextState; // Internal state of the currently focused/edited text input box
145struct ImGuiInputTextDeactivateData;// Short term storage to backup text of a deactivating InputText() while another is stealing active id
146struct ImGuiLastItemData; // Status storage for last submitted items
147struct ImGuiLocEntry; // A localization entry.
148struct ImGuiMenuColumns; // Simple column measurement, currently used for MenuItem() only
149struct ImGuiMultiSelectState; // Multi-selection persistent state (for focused selection).
150struct ImGuiMultiSelectTempData; // Multi-selection temporary state (while traversing).
151struct ImGuiNavItemData; // Result of a keyboard/gamepad directional navigation move query result
152struct ImGuiMetricsConfig; // Storage for ShowMetricsWindow() and DebugNodeXXX() functions
153struct ImGuiNextWindowData; // Storage for SetNextWindow** functions
154struct ImGuiNextItemData; // Storage for SetNextItem** functions
155struct ImGuiOldColumnData; // Storage data for a single column for legacy Columns() api
156struct ImGuiOldColumns; // Storage data for a columns set for legacy Columns() api
157struct ImGuiPopupData; // Storage for current popup stack
158struct ImGuiSettingsHandler; // Storage for one type registered in the .ini file
159struct ImGuiStyleMod; // Stacked style modifier, backup of modified data so we can restore it
160struct ImGuiTabBar; // Storage for a tab bar
161struct ImGuiTabItem; // Storage for a tab item (within a tab bar)
162struct ImGuiTable; // Storage for a table
163struct ImGuiTableHeaderData; // Storage for TableAngledHeadersRow()
164struct ImGuiTableColumn; // Storage for one column of a table
165struct ImGuiTableInstanceData; // Storage for one instance of a same table
166struct ImGuiTableTempData; // Temporary storage for one table (one per table in the stack), shared between tables.
167struct ImGuiTableSettings; // Storage for a table .ini settings
168struct ImGuiTableColumnsSettings; // Storage for a column .ini settings
169struct ImGuiTreeNodeStackData; // Temporary storage for TreeNode().
170struct ImGuiTypingSelectState; // Storage for GetTypingSelectRequest()
171struct ImGuiTypingSelectRequest; // Storage for GetTypingSelectRequest() (aimed to be public)
172struct ImGuiWindow; // Storage for one window
173struct 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)
174struct ImGuiWindowSettings; // Storage for a window .ini settings (we keep one of those even if the actual window wasn't instanced during this session)
175
176// Enumerations
177// Use your programming IDE "Go to definition" facility on the names of the center columns to find the actual flags/enum lists.
178enum ImGuiLocKey : int; // -> enum ImGuiLocKey // Enum: a localization entry for translation.
179typedef int ImGuiLayoutType; // -> enum ImGuiLayoutType_ // Enum: Horizontal or vertical
180
181// Flags
182typedef int ImGuiActivateFlags; // -> enum ImGuiActivateFlags_ // Flags: for navigation/focus function (will be for ActivateItem() later)
183typedef int ImGuiDebugLogFlags; // -> enum ImGuiDebugLogFlags_ // Flags: for ShowDebugLogWindow(), g.DebugLogFlags
184typedef int ImGuiFocusRequestFlags; // -> enum ImGuiFocusRequestFlags_ // Flags: for FocusWindow()
185typedef int ImGuiItemStatusFlags; // -> enum ImGuiItemStatusFlags_ // Flags: for g.LastItemData.StatusFlags
186typedef int ImGuiOldColumnFlags; // -> enum ImGuiOldColumnFlags_ // Flags: for BeginColumns()
187typedef int ImGuiLogFlags; // -> enum ImGuiLogFlags_ // Flags: for LogBegin() text capturing function
188typedef int ImGuiNavRenderCursorFlags; // -> enum ImGuiNavRenderCursorFlags_//Flags: for RenderNavCursor()
189typedef int ImGuiNavMoveFlags; // -> enum ImGuiNavMoveFlags_ // Flags: for navigation requests
190typedef int ImGuiNextItemDataFlags; // -> enum ImGuiNextItemDataFlags_ // Flags: for SetNextItemXXX() functions
191typedef int ImGuiNextWindowDataFlags; // -> enum ImGuiNextWindowDataFlags_// Flags: for SetNextWindowXXX() functions
192typedef int ImGuiScrollFlags; // -> enum ImGuiScrollFlags_ // Flags: for ScrollToItem() and navigation requests
193typedef int ImGuiSeparatorFlags; // -> enum ImGuiSeparatorFlags_ // Flags: for SeparatorEx()
194typedef int ImGuiTextFlags; // -> enum ImGuiTextFlags_ // Flags: for TextEx()
195typedef int ImGuiTooltipFlags; // -> enum ImGuiTooltipFlags_ // Flags: for BeginTooltipEx()
196typedef int ImGuiTypingSelectFlags; // -> enum ImGuiTypingSelectFlags_ // Flags: for GetTypingSelectRequest()
197typedef int ImGuiWindowRefreshFlags; // -> enum ImGuiWindowRefreshFlags_ // Flags: for SetNextWindowRefreshPolicy()
198
199//-----------------------------------------------------------------------------
200// [SECTION] Context pointer
201// See implementation of this variable in imgui.cpp for comments and details.
202//-----------------------------------------------------------------------------
203
204#ifndef GImGui
205extern IMGUI_API ImGuiContext* GImGui; // Current implicit context pointer
206#endif
207
208//-----------------------------------------------------------------------------
209// [SECTION] Macros
210//-----------------------------------------------------------------------------
211
212// Debug Printing Into TTY
213// (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)
214#ifndef IMGUI_DEBUG_PRINTF
215#ifndef IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS
216#define IMGUI_DEBUG_PRINTF(_FMT,...) printf(_FMT, __VA_ARGS__)
217#else
218#define IMGUI_DEBUG_PRINTF(_FMT,...) ((void)0)
219#endif
220#endif
221
222// Debug Logging for ShowDebugLogWindow(). This is designed for relatively rare events so please don't spam.
223#define IMGUI_DEBUG_LOG_ERROR(...) do { ImGuiContext& g2 = *GImGui; if (g2.DebugLogFlags & ImGuiDebugLogFlags_EventError) IMGUI_DEBUG_LOG(__VA_ARGS__); else g2.DebugLogSkippedErrors++; } while (0)
224#define IMGUI_DEBUG_LOG_ACTIVEID(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventActiveId) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
225#define IMGUI_DEBUG_LOG_FOCUS(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventFocus) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
226#define IMGUI_DEBUG_LOG_POPUP(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventPopup) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
227#define IMGUI_DEBUG_LOG_NAV(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventNav) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
228#define IMGUI_DEBUG_LOG_SELECTION(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventSelection) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
229#define IMGUI_DEBUG_LOG_CLIPPER(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventClipper) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
230#define IMGUI_DEBUG_LOG_IO(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventIO) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
231#define IMGUI_DEBUG_LOG_FONT(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventFont) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
232#define IMGUI_DEBUG_LOG_INPUTROUTING(...) do{if (g.DebugLogFlags & ImGuiDebugLogFlags_EventInputRouting)IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
233
234// Static Asserts
235#define IM_STATIC_ASSERT(_COND) static_assert(_COND, "")
236
237// "Paranoid" Debug Asserts are meant to only be enabled during specific debugging/work, otherwise would slow down the code too much.
238// 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.
239//#define IMGUI_DEBUG_PARANOID
240#ifdef IMGUI_DEBUG_PARANOID
241#define IM_ASSERT_PARANOID(_EXPR) IM_ASSERT(_EXPR)
242#else
243#define IM_ASSERT_PARANOID(_EXPR)
244#endif
245
246// Misc Macros
247#define IM_PI 3.14159265358979323846f
248#ifdef _WIN32
249#define IM_NEWLINE "\r\n" // Play it nice with Windows users (Update: since 2018-05, Notepad finally appears to support Unix-style carriage returns!)
250#else
251#define IM_NEWLINE "\n"
252#endif
253#ifndef IM_TABSIZE // Until we move this to runtime and/or add proper tab support, at least allow users to compile-time override
254#define IM_TABSIZE (4)
255#endif
256#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)=8
257#define IM_F32_TO_INT8_UNBOUND(_VAL) ((int)((_VAL) * 255.0f + ((_VAL)>=0 ? 0.5f : -0.5f))) // Unsaturated, for display purpose
258#define IM_F32_TO_INT8_SAT(_VAL) ((int)(ImSaturate(_VAL) * 255.0f + 0.5f)) // Saturated, always output 0..255
259#define IM_TRUNC(_VAL) ((float)(int)(_VAL)) // ImTrunc() is not inlined in MSVC debug builds
260#define IM_ROUND(_VAL) ((float)(int)((_VAL) + 0.5f)) //
261#define IM_STRINGIFY_HELPER(_X) #_X
262#define IM_STRINGIFY(_X) IM_STRINGIFY_HELPER(_X) // Preprocessor idiom to stringify e.g. an integer.
263#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
264#define IM_FLOOR IM_TRUNC
265#endif
266
267// Hint for branch prediction
268#if (defined(__cplusplus) && (__cplusplus >= 202002L)) || (defined(_MSVC_LANG) && (_MSVC_LANG >= 202002L))
269#define IM_LIKELY [[likely]]
270#define IM_UNLIKELY [[unlikely]]
271#else
272#define IM_LIKELY
273#define IM_UNLIKELY
274#endif
275
276// Enforce cdecl calling convention for functions called by the standard library, in case compilation settings changed the default to e.g. __vectorcall
277#ifdef _MSC_VER
278#define IMGUI_CDECL __cdecl
279#else
280#define IMGUI_CDECL
281#endif
282
283// Warnings
284#if defined(_MSC_VER) && !defined(__clang__)
285#define IM_MSVC_WARNING_SUPPRESS(XXXX) __pragma(warning(suppress: XXXX))
286#else
287#define IM_MSVC_WARNING_SUPPRESS(XXXX)
288#endif
289
290// Debug Tools
291// Use 'Metrics/Debugger->Tools->Item Picker' to break into the call-stack of a specific item.
292// This will call IM_DEBUG_BREAK() which you may redefine yourself. See https://github.com/scottt/debugbreak for more reference.
293#ifndef IM_DEBUG_BREAK
294#if defined (_MSC_VER)
295#define IM_DEBUG_BREAK() __debugbreak()
296#elif defined(__clang__)
297#define IM_DEBUG_BREAK() __builtin_debugtrap()
298#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
299#define IM_DEBUG_BREAK() __asm__ volatile("int3;nop")
300#elif defined(__GNUC__) && defined(__thumb__)
301#define IM_DEBUG_BREAK() __asm__ volatile(".inst 0xde01")
302#elif defined(__GNUC__) && defined(__arm__) && !defined(__thumb__)
303#define IM_DEBUG_BREAK() __asm__ volatile(".inst 0xe7f001f0")
304#else
305#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!
306#endif
307#endif // #ifndef IM_DEBUG_BREAK
308
309// Format specifiers, printing 64-bit hasn't been decently standardized...
310// In a real application you should be using PRId64 and PRIu64 from <inttypes.h> (non-windows) and on Windows define them yourself.
311#if defined(_MSC_VER) && !defined(__clang__)
312#define IM_PRId64 "I64d"
313#define IM_PRIu64 "I64u"
314#define IM_PRIX64 "I64X"
315#else
316#define IM_PRId64 "lld"
317#define IM_PRIu64 "llu"
318#define IM_PRIX64 "llX"
319#endif
320
321//-----------------------------------------------------------------------------
322// [SECTION] Generic helpers
323// Note that the ImXXX helpers functions are lower-level than ImGui functions.
324// ImGui functions or the ImGui context are never called/used from other ImXXX functions.
325//-----------------------------------------------------------------------------
326// - Helpers: Hashing
327// - Helpers: Sorting
328// - Helpers: Bit manipulation
329// - Helpers: String
330// - Helpers: Formatting
331// - Helpers: UTF-8 <> wchar conversions
332// - Helpers: ImVec2/ImVec4 operators
333// - Helpers: Maths
334// - Helpers: Geometry
335// - Helper: ImVec1
336// - Helper: ImVec2ih
337// - Helper: ImRect
338// - Helper: ImBitArray
339// - Helper: ImBitVector
340// - Helper: ImSpan<>, ImSpanAllocator<>
341// - Helper: ImPool<>
342// - Helper: ImChunkStream<>
343// - Helper: ImGuiTextIndex
344// - Helper: ImGuiStorage
345//-----------------------------------------------------------------------------
346
347// Helpers: Hashing
348IMGUI_API ImGuiID ImHashData(const void* data, size_t data_size, ImGuiID seed = 0);
349IMGUI_API ImGuiID ImHashStr(const char* data, size_t data_size = 0, ImGuiID seed = 0);
350
351// Helpers: Sorting
352#ifndef ImQsort
353static inline 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); }
354#endif
355
356// Helpers: Color Blending
357IMGUI_API ImU32 ImAlphaBlendColors(ImU32 col_a, ImU32 col_b);
358
359// Helpers: Bit manipulation
360static inline bool ImIsPowerOfTwo(int v) { return v != 0 && (v & (v - 1)) == 0; }
361static inline bool ImIsPowerOfTwo(ImU64 v) { return v != 0 && (v & (v - 1)) == 0; }
362static inline int ImUpperPowerOfTwo(int v) { v--; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v++; return v; }
363
364// Helpers: String
365IMGUI_API int ImStricmp(const char* str1, const char* str2); // Case insensitive compare.
366IMGUI_API int ImStrnicmp(const char* str1, const char* str2, size_t count); // Case insensitive compare to a certain count.
367IMGUI_API void ImStrncpy(char* dst, const char* src, size_t count); // Copy to a certain count and always zero terminate (strncpy doesn't).
368IMGUI_API char* ImStrdup(const char* str); // Duplicate a string.
369IMGUI_API char* ImStrdupcpy(char* dst, size_t* p_dst_size, const char* str); // Copy in provided buffer, recreate buffer if needed.
370IMGUI_API const char* ImStrchrRange(const char* str_begin, const char* str_end, char c); // Find first occurrence of 'c' in string range.
371IMGUI_API const char* ImStreolRange(const char* str, const char* str_end); // End end-of-line
372IMGUI_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.
373IMGUI_API void ImStrTrimBlanks(char* str); // Remove leading and trailing blanks from a buffer.
374IMGUI_API const char* ImStrSkipBlank(const char* str); // Find first non-blank character.
375IMGUI_API int ImStrlenW(const ImWchar* str); // Computer string length (ImWchar string)
376IMGUI_API const char* ImStrbol(const char* buf_mid_line, const char* buf_begin); // Find beginning-of-line
377IM_MSVC_RUNTIME_CHECKS_OFF
378static inline char ImToUpper(char c) { return (c >= 'a' && c <= 'z') ? c &= ~32 : c; }
379static inline bool ImCharIsBlankA(char c) { return c == ' ' || c == '\t'; }
380static inline bool ImCharIsBlankW(unsigned int c) { return c == ' ' || c == '\t' || c == 0x3000; }
381static inline bool ImCharIsXdigitA(char c) { return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f'); }
382IM_MSVC_RUNTIME_CHECKS_RESTORE
383
384// Helpers: Formatting
385IMGUI_API int ImFormatString(char* buf, size_t buf_size, const char* fmt, ...) IM_FMTARGS(3);
386IMGUI_API int ImFormatStringV(char* buf, size_t buf_size, const char* fmt, va_list args) IM_FMTLIST(3);
387IMGUI_API void ImFormatStringToTempBuffer(const char** out_buf, const char** out_buf_end, const char* fmt, ...) IM_FMTARGS(3);
388IMGUI_API void ImFormatStringToTempBufferV(const char** out_buf, const char** out_buf_end, const char* fmt, va_list args) IM_FMTLIST(3);
389IMGUI_API const char* ImParseFormatFindStart(const char* format);
390IMGUI_API const char* ImParseFormatFindEnd(const char* format);
391IMGUI_API const char* ImParseFormatTrimDecorations(const char* format, char* buf, size_t buf_size);
392IMGUI_API void ImParseFormatSanitizeForPrinting(const char* fmt_in, char* fmt_out, size_t fmt_out_size);
393IMGUI_API const char* ImParseFormatSanitizeForScanning(const char* fmt_in, char* fmt_out, size_t fmt_out_size);
394IMGUI_API int ImParseFormatPrecision(const char* format, int default_value);
395
396// Helpers: UTF-8 <> wchar conversions
397IMGUI_API const char* ImTextCharToUtf8(char out_buf[5], unsigned int c); // return out_buf
398IMGUI_API int ImTextStrToUtf8(char* out_buf, int out_buf_size, const ImWchar* in_text, const ImWchar* in_text_end); // return output UTF-8 bytes count
399IMGUI_API int ImTextCharFromUtf8(unsigned int* out_char, const char* in_text, const char* in_text_end); // read one character. return input UTF-8 bytes count
400IMGUI_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 count
401IMGUI_API int ImTextCountCharsFromUtf8(const char* in_text, const char* in_text_end); // return number of UTF-8 code-points (NOT bytes count)
402IMGUI_API int ImTextCountUtf8BytesFromChar(const char* in_text, const char* in_text_end); // return number of bytes to express one char in UTF-8
403IMGUI_API int ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_end); // return number of bytes to express string in UTF-8
404IMGUI_API const char* ImTextFindPreviousUtf8Codepoint(const char* in_text_start, const char* in_text_curr); // return previous UTF-8 code-point.
405IMGUI_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.
406
407// Helpers: File System
408#ifdef IMGUI_DISABLE_FILE_FUNCTIONS
409#define IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS
410typedef void* ImFileHandle;
411static inline ImFileHandle ImFileOpen(const char*, const char*) { return NULL; }
412static inline bool ImFileClose(ImFileHandle) { return false; }
413static inline ImU64 ImFileGetSize(ImFileHandle) { return (ImU64)-1; }
414static inline ImU64 ImFileRead(void*, ImU64, ImU64, ImFileHandle) { return 0; }
415static inline ImU64 ImFileWrite(const void*, ImU64, ImU64, ImFileHandle) { return 0; }
416#endif
417#ifndef IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS
418typedef FILE* ImFileHandle;
419IMGUI_API ImFileHandle ImFileOpen(const char* filename, const char* mode);
420IMGUI_API bool ImFileClose(ImFileHandle file);
421IMGUI_API ImU64 ImFileGetSize(ImFileHandle file);
422IMGUI_API ImU64 ImFileRead(void* data, ImU64 size, ImU64 count, ImFileHandle file);
423IMGUI_API ImU64 ImFileWrite(const void* data, ImU64 size, ImU64 count, ImFileHandle file);
424#else
425#define IMGUI_DISABLE_TTY_FUNCTIONS // Can't use stdout, fflush if we are not using default file functions
426#endif
427IMGUI_API void* ImFileLoadToMemory(const char* filename, const char* mode, size_t* out_file_size = NULL, int padding_bytes = 0);
428
429// Helpers: Maths
430IM_MSVC_RUNTIME_CHECKS_OFF
431// - Wrapper for standard libs functions. (Note that imgui_demo.cpp does _not_ use them to keep the code easy to copy)
432#ifndef IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS
433#define ImFabs(X) fabsf(X)
434#define ImSqrt(X) sqrtf(X)
435#define ImFmod(X, Y) fmodf((X), (Y))
436#define ImCos(X) cosf(X)
437#define ImSin(X) sinf(X)
438#define ImAcos(X) acosf(X)
439#define ImAtan2(Y, X) atan2f((Y), (X))
440#define ImAtof(STR) atof(STR)
441#define ImCeil(X) ceilf(X)
442static inline float ImPow(float x, float y) { return powf(x, y); } // DragBehaviorT/SliderBehaviorT uses ImPow with either float/double and need the precision
443static inline double ImPow(double x, double y) { return pow(x, y); }
444static inline float ImLog(float x) { return logf(x); } // DragBehaviorT/SliderBehaviorT uses ImLog with either float/double and need the precision
445static inline double ImLog(double x) { return log(x); }
446static inline int ImAbs(int x) { return x < 0 ? -x : x; }
447static inline float ImAbs(float x) { return fabsf(x); }
448static inline double ImAbs(double x) { return fabs(x); }
449static inline 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 argument
450static inline double ImSign(double x) { return (x < 0.0) ? -1.0 : (x > 0.0) ? 1.0 : 0.0; }
451#ifdef IMGUI_ENABLE_SSE
452static inline float ImRsqrt(float x) { return _mm_cvtss_f32(_mm_rsqrt_ss(_mm_set_ss(x))); }
453#else
454static inline float ImRsqrt(float x) { return 1.0f / sqrtf(x); }
455#endif
456static inline double ImRsqrt(double x) { return 1.0 / sqrt(x); }
457#endif
458// - ImMin/ImMax/ImClamp/ImLerp/ImSwap are used by widgets which support variety of types: signed/unsigned int/long long float/double
459// (Exceptionally using templates here but we could also redefine them for those types)
460template<typename T> static inline T ImMin(T lhs, T rhs) { return lhs < rhs ? lhs : rhs; }
461template<typename T> static inline T ImMax(T lhs, T rhs) { return lhs >= rhs ? lhs : rhs; }
462template<typename T> static inline T ImClamp(T v, T mn, T mx) { return (v < mn) ? mn : (v > mx) ? mx : v; }
463template<typename T> static inline T ImLerp(T a, T b, float t) { return (T)(a + (b - a) * t); }
464template<typename T> static inline void ImSwap(T& a, T& b) { T tmp = a; a = b; b = tmp; }
465template<typename T> static inline 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; }
466template<typename T> static inline 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; }
467// - Misc maths helpers
468static inline 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); }
469static inline 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); }
470static inline 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); }
471static inline 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); }
472static inline 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); }
473static inline 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); }
474static inline float ImSaturate(float f) { return (f < 0.0f) ? 0.0f : (f > 1.0f) ? 1.0f : f; }
475static inline float ImLengthSqr(const ImVec2& lhs) { return (lhs.x * lhs.x) + (lhs.y * lhs.y); }
476static inline float ImLengthSqr(const ImVec4& lhs) { return (lhs.x * lhs.x) + (lhs.y * lhs.y) + (lhs.z * lhs.z) + (lhs.w * lhs.w); }
477static inline 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; }
478static inline float ImTrunc(float f) { return (float)(int)(f); }
479static inline ImVec2 ImTrunc(const ImVec2& v) { return ImVec2((float)(int)(v.x), (float)(int)(v.y)); }
480static inline float ImFloor(float f) { return (float)((f >= 0 || (float)(int)f == f) ? (int)f : (int)f - 1); } // Decent replacement for floorf()
481static inline ImVec2 ImFloor(const ImVec2& v) { return ImVec2(ImFloor(v.x), ImFloor(v.y)); }
482static inline int ImModPositive(int a, int b) { return (a + b) % b; }
483static inline float ImDot(const ImVec2& a, const ImVec2& b) { return a.x * b.x + a.y * b.y; }
484static inline 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); }
485static inline 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; }
486static inline float ImLinearRemapClamp(float s0, float s1, float d0, float d1, float x) { return ImSaturate((x - s0) / (s1 - s0)) * (d1 - d0) + d0; }
487static inline ImVec2 ImMul(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x * rhs.x, lhs.y * rhs.y); }
488static inline bool ImIsFloatAboveGuaranteedIntegerPrecision(float f) { return f <= -16777216 || f >= 16777216; }
489static inline float ImExponentialMovingAverage(float avg, float sample, int n) { avg -= avg / n; avg += sample / n; return avg; }
490IM_MSVC_RUNTIME_CHECKS_RESTORE
491
492// Helpers: Geometry
493IMGUI_API ImVec2 ImBezierCubicCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, float t);
494IMGUI_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 segments
495IMGUI_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.CurveTessellationTol
496IMGUI_API ImVec2 ImBezierQuadraticCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, float t);
497IMGUI_API ImVec2 ImLineClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& p);
498IMGUI_API bool ImTriangleContainsPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);
499IMGUI_API ImVec2 ImTriangleClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);
500IMGUI_API void ImTriangleBarycentricCoords(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p, float& out_u, float& out_v, float& out_w);
501inline 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; }
502inline 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; }
503
504// Helper: ImVec1 (1D vector)
505// (this odd construct is used to facilitate the transition between 1D and 2D, and the maintenance of some branches/patches)
506IM_MSVC_RUNTIME_CHECKS_OFF
507struct ImVec1
508{
509 float x;
510 constexpr ImVec1() : x(0.0f) { }
511 constexpr ImVec1(float _x) : x(_x) { }
512};
513
514// Helper: ImVec2ih (2D vector, half-size integer, for long-term packed storage)
515struct ImVec2ih
516{
517 short x, y;
518 constexpr ImVec2ih() : x(0), y(0) {}
519 constexpr ImVec2ih(short _x, short _y) : x(_x), y(_y) {}
520 constexpr explicit ImVec2ih(const ImVec2& rhs) : x((short)rhs.x), y((short)rhs.y) {}
521};
522
523// Helper: ImRect (2D axis aligned bounding-box)
524// NB: we can't rely on ImVec2 math operators being available here!
525struct IMGUI_API ImRect
526{
527 ImVec2 Min; // Upper-left
528 ImVec2 Max; // Lower-right
529
530 constexpr ImRect() : Min(0.0f, 0.0f), Max(0.0f, 0.0f) {}
531 constexpr ImRect(const ImVec2& min, const ImVec2& max) : Min(min), Max(max) {}
532 constexpr ImRect(const ImVec4& v) : Min(v.x, v.y), Max(v.z, v.w) {}
533 constexpr ImRect(float x1, float y1, float x2, float y2) : Min(x1, y1), Max(x2, y2) {}
534
535 ImVec2 GetCenter() const { return ImVec2((Min.x + Max.x) * 0.5f, (Min.y + Max.y) * 0.5f); }
536 ImVec2 GetSize() const { return ImVec2(Max.x - Min.x, Max.y - Min.y); }
537 float GetWidth() const { return Max.x - Min.x; }
538 float GetHeight() const { return Max.y - Min.y; }
539 float GetArea() const { return (Max.x - Min.x) * (Max.y - Min.y); }
540 ImVec2 GetTL() const { return Min; } // Top-left
541 ImVec2 GetTR() const { return ImVec2(Max.x, Min.y); } // Top-right
542 ImVec2 GetBL() const { return ImVec2(Min.x, Max.y); } // Bottom-left
543 ImVec2 GetBR() const { return Max; } // Bottom-right
544 bool Contains(const ImVec2& p) const { return p.x >= Min.x && p.y >= Min.y && p.x < Max.x && p.y < Max.y; }
545 bool 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; }
546 bool 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; }
547 bool 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; }
548 void 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; }
549 void 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; }
550 void Expand(const float amount) { Min.x -= amount; Min.y -= amount; Max.x += amount; Max.y += amount; }
551 void Expand(const ImVec2& amount) { Min.x -= amount.x; Min.y -= amount.y; Max.x += amount.x; Max.y += amount.y; }
552 void Translate(const ImVec2& d) { Min.x += d.x; Min.y += d.y; Max.x += d.x; Max.y += d.y; }
553 void TranslateX(float dx) { Min.x += dx; Max.x += dx; }
554 void TranslateY(float dy) { Min.y += dy; Max.y += dy; }
555 void 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.
556 void 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.
557 void Floor() { Min.x = IM_TRUNC(Min.x); Min.y = IM_TRUNC(Min.y); Max.x = IM_TRUNC(Max.x); Max.y = IM_TRUNC(Max.y); }
558 bool IsInverted() const { return Min.x > Max.x || Min.y > Max.y; }
559 ImVec4 ToVec4() const { return ImVec4(Min.x, Min.y, Max.x, Max.y); }
560};
561
562// Helper: ImBitArray
563#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!
564#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!
565inline size_t ImBitArrayGetStorageSizeInBytes(int bitcount) { return (size_t)((bitcount + 31) >> 5) << 2; }
566inline void ImBitArrayClearAllBits(ImU32* arr, int bitcount){ memset(arr, 0, ImBitArrayGetStorageSizeInBytes(bitcount)); }
567inline bool ImBitArrayTestBit(const ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); return (arr[n >> 5] & mask) != 0; }
568inline void ImBitArrayClearBit(ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); arr[n >> 5] &= ~mask; }
569inline void ImBitArraySetBit(ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); arr[n >> 5] |= mask; }
570inline void ImBitArraySetBitRange(ImU32* arr, int n, int n2) // Works on range [n..n2)
571{
572 n2--;
573 while (n <= n2)
574 {
575 int a_mod = (n & 31);
576 int b_mod = (n2 > (n | 31) ? 31 : (n2 & 31)) + 1;
577 ImU32 mask = (ImU32)(((ImU64)1 << b_mod) - 1) & ~(ImU32)(((ImU64)1 << a_mod) - 1);
578 arr[n >> 5] |= mask;
579 n = (n + 32) & ~31;
580 }
581}
582
583typedef ImU32* ImBitArrayPtr; // Name for use in structs
584
585// Helper: ImBitArray class (wrapper over ImBitArray functions)
586// Store 1-bit per value.
587template<int BITCOUNT, int OFFSET = 0>
588struct ImBitArray
589{
590 ImU32 Storage[(BITCOUNT + 31) >> 5];
591 ImBitArray() { ClearAllBits(); }
592 void ClearAllBits() { memset(Storage, 0, sizeof(Storage)); }
593 void SetAllBits() { memset(Storage, 255, sizeof(Storage)); }
594 bool TestBit(int n) const { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); return IM_BITARRAY_TESTBIT(Storage, n); }
595 void SetBit(int n) { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); ImBitArraySetBit(Storage, n); }
596 void ClearBit(int n) { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); ImBitArrayClearBit(Storage, n); }
597 void SetBitRange(int n, int n2) { n += OFFSET; n2 += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT && n2 > n && n2 <= BITCOUNT); ImBitArraySetBitRange(Storage, n, n2); } // Works on range [n..n2)
598 bool operator[](int n) const { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); return IM_BITARRAY_TESTBIT(Storage, n); }
599};
600
601// Helper: ImBitVector
602// Store 1-bit per value.
603struct IMGUI_API ImBitVector
604{
605 ImVector<ImU32> Storage;
606 void Create(int sz) { Storage.resize((sz + 31) >> 5); memset(Storage.Data, 0, (size_t)Storage.Size * sizeof(Storage.Data[0])); }
607 void Clear() { Storage.clear(); }
608 bool TestBit(int n) const { IM_ASSERT(n < (Storage.Size << 5)); return IM_BITARRAY_TESTBIT(Storage.Data, n); }
609 void SetBit(int n) { IM_ASSERT(n < (Storage.Size << 5)); ImBitArraySetBit(Storage.Data, n); }
610 void ClearBit(int n) { IM_ASSERT(n < (Storage.Size << 5)); ImBitArrayClearBit(Storage.Data, n); }
611};
612IM_MSVC_RUNTIME_CHECKS_RESTORE
613
614// Helper: ImSpan<>
615// Pointing to a span of data we don't own.
616template<typename T>
617struct ImSpan
618{
619 T* Data;
620 T* DataEnd;
621
622 // Constructors, destructor
623 inline ImSpan() { Data = DataEnd = NULL; }
624 inline ImSpan(T* data, int size) { Data = data; DataEnd = data + size; }
625 inline ImSpan(T* data, T* data_end) { Data = data; DataEnd = data_end; }
626
627 inline void set(T* data, int size) { Data = data; DataEnd = data + size; }
628 inline void set(T* data, T* data_end) { Data = data; DataEnd = data_end; }
629 inline int size() const { return (int)(ptrdiff_t)(DataEnd - Data); }
630 inline int size_in_bytes() const { return (int)(ptrdiff_t)(DataEnd - Data) * (int)sizeof(T); }
631 inline T& operator[](int i) { T* p = Data + i; IM_ASSERT(p >= Data && p < DataEnd); return *p; }
632 inline const T& operator[](int i) const { const T* p = Data + i; IM_ASSERT(p >= Data && p < DataEnd); return *p; }
633
634 inline T* begin() { return Data; }
635 inline const T* begin() const { return Data; }
636 inline T* end() { return DataEnd; }
637 inline const T* end() const { return DataEnd; }
638
639 // Utilities
640 inline int index_from_ptr(const T* it) const { IM_ASSERT(it >= Data && it < DataEnd); const ptrdiff_t off = it - Data; return (int)off; }
641};
642
643// Helper: ImSpanAllocator<>
644// Facilitate storing multiple chunks into a single large block (the "arena")
645// - Usage: call Reserve() N times, allocate GetArenaSizeInBytes() worth, pass it to SetArenaBasePtr(), call GetSpan() N times to retrieve the aligned ranges.
646template<int CHUNKS>
647struct ImSpanAllocator
648{
649 char* BasePtr;
650 int CurrOff;
651 int CurrIdx;
652 int Offsets[CHUNKS];
653 int Sizes[CHUNKS];
654
655 ImSpanAllocator() { memset(this, 0, sizeof(*this)); }
656 inline 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; }
657 inline int GetArenaSizeInBytes() { return CurrOff; }
658 inline void SetArenaBasePtr(void* base_ptr) { BasePtr = (char*)base_ptr; }
659 inline void* GetSpanPtrBegin(int n) { IM_ASSERT(n >= 0 && n < CHUNKS && CurrIdx == CHUNKS); return (void*)(BasePtr + Offsets[n]); }
660 inline void* GetSpanPtrEnd(int n) { IM_ASSERT(n >= 0 && n < CHUNKS && CurrIdx == CHUNKS); return (void*)(BasePtr + Offsets[n] + Sizes[n]); }
661 template<typename T>
662 inline void GetSpan(int n, ImSpan<T>* span) { span->set((T*)GetSpanPtrBegin(n), (T*)GetSpanPtrEnd(n)); }
663};
664
665// Helper: ImPool<>
666// Basic keyed storage for contiguous instances, slow/amortized insertion, O(1) indexable, O(Log N) queries by ID over a dense/hot buffer,
667// Honor constructor/destructor. Add/remove invalidate all pointers. Indexes have the same lifetime as the associated object.
668typedef int ImPoolIdx;
669template<typename T>
670struct ImPool
671{
672 ImVector<T> Buf; // Contiguous data
673 ImGuiStorage Map; // ID->Index
674 ImPoolIdx FreeIdx; // Next free idx to use
675 ImPoolIdx AliveCount; // Number of active/alive items (for display purpose)
676
677 ImPool() { FreeIdx = AliveCount = 0; }
678 ~ImPool() { Clear(); }
679 T* GetByKey(ImGuiID key) { int idx = Map.GetInt(key, -1); return (idx != -1) ? &Buf[idx] : NULL; }
680 T* GetByIndex(ImPoolIdx n) { return &Buf[n]; }
681 ImPoolIdx GetIndex(const T* p) const { IM_ASSERT(p >= Buf.Data && p < Buf.Data + Buf.Size); return (ImPoolIdx)(p - Buf.Data); }
682 T* GetOrAddByKey(ImGuiID key) { int* p_idx = Map.GetIntRef(key, -1); if (*p_idx != -1) return &Buf[*p_idx]; *p_idx = FreeIdx; return Add(); }
683 bool Contains(const T* p) const { return (p >= Buf.Data && p < Buf.Data + Buf.Size); }
684 void 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; }
685 T* 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]; }
686 void Remove(ImGuiID key, const T* p) { Remove(key, GetIndex(p)); }
687 void Remove(ImGuiID key, ImPoolIdx idx) { Buf[idx].~T(); *(int*)&Buf[idx] = FreeIdx; FreeIdx = idx; Map.SetInt(key, -1); AliveCount--; }
688 void Reserve(int capacity) { Buf.reserve(capacity); Map.Data.reserve(capacity); }
689
690 // To iterate a ImPool: for (int n = 0; n < pool.GetMapSize(); n++) if (T* t = pool.TryGetMapData(n)) { ... }
691 // Can be avoided if you know .Remove() has never been called on the pool, or AliveCount == GetMapSize()
692 int GetAliveCount() const { return AliveCount; } // Number of active/alive items in the pool (for display purpose)
693 int GetBufSize() const { return Buf.Size; }
694 int GetMapSize() const { return Map.Data.Size; } // It is the map we need iterate to find valid items, since we don't have "alive" storage anywhere
695 T* TryGetMapData(ImPoolIdx n) { int idx = Map.Data[n].val_i; if (idx == -1) return NULL; return GetByIndex(idx); }
696};
697
698// Helper: ImChunkStream<>
699// Build and iterate a contiguous stream of variable-sized structures.
700// This is used by Settings to store persistent data while reducing allocation count.
701// We store the chunk size first, and align the final size on 4 bytes boundaries.
702// The tedious/zealous amount of casting is to avoid -Wcast-align warnings.
703template<typename T>
705{
706 ImVector<char> Buf;
707
708 void clear() { Buf.clear(); }
709 bool empty() const { return Buf.Size == 0; }
710 int size() const { return Buf.Size; }
711 T* 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); }
712 T* begin() { size_t HDR_SZ = 4; if (!Buf.Data) return NULL; return (T*)(void*)(Buf.Data + HDR_SZ); }
713 T* 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; }
714 int chunk_size(const T* p) { return ((const int*)p)[-1]; }
715 T* end() { return (T*)(void*)(Buf.Data + Buf.Size); }
716 int offset_from_ptr(const T* p) { IM_ASSERT(p >= begin() && p < end()); const ptrdiff_t off = (const char*)p - Buf.Data; return (int)off; }
717 T* ptr_from_offset(int off) { IM_ASSERT(off >= 4 && off < Buf.Size); return (T*)(void*)(Buf.Data + off); }
718 void swap(ImChunkStream<T>& rhs) { rhs.Buf.swap(Buf); }
719};
720
721// Helper: ImGuiTextIndex
722// Maintain a line index for a text buffer. This is a strong candidate to be moved into the public API.
724{
725 ImVector<int> LineOffsets;
726 int EndOffset = 0; // Because we don't own text buffer we need to maintain EndOffset (may bake in LineOffsets?)
727
728 void clear() { LineOffsets.clear(); EndOffset = 0; }
729 int size() { return LineOffsets.Size; }
730 const char* get_line_begin(const char* base, int n) { return base + LineOffsets[n]; }
731 const char* get_line_end(const char* base, int n) { return base + (n + 1 < LineOffsets.Size ? (LineOffsets[n + 1] - 1) : EndOffset); }
732 void append(const char* base, int old_size, int new_size);
733};
734
735// Helper: ImGuiStorage
736IMGUI_API ImGuiStoragePair* ImLowerBound(ImGuiStoragePair* in_begin, ImGuiStoragePair* in_end, ImGuiID key);
737//-----------------------------------------------------------------------------
738// [SECTION] ImDrawList support
739//-----------------------------------------------------------------------------
740
741// ImDrawList: Helper function to calculate a circle's segment count given its radius and a "maximum error" value.
742// Estimation of number of circle segment based on error is derived using method described in https://stackoverflow.com/a/2244088/15194693
743// Number of segments (N) is calculated using equation:
744// N = ceil ( pi / acos(1 - error / r) ) where r > 0, error <= r
745// Our equation is significantly simpler that one in the post thanks for choosing segment that is
746// perpendicular to X axis. Follow steps in the article from this starting condition and you will
747// will get this result.
748//
749// Rendering circles with an odd number of segments, while mathematically correct will produce
750// asymmetrical results on the raster grid. Therefore we're rounding N to next even number (7->8, 8->8, 9->10 etc.)
751#define IM_ROUNDUP_TO_EVEN(_V) ((((_V) + 1) / 2) * 2)
752#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MIN 4
753#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX 512
754#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)
755
756// Raw equation from IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC rewritten for 'r' and 'error'.
757#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_R(_N,_MAXERROR) ((_MAXERROR) / (1 - ImCos(IM_PI / ImMax((float)(_N), IM_PI))))
758#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_ERROR(_N,_RAD) ((1 - ImCos(IM_PI / ImMax((float)(_N), IM_PI))) / (_RAD))
759
760// ImDrawList: Lookup table size for adaptive arc drawing, cover full circle.
761#ifndef IM_DRAWLIST_ARCFAST_TABLE_SIZE
762#define IM_DRAWLIST_ARCFAST_TABLE_SIZE 48 // Number of samples in lookup table.
763#endif
764#define IM_DRAWLIST_ARCFAST_SAMPLE_MAX IM_DRAWLIST_ARCFAST_TABLE_SIZE // Sample index _PathArcToFastEx() for 360 angle.
765
766// Data shared between all ImDrawList instances
767// Conceptually this could have been called e.g. ImDrawListSharedContext
768// Typically one ImGui context would create and maintain one of this.
769// 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.
770struct IMGUI_API ImDrawListSharedData
771{
772 ImVec2 TexUvWhitePixel; // UV of white pixel in the atlas
773 const ImVec4* TexUvLines; // UV of anti-aliased lines in the atlas
774 ImFont* Font; // Current/default font (optional, for simplified AddText overload)
775 float FontSize; // Current/default font size (optional, for simplified AddText overload)
776 float FontScale; // Current/default font scale (== FontSize / Font->FontSize)
777 float CurveTessellationTol; // Tessellation tolerance when using PathBezierCurveTo()
778 float CircleSegmentMaxError; // Number of circle segments to use per pixel of radius for AddCircle() etc
779 ImVec4 ClipRectFullscreen; // Value for PushClipRectFullscreen()
780 ImDrawListFlags InitialFlags; // Initial flags at the beginning of the frame (it is possible to alter flags on a per-drawlist basis afterwards)
781 ImVector<ImVec2> TempBuffer; // Temporary write buffer
782
783 // Lookup tables
784 ImVec2 ArcFastVtx[IM_DRAWLIST_ARCFAST_TABLE_SIZE]; // Sample points on the quarter of the circle.
785 float ArcFastRadiusCutoff; // Cutoff radius after which arc drawing will fallback to slower PathArcTo()
786 ImU8 CircleSegmentCounts[64]; // Precomputed segment count for given radius before we calculate it dynamically (to avoid calculation overhead)
787
788 ImDrawListSharedData();
789 void SetCircleTessellationMaxError(float max_error);
790};
791
792struct ImDrawDataBuilder
793{
794 ImVector<ImDrawList*>* Layers[2]; // Pointers to global layers for: regular, tooltip. LayersP[0] is owned by DrawData.
795 ImVector<ImDrawList*> LayerData1;
796
797 ImDrawDataBuilder() { memset(this, 0, sizeof(*this)); }
798};
799
800//-----------------------------------------------------------------------------
801// [SECTION] Data types support
802//-----------------------------------------------------------------------------
803
805{
806 ImGuiDataType Type;
807 ImU32 Count; // 1+
808 ImU32 Offset; // Offset in parent structure
809 void* GetVarPtr(void* parent) const { return (void*)((unsigned char*)parent + Offset); }
810};
811
813{
814 ImU8 Data[8]; // Opaque storage to fit any data up to ImGuiDataType_COUNT
815};
816
817// Type information associated to one ImGuiDataType. Retrieve with DataTypeGetInfo().
819{
820 size_t Size; // Size in bytes
821 const char* Name; // Short descriptive name for the type, for debugging
822 const char* PrintFmt; // Default printf format for the type
823 const char* ScanFmt; // Default scanf format for the type
824};
825
826// Extend ImGuiDataType_
827enum ImGuiDataTypePrivate_
828{
829 ImGuiDataType_String = ImGuiDataType_COUNT + 1,
830 ImGuiDataType_Pointer,
831 ImGuiDataType_ID,
832};
833
834//-----------------------------------------------------------------------------
835// [SECTION] Widgets support: flags, enums, data structures
836//-----------------------------------------------------------------------------
837
838// Extend ImGuiItemFlags
839// - input: PushItemFlag() manipulates g.CurrentItemFlags, g.NextItemData.ItemFlags, ItemAdd() calls may add extra flags too.
840// - output: stored in g.LastItemData.ItemFlags
841enum ImGuiItemFlagsPrivate_
842{
843 // Controlled by user
844 ImGuiItemFlags_Disabled = 1 << 10, // false // Disable interactions (DOES NOT affect visuals. DO NOT mix direct use of this with BeginDisabled(). See BeginDisabled()/EndDisabled() for full disable feature, and github #211).
845 ImGuiItemFlags_ReadOnly = 1 << 11, // false // [ALPHA] Allow hovering interactions but underlying value is not changed.
846 ImGuiItemFlags_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)
847 ImGuiItemFlags_NoWindowHoverableCheck = 1 << 13, // false // Disable hoverable check in ItemHoverable()
848 ImGuiItemFlags_AllowOverlap = 1 << 14, // false // Allow being overlapped by another widget. Not-hovered to Hovered transition deferred by a frame.
849 ImGuiItemFlags_NoNavDisableMouseHover = 1 << 15, // false // Nav keyboard/gamepad mode doesn't disable hover highlight (behave as if NavHighlightItemUnderNav==false).
850 ImGuiItemFlags_NoMarkEdited = 1 << 16, // false // Skip calling MarkItemEdited()
851
852 // Controlled by widget code
853 ImGuiItemFlags_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.
854 ImGuiItemFlags_HasSelectionUserData = 1 << 21, // false // Set by SetNextItemSelectionUserData()
855 ImGuiItemFlags_IsMultiSelect = 1 << 22, // false // Set by SetNextItemSelectionUserData()
856
857 ImGuiItemFlags_Default_ = ImGuiItemFlags_AutoClosePopups, // Please don't change, use PushItemFlag() instead.
858
859 // Obsolete
860 //ImGuiItemFlags_SelectableDontClosePopup = !ImGuiItemFlags_AutoClosePopups, // Can't have a redirect as we inverted the behavior
861};
862
863// Status flags for an already submitted item
864// - output: stored in g.LastItemData.StatusFlags
865enum ImGuiItemStatusFlags_
866{
867 ImGuiItemStatusFlags_None = 0,
868 ImGuiItemStatusFlags_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)
869 ImGuiItemStatusFlags_HasDisplayRect = 1 << 1, // g.LastItemData.DisplayRect is valid
870 ImGuiItemStatusFlags_Edited = 1 << 2, // Value exposed by item was edited in the current frame (should match the bool return value of most widgets)
871 ImGuiItemStatusFlags_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.
872 ImGuiItemStatusFlags_ToggledOpen = 1 << 4, // Set when TreeNode() reports toggling their open state.
873 ImGuiItemStatusFlags_HasDeactivated = 1 << 5, // Set if the widget/group is able to provide data for the ImGuiItemStatusFlags_Deactivated flag.
874 ImGuiItemStatusFlags_Deactivated = 1 << 6, // Only valid if ImGuiItemStatusFlags_HasDeactivated is set.
875 ImGuiItemStatusFlags_HoveredWindow = 1 << 7, // Override the HoveredWindow test to allow cross-window hover testing.
876 ImGuiItemStatusFlags_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()).
877 ImGuiItemStatusFlags_HasClipRect = 1 << 9, // g.LastItemData.ClipRect is valid.
878 ImGuiItemStatusFlags_HasShortcut = 1 << 10, // g.LastItemData.Shortcut valid. Set by SetNextItemShortcut() -> ItemAdd().
879
880 // Additional status + semantic for ImGuiTestEngine
881#ifdef IMGUI_ENABLE_TEST_ENGINE
882 ImGuiItemStatusFlags_Openable = 1 << 20, // Item is an openable (e.g. TreeNode)
883 ImGuiItemStatusFlags_Opened = 1 << 21, // Opened status
884 ImGuiItemStatusFlags_Checkable = 1 << 22, // Item is a checkable (e.g. CheckBox, MenuItem)
885 ImGuiItemStatusFlags_Checked = 1 << 23, // Checked status
886 ImGuiItemStatusFlags_Inputable = 1 << 24, // Item is a text-inputable (e.g. InputText, SliderXXX, DragXXX)
887#endif
888};
889
890// Extend ImGuiHoveredFlags_
891enum ImGuiHoveredFlagsPrivate_
892{
893 ImGuiHoveredFlags_DelayMask_ = ImGuiHoveredFlags_DelayNone | ImGuiHoveredFlags_DelayShort | ImGuiHoveredFlags_DelayNormal | ImGuiHoveredFlags_NoSharedDelay,
894 ImGuiHoveredFlags_AllowedMaskForIsWindowHovered = ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_AnyWindow | ImGuiHoveredFlags_NoPopupHierarchy | ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem | ImGuiHoveredFlags_ForTooltip | ImGuiHoveredFlags_Stationary,
895 ImGuiHoveredFlags_AllowedMaskForIsItemHovered = ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem | ImGuiHoveredFlags_AllowWhenOverlapped | ImGuiHoveredFlags_AllowWhenDisabled | ImGuiHoveredFlags_NoNavOverride | ImGuiHoveredFlags_ForTooltip | ImGuiHoveredFlags_Stationary | ImGuiHoveredFlags_DelayMask_,
896};
897
898// Extend ImGuiInputTextFlags_
899enum ImGuiInputTextFlagsPrivate_
900{
901 // [Internal]
902 ImGuiInputTextFlags_Multiline = 1 << 26, // For internal use by InputTextMultiline()
903 ImGuiInputTextFlags_MergedItem = 1 << 27, // For internal use by TempInputText(), will skip calling ItemAdd(). Require bounding-box to strictly match.
904 ImGuiInputTextFlags_LocalizeDecimalPoint= 1 << 28, // For internal use by InputScalar() and TempInputScalar()
905};
906
907// Extend ImGuiButtonFlags_
908enum ImGuiButtonFlagsPrivate_
909{
910 ImGuiButtonFlags_PressedOnClick = 1 << 4, // return true on click (mouse down event)
911 ImGuiButtonFlags_PressedOnClickRelease = 1 << 5, // [Default] return true on click + release on same item <-- this is what the majority of Button are using
912 ImGuiButtonFlags_PressedOnClickReleaseAnywhere = 1 << 6, // return true on click + release even if the release event is not done while hovering the item
913 ImGuiButtonFlags_PressedOnRelease = 1 << 7, // return true on release (default requires click+release)
914 ImGuiButtonFlags_PressedOnDoubleClick = 1 << 8, // return true on double-click (default requires click+release)
915 ImGuiButtonFlags_PressedOnDragDropHold = 1 << 9, // return true when held into while we are drag and dropping another item (used by e.g. tree nodes, collapsing headers)
916 //ImGuiButtonFlags_Repeat = 1 << 10, // hold to repeat
917 ImGuiButtonFlags_FlattenChildren = 1 << 11, // allow interactions even if a child window is overlapping
918 ImGuiButtonFlags_AllowOverlap = 1 << 12, // require previous frame HoveredId to either match id or be null before being usable.
919 //ImGuiButtonFlags_DontClosePopups = 1 << 13, // disable automatically closing parent popup on press
920 //ImGuiButtonFlags_Disabled = 1 << 14, // disable interactions -> use BeginDisabled() or ImGuiItemFlags_Disabled
921 ImGuiButtonFlags_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.CursorPosPrevLine
922 ImGuiButtonFlags_NoKeyModsAllowed = 1 << 16, // disable mouse interaction if a key modifier is held
923 ImGuiButtonFlags_NoHoldingActiveId = 1 << 17, // don't set ActiveId while holding the mouse (ImGuiButtonFlags_PressedOnClick only)
924 ImGuiButtonFlags_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)
925 ImGuiButtonFlags_NoHoveredOnFocus = 1 << 19, // don't report as hovered when nav focus is on this item
926 ImGuiButtonFlags_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!)
927 ImGuiButtonFlags_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!)
928 ImGuiButtonFlags_PressedOnMask_ = ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnClickReleaseAnywhere | ImGuiButtonFlags_PressedOnRelease | ImGuiButtonFlags_PressedOnDoubleClick | ImGuiButtonFlags_PressedOnDragDropHold,
929 ImGuiButtonFlags_PressedOnDefault_ = ImGuiButtonFlags_PressedOnClickRelease,
930};
931
932// Extend ImGuiComboFlags_
933enum ImGuiComboFlagsPrivate_
934{
935 ImGuiComboFlags_CustomPreview = 1 << 20, // enable BeginComboPreview()
936};
937
938// Extend ImGuiSliderFlags_
939enum ImGuiSliderFlagsPrivate_
940{
941 ImGuiSliderFlags_Vertical = 1 << 20, // Should this slider be orientated vertically?
942 ImGuiSliderFlags_ReadOnly = 1 << 21, // Consider using g.NextItemData.ItemFlags |= ImGuiItemFlags_ReadOnly instead.
943};
944
945// Extend ImGuiSelectableFlags_
946enum ImGuiSelectableFlagsPrivate_
947{
948 // NB: need to be in sync with last value of ImGuiSelectableFlags_
949 ImGuiSelectableFlags_NoHoldingActiveID = 1 << 20,
950 ImGuiSelectableFlags_SelectOnNav = 1 << 21, // (WIP) Auto-select when moved into. This is not exposed in public API as to handle multi-select and modifiers we will need user to explicitly control focus scope. May be replaced with a BeginSelection() API.
951 ImGuiSelectableFlags_SelectOnClick = 1 << 22, // Override button behavior to react on Click (default is Click+Release)
952 ImGuiSelectableFlags_SelectOnRelease = 1 << 23, // Override button behavior to react on Release (default is Click+Release)
953 ImGuiSelectableFlags_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)
954 ImGuiSelectableFlags_SetNavIdOnHover = 1 << 25, // Set Nav/Focus ID on mouse hover (used by MenuItem)
955 ImGuiSelectableFlags_NoPadWithHalfSpacing = 1 << 26, // Disable padding each side with ItemSpacing * 0.5f
956 ImGuiSelectableFlags_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!)
957};
958
959// Extend ImGuiTreeNodeFlags_
960enum ImGuiTreeNodeFlagsPrivate_
961{
962 ImGuiTreeNodeFlags_ClipLabelForTrailingButton = 1 << 28,// FIXME-WIP: Hard-coded for CollapsingHeader()
963 ImGuiTreeNodeFlags_UpsideDownArrow = 1 << 29,// FIXME-WIP: Turn Down arrow into an Up arrow, for reversed trees (#6517)
964 ImGuiTreeNodeFlags_OpenOnMask_ = ImGuiTreeNodeFlags_OpenOnDoubleClick | ImGuiTreeNodeFlags_OpenOnArrow,
965};
966
967enum ImGuiSeparatorFlags_
968{
969 ImGuiSeparatorFlags_None = 0,
970 ImGuiSeparatorFlags_Horizontal = 1 << 0, // Axis default to current layout type, so generally Horizontal unless e.g. in a menu bar
971 ImGuiSeparatorFlags_Vertical = 1 << 1,
972 ImGuiSeparatorFlags_SpanAllColumns = 1 << 2, // Make separator cover all columns of a legacy Columns() set.
973};
974
975// Flags for FocusWindow(). This is not called ImGuiFocusFlags to avoid confusion with public-facing ImGuiFocusedFlags.
976// FIXME: Once we finishing replacing more uses of GetTopMostPopupModal()+IsWindowWithinBeginStackOf()
977// and FindBlockingModal() with this, we may want to change the flag to be opt-out instead of opt-in.
978enum ImGuiFocusRequestFlags_
979{
980 ImGuiFocusRequestFlags_None = 0,
981 ImGuiFocusRequestFlags_RestoreFocusedChild = 1 << 0, // Find last focused child (if any) and focus it instead.
982 ImGuiFocusRequestFlags_UnlessBelowModal = 1 << 1, // Do not set focus if the window is below a modal.
983};
984
985enum ImGuiTextFlags_
986{
987 ImGuiTextFlags_None = 0,
988 ImGuiTextFlags_NoWidthForLargeClippedText = 1 << 0,
989};
990
991enum ImGuiTooltipFlags_
992{
993 ImGuiTooltipFlags_None = 0,
994 ImGuiTooltipFlags_OverridePrevious = 1 << 1, // Clear/ignore previously submitted tooltip (defaults to append)
995};
996
997// FIXME: this is in development, not exposed/functional as a generic feature yet.
998// Horizontal/Vertical enums are fixed to 0/1 so they may be used to index ImVec2
999enum ImGuiLayoutType_
1000{
1001 ImGuiLayoutType_Horizontal = 0,
1002 ImGuiLayoutType_Vertical = 1
1003};
1004
1005// Flags for LogBegin() text capturing function
1006enum ImGuiLogFlags_
1007{
1008 ImGuiLogFlags_None = 0,
1009
1010 ImGuiLogFlags_OutputTTY = 1 << 0,
1011 ImGuiLogFlags_OutputFile = 1 << 1,
1012 ImGuiLogFlags_OutputBuffer = 1 << 2,
1013 ImGuiLogFlags_OutputClipboard = 1 << 3,
1014 ImGuiLogFlags_OutputMask_ = ImGuiLogFlags_OutputTTY | ImGuiLogFlags_OutputFile | ImGuiLogFlags_OutputBuffer | ImGuiLogFlags_OutputClipboard,
1015};
1016
1017// X/Y enums are fixed to 0/1 so they may be used to index ImVec2
1018enum ImGuiAxis
1019{
1020 ImGuiAxis_None = -1,
1021 ImGuiAxis_X = 0,
1022 ImGuiAxis_Y = 1
1023};
1024
1025enum ImGuiPlotType
1026{
1027 ImGuiPlotType_Lines,
1028 ImGuiPlotType_Histogram,
1029};
1030
1031// Stacked color modifier, backup of modified data so we can restore it
1033{
1034 ImGuiCol Col;
1035 ImVec4 BackupValue;
1036};
1037
1038// Stacked style modifier, backup of modified data so we can restore it. Data type inferred from the variable.
1039struct ImGuiStyleMod
1040{
1041 ImGuiStyleVar VarIdx;
1042 union { int BackupInt[2]; float BackupFloat[2]; };
1043 ImGuiStyleMod(ImGuiStyleVar idx, int v) { VarIdx = idx; BackupInt[0] = v; }
1044 ImGuiStyleMod(ImGuiStyleVar idx, float v) { VarIdx = idx; BackupFloat[0] = v; }
1045 ImGuiStyleMod(ImGuiStyleVar idx, ImVec2 v) { VarIdx = idx; BackupFloat[0] = v.x; BackupFloat[1] = v.y; }
1046};
1047
1048// Storage data for BeginComboPreview()/EndComboPreview()
1049struct IMGUI_API ImGuiComboPreviewData
1050{
1051 ImRect PreviewRect;
1052 ImVec2 BackupCursorPos;
1053 ImVec2 BackupCursorMaxPos;
1054 ImVec2 BackupCursorPosPrevLine;
1055 float BackupPrevLineTextBaseOffset;
1056 ImGuiLayoutType BackupLayout;
1057
1058 ImGuiComboPreviewData() { memset(this, 0, sizeof(*this)); }
1059};
1060
1061// Stacked storage data for BeginGroup()/EndGroup()
1062struct IMGUI_API ImGuiGroupData
1063{
1064 ImGuiID WindowID;
1065 ImVec2 BackupCursorPos;
1066 ImVec2 BackupCursorMaxPos;
1067 ImVec2 BackupCursorPosPrevLine;
1068 ImVec1 BackupIndent;
1069 ImVec1 BackupGroupOffset;
1070 ImVec2 BackupCurrLineSize;
1071 float BackupCurrLineTextBaseOffset;
1072 ImGuiID BackupActiveIdIsAlive;
1073 bool BackupActiveIdPreviousFrameIsAlive;
1074 bool BackupHoveredIdIsAlive;
1075 bool BackupIsSameLine;
1076 bool EmitItem;
1077};
1078
1079// Simple column measurement, currently used for MenuItem() only.. This is very short-sighted/throw-away code and NOT a generic helper.
1080struct IMGUI_API ImGuiMenuColumns
1081{
1082 ImU32 TotalWidth;
1083 ImU32 NextTotalWidth;
1084 ImU16 Spacing;
1085 ImU16 OffsetIcon; // Always zero for now
1086 ImU16 OffsetLabel; // Offsets are locked in Update()
1087 ImU16 OffsetShortcut;
1088 ImU16 OffsetMark;
1089 ImU16 Widths[4]; // Width of: Icon, Label, Shortcut, Mark (accumulators for current frame)
1090
1091 ImGuiMenuColumns() { memset(this, 0, sizeof(*this)); }
1092 void Update(float spacing, bool window_reappearing);
1093 float DeclColumns(float w_icon, float w_label, float w_shortcut, float w_mark);
1094 void CalcNextTotalWidth(bool update_offsets);
1095};
1096
1097// Internal temporary state for deactivating InputText() instances.
1098struct IMGUI_API ImGuiInputTextDeactivatedState
1099{
1100 ImGuiID ID; // widget id owning the text state (which just got deactivated)
1101 ImVector<char> TextA; // text buffer
1102
1103 ImGuiInputTextDeactivatedState() { memset(this, 0, sizeof(*this)); }
1104 void ClearFreeMemory() { ID = 0; TextA.clear(); }
1105};
1106
1107// Forward declare imstb_textedit.h structure + make its main configuration define accessible
1108#undef IMSTB_TEXTEDIT_STRING
1109#undef IMSTB_TEXTEDIT_CHARTYPE
1110#define IMSTB_TEXTEDIT_STRING ImGuiInputTextState
1111#define IMSTB_TEXTEDIT_CHARTYPE char
1112#define IMSTB_TEXTEDIT_GETWIDTH_NEWLINE (-1.0f)
1113#define IMSTB_TEXTEDIT_UNDOSTATECOUNT 99
1114#define IMSTB_TEXTEDIT_UNDOCHARCOUNT 999
1115namespace ImStb { struct STB_TexteditState; }
1116typedef ImStb::STB_TexteditState ImStbTexteditState;
1117
1118// Internal state of the currently focused/edited text input box
1119// For a given item ID, access with ImGui::GetInputTextState()
1120struct IMGUI_API ImGuiInputTextState
1121{
1122 ImGuiContext* Ctx; // parent UI context (needs to be set explicitly by parent).
1123 ImStbTexteditState* Stb; // State for stb_textedit.h
1124 ImGuiID ID; // widget id owning the text state
1125 int TextLen; // UTF-8 length of the string in TextA (in bytes)
1126 ImVector<char> TextA; // main UTF8 buffer. TextA.Size is a buffer size! Should always be >= buf_size passed by user (and of course >= CurLenA + 1).
1127 ImVector<char> TextToRevertTo; // value to revert to when pressing Escape = backup of end-user buffer at the time of focus (in UTF-8, unaltered)
1128 ImVector<char> CallbackTextBackup; // temporary storage for callback to support automatic reconcile of undo-stack
1129 int BufCapacity; // end-user buffer capacity (include zero terminator)
1130 ImVec2 Scroll; // horizontal offset (managed manually) + vertical scrolling (pulled from child window's own Scroll.y)
1131 float CursorAnim; // timer for cursor blink, reset on every user action so the cursor reappears immediately
1132 bool CursorFollow; // set when we want scrolling to follow the current cursor position (not always!)
1133 bool SelectedAllMouseLock; // after a double-click to select all, we ignore further mouse drags to update selection
1134 bool Edited; // edited this frame
1135 ImGuiInputTextFlags Flags; // copy of InputText() flags. may be used to check if e.g. ImGuiInputTextFlags_Password is set.
1136 bool ReloadUserBuf; // force a reload of user buf so it may be modified externally. may be automatic in future version.
1137 int ReloadSelectionStart; // POSITIONS ARE IN IMWCHAR units *NOT* UTF-8 this is why this is not exposed yet.
1138 int ReloadSelectionEnd;
1139
1140 ImGuiInputTextState();
1141 ~ImGuiInputTextState();
1142 void ClearText() { TextLen = 0; TextA[0] = 0; CursorClamp(); }
1143 void ClearFreeMemory() { TextA.clear(); TextToRevertTo.clear(); }
1144 void OnKeyPressed(int key); // Cannot be inline because we call in code in stb_textedit.h implementation
1145 void OnCharPressed(unsigned int c);
1146
1147 // Cursor & Selection
1148 void CursorAnimReset();
1149 void CursorClamp();
1150 bool HasSelection() const;
1151 void ClearSelection();
1152 int GetCursorPos() const;
1153 int GetSelectionStart() const;
1154 int GetSelectionEnd() const;
1155 void SelectAll();
1156
1157 // Reload user buf (WIP #2890)
1158 // If you modify underlying user-passed const char* while active you need to call this (InputText V2 may lift this)
1159 // strcpy(my_buf, "hello");
1160 // if (ImGuiInputTextState* state = ImGui::GetInputTextState(id)) // id may be ImGui::GetItemID() is last item
1161 // state->ReloadUserBufAndSelectAll();
1162 void ReloadUserBufAndSelectAll();
1163 void ReloadUserBufAndKeepSelection();
1164 void ReloadUserBufAndMoveToEnd();
1165};
1166
1167enum ImGuiWindowRefreshFlags_
1168{
1169 ImGuiWindowRefreshFlags_None = 0,
1170 ImGuiWindowRefreshFlags_TryToAvoidRefresh = 1 << 0, // [EXPERIMENTAL] Try to keep existing contents, USER MUST NOT HONOR BEGIN() RETURNING FALSE AND NOT APPEND.
1171 ImGuiWindowRefreshFlags_RefreshOnHover = 1 << 1, // [EXPERIMENTAL] Always refresh on hover
1172 ImGuiWindowRefreshFlags_RefreshOnFocus = 1 << 2, // [EXPERIMENTAL] Always refresh on focus
1173 // Refresh policy/frequency, Load Balancing etc.
1174};
1175
1176enum ImGuiNextWindowDataFlags_
1177{
1178 ImGuiNextWindowDataFlags_None = 0,
1179 ImGuiNextWindowDataFlags_HasPos = 1 << 0,
1180 ImGuiNextWindowDataFlags_HasSize = 1 << 1,
1181 ImGuiNextWindowDataFlags_HasContentSize = 1 << 2,
1182 ImGuiNextWindowDataFlags_HasCollapsed = 1 << 3,
1183 ImGuiNextWindowDataFlags_HasSizeConstraint = 1 << 4,
1184 ImGuiNextWindowDataFlags_HasFocus = 1 << 5,
1185 ImGuiNextWindowDataFlags_HasBgAlpha = 1 << 6,
1186 ImGuiNextWindowDataFlags_HasScroll = 1 << 7,
1187 ImGuiNextWindowDataFlags_HasChildFlags = 1 << 8,
1188 ImGuiNextWindowDataFlags_HasRefreshPolicy = 1 << 9,
1189};
1190
1191// Storage for SetNexWindow** functions
1192struct ImGuiNextWindowData
1193{
1194 ImGuiNextWindowDataFlags Flags;
1195 ImGuiCond PosCond;
1196 ImGuiCond SizeCond;
1197 ImGuiCond CollapsedCond;
1198 ImVec2 PosVal;
1199 ImVec2 PosPivotVal;
1200 ImVec2 SizeVal;
1201 ImVec2 ContentSizeVal;
1202 ImVec2 ScrollVal;
1203 ImGuiChildFlags ChildFlags;
1204 bool CollapsedVal;
1205 ImRect SizeConstraintRect;
1206 ImGuiSizeCallback SizeCallback;
1207 void* SizeCallbackUserData;
1208 float BgAlphaVal; // Override background alpha
1209 ImVec2 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?)
1210 ImGuiWindowRefreshFlags RefreshFlagsVal;
1211
1212 ImGuiNextWindowData() { memset(this, 0, sizeof(*this)); }
1213 inline void ClearFlags() { Flags = ImGuiNextWindowDataFlags_None; }
1214};
1215
1216enum ImGuiNextItemDataFlags_
1217{
1218 ImGuiNextItemDataFlags_None = 0,
1219 ImGuiNextItemDataFlags_HasWidth = 1 << 0,
1220 ImGuiNextItemDataFlags_HasOpen = 1 << 1,
1221 ImGuiNextItemDataFlags_HasShortcut = 1 << 2,
1222 ImGuiNextItemDataFlags_HasRefVal = 1 << 3,
1223 ImGuiNextItemDataFlags_HasStorageID = 1 << 4,
1224};
1225
1226struct ImGuiNextItemData
1227{
1228 ImGuiNextItemDataFlags HasFlags; // Called HasFlags instead of Flags to avoid mistaking this
1229 ImGuiItemFlags ItemFlags; // Currently only tested/used for ImGuiItemFlags_AllowOverlap and ImGuiItemFlags_HasSelectionUserData.
1230 // Non-flags members are NOT cleared by ItemAdd() meaning they are still valid during NavProcessItem()
1231 ImGuiID FocusScopeId; // Set by SetNextItemSelectionUserData()
1232 ImGuiSelectionUserData SelectionUserData; // Set by SetNextItemSelectionUserData() (note that NULL/0 is a valid value, we use -1 == ImGuiSelectionUserData_Invalid to mark invalid values)
1233 float Width; // Set by SetNextItemWidth()
1234 ImGuiKeyChord Shortcut; // Set by SetNextItemShortcut()
1235 ImGuiInputFlags ShortcutFlags; // Set by SetNextItemShortcut()
1236 bool OpenVal; // Set by SetNextItemOpen()
1237 ImU8 OpenCond; // Set by SetNextItemOpen()
1238 ImGuiDataTypeStorage RefVal; // Not exposed yet, for ImGuiInputTextFlags_ParseEmptyAsRefVal
1239 ImGuiID StorageId; // Set by SetNextItemStorageID()
1240
1241 ImGuiNextItemData() { memset(this, 0, sizeof(*this)); SelectionUserData = -1; }
1242 inline void ClearFlags() { HasFlags = ImGuiNextItemDataFlags_None; ItemFlags = ImGuiItemFlags_None; } // Also cleared manually by ItemAdd()!
1243};
1244
1245// Status storage for the last submitted item
1246struct ImGuiLastItemData
1247{
1248 ImGuiID ID;
1249 ImGuiItemFlags ItemFlags; // See ImGuiItemFlags_
1250 ImGuiItemStatusFlags StatusFlags; // See ImGuiItemStatusFlags_
1251 ImRect Rect; // Full rectangle
1252 ImRect NavRect; // Navigation scoring rectangle (not displayed)
1253 // Rarely used fields are not explicitly cleared, only valid when the corresponding ImGuiItemStatusFlags ar set.
1254 ImRect DisplayRect; // Display rectangle. ONLY VALID IF (StatusFlags & ImGuiItemStatusFlags_HasDisplayRect) is set.
1255 ImRect ClipRect; // Clip rectangle at the time of submitting item. ONLY VALID IF (StatusFlags & ImGuiItemStatusFlags_HasClipRect) is set..
1256 ImGuiKeyChord Shortcut; // Shortcut at the time of submitting item. ONLY VALID IF (StatusFlags & ImGuiItemStatusFlags_HasShortcut) is set..
1257
1258 ImGuiLastItemData() { memset(this, 0, sizeof(*this)); }
1259};
1260
1261// Store data emitted by TreeNode() for usage by TreePop()
1262// - To implement ImGuiTreeNodeFlags_NavLeftJumpsBackHere: store the minimum amount of data
1263// which we can't infer in TreePop(), to perform the equivalent of NavApplyItemToResult().
1264// Only stored when the node is a potential candidate for landing on a Left arrow jump.
1266{
1267 ImGuiID ID;
1268 ImGuiTreeNodeFlags TreeFlags;
1269 ImGuiItemFlags ItemFlags; // Used for nav landing
1270 ImRect NavRect; // Used for nav landing
1271};
1272
1273// sizeof() = 20
1274struct IMGUI_API ImGuiErrorRecoveryState
1275{
1276 short SizeOfWindowStack;
1277 short SizeOfIDStack;
1278 short SizeOfTreeStack;
1279 short SizeOfColorStack;
1280 short SizeOfStyleVarStack;
1281 short SizeOfFontStack;
1282 short SizeOfFocusScopeStack;
1283 short SizeOfGroupStack;
1284 short SizeOfItemFlagsStack;
1285 short SizeOfBeginPopupStack;
1286 short SizeOfDisabledStack;
1287
1288 ImGuiErrorRecoveryState() { memset(this, 0, sizeof(*this)); }
1289};
1290
1291// Data saved for each window pushed into the stack
1293{
1294 ImGuiWindow* Window;
1295 ImGuiLastItemData ParentLastItemDataBackup;
1296 ImGuiErrorRecoveryState StackSizesInBegin; // Store size of various stacks for asserting
1297 bool DisabledOverrideReenable; // Non-child window override disabled flag
1298};
1299
1301{
1302 int Index;
1303 float Width;
1304 float InitialWidth;
1305};
1306
1307struct ImGuiPtrOrIndex
1308{
1309 void* Ptr; // Either field can be set, not both. e.g. Dock node tab bars are loose while BeginTabBar() ones are in a pool.
1310 int Index; // Usually index in a main pool.
1311
1312 ImGuiPtrOrIndex(void* ptr) { Ptr = ptr; Index = -1; }
1313 ImGuiPtrOrIndex(int index) { Ptr = NULL; Index = index; }
1314};
1315
1316//-----------------------------------------------------------------------------
1317// [SECTION] Popup support
1318//-----------------------------------------------------------------------------
1319
1320enum ImGuiPopupPositionPolicy
1321{
1322 ImGuiPopupPositionPolicy_Default,
1323 ImGuiPopupPositionPolicy_ComboBox,
1324 ImGuiPopupPositionPolicy_Tooltip,
1325};
1326
1327// Storage for popup stacks (g.OpenPopupStack and g.BeginPopupStack)
1328struct ImGuiPopupData
1329{
1330 ImGuiID PopupId; // Set on OpenPopup()
1331 ImGuiWindow* Window; // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup()
1332 ImGuiWindow* RestoreNavWindow;// Set on OpenPopup(), a NavWindow that will be restored on popup close
1333 int 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" value
1334 int OpenFrameCount; // Set on OpenPopup()
1335 ImGuiID OpenParentId; // Set on OpenPopup(), we need this to differentiate multiple menu sets from each others (e.g. inside menu bar vs loose menu items)
1336 ImVec2 OpenPopupPos; // Set on OpenPopup(), preferred popup position (typically == OpenMousePos when using mouse)
1337 ImVec2 OpenMousePos; // Set on OpenPopup(), copy of mouse position at the time of opening popup
1338
1339 ImGuiPopupData() { memset(this, 0, sizeof(*this)); ParentNavLayer = OpenFrameCount = -1; }
1340};
1341
1342//-----------------------------------------------------------------------------
1343// [SECTION] Inputs support
1344//-----------------------------------------------------------------------------
1345
1346// Bit array for named keys
1347typedef ImBitArray<ImGuiKey_NamedKey_COUNT, -ImGuiKey_NamedKey_BEGIN> ImBitArrayForNamedKeys;
1348
1349// [Internal] Key ranges
1350#define ImGuiKey_LegacyNativeKey_BEGIN 0
1351#define ImGuiKey_LegacyNativeKey_END 512
1352#define ImGuiKey_Keyboard_BEGIN (ImGuiKey_NamedKey_BEGIN)
1353#define ImGuiKey_Keyboard_END (ImGuiKey_GamepadStart)
1354#define ImGuiKey_Gamepad_BEGIN (ImGuiKey_GamepadStart)
1355#define ImGuiKey_Gamepad_END (ImGuiKey_GamepadRStickDown + 1)
1356#define ImGuiKey_Mouse_BEGIN (ImGuiKey_MouseLeft)
1357#define ImGuiKey_Mouse_END (ImGuiKey_MouseWheelY + 1)
1358#define ImGuiKey_Aliases_BEGIN (ImGuiKey_Mouse_BEGIN)
1359#define ImGuiKey_Aliases_END (ImGuiKey_Mouse_END)
1360
1361// [Internal] Named shortcuts for Navigation
1362#define ImGuiKey_NavKeyboardTweakSlow ImGuiMod_Ctrl
1363#define ImGuiKey_NavKeyboardTweakFast ImGuiMod_Shift
1364#define ImGuiKey_NavGamepadTweakSlow ImGuiKey_GamepadL1
1365#define ImGuiKey_NavGamepadTweakFast ImGuiKey_GamepadR1
1366#define ImGuiKey_NavGamepadActivate (g.IO.ConfigNavSwapGamepadButtons ? ImGuiKey_GamepadFaceRight : ImGuiKey_GamepadFaceDown)
1367#define ImGuiKey_NavGamepadCancel (g.IO.ConfigNavSwapGamepadButtons ? ImGuiKey_GamepadFaceDown : ImGuiKey_GamepadFaceRight)
1368#define ImGuiKey_NavGamepadMenu ImGuiKey_GamepadFaceLeft
1369#define ImGuiKey_NavGamepadInput ImGuiKey_GamepadFaceUp
1370
1371enum ImGuiInputEventType
1372{
1373 ImGuiInputEventType_None = 0,
1374 ImGuiInputEventType_MousePos,
1375 ImGuiInputEventType_MouseWheel,
1376 ImGuiInputEventType_MouseButton,
1377 ImGuiInputEventType_Key,
1378 ImGuiInputEventType_Text,
1379 ImGuiInputEventType_Focus,
1380 ImGuiInputEventType_COUNT
1381};
1382
1383enum ImGuiInputSource
1384{
1385 ImGuiInputSource_None = 0,
1386 ImGuiInputSource_Mouse, // Note: may be Mouse or TouchScreen or Pen. See io.MouseSource to distinguish them.
1387 ImGuiInputSource_Keyboard,
1388 ImGuiInputSource_Gamepad,
1389 ImGuiInputSource_COUNT
1390};
1391
1392// FIXME: Structures in the union below need to be declared as anonymous unions appears to be an extension?
1393// Using ImVec2() would fail on Clang 'union member 'MousePos' has a non-trivial default constructor'
1394struct ImGuiInputEventMousePos { float PosX, PosY; ImGuiMouseSource MouseSource; };
1395struct ImGuiInputEventMouseWheel { float WheelX, WheelY; ImGuiMouseSource MouseSource; };
1396struct ImGuiInputEventMouseButton { int Button; bool Down; ImGuiMouseSource MouseSource; };
1397struct ImGuiInputEventKey { ImGuiKey Key; bool Down; float AnalogValue; };
1398struct ImGuiInputEventText { unsigned int Char; };
1399struct ImGuiInputEventAppFocused { bool Focused; };
1400
1401struct ImGuiInputEvent
1402{
1403 ImGuiInputEventType Type;
1404 ImGuiInputSource Source;
1405 ImU32 EventId; // Unique, sequential increasing integer to identify an event (if you need to correlate them to other data).
1406 union
1407 {
1408 ImGuiInputEventMousePos MousePos; // if Type == ImGuiInputEventType_MousePos
1409 ImGuiInputEventMouseWheel MouseWheel; // if Type == ImGuiInputEventType_MouseWheel
1410 ImGuiInputEventMouseButton MouseButton; // if Type == ImGuiInputEventType_MouseButton
1411 ImGuiInputEventKey Key; // if Type == ImGuiInputEventType_Key
1412 ImGuiInputEventText Text; // if Type == ImGuiInputEventType_Text
1413 ImGuiInputEventAppFocused AppFocused; // if Type == ImGuiInputEventType_Focus
1414 };
1415 bool AddedByTestEngine;
1416
1417 ImGuiInputEvent() { memset(this, 0, sizeof(*this)); }
1418};
1419
1420// Input function taking an 'ImGuiID owner_id' argument defaults to (ImGuiKeyOwner_Any == 0) aka don't test ownership, which matches legacy behavior.
1421#define ImGuiKeyOwner_Any ((ImGuiID)0) // Accept key that have an owner, UNLESS a call to SetKeyOwner() explicitly used ImGuiInputFlags_LockThisFrame or ImGuiInputFlags_LockUntilRelease.
1422#define ImGuiKeyOwner_NoOwner ((ImGuiID)-1) // Require key to have no owner.
1423//#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.
1424
1425typedef ImS16 ImGuiKeyRoutingIndex;
1426
1427// Routing table entry (sizeof() == 16 bytes)
1428struct ImGuiKeyRoutingData
1429{
1430 ImGuiKeyRoutingIndex NextEntryIndex;
1431 ImU16 Mods; // Technically we'd only need 4-bits but for simplify we store ImGuiMod_ values which need 16-bits.
1432 ImU8 RoutingCurrScore; // [DEBUG] For debug display
1433 ImU8 RoutingNextScore; // Lower is better (0: perfect score)
1434 ImGuiID RoutingCurr;
1435 ImGuiID RoutingNext;
1436
1437 ImGuiKeyRoutingData() { NextEntryIndex = -1; Mods = 0; RoutingCurrScore = RoutingNextScore = 255; RoutingCurr = RoutingNext = ImGuiKeyOwner_NoOwner; }
1438};
1439
1440// Routing table: maintain a desired owner for each possible key-chord (key + mods), and setup owner in NewFrame() when mods are matching.
1441// Stored in main context (1 instance)
1442struct ImGuiKeyRoutingTable
1443{
1444 ImGuiKeyRoutingIndex Index[ImGuiKey_NamedKey_COUNT]; // Index of first entry in Entries[]
1446 ImVector<ImGuiKeyRoutingData> EntriesNext; // Double-buffer to avoid reallocation (could use a shared buffer)
1447
1448 ImGuiKeyRoutingTable() { Clear(); }
1449 void Clear() { for (int n = 0; n < IM_ARRAYSIZE(Index); n++) Index[n] = -1; Entries.clear(); EntriesNext.clear(); }
1450};
1451
1452// This extends ImGuiKeyData but only for named keys (legacy keys don't support the new features)
1453// Stored in main context (1 per named key). In the future it might be merged into ImGuiKeyData.
1454struct ImGuiKeyOwnerData
1455{
1456 ImGuiID OwnerCurr;
1457 ImGuiID OwnerNext;
1458 bool LockThisFrame; // Reading this key requires explicit owner id (until end of frame). Set by ImGuiInputFlags_LockThisFrame.
1459 bool 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.
1460
1461 ImGuiKeyOwnerData() { OwnerCurr = OwnerNext = ImGuiKeyOwner_NoOwner; LockThisFrame = LockUntilRelease = false; }
1462};
1463
1464// Extend ImGuiInputFlags_
1465// Flags for extended versions of IsKeyPressed(), IsMouseClicked(), Shortcut(), SetKeyOwner(), SetItemKeyOwner()
1466// Don't mistake with ImGuiInputTextFlags! (which is for ImGui::InputText() function)
1467enum ImGuiInputFlagsPrivate_
1468{
1469 // Flags for IsKeyPressed(), IsKeyChordPressed(), IsMouseClicked(), Shortcut()
1470 // - Repeat mode: Repeat rate selection
1471 ImGuiInputFlags_RepeatRateDefault = 1 << 1, // Repeat rate: Regular (default)
1472 ImGuiInputFlags_RepeatRateNavMove = 1 << 2, // Repeat rate: Fast
1473 ImGuiInputFlags_RepeatRateNavTweak = 1 << 3, // Repeat rate: Faster
1474 // - Repeat mode: Specify when repeating key pressed can be interrupted.
1475 // - In theory ImGuiInputFlags_RepeatUntilOtherKeyPress may be a desirable default, but it would break too many behavior so everything is opt-in.
1476 ImGuiInputFlags_RepeatUntilRelease = 1 << 4, // Stop repeating when released (default for all functions except Shortcut). This only exists to allow overriding Shortcut() default behavior.
1477 ImGuiInputFlags_RepeatUntilKeyModsChange = 1 << 5, // Stop repeating when released OR if keyboard mods are changed (default for Shortcut)
1478 ImGuiInputFlags_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.
1479 ImGuiInputFlags_RepeatUntilOtherKeyPress = 1 << 7, // Stop repeating when released OR if any other keyboard key is pressed during the repeat
1480
1481 // Flags for SetKeyOwner(), SetItemKeyOwner()
1482 // - 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.
1483 ImGuiInputFlags_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.
1484 ImGuiInputFlags_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.
1485
1486 // - Condition for SetItemKeyOwner()
1487 ImGuiInputFlags_CondHovered = 1 << 22, // Only set if item is hovered (default to both)
1488 ImGuiInputFlags_CondActive = 1 << 23, // Only set if item is active (default to both)
1489 ImGuiInputFlags_CondDefault_ = ImGuiInputFlags_CondHovered | ImGuiInputFlags_CondActive,
1490
1491 // [Internal] Mask of which function support which flags
1492 ImGuiInputFlags_RepeatRateMask_ = ImGuiInputFlags_RepeatRateDefault | ImGuiInputFlags_RepeatRateNavMove | ImGuiInputFlags_RepeatRateNavTweak,
1493 ImGuiInputFlags_RepeatUntilMask_ = ImGuiInputFlags_RepeatUntilRelease | ImGuiInputFlags_RepeatUntilKeyModsChange | ImGuiInputFlags_RepeatUntilKeyModsChangeFromNone | ImGuiInputFlags_RepeatUntilOtherKeyPress,
1494 ImGuiInputFlags_RepeatMask_ = ImGuiInputFlags_Repeat | ImGuiInputFlags_RepeatRateMask_ | ImGuiInputFlags_RepeatUntilMask_,
1495 ImGuiInputFlags_CondMask_ = ImGuiInputFlags_CondHovered | ImGuiInputFlags_CondActive,
1496 ImGuiInputFlags_RouteTypeMask_ = ImGuiInputFlags_RouteActive | ImGuiInputFlags_RouteFocused | ImGuiInputFlags_RouteGlobal | ImGuiInputFlags_RouteAlways,
1497 ImGuiInputFlags_RouteOptionsMask_ = ImGuiInputFlags_RouteOverFocused | ImGuiInputFlags_RouteOverActive | ImGuiInputFlags_RouteUnlessBgFocused | ImGuiInputFlags_RouteFromRootWindow,
1498 ImGuiInputFlags_SupportedByIsKeyPressed = ImGuiInputFlags_RepeatMask_,
1499 ImGuiInputFlags_SupportedByIsMouseClicked = ImGuiInputFlags_Repeat,
1500 ImGuiInputFlags_SupportedByShortcut = ImGuiInputFlags_RepeatMask_ | ImGuiInputFlags_RouteTypeMask_ | ImGuiInputFlags_RouteOptionsMask_,
1501 ImGuiInputFlags_SupportedBySetNextItemShortcut = ImGuiInputFlags_RepeatMask_ | ImGuiInputFlags_RouteTypeMask_ | ImGuiInputFlags_RouteOptionsMask_ | ImGuiInputFlags_Tooltip,
1502 ImGuiInputFlags_SupportedBySetKeyOwner = ImGuiInputFlags_LockThisFrame | ImGuiInputFlags_LockUntilRelease,
1503 ImGuiInputFlags_SupportedBySetItemKeyOwner = ImGuiInputFlags_SupportedBySetKeyOwner | ImGuiInputFlags_CondMask_,
1504};
1505
1506//-----------------------------------------------------------------------------
1507// [SECTION] Clipper support
1508//-----------------------------------------------------------------------------
1509
1510// Note that Max is exclusive, so perhaps should be using a Begin/End convention.
1512{
1513 int Min;
1514 int Max;
1515 bool PosToIndexConvert; // Begin/End are absolute position (will be converted to indices later)
1516 ImS8 PosToIndexOffsetMin; // Add to Min after converting to indices
1517 ImS8 PosToIndexOffsetMax; // Add to Min after converting to indices
1518
1519 static ImGuiListClipperRange FromIndices(int min, int max) { ImGuiListClipperRange r = { min, max, false, 0, 0 }; return r; }
1520 static 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; }
1521};
1522
1523// Temporary clipper data, buffers shared/reused between instances
1524struct ImGuiListClipperData
1525{
1526 ImGuiListClipper* ListClipper;
1527 float LossynessOffset;
1528 int StepNo;
1529 int ItemsFrozen;
1531
1532 ImGuiListClipperData() { memset(this, 0, sizeof(*this)); }
1533 void Reset(ImGuiListClipper* clipper) { ListClipper = clipper; StepNo = ItemsFrozen = 0; Ranges.resize(0); }
1534};
1535
1536//-----------------------------------------------------------------------------
1537// [SECTION] Navigation support
1538//-----------------------------------------------------------------------------
1539
1540enum ImGuiActivateFlags_
1541{
1542 ImGuiActivateFlags_None = 0,
1543 ImGuiActivateFlags_PreferInput = 1 << 0, // Favor activation that requires keyboard text input (e.g. for Slider/Drag). Default for Enter key.
1544 ImGuiActivateFlags_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.
1545 ImGuiActivateFlags_TryToPreserveState = 1 << 2, // Request widget to preserve state if it can (e.g. InputText will try to preserve cursor/selection)
1546 ImGuiActivateFlags_FromTabbing = 1 << 3, // Activation requested by a tabbing request
1547 ImGuiActivateFlags_FromShortcut = 1 << 4, // Activation requested by an item shortcut via SetNextItemShortcut() function.
1548};
1549
1550// Early work-in-progress API for ScrollToItem()
1551enum ImGuiScrollFlags_
1552{
1553 ImGuiScrollFlags_None = 0,
1554 ImGuiScrollFlags_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]
1555 ImGuiScrollFlags_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]
1556 ImGuiScrollFlags_KeepVisibleCenterX = 1 << 2, // If item is not visible: scroll to make the item centered on X axis [rarely used]
1557 ImGuiScrollFlags_KeepVisibleCenterY = 1 << 3, // If item is not visible: scroll to make the item centered on Y axis
1558 ImGuiScrollFlags_AlwaysCenterX = 1 << 4, // Always center the result item on X axis [rarely used]
1559 ImGuiScrollFlags_AlwaysCenterY = 1 << 5, // Always center the result item on Y axis [default for Y axis for appearing window)
1560 ImGuiScrollFlags_NoScrollParent = 1 << 6, // Disable forwarding scrolling to parent window if required to keep item/rect visible (only scroll window the function was applied to).
1561 ImGuiScrollFlags_MaskX_ = ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_KeepVisibleCenterX | ImGuiScrollFlags_AlwaysCenterX,
1562 ImGuiScrollFlags_MaskY_ = ImGuiScrollFlags_KeepVisibleEdgeY | ImGuiScrollFlags_KeepVisibleCenterY | ImGuiScrollFlags_AlwaysCenterY,
1563};
1564
1565enum ImGuiNavRenderCursorFlags_
1566{
1567 ImGuiNavRenderCursorFlags_None = 0,
1568 ImGuiNavRenderCursorFlags_Compact = 1 << 1, // Compact highlight, no padding/distance from focused item
1569 ImGuiNavRenderCursorFlags_AlwaysDraw = 1 << 2, // Draw rectangular highlight if (g.NavId == id) even when g.NavCursorVisible == false, aka even when using the mouse.
1570 ImGuiNavRenderCursorFlags_NoRounding = 1 << 3,
1571#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
1572 ImGuiNavHighlightFlags_None = ImGuiNavRenderCursorFlags_None, // Renamed in 1.91.4
1573 ImGuiNavHighlightFlags_Compact = ImGuiNavRenderCursorFlags_Compact, // Renamed in 1.91.4
1574 ImGuiNavHighlightFlags_AlwaysDraw = ImGuiNavRenderCursorFlags_AlwaysDraw, // Renamed in 1.91.4
1575 ImGuiNavHighlightFlags_NoRounding = ImGuiNavRenderCursorFlags_NoRounding, // Renamed in 1.91.4
1576#endif
1577};
1578
1579enum ImGuiNavMoveFlags_
1580{
1581 ImGuiNavMoveFlags_None = 0,
1582 ImGuiNavMoveFlags_LoopX = 1 << 0, // On failed request, restart from opposite side
1583 ImGuiNavMoveFlags_LoopY = 1 << 1,
1584 ImGuiNavMoveFlags_WrapX = 1 << 2, // On failed request, request from opposite side one line down (when NavDir==right) or one line up (when NavDir==left)
1585 ImGuiNavMoveFlags_WrapY = 1 << 3, // This is not super useful but provided for completeness
1586 ImGuiNavMoveFlags_WrapMask_ = ImGuiNavMoveFlags_LoopX | ImGuiNavMoveFlags_LoopY | ImGuiNavMoveFlags_WrapX | ImGuiNavMoveFlags_WrapY,
1587 ImGuiNavMoveFlags_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)
1588 ImGuiNavMoveFlags_AlsoScoreVisibleSet = 1 << 5, // Store alternate result in NavMoveResultLocalVisible that only comprise elements that are already fully visible (used by PageUp/PageDown)
1589 ImGuiNavMoveFlags_ScrollToEdgeY = 1 << 6, // Force scrolling to min/max (used by Home/End) // FIXME-NAV: Aim to remove or reword, probably unnecessary
1590 ImGuiNavMoveFlags_Forwarded = 1 << 7,
1591 ImGuiNavMoveFlags_DebugNoResult = 1 << 8, // Dummy scoring for debug purpose, don't apply result
1592 ImGuiNavMoveFlags_FocusApi = 1 << 9, // Requests from focus API can land/focus/activate items even if they are marked with _NoTabStop (see NavProcessItemForTabbingRequest() for details)
1593 ImGuiNavMoveFlags_IsTabbing = 1 << 10, // == Focus + Activate if item is Inputable + DontChangeNavHighlight
1594 ImGuiNavMoveFlags_IsPageMove = 1 << 11, // Identify a PageDown/PageUp request.
1595 ImGuiNavMoveFlags_Activate = 1 << 12, // Activate/select target item.
1596 ImGuiNavMoveFlags_NoSelect = 1 << 13, // Don't trigger selection by not setting g.NavJustMovedTo
1597 ImGuiNavMoveFlags_NoSetNavCursorVisible = 1 << 14, // Do not alter the nav cursor visible state
1598 ImGuiNavMoveFlags_NoClearActiveId = 1 << 15, // (Experimental) Do not clear active id when applying move result
1599};
1600
1601enum ImGuiNavLayer
1602{
1603 ImGuiNavLayer_Main = 0, // Main scrolling layer
1604 ImGuiNavLayer_Menu = 1, // Menu layer (access with Alt)
1605 ImGuiNavLayer_COUNT
1606};
1607
1608// Storage for navigation query/results
1609struct ImGuiNavItemData
1610{
1611 ImGuiWindow* Window; // Init,Move // Best candidate window (result->ItemWindow->RootWindowForNav == request->Window)
1612 ImGuiID ID; // Init,Move // Best candidate item ID
1613 ImGuiID FocusScopeId; // Init,Move // Best candidate focus scope ID
1614 ImRect RectRel; // Init,Move // Best candidate bounding box in window relative space
1615 ImGuiItemFlags ItemFlags; // ????,Move // Best candidate item flags
1616 float DistBox; // Move // Best candidate box distance to current NavId
1617 float DistCenter; // Move // Best candidate center distance to current NavId
1618 float DistAxial; // Move // Best candidate axial distance to current NavId
1619 ImGuiSelectionUserData SelectionUserData;//I+Mov // Best candidate SetNextItemSelectionUserData() value. Valid if (ItemFlags & ImGuiItemFlags_HasSelectionUserData)
1620
1621 ImGuiNavItemData() { Clear(); }
1622 void Clear() { Window = NULL; ID = FocusScopeId = 0; ItemFlags = 0; SelectionUserData = -1; DistBox = DistCenter = DistAxial = FLT_MAX; }
1623};
1624
1625// Storage for PushFocusScope(), g.FocusScopeStack[], g.NavFocusRoute[]
1627{
1628 ImGuiID ID;
1629 ImGuiID WindowID;
1630};
1631
1632//-----------------------------------------------------------------------------
1633// [SECTION] Typing-select support
1634//-----------------------------------------------------------------------------
1635
1636// Flags for GetTypingSelectRequest()
1637enum ImGuiTypingSelectFlags_
1638{
1639 ImGuiTypingSelectFlags_None = 0,
1640 ImGuiTypingSelectFlags_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)
1641 ImGuiTypingSelectFlags_AllowSingleCharMode = 1 << 1, // Allow "single char" search mode which is activated when pressing the same character multiple times.
1642};
1643
1644// Returned by GetTypingSelectRequest(), designed to eventually be public.
1646{
1647 ImGuiTypingSelectFlags Flags; // Flags passed to GetTypingSelectRequest()
1648 int SearchBufferLen;
1649 const char* SearchBuffer; // Search buffer contents (use full string. unless SingleCharMode is set, in which case use SingleCharSize).
1650 bool SelectRequest; // Set when buffer was modified this frame, requesting a selection.
1651 bool 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.
1652 ImS8 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.
1653};
1654
1655// Storage for GetTypingSelectRequest()
1656struct IMGUI_API ImGuiTypingSelectState
1657{
1658 ImGuiTypingSelectRequest Request; // User-facing data
1659 char SearchBuffer[64]; // Search buffer: no need to make dynamic as this search is very transient.
1660 ImGuiID FocusScope;
1661 int LastRequestFrame = 0;
1662 float LastRequestTime = 0.0f;
1663 bool 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.
1664
1665 ImGuiTypingSelectState() { memset(this, 0, sizeof(*this)); }
1666 void Clear() { SearchBuffer[0] = 0; SingleCharModeLock = false; } // We preserve remaining data for easier debugging
1667};
1668
1669//-----------------------------------------------------------------------------
1670// [SECTION] Columns support
1671//-----------------------------------------------------------------------------
1672
1673// Flags for internal's BeginColumns(). This is an obsolete API. Prefer using BeginTable() nowadays!
1674enum ImGuiOldColumnFlags_
1675{
1676 ImGuiOldColumnFlags_None = 0,
1677 ImGuiOldColumnFlags_NoBorder = 1 << 0, // Disable column dividers
1678 ImGuiOldColumnFlags_NoResize = 1 << 1, // Disable resizing columns when clicking on the dividers
1679 ImGuiOldColumnFlags_NoPreserveWidths = 1 << 2, // Disable column width preservation when adjusting columns
1680 ImGuiOldColumnFlags_NoForceWithinWindow = 1 << 3, // Disable forcing columns to fit within window
1681 ImGuiOldColumnFlags_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.
1682
1683 // Obsolete names (will be removed)
1684#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
1685 //ImGuiColumnsFlags_None = ImGuiOldColumnFlags_None,
1686 //ImGuiColumnsFlags_NoBorder = ImGuiOldColumnFlags_NoBorder,
1687 //ImGuiColumnsFlags_NoResize = ImGuiOldColumnFlags_NoResize,
1688 //ImGuiColumnsFlags_NoPreserveWidths = ImGuiOldColumnFlags_NoPreserveWidths,
1689 //ImGuiColumnsFlags_NoForceWithinWindow = ImGuiOldColumnFlags_NoForceWithinWindow,
1690 //ImGuiColumnsFlags_GrowParentContentsSize = ImGuiOldColumnFlags_GrowParentContentsSize,
1691#endif
1692};
1693
1694struct ImGuiOldColumnData
1695{
1696 float OffsetNorm; // Column start offset, normalized 0.0 (far left) -> 1.0 (far right)
1697 float OffsetNormBeforeResize;
1698 ImGuiOldColumnFlags Flags; // Not exposed
1699 ImRect ClipRect;
1700
1701 ImGuiOldColumnData() { memset(this, 0, sizeof(*this)); }
1702};
1703
1704struct ImGuiOldColumns
1705{
1706 ImGuiID ID;
1707 ImGuiOldColumnFlags Flags;
1708 bool IsFirstFrame;
1709 bool IsBeingResized;
1710 int Current;
1711 int Count;
1712 float OffMinX, OffMaxX; // Offsets from HostWorkRect.Min.x
1713 float LineMinY, LineMaxY;
1714 float HostCursorPosY; // Backup of CursorPos at the time of BeginColumns()
1715 float HostCursorMaxPosX; // Backup of CursorMaxPos at the time of BeginColumns()
1716 ImRect HostInitialClipRect; // Backup of ClipRect at the time of BeginColumns()
1717 ImRect HostBackupClipRect; // Backup of ClipRect during PushColumnsBackground()/PopColumnsBackground()
1718 ImRect HostBackupParentWorkRect;//Backup of WorkRect at the time of BeginColumns()
1720 ImDrawListSplitter Splitter;
1721
1722 ImGuiOldColumns() { memset(this, 0, sizeof(*this)); }
1723};
1724
1725//-----------------------------------------------------------------------------
1726// [SECTION] Box-select support
1727//-----------------------------------------------------------------------------
1728
1729struct ImGuiBoxSelectState
1730{
1731 // Active box-selection data (persistent, 1 active at a time)
1732 ImGuiID ID;
1733 bool IsActive;
1734 bool IsStarting;
1735 bool IsStartedFromVoid; // Starting click was not from an item.
1736 bool IsStartedSetNavIdOnce;
1737 bool RequestClear;
1738 ImGuiKeyChord KeyMods : 16; // Latched key-mods for box-select logic.
1739 ImVec2 StartPosRel; // Start position in window-contents relative space (to support scrolling)
1740 ImVec2 EndPosRel; // End position in window-contents relative space
1741 ImVec2 ScrollAccum; // Scrolling accumulator (to behave at high-frame spaces)
1742 ImGuiWindow* Window;
1743
1744 // Temporary/Transient data
1745 bool UnclipMode; // (Temp/Transient, here in hot area). Set/cleared by the BeginMultiSelect()/EndMultiSelect() owning active box-select.
1746 ImRect UnclipRect; // Rectangle where ItemAdd() clipping may be temporarily disabled. Need support by multi-select supporting widgets.
1747 ImRect BoxSelectRectPrev; // Selection rectangle in absolute coordinates (derived every frame from BoxSelectStartPosRel and MousePos)
1748 ImRect BoxSelectRectCurr;
1749
1750 ImGuiBoxSelectState() { memset(this, 0, sizeof(*this)); }
1751};
1752
1753//-----------------------------------------------------------------------------
1754// [SECTION] Multi-select support
1755//-----------------------------------------------------------------------------
1756
1757// We always assume that -1 is an invalid value (which works for indices and pointers)
1758#define ImGuiSelectionUserData_Invalid ((ImGuiSelectionUserData)-1)
1759
1760// Temporary storage for multi-select
1761struct IMGUI_API ImGuiMultiSelectTempData
1762{
1763 ImGuiMultiSelectIO IO; // MUST BE FIRST FIELD. Requests are set and returned by BeginMultiSelect()/EndMultiSelect() + written to by user during the loop.
1764 ImGuiMultiSelectState* Storage;
1765 ImGuiID FocusScopeId; // Copied from g.CurrentFocusScopeId (unless another selection scope was pushed manually)
1766 ImGuiMultiSelectFlags Flags;
1767 ImVec2 ScopeRectMin;
1768 ImVec2 BackupCursorMaxPos;
1769 ImGuiSelectionUserData LastSubmittedItem; // Copy of last submitted item data, used to merge output ranges.
1770 ImGuiID BoxSelectId;
1771 ImGuiKeyChord KeyMods;
1772 ImS8 LoopRequestSetAll; // -1: no operation, 0: clear all, 1: select all.
1773 bool IsEndIO; // Set when switching IO from BeginMultiSelect() to EndMultiSelect() state.
1774 bool IsFocused; // Set if currently focusing the selection scope (any item of the selection). May be used if you have custom shortcut associated to selection.
1775 bool IsKeyboardSetRange; // Set by BeginMultiSelect() when using Shift+Navigation. Because scrolling may be affected we can't afford a frame of lag with Shift+Navigation.
1776 bool NavIdPassedBy;
1777 bool RangeSrcPassedBy; // Set by the item that matches RangeSrcItem.
1778 bool RangeDstPassedBy; // Set by the item that matches NavJustMovedToId when IsSetRange is set.
1779
1780 ImGuiMultiSelectTempData() { Clear(); }
1781 void 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.
1782 void ClearIO() { IO.Requests.resize(0); IO.RangeSrcItem = IO.NavIdItem = ImGuiSelectionUserData_Invalid; IO.NavIdSelected = IO.RangeSrcReset = false; }
1783};
1784
1785// Persistent storage for multi-select (as long as selection is alive)
1786struct IMGUI_API ImGuiMultiSelectState
1787{
1788 ImGuiWindow* Window;
1789 ImGuiID ID;
1790 int LastFrameActive; // Last used frame-count, for GC.
1791 int LastSelectionSize; // Set by BeginMultiSelect() based on optional info provided by user. May be -1 if unknown.
1792 ImS8 RangeSelected; // -1 (don't have) or true/false
1793 ImS8 NavIdSelected; // -1 (don't have) or true/false
1794 ImGuiSelectionUserData RangeSrcItem; //
1795 ImGuiSelectionUserData NavIdItem; // SetNextItemSelectionUserData() value for NavId (if part of submitted items)
1796
1797 ImGuiMultiSelectState() { Window = NULL; ID = 0; LastFrameActive = LastSelectionSize = 0; RangeSelected = NavIdSelected = -1; RangeSrcItem = NavIdItem = ImGuiSelectionUserData_Invalid; }
1798};
1799
1800//-----------------------------------------------------------------------------
1801// [SECTION] Docking support
1802//-----------------------------------------------------------------------------
1803
1804#ifdef IMGUI_HAS_DOCK
1805// <this is filled in 'docking' branch>
1806#endif // #ifdef IMGUI_HAS_DOCK
1807
1808//-----------------------------------------------------------------------------
1809// [SECTION] Viewport support
1810//-----------------------------------------------------------------------------
1811
1812// ImGuiViewport Private/Internals fields (cardinal sin: we are using inheritance!)
1813// Every instance of ImGuiViewport is in fact a ImGuiViewportP.
1814struct ImGuiViewportP : public ImGuiViewport
1815{
1816 int BgFgDrawListsLastFrame[2]; // Last frame number the background (0) and foreground (1) draw lists were used
1817 ImDrawList* 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.
1818 ImDrawData DrawDataP;
1819 ImDrawDataBuilder DrawDataBuilder; // Temporary data while building final ImDrawData
1820
1821 // Per-viewport work area
1822 // - Insets are >= 0.0f values, distance from viewport corners to work area.
1823 // - BeginMainMenuBar() and DockspaceOverViewport() tend to use work area to avoid stepping over existing contents.
1824 // - Generally 'safeAreaInsets' in iOS land, 'DisplayCutout' in Android land.
1825 ImVec2 WorkInsetMin; // Work Area inset locked for the frame. GetWorkRect() always fits within GetMainRect().
1826 ImVec2 WorkInsetMax; // "
1827 ImVec2 BuildWorkInsetMin; // Work Area inset accumulator for current frame, to become next frame's WorkInset
1828 ImVec2 BuildWorkInsetMax; // "
1829
1830 ImGuiViewportP() { BgFgDrawListsLastFrame[0] = BgFgDrawListsLastFrame[1] = -1; BgFgDrawLists[0] = BgFgDrawLists[1] = NULL; }
1831 ~ImGuiViewportP() { if (BgFgDrawLists[0]) IM_DELETE(BgFgDrawLists[0]); if (BgFgDrawLists[1]) IM_DELETE(BgFgDrawLists[1]); }
1832
1833 // 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)
1834 ImVec2 CalcWorkRectPos(const ImVec2& inset_min) const { return ImVec2(Pos.x + inset_min.x, Pos.y + inset_min.y); }
1835 ImVec2 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)); }
1836 void UpdateWorkRect() { WorkPos = CalcWorkRectPos(WorkInsetMin); WorkSize = CalcWorkRectSize(WorkInsetMin, WorkInsetMax); } // Update public fields
1837
1838 // Helpers to retrieve ImRect (we don't need to store BuildWorkRect as every access tend to change it, hence the code asymmetry)
1839 ImRect GetMainRect() const { return ImRect(Pos.x, Pos.y, Pos.x + Size.x, Pos.y + Size.y); }
1840 ImRect GetWorkRect() const { return ImRect(WorkPos.x, WorkPos.y, WorkPos.x + WorkSize.x, WorkPos.y + WorkSize.y); }
1841 ImRect 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); }
1842};
1843
1844//-----------------------------------------------------------------------------
1845// [SECTION] Settings support
1846//-----------------------------------------------------------------------------
1847
1848// Windows data saved in imgui.ini file
1849// Because we never destroy or rename ImGuiWindowSettings, we can store the names in a separate buffer easily.
1850// (this is designed to be stored in a ImChunkStream buffer, with the variable-length Name following our structure)
1851struct ImGuiWindowSettings
1852{
1853 ImGuiID ID;
1854 ImVec2ih Pos;
1855 ImVec2ih Size;
1856 bool Collapsed;
1857 bool IsChild;
1858 bool WantApply; // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context)
1859 bool WantDelete; // Set to invalidate/delete the settings entry
1860
1861 ImGuiWindowSettings() { memset(this, 0, sizeof(*this)); }
1862 char* GetName() { return (char*)(this + 1); }
1863};
1864
1865struct ImGuiSettingsHandler
1866{
1867 const char* TypeName; // Short description stored in .ini file. Disallowed characters: '[' ']'
1868 ImGuiID TypeHash; // == ImHashStr(TypeName)
1869 void (*ClearAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Clear all settings data
1870 void (*ReadInitFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Read: Called before reading (in registration order)
1871 void* (*ReadOpenFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, const char* name); // Read: Called when entering into a new ini entry e.g. "[Window][Name]"
1872 void (*ReadLineFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, void* entry, const char* line); // Read: Called for every line of text within an ini entry
1873 void (*ApplyAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Read: Called after reading (in registration order)
1874 void (*WriteAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* out_buf); // Write: Output every entries into 'out_buf'
1875 void* UserData;
1876
1877 ImGuiSettingsHandler() { memset(this, 0, sizeof(*this)); }
1878};
1879
1880//-----------------------------------------------------------------------------
1881// [SECTION] Localization support
1882//-----------------------------------------------------------------------------
1883
1884// This is experimental and not officially supported, it'll probably fall short of features, if/when it does we may backtrack.
1885enum ImGuiLocKey : int
1886{
1887 ImGuiLocKey_VersionStr,
1888 ImGuiLocKey_TableSizeOne,
1889 ImGuiLocKey_TableSizeAllFit,
1890 ImGuiLocKey_TableSizeAllDefault,
1891 ImGuiLocKey_TableResetOrder,
1892 ImGuiLocKey_WindowingMainMenuBar,
1893 ImGuiLocKey_WindowingPopup,
1894 ImGuiLocKey_WindowingUntitled,
1895 ImGuiLocKey_OpenLink_s,
1896 ImGuiLocKey_CopyLink,
1897 ImGuiLocKey_COUNT
1898};
1899
1901{
1902 ImGuiLocKey Key;
1903 const char* Text;
1904};
1905
1906//-----------------------------------------------------------------------------
1907// [SECTION] Error handling, State recovery support
1908//-----------------------------------------------------------------------------
1909
1910// Macros used by Recoverable Error handling
1911// - Only dispatch error if _EXPR: evaluate as assert (similar to an assert macro).
1912// - The message will always be a string literal, in order to increase likelihood of being display by an assert handler.
1913// - See 'Demo->Configuration->Error Handling' and ImGuiIO definitions for details on error handling.
1914// - Read https://github.com/ocornut/imgui/wiki/Error-Handling for details on error handling.
1915#ifndef IM_ASSERT_USER_ERROR
1916#define IM_ASSERT_USER_ERROR(_EXPR,_MSG) do { if (!(_EXPR) && ImGui::ErrorLog(_MSG)) { IM_ASSERT((_EXPR) && _MSG); } } while (0) // Recoverable User Error
1917#endif
1918
1919// The error callback is currently not public, as it is expected that only advanced users will rely on it.
1920typedef void (*ImGuiErrorCallback)(ImGuiContext* ctx, void* user_data, const char* msg); // Function signature for g.ErrorCallback
1921
1922//-----------------------------------------------------------------------------
1923// [SECTION] Metrics, Debug Tools
1924//-----------------------------------------------------------------------------
1925
1926// See IMGUI_DEBUG_LOG() and IMGUI_DEBUG_LOG_XXX() macros.
1927enum ImGuiDebugLogFlags_
1928{
1929 // Event types
1930 ImGuiDebugLogFlags_None = 0,
1931 ImGuiDebugLogFlags_EventError = 1 << 0, // Error submitted by IM_ASSERT_USER_ERROR()
1932 ImGuiDebugLogFlags_EventActiveId = 1 << 1,
1933 ImGuiDebugLogFlags_EventFocus = 1 << 2,
1934 ImGuiDebugLogFlags_EventPopup = 1 << 3,
1935 ImGuiDebugLogFlags_EventNav = 1 << 4,
1936 ImGuiDebugLogFlags_EventClipper = 1 << 5,
1937 ImGuiDebugLogFlags_EventSelection = 1 << 6,
1938 ImGuiDebugLogFlags_EventIO = 1 << 7,
1939 ImGuiDebugLogFlags_EventFont = 1 << 8,
1940 ImGuiDebugLogFlags_EventInputRouting = 1 << 9,
1941 ImGuiDebugLogFlags_EventDocking = 1 << 10, // Unused in this branch
1942 ImGuiDebugLogFlags_EventViewport = 1 << 11, // Unused in this branch
1943
1944 ImGuiDebugLogFlags_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,
1945 ImGuiDebugLogFlags_OutputToTTY = 1 << 20, // Also send output to TTY
1946 ImGuiDebugLogFlags_OutputToTestEngine = 1 << 21, // Also send output to Test Engine
1947};
1948
1950{
1951 int FrameCount;
1952 ImS16 AllocCount;
1953 ImS16 FreeCount;
1954};
1955
1956struct ImGuiDebugAllocInfo
1957{
1958 int TotalAllocCount; // Number of call to MemAlloc().
1959 int TotalFreeCount;
1960 ImS16 LastEntriesIdx; // Current index in buffer
1961 ImGuiDebugAllocEntry LastEntriesBuf[6]; // Track last 6 frames that had allocations
1962
1963 ImGuiDebugAllocInfo() { memset(this, 0, sizeof(*this)); }
1964};
1965
1967{
1968 bool ShowDebugLog = false;
1969 bool ShowIDStackTool = false;
1970 bool ShowWindowsRects = false;
1971 bool ShowWindowsBeginOrder = false;
1972 bool ShowTablesRects = false;
1973 bool ShowDrawCmdMesh = true;
1974 bool ShowDrawCmdBoundingBoxes = true;
1975 bool ShowTextEncodingViewer = false;
1976 bool ShowAtlasTintedWithTextColor = false;
1977 int ShowWindowsRectsType = -1;
1978 int ShowTablesRectsType = -1;
1979 int HighlightMonitorIdx = -1;
1980 ImGuiID HighlightViewportID = 0;
1981};
1982
1983struct ImGuiStackLevelInfo
1984{
1985 ImGuiID ID;
1986 ImS8 QueryFrameCount; // >= 1: Query in progress
1987 bool QuerySuccess; // Obtained result from DebugHookIdInfo()
1988 ImGuiDataType DataType : 8;
1989 char Desc[57]; // Arbitrarily sized buffer to hold a result (FIXME: could replace Results[] with a chunk stream?) FIXME: Now that we added CTRL+C this should be fixed.
1990
1991 ImGuiStackLevelInfo() { memset(this, 0, sizeof(*this)); }
1992};
1993
1994// State for ID Stack tool queries
1995struct ImGuiIDStackTool
1996{
1997 int LastActiveFrame;
1998 int StackLevel; // -1: query stack and resize Results, >= 0: individual stack level
1999 ImGuiID QueryId; // ID to query details for
2001 bool CopyToClipboardOnCtrlC;
2002 float CopyToClipboardLastTime;
2003
2004 ImGuiIDStackTool() { memset(this, 0, sizeof(*this)); CopyToClipboardLastTime = -FLT_MAX; }
2005};
2006
2007//-----------------------------------------------------------------------------
2008// [SECTION] Generic context hooks
2009//-----------------------------------------------------------------------------
2010
2011typedef void (*ImGuiContextHookCallback)(ImGuiContext* ctx, ImGuiContextHook* hook);
2012enum ImGuiContextHookType { ImGuiContextHookType_NewFramePre, ImGuiContextHookType_NewFramePost, ImGuiContextHookType_EndFramePre, ImGuiContextHookType_EndFramePost, ImGuiContextHookType_RenderPre, ImGuiContextHookType_RenderPost, ImGuiContextHookType_Shutdown, ImGuiContextHookType_PendingRemoval_ };
2013
2014struct ImGuiContextHook
2015{
2016 ImGuiID HookId; // A unique ID assigned by AddContextHook()
2017 ImGuiContextHookType Type;
2018 ImGuiID Owner;
2019 ImGuiContextHookCallback Callback;
2020 void* UserData;
2021
2022 ImGuiContextHook() { memset(this, 0, sizeof(*this)); }
2023};
2024
2025//-----------------------------------------------------------------------------
2026// [SECTION] ImGuiContext (main Dear ImGui context)
2027//-----------------------------------------------------------------------------
2028
2029struct ImGuiContext
2030{
2031 bool Initialized;
2032 bool FontAtlasOwnedByContext; // IO.Fonts-> is owned by the ImGuiContext and will be destructed along with it.
2033 ImGuiIO IO;
2034 ImGuiPlatformIO PlatformIO;
2035 ImGuiStyle Style;
2036 ImFont* Font; // (Shortcut) == FontStack.empty() ? IO.Font : FontStack.back()
2037 float FontSize; // (Shortcut) == FontBaseSize * g.CurrentWindow->FontWindowScale == window->FontSize(). Text height for current window.
2038 float FontBaseSize; // (Shortcut) == IO.FontGlobalScale * Font->Scale * Font->FontSize. Base text height.
2039 float FontScale; // == FontSize / Font->FontSize
2040 float CurrentDpiScale; // Current window/viewport DpiScale
2041 ImDrawListSharedData DrawListSharedData;
2042 double Time;
2043 int FrameCount;
2044 int FrameCountEnded;
2045 int FrameCountRendered;
2046 bool WithinFrameScope; // Set by NewFrame(), cleared by EndFrame()
2047 bool WithinFrameScopeWithImplicitWindow; // Set by NewFrame(), cleared by EndFrame() when the implicit debug window has been pushed
2048 bool WithinEndChild; // Set within EndChild()
2049 bool GcCompactAll; // Request full GC
2050 bool TestEngineHookItems; // Will call test engine hooks: ImGuiTestEngineHook_ItemAdd(), ImGuiTestEngineHook_ItemInfo(), ImGuiTestEngineHook_Log()
2051 void* TestEngine; // Test engine user data
2052 char ContextName[16]; // Storage for a context name (to facilitate debugging multi-context setups)
2053
2054 // Inputs
2055 ImVector<ImGuiInputEvent> InputEventsQueue; // Input events which will be trickled/written into IO structure.
2056 ImVector<ImGuiInputEvent> InputEventsTrail; // Past input events processed in NewFrame(). This is to allow domain-specific application to access e.g mouse/pen trail.
2057 ImGuiMouseSource InputEventsNextMouseSource;
2058 ImU32 InputEventsNextEventId;
2059
2060 // Windows state
2061 ImVector<ImGuiWindow*> Windows; // Windows, sorted in display order, back to front
2062 ImVector<ImGuiWindow*> WindowsFocusOrder; // Root windows, sorted in focus order, back to front.
2063 ImVector<ImGuiWindow*> WindowsTempSortBuffer; // Temporary buffer used in EndFrame() to reorder windows so parents are kept before their child
2064 ImVector<ImGuiWindowStackData> CurrentWindowStack;
2065 ImGuiStorage WindowsById; // Map window's ImGuiID to ImGuiWindow*
2066 int WindowsActiveCount; // Number of unique windows submitted by frame
2067 ImVec2 WindowsHoverPadding; // Padding around resizable windows for which hovering on counts as hovering the window == ImMax(style.TouchExtraPadding, WINDOWS_HOVER_PADDING).
2068 ImGuiID DebugBreakInWindow; // Set to break in Begin() call.
2069 ImGuiWindow* CurrentWindow; // Window being drawn into
2070 ImGuiWindow* HoveredWindow; // Window the mouse is hovering. Will typically catch mouse inputs.
2071 ImGuiWindow* HoveredWindowUnderMovingWindow; // Hovered window ignoring MovingWindow. Only set if MovingWindow is set.
2072 ImGuiWindow* HoveredWindowBeforeClear; // Window the mouse is hovering. Filled even with _NoMouse. This is currently useful for multi-context compositors.
2073 ImGuiWindow* MovingWindow; // Track the window we clicked on (in order to preserve focus). The actual window that is moved is generally MovingWindow->RootWindow.
2074 ImGuiWindow* 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.
2075 ImVec2 WheelingWindowRefMousePos;
2076 int WheelingWindowStartFrame; // This may be set one frame before WheelingWindow is != NULL
2077 int WheelingWindowScrolledFrame;
2078 float WheelingWindowReleaseTimer;
2079 ImVec2 WheelingWindowWheelRemainder;
2080 ImVec2 WheelingAxisAvg;
2081
2082 // Item/widgets state and tracking information
2083 ImGuiID DebugDrawIdConflicts; // Set when we detect multiple items with the same identifier
2084 ImGuiID DebugHookIdInfo; // Will call core hooks: DebugHookIdInfo() from GetID functions, used by ID Stack Tool [next HoveredId/ActiveId to not pull in an extra cache-line]
2085 ImGuiID HoveredId; // Hovered widget, filled during the frame
2086 ImGuiID HoveredIdPreviousFrame;
2087 int HoveredIdPreviousFrameItemCount; // Count numbers of items using the same ID as last frame's hovered id
2088 float HoveredIdTimer; // Measure contiguous hovering time
2089 float HoveredIdNotActiveTimer; // Measure contiguous hovering time where the item has not been active
2090 bool HoveredIdAllowOverlap;
2091 bool 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.
2092 bool ItemUnclipByLog; // Disable ItemAdd() clipping, essentially a memory-locality friendly copy of LogEnabled
2093 ImGuiID ActiveId; // Active widget
2094 ImGuiID ActiveIdIsAlive; // Active widget has been seen this frame (we can't use a bool as the ActiveId may change within the frame)
2095 float ActiveIdTimer;
2096 bool ActiveIdIsJustActivated; // Set at the time of activation for one frame
2097 bool ActiveIdAllowOverlap; // Active widget allows another widget to steal active id (generally for overlapping widgets, but not always)
2098 bool ActiveIdNoClearOnFocusLoss; // Disable losing active id if the active id window gets unfocused.
2099 bool 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.
2100 bool ActiveIdHasBeenEditedBefore; // Was the value associated to the widget Edited over the course of the Active state.
2101 bool ActiveIdHasBeenEditedThisFrame;
2102 bool ActiveIdFromShortcut;
2103 int ActiveIdMouseButton : 8;
2104 ImVec2 ActiveIdClickOffset; // Clicked offset from upper-left corner, if applicable (currently only set by ButtonBehavior)
2105 ImGuiWindow* ActiveIdWindow;
2106 ImGuiInputSource ActiveIdSource; // Activating source: ImGuiInputSource_Mouse OR ImGuiInputSource_Keyboard OR ImGuiInputSource_Gamepad
2107 ImGuiID ActiveIdPreviousFrame;
2108 bool ActiveIdPreviousFrameIsAlive;
2109 bool ActiveIdPreviousFrameHasBeenEditedBefore;
2110 ImGuiWindow* ActiveIdPreviousFrameWindow;
2111 ImGuiID LastActiveId; // Store the last non-zero ActiveId, useful for animation.
2112 float LastActiveIdTimer; // Store the last non-zero ActiveId timer since the beginning of activation, useful for animation.
2113
2114 // Key/Input Ownership + Shortcut Routing system
2115 // - The idea is that instead of "eating" a given key, we can link to an owner.
2116 // - Input query can then read input by specifying ImGuiKeyOwner_Any (== 0), ImGuiKeyOwner_NoOwner (== -1) or a custom ID.
2117 // - Routing is requested ahead of time for a given chord (Key + Mods) and granted in NewFrame().
2118 double LastKeyModsChangeTime; // Record the last time key mods changed (affect repeat delay when using shortcut logic)
2119 double LastKeyModsChangeFromNoneTime; // Record the last time key mods changed away from being 0 (affect repeat delay when using shortcut logic)
2120 double LastKeyboardKeyPressTime; // Record the last time a keyboard key (ignore mouse/gamepad ones) was pressed.
2121 ImBitArrayForNamedKeys KeysMayBeCharInput; // Lookup to tell if a key can emit char input, see IsKeyChordPotentiallyCharInput(). sizeof() = 20 bytes
2122 ImGuiKeyOwnerData KeysOwnerData[ImGuiKey_NamedKey_COUNT];
2123 ImGuiKeyRoutingTable KeysRoutingTable;
2124 ImU32 ActiveIdUsingNavDirMask; // Active widget will want to read those nav move requests (e.g. can activate a button and move away from it)
2125 bool 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)
2126 ImGuiKeyChord DebugBreakInShortcutRouting; // Set to break in SetShortcutRouting()/Shortcut() calls.
2127 //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);'
2128
2129 // Next window/item data
2130 ImGuiID CurrentFocusScopeId; // Value for currently appending items == g.FocusScopeStack.back(). Not to be mistaken with g.NavFocusScopeId.
2131 ImGuiItemFlags CurrentItemFlags; // Value for currently appending items == g.ItemFlagsStack.back()
2132 ImGuiID DebugLocateId; // Storage for DebugLocateItemOnHover() feature: this is read by ItemAdd() so we keep it in a hot/cached location
2133 ImGuiNextItemData NextItemData; // Storage for SetNextItem** functions
2134 ImGuiLastItemData LastItemData; // Storage for last submitted item (setup by ItemAdd)
2135 ImGuiNextWindowData NextWindowData; // Storage for SetNextWindow** functions
2136 bool DebugShowGroupRects;
2137
2138 // Shared stacks
2139 ImGuiCol DebugFlashStyleColorIdx; // (Keep close to ColorStack to share cache line)
2140 ImVector<ImGuiColorMod> ColorStack; // Stack for PushStyleColor()/PopStyleColor() - inherited by Begin()
2141 ImVector<ImGuiStyleMod> StyleVarStack; // Stack for PushStyleVar()/PopStyleVar() - inherited by Begin()
2142 ImVector<ImFont*> FontStack; // Stack for PushFont()/PopFont() - inherited by Begin()
2143 ImVector<ImGuiFocusScopeData> FocusScopeStack; // Stack for PushFocusScope()/PopFocusScope() - inherited by BeginChild(), pushed into by Begin()
2144 ImVector<ImGuiItemFlags> ItemFlagsStack; // Stack for PushItemFlag()/PopItemFlag() - inherited by Begin()
2145 ImVector<ImGuiGroupData> GroupStack; // Stack for BeginGroup()/EndGroup() - not inherited by Begin()
2146 ImVector<ImGuiPopupData> OpenPopupStack; // Which popups are open (persistent)
2147 ImVector<ImGuiPopupData> BeginPopupStack; // Which level of BeginPopup() we are in (reset every frame)
2148 ImVector<ImGuiTreeNodeStackData>TreeNodeStack; // Stack for TreeNode()
2149
2150 // Viewports
2151 ImVector<ImGuiViewportP*> Viewports; // Active viewports (Size==1 in 'master' branch). Each viewports hold their copy of ImDrawData.
2152
2153 // Keyboard/Gamepad Navigation
2154 bool NavCursorVisible; // Nav focus cursor/rectangle is visible? We hide it after a mouse click. We show it after a nav move.
2155 bool NavHighlightItemUnderNav; // Disable mouse hovering highlight. Highlight navigation focused item instead of mouse hovered item.
2156 //bool NavDisableHighlight; // Old name for !g.NavCursorVisible before 1.91.4 (2024/10/18). OPPOSITE VALUE (g.NavDisableHighlight == !g.NavCursorVisible)
2157 //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.
2158 bool NavMousePosDirty; // When set we will update mouse position if io.ConfigNavMoveSetMousePos is set (not enabled by default)
2159 bool NavIdIsAlive; // Nav widget has been seen this frame ~~ NavRectRel is valid
2160 ImGuiID NavId; // Focused item for navigation
2161 ImGuiWindow* NavWindow; // Focused window for navigation. Could be called 'FocusedWindow'
2162 ImGuiID NavFocusScopeId; // Focused focus scope (e.g. selection code often wants to "clear other items" when landing on an item of the same scope)
2163 ImGuiNavLayer NavLayer; // Focused layer (main scrolling layer, or menu/title bar layer)
2164 ImGuiID NavActivateId; // ~~ (g.ActiveId == 0) && (IsKeyPressed(ImGuiKey_Space) || IsKeyDown(ImGuiKey_Enter) || IsKeyPressed(ImGuiKey_NavGamepadActivate)) ? NavId : 0, also set when calling ActivateItem()
2165 ImGuiID NavActivateDownId; // ~~ IsKeyDown(ImGuiKey_Space) || IsKeyDown(ImGuiKey_Enter) || IsKeyDown(ImGuiKey_NavGamepadActivate) ? NavId : 0
2166 ImGuiID NavActivatePressedId; // ~~ IsKeyPressed(ImGuiKey_Space) || IsKeyPressed(ImGuiKey_Enter) || IsKeyPressed(ImGuiKey_NavGamepadActivate) ? NavId : 0 (no repeat)
2167 ImGuiActivateFlags NavActivateFlags;
2168 ImVector<ImGuiFocusScopeData> NavFocusRoute; // Reversed copy focus scope stack for NavId (should contains NavFocusScopeId). This essentially follow the window->ParentWindowForFocusRoute chain.
2169 ImGuiID NavHighlightActivatedId;
2170 float NavHighlightActivatedTimer;
2171 ImGuiID NavNextActivateId; // Set by ActivateItem(), queued until next frame.
2172 ImGuiActivateFlags NavNextActivateFlags;
2173 ImGuiInputSource NavInputSource; // Keyboard or Gamepad mode? THIS CAN ONLY BE ImGuiInputSource_Keyboard or ImGuiInputSource_Mouse
2174 ImGuiSelectionUserData NavLastValidSelectionUserData; // Last valid data passed to SetNextItemSelectionUser(), or -1. For current window. Not reset when focusing an item that doesn't have selection data.
2175 ImS8 NavCursorHideFrames;
2176
2177 // Navigation: Init & Move Requests
2178 bool NavAnyRequest; // ~~ NavMoveRequest || NavInitRequest this is to perform early out in ItemAdd()
2179 bool NavInitRequest; // Init request for appearing window to select first item
2180 bool NavInitRequestFromMove;
2181 ImGuiNavItemData NavInitResult; // Init request result (first item of the window, or one for which SetItemDefaultFocus() was called)
2182 bool NavMoveSubmitted; // Move request submitted, will process result on next NewFrame()
2183 bool NavMoveScoringItems; // Move request submitted, still scoring incoming items
2184 bool NavMoveForwardToNextFrame;
2185 ImGuiNavMoveFlags NavMoveFlags;
2186 ImGuiScrollFlags NavMoveScrollFlags;
2187 ImGuiKeyChord NavMoveKeyMods;
2188 ImGuiDir NavMoveDir; // Direction of the move request (left/right/up/down)
2189 ImGuiDir NavMoveDirForDebug;
2190 ImGuiDir NavMoveClipDir; // FIXME-NAV: Describe the purpose of this better. Might want to rename?
2191 ImRect NavScoringRect; // Rectangle used for scoring, in screen space. Based of window->NavRectRel[], modified for directional navigation scoring.
2192 ImRect NavScoringNoClipRect; // Some nav operations (such as PageUp/PageDown) enforce a region which clipper will attempt to always keep submitted
2193 int NavScoringDebugCount; // Metrics for debugging
2194 int NavTabbingDir; // Generally -1 or +1, 0 when tabbing without a nav id
2195 int NavTabbingCounter; // >0 when counting items for tabbing
2196 ImGuiNavItemData NavMoveResultLocal; // Best move request candidate within NavWindow
2197 ImGuiNavItemData NavMoveResultLocalVisible; // Best move request candidate within NavWindow that are mostly visible (when using ImGuiNavMoveFlags_AlsoScoreVisibleSet flag)
2198 ImGuiNavItemData NavMoveResultOther; // Best move request candidate within NavWindow's flattened hierarchy (when using ImGuiWindowFlags_NavFlattened flag)
2199 ImGuiNavItemData NavTabbingResultFirst; // First tabbing request candidate within NavWindow and flattened hierarchy
2200
2201 // Navigation: record of last move request
2202 ImGuiID NavJustMovedFromFocusScopeId; // Just navigated from this focus scope id (result of a successfully MoveRequest).
2203 ImGuiID NavJustMovedToId; // Just navigated to this id (result of a successfully MoveRequest).
2204 ImGuiID NavJustMovedToFocusScopeId; // Just navigated to this focus scope id (result of a successfully MoveRequest).
2205 ImGuiKeyChord NavJustMovedToKeyMods;
2206 bool NavJustMovedToIsTabbing; // Copy of ImGuiNavMoveFlags_IsTabbing. Maybe we should store whole flags.
2207 bool NavJustMovedToHasSelectionData; // Copy of move result's ItemFlags & ImGuiItemFlags_HasSelectionUserData). Maybe we should just store ImGuiNavItemData.
2208
2209 // Navigation: Windowing (CTRL+TAB for list, or Menu button + keys or directional pads to move/resize)
2210 ImGuiKeyChord ConfigNavWindowingKeyNext; // = ImGuiMod_Ctrl | ImGuiKey_Tab (or ImGuiMod_Super | ImGuiKey_Tab on OS X). For reconfiguration (see #4828)
2211 ImGuiKeyChord ConfigNavWindowingKeyPrev; // = ImGuiMod_Ctrl | ImGuiMod_Shift | ImGuiKey_Tab (or ImGuiMod_Super | ImGuiMod_Shift | ImGuiKey_Tab on OS X)
2212 ImGuiWindow* NavWindowingTarget; // Target window when doing CTRL+Tab (or Pad Menu + FocusPrev/Next), this window is temporarily displayed top-most!
2213 ImGuiWindow* NavWindowingTargetAnim; // Record of last valid NavWindowingTarget until DimBgRatio and NavWindowingHighlightAlpha becomes 0.0f, so the fade-out can stay on it.
2214 ImGuiWindow* NavWindowingListWindow; // Internal window actually listing the CTRL+Tab contents
2215 float NavWindowingTimer;
2216 float NavWindowingHighlightAlpha;
2217 bool NavWindowingToggleLayer;
2218 ImGuiKey NavWindowingToggleKey;
2219 ImVec2 NavWindowingAccumDeltaPos;
2220 ImVec2 NavWindowingAccumDeltaSize;
2221
2222 // Render
2223 float DimBgRatio; // 0.0..1.0 animation when fading in a dimming background (for modal window and CTRL+TAB list)
2224
2225 // Drag and Drop
2226 bool DragDropActive;
2227 bool DragDropWithinSource; // Set when within a BeginDragDropXXX/EndDragDropXXX block for a drag source.
2228 bool DragDropWithinTarget; // Set when within a BeginDragDropXXX/EndDragDropXXX block for a drag target.
2229 ImGuiDragDropFlags DragDropSourceFlags;
2230 int DragDropSourceFrameCount;
2231 int DragDropMouseButton;
2232 ImGuiPayload DragDropPayload;
2233 ImRect DragDropTargetRect; // Store rectangle of current target candidate (we favor small targets when overlapping)
2234 ImRect DragDropTargetClipRect; // Store ClipRect at the time of item's drawing
2235 ImGuiID DragDropTargetId;
2236 ImGuiDragDropFlags DragDropAcceptFlags;
2237 float DragDropAcceptIdCurrRectSurface; // Target item surface (we resolve overlapping targets by prioritizing the smaller surface)
2238 ImGuiID DragDropAcceptIdCurr; // Target item id (set at the time of accepting the payload)
2239 ImGuiID DragDropAcceptIdPrev; // Target item id from previous frame (we need to store this to allow for overlapping drag and drop targets)
2240 int DragDropAcceptFrameCount; // Last time a target expressed a desire to accept the source
2241 ImGuiID DragDropHoldJustPressedId; // Set when holding a payload just made ButtonBehavior() return a press.
2242 ImVector<unsigned char> DragDropPayloadBufHeap; // We don't expose the ImVector<> directly, ImGuiPayload only holds pointer+size
2243 unsigned char DragDropPayloadBufLocal[16]; // Local buffer for small payloads
2244
2245 // Clipper
2246 int ClipperTempDataStacked;
2247 ImVector<ImGuiListClipperData> ClipperTempData;
2248
2249 // Tables
2250 ImGuiTable* CurrentTable;
2251 ImGuiID DebugBreakInTable; // Set to break in BeginTable() call.
2252 int TablesTempDataStacked; // Temporary table data size (because we leave previous instances undestructed, we generally don't use TablesTempData.Size)
2253 ImVector<ImGuiTableTempData> TablesTempData; // Temporary table data (buffers reused/shared across instances, support nesting)
2254 ImPool<ImGuiTable> Tables; // Persistent table data
2255 ImVector<float> TablesLastTimeActive; // Last used timestamp of each tables (SOA, for efficient GC)
2256 ImVector<ImDrawChannel> DrawChannelsTempMergeBuffer;
2257
2258 // Tab bars
2259 ImGuiTabBar* CurrentTabBar;
2260 ImPool<ImGuiTabBar> TabBars;
2261 ImVector<ImGuiPtrOrIndex> CurrentTabBarStack;
2262 ImVector<ImGuiShrinkWidthItem> ShrinkWidthBuffer;
2263
2264 // Multi-Select state
2265 ImGuiBoxSelectState BoxSelectState;
2266 ImGuiMultiSelectTempData* CurrentMultiSelect;
2267 int MultiSelectTempDataStacked; // Temporary multi-select data size (because we leave previous instances undestructed, we generally don't use MultiSelectTempData.Size)
2268 ImVector<ImGuiMultiSelectTempData> MultiSelectTempData;
2269 ImPool<ImGuiMultiSelectState> MultiSelectStorage;
2270
2271 // Hover Delay system
2272 ImGuiID HoverItemDelayId;
2273 ImGuiID HoverItemDelayIdPreviousFrame;
2274 float HoverItemDelayTimer; // Currently used by IsItemHovered()
2275 float HoverItemDelayClearTimer; // Currently used by IsItemHovered(): grace time before g.TooltipHoverTimer gets cleared.
2276 ImGuiID HoverItemUnlockedStationaryId; // Mouse has once been stationary on this item. Only reset after departing the item.
2277 ImGuiID HoverWindowUnlockedStationaryId; // Mouse has once been stationary on this window. Only reset after departing the window.
2278
2279 // Mouse state
2280 ImGuiMouseCursor MouseCursor;
2281 float MouseStationaryTimer; // Time the mouse has been stationary (with some loose heuristic)
2282 ImVec2 MouseLastValidPos;
2283
2284 // Widget state
2285 ImGuiInputTextState InputTextState;
2286 ImGuiInputTextDeactivatedState InputTextDeactivatedState;
2287 ImFont InputTextPasswordFont;
2288 ImGuiID TempInputId; // Temporary text input when CTRL+clicking on a slider, etc.
2289 ImGuiDataTypeStorage DataTypeZeroValue; // 0 for all data types
2290 int BeginMenuDepth;
2291 int BeginComboDepth;
2292 ImGuiColorEditFlags ColorEditOptions; // Store user options for color edit widgets
2293 ImGuiID ColorEditCurrentID; // Set temporarily while inside of the parent-most ColorEdit4/ColorPicker4 (because they call each others).
2294 ImGuiID ColorEditSavedID; // ID we are saving/restoring HS for
2295 float ColorEditSavedHue; // Backup of last Hue associated to LastColor, so we can restore Hue in lossy RGB<>HSV round trips
2296 float ColorEditSavedSat; // Backup of last Saturation associated to LastColor, so we can restore Saturation in lossy RGB<>HSV round trips
2297 ImU32 ColorEditSavedColor; // RGB value with alpha set to 0.
2298 ImVec4 ColorPickerRef; // Initial/reference color at the time of opening the color picker.
2299 ImGuiComboPreviewData ComboPreviewData;
2300 ImRect WindowResizeBorderExpectedRect; // Expected border rect, switch to relative edit if moving
2301 bool WindowResizeRelativeMode;
2302 short ScrollbarSeekMode; // 0: scroll to clicked location, -1/+1: prev/next page.
2303 float ScrollbarClickDeltaToGrabCenter; // When scrolling to mouse location: distance between mouse and center of grab box, normalized in parent space.
2304 float SliderGrabClickOffset;
2305 float SliderCurrentAccum; // Accumulated slider delta when using navigation controls.
2306 bool SliderCurrentAccumDirty; // Has the accumulated slider delta changed since last time we tried to apply it?
2307 bool DragCurrentAccumDirty;
2308 float DragCurrentAccum; // Accumulator for dragging modification. Always high-precision, not rounded by end-user precision settings
2309 float DragSpeedDefaultRatio; // If speed == 0.0f, uses (max-min) * DragSpeedDefaultRatio
2310 float DisabledAlphaBackup; // Backup for style.Alpha for BeginDisabled()
2311 short DisabledStackSize;
2312 short TooltipOverrideCount;
2313 ImGuiWindow* TooltipPreviousWindow; // Window of last tooltip submitted during the frame
2314 ImVector<char> ClipboardHandlerData; // If no custom clipboard handler is defined
2315 ImVector<ImGuiID> MenusIdSubmittedThisFrame; // A list of menu IDs that were rendered at least once
2316 ImGuiTypingSelectState TypingSelectState; // State for GetTypingSelectRequest()
2317
2318 // Platform support
2319 ImGuiPlatformImeData PlatformImeData; // Data updated by current frame
2320 ImGuiPlatformImeData PlatformImeDataPrev; // Previous frame data. When changed we call the platform_io.Platform_SetImeDataFn() handler.
2321
2322 // Settings
2323 bool SettingsLoaded;
2324 float SettingsDirtyTimer; // Save .ini Settings to memory when time reaches zero
2325 ImGuiTextBuffer SettingsIniData; // In memory .ini settings
2326 ImVector<ImGuiSettingsHandler> SettingsHandlers; // List of .ini settings handlers
2327 ImChunkStream<ImGuiWindowSettings> SettingsWindows; // ImGuiWindow .ini settings entries
2328 ImChunkStream<ImGuiTableSettings> SettingsTables; // ImGuiTable .ini settings entries
2329 ImVector<ImGuiContextHook> Hooks; // Hooks for extensions (e.g. test engine)
2330 ImGuiID HookIdNext; // Next available HookId
2331
2332 // Localization
2333 const char* LocalizationTable[ImGuiLocKey_COUNT];
2334
2335 // Capture/Logging
2336 bool LogEnabled; // Currently capturing
2337 ImGuiLogFlags LogFlags; // Capture flags/type
2338 ImGuiWindow* LogWindow;
2339 ImFileHandle LogFile; // If != NULL log to stdout/ file
2340 ImGuiTextBuffer LogBuffer; // Accumulation buffer when log to clipboard. This is pointer so our GImGui static constructor doesn't call heap allocators.
2341 const char* LogNextPrefix;
2342 const char* LogNextSuffix;
2343 float LogLinePosY;
2344 bool LogLineFirstItem;
2345 int LogDepthRef;
2346 int LogDepthToExpand;
2347 int LogDepthToExpandDefault; // Default/stored value for LogDepthMaxExpand if not specified in the LogXXX function call.
2348
2349 // Error Handling
2350 ImGuiErrorCallback ErrorCallback; // = NULL. May be exposed in public API eventually.
2351 void* ErrorCallbackUserData; // = NULL
2352 ImVec2 ErrorTooltipLockedPos;
2353 bool ErrorFirst;
2354 int ErrorCountCurrentFrame; // [Internal] Number of errors submitted this frame.
2355 ImGuiErrorRecoveryState StackSizesInNewFrame; // [Internal]
2356 ImGuiErrorRecoveryState*StackSizesInBeginForCurrentWindow; // [Internal]
2357
2358 // Debug Tools
2359 // (some of the highly frequently used data are interleaved in other structures above: DebugBreakXXX fields, DebugHookIdInfo, DebugLocateId etc.)
2360 int DebugDrawIdConflictsCount; // Locked count (preserved when holding CTRL)
2361 ImGuiDebugLogFlags DebugLogFlags;
2362 ImGuiTextBuffer DebugLogBuf;
2363 ImGuiTextIndex DebugLogIndex;
2364 int DebugLogSkippedErrors;
2365 ImGuiDebugLogFlags DebugLogAutoDisableFlags;
2366 ImU8 DebugLogAutoDisableFrames;
2367 ImU8 DebugLocateFrames; // For DebugLocateItemOnHover(). This is used together with DebugLocateId which is in a hot/cached spot above.
2368 bool DebugBreakInLocateId; // Debug break in ItemAdd() call for g.DebugLocateId.
2369 ImGuiKeyChord DebugBreakKeyChord; // = ImGuiKey_Pause
2370 ImS8 DebugBeginReturnValueCullDepth; // Cycle between 0..9 then wrap around.
2371 bool DebugItemPickerActive; // Item picker is active (started with DebugStartItemPicker())
2372 ImU8 DebugItemPickerMouseButton;
2373 ImGuiID DebugItemPickerBreakId; // Will call IM_DEBUG_BREAK() when encountering this ID
2374 float DebugFlashStyleColorTime;
2375 ImVec4 DebugFlashStyleColorBackup;
2376 ImGuiMetricsConfig DebugMetricsConfig;
2377 ImGuiIDStackTool DebugIDStackTool;
2378 ImGuiDebugAllocInfo DebugAllocInfo;
2379
2380 // Misc
2381 float FramerateSecPerFrame[60]; // Calculate estimate of framerate for user over the last 60 frames..
2382 int FramerateSecPerFrameIdx;
2383 int FramerateSecPerFrameCount;
2384 float FramerateSecPerFrameAccum;
2385 int WantCaptureMouseNextFrame; // Explicit capture override via SetNextFrameWantCaptureMouse()/SetNextFrameWantCaptureKeyboard(). Default to -1.
2386 int WantCaptureKeyboardNextFrame; // "
2387 int WantTextInputNextFrame;
2388 ImVector<char> TempBuffer; // Temporary text buffer
2389 char TempKeychordName[64];
2390
2391 ImGuiContext(ImFontAtlas* shared_font_atlas);
2392};
2393
2394//-----------------------------------------------------------------------------
2395// [SECTION] ImGuiWindowTempData, ImGuiWindow
2396//-----------------------------------------------------------------------------
2397
2398// Transient per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the DC variable name in ImGuiWindow.
2399// (That's theory, in practice the delimitation between ImGuiWindow and ImGuiWindowTempData is quite tenuous and could be reconsidered..)
2400// (This doesn't need a constructor because we zero-clear it as part of ImGuiWindow and all frame-temporary data are setup on Begin)
2401struct IMGUI_API ImGuiWindowTempData
2402{
2403 // Layout
2404 ImVec2 CursorPos; // Current emitting position, in absolute coordinates.
2405 ImVec2 CursorPosPrevLine;
2406 ImVec2 CursorStartPos; // Initial position after Begin(), generally ~ window position + WindowPadding.
2407 ImVec2 CursorMaxPos; // Used to implicitly calculate ContentSize at the beginning of next frame, for scrolling range and auto-resize. Always growing during the frame.
2408 ImVec2 IdealMaxPos; // Used to implicitly calculate ContentSizeIdeal at the beginning of next frame, for auto-resize only. Always growing during the frame.
2409 ImVec2 CurrLineSize;
2410 ImVec2 PrevLineSize;
2411 float CurrLineTextBaseOffset; // Baseline offset (0.0f by default on a new line, generally == style.FramePadding.y when a framed item has been added).
2412 float PrevLineTextBaseOffset;
2413 bool IsSameLine;
2414 bool IsSetPos;
2415 ImVec1 Indent; // Indentation / start position from left of window (increased by TreePush/TreePop, etc.)
2416 ImVec1 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.
2417 ImVec1 GroupOffset;
2418 ImVec2 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.
2419
2420 // Keyboard/Gamepad navigation
2421 ImGuiNavLayer NavLayerCurrent; // Current layer, 0..31 (we currently only use 0..1)
2422 short NavLayersActiveMask; // Which layers have been written to (result from previous frame)
2423 short NavLayersActiveMaskNext;// Which layers have been written to (accumulator for current frame)
2424 bool NavIsScrollPushableX; // Set when current work location may be scrolled horizontally when moving left / right. This is generally always true UNLESS within a column.
2425 bool NavHideHighlightOneFrame;
2426 bool NavWindowHasScrollY; // Set per window when scrolling can be used (== ScrollMax.y > 0.0f)
2427
2428 // Miscellaneous
2429 bool MenuBarAppending; // FIXME: Remove this
2430 ImVec2 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.
2431 ImGuiMenuColumns MenuColumns; // Simplified columns storage for menu items measurement
2432 int TreeDepth; // Current tree depth.
2433 ImU32 TreeHasStackDataDepthMask; // Store whether given depth has ImGuiTreeNodeStackData data. Could be turned into a ImU64 if necessary.
2434 ImVector<ImGuiWindow*> ChildWindows;
2435 ImGuiStorage* StateStorage; // Current persistent per-window storage (store e.g. tree node open/close state)
2436 ImGuiOldColumns* CurrentColumns; // Current columns set
2437 int CurrentTableIdx; // Current table index (into g.Tables)
2438 ImGuiLayoutType LayoutType;
2439 ImGuiLayoutType ParentLayoutType; // Layout type of parent window at the time of Begin()
2440 ImU32 ModalDimBgColor;
2441
2442 // Local parameters stacks
2443 // 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.
2444 float ItemWidth; // Current item width (>0.0: width in pixels, <0.0: align xx pixels to the right of window).
2445 float TextWrapPos; // Current text wrap pos.
2446 ImVector<float> ItemWidthStack; // Store item widths to restore (attention: .back() is not == ItemWidth)
2447 ImVector<float> TextWrapPosStack; // Store text wrap pos to restore (attention: .back() is not == TextWrapPos)
2448};
2449
2450// Storage for one window
2451struct IMGUI_API ImGuiWindow
2452{
2453 ImGuiContext* Ctx; // Parent UI context (needs to be set explicitly by parent).
2454 char* Name; // Window name, owned by the window.
2455 ImGuiID ID; // == ImHashStr(Name)
2456 ImGuiWindowFlags Flags; // See enum ImGuiWindowFlags_
2457 ImGuiChildFlags ChildFlags; // Set when window is a child window. See enum ImGuiChildFlags_
2458 ImGuiViewportP* Viewport; // Always set in Begin(). Inactive windows may have a NULL value here if their viewport was discarded.
2459 ImVec2 Pos; // Position (always rounded-up to nearest pixel)
2460 ImVec2 Size; // Current size (==SizeFull or collapsed title bar size)
2461 ImVec2 SizeFull; // Size when non collapsed
2462 ImVec2 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.
2463 ImVec2 ContentSizeIdeal;
2464 ImVec2 ContentSizeExplicit; // Size of contents/scrollable client area explicitly request by the user via SetNextWindowContentSize().
2465 ImVec2 WindowPadding; // Window padding at the time of Begin().
2466 float WindowRounding; // Window rounding at the time of Begin(). May be clamped lower to avoid rendering artifacts with title bar, menu bar etc.
2467 float WindowBorderSize; // Window border size at the time of Begin().
2468 float 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.
2469 float DecoOuterSizeX1, DecoOuterSizeY1; // Left/Up offsets. Sum of non-scrolling outer decorations (X1 generally == 0.0f. Y1 generally = TitleBarHeight + MenuBarHeight). Locked during Begin().
2470 float DecoOuterSizeX2, DecoOuterSizeY2; // Right/Down offsets (X2 generally == ScrollbarSize.x, Y2 == ScrollbarSizes.y).
2471 float 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).
2472 int NameBufLen; // Size of buffer storing Name. May be larger than strlen(Name)!
2473 ImGuiID MoveId; // == window->GetID("#MOVE")
2474 ImGuiID ChildId; // ID of corresponding item in parent window (for navigation to return from child window to parent window)
2475 ImGuiID PopupId; // ID in the popup stack when this window is used as a popup/menu (because we use generic Name/ID for recycling)
2476 ImVec2 Scroll;
2477 ImVec2 ScrollMax;
2478 ImVec2 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)
2479 ImVec2 ScrollTargetCenterRatio; // 0.0f = scroll so that target position is at top, 0.5f = scroll so that target position is centered
2480 ImVec2 ScrollTargetEdgeSnapDist; // 0.0f = no snapping, >0.0f snapping threshold
2481 ImVec2 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.
2482 bool ScrollbarX, ScrollbarY; // Are scrollbars visible?
2483 bool Active; // Set to true on Begin(), unless Collapsed
2484 bool WasActive;
2485 bool WriteAccessed; // Set to true when any widget access the current window
2486 bool Collapsed; // Set when collapsing window to become only title-bar
2487 bool WantCollapseToggle;
2488 bool SkipItems; // Set when items can safely be all clipped (e.g. window not visible or collapsed)
2489 bool SkipRefresh; // [EXPERIMENTAL] Reuse previous frame drawn contents, Begin() returns false.
2490 bool Appearing; // Set during the frame where the window is appearing (or re-appearing)
2491 bool Hidden; // Do not display (== HiddenFrames*** > 0)
2492 bool IsFallbackWindow; // Set on the "Debug##Default" window.
2493 bool IsExplicitChild; // Set when passed _ChildWindow, left to false by BeginDocked()
2494 bool HasCloseButton; // Set when the window has a close button (p_open != NULL)
2495 signed char ResizeBorderHovered; // Current border being hovered for resize (-1: none, otherwise 0-3)
2496 signed char ResizeBorderHeld; // Current border being held for resize (-1: none, otherwise 0-3)
2497 short BeginCount; // Number of Begin() during the current frame (generally 0 or 1, 1+ if appending via multiple Begin/End pairs)
2498 short BeginCountPreviousFrame; // Number of Begin() during the previous frame
2499 short BeginOrderWithinParent; // Begin() order within immediate parent window, if we are a child window. Otherwise 0.
2500 short BeginOrderWithinContext; // Begin() order within entire imgui context. This is mostly used for debugging submission order related issues.
2501 short FocusOrder; // Order within WindowsFocusOrder[], altered when windows are focused.
2502 ImS8 AutoFitFramesX, AutoFitFramesY;
2503 bool AutoFitOnlyGrows;
2504 ImGuiDir AutoPosLastDirection;
2505 ImS8 HiddenFramesCanSkipItems; // Hide the window for N frames
2506 ImS8 HiddenFramesCannotSkipItems; // Hide the window for N frames while allowing items to be submitted so we can measure their size
2507 ImS8 HiddenFramesForRenderOnly; // Hide the window until frame N at Render() time only
2508 ImS8 DisableInputsFrames; // Disable window interactions for N frames
2509 ImGuiCond SetWindowPosAllowFlags : 8; // store acceptable condition flags for SetNextWindowPos() use.
2510 ImGuiCond SetWindowSizeAllowFlags : 8; // store acceptable condition flags for SetNextWindowSize() use.
2511 ImGuiCond SetWindowCollapsedAllowFlags : 8; // store acceptable condition flags for SetNextWindowCollapsed() use.
2512 ImVec2 SetWindowPosVal; // store window position when using a non-zero Pivot (position set needs to be processed when we know the window size)
2513 ImVec2 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.
2514
2515 ImVector<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)
2516 ImGuiWindowTempData DC; // Temporary per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the "DC" variable name.
2517
2518 // The best way to understand what those rectangles are is to use the 'Metrics->Tools->Show Windows Rectangles' viewer.
2519 // The main 'OuterRect', omitted as a field, is window->Rect().
2520 ImRect OuterRectClipped; // == Window->Rect() just after setup in Begin(). == window->Rect() for root window.
2521 ImRect InnerRect; // Inner rectangle (omit title bar, menu bar, scroll bar)
2522 ImRect InnerClipRect; // == InnerRect shrunk by WindowPadding*0.5f on each side, clipped within viewport or parent clip rect.
2523 ImRect 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).
2524 ImRect 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?
2525 ImRect ClipRect; // Current clipping/scissoring rectangle, evolve as we are using PushClipRect(), etc. == DrawList->clip_rect_stack.back().
2526 ImRect 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.
2527 ImVec2ih HitTestHoleSize; // Define an optional rectangular hole where mouse will pass-through the window.
2528 ImVec2ih HitTestHoleOffset;
2529
2530 int LastFrameActive; // Last frame number the window was Active.
2531 float LastTimeActive; // Last timestamp the window was Active (using float as we don't need high precision there)
2532 float ItemWidthDefault;
2533 ImGuiStorage StateStorage;
2534 ImVector<ImGuiOldColumns> ColumnsStorage;
2535 float FontWindowScale; // User scale multiplier per-window, via SetWindowFontScale()
2536 int SettingsOffset; // Offset into SettingsWindows[] (offsets are always valid as we only grow the array from the back)
2537
2538 ImDrawList* DrawList; // == &DrawListInst (for backward compatibility reason with code using imgui_internal.h we keep this a pointer)
2539 ImDrawList DrawListInst;
2540 ImGuiWindow* ParentWindow; // If we are a child _or_ popup _or_ docked window, this is pointing to our parent. Otherwise NULL.
2541 ImGuiWindow* ParentWindowInBeginStack;
2542 ImGuiWindow* RootWindow; // Point to ourself or first ancestor that is not a child window. Doesn't cross through popups/dock nodes.
2543 ImGuiWindow* RootWindowPopupTree; // Point to ourself or first ancestor that is not a child window. Cross through popups parent<>child.
2544 ImGuiWindow* RootWindowForTitleBarHighlight; // Point to ourself or first ancestor which will display TitleBgActive color when this window is active.
2545 ImGuiWindow* RootWindowForNav; // Point to ourself or first ancestor which doesn't have the NavFlattened flag.
2546 ImGuiWindow* ParentWindowForFocusRoute; // Set to manual link a window to its logical parent so that Shortcut() chain are honoerd (e.g. Tool linked to Document)
2547
2548 ImGuiWindow* 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.)
2549 ImGuiID NavLastIds[ImGuiNavLayer_COUNT]; // Last known NavId for this window, per layer (0/1)
2550 ImRect NavRectRel[ImGuiNavLayer_COUNT]; // Reference rectangle, in window relative space
2551 ImVec2 NavPreferredScoringPosRel[ImGuiNavLayer_COUNT]; // Preferred X/Y position updated when moving on a given axis, reset to FLT_MAX.
2552 ImGuiID NavRootFocusScopeId; // Focus Scope ID at the time of Begin()
2553
2554 int MemoryDrawListIdxCapacity; // Backup of last idx/vtx count, so when waking up the window we can preallocate and avoid iterative alloc/copy
2555 int MemoryDrawListVtxCapacity;
2556 bool MemoryCompacted; // Set when window extraneous data have been garbage collected
2557
2558public:
2559 ImGuiWindow(ImGuiContext* context, const char* name);
2560 ~ImGuiWindow();
2561
2562 ImGuiID GetID(const char* str, const char* str_end = NULL);
2563 ImGuiID GetID(const void* ptr);
2564 ImGuiID GetID(int n);
2565 ImGuiID GetIDFromPos(const ImVec2& p_abs);
2566 ImGuiID GetIDFromRectangle(const ImRect& r_abs);
2567
2568 // We don't use g.FontSize because the window may be != g.CurrentWindow.
2569 ImRect Rect() const { return ImRect(Pos.x, Pos.y, Pos.x + Size.x, Pos.y + Size.y); }
2570 float CalcFontSize() const { ImGuiContext& g = *Ctx; float scale = g.FontBaseSize * FontWindowScale; if (ParentWindow) scale *= ParentWindow->FontWindowScale; return scale; }
2571 ImRect TitleBarRect() const { return ImRect(Pos, ImVec2(Pos.x + SizeFull.x, Pos.y + TitleBarHeight)); }
2572 ImRect MenuBarRect() const { float y1 = Pos.y + TitleBarHeight; return ImRect(Pos.x, y1, Pos.x + SizeFull.x, y1 + MenuBarHeight); }
2573};
2574
2575//-----------------------------------------------------------------------------
2576// [SECTION] Tab bar, Tab item support
2577//-----------------------------------------------------------------------------
2578
2579// Extend ImGuiTabBarFlags_
2580enum ImGuiTabBarFlagsPrivate_
2581{
2582 ImGuiTabBarFlags_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]
2583 ImGuiTabBarFlags_IsFocused = 1 << 21,
2584 ImGuiTabBarFlags_SaveSettings = 1 << 22, // FIXME: Settings are handled by the docking system, this only request the tab bar to mark settings dirty when reordering tabs
2585};
2586
2587// Extend ImGuiTabItemFlags_
2588enum ImGuiTabItemFlagsPrivate_
2589{
2590 ImGuiTabItemFlags_SectionMask_ = ImGuiTabItemFlags_Leading | ImGuiTabItemFlags_Trailing,
2591 ImGuiTabItemFlags_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)
2592 ImGuiTabItemFlags_Button = 1 << 21, // Used by TabItemButton, change the tab item behavior to mimic a button
2593};
2594
2595// Storage for one active tab item (sizeof() 40 bytes)
2596struct ImGuiTabItem
2597{
2598 ImGuiID ID;
2599 ImGuiTabItemFlags Flags;
2600 int LastFrameVisible;
2601 int LastFrameSelected; // This allows us to infer an ordered list of the last activated tabs with little maintenance
2602 float Offset; // Position relative to beginning of tab
2603 float Width; // Width currently displayed
2604 float ContentWidth; // Width of label, stored during BeginTabItem() call
2605 float RequestedWidth; // Width optionally requested by caller, -1.0f is unused
2606 ImS32 NameOffset; // When Window==NULL, offset to name within parent ImGuiTabBar::TabsNames
2607 ImS16 BeginOrder; // BeginTabItem() order, used to re-order tabs after toggling ImGuiTabBarFlags_Reorderable
2608 ImS16 IndexDuringLayout; // Index only used during TabBarLayout(). Tabs gets reordered so 'Tabs[n].IndexDuringLayout == n' but may mismatch during additions.
2609 bool WantClose; // Marked as closed by SetTabItemClosed()
2610
2611 ImGuiTabItem() { memset(this, 0, sizeof(*this)); LastFrameVisible = LastFrameSelected = -1; RequestedWidth = -1.0f; NameOffset = -1; BeginOrder = IndexDuringLayout = -1; }
2612};
2613
2614// Storage for a tab bar (sizeof() 160 bytes)
2615struct IMGUI_API ImGuiTabBar
2616{
2617 ImGuiWindow* Window;
2619 ImGuiTabBarFlags Flags;
2620 ImGuiID ID; // Zero for tab-bars used by docking
2621 ImGuiID SelectedTabId; // Selected tab/window
2622 ImGuiID NextSelectedTabId; // Next selected tab/window. Will also trigger a scrolling animation
2623 ImGuiID VisibleTabId; // Can occasionally be != SelectedTabId (e.g. when previewing contents for CTRL+TAB preview)
2624 int CurrFrameVisible;
2625 int PrevFrameVisible;
2626 ImRect BarRect;
2627 float CurrTabsContentsHeight;
2628 float PrevTabsContentsHeight; // Record the height of contents submitted below the tab bar
2629 float WidthAllTabs; // Actual width of all tabs (locked during layout)
2630 float WidthAllTabsIdeal; // Ideal width if all tabs were visible and not clipped
2631 float ScrollingAnim;
2632 float ScrollingTarget;
2633 float ScrollingTargetDistToVisibility;
2634 float ScrollingSpeed;
2635 float ScrollingRectMinX;
2636 float ScrollingRectMaxX;
2637 float SeparatorMinX;
2638 float SeparatorMaxX;
2639 ImGuiID ReorderRequestTabId;
2640 ImS16 ReorderRequestOffset;
2641 ImS8 BeginCount;
2642 bool WantLayout;
2643 bool VisibleTabWasSubmitted;
2644 bool TabsAddedNew; // Set to true when a new tab item or button has been added to the tab bar during last frame
2645 ImS16 TabsActiveCount; // Number of tabs submitted this frame.
2646 ImS16 LastTabItemIdx; // Index of last BeginTabItem() tab for use by EndTabItem()
2647 float ItemSpacingY;
2648 ImVec2 FramePadding; // style.FramePadding locked at the time of BeginTabBar()
2649 ImVec2 BackupCursorPos;
2650 ImGuiTextBuffer TabsNames; // For non-docking tab bar we re-append names in a contiguous buffer.
2651
2652 ImGuiTabBar();
2653};
2654
2655//-----------------------------------------------------------------------------
2656// [SECTION] Table support
2657//-----------------------------------------------------------------------------
2658
2659#define IM_COL32_DISABLE IM_COL32(0,0,0,1) // Special sentinel code which cannot be used as a regular color.
2660#define IMGUI_TABLE_MAX_COLUMNS 512 // May be further lifted
2661
2662// Our current column maximum is 64 but we may raise that in the future.
2663typedef ImS16 ImGuiTableColumnIdx;
2664typedef ImU16 ImGuiTableDrawChannelIdx;
2665
2666// [Internal] sizeof() ~ 112
2667// We use the terminology "Enabled" to refer to a column that is not Hidden by user/api.
2668// We use the terminology "Clipped" to refer to a column that is out of sight because of scrolling/clipping.
2669// This is in contrast with some user-facing api such as IsItemVisible() / IsRectVisible() which use "Visible" to mean "not clipped".
2670struct ImGuiTableColumn
2671{
2672 ImGuiTableColumnFlags Flags; // Flags after some patching (not directly same as provided by user). See ImGuiTableColumnFlags_
2673 float 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.
2674 float MinX; // Absolute positions
2675 float MaxX;
2676 float WidthRequest; // Master width absolute value when !(Flags & _WidthStretch). When Stretch this is derived every frame from StretchWeight in TableUpdateLayout()
2677 float WidthAuto; // Automatic width
2678 float WidthMax; // Maximum width (FIXME: overwritten by each instance)
2679 float StretchWeight; // Master width weight when (Flags & _WidthStretch). Often around ~1.0f initially.
2680 float InitStretchWeightOrWidth; // Value passed to TableSetupColumn(). For Width it is a content width (_without padding_).
2681 ImRect ClipRect; // Clipping rectangle for the column
2682 ImGuiID UserID; // Optional, value passed to TableSetupColumn()
2683 float WorkMinX; // Contents region min ~(MinX + CellPaddingX + CellSpacingX1) == cursor start position when entering column
2684 float WorkMaxX; // Contents region max ~(MaxX - CellPaddingX - CellSpacingX2)
2685 float ItemWidth; // Current item width for the column, preserved across rows
2686 float ContentMaxXFrozen; // Contents maximum position for frozen rows (apart from headers), from which we can infer content width.
2687 float ContentMaxXUnfrozen;
2688 float ContentMaxXHeadersUsed; // Contents maximum position for headers rows (regardless of freezing). TableHeader() automatically softclip itself + report ideal desired size, to avoid creating extraneous draw calls
2689 float ContentMaxXHeadersIdeal;
2690 ImS16 NameOffset; // Offset into parent ColumnsNames[]
2691 ImGuiTableColumnIdx DisplayOrder; // Index within Table's IndexToDisplayOrder[] (column may be reordered by users)
2692 ImGuiTableColumnIdx IndexWithinEnabledSet; // Index within enabled/visible set (<= IndexToDisplayOrder)
2693 ImGuiTableColumnIdx PrevEnabledColumn; // Index of prev enabled/visible column within Columns[], -1 if first enabled/visible column
2694 ImGuiTableColumnIdx NextEnabledColumn; // Index of next enabled/visible column within Columns[], -1 if last enabled/visible column
2695 ImGuiTableColumnIdx SortOrder; // Index of this column within sort specs, -1 if not sorting on this column, 0 for single-sort, may be >0 on multi-sort
2696 ImGuiTableDrawChannelIdx DrawChannelCurrent; // Index within DrawSplitter.Channels[]
2697 ImGuiTableDrawChannelIdx DrawChannelFrozen; // Draw channels for frozen rows (often headers)
2698 ImGuiTableDrawChannelIdx DrawChannelUnfrozen; // Draw channels for unfrozen rows
2699 bool IsEnabled; // IsUserEnabled && (Flags & ImGuiTableColumnFlags_Disabled) == 0
2700 bool IsUserEnabled; // Is the column not marked Hidden by the user? (unrelated to being off view, e.g. clipped by scrolling).
2701 bool IsUserEnabledNextFrame;
2702 bool IsVisibleX; // Is actually in view (e.g. overlapping the host window clipping rectangle, not scrolled).
2703 bool IsVisibleY;
2704 bool IsRequestOutput; // Return value for TableSetColumnIndex() / TableNextColumn(): whether we request user to output contents or not.
2705 bool IsSkipItems; // Do we want item submissions to this column to be completely ignored (no layout will happen).
2706 bool IsPreserveWidthAuto;
2707 ImS8 NavLayerCurrent; // ImGuiNavLayer in 1 byte
2708 ImU8 AutoFitQueue; // Queue of 8 values for the next 8 frames to request auto-fit
2709 ImU8 CannotSkipItemsQueue; // Queue of 8 values for the next 8 frames to disable Clipped/SkipItem
2710 ImU8 SortDirection : 2; // ImGuiSortDirection_Ascending or ImGuiSortDirection_Descending
2711 ImU8 SortDirectionsAvailCount : 2; // Number of available sort directions (0 to 3)
2712 ImU8 SortDirectionsAvailMask : 4; // Mask of available sort directions (1-bit each)
2713 ImU8 SortDirectionsAvailList; // Ordered list of available sort directions (2-bits each, total 8-bits)
2714
2715 ImGuiTableColumn()
2716 {
2717 memset(this, 0, sizeof(*this));
2718 StretchWeight = WidthRequest = -1.0f;
2719 NameOffset = -1;
2720 DisplayOrder = IndexWithinEnabledSet = -1;
2721 PrevEnabledColumn = NextEnabledColumn = -1;
2722 SortOrder = -1;
2723 SortDirection = ImGuiSortDirection_None;
2724 DrawChannelCurrent = DrawChannelFrozen = DrawChannelUnfrozen = (ImU8)-1;
2725 }
2726};
2727
2728// Transient cell data stored per row.
2729// sizeof() ~ 6 bytes
2731{
2732 ImU32 BgColor; // Actual color
2733 ImGuiTableColumnIdx Column; // Column number
2734};
2735
2736// Parameters for TableAngledHeadersRowEx()
2737// This may end up being refactored for more general purpose.
2738// sizeof() ~ 12 bytes
2740{
2741 ImGuiTableColumnIdx Index; // Column index
2742 ImU32 TextColor;
2743 ImU32 BgColor0;
2744 ImU32 BgColor1;
2745};
2746
2747// 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?)
2748// sizeof() ~ 24 bytes
2749struct ImGuiTableInstanceData
2750{
2751 ImGuiID TableInstanceID;
2752 float LastOuterHeight; // Outer height from last frame
2753 float LastTopHeadersRowHeight; // Height of first consecutive header rows from last frame (FIXME: this is used assuming consecutive headers are in same frozen set)
2754 float LastFrozenHeight; // Height of frozen section from last frame
2755 int HoveredRowLast; // Index of row which was hovered last frame.
2756 int HoveredRowNext; // Index of row hovered this frame, set after encountering it.
2757
2758 ImGuiTableInstanceData() { TableInstanceID = 0; LastOuterHeight = LastTopHeadersRowHeight = LastFrozenHeight = 0.0f; HoveredRowLast = HoveredRowNext = -1; }
2759};
2760
2761// sizeof() ~ 592 bytes + heap allocs described in TableBeginInitMemory()
2762struct IMGUI_API ImGuiTable
2763{
2764 ImGuiID ID;
2765 ImGuiTableFlags Flags;
2766 void* RawData; // Single allocation to hold Columns[], DisplayOrderToIndex[] and RowCellData[]
2767 ImGuiTableTempData* TempData; // Transient data while table is active. Point within g.CurrentTableStack[]
2768 ImSpan<ImGuiTableColumn> Columns; // Point within RawData[]
2769 ImSpan<ImGuiTableColumnIdx> DisplayOrderToIndex; // Point within RawData[]. Store display order of columns (when not reordered, the values are 0...Count-1)
2770 ImSpan<ImGuiTableCellData> RowCellData; // Point within RawData[]. Store cells background requests for current row.
2771 ImBitArrayPtr EnabledMaskByDisplayOrder; // Column DisplayOrder -> IsEnabled map
2772 ImBitArrayPtr EnabledMaskByIndex; // Column Index -> IsEnabled map (== not hidden by user/api) in a format adequate for iterating column without touching cold data
2773 ImBitArrayPtr VisibleMaskByIndex; // Column Index -> IsVisibleX|IsVisibleY map (== not hidden by user/api && not hidden by scrolling/cliprect)
2774 ImGuiTableFlags SettingsLoadedFlags; // Which data were loaded from the .ini file (e.g. when order is not altered we won't save order)
2775 int SettingsOffset; // Offset in g.SettingsTables
2776 int LastFrameActive;
2777 int ColumnsCount; // Number of columns declared in BeginTable()
2778 int CurrentRow;
2779 int CurrentColumn;
2780 ImS16 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 table with same ID look are multiple tables, they are just synched.
2781 ImS16 InstanceInteracted; // Mark which instance (generally 0) of the same ID is being interacted with
2782 float RowPosY1;
2783 float RowPosY2;
2784 float RowMinHeight; // Height submitted to TableNextRow()
2785 float RowCellPaddingY; // Top and bottom padding. Reloaded during row change.
2786 float RowTextBaseline;
2787 float RowIndentOffsetX;
2788 ImGuiTableRowFlags RowFlags : 16; // Current row flags, see ImGuiTableRowFlags_
2789 ImGuiTableRowFlags LastRowFlags : 16;
2790 int 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.
2791 ImU32 RowBgColor[2]; // Background color override for current row.
2792 ImU32 BorderColorStrong;
2793 ImU32 BorderColorLight;
2794 float BorderX1;
2795 float BorderX2;
2796 float HostIndentX;
2797 float MinColumnWidth;
2798 float OuterPaddingX;
2799 float CellPaddingX; // Padding from each borders. Locked in BeginTable()/Layout.
2800 float CellSpacingX1; // Spacing between non-bordered cells. Locked in BeginTable()/Layout.
2801 float CellSpacingX2;
2802 float InnerWidth; // User value passed to BeginTable(), see comments at the top of BeginTable() for details.
2803 float ColumnsGivenWidth; // Sum of current column width
2804 float ColumnsAutoFitWidth; // Sum of ideal column width in order nothing to be clipped, used for auto-fitting and content width submission in outer window
2805 float ColumnsStretchSumWeights; // Sum of weight of all enabled stretching columns
2806 float ResizedColumnNextWidth;
2807 float ResizeLockMinContentsX2; // Lock minimum contents width while resizing down in order to not create feedback loops. But we allow growing the table.
2808 float RefScale; // Reference scale to be able to rescale columns on font/dpi changes.
2809 float AngledHeadersHeight; // Set by TableAngledHeadersRow(), used in TableUpdateLayout()
2810 float AngledHeadersSlope; // Set by TableAngledHeadersRow(), used in TableUpdateLayout()
2811 ImRect OuterRect; // Note: for non-scrolling table, OuterRect.Max.y is often FLT_MAX until EndTable(), unless a height has been specified in BeginTable().
2812 ImRect InnerRect; // InnerRect but without decoration. As with OuterRect, for non-scrolling tables, InnerRect.Max.y is
2813 ImRect WorkRect;
2814 ImRect InnerClipRect;
2815 ImRect BgClipRect; // We use this to cpu-clip cell background color fill, evolve during the frame as we cross frozen rows boundaries
2816 ImRect Bg0ClipRectForDrawCmd; // Actual ImDrawCmd clip rect for BG0/1 channel. This tends to be == OuterWindow->ClipRect at BeginTable() because output in BG0/BG1 is cpu-clipped
2817 ImRect 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.
2818 ImRect HostClipRect; // This is used to check if we can eventually merge our columns draw calls into the current draw call of the current window.
2819 ImRect HostBackupInnerClipRect; // Backup of InnerWindow->ClipRect during PushTableBackground()/PopTableBackground()
2820 ImGuiWindow* OuterWindow; // Parent window for the table
2821 ImGuiWindow* InnerWindow; // Window holding the table data (== OuterWindow or a child window)
2822 ImGuiTextBuffer ColumnsNames; // Contiguous buffer holding columns names
2823 ImDrawListSplitter* DrawSplitter; // Shortcut to TempData->DrawSplitter while in table. Isolate draw commands per columns to avoid switching clip rect constantly
2824 ImGuiTableInstanceData InstanceDataFirst;
2825 ImVector<ImGuiTableInstanceData> InstanceDataExtra; // FIXME-OPT: Using a small-vector pattern would be good.
2826 ImGuiTableColumnSortSpecs SortSpecsSingle;
2827 ImVector<ImGuiTableColumnSortSpecs> SortSpecsMulti; // FIXME-OPT: Using a small-vector pattern would be good.
2828 ImGuiTableSortSpecs SortSpecs; // Public facing sorts specs, this is what we return in TableGetSortSpecs()
2829 ImGuiTableColumnIdx SortSpecsCount;
2830 ImGuiTableColumnIdx ColumnsEnabledCount; // Number of enabled columns (<= ColumnsCount)
2831 ImGuiTableColumnIdx ColumnsEnabledFixedCount; // Number of enabled columns using fixed width (<= ColumnsCount)
2832 ImGuiTableColumnIdx DeclColumnsCount; // Count calls to TableSetupColumn()
2833 ImGuiTableColumnIdx AngledHeadersCount; // Count columns with angled headers
2834 ImGuiTableColumnIdx HoveredColumnBody; // Index of column whose visible region is being hovered. Important: == ColumnsCount when hovering empty region after the right-most column!
2835 ImGuiTableColumnIdx HoveredColumnBorder; // Index of column whose right-border is being hovered (for resizing).
2836 ImGuiTableColumnIdx HighlightColumnHeader; // Index of column which should be highlighted.
2837 ImGuiTableColumnIdx AutoFitSingleColumn; // Index of single column requesting auto-fit.
2838 ImGuiTableColumnIdx ResizedColumn; // Index of column being resized. Reset when InstanceCurrent==0.
2839 ImGuiTableColumnIdx LastResizedColumn; // Index of column being resized from previous frame.
2840 ImGuiTableColumnIdx HeldHeaderColumn; // Index of column header being held.
2841 ImGuiTableColumnIdx ReorderColumn; // Index of column being reordered. (not cleared)
2842 ImGuiTableColumnIdx ReorderColumnDir; // -1 or +1
2843 ImGuiTableColumnIdx LeftMostEnabledColumn; // Index of left-most non-hidden column.
2844 ImGuiTableColumnIdx RightMostEnabledColumn; // Index of right-most non-hidden column.
2845 ImGuiTableColumnIdx LeftMostStretchedColumn; // Index of left-most stretched column.
2846 ImGuiTableColumnIdx RightMostStretchedColumn; // Index of right-most stretched column.
2847 ImGuiTableColumnIdx ContextPopupColumn; // Column right-clicked on, of -1 if opening context menu from a neutral/empty spot
2848 ImGuiTableColumnIdx FreezeRowsRequest; // Requested frozen rows count
2849 ImGuiTableColumnIdx FreezeRowsCount; // Actual frozen row count (== FreezeRowsRequest, or == 0 when no scrolling offset)
2850 ImGuiTableColumnIdx FreezeColumnsRequest; // Requested frozen columns count
2851 ImGuiTableColumnIdx FreezeColumnsCount; // Actual frozen columns count (== FreezeColumnsRequest, or == 0 when no scrolling offset)
2852 ImGuiTableColumnIdx RowCellDataCurrent; // Index of current RowCellData[] entry in current row
2853 ImGuiTableDrawChannelIdx DummyDrawChannel; // Redirect non-visible columns here.
2854 ImGuiTableDrawChannelIdx Bg2DrawChannelCurrent; // For Selectable() and other widgets drawing across columns after the freezing line. Index within DrawSplitter.Channels[]
2855 ImGuiTableDrawChannelIdx Bg2DrawChannelUnfrozen;
2856 bool IsLayoutLocked; // Set by TableUpdateLayout() which is called when beginning the first row.
2857 bool IsInsideRow; // Set when inside TableBeginRow()/TableEndRow().
2858 bool IsInitializing;
2859 bool IsSortSpecsDirty;
2860 bool IsUsingHeaders; // Set when the first row had the ImGuiTableRowFlags_Headers flag.
2861 bool IsContextPopupOpen; // Set when default context menu is open (also see: ContextPopupColumn, InstanceInteracted).
2862 bool DisableDefaultContextMenu; // Disable default context menu contents. You may submit your own using TableBeginContextMenuPopup()/EndPopup()
2863 bool IsSettingsRequestLoad;
2864 bool IsSettingsDirty; // Set when table settings have changed and needs to be reported into ImGuiTableSetttings data.
2865 bool IsDefaultDisplayOrder; // Set when display order is unchanged from default (DisplayOrder contains 0...Count-1)
2866 bool IsResetAllRequest;
2867 bool IsResetDisplayOrderRequest;
2868 bool IsUnfrozenRows; // Set when we got past the frozen row.
2869 bool IsDefaultSizingPolicy; // Set if user didn't explicitly set a sizing policy in BeginTable()
2870 bool IsActiveIdAliveBeforeTable;
2871 bool IsActiveIdInTable;
2872 bool HasScrollbarYCurr; // Whether ANY instance of this table had a vertical scrollbar during the current frame.
2873 bool HasScrollbarYPrev; // Whether ANY instance of this table had a vertical scrollbar during the previous.
2874 bool MemoryCompacted;
2875 bool HostSkipItems; // Backup of InnerWindow->SkipItem at the end of BeginTable(), because we will overwrite InnerWindow->SkipItem on a per-column basis
2876
2877 ImGuiTable() { memset(this, 0, sizeof(*this)); LastFrameActive = -1; }
2878 ~ImGuiTable() { IM_FREE(RawData); }
2879};
2880
2881// Transient data that are only needed between BeginTable() and EndTable(), those buffers are shared (1 per level of stacked table).
2882// - Accessing those requires chasing an extra pointer so for very frequently used data we leave them in the main table structure.
2883// - We also leave out of this structure data that tend to be particularly useful for debugging/metrics.
2884// FIXME-TABLE: more transient data could be stored in a stacked ImGuiTableTempData: e.g. SortSpecs.
2885// sizeof() ~ 136 bytes.
2886struct IMGUI_API ImGuiTableTempData
2887{
2888 int TableIndex; // Index in g.Tables.Buf[] pool
2889 float LastTimeActive; // Last timestamp this structure was used
2890 float AngledHeadersExtraWidth; // Used in EndTable()
2891 ImVector<ImGuiTableHeaderData> AngledHeadersRequests; // Used in TableAngledHeadersRow()
2892
2893 ImVec2 UserOuterSize; // outer_size.x passed to BeginTable()
2894 ImDrawListSplitter DrawSplitter;
2895
2896 ImRect HostBackupWorkRect; // Backup of InnerWindow->WorkRect at the end of BeginTable()
2897 ImRect HostBackupParentWorkRect; // Backup of InnerWindow->ParentWorkRect at the end of BeginTable()
2898 ImVec2 HostBackupPrevLineSize; // Backup of InnerWindow->DC.PrevLineSize at the end of BeginTable()
2899 ImVec2 HostBackupCurrLineSize; // Backup of InnerWindow->DC.CurrLineSize at the end of BeginTable()
2900 ImVec2 HostBackupCursorMaxPos; // Backup of InnerWindow->DC.CursorMaxPos at the end of BeginTable()
2901 ImVec1 HostBackupColumnsOffset; // Backup of OuterWindow->DC.ColumnsOffset at the end of BeginTable()
2902 float HostBackupItemWidth; // Backup of OuterWindow->DC.ItemWidth at the end of BeginTable()
2903 int HostBackupItemWidthStackSize;//Backup of OuterWindow->DC.ItemWidthStack.Size at the end of BeginTable()
2904
2905 ImGuiTableTempData() { memset(this, 0, sizeof(*this)); LastTimeActive = -1.0f; }
2906};
2907
2908// sizeof() ~ 12
2909struct ImGuiTableColumnSettings
2910{
2911 float WidthOrWeight;
2912 ImGuiID UserID;
2913 ImGuiTableColumnIdx Index;
2914 ImGuiTableColumnIdx DisplayOrder;
2915 ImGuiTableColumnIdx SortOrder;
2916 ImU8 SortDirection : 2;
2917 ImU8 IsEnabled : 1; // "Visible" in ini file
2918 ImU8 IsStretch : 1;
2919
2920 ImGuiTableColumnSettings()
2921 {
2922 WidthOrWeight = 0.0f;
2923 UserID = 0;
2924 Index = -1;
2925 DisplayOrder = SortOrder = -1;
2926 SortDirection = ImGuiSortDirection_None;
2927 IsEnabled = 1;
2928 IsStretch = 0;
2929 }
2930};
2931
2932// This is designed to be stored in a single ImChunkStream (1 header followed by N ImGuiTableColumnSettings, etc.)
2933struct ImGuiTableSettings
2934{
2935 ImGuiID ID; // Set to 0 to invalidate/delete the setting
2936 ImGuiTableFlags SaveFlags; // Indicate data we want to save using the Resizable/Reorderable/Sortable/Hideable flags (could be using its own flags..)
2937 float RefScale; // Reference scale to be able to rescale columns on font/dpi changes.
2938 ImGuiTableColumnIdx ColumnsCount;
2939 ImGuiTableColumnIdx ColumnsCountMax; // Maximum number of columns this settings instance can store, we can recycle a settings instance with lower number of columns but not higher
2940 bool WantApply; // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context)
2941
2942 ImGuiTableSettings() { memset(this, 0, sizeof(*this)); }
2943 ImGuiTableColumnSettings* GetColumnSettings() { return (ImGuiTableColumnSettings*)(this + 1); }
2944};
2945
2946//-----------------------------------------------------------------------------
2947// [SECTION] ImGui internal API
2948// No guarantee of forward compatibility here!
2949//-----------------------------------------------------------------------------
2950
2951namespace ImGui
2952{
2953 // Windows
2954 // We should always have a CurrentWindow in the stack (there is an implicit "Debug" window)
2955 // If this ever crashes because g.CurrentWindow is NULL, it means that either:
2956 // - ImGui::NewFrame() has never been called, which is illegal.
2957 // - You are calling ImGui functions after ImGui::EndFrame()/ImGui::Render() and before the next ImGui::NewFrame(), which is also illegal.
2958 IMGUI_API ImGuiIO& GetIOEx(ImGuiContext* ctx);
2959 inline ImGuiWindow* GetCurrentWindowRead() { ImGuiContext& g = *GImGui; return g.CurrentWindow; }
2960 inline ImGuiWindow* GetCurrentWindow() { ImGuiContext& g = *GImGui; g.CurrentWindow->WriteAccessed = true; return g.CurrentWindow; }
2961 IMGUI_API ImGuiWindow* FindWindowByID(ImGuiID id);
2962 IMGUI_API ImGuiWindow* FindWindowByName(const char* name);
2963 IMGUI_API void UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags flags, ImGuiWindow* parent_window);
2964 IMGUI_API void UpdateWindowSkipRefresh(ImGuiWindow* window);
2965 IMGUI_API ImVec2 CalcWindowNextAutoFitSize(ImGuiWindow* window);
2966 IMGUI_API bool IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent, bool popup_hierarchy);
2967 IMGUI_API bool IsWindowWithinBeginStackOf(ImGuiWindow* window, ImGuiWindow* potential_parent);
2968 IMGUI_API bool IsWindowAbove(ImGuiWindow* potential_above, ImGuiWindow* potential_below);
2969 IMGUI_API bool IsWindowNavFocusable(ImGuiWindow* window);
2970 IMGUI_API void SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond = 0);
2971 IMGUI_API void SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond cond = 0);
2972 IMGUI_API void SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiCond cond = 0);
2973 IMGUI_API void SetWindowHitTestHole(ImGuiWindow* window, const ImVec2& pos, const ImVec2& size);
2974 IMGUI_API void SetWindowHiddenAndSkipItemsForCurrentFrame(ImGuiWindow* window);
2975 inline void SetWindowParentWindowForFocusRoute(ImGuiWindow* window, ImGuiWindow* parent_window) { window->ParentWindowForFocusRoute = parent_window; }
2976 inline 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); }
2977 inline 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); }
2978 inline ImVec2 WindowPosAbsToRel(ImGuiWindow* window, const ImVec2& p) { ImVec2 off = window->DC.CursorStartPos; return ImVec2(p.x - off.x, p.y - off.y); }
2979 inline ImVec2 WindowPosRelToAbs(ImGuiWindow* window, const ImVec2& p) { ImVec2 off = window->DC.CursorStartPos; return ImVec2(p.x + off.x, p.y + off.y); }
2980
2981 // Windows: Display Order and Focus Order
2982 IMGUI_API void FocusWindow(ImGuiWindow* window, ImGuiFocusRequestFlags flags = 0);
2983 IMGUI_API void FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWindow* ignore_window, ImGuiViewport* filter_viewport, ImGuiFocusRequestFlags flags);
2984 IMGUI_API void BringWindowToFocusFront(ImGuiWindow* window);
2985 IMGUI_API void BringWindowToDisplayFront(ImGuiWindow* window);
2986 IMGUI_API void BringWindowToDisplayBack(ImGuiWindow* window);
2987 IMGUI_API void BringWindowToDisplayBehind(ImGuiWindow* window, ImGuiWindow* above_window);
2988 IMGUI_API int FindWindowDisplayIndex(ImGuiWindow* window);
2989 IMGUI_API ImGuiWindow* FindBottomMostVisibleWindowWithinBeginStack(ImGuiWindow* window);
2990
2991 // Windows: Idle, Refresh Policies [EXPERIMENTAL]
2992 IMGUI_API void SetNextWindowRefreshPolicy(ImGuiWindowRefreshFlags flags);
2993
2994 // Fonts, drawing
2995 IMGUI_API void SetCurrentFont(ImFont* font);
2996 inline ImFont* GetDefaultFont() { ImGuiContext& g = *GImGui; return g.IO.FontDefault ? g.IO.FontDefault : g.IO.Fonts->Fonts[0]; }
2997 inline ImDrawList* GetForegroundDrawList(ImGuiWindow* window) { IM_UNUSED(window); return GetForegroundDrawList(); } // This seemingly unnecessary wrapper simplifies compatibility between the 'master' and 'docking' branches.
2998 IMGUI_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.
2999 IMGUI_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.
3000 IMGUI_API void AddDrawListToDrawDataEx(ImDrawData* draw_data, ImVector<ImDrawList*>* out_list, ImDrawList* draw_list);
3001
3002 // Init
3003 IMGUI_API void Initialize();
3004 IMGUI_API void Shutdown(); // Since 1.60 this is a _private_ function. You can call DestroyContext() to destroy the context created by CreateContext().
3005
3006 // NewFrame
3007 IMGUI_API void UpdateInputEvents(bool trickle_fast_inputs);
3008 IMGUI_API void UpdateHoveredWindowAndCaptureFlags();
3009 IMGUI_API void FindHoveredWindowEx(const ImVec2& pos, bool find_first_and_in_any_viewport, ImGuiWindow** out_hovered_window, ImGuiWindow** out_hovered_window_under_moving_window);
3010 IMGUI_API void StartMouseMovingWindow(ImGuiWindow* window);
3011 IMGUI_API void UpdateMouseMovingWindowNewFrame();
3012 IMGUI_API void UpdateMouseMovingWindowEndFrame();
3013
3014 // Generic context hooks
3015 IMGUI_API ImGuiID AddContextHook(ImGuiContext* context, const ImGuiContextHook* hook);
3016 IMGUI_API void RemoveContextHook(ImGuiContext* context, ImGuiID hook_to_remove);
3017 IMGUI_API void CallContextHooks(ImGuiContext* context, ImGuiContextHookType type);
3018
3019 // Viewports
3020 IMGUI_API void SetWindowViewport(ImGuiWindow* window, ImGuiViewportP* viewport);
3021
3022 // Settings
3023 IMGUI_API void MarkIniSettingsDirty();
3024 IMGUI_API void MarkIniSettingsDirty(ImGuiWindow* window);
3025 IMGUI_API void ClearIniSettings();
3026 IMGUI_API void AddSettingsHandler(const ImGuiSettingsHandler* handler);
3027 IMGUI_API void RemoveSettingsHandler(const char* type_name);
3028 IMGUI_API ImGuiSettingsHandler* FindSettingsHandler(const char* type_name);
3029
3030 // Settings - Windows
3031 IMGUI_API ImGuiWindowSettings* CreateNewWindowSettings(const char* name);
3032 IMGUI_API ImGuiWindowSettings* FindWindowSettingsByID(ImGuiID id);
3033 IMGUI_API ImGuiWindowSettings* FindWindowSettingsByWindow(ImGuiWindow* window);
3034 IMGUI_API void ClearWindowSettings(const char* name);
3035
3036 // Localization
3037 IMGUI_API void LocalizeRegisterEntries(const ImGuiLocEntry* entries, int count);
3038 inline const char* LocalizeGetMsg(ImGuiLocKey key) { ImGuiContext& g = *GImGui; const char* msg = g.LocalizationTable[key]; return msg ? msg : "*Missing Text*"; }
3039
3040 // Scrolling
3041 IMGUI_API void SetScrollX(ImGuiWindow* window, float scroll_x);
3042 IMGUI_API void SetScrollY(ImGuiWindow* window, float scroll_y);
3043 IMGUI_API void SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x_ratio);
3044 IMGUI_API void SetScrollFromPosY(ImGuiWindow* window, float local_y, float center_y_ratio);
3045
3046 // Early work-in-progress API (ScrollToItem() will become public)
3047 IMGUI_API void ScrollToItem(ImGuiScrollFlags flags = 0);
3048 IMGUI_API void ScrollToRect(ImGuiWindow* window, const ImRect& rect, ImGuiScrollFlags flags = 0);
3049 IMGUI_API ImVec2 ScrollToRectEx(ImGuiWindow* window, const ImRect& rect, ImGuiScrollFlags flags = 0);
3050//#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
3051 inline void ScrollToBringRectIntoView(ImGuiWindow* window, const ImRect& rect) { ScrollToRect(window, rect, ImGuiScrollFlags_KeepVisibleEdgeY); }
3052//#endif
3053
3054 // Basic Accessors
3055 inline ImGuiItemStatusFlags GetItemStatusFlags() { ImGuiContext& g = *GImGui; return g.LastItemData.StatusFlags; }
3056 inline ImGuiItemFlags GetItemFlags() { ImGuiContext& g = *GImGui; return g.LastItemData.ItemFlags; }
3057 inline ImGuiID GetActiveID() { ImGuiContext& g = *GImGui; return g.ActiveId; }
3058 inline ImGuiID GetFocusID() { ImGuiContext& g = *GImGui; return g.NavId; }
3059 IMGUI_API void SetActiveID(ImGuiID id, ImGuiWindow* window);
3060 IMGUI_API void SetFocusID(ImGuiID id, ImGuiWindow* window);
3061 IMGUI_API void ClearActiveID();
3062 IMGUI_API ImGuiID GetHoveredID();
3063 IMGUI_API void SetHoveredID(ImGuiID id);
3064 IMGUI_API void KeepAliveID(ImGuiID id);
3065 IMGUI_API void MarkItemEdited(ImGuiID id); // Mark data associated to given item as "edited", used by IsItemDeactivatedAfterEdit() function.
3066 IMGUI_API void PushOverrideID(ImGuiID id); // Push given value as-is at the top of the ID stack (whereas PushID combines old and new hashes)
3067 IMGUI_API ImGuiID GetIDWithSeed(const char* str_id_begin, const char* str_id_end, ImGuiID seed);
3068 IMGUI_API ImGuiID GetIDWithSeed(int n, ImGuiID seed);
3069
3070 // Basic Helpers for widget code
3071 IMGUI_API void ItemSize(const ImVec2& size, float text_baseline_y = -1.0f);
3072 inline 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.
3073 IMGUI_API bool ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb = NULL, ImGuiItemFlags extra_flags = 0);
3074 IMGUI_API bool ItemHoverable(const ImRect& bb, ImGuiID id, ImGuiItemFlags item_flags);
3075 IMGUI_API bool IsWindowContentHoverable(ImGuiWindow* window, ImGuiHoveredFlags flags = 0);
3076 IMGUI_API bool IsClippedEx(const ImRect& bb, ImGuiID id);
3077 IMGUI_API void SetLastItemData(ImGuiID item_id, ImGuiItemFlags in_flags, ImGuiItemStatusFlags status_flags, const ImRect& item_rect);
3078 IMGUI_API ImVec2 CalcItemSize(ImVec2 size, float default_w, float default_h);
3079 IMGUI_API float CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x);
3080 IMGUI_API void PushMultiItemsWidths(int components, float width_full);
3081 IMGUI_API void ShrinkWidths(ImGuiShrinkWidthItem* items, int count, float width_excess);
3082
3083 // Parameter stacks (shared)
3084 IMGUI_API const ImGuiDataVarInfo* GetStyleVarInfo(ImGuiStyleVar idx);
3085 IMGUI_API void BeginDisabledOverrideReenable();
3086 IMGUI_API void EndDisabledOverrideReenable();
3087
3088 // Logging/Capture
3089 IMGUI_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.
3090 IMGUI_API void LogToBuffer(int auto_open_depth = -1); // Start logging/capturing to internal buffer
3091 IMGUI_API void LogRenderedText(const ImVec2* ref_pos, const char* text, const char* text_end = NULL);
3092 IMGUI_API void LogSetNextTextDecoration(const char* prefix, const char* suffix);
3093
3094 // Childs
3095 IMGUI_API bool BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, ImGuiChildFlags child_flags, ImGuiWindowFlags window_flags);
3096
3097 // Popups, Modals
3098 IMGUI_API bool BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_window_flags);
3099 IMGUI_API void OpenPopupEx(ImGuiID id, ImGuiPopupFlags popup_flags = ImGuiPopupFlags_None);
3100 IMGUI_API void ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_popup);
3101 IMGUI_API void ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to_window_under_popup);
3102 IMGUI_API void ClosePopupsExceptModals();
3103 IMGUI_API bool IsPopupOpen(ImGuiID id, ImGuiPopupFlags popup_flags);
3104 IMGUI_API ImRect GetPopupAllowedExtentRect(ImGuiWindow* window);
3105 IMGUI_API ImGuiWindow* GetTopMostPopupModal();
3106 IMGUI_API ImGuiWindow* GetTopMostAndVisiblePopupModal();
3107 IMGUI_API ImGuiWindow* FindBlockingModal(ImGuiWindow* window);
3108 IMGUI_API ImVec2 FindBestWindowPosForPopup(ImGuiWindow* window);
3109 IMGUI_API ImVec2 FindBestWindowPosForPopupEx(const ImVec2& ref_pos, const ImVec2& size, ImGuiDir* last_dir, const ImRect& r_outer, const ImRect& r_avoid, ImGuiPopupPositionPolicy policy);
3110
3111 // Tooltips
3112 IMGUI_API bool BeginTooltipEx(ImGuiTooltipFlags tooltip_flags, ImGuiWindowFlags extra_window_flags);
3113 IMGUI_API bool BeginTooltipHidden();
3114
3115 // Menus
3116 IMGUI_API bool BeginViewportSideBar(const char* name, ImGuiViewport* viewport, ImGuiDir dir, float size, ImGuiWindowFlags window_flags);
3117 IMGUI_API bool BeginMenuEx(const char* label, const char* icon, bool enabled = true);
3118 IMGUI_API bool MenuItemEx(const char* label, const char* icon, const char* shortcut = NULL, bool selected = false, bool enabled = true);
3119
3120 // Combos
3121 IMGUI_API bool BeginComboPopup(ImGuiID popup_id, const ImRect& bb, ImGuiComboFlags flags);
3122 IMGUI_API bool BeginComboPreview();
3123 IMGUI_API void EndComboPreview();
3124
3125 // Keyboard/Gamepad Navigation
3126 IMGUI_API void NavInitWindow(ImGuiWindow* window, bool force_reinit);
3127 IMGUI_API void NavInitRequestApplyResult();
3128 IMGUI_API bool NavMoveRequestButNoResultYet();
3129 IMGUI_API void NavMoveRequestSubmit(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags);
3130 IMGUI_API void NavMoveRequestForward(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags);
3131 IMGUI_API void NavMoveRequestResolveWithLastItem(ImGuiNavItemData* result);
3132 IMGUI_API void NavMoveRequestResolveWithPastTreeNode(ImGuiNavItemData* result, ImGuiTreeNodeStackData* tree_node_data);
3133 IMGUI_API void NavMoveRequestCancel();
3134 IMGUI_API void NavMoveRequestApplyResult();
3135 IMGUI_API void NavMoveRequestTryWrapping(ImGuiWindow* window, ImGuiNavMoveFlags move_flags);
3136 IMGUI_API void NavHighlightActivated(ImGuiID id);
3137 IMGUI_API void NavClearPreferredPosForAxis(ImGuiAxis axis);
3138 IMGUI_API void SetNavCursorVisibleAfterMove();
3139 IMGUI_API void NavUpdateCurrentWindowIsScrollPushableX();
3140 IMGUI_API void SetNavWindow(ImGuiWindow* window);
3141 IMGUI_API void SetNavID(ImGuiID id, ImGuiNavLayer nav_layer, ImGuiID focus_scope_id, const ImRect& rect_rel);
3142 IMGUI_API void SetNavFocusScope(ImGuiID focus_scope_id);
3143
3144 // Focus/Activation
3145 // This should be part of a larger set of API: FocusItem(offset = -1), FocusItemByID(id), ActivateItem(offset = -1), ActivateItemByID(id) etc. which are
3146 // 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.
3147 IMGUI_API void FocusItem(); // Focus last item (no selection/activation).
3148 IMGUI_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.
3149
3150 // Inputs
3151 // FIXME: Eventually we should aim to move e.g. IsActiveIdUsingKey() into IsKeyXXX functions.
3152 inline bool IsNamedKey(ImGuiKey key) { return key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END; }
3153 inline 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; }
3154 inline bool IsLegacyKey(ImGuiKey key) { return key >= ImGuiKey_LegacyNativeKey_BEGIN && key < ImGuiKey_LegacyNativeKey_END; }
3155 inline bool IsKeyboardKey(ImGuiKey key) { return key >= ImGuiKey_Keyboard_BEGIN && key < ImGuiKey_Keyboard_END; }
3156 inline bool IsGamepadKey(ImGuiKey key) { return key >= ImGuiKey_Gamepad_BEGIN && key < ImGuiKey_Gamepad_END; }
3157 inline bool IsMouseKey(ImGuiKey key) { return key >= ImGuiKey_Mouse_BEGIN && key < ImGuiKey_Mouse_END; }
3158 inline bool IsAliasKey(ImGuiKey key) { return key >= ImGuiKey_Aliases_BEGIN && key < ImGuiKey_Aliases_END; }
3159 inline bool IsLRModKey(ImGuiKey key) { return key >= ImGuiKey_LeftCtrl && key <= ImGuiKey_RightSuper; }
3160 ImGuiKeyChord FixupKeyChord(ImGuiKeyChord key_chord);
3161 inline ImGuiKey ConvertSingleModFlagToKey(ImGuiKey key)
3162 {
3163 if (key == ImGuiMod_Ctrl) return ImGuiKey_ReservedForModCtrl;
3164 if (key == ImGuiMod_Shift) return ImGuiKey_ReservedForModShift;
3165 if (key == ImGuiMod_Alt) return ImGuiKey_ReservedForModAlt;
3166 if (key == ImGuiMod_Super) return ImGuiKey_ReservedForModSuper;
3167 return key;
3168 }
3169
3170 IMGUI_API ImGuiKeyData* GetKeyData(ImGuiContext* ctx, ImGuiKey key);
3171 inline ImGuiKeyData* GetKeyData(ImGuiKey key) { ImGuiContext& g = *GImGui; return GetKeyData(&g, key); }
3172 IMGUI_API const char* GetKeyChordName(ImGuiKeyChord key_chord);
3173 inline ImGuiKey MouseButtonToKey(ImGuiMouseButton button) { IM_ASSERT(button >= 0 && button < ImGuiMouseButton_COUNT); return (ImGuiKey)(ImGuiKey_MouseLeft + button); }
3174 IMGUI_API bool IsMouseDragPastThreshold(ImGuiMouseButton button, float lock_threshold = -1.0f);
3175 IMGUI_API ImVec2 GetKeyMagnitude2d(ImGuiKey key_left, ImGuiKey key_right, ImGuiKey key_up, ImGuiKey key_down);
3176 IMGUI_API float GetNavTweakPressedAmount(ImGuiAxis axis);
3177 IMGUI_API int CalcTypematicRepeatAmount(float t0, float t1, float repeat_delay, float repeat_rate);
3178 IMGUI_API void GetTypematicRepeatRate(ImGuiInputFlags flags, float* repeat_delay, float* repeat_rate);
3179 IMGUI_API void TeleportMousePos(const ImVec2& pos);
3180 IMGUI_API void SetActiveIdUsingAllKeyboardKeys();
3181 inline bool IsActiveIdUsingNavDir(ImGuiDir dir) { ImGuiContext& g = *GImGui; return (g.ActiveIdUsingNavDirMask & (1 << dir)) != 0; }
3182
3183 // [EXPERIMENTAL] Low-Level: Key/Input Ownership
3184 // - The idea is that instead of "eating" a given input, we can link to an owner id.
3185 // - Ownership is most often claimed as a result of reacting to a press/down event (but occasionally may be claimed ahead).
3186 // - Input queries can then read input by specifying ImGuiKeyOwner_Any (== 0), ImGuiKeyOwner_NoOwner (== -1) or a custom ID.
3187 // - Legacy input queries (without specifying an owner or _Any or _None) are equivalent to using ImGuiKeyOwner_Any (== 0).
3188 // - Input ownership is automatically released on the frame after a key is released. Therefore:
3189 // - for ownership registration happening as a result of a down/press event, the SetKeyOwner() call may be done once (common case).
3190 // - 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).
3191 // - 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.
3192 // - This is marked experimental because not all widgets are fully honoring the Set/Test idioms. We will need to move forward step by step.
3193 // Please open a GitHub Issue to submit your usage scenario or if there's a use case you need solved.
3194 IMGUI_API ImGuiID GetKeyOwner(ImGuiKey key);
3195 IMGUI_API void SetKeyOwner(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags = 0);
3196 IMGUI_API void SetKeyOwnersForKeyChord(ImGuiKeyChord key, ImGuiID owner_id, ImGuiInputFlags flags = 0);
3197 IMGUI_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());'.
3198 IMGUI_API bool TestKeyOwner(ImGuiKey key, ImGuiID owner_id); // Test that key is either not owned, either owned by 'owner_id'
3199 inline ImGuiKeyOwnerData* GetKeyOwnerData(ImGuiContext* ctx, ImGuiKey key) { if (key & ImGuiMod_Mask_) key = ConvertSingleModFlagToKey(key); IM_ASSERT(IsNamedKey(key)); return &ctx->KeysOwnerData[key - ImGuiKey_NamedKey_BEGIN]; }
3200
3201 // [EXPERIMENTAL] High-Level: Input Access functions w/ support for Key/Input Ownership
3202 // - Important: legacy IsKeyPressed(ImGuiKey, bool repeat=true) _DEFAULTS_ to repeat, new IsKeyPressed() requires _EXPLICIT_ ImGuiInputFlags_Repeat flag.
3203 // - Expected to be later promoted to public API, the prototypes are designed to replace existing ones (since owner_id can default to Any == 0)
3204 // - Specifying a value for 'ImGuiID owner' will test that EITHER the key is NOT owned (UNLESS locked), EITHER the key is owned by 'owner'.
3205 // Legacy functions use ImGuiKeyOwner_Any meaning that they typically ignore ownership, unless a call to SetKeyOwner() explicitly used ImGuiInputFlags_LockThisFrame or ImGuiInputFlags_LockUntilRelease.
3206 // - Binding generators may want to ignore those for now, or suffix them with Ex() until we decide if this gets moved into public API.
3207 IMGUI_API bool IsKeyDown(ImGuiKey key, ImGuiID owner_id);
3208 IMGUI_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 requiress explicit ImGuiInputFlags_Repeat.
3209 IMGUI_API bool IsKeyReleased(ImGuiKey key, ImGuiID owner_id);
3210 IMGUI_API bool IsKeyChordPressed(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID owner_id = 0);
3211 IMGUI_API bool IsMouseDown(ImGuiMouseButton button, ImGuiID owner_id);
3212 IMGUI_API bool IsMouseClicked(ImGuiMouseButton button, ImGuiInputFlags flags, ImGuiID owner_id = 0);
3213 IMGUI_API bool IsMouseReleased(ImGuiMouseButton button, ImGuiID owner_id);
3214 IMGUI_API bool IsMouseDoubleClicked(ImGuiMouseButton button, ImGuiID owner_id);
3215
3216 // Shortcut Testing & Routing
3217 // - Set Shortcut() and SetNextItemShortcut() in imgui.h
3218 // - When a policy (except for ImGuiInputFlags_RouteAlways *) is set, Shortcut() will register itself with SetShortcutRouting(),
3219 // allowing the system to decide where to route the input among other route-aware calls.
3220 // (* using ImGuiInputFlags_RouteAlways is roughly equivalent to calling IsKeyChordPressed(key) and bypassing route registration and check)
3221 // - When using one of the routing option:
3222 // - 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.)
3223 // - Routes are requested given a chord (key + modifiers) and a routing policy.
3224 // - Routes are resolved during NewFrame(): if keyboard modifiers are matching current ones: SetKeyOwner() is called + route is granted for the frame.
3225 // - 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).
3226 // - Multiple read sites may use the same owner id can all access the granted route.
3227 // - When owner_id is 0 we use the current Focus Scope ID as a owner ID in order to identify our location.
3228 // - You can chain two unrelated windows in the focus stack using SetWindowParentWindowForFocusRoute()
3229 // e.g. if you have a tool window associated to a document, and you want document shortcuts to run when the tool is focused.
3230 IMGUI_API bool Shortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID owner_id);
3231 IMGUI_API bool SetShortcutRouting(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID owner_id); // owner_id needs to be explicit and cannot be 0
3232 IMGUI_API bool TestShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id);
3233 IMGUI_API ImGuiKeyRoutingData* GetShortcutRoutingData(ImGuiKeyChord key_chord);
3234
3235 // [EXPERIMENTAL] Focus Scope
3236 // This is generally used to identify a unique input location (for e.g. a selection set)
3237 // There is one per window (automatically set in Begin), but:
3238 // - Selection patterns generally need to react (e.g. clear a selection) when landing on one item of the set.
3239 // So in order to identify a set multiple lists in same window may each need a focus scope.
3240 // If you imagine an hypothetical BeginSelectionGroup()/EndSelectionGroup() api, it would likely call PushFocusScope()/EndFocusScope()
3241 // - Shortcut routing also use focus scope as a default location identifier if an owner is not provided.
3242 // We don't use the ID Stack for this as it is common to want them separate.
3243 IMGUI_API void PushFocusScope(ImGuiID id);
3244 IMGUI_API void PopFocusScope();
3245 inline ImGuiID GetCurrentFocusScope() { ImGuiContext& g = *GImGui; return g.CurrentFocusScopeId; } // Focus scope we are outputting into, set by PushFocusScope()
3246
3247 // Drag and Drop
3248 IMGUI_API bool IsDragDropActive();
3249 IMGUI_API bool BeginDragDropTargetCustom(const ImRect& bb, ImGuiID id);
3250 IMGUI_API void ClearDragDrop();
3251 IMGUI_API bool IsDragDropPayloadBeingAccepted();
3252 IMGUI_API void RenderDragDropTargetRect(const ImRect& bb, const ImRect& item_clip_rect);
3253
3254 // Typing-Select API
3255 // (provide Windows Explorer style "select items by typing partial name" + "cycle through items by typing same letter" feature)
3256 // (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!)
3257 IMGUI_API ImGuiTypingSelectRequest* GetTypingSelectRequest(ImGuiTypingSelectFlags flags = ImGuiTypingSelectFlags_None);
3258 IMGUI_API int TypingSelectFindMatch(ImGuiTypingSelectRequest* req, int items_count, const char* (*get_item_name_func)(void*, int), void* user_data, int nav_item_idx);
3259 IMGUI_API int TypingSelectFindNextSingleCharMatch(ImGuiTypingSelectRequest* req, int items_count, const char* (*get_item_name_func)(void*, int), void* user_data, int nav_item_idx);
3260 IMGUI_API int TypingSelectFindBestLeadingMatch(ImGuiTypingSelectRequest* req, int items_count, const char* (*get_item_name_func)(void*, int), void* user_data);
3261
3262 // Box-Select API
3263 IMGUI_API bool BeginBoxSelect(const ImRect& scope_rect, ImGuiWindow* window, ImGuiID box_select_id, ImGuiMultiSelectFlags ms_flags);
3264 IMGUI_API void EndBoxSelect(const ImRect& scope_rect, ImGuiMultiSelectFlags ms_flags);
3265
3266 // Multi-Select API
3267 IMGUI_API void MultiSelectItemHeader(ImGuiID id, bool* p_selected, ImGuiButtonFlags* p_button_flags);
3268 IMGUI_API void MultiSelectItemFooter(ImGuiID id, bool* p_selected, bool* p_pressed);
3269 IMGUI_API void MultiSelectAddSetAll(ImGuiMultiSelectTempData* ms, bool selected);
3270 IMGUI_API void MultiSelectAddSetRange(ImGuiMultiSelectTempData* ms, bool selected, int range_dir, ImGuiSelectionUserData first_item, ImGuiSelectionUserData last_item);
3271 inline ImGuiBoxSelectState* GetBoxSelectState(ImGuiID id) { ImGuiContext& g = *GImGui; return (id != 0 && g.BoxSelectState.ID == id && g.BoxSelectState.IsActive) ? &g.BoxSelectState : NULL; }
3272 inline ImGuiMultiSelectState* GetMultiSelectState(ImGuiID id) { ImGuiContext& g = *GImGui; return g.MultiSelectStorage.GetByKey(id); }
3273
3274 // Internal Columns API (this is not exposed because we will encourage transitioning to the Tables API)
3275 IMGUI_API void SetWindowClipRectBeforeSetChannel(ImGuiWindow* window, const ImRect& clip_rect);
3276 IMGUI_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().
3277 IMGUI_API void EndColumns(); // close columns
3278 IMGUI_API void PushColumnClipRect(int column_index);
3279 IMGUI_API void PushColumnsBackground();
3280 IMGUI_API void PopColumnsBackground();
3281 IMGUI_API ImGuiID GetColumnsID(const char* str_id, int count);
3282 IMGUI_API ImGuiOldColumns* FindOrCreateColumns(ImGuiWindow* window, ImGuiID id);
3283 IMGUI_API float GetColumnOffsetFromNorm(const ImGuiOldColumns* columns, float offset_norm);
3284 IMGUI_API float GetColumnNormFromOffset(const ImGuiOldColumns* columns, float offset);
3285
3286 // Tables: Candidates for public API
3287 IMGUI_API void TableOpenContextMenu(int column_n = -1);
3288 IMGUI_API void TableSetColumnWidth(int column_n, float width);
3289 IMGUI_API void TableSetColumnSortDirection(int column_n, ImGuiSortDirection sort_direction, bool append_to_sort_specs);
3290 IMGUI_API int TableGetHoveredRow(); // Retrieve *PREVIOUS FRAME* hovered row. This difference with TableGetHoveredColumn() is the reason why this is not public yet.
3291 IMGUI_API float TableGetHeaderRowHeight();
3292 IMGUI_API float TableGetHeaderAngledMaxLabelWidth();
3293 IMGUI_API void TablePushBackgroundChannel();
3294 IMGUI_API void TablePopBackgroundChannel();
3295 IMGUI_API void TableAngledHeadersRowEx(ImGuiID row_id, float angle, float max_label_width, const ImGuiTableHeaderData* data, int data_count);
3296
3297 // Tables: Internals
3298 inline ImGuiTable* GetCurrentTable() { ImGuiContext& g = *GImGui; return g.CurrentTable; }
3299 IMGUI_API ImGuiTable* TableFindByID(ImGuiID id);
3300 IMGUI_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);
3301 IMGUI_API void TableBeginInitMemory(ImGuiTable* table, int columns_count);
3302 IMGUI_API void TableBeginApplyRequests(ImGuiTable* table);
3303 IMGUI_API void TableSetupDrawChannels(ImGuiTable* table);
3304 IMGUI_API void TableUpdateLayout(ImGuiTable* table);
3305 IMGUI_API void TableUpdateBorders(ImGuiTable* table);
3306 IMGUI_API void TableUpdateColumnsWeightFromWidth(ImGuiTable* table);
3307 IMGUI_API void TableDrawBorders(ImGuiTable* table);
3308 IMGUI_API void TableDrawDefaultContextMenu(ImGuiTable* table, ImGuiTableFlags flags_for_section_to_display);
3309 IMGUI_API bool TableBeginContextMenuPopup(ImGuiTable* table);
3310 IMGUI_API void TableMergeDrawChannels(ImGuiTable* table);
3311 inline ImGuiTableInstanceData* TableGetInstanceData(ImGuiTable* table, int instance_no) { if (instance_no == 0) return &table->InstanceDataFirst; return &table->InstanceDataExtra[instance_no - 1]; }
3312 inline ImGuiID TableGetInstanceID(ImGuiTable* table, int instance_no) { return TableGetInstanceData(table, instance_no)->TableInstanceID; }
3313 IMGUI_API void TableSortSpecsSanitize(ImGuiTable* table);
3314 IMGUI_API void TableSortSpecsBuild(ImGuiTable* table);
3315 IMGUI_API ImGuiSortDirection TableGetColumnNextSortDirection(ImGuiTableColumn* column);
3316 IMGUI_API void TableFixColumnSortDirection(ImGuiTable* table, ImGuiTableColumn* column);
3317 IMGUI_API float TableGetColumnWidthAuto(ImGuiTable* table, ImGuiTableColumn* column);
3318 IMGUI_API void TableBeginRow(ImGuiTable* table);
3319 IMGUI_API void TableEndRow(ImGuiTable* table);
3320 IMGUI_API void TableBeginCell(ImGuiTable* table, int column_n);
3321 IMGUI_API void TableEndCell(ImGuiTable* table);
3322 IMGUI_API ImRect TableGetCellBgRect(const ImGuiTable* table, int column_n);
3323 IMGUI_API const char* TableGetColumnName(const ImGuiTable* table, int column_n);
3324 IMGUI_API ImGuiID TableGetColumnResizeID(ImGuiTable* table, int column_n, int instance_no = 0);
3325 IMGUI_API float TableCalcMaxColumnWidth(const ImGuiTable* table, int column_n);
3326 IMGUI_API void TableSetColumnWidthAutoSingle(ImGuiTable* table, int column_n);
3327 IMGUI_API void TableSetColumnWidthAutoAll(ImGuiTable* table);
3328 IMGUI_API void TableRemove(ImGuiTable* table);
3329 IMGUI_API void TableGcCompactTransientBuffers(ImGuiTable* table);
3330 IMGUI_API void TableGcCompactTransientBuffers(ImGuiTableTempData* table);
3331 IMGUI_API void TableGcCompactSettings();
3332
3333 // Tables: Settings
3334 IMGUI_API void TableLoadSettings(ImGuiTable* table);
3335 IMGUI_API void TableSaveSettings(ImGuiTable* table);
3336 IMGUI_API void TableResetSettings(ImGuiTable* table);
3337 IMGUI_API ImGuiTableSettings* TableGetBoundSettings(ImGuiTable* table);
3338 IMGUI_API void TableSettingsAddSettingsHandler();
3339 IMGUI_API ImGuiTableSettings* TableSettingsCreate(ImGuiID id, int columns_count);
3340 IMGUI_API ImGuiTableSettings* TableSettingsFindByID(ImGuiID id);
3341
3342 // Tab Bars
3343 inline ImGuiTabBar* GetCurrentTabBar() { ImGuiContext& g = *GImGui; return g.CurrentTabBar; }
3344 IMGUI_API bool BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& bb, ImGuiTabBarFlags flags);
3345 IMGUI_API ImGuiTabItem* TabBarFindTabByID(ImGuiTabBar* tab_bar, ImGuiID tab_id);
3346 IMGUI_API ImGuiTabItem* TabBarFindTabByOrder(ImGuiTabBar* tab_bar, int order);
3347 IMGUI_API ImGuiTabItem* TabBarGetCurrentTab(ImGuiTabBar* tab_bar);
3348 inline int TabBarGetTabOrder(ImGuiTabBar* tab_bar, ImGuiTabItem* tab) { return tab_bar->Tabs.index_from_ptr(tab); }
3349 IMGUI_API const char* TabBarGetTabName(ImGuiTabBar* tab_bar, ImGuiTabItem* tab);
3350 IMGUI_API void TabBarRemoveTab(ImGuiTabBar* tab_bar, ImGuiID tab_id);
3351 IMGUI_API void TabBarCloseTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab);
3352 IMGUI_API void TabBarQueueFocus(ImGuiTabBar* tab_bar, ImGuiTabItem* tab);
3353 IMGUI_API void TabBarQueueFocus(ImGuiTabBar* tab_bar, const char* tab_name);
3354 IMGUI_API void TabBarQueueReorder(ImGuiTabBar* tab_bar, ImGuiTabItem* tab, int offset);
3355 IMGUI_API void TabBarQueueReorderFromMousePos(ImGuiTabBar* tab_bar, ImGuiTabItem* tab, ImVec2 mouse_pos);
3356 IMGUI_API bool TabBarProcessReorder(ImGuiTabBar* tab_bar);
3357 IMGUI_API bool TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, ImGuiTabItemFlags flags, ImGuiWindow* docked_window);
3358 IMGUI_API ImVec2 TabItemCalcSize(const char* label, bool has_close_button_or_unsaved_marker);
3359 IMGUI_API ImVec2 TabItemCalcSize(ImGuiWindow* window);
3360 IMGUI_API void TabItemBackground(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImU32 col);
3361 IMGUI_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);
3362
3363 // Render helpers
3364 // 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.
3365 // NB: All position are in absolute pixels coordinates (we are never using window coordinates internally)
3366 IMGUI_API void RenderText(ImVec2 pos, const char* text, const char* text_end = NULL, bool hide_text_after_hash = true);
3367 IMGUI_API void RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end, float wrap_width);
3368 IMGUI_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);
3369 IMGUI_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);
3370 IMGUI_API void RenderTextEllipsis(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, float clip_max_x, float ellipsis_max_x, const char* text, const char* text_end, const ImVec2* text_size_if_known);
3371 IMGUI_API void RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool borders = true, float rounding = 0.0f);
3372 IMGUI_API void RenderFrameBorder(ImVec2 p_min, ImVec2 p_max, float rounding = 0.0f);
3373 IMGUI_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);
3374 IMGUI_API void RenderNavCursor(const ImRect& bb, ImGuiID id, ImGuiNavRenderCursorFlags flags = ImGuiNavRenderCursorFlags_None); // Navigation highlight
3375#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
3376 inline void RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavRenderCursorFlags flags = ImGuiNavRenderCursorFlags_None) { RenderNavCursor(bb, id, flags); } // Renamed in 1.91.4
3377#endif
3378 IMGUI_API const char* FindRenderedTextEnd(const char* text, const char* text_end = NULL); // Find the optional ## from which we stop displaying text.
3379 IMGUI_API void RenderMouseCursor(ImVec2 pos, float scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow);
3380
3381 // Render helpers (those functions don't access any ImGui state!)
3382 IMGUI_API void RenderArrow(ImDrawList* draw_list, ImVec2 pos, ImU32 col, ImGuiDir dir, float scale = 1.0f);
3383 IMGUI_API void RenderBullet(ImDrawList* draw_list, ImVec2 pos, ImU32 col);
3384 IMGUI_API void RenderCheckMark(ImDrawList* draw_list, ImVec2 pos, ImU32 col, float sz);
3385 IMGUI_API void RenderArrowPointingAt(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, ImGuiDir direction, ImU32 col);
3386 IMGUI_API void RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, ImU32 col, float x_start_norm, float x_end_norm, float rounding);
3387 IMGUI_API void RenderRectFilledWithHole(ImDrawList* draw_list, const ImRect& outer, const ImRect& inner, ImU32 col, float rounding);
3388
3389 // Widgets
3390 IMGUI_API void TextEx(const char* text, const char* text_end = NULL, ImGuiTextFlags flags = 0);
3391 IMGUI_API bool ButtonEx(const char* label, const ImVec2& size_arg = ImVec2(0, 0), ImGuiButtonFlags flags = 0);
3392 IMGUI_API bool ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size_arg, ImGuiButtonFlags flags = 0);
3393 IMGUI_API bool ImageButtonEx(ImGuiID id, ImTextureID user_texture_id, const ImVec2& image_size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& bg_col, const ImVec4& tint_col, ImGuiButtonFlags flags = 0);
3394 IMGUI_API void SeparatorEx(ImGuiSeparatorFlags flags, float thickness = 1.0f);
3395 IMGUI_API void SeparatorTextEx(ImGuiID id, const char* label, const char* label_end, float extra_width);
3396 IMGUI_API bool CheckboxFlags(const char* label, ImS64* flags, ImS64 flags_value);
3397 IMGUI_API bool CheckboxFlags(const char* label, ImU64* flags, ImU64 flags_value);
3398
3399 // Widgets: Window Decorations
3400 IMGUI_API bool CloseButton(ImGuiID id, const ImVec2& pos);
3401 IMGUI_API bool CollapseButton(ImGuiID id, const ImVec2& pos);
3402 IMGUI_API void Scrollbar(ImGuiAxis axis);
3403 IMGUI_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);
3404 IMGUI_API ImRect GetWindowScrollbarRect(ImGuiWindow* window, ImGuiAxis axis);
3405 IMGUI_API ImGuiID GetWindowScrollbarID(ImGuiWindow* window, ImGuiAxis axis);
3406 IMGUI_API ImGuiID GetWindowResizeCornerID(ImGuiWindow* window, int n); // 0..3: corners
3407 IMGUI_API ImGuiID GetWindowResizeBorderID(ImGuiWindow* window, ImGuiDir dir);
3408
3409 // Widgets low-level behaviors
3410 IMGUI_API bool ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags = 0);
3411 IMGUI_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);
3412 IMGUI_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);
3413 IMGUI_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);
3414
3415 // Widgets: Tree Nodes
3416 IMGUI_API bool TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* label, const char* label_end = NULL);
3417 IMGUI_API void TreePushOverrideID(ImGuiID id);
3418 IMGUI_API bool TreeNodeGetOpen(ImGuiID storage_id);
3419 IMGUI_API void TreeNodeSetOpen(ImGuiID storage_id, bool open);
3420 IMGUI_API bool TreeNodeUpdateNextOpen(ImGuiID storage_id, ImGuiTreeNodeFlags flags); // Return open state. Consume previous SetNextItemOpen() data, if any. May return true when logging.
3421
3422 // Template functions are instantiated in imgui_widgets.cpp for a finite number of types.
3423 // 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).
3424 // e.g. " extern template IMGUI_API float RoundScalarWithFormatT<float, float>(const char* format, ImGuiDataType data_type, float v); "
3425 template<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);
3426 template<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);
3427 template<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);
3428 template<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);
3429 template<typename T> IMGUI_API T RoundScalarWithFormatT(const char* format, ImGuiDataType data_type, T v);
3430 template<typename T> IMGUI_API bool CheckboxFlagsT(const char* label, T* flags, T flags_value);
3431
3432 // Data type helpers
3433 IMGUI_API const ImGuiDataTypeInfo* DataTypeGetInfo(ImGuiDataType data_type);
3434 IMGUI_API int DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* p_data, const char* format);
3435 IMGUI_API void DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, const void* arg_1, const void* arg_2);
3436 IMGUI_API bool DataTypeApplyFromText(const char* buf, ImGuiDataType data_type, void* p_data, const char* format, void* p_data_when_empty = NULL);
3437 IMGUI_API int DataTypeCompare(ImGuiDataType data_type, const void* arg_1, const void* arg_2);
3438 IMGUI_API bool DataTypeClamp(ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max);
3439 IMGUI_API bool DataTypeIsZero(ImGuiDataType data_type, const void* p_data);
3440
3441 // InputText
3442 IMGUI_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);
3443 IMGUI_API void InputTextDeactivateHook(ImGuiID id);
3444 IMGUI_API bool TempInputText(const ImRect& bb, ImGuiID id, const char* label, char* buf, int buf_size, ImGuiInputTextFlags flags);
3445 IMGUI_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);
3446 inline bool TempInputIsActive(ImGuiID id) { ImGuiContext& g = *GImGui; return (g.ActiveId == id && g.TempInputId == id); }
3447 inline ImGuiInputTextState* GetInputTextState(ImGuiID id) { ImGuiContext& g = *GImGui; return (id != 0 && g.InputTextState.ID == id) ? &g.InputTextState : NULL; } // Get input text state if active
3448 IMGUI_API void SetNextItemRefVal(ImGuiDataType data_type, void* p_data);
3449
3450 // Color
3451 IMGUI_API void ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags flags);
3452 IMGUI_API void ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags);
3453 IMGUI_API void ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags flags);
3454
3455 // Plot
3456 IMGUI_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);
3457
3458 // Shade functions (write over already created vertices)
3459 IMGUI_API void ShadeVertsLinearColorGradientKeepAlpha(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, ImVec2 gradient_p0, ImVec2 gradient_p1, ImU32 col0, ImU32 col1);
3460 IMGUI_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);
3461 IMGUI_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);
3462
3463 // Garbage collection
3464 IMGUI_API void GcCompactTransientMiscBuffers();
3465 IMGUI_API void GcCompactTransientWindowBuffers(ImGuiWindow* window);
3466 IMGUI_API void GcAwakeTransientWindowBuffers(ImGuiWindow* window);
3467
3468 // Error handling, State Recovery
3469 IMGUI_API bool ErrorLog(const char* msg);
3470 IMGUI_API void ErrorRecoveryStoreState(ImGuiErrorRecoveryState* state_out);
3471 IMGUI_API void ErrorRecoveryTryToRecoverState(const ImGuiErrorRecoveryState* state_in);
3472 IMGUI_API void ErrorRecoveryTryToRecoverWindowState(const ImGuiErrorRecoveryState* state_in);
3473 IMGUI_API void ErrorCheckUsingSetCursorPosToExtendParentBoundaries();
3474 IMGUI_API void ErrorCheckEndFrameFinalizeErrorTooltip();
3475 IMGUI_API bool BeginErrorTooltip();
3476 IMGUI_API void EndErrorTooltip();
3477
3478 // Debug Tools
3479 IMGUI_API void DebugAllocHook(ImGuiDebugAllocInfo* info, int frame_count, void* ptr, size_t size); // size >= 0 : alloc, size = -1 : free
3480 IMGUI_API void DebugDrawCursorPos(ImU32 col = IM_COL32(255, 0, 0, 255));
3481 IMGUI_API void DebugDrawLineExtents(ImU32 col = IM_COL32(255, 0, 0, 255));
3482 IMGUI_API void DebugDrawItemRect(ImU32 col = IM_COL32(255, 0, 0, 255));
3483 IMGUI_API void DebugTextUnformattedWithLocateItem(const char* line_begin, const char* line_end);
3484 IMGUI_API void DebugLocateItem(ImGuiID target_id); // Call sparingly: only 1 at the same time!
3485 IMGUI_API void DebugLocateItemOnHover(ImGuiID target_id); // Only call on reaction to a mouse Hover: because only 1 at the same time!
3486 IMGUI_API void DebugLocateItemResolveWithLastItem();
3487 IMGUI_API void DebugBreakClearData();
3488 IMGUI_API bool DebugBreakButton(const char* label, const char* description_of_location);
3489 IMGUI_API void DebugBreakButtonTooltip(bool keyboard_only, const char* description_of_location);
3490 IMGUI_API void ShowFontAtlas(ImFontAtlas* atlas);
3491 IMGUI_API void DebugHookIdInfo(ImGuiID id, ImGuiDataType data_type, const void* data_id, const void* data_id_end);
3492 IMGUI_API void DebugNodeColumns(ImGuiOldColumns* columns);
3493 IMGUI_API void DebugNodeDrawList(ImGuiWindow* window, ImGuiViewportP* viewport, const ImDrawList* draw_list, const char* label);
3494 IMGUI_API void DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList* out_draw_list, const ImDrawList* draw_list, const ImDrawCmd* draw_cmd, bool show_mesh, bool show_aabb);
3495 IMGUI_API void DebugNodeFont(ImFont* font);
3496 IMGUI_API void DebugNodeFontGlyph(ImFont* font, const ImFontGlyph* glyph);
3497 IMGUI_API void DebugNodeStorage(ImGuiStorage* storage, const char* label);
3498 IMGUI_API void DebugNodeTabBar(ImGuiTabBar* tab_bar, const char* label);
3499 IMGUI_API void DebugNodeTable(ImGuiTable* table);
3500 IMGUI_API void DebugNodeTableSettings(ImGuiTableSettings* settings);
3501 IMGUI_API void DebugNodeInputTextState(ImGuiInputTextState* state);
3502 IMGUI_API void DebugNodeTypingSelectState(ImGuiTypingSelectState* state);
3503 IMGUI_API void DebugNodeMultiSelectState(ImGuiMultiSelectState* state);
3504 IMGUI_API void DebugNodeWindow(ImGuiWindow* window, const char* label);
3505 IMGUI_API void DebugNodeWindowSettings(ImGuiWindowSettings* settings);
3506 IMGUI_API void DebugNodeWindowsList(ImVector<ImGuiWindow*>* windows, const char* label);
3507 IMGUI_API void DebugNodeWindowsListByBeginStackParent(ImGuiWindow** windows, int windows_size, ImGuiWindow* parent_in_begin_stack);
3508 IMGUI_API void DebugNodeViewport(ImGuiViewportP* viewport);
3509 IMGUI_API void DebugRenderKeyboardPreview(ImDrawList* draw_list);
3510 IMGUI_API void DebugRenderViewportThumbnail(ImDrawList* draw_list, ImGuiViewportP* viewport, const ImRect& bb);
3511
3512 // Obsolete functions
3513#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
3514 //inline void SetItemUsingMouseWheel() { SetItemKeyOwner(ImGuiKey_MouseWheelY); } // Changed in 1.89
3515 //inline bool TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags = 0) { return TreeNodeUpdateNextOpen(id, flags); } // Renamed in 1.89
3516 //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!
3517
3518 // Refactored focus/nav/tabbing system in 1.82 and 1.84. If you have old/custom copy-and-pasted widgets which used FocusableItemRegister():
3519 // (Old) IMGUI_VERSION_NUM < 18209: using 'ItemAdd(....)' and 'bool tab_focused = FocusableItemRegister(...)'
3520 // (Old) IMGUI_VERSION_NUM >= 18209: using 'ItemAdd(..., ImGuiItemAddFlags_Focusable)' and 'bool tab_focused = (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_Focused) != 0'
3521 // (New) IMGUI_VERSION_NUM >= 18413: using 'ItemAdd(..., ImGuiItemFlags_Inputable)' and 'bool tab_focused = (g.NavActivateId == id && (g.NavActivateFlags & ImGuiActivateFlags_PreferInput))'
3522 //inline bool FocusableItemRegister(ImGuiWindow* window, ImGuiID id) // -> pass ImGuiItemAddFlags_Inputable flag to ItemAdd()
3523 //inline void FocusableItemUnregister(ImGuiWindow* window) // -> unnecessary: TempInputText() uses ImGuiInputTextFlags_MergedItem
3524#endif
3525
3526} // namespace ImGui
3527
3528
3529//-----------------------------------------------------------------------------
3530// [SECTION] ImFontAtlas internal API
3531//-----------------------------------------------------------------------------
3532
3533// This structure is likely to evolve as we add support for incremental atlas updates.
3534// Conceptually this could be in ImGuiPlatformIO, but we are far from ready to make this public.
3536{
3537 bool (*FontBuilder_Build)(ImFontAtlas* atlas);
3538};
3539
3540// Helper for font builder
3541#ifdef IMGUI_ENABLE_STB_TRUETYPE
3542IMGUI_API const ImFontBuilderIO* ImFontAtlasGetBuilderForStbTruetype();
3543#endif
3544IMGUI_API void ImFontAtlasUpdateConfigDataPointers(ImFontAtlas* atlas);
3545IMGUI_API void ImFontAtlasBuildInit(ImFontAtlas* atlas);
3546IMGUI_API void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* font_config, float ascent, float descent);
3547IMGUI_API void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* stbrp_context_opaque);
3548IMGUI_API void ImFontAtlasBuildFinish(ImFontAtlas* atlas);
3549IMGUI_API void ImFontAtlasBuildRender8bppRectFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char, unsigned char in_marker_pixel_value);
3550IMGUI_API void ImFontAtlasBuildRender32bppRectFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char, unsigned int in_marker_pixel_value);
3551IMGUI_API void ImFontAtlasBuildMultiplyCalcLookupTable(unsigned char out_table[256], float in_multiply_factor);
3552IMGUI_API void ImFontAtlasBuildMultiplyRectAlpha8(const unsigned char table[256], unsigned char* pixels, int x, int y, int w, int h, int stride);
3553
3554//-----------------------------------------------------------------------------
3555// [SECTION] Test Engine specific hooks (imgui_test_engine)
3556//-----------------------------------------------------------------------------
3557
3558#ifdef IMGUI_ENABLE_TEST_ENGINE
3559extern void ImGuiTestEngineHook_ItemAdd(ImGuiContext* ctx, ImGuiID id, const ImRect& bb, const ImGuiLastItemData* item_data); // item_data may be NULL
3560extern void ImGuiTestEngineHook_ItemInfo(ImGuiContext* ctx, ImGuiID id, const char* label, ImGuiItemStatusFlags flags);
3561extern void ImGuiTestEngineHook_Log(ImGuiContext* ctx, const char* fmt, ...);
3562extern const char* ImGuiTestEngine_FindItemDebugLabel(ImGuiContext* ctx, ImGuiID id);
3563
3564// In IMGUI_VERSION_NUM >= 18934: changed IMGUI_TEST_ENGINE_ITEM_ADD(bb,id) to IMGUI_TEST_ENGINE_ITEM_ADD(id,bb,item_data);
3565#define IMGUI_TEST_ENGINE_ITEM_ADD(_ID,_BB,_ITEM_DATA) if (g.TestEngineHookItems) ImGuiTestEngineHook_ItemAdd(&g, _ID, _BB, _ITEM_DATA) // Register item bounding box
3566#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)
3567#define IMGUI_TEST_ENGINE_LOG(_FMT,...) ImGuiTestEngineHook_Log(&g, _FMT, __VA_ARGS__) // Custom log entry from user land into test log
3568#else
3569#define IMGUI_TEST_ENGINE_ITEM_ADD(_BB,_ID) ((void)0)
3570#define IMGUI_TEST_ENGINE_ITEM_INFO(_ID,_LABEL,_FLAGS) ((void)g)
3571#endif
3572
3573//-----------------------------------------------------------------------------
3574
3575#if defined(__clang__)
3576#pragma clang diagnostic pop
3577#elif defined(__GNUC__)
3578#pragma GCC diagnostic pop
3579#endif
3580
3581#ifdef _MSC_VER
3582#pragma warning (pop)
3583#endif
3584
3585#endif // #ifndef IMGUI_DISABLE
Definition imgui_internal.h:589
Definition imgui_internal.h:604
Definition imgui_internal.h:705
Definition imgui_internal.h:793
Definition imgui.h:3205
Definition imgui.h:3052
Definition imgui_internal.h:771
Definition imgui.h:2997
Definition imgui.h:3327
Definition imgui_internal.h:3536
Definition imgui.h:3229
Definition imgui.h:3431
Definition imgui_internal.h:1730
Definition imgui_internal.h:1033
Definition imgui_internal.h:1050
Definition imgui_internal.h:2015
Definition imgui_internal.h:2030
Definition imgui_internal.h:819
Definition imgui_internal.h:813
Definition imgui_internal.h:805
Definition imgui_internal.h:1950
Definition imgui_internal.h:1957
Definition imgui_internal.h:1275
Definition imgui_internal.h:1627
Definition imgui_internal.h:1063
Definition imgui_internal.h:1996
Definition imgui.h:2209
Definition imgui_internal.h:1399
Definition imgui_internal.h:1397
Definition imgui_internal.h:1396
Definition imgui_internal.h:1394
Definition imgui_internal.h:1395
Definition imgui_internal.h:1398
Definition imgui_internal.h:1099
Definition imgui_internal.h:1121
Definition imgui_internal.h:1455
Definition imgui_internal.h:1443
Definition imgui_internal.h:1247
Definition imgui.h:2655
Definition imgui_internal.h:1512
Definition imgui_internal.h:1901
Definition imgui_internal.h:1081
Definition imgui_internal.h:1967
Definition imgui.h:2833
Definition imgui_internal.h:1787
Definition imgui_internal.h:1762
Definition imgui_internal.h:1610
Definition imgui_internal.h:1227
Definition imgui_internal.h:1193
Definition imgui_internal.h:1695
Definition imgui_internal.h:1705
Definition imgui.h:2491
Definition imgui.h:3530
Definition imgui.h:3568
Definition imgui_internal.h:1329
Definition imgui_internal.h:1866
Definition imgui_internal.h:1301
Definition imgui.h:2598
Definition imgui.h:2581
Definition imgui.h:2124
Definition imgui_internal.h:1040
Definition imgui_internal.h:2616
Definition imgui_internal.h:2597
Definition imgui_internal.h:2731
Definition imgui_internal.h:2671
Definition imgui_internal.h:2910
Definition imgui.h:2000
Definition imgui_internal.h:2740
Definition imgui_internal.h:2763
Definition imgui_internal.h:2750
Definition imgui_internal.h:2934
Definition imgui.h:1990
Definition imgui_internal.h:2887
Definition imgui.h:2561
Definition imgui_internal.h:724
Definition imgui_internal.h:1266
Definition imgui_internal.h:1646
Definition imgui_internal.h:1657
Definition imgui_internal.h:1815
Definition imgui_internal.h:2452
Definition imgui_internal.h:1852
Definition imgui_internal.h:1293
Definition imgui_internal.h:2402
Definition imgui_internal.h:671
Definition imgui_internal.h:526
Definition imgui_internal.h:618
Definition imgui_internal.h:508
Definition imgui.h:292
Definition imgui_internal.h:516
Definition imgui.h:305
Definition imgui.h:2052
Definition imstb_textedit.h:330