dart
imgui_internal.h
1 // dear imgui, v1.82
2 // (internal structures/api)
3 
4 // You may use this file to debug, understand or extend ImGui features but we don't provide any guarantee of forward compatibility!
5 // Set:
6 // #define IMGUI_DEFINE_MATH_OPERATORS
7 // To implement maths operators for ImVec2 (disabled by default to not collide with using IM_VEC2_CLASS_EXTRA along with your own math types+operators)
8 
9 /*
10 
11 Index of this file:
12 
13 // [SECTION] Header mess
14 // [SECTION] Forward declarations
15 // [SECTION] Context pointer
16 // [SECTION] STB libraries includes
17 // [SECTION] Macros
18 // [SECTION] Generic helpers
19 // [SECTION] ImDrawList support
20 // [SECTION] Widgets support: flags, enums, data structures
21 // [SECTION] Columns support
22 // [SECTION] Multi-select support
23 // [SECTION] Docking support
24 // [SECTION] Viewport support
25 // [SECTION] Settings support
26 // [SECTION] Metrics, Debug
27 // [SECTION] Generic context hooks
28 // [SECTION] ImGuiContext (main imgui context)
29 // [SECTION] ImGuiWindowTempData, ImGuiWindow
30 // [SECTION] Tab bar, Tab item support
31 // [SECTION] Table support
32 // [SECTION] ImGui internal API
33 // [SECTION] ImFontAtlas internal API
34 // [SECTION] Test Engine specific hooks (imgui_test_engine)
35 
36 */
37 
38 #pragma once
39 #ifndef IMGUI_DISABLE
40 
41 //-----------------------------------------------------------------------------
42 // [SECTION] Header mess
43 //-----------------------------------------------------------------------------
44 
45 #ifndef IMGUI_VERSION
46 #error Must include imgui.h before imgui_internal.h
47 #endif
48 
49 #include <stdio.h> // FILE*, sscanf
50 #include <stdlib.h> // NULL, malloc, free, qsort, atoi, atof
51 #include <math.h> // sqrtf, fabsf, fmodf, powf, floorf, ceilf, cosf, sinf
52 #include <limits.h> // INT_MIN, INT_MAX
53 
54 // Visual Studio warnings
55 #ifdef _MSC_VER
56 #pragma warning (push)
57 #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)
58 #endif
59 
60 // Clang/GCC warnings with -Weverything
61 #if defined(__clang__)
62 #pragma clang diagnostic push
63 #if __has_warning("-Wunknown-warning-option")
64 #pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx'
65 #endif
66 #pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx'
67 #pragma clang diagnostic ignored "-Wunused-function" // for stb_textedit.h
68 #pragma clang diagnostic ignored "-Wmissing-prototypes" // for stb_textedit.h
69 #pragma clang diagnostic ignored "-Wold-style-cast"
70 #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
71 #pragma clang diagnostic ignored "-Wdouble-promotion"
72 #pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision
73 #elif defined(__GNUC__)
74 #pragma GCC diagnostic push
75 #pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind
76 #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
77 #endif
78 
79 // Legacy defines
80 #ifdef IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS // Renamed in 1.74
81 #error Use IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS
82 #endif
83 #ifdef IMGUI_DISABLE_MATH_FUNCTIONS // Renamed in 1.74
84 #error Use IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS
85 #endif
86 
87 // Enable stb_truetype by default unless FreeType is enabled.
88 // You can compile with both by defining both IMGUI_ENABLE_FREETYPE and IMGUI_ENABLE_STB_TRUETYPE together.
89 #ifndef IMGUI_ENABLE_FREETYPE
90 #define IMGUI_ENABLE_STB_TRUETYPE
91 #endif
92 
93 //-----------------------------------------------------------------------------
94 // [SECTION] Forward declarations
95 //-----------------------------------------------------------------------------
96 
97 struct ImBitVector; // Store 1-bit per value
98 struct ImRect; // An axis-aligned rectangle (2 points)
99 struct ImDrawDataBuilder; // Helper to build a ImDrawData instance
100 struct ImDrawListSharedData; // Data shared between all ImDrawList instances
101 struct ImGuiColorMod; // Stacked color modifier, backup of modified data so we can restore it
102 struct ImGuiContext; // Main Dear ImGui context
103 struct ImGuiContextHook; // Hook for extensions like ImGuiTestEngine
104 struct ImGuiDataTypeInfo; // Type information associated to a ImGuiDataType enum
105 struct ImGuiGroupData; // Stacked storage data for BeginGroup()/EndGroup()
106 struct ImGuiInputTextState; // Internal state of the currently focused/edited text input box
107 struct ImGuiLastItemDataBackup; // Backup and restore IsItemHovered() internal data
108 struct ImGuiMenuColumns; // Simple column measurement, currently used for MenuItem() only
109 struct ImGuiNavMoveResult; // Result of a gamepad/keyboard directional navigation move query result
110 struct ImGuiMetricsConfig; // Storage for ShowMetricsWindow() and DebugNodeXXX() functions
111 struct ImGuiNextWindowData; // Storage for SetNextWindow** functions
112 struct ImGuiNextItemData; // Storage for SetNextItem** functions
113 struct ImGuiOldColumnData; // Storage data for a single column for legacy Columns() api
114 struct ImGuiOldColumns; // Storage data for a columns set for legacy Columns() api
115 struct ImGuiPopupData; // Storage for current popup stack
116 struct ImGuiSettingsHandler; // Storage for one type registered in the .ini file
117 struct ImGuiStackSizes; // Storage of stack sizes for debugging/asserting
118 struct ImGuiStyleMod; // Stacked style modifier, backup of modified data so we can restore it
119 struct ImGuiTabBar; // Storage for a tab bar
120 struct ImGuiTabItem; // Storage for a tab item (within a tab bar)
121 struct ImGuiTable; // Storage for a table
122 struct ImGuiTableColumn; // Storage for one column of a table
123 struct ImGuiTableSettings; // Storage for a table .ini settings
124 struct ImGuiTableColumnsSettings; // Storage for a column .ini settings
125 struct ImGuiWindow; // Storage for one window
126 struct ImGuiWindowTempData; // Temporary storage for one window (that's the data which in theory we could ditch at the end of the frame)
127 struct ImGuiWindowSettings; // Storage for a window .ini settings (we keep one of those even if the actual window wasn't instanced during this session)
128 
129 // Use your programming IDE "Go to definition" facility on the names of the center columns to find the actual flags/enum lists.
130 typedef int ImGuiLayoutType; // -> enum ImGuiLayoutType_ // Enum: Horizontal or vertical
131 typedef int ImGuiItemFlags; // -> enum ImGuiItemFlags_ // Flags: for PushItemFlag()
132 typedef int ImGuiItemStatusFlags; // -> enum ImGuiItemStatusFlags_ // Flags: for DC.LastItemStatusFlags
133 typedef int ImGuiOldColumnFlags; // -> enum ImGuiOldColumnFlags_ // Flags: for BeginColumns()
134 typedef int ImGuiNavHighlightFlags; // -> enum ImGuiNavHighlightFlags_ // Flags: for RenderNavHighlight()
135 typedef int ImGuiNavDirSourceFlags; // -> enum ImGuiNavDirSourceFlags_ // Flags: for GetNavInputAmount2d()
136 typedef int ImGuiNavMoveFlags; // -> enum ImGuiNavMoveFlags_ // Flags: for navigation requests
137 typedef int ImGuiNextItemDataFlags; // -> enum ImGuiNextItemDataFlags_ // Flags: for SetNextItemXXX() functions
138 typedef int ImGuiNextWindowDataFlags; // -> enum ImGuiNextWindowDataFlags_// Flags: for SetNextWindowXXX() functions
139 typedef int ImGuiSeparatorFlags; // -> enum ImGuiSeparatorFlags_ // Flags: for SeparatorEx()
140 typedef int ImGuiTextFlags; // -> enum ImGuiTextFlags_ // Flags: for TextEx()
141 typedef int ImGuiTooltipFlags; // -> enum ImGuiTooltipFlags_ // Flags: for BeginTooltipEx()
142 
143 typedef void (*ImGuiErrorLogCallback)(void* user_data, const char* fmt, ...);
144 
145 //-----------------------------------------------------------------------------
146 // [SECTION] Context pointer
147 // See implementation of this variable in imgui.cpp for comments and details.
148 //-----------------------------------------------------------------------------
149 
150 #ifndef GImGui
151 extern IMGUI_API ImGuiContext* GImGui; // Current implicit context pointer
152 #endif
153 
154 //-------------------------------------------------------------------------
155 // [SECTION] STB libraries includes
156 //-------------------------------------------------------------------------
157 
158 namespace ImStb
159 {
160 
161 #undef STB_TEXTEDIT_STRING
162 #undef STB_TEXTEDIT_CHARTYPE
163 #define STB_TEXTEDIT_STRING ImGuiInputTextState
164 #define STB_TEXTEDIT_CHARTYPE ImWchar
165 #define STB_TEXTEDIT_GETWIDTH_NEWLINE (-1.0f)
166 #define STB_TEXTEDIT_UNDOSTATECOUNT 99
167 #define STB_TEXTEDIT_UNDOCHARCOUNT 999
168 #include "imstb_textedit.h"
169 
170 } // namespace ImStb
171 
172 //-----------------------------------------------------------------------------
173 // [SECTION] Macros
174 //-----------------------------------------------------------------------------
175 
176 // Debug Logging
177 #ifndef IMGUI_DEBUG_LOG
178 #define IMGUI_DEBUG_LOG(_FMT,...) printf("[%05d] " _FMT, GImGui->FrameCount, __VA_ARGS__)
179 #endif
180 
181 // Debug Logging for selected systems. Remove the '((void)0) //' to enable.
182 //#define IMGUI_DEBUG_LOG_POPUP IMGUI_DEBUG_LOG // Enable log
183 //#define IMGUI_DEBUG_LOG_NAV IMGUI_DEBUG_LOG // Enable log
184 #define IMGUI_DEBUG_LOG_POPUP(...) ((void)0) // Disable log
185 #define IMGUI_DEBUG_LOG_NAV(...) ((void)0) // Disable log
186 
187 // Static Asserts
188 #if (__cplusplus >= 201100) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201100)
189 #define IM_STATIC_ASSERT(_COND) static_assert(_COND, "")
190 #else
191 #define IM_STATIC_ASSERT(_COND) typedef char static_assertion_##__line__[(_COND)?1:-1]
192 #endif
193 
194 // "Paranoid" Debug Asserts are meant to only be enabled during specific debugging/work, otherwise would slow down the code too much.
195 // 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.
196 //#define IMGUI_DEBUG_PARANOID
197 #ifdef IMGUI_DEBUG_PARANOID
198 #define IM_ASSERT_PARANOID(_EXPR) IM_ASSERT(_EXPR)
199 #else
200 #define IM_ASSERT_PARANOID(_EXPR)
201 #endif
202 
203 // Error handling
204 // Down the line in some frameworks/languages we would like to have a way to redirect those to the programmer and recover from more faults.
205 #ifndef IM_ASSERT_USER_ERROR
206 #define IM_ASSERT_USER_ERROR(_EXP,_MSG) IM_ASSERT((_EXP) && _MSG) // Recoverable User Error
207 #endif
208 
209 // Misc Macros
210 #define IM_PI 3.14159265358979323846f
211 #ifdef _WIN32
212 #define IM_NEWLINE "\r\n" // Play it nice with Windows users (Update: since 2018-05, Notepad finally appears to support Unix-style carriage returns!)
213 #else
214 #define IM_NEWLINE "\n"
215 #endif
216 #define IM_TABSIZE (4)
217 #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
218 #define IM_F32_TO_INT8_UNBOUND(_VAL) ((int)((_VAL) * 255.0f + ((_VAL)>=0 ? 0.5f : -0.5f))) // Unsaturated, for display purpose
219 #define IM_F32_TO_INT8_SAT(_VAL) ((int)(ImSaturate(_VAL) * 255.0f + 0.5f)) // Saturated, always output 0..255
220 #define IM_FLOOR(_VAL) ((float)(int)(_VAL)) // ImFloor() is not inlined in MSVC debug builds
221 #define IM_ROUND(_VAL) ((float)(int)((_VAL) + 0.5f)) //
222 
223 // Enforce cdecl calling convention for functions called by the standard library, in case compilation settings changed the default to e.g. __vectorcall
224 #ifdef _MSC_VER
225 #define IMGUI_CDECL __cdecl
226 #else
227 #define IMGUI_CDECL
228 #endif
229 
230 // Debug Tools
231 // Use 'Metrics->Tools->Item Picker' to break into the call-stack of a specific item.
232 #ifndef IM_DEBUG_BREAK
233 #if defined(__clang__)
234 #define IM_DEBUG_BREAK() __builtin_debugtrap()
235 #elif defined (_MSC_VER)
236 #define IM_DEBUG_BREAK() __debugbreak()
237 #else
238 #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!
239 #endif
240 #endif // #ifndef IM_DEBUG_BREAK
241 
242 //-----------------------------------------------------------------------------
243 // [SECTION] Generic helpers
244 // Note that the ImXXX helpers functions are lower-level than ImGui functions.
245 // ImGui functions or the ImGui context are never called/used from other ImXXX functions.
246 //-----------------------------------------------------------------------------
247 // - Helpers: Hashing
248 // - Helpers: Sorting
249 // - Helpers: Bit manipulation
250 // - Helpers: String, Formatting
251 // - Helpers: UTF-8 <> wchar conversions
252 // - Helpers: ImVec2/ImVec4 operators
253 // - Helpers: Maths
254 // - Helpers: Geometry
255 // - Helper: ImVec1
256 // - Helper: ImVec2ih
257 // - Helper: ImRect
258 // - Helper: ImBitArray
259 // - Helper: ImBitVector
260 // - Helper: ImSpan<>, ImSpanAllocator<>
261 // - Helper: ImPool<>
262 // - Helper: ImChunkStream<>
263 //-----------------------------------------------------------------------------
264 
265 // Helpers: Hashing
266 IMGUI_API ImGuiID ImHashData(const void* data, size_t data_size, ImU32 seed = 0);
267 IMGUI_API ImGuiID ImHashStr(const char* data, size_t data_size = 0, ImU32 seed = 0);
268 #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
269 static inline ImGuiID ImHash(const void* data, int size, ImU32 seed = 0) { return size ? ImHashData(data, (size_t)size, seed) : ImHashStr((const char*)data, 0, seed); } // [moved to ImHashStr/ImHashData in 1.68]
270 #endif
271 
272 // Helpers: Sorting
273 #define ImQsort qsort
274 
275 // Helpers: Color Blending
276 IMGUI_API ImU32 ImAlphaBlendColors(ImU32 col_a, ImU32 col_b);
277 
278 // Helpers: Bit manipulation
279 static inline bool ImIsPowerOfTwo(int v) { return v != 0 && (v & (v - 1)) == 0; }
280 static inline bool ImIsPowerOfTwo(ImU64 v) { return v != 0 && (v & (v - 1)) == 0; }
281 static inline int ImUpperPowerOfTwo(int v) { v--; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v++; return v; }
282 
283 // Helpers: String, Formatting
284 IMGUI_API int ImStricmp(const char* str1, const char* str2);
285 IMGUI_API int ImStrnicmp(const char* str1, const char* str2, size_t count);
286 IMGUI_API void ImStrncpy(char* dst, const char* src, size_t count);
287 IMGUI_API char* ImStrdup(const char* str);
288 IMGUI_API char* ImStrdupcpy(char* dst, size_t* p_dst_size, const char* str);
289 IMGUI_API const char* ImStrchrRange(const char* str_begin, const char* str_end, char c);
290 IMGUI_API int ImStrlenW(const ImWchar* str);
291 IMGUI_API const char* ImStreolRange(const char* str, const char* str_end); // End end-of-line
292 IMGUI_API const ImWchar*ImStrbolW(const ImWchar* buf_mid_line, const ImWchar* buf_begin); // Find beginning-of-line
293 IMGUI_API const char* ImStristr(const char* haystack, const char* haystack_end, const char* needle, const char* needle_end);
294 IMGUI_API void ImStrTrimBlanks(char* str);
295 IMGUI_API const char* ImStrSkipBlank(const char* str);
296 IMGUI_API int ImFormatString(char* buf, size_t buf_size, const char* fmt, ...) IM_FMTARGS(3);
297 IMGUI_API int ImFormatStringV(char* buf, size_t buf_size, const char* fmt, va_list args) IM_FMTLIST(3);
298 IMGUI_API const char* ImParseFormatFindStart(const char* format);
299 IMGUI_API const char* ImParseFormatFindEnd(const char* format);
300 IMGUI_API const char* ImParseFormatTrimDecorations(const char* format, char* buf, size_t buf_size);
301 IMGUI_API int ImParseFormatPrecision(const char* format, int default_value);
302 static inline bool ImCharIsBlankA(char c) { return c == ' ' || c == '\t'; }
303 static inline bool ImCharIsBlankW(unsigned int c) { return c == ' ' || c == '\t' || c == 0x3000; }
304 
305 // Helpers: UTF-8 <> wchar conversions
306 IMGUI_API int ImTextStrToUtf8(char* buf, int buf_size, const ImWchar* in_text, const ImWchar* in_text_end); // return output UTF-8 bytes count
307 IMGUI_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
308 IMGUI_API int ImTextStrFromUtf8(ImWchar* buf, int buf_size, const char* in_text, const char* in_text_end, const char** in_remaining = NULL); // return input UTF-8 bytes count
309 IMGUI_API int ImTextCountCharsFromUtf8(const char* in_text, const char* in_text_end); // return number of UTF-8 code-points (NOT bytes count)
310 IMGUI_API int ImTextCountUtf8BytesFromChar(const char* in_text, const char* in_text_end); // return number of bytes to express one char in UTF-8
311 IMGUI_API int ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_end); // return number of bytes to express string in UTF-8
312 
313 // Helpers: ImVec2/ImVec4 operators
314 // We are keeping those disabled by default so they don't leak in user space, to allow user enabling implicit cast operators between ImVec2 and their own types (using IM_VEC2_CLASS_EXTRA etc.)
315 // We unfortunately don't have a unary- operator for ImVec2 because this would needs to be defined inside the class itself.
316 #ifdef IMGUI_DEFINE_MATH_OPERATORS
317 static inline ImVec2 operator*(const ImVec2& lhs, const float rhs) { return ImVec2(lhs.x * rhs, lhs.y * rhs); }
318 static inline ImVec2 operator/(const ImVec2& lhs, const float rhs) { return ImVec2(lhs.x / rhs, lhs.y / rhs); }
319 static inline ImVec2 operator+(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x + rhs.x, lhs.y + rhs.y); }
320 static inline ImVec2 operator-(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x - rhs.x, lhs.y - rhs.y); }
321 static inline ImVec2 operator*(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x * rhs.x, lhs.y * rhs.y); }
322 static inline ImVec2 operator/(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x / rhs.x, lhs.y / rhs.y); }
323 static inline ImVec2& operator*=(ImVec2& lhs, const float rhs) { lhs.x *= rhs; lhs.y *= rhs; return lhs; }
324 static inline ImVec2& operator/=(ImVec2& lhs, const float rhs) { lhs.x /= rhs; lhs.y /= rhs; return lhs; }
325 static inline ImVec2& operator+=(ImVec2& lhs, const ImVec2& rhs) { lhs.x += rhs.x; lhs.y += rhs.y; return lhs; }
326 static inline ImVec2& operator-=(ImVec2& lhs, const ImVec2& rhs) { lhs.x -= rhs.x; lhs.y -= rhs.y; return lhs; }
327 static inline ImVec2& operator*=(ImVec2& lhs, const ImVec2& rhs) { lhs.x *= rhs.x; lhs.y *= rhs.y; return lhs; }
328 static inline ImVec2& operator/=(ImVec2& lhs, const ImVec2& rhs) { lhs.x /= rhs.x; lhs.y /= rhs.y; return lhs; }
329 static inline ImVec4 operator+(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x + rhs.x, lhs.y + rhs.y, lhs.z + rhs.z, lhs.w + rhs.w); }
330 static inline ImVec4 operator-(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x - rhs.x, lhs.y - rhs.y, lhs.z - rhs.z, lhs.w - rhs.w); }
331 static inline ImVec4 operator*(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x * rhs.x, lhs.y * rhs.y, lhs.z * rhs.z, lhs.w * rhs.w); }
332 #endif
333 
334 // Helpers: File System
335 #ifdef IMGUI_DISABLE_FILE_FUNCTIONS
336 #define IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS
337 typedef void* ImFileHandle;
338 static inline ImFileHandle ImFileOpen(const char*, const char*) { return NULL; }
339 static inline bool ImFileClose(ImFileHandle) { return false; }
340 static inline ImU64 ImFileGetSize(ImFileHandle) { return (ImU64)-1; }
341 static inline ImU64 ImFileRead(void*, ImU64, ImU64, ImFileHandle) { return 0; }
342 static inline ImU64 ImFileWrite(const void*, ImU64, ImU64, ImFileHandle) { return 0; }
343 #endif
344 #ifndef IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS
345 typedef FILE* ImFileHandle;
346 IMGUI_API ImFileHandle ImFileOpen(const char* filename, const char* mode);
347 IMGUI_API bool ImFileClose(ImFileHandle file);
348 IMGUI_API ImU64 ImFileGetSize(ImFileHandle file);
349 IMGUI_API ImU64 ImFileRead(void* data, ImU64 size, ImU64 count, ImFileHandle file);
350 IMGUI_API ImU64 ImFileWrite(const void* data, ImU64 size, ImU64 count, ImFileHandle file);
351 #else
352 #define IMGUI_DISABLE_TTY_FUNCTIONS // Can't use stdout, fflush if we are not using default file functions
353 #endif
354 IMGUI_API void* ImFileLoadToMemory(const char* filename, const char* mode, size_t* out_file_size = NULL, int padding_bytes = 0);
355 
356 // Helpers: Maths
357 // - Wrapper for standard libs functions. (Note that imgui_demo.cpp does _not_ use them to keep the code easy to copy)
358 #ifndef IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS
359 #define ImFabs(X) fabsf(X)
360 #define ImSqrt(X) sqrtf(X)
361 #define ImFmod(X, Y) fmodf((X), (Y))
362 #define ImCos(X) cosf(X)
363 #define ImSin(X) sinf(X)
364 #define ImAcos(X) acosf(X)
365 #define ImAtan2(Y, X) atan2f((Y), (X))
366 #define ImAtof(STR) atof(STR)
367 #define ImFloorStd(X) floorf(X) // We already uses our own ImFloor() { return (float)(int)v } internally so the standard one wrapper is named differently (it's used by e.g. stb_truetype)
368 #define ImCeil(X) ceilf(X)
369 static inline float ImPow(float x, float y) { return powf(x, y); } // DragBehaviorT/SliderBehaviorT uses ImPow with either float/double and need the precision
370 static inline double ImPow(double x, double y) { return pow(x, y); }
371 static inline float ImLog(float x) { return logf(x); } // DragBehaviorT/SliderBehaviorT uses ImLog with either float/double and need the precision
372 static inline double ImLog(double x) { return log(x); }
373 static inline float ImAbs(float x) { return fabsf(x); }
374 static inline double ImAbs(double x) { return fabs(x); }
375 static 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
376 static inline double ImSign(double x) { return (x < 0.0) ? -1.0 : ((x > 0.0) ? 1.0 : 0.0); }
377 #endif
378 // - ImMin/ImMax/ImClamp/ImLerp/ImSwap are used by widgets which support variety of types: signed/unsigned int/long long float/double
379 // (Exceptionally using templates here but we could also redefine them for those types)
380 template<typename T> static inline T ImMin(T lhs, T rhs) { return lhs < rhs ? lhs : rhs; }
381 template<typename T> static inline T ImMax(T lhs, T rhs) { return lhs >= rhs ? lhs : rhs; }
382 template<typename T> static inline T ImClamp(T v, T mn, T mx) { return (v < mn) ? mn : (v > mx) ? mx : v; }
383 template<typename T> static inline T ImLerp(T a, T b, float t) { return (T)(a + (b - a) * t); }
384 template<typename T> static inline void ImSwap(T& a, T& b) { T tmp = a; a = b; b = tmp; }
385 template<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; }
386 template<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; }
387 // - Misc maths helpers
388 static 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); }
389 static 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); }
390 static inline ImVec2 ImClamp(const ImVec2& v, const ImVec2& mn, 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); }
391 static 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); }
392 static 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); }
393 static 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); }
394 static inline float ImSaturate(float f) { return (f < 0.0f) ? 0.0f : (f > 1.0f) ? 1.0f : f; }
395 static inline float ImLengthSqr(const ImVec2& lhs) { return (lhs.x * lhs.x) + (lhs.y * lhs.y); }
396 static inline float ImLengthSqr(const ImVec4& lhs) { return (lhs.x * lhs.x) + (lhs.y * lhs.y) + (lhs.z * lhs.z) + (lhs.w * lhs.w); }
397 static inline float ImInvLength(const ImVec2& lhs, float fail_value) { float d = (lhs.x * lhs.x) + (lhs.y * lhs.y); if (d > 0.0f) return 1.0f / ImSqrt(d); return fail_value; }
398 static inline float ImFloor(float f) { return (float)(int)(f); }
399 static inline ImVec2 ImFloor(const ImVec2& v) { return ImVec2((float)(int)(v.x), (float)(int)(v.y)); }
400 static inline int ImModPositive(int a, int b) { return (a + b) % b; }
401 static inline float ImDot(const ImVec2& a, const ImVec2& b) { return a.x * b.x + a.y * b.y; }
402 static 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); }
403 static 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; }
404 static inline ImVec2 ImMul(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x * rhs.x, lhs.y * rhs.y); }
405 
406 // Helpers: Geometry
407 IMGUI_API ImVec2 ImBezierCubicCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, float t);
408 IMGUI_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
409 IMGUI_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
410 IMGUI_API ImVec2 ImBezierQuadraticCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, float t);
411 IMGUI_API ImVec2 ImLineClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& p);
412 IMGUI_API bool ImTriangleContainsPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);
413 IMGUI_API ImVec2 ImTriangleClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);
414 IMGUI_API void ImTriangleBarycentricCoords(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p, float& out_u, float& out_v, float& out_w);
415 inline 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; }
416 IMGUI_API ImGuiDir ImGetDirQuadrantFromDelta(float dx, float dy);
417 
418 // Helper: ImVec1 (1D vector)
419 // (this odd construct is used to facilitate the transition between 1D and 2D, and the maintenance of some branches/patches)
420 struct ImVec1
421 {
422  float x;
423  ImVec1() { x = 0.0f; }
424  ImVec1(float _x) { x = _x; }
425 };
426 
427 // Helper: ImVec2ih (2D vector, half-size integer, for long-term packed storage)
428 struct ImVec2ih
429 {
430  short x, y;
431  ImVec2ih() { x = y = 0; }
432  ImVec2ih(short _x, short _y) { x = _x; y = _y; }
433  explicit ImVec2ih(const ImVec2& rhs) { x = (short)rhs.x; y = (short)rhs.y; }
434 };
435 
436 // Helper: ImRect (2D axis aligned bounding-box)
437 // NB: we can't rely on ImVec2 math operators being available here!
438 struct IMGUI_API ImRect
439 {
440  ImVec2 Min; // Upper-left
441  ImVec2 Max; // Lower-right
442 
443  ImRect() : Min(0.0f, 0.0f), Max(0.0f, 0.0f) {}
444  ImRect(const ImVec2& min, const ImVec2& max) : Min(min), Max(max) {}
445  ImRect(const ImVec4& v) : Min(v.x, v.y), Max(v.z, v.w) {}
446  ImRect(float x1, float y1, float x2, float y2) : Min(x1, y1), Max(x2, y2) {}
447 
448  ImVec2 GetCenter() const { return ImVec2((Min.x + Max.x) * 0.5f, (Min.y + Max.y) * 0.5f); }
449  ImVec2 GetSize() const { return ImVec2(Max.x - Min.x, Max.y - Min.y); }
450  float GetWidth() const { return Max.x - Min.x; }
451  float GetHeight() const { return Max.y - Min.y; }
452  float GetArea() const { return (Max.x - Min.x) * (Max.y - Min.y); }
453  ImVec2 GetTL() const { return Min; } // Top-left
454  ImVec2 GetTR() const { return ImVec2(Max.x, Min.y); } // Top-right
455  ImVec2 GetBL() const { return ImVec2(Min.x, Max.y); } // Bottom-left
456  ImVec2 GetBR() const { return Max; } // Bottom-right
457  bool Contains(const ImVec2& p) const { return p.x >= Min.x && p.y >= Min.y && p.x < Max.x && p.y < Max.y; }
458  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; }
459  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; }
460  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; }
461  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; }
462  void Expand(const float amount) { Min.x -= amount; Min.y -= amount; Max.x += amount; Max.y += amount; }
463  void Expand(const ImVec2& amount) { Min.x -= amount.x; Min.y -= amount.y; Max.x += amount.x; Max.y += amount.y; }
464  void Translate(const ImVec2& d) { Min.x += d.x; Min.y += d.y; Max.x += d.x; Max.y += d.y; }
465  void TranslateX(float dx) { Min.x += dx; Max.x += dx; }
466  void TranslateY(float dy) { Min.y += dy; Max.y += dy; }
467  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.
468  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.
469  void Floor() { Min.x = IM_FLOOR(Min.x); Min.y = IM_FLOOR(Min.y); Max.x = IM_FLOOR(Max.x); Max.y = IM_FLOOR(Max.y); }
470  bool IsInverted() const { return Min.x > Max.x || Min.y > Max.y; }
471  ImVec4 ToVec4() const { return ImVec4(Min.x, Min.y, Max.x, Max.y); }
472 };
473 
474 // Helper: ImBitArray
475 inline bool ImBitArrayTestBit(const ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); return (arr[n >> 5] & mask) != 0; }
476 inline void ImBitArrayClearBit(ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); arr[n >> 5] &= ~mask; }
477 inline void ImBitArraySetBit(ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); arr[n >> 5] |= mask; }
478 inline void ImBitArraySetBitRange(ImU32* arr, int n, int n2) // Works on range [n..n2)
479 {
480  n2--;
481  while (n <= n2)
482  {
483  int a_mod = (n & 31);
484  int b_mod = (n2 > (n | 31) ? 31 : (n2 & 31)) + 1;
485  ImU32 mask = (ImU32)(((ImU64)1 << b_mod) - 1) & ~(ImU32)(((ImU64)1 << a_mod) - 1);
486  arr[n >> 5] |= mask;
487  n = (n + 32) & ~31;
488  }
489 }
490 
491 // Helper: ImBitArray class (wrapper over ImBitArray functions)
492 // Store 1-bit per value. NOT CLEARED by constructor.
493 template<int BITCOUNT>
494 struct IMGUI_API ImBitArray
495 {
496  ImU32 Storage[(BITCOUNT + 31) >> 5];
497  ImBitArray() { }
498  void ClearAllBits() { memset(Storage, 0, sizeof(Storage)); }
499  void SetAllBits() { memset(Storage, 255, sizeof(Storage)); }
500  bool TestBit(int n) const { IM_ASSERT(n < BITCOUNT); return ImBitArrayTestBit(Storage, n); }
501  void SetBit(int n) { IM_ASSERT(n < BITCOUNT); ImBitArraySetBit(Storage, n); }
502  void ClearBit(int n) { IM_ASSERT(n < BITCOUNT); ImBitArrayClearBit(Storage, n); }
503  void SetBitRange(int n, int n2) { ImBitArraySetBitRange(Storage, n, n2); } // Works on range [n..n2)
504 };
505 
506 // Helper: ImBitVector
507 // Store 1-bit per value.
508 struct IMGUI_API ImBitVector
509 {
510  ImVector<ImU32> Storage;
511  void Create(int sz) { Storage.resize((sz + 31) >> 5); memset(Storage.Data, 0, (size_t)Storage.Size * sizeof(Storage.Data[0])); }
512  void Clear() { Storage.clear(); }
513  bool TestBit(int n) const { IM_ASSERT(n < (Storage.Size << 5)); return ImBitArrayTestBit(Storage.Data, n); }
514  void SetBit(int n) { IM_ASSERT(n < (Storage.Size << 5)); ImBitArraySetBit(Storage.Data, n); }
515  void ClearBit(int n) { IM_ASSERT(n < (Storage.Size << 5)); ImBitArrayClearBit(Storage.Data, n); }
516 };
517 
518 // Helper: ImSpan<>
519 // Pointing to a span of data we don't own.
520 template<typename T>
521 struct ImSpan
522 {
523  T* Data;
524  T* DataEnd;
525 
526  // Constructors, destructor
527  inline ImSpan() { Data = DataEnd = NULL; }
528  inline ImSpan(T* data, int size) { Data = data; DataEnd = data + size; }
529  inline ImSpan(T* data, T* data_end) { Data = data; DataEnd = data_end; }
530 
531  inline void set(T* data, int size) { Data = data; DataEnd = data + size; }
532  inline void set(T* data, T* data_end) { Data = data; DataEnd = data_end; }
533  inline int size() const { return (int)(ptrdiff_t)(DataEnd - Data); }
534  inline int size_in_bytes() const { return (int)(ptrdiff_t)(DataEnd - Data) * (int)sizeof(T); }
535  inline T& operator[](int i) { T* p = Data + i; IM_ASSERT(p >= Data && p < DataEnd); return *p; }
536  inline const T& operator[](int i) const { const T* p = Data + i; IM_ASSERT(p >= Data && p < DataEnd); return *p; }
537 
538  inline T* begin() { return Data; }
539  inline const T* begin() const { return Data; }
540  inline T* end() { return DataEnd; }
541  inline const T* end() const { return DataEnd; }
542 
543  // Utilities
544  inline int index_from_ptr(const T* it) const { IM_ASSERT(it >= Data && it < DataEnd); const ptrdiff_t off = it - Data; return (int)off; }
545 };
546 
547 // Helper: ImSpanAllocator<>
548 // Facilitate storing multiple chunks into a single large block (the "arena")
549 // - Usage: call Reserve() N times, allocate GetArenaSizeInBytes() worth, pass it to SetArenaBasePtr(), call GetSpan() N times to retrieve the aligned ranges.
550 template<int CHUNKS>
552 {
553  char* BasePtr;
554  int CurrOff;
555  int CurrIdx;
556  int Offsets[CHUNKS];
557  int Sizes[CHUNKS];
558 
559  ImSpanAllocator() { memset(this, 0, sizeof(*this)); }
560  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; }
561  inline int GetArenaSizeInBytes() { return CurrOff; }
562  inline void SetArenaBasePtr(void* base_ptr) { BasePtr = (char*)base_ptr; }
563  inline void* GetSpanPtrBegin(int n) { IM_ASSERT(n >= 0 && n < CHUNKS && CurrIdx == CHUNKS); return (void*)(BasePtr + Offsets[n]); }
564  inline void* GetSpanPtrEnd(int n) { IM_ASSERT(n >= 0 && n < CHUNKS && CurrIdx == CHUNKS); return (void*)(BasePtr + Offsets[n] + Sizes[n]); }
565  template<typename T>
566  inline void GetSpan(int n, ImSpan<T>* span) { span->set((T*)GetSpanPtrBegin(n), (T*)GetSpanPtrEnd(n)); }
567 };
568 
569 // Helper: ImPool<>
570 // Basic keyed storage for contiguous instances, slow/amortized insertion, O(1) indexable, O(Log N) queries by ID over a dense/hot buffer,
571 // Honor constructor/destructor. Add/remove invalidate all pointers. Indexes have the same lifetime as the associated object.
572 typedef int ImPoolIdx;
573 template<typename T>
574 struct IMGUI_API ImPool
575 {
576  ImVector<T> Buf; // Contiguous data
577  ImGuiStorage Map; // ID->Index
578  ImPoolIdx FreeIdx; // Next free idx to use
579 
580  ImPool() { FreeIdx = 0; }
581  ~ImPool() { Clear(); }
582  T* GetByKey(ImGuiID key) { int idx = Map.GetInt(key, -1); return (idx != -1) ? &Buf[idx] : NULL; }
583  T* GetByIndex(ImPoolIdx n) { return &Buf[n]; }
584  ImPoolIdx GetIndex(const T* p) const { IM_ASSERT(p >= Buf.Data && p < Buf.Data + Buf.Size); return (ImPoolIdx)(p - Buf.Data); }
585  T* GetOrAddByKey(ImGuiID key) { int* p_idx = Map.GetIntRef(key, -1); if (*p_idx != -1) return &Buf[*p_idx]; *p_idx = FreeIdx; return Add(); }
586  bool Contains(const T* p) const { return (p >= Buf.Data && p < Buf.Data + Buf.Size); }
587  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 = 0; }
588  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(); return &Buf[idx]; }
589  void Remove(ImGuiID key, const T* p) { Remove(key, GetIndex(p)); }
590  void Remove(ImGuiID key, ImPoolIdx idx) { Buf[idx].~T(); *(int*)&Buf[idx] = FreeIdx; FreeIdx = idx; Map.SetInt(key, -1); }
591  void Reserve(int capacity) { Buf.reserve(capacity); Map.Data.reserve(capacity); }
592  int GetSize() const { return Buf.Size; }
593 };
594 
595 // Helper: ImChunkStream<>
596 // Build and iterate a contiguous stream of variable-sized structures.
597 // This is used by Settings to store persistent data while reducing allocation count.
598 // We store the chunk size first, and align the final size on 4 bytes boundaries.
599 // The tedious/zealous amount of casting is to avoid -Wcast-align warnings.
600 template<typename T>
601 struct IMGUI_API ImChunkStream
602 {
603  ImVector<char> Buf;
604 
605  void clear() { Buf.clear(); }
606  bool empty() const { return Buf.Size == 0; }
607  int size() const { return Buf.Size; }
608  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); }
609  T* begin() { size_t HDR_SZ = 4; if (!Buf.Data) return NULL; return (T*)(void*)(Buf.Data + HDR_SZ); }
610  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; }
611  int chunk_size(const T* p) { return ((const int*)p)[-1]; }
612  T* end() { return (T*)(void*)(Buf.Data + Buf.Size); }
613  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; }
614  T* ptr_from_offset(int off) { IM_ASSERT(off >= 4 && off < Buf.Size); return (T*)(void*)(Buf.Data + off); }
615  void swap(ImChunkStream<T>& rhs) { rhs.Buf.swap(Buf); }
616 
617 };
618 
619 //-----------------------------------------------------------------------------
620 // [SECTION] ImDrawList support
621 //-----------------------------------------------------------------------------
622 
623 // ImDrawList: Helper function to calculate a circle's segment count given its radius and a "maximum error" value.
624 // Estimation of number of circle segment based on error is derived using method described in https://stackoverflow.com/a/2244088/15194693
625 // Number of segments (N) is calculated using equation:
626 // N = ceil ( pi / acos(1 - error / r) ) where r > 0, error <= r
627 // Our equation is significantly simpler that one in the post thanks for choosing segment that is
628 // perpendicular to X axis. Follow steps in the article from this starting condition and you will
629 // will get this result.
630 //
631 // Rendering circles with an odd number of segments, while mathematically correct will produce
632 // asymmetrical results on the raster grid. Therefore we're rounding N to next even number (7->8, 8->8, 9->10 etc.)
633 //
634 #define IM_ROUNDUP_TO_EVEN(_V) ((((_V) + 1) / 2) * 2)
635 #define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MIN 4
636 #define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX 512
637 #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)
638 
639 // Raw equation from IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC rewritten for 'r' and 'error'.
640 #define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_R(_N,_MAXERROR) ((_MAXERROR) / (1 - ImCos(IM_PI / ImMax((float)(_N), IM_PI))))
641 #define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_ERROR(_N,_RAD) ((1 - ImCos(IM_PI / ImMax((float)(_N), IM_PI))) / (_RAD))
642 
643 // ImDrawList: Lookup table size for adaptive arc drawing, cover full circle.
644 #ifndef IM_DRAWLIST_ARCFAST_TABLE_SIZE
645 #define IM_DRAWLIST_ARCFAST_TABLE_SIZE 48 // Number of samples in lookup table.
646 #endif
647 #define IM_DRAWLIST_ARCFAST_SAMPLE_MAX IM_DRAWLIST_ARCFAST_TABLE_SIZE // Sample index _PathArcToFastEx() for 360 angle.
648 
649 // Data shared between all ImDrawList instances
650 // You may want to create your own instance of this if you want to use ImDrawList completely without ImGui. In that case, watch out for future changes to this structure.
651 struct IMGUI_API ImDrawListSharedData
652 {
653  ImVec2 TexUvWhitePixel; // UV of white pixel in the atlas
654  ImFont* Font; // Current/default font (optional, for simplified AddText overload)
655  float FontSize; // Current/default font size (optional, for simplified AddText overload)
656  float CurveTessellationTol; // Tessellation tolerance when using PathBezierCurveTo()
657  float CircleSegmentMaxError; // Number of circle segments to use per pixel of radius for AddCircle() etc
658  ImVec4 ClipRectFullscreen; // Value for PushClipRectFullscreen()
659  ImDrawListFlags InitialFlags; // Initial flags at the beginning of the frame (it is possible to alter flags on a per-drawlist basis afterwards)
660 
661  // [Internal] Lookup tables
662  ImVec2 ArcFastVtx[IM_DRAWLIST_ARCFAST_TABLE_SIZE]; // Sample points on the quarter of the circle.
663  float ArcFastRadiusCutoff; // Cutoff radius after which arc drawing will fallback to slower PathArcTo()
664  ImU8 CircleSegmentCounts[64]; // Precomputed segment count for given radius before we calculate it dynamically (to avoid calculation overhead)
665  const ImVec4* TexUvLines; // UV of anti-aliased lines in the atlas
666 
668  void SetCircleTessellationMaxError(float max_error);
669 };
670 
672 {
673  ImVector<ImDrawList*> Layers[2]; // Global layers for: regular, tooltip
674 
675  void Clear() { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].resize(0); }
676  void ClearFreeMemory() { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].clear(); }
677  int GetDrawListCount() const { int count = 0; for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) count += Layers[n].Size; return count; }
678  IMGUI_API void FlattenIntoSingleLayer();
679 };
680 
681 //-----------------------------------------------------------------------------
682 // [SECTION] Widgets support: flags, enums, data structures
683 //-----------------------------------------------------------------------------
684 
685 // Transient per-window flags, reset at the beginning of the frame. For child window, inherited from parent on first Begin().
686 // This is going to be exposed in imgui.h when stabilized enough.
687 enum ImGuiItemFlags_
688 {
689  ImGuiItemFlags_None = 0,
690  ImGuiItemFlags_NoTabStop = 1 << 0, // false
691  ImGuiItemFlags_ButtonRepeat = 1 << 1, // false // Button() will return true multiple times based on io.KeyRepeatDelay and io.KeyRepeatRate settings.
692  ImGuiItemFlags_Disabled = 1 << 2, // false // [BETA] Disable interactions but doesn't affect visuals yet. See github.com/ocornut/imgui/issues/211
693  ImGuiItemFlags_NoNav = 1 << 3, // false
694  ImGuiItemFlags_NoNavDefaultFocus = 1 << 4, // false
695  ImGuiItemFlags_SelectableDontClosePopup = 1 << 5, // false // MenuItem/Selectable() automatically closes current Popup window
696  ImGuiItemFlags_MixedValue = 1 << 6, // 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)
697  ImGuiItemFlags_ReadOnly = 1 << 7, // false // [ALPHA] Allow hovering interactions but underlying value is not changed.
698  ImGuiItemFlags_Default_ = 0
699 };
700 
701 // Storage for LastItem data
702 enum ImGuiItemStatusFlags_
703 {
704  ImGuiItemStatusFlags_None = 0,
705  ImGuiItemStatusFlags_HoveredRect = 1 << 0,
706  ImGuiItemStatusFlags_HasDisplayRect = 1 << 1, // LastItemDisplayRect is valid
707  ImGuiItemStatusFlags_Edited = 1 << 2, // Value exposed by item was edited in the current frame (should match the bool return value of most widgets)
708  ImGuiItemStatusFlags_ToggledSelection = 1 << 3, // Set when Selectable(), TreeNode() reports toggling a selection. We can't report "Selected" because reporting the change allows us to handle clipping with less issues.
709  ImGuiItemStatusFlags_ToggledOpen = 1 << 4, // Set when TreeNode() reports toggling their open state.
710  ImGuiItemStatusFlags_HasDeactivated = 1 << 5, // Set if the widget/group is able to provide data for the ImGuiItemStatusFlags_Deactivated flag.
711  ImGuiItemStatusFlags_Deactivated = 1 << 6, // Only valid if ImGuiItemStatusFlags_HasDeactivated is set.
712  ImGuiItemStatusFlags_HoveredWindow = 1 << 7 // Override the HoveredWindow test to allow cross-window hover testing.
713 
714 #ifdef IMGUI_ENABLE_TEST_ENGINE
715  , // [imgui_tests only]
716  ImGuiItemStatusFlags_Openable = 1 << 10, //
717  ImGuiItemStatusFlags_Opened = 1 << 11, //
718  ImGuiItemStatusFlags_Checkable = 1 << 12, //
719  ImGuiItemStatusFlags_Checked = 1 << 13 //
720 #endif
721 };
722 
723 // Extend ImGuiButtonFlags_
724 enum ImGuiButtonFlagsPrivate_
725 {
726  ImGuiButtonFlags_PressedOnClick = 1 << 4, // return true on click (mouse down event)
727  ImGuiButtonFlags_PressedOnClickRelease = 1 << 5, // [Default] return true on click + release on same item <-- this is what the majority of Button are using
728  ImGuiButtonFlags_PressedOnClickReleaseAnywhere = 1 << 6, // return true on click + release even if the release event is not done while hovering the item
729  ImGuiButtonFlags_PressedOnRelease = 1 << 7, // return true on release (default requires click+release)
730  ImGuiButtonFlags_PressedOnDoubleClick = 1 << 8, // return true on double-click (default requires click+release)
731  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)
732  ImGuiButtonFlags_Repeat = 1 << 10, // hold to repeat
733  ImGuiButtonFlags_FlattenChildren = 1 << 11, // allow interactions even if a child window is overlapping
734  ImGuiButtonFlags_AllowItemOverlap = 1 << 12, // require previous frame HoveredId to either match id or be null before being usable, use along with SetItemAllowOverlap()
735  ImGuiButtonFlags_DontClosePopups = 1 << 13, // disable automatically closing parent popup on press // [UNUSED]
736  ImGuiButtonFlags_Disabled = 1 << 14, // disable interactions
737  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
738  ImGuiButtonFlags_NoKeyModifiers = 1 << 16, // disable mouse interaction if a key modifier is held
739  ImGuiButtonFlags_NoHoldingActiveId = 1 << 17, // don't set ActiveId while holding the mouse (ImGuiButtonFlags_PressedOnClick only)
740  ImGuiButtonFlags_NoNavFocus = 1 << 18, // don't override navigation focus when activated
741  ImGuiButtonFlags_NoHoveredOnFocus = 1 << 19, // don't report as hovered when nav focus is on this item
742  ImGuiButtonFlags_PressedOnMask_ = ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnClickReleaseAnywhere | ImGuiButtonFlags_PressedOnRelease | ImGuiButtonFlags_PressedOnDoubleClick | ImGuiButtonFlags_PressedOnDragDropHold,
743  ImGuiButtonFlags_PressedOnDefault_ = ImGuiButtonFlags_PressedOnClickRelease
744 };
745 
746 // Extend ImGuiSliderFlags_
747 enum ImGuiSliderFlagsPrivate_
748 {
749  ImGuiSliderFlags_Vertical = 1 << 20, // Should this slider be orientated vertically?
750  ImGuiSliderFlags_ReadOnly = 1 << 21
751 };
752 
753 // Extend ImGuiSelectableFlags_
754 enum ImGuiSelectableFlagsPrivate_
755 {
756  // NB: need to be in sync with last value of ImGuiSelectableFlags_
757  ImGuiSelectableFlags_NoHoldingActiveID = 1 << 20,
758  ImGuiSelectableFlags_SelectOnClick = 1 << 21, // Override button behavior to react on Click (default is Click+Release)
759  ImGuiSelectableFlags_SelectOnRelease = 1 << 22, // Override button behavior to react on Release (default is Click+Release)
760  ImGuiSelectableFlags_SpanAvailWidth = 1 << 23, // 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)
761  ImGuiSelectableFlags_DrawHoveredWhenHeld = 1 << 24, // Always show active when held, even is not hovered. This concept could probably be renamed/formalized somehow.
762  ImGuiSelectableFlags_SetNavIdOnHover = 1 << 25, // Set Nav/Focus ID on mouse hover (used by MenuItem)
763  ImGuiSelectableFlags_NoPadWithHalfSpacing = 1 << 26 // Disable padding each side with ItemSpacing * 0.5f
764 };
765 
766 // Extend ImGuiTreeNodeFlags_
767 enum ImGuiTreeNodeFlagsPrivate_
768 {
769  ImGuiTreeNodeFlags_ClipLabelForTrailingButton = 1 << 20
770 };
771 
772 enum ImGuiSeparatorFlags_
773 {
774  ImGuiSeparatorFlags_None = 0,
775  ImGuiSeparatorFlags_Horizontal = 1 << 0, // Axis default to current layout type, so generally Horizontal unless e.g. in a menu bar
776  ImGuiSeparatorFlags_Vertical = 1 << 1,
777  ImGuiSeparatorFlags_SpanAllColumns = 1 << 2
778 };
779 
780 enum ImGuiTextFlags_
781 {
782  ImGuiTextFlags_None = 0,
783  ImGuiTextFlags_NoWidthForLargeClippedText = 1 << 0
784 };
785 
786 enum ImGuiTooltipFlags_
787 {
788  ImGuiTooltipFlags_None = 0,
789  ImGuiTooltipFlags_OverridePreviousTooltip = 1 << 0 // Override will clear/ignore previously submitted tooltip (defaults to append)
790 };
791 
792 // FIXME: this is in development, not exposed/functional as a generic feature yet.
793 // Horizontal/Vertical enums are fixed to 0/1 so they may be used to index ImVec2
794 enum ImGuiLayoutType_
795 {
796  ImGuiLayoutType_Horizontal = 0,
797  ImGuiLayoutType_Vertical = 1
798 };
799 
800 enum ImGuiLogType
801 {
802  ImGuiLogType_None = 0,
803  ImGuiLogType_TTY,
804  ImGuiLogType_File,
805  ImGuiLogType_Buffer,
806  ImGuiLogType_Clipboard
807 };
808 
809 // X/Y enums are fixed to 0/1 so they may be used to index ImVec2
810 enum ImGuiAxis
811 {
812  ImGuiAxis_None = -1,
813  ImGuiAxis_X = 0,
814  ImGuiAxis_Y = 1
815 };
816 
817 enum ImGuiPlotType
818 {
819  ImGuiPlotType_Lines,
820  ImGuiPlotType_Histogram
821 };
822 
823 enum ImGuiInputSource
824 {
825  ImGuiInputSource_None = 0,
826  ImGuiInputSource_Mouse,
827  ImGuiInputSource_Keyboard,
828  ImGuiInputSource_Gamepad,
829  ImGuiInputSource_Nav, // Stored in g.ActiveIdSource only
830  ImGuiInputSource_COUNT
831 };
832 
833 // FIXME-NAV: Clarify/expose various repeat delay/rate
834 enum ImGuiInputReadMode
835 {
836  ImGuiInputReadMode_Down,
837  ImGuiInputReadMode_Pressed,
838  ImGuiInputReadMode_Released,
839  ImGuiInputReadMode_Repeat,
840  ImGuiInputReadMode_RepeatSlow,
841  ImGuiInputReadMode_RepeatFast
842 };
843 
844 enum ImGuiNavHighlightFlags_
845 {
846  ImGuiNavHighlightFlags_None = 0,
847  ImGuiNavHighlightFlags_TypeDefault = 1 << 0,
848  ImGuiNavHighlightFlags_TypeThin = 1 << 1,
849  ImGuiNavHighlightFlags_AlwaysDraw = 1 << 2, // Draw rectangular highlight if (g.NavId == id) _even_ when using the mouse.
850  ImGuiNavHighlightFlags_NoRounding = 1 << 3
851 };
852 
853 enum ImGuiNavDirSourceFlags_
854 {
855  ImGuiNavDirSourceFlags_None = 0,
856  ImGuiNavDirSourceFlags_Keyboard = 1 << 0,
857  ImGuiNavDirSourceFlags_PadDPad = 1 << 1,
858  ImGuiNavDirSourceFlags_PadLStick = 1 << 2
859 };
860 
861 enum ImGuiNavMoveFlags_
862 {
863  ImGuiNavMoveFlags_None = 0,
864  ImGuiNavMoveFlags_LoopX = 1 << 0, // On failed request, restart from opposite side
865  ImGuiNavMoveFlags_LoopY = 1 << 1,
866  ImGuiNavMoveFlags_WrapX = 1 << 2, // On failed request, request from opposite side one line down (when NavDir==right) or one line up (when NavDir==left)
867  ImGuiNavMoveFlags_WrapY = 1 << 3, // This is not super useful for provided for completeness
868  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)
869  ImGuiNavMoveFlags_AlsoScoreVisibleSet = 1 << 5, // Store alternate result in NavMoveResultLocalVisibleSet that only comprise elements that are already fully visible.
870  ImGuiNavMoveFlags_ScrollToEdge = 1 << 6
871 };
872 
873 enum ImGuiNavForward
874 {
875  ImGuiNavForward_None,
876  ImGuiNavForward_ForwardQueued,
877  ImGuiNavForward_ForwardActive
878 };
879 
880 enum ImGuiNavLayer
881 {
882  ImGuiNavLayer_Main = 0, // Main scrolling layer
883  ImGuiNavLayer_Menu = 1, // Menu layer (access with Alt/ImGuiNavInput_Menu)
884  ImGuiNavLayer_COUNT
885 };
886 
887 enum ImGuiPopupPositionPolicy
888 {
889  ImGuiPopupPositionPolicy_Default,
890  ImGuiPopupPositionPolicy_ComboBox,
891  ImGuiPopupPositionPolicy_Tooltip
892 };
893 
895 {
896  ImU8 Data[8]; // Can fit any data up to ImGuiDataType_COUNT
897 };
898 
899 // Type information associated to one ImGuiDataType. Retrieve with DataTypeGetInfo().
901 {
902  size_t Size; // Size in bytes
903  const char* Name; // Short descriptive name for the type, for debugging
904  const char* PrintFmt; // Default printf format for the type
905  const char* ScanFmt; // Default scanf format for the type
906 };
907 
908 // Extend ImGuiDataType_
909 enum ImGuiDataTypePrivate_
910 {
911  ImGuiDataType_String = ImGuiDataType_COUNT + 1,
912  ImGuiDataType_Pointer,
913  ImGuiDataType_ID
914 };
915 
916 // Stacked color modifier, backup of modified data so we can restore it
918 {
919  ImGuiCol Col;
920  ImVec4 BackupValue;
921 };
922 
923 // Stacked style modifier, backup of modified data so we can restore it. Data type inferred from the variable.
925 {
926  ImGuiStyleVar VarIdx;
927  union { int BackupInt[2]; float BackupFloat[2]; };
928  ImGuiStyleMod(ImGuiStyleVar idx, int v) { VarIdx = idx; BackupInt[0] = v; }
929  ImGuiStyleMod(ImGuiStyleVar idx, float v) { VarIdx = idx; BackupFloat[0] = v; }
930  ImGuiStyleMod(ImGuiStyleVar idx, ImVec2 v) { VarIdx = idx; BackupFloat[0] = v.x; BackupFloat[1] = v.y; }
931 };
932 
933 // Stacked storage data for BeginGroup()/EndGroup()
934 struct IMGUI_API ImGuiGroupData
935 {
936  ImGuiID WindowID;
937  ImVec2 BackupCursorPos;
938  ImVec2 BackupCursorMaxPos;
939  ImVec1 BackupIndent;
940  ImVec1 BackupGroupOffset;
941  ImVec2 BackupCurrLineSize;
942  float BackupCurrLineTextBaseOffset;
943  ImGuiID BackupActiveIdIsAlive;
944  bool BackupActiveIdPreviousFrameIsAlive;
945  bool BackupHoveredIdIsAlive;
946  bool EmitItem;
947 };
948 
949 // Simple column measurement, currently used for MenuItem() only.. This is very short-sighted/throw-away code and NOT a generic helper.
950 struct IMGUI_API ImGuiMenuColumns
951 {
952  float Spacing;
953  float Width, NextWidth;
954  float Pos[3], NextWidths[3];
955 
956  ImGuiMenuColumns() { memset(this, 0, sizeof(*this)); }
957  void Update(int count, float spacing, bool clear);
958  float DeclColumns(float w0, float w1, float w2);
959  float CalcExtraSpace(float avail_w) const;
960 };
961 
962 // Internal state of the currently focused/edited text input box
963 // For a given item ID, access with ImGui::GetInputTextState()
964 struct IMGUI_API ImGuiInputTextState
965 {
966  ImGuiID ID; // widget id owning the text state
967  int CurLenW, CurLenA; // we need to maintain our buffer length in both UTF-8 and wchar format. UTF-8 length is valid even if TextA is not.
968  ImVector<ImWchar> TextW; // edit buffer, we need to persist but can't guarantee the persistence of the user-provided buffer. so we copy into own buffer.
969  ImVector<char> TextA; // temporary UTF8 buffer for callbacks and other operations. this is not updated in every code-path! size=capacity.
970  ImVector<char> InitialTextA; // backup of end-user buffer at the time of focus (in UTF-8, unaltered)
971  bool TextAIsValid; // temporary UTF8 buffer is not initially valid before we make the widget active (until then we pull the data from user argument)
972  int BufCapacityA; // end-user buffer capacity
973  float ScrollX; // horizontal scrolling/offset
974  ImStb::STB_TexteditState Stb; // state for stb_textedit.h
975  float CursorAnim; // timer for cursor blink, reset on every user action so the cursor reappears immediately
976  bool CursorFollow; // set when we want scrolling to follow the current cursor position (not always!)
977  bool SelectedAllMouseLock; // after a double-click to select all, we ignore further mouse drags to update selection
978  bool Edited; // edited this frame
979  ImGuiInputTextFlags UserFlags; // Temporarily set while we call user's callback
980  ImGuiInputTextCallback UserCallback; // "
981  void* UserCallbackData; // "
982 
983  ImGuiInputTextState() { memset(this, 0, sizeof(*this)); }
984  void ClearText() { CurLenW = CurLenA = 0; TextW[0] = 0; TextA[0] = 0; CursorClamp(); }
985  void ClearFreeMemory() { TextW.clear(); TextA.clear(); InitialTextA.clear(); }
986  int GetUndoAvailCount() const { return Stb.undostate.undo_point; }
987  int GetRedoAvailCount() const { return STB_TEXTEDIT_UNDOSTATECOUNT - Stb.undostate.redo_point; }
988  void OnKeyPressed(int key); // Cannot be inline because we call in code in stb_textedit.h implementation
989 
990  // Cursor & Selection
991  void CursorAnimReset() { CursorAnim = -0.30f; } // After a user-input the cursor stays on for a while without blinking
992  void CursorClamp() { Stb.cursor = ImMin(Stb.cursor, CurLenW); Stb.select_start = ImMin(Stb.select_start, CurLenW); Stb.select_end = ImMin(Stb.select_end, CurLenW); }
993  bool HasSelection() const { return Stb.select_start != Stb.select_end; }
994  void ClearSelection() { Stb.select_start = Stb.select_end = Stb.cursor; }
995  void SelectAll() { Stb.select_start = 0; Stb.cursor = Stb.select_end = CurLenW; Stb.has_preferred_x = 0; }
996 };
997 
998 // Storage for current popup stack
1000 {
1001  ImGuiID PopupId; // Set on OpenPopup()
1002  ImGuiWindow* Window; // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup()
1003  ImGuiWindow* SourceWindow; // Set on OpenPopup() copy of NavWindow at the time of opening the popup
1004  int OpenFrameCount; // Set on OpenPopup()
1005  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)
1006  ImVec2 OpenPopupPos; // Set on OpenPopup(), preferred popup position (typically == OpenMousePos when using mouse)
1007  ImVec2 OpenMousePos; // Set on OpenPopup(), copy of mouse position at the time of opening popup
1008 
1009  ImGuiPopupData() { memset(this, 0, sizeof(*this)); OpenFrameCount = -1; }
1010 };
1011 
1013 {
1014  ImGuiWindow* Window; // Best candidate window
1015  ImGuiID ID; // Best candidate ID
1016  ImGuiID FocusScopeId; // Best candidate focus scope ID
1017  float DistBox; // Best candidate box distance to current NavId
1018  float DistCenter; // Best candidate center distance to current NavId
1019  float DistAxial;
1020  ImRect RectRel; // Best candidate bounding box in window relative space
1021 
1022  ImGuiNavMoveResult() { Clear(); }
1023  void Clear() { Window = NULL; ID = FocusScopeId = 0; DistBox = DistCenter = DistAxial = FLT_MAX; RectRel = ImRect(); }
1024 };
1025 
1026 enum ImGuiNextWindowDataFlags_
1027 {
1028  ImGuiNextWindowDataFlags_None = 0,
1029  ImGuiNextWindowDataFlags_HasPos = 1 << 0,
1030  ImGuiNextWindowDataFlags_HasSize = 1 << 1,
1031  ImGuiNextWindowDataFlags_HasContentSize = 1 << 2,
1032  ImGuiNextWindowDataFlags_HasCollapsed = 1 << 3,
1033  ImGuiNextWindowDataFlags_HasSizeConstraint = 1 << 4,
1034  ImGuiNextWindowDataFlags_HasFocus = 1 << 5,
1035  ImGuiNextWindowDataFlags_HasBgAlpha = 1 << 6,
1036  ImGuiNextWindowDataFlags_HasScroll = 1 << 7
1037 };
1038 
1039 // Storage for SetNexWindow** functions
1041 {
1042  ImGuiNextWindowDataFlags Flags;
1043  ImGuiCond PosCond;
1044  ImGuiCond SizeCond;
1045  ImGuiCond CollapsedCond;
1046  ImVec2 PosVal;
1047  ImVec2 PosPivotVal;
1048  ImVec2 SizeVal;
1049  ImVec2 ContentSizeVal;
1050  ImVec2 ScrollVal;
1051  bool CollapsedVal;
1052  ImRect SizeConstraintRect;
1053  ImGuiSizeCallback SizeCallback;
1054  void* SizeCallbackUserData;
1055  float BgAlphaVal; // Override background alpha
1056  ImVec2 MenuBarOffsetMinVal; // *Always on* This is not exposed publicly, so we don't clear it.
1057 
1058  ImGuiNextWindowData() { memset(this, 0, sizeof(*this)); }
1059  inline void ClearFlags() { Flags = ImGuiNextWindowDataFlags_None; }
1060 };
1061 
1062 enum ImGuiNextItemDataFlags_
1063 {
1064  ImGuiNextItemDataFlags_None = 0,
1065  ImGuiNextItemDataFlags_HasWidth = 1 << 0,
1066  ImGuiNextItemDataFlags_HasOpen = 1 << 1
1067 };
1068 
1070 {
1071  ImGuiNextItemDataFlags Flags;
1072  float Width; // Set by SetNextItemWidth()
1073  ImGuiID FocusScopeId; // Set by SetNextItemMultiSelectData() (!= 0 signify value has been set, so it's an alternate version of HasSelectionData, we don't use Flags for this because they are cleared too early. This is mostly used for debugging)
1074  ImGuiCond OpenCond;
1075  bool OpenVal; // Set by SetNextItemOpen()
1076 
1077  ImGuiNextItemData() { memset(this, 0, sizeof(*this)); }
1078  inline void ClearFlags() { Flags = ImGuiNextItemDataFlags_None; } // Also cleared manually by ItemAdd()!
1079 };
1080 
1082 {
1083  int Index;
1084  float Width;
1085 };
1086 
1088 {
1089  void* Ptr; // Either field can be set, not both. e.g. Dock node tab bars are loose while BeginTabBar() ones are in a pool.
1090  int Index; // Usually index in a main pool.
1091 
1092  ImGuiPtrOrIndex(void* ptr) { Ptr = ptr; Index = -1; }
1093  ImGuiPtrOrIndex(int index) { Ptr = NULL; Index = index; }
1094 };
1095 
1096 //-----------------------------------------------------------------------------
1097 // [SECTION] Columns support
1098 //-----------------------------------------------------------------------------
1099 
1100 // Flags for internal's BeginColumns(). Prefix using BeginTable() nowadays!
1101 enum ImGuiOldColumnFlags_
1102 {
1103  ImGuiOldColumnFlags_None = 0,
1104  ImGuiOldColumnFlags_NoBorder = 1 << 0, // Disable column dividers
1105  ImGuiOldColumnFlags_NoResize = 1 << 1, // Disable resizing columns when clicking on the dividers
1106  ImGuiOldColumnFlags_NoPreserveWidths = 1 << 2, // Disable column width preservation when adjusting columns
1107  ImGuiOldColumnFlags_NoForceWithinWindow = 1 << 3, // Disable forcing columns to fit within window
1108  ImGuiOldColumnFlags_GrowParentContentsSize = 1 << 4 // (WIP) Restore pre-1.51 behavior of extending the parent window contents size but _without affecting the columns width at all_. Will eventually remove.
1109 
1110  // Obsolete names (will be removed)
1111 #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
1112  , ImGuiColumnsFlags_None = ImGuiOldColumnFlags_None,
1113  ImGuiColumnsFlags_NoBorder = ImGuiOldColumnFlags_NoBorder,
1114  ImGuiColumnsFlags_NoResize = ImGuiOldColumnFlags_NoResize,
1115  ImGuiColumnsFlags_NoPreserveWidths = ImGuiOldColumnFlags_NoPreserveWidths,
1116  ImGuiColumnsFlags_NoForceWithinWindow = ImGuiOldColumnFlags_NoForceWithinWindow,
1117  ImGuiColumnsFlags_GrowParentContentsSize = ImGuiOldColumnFlags_GrowParentContentsSize
1118 #endif
1119 };
1120 
1122 {
1123  float OffsetNorm; // Column start offset, normalized 0.0 (far left) -> 1.0 (far right)
1124  float OffsetNormBeforeResize;
1125  ImGuiOldColumnFlags Flags; // Not exposed
1126  ImRect ClipRect;
1127 
1128  ImGuiOldColumnData() { memset(this, 0, sizeof(*this)); }
1129 };
1130 
1132 {
1133  ImGuiID ID;
1134  ImGuiOldColumnFlags Flags;
1135  bool IsFirstFrame;
1136  bool IsBeingResized;
1137  int Current;
1138  int Count;
1139  float OffMinX, OffMaxX; // Offsets from HostWorkRect.Min.x
1140  float LineMinY, LineMaxY;
1141  float HostCursorPosY; // Backup of CursorPos at the time of BeginColumns()
1142  float HostCursorMaxPosX; // Backup of CursorMaxPos at the time of BeginColumns()
1143  ImRect HostInitialClipRect; // Backup of ClipRect at the time of BeginColumns()
1144  ImRect HostBackupClipRect; // Backup of ClipRect during PushColumnsBackground()/PopColumnsBackground()
1145  ImRect HostBackupParentWorkRect;//Backup of WorkRect at the time of BeginColumns()
1147  ImDrawListSplitter Splitter;
1148 
1149  ImGuiOldColumns() { memset(this, 0, sizeof(*this)); }
1150 };
1151 
1152 //-----------------------------------------------------------------------------
1153 // [SECTION] Multi-select support
1154 //-----------------------------------------------------------------------------
1155 
1156 #ifdef IMGUI_HAS_MULTI_SELECT
1157 // <this is filled in 'range_select' branch>
1158 #endif // #ifdef IMGUI_HAS_MULTI_SELECT
1159 
1160 //-----------------------------------------------------------------------------
1161 // [SECTION] Docking support
1162 //-----------------------------------------------------------------------------
1163 
1164 #ifdef IMGUI_HAS_DOCK
1165 // <this is filled in 'docking' branch>
1166 #endif // #ifdef IMGUI_HAS_DOCK
1167 
1168 //-----------------------------------------------------------------------------
1169 // [SECTION] Viewport support
1170 //-----------------------------------------------------------------------------
1171 
1172 // ImGuiViewport Private/Internals fields (cardinal sin: we are using inheritance!)
1173 // Every instance of ImGuiViewport is in fact a ImGuiViewportP.
1175 {
1176  int DrawListsLastFrame[2]; // Last frame number the background (0) and foreground (1) draw lists were used
1177  ImDrawList* DrawLists[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.
1178  ImDrawData DrawDataP;
1179  ImDrawDataBuilder DrawDataBuilder;
1180 
1181  ImVec2 WorkOffsetMin; // Work Area: Offset from Pos to top-left corner of Work Area. Generally (0,0) or (0,+main_menu_bar_height). Work Area is Full Area but without menu-bars/status-bars (so WorkArea always fit inside Pos/Size!)
1182  ImVec2 WorkOffsetMax; // Work Area: Offset from Pos+Size to bottom-right corner of Work Area. Generally (0,0) or (0,-status_bar_height).
1183  ImVec2 CurrWorkOffsetMin; // Work Area: Offset being built/increased during current frame
1184  ImVec2 CurrWorkOffsetMax; // Work Area: Offset being built/decreased during current frame
1185 
1186  ImGuiViewportP() { DrawListsLastFrame[0] = DrawListsLastFrame[1] = -1; DrawLists[0] = DrawLists[1] = NULL; }
1187  ~ImGuiViewportP() { if (DrawLists[0]) IM_DELETE(DrawLists[0]); if (DrawLists[1]) IM_DELETE(DrawLists[1]); }
1188  ImRect GetMainRect() const { return ImRect(Pos.x, Pos.y, Pos.x + Size.x, Pos.y + Size.y); }
1189  ImRect GetWorkRect() const { return ImRect(WorkPos.x, WorkPos.y, WorkPos.x + WorkSize.x, WorkPos.y + WorkSize.y); }
1190  void UpdateWorkRect() { WorkPos = ImVec2(Pos.x + WorkOffsetMin.x, Pos.y + WorkOffsetMin.y); WorkSize = ImVec2(ImMax(0.0f, Size.x - WorkOffsetMin.x + WorkOffsetMax.x), ImMax(0.0f, Size.y - WorkOffsetMin.y + WorkOffsetMax.y)); }
1191 };
1192 
1193 //-----------------------------------------------------------------------------
1194 // [SECTION] Settings support
1195 //-----------------------------------------------------------------------------
1196 
1197 // Windows data saved in imgui.ini file
1198 // Because we never destroy or rename ImGuiWindowSettings, we can store the names in a separate buffer easily.
1199 // (this is designed to be stored in a ImChunkStream buffer, with the variable-length Name following our structure)
1201 {
1202  ImGuiID ID;
1203  ImVec2ih Pos;
1204  ImVec2ih Size;
1205  bool Collapsed;
1206  bool WantApply; // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context)
1207 
1208  ImGuiWindowSettings() { memset(this, 0, sizeof(*this)); }
1209  char* GetName() { return (char*)(this + 1); }
1210 };
1211 
1213 {
1214  const char* TypeName; // Short description stored in .ini file. Disallowed characters: '[' ']'
1215  ImGuiID TypeHash; // == ImHashStr(TypeName)
1216  void (*ClearAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Clear all settings data
1217  void (*ReadInitFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Read: Called before reading (in registration order)
1218  void* (*ReadOpenFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, const char* name); // Read: Called when entering into a new ini entry e.g. "[Window][Name]"
1219  void (*ReadLineFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, void* entry, const char* line); // Read: Called for every line of text within an ini entry
1220  void (*ApplyAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Read: Called after reading (in registration order)
1221  void (*WriteAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* out_buf); // Write: Output every entries into 'out_buf'
1222  void* UserData;
1223 
1224  ImGuiSettingsHandler() { memset(this, 0, sizeof(*this)); }
1225 };
1226 
1227 //-----------------------------------------------------------------------------
1228 // [SECTION] Metrics, Debug
1229 //-----------------------------------------------------------------------------
1230 
1232 {
1233  bool ShowWindowsRects;
1234  bool ShowWindowsBeginOrder;
1235  bool ShowTablesRects;
1236  bool ShowDrawCmdMesh;
1237  bool ShowDrawCmdBoundingBoxes;
1238  int ShowWindowsRectsType;
1239  int ShowTablesRectsType;
1240 
1242  {
1243  ShowWindowsRects = false;
1244  ShowWindowsBeginOrder = false;
1245  ShowTablesRects = false;
1246  ShowDrawCmdMesh = true;
1247  ShowDrawCmdBoundingBoxes = true;
1248  ShowWindowsRectsType = -1;
1249  ShowTablesRectsType = -1;
1250  }
1251 };
1252 
1253 struct IMGUI_API ImGuiStackSizes
1254 {
1255  short SizeOfIDStack;
1256  short SizeOfColorStack;
1257  short SizeOfStyleVarStack;
1258  short SizeOfFontStack;
1259  short SizeOfFocusScopeStack;
1260  short SizeOfGroupStack;
1261  short SizeOfBeginPopupStack;
1262 
1263  ImGuiStackSizes() { memset(this, 0, sizeof(*this)); }
1264  void SetToCurrentState();
1265  void CompareWithCurrentState();
1266 };
1267 
1268 //-----------------------------------------------------------------------------
1269 // [SECTION] Generic context hooks
1270 //-----------------------------------------------------------------------------
1271 
1272 typedef void (*ImGuiContextHookCallback)(ImGuiContext* ctx, ImGuiContextHook* hook);
1273 enum ImGuiContextHookType { ImGuiContextHookType_NewFramePre, ImGuiContextHookType_NewFramePost, ImGuiContextHookType_EndFramePre, ImGuiContextHookType_EndFramePost, ImGuiContextHookType_RenderPre, ImGuiContextHookType_RenderPost, ImGuiContextHookType_Shutdown, ImGuiContextHookType_PendingRemoval_ };
1274 
1276 {
1277  ImGuiID HookId; // A unique ID assigned by AddContextHook()
1278  ImGuiContextHookType Type;
1279  ImGuiID Owner;
1280  ImGuiContextHookCallback Callback;
1281  void* UserData;
1282 
1283  ImGuiContextHook() { memset(this, 0, sizeof(*this)); }
1284 };
1285 
1286 //-----------------------------------------------------------------------------
1287 // [SECTION] ImGuiContext (main imgui context)
1288 //-----------------------------------------------------------------------------
1289 
1291 {
1292  bool Initialized;
1293  bool FontAtlasOwnedByContext; // IO.Fonts-> is owned by the ImGuiContext and will be destructed along with it.
1294  ImGuiIO IO;
1295  ImGuiStyle Style;
1296  ImFont* Font; // (Shortcut) == FontStack.empty() ? IO.Font : FontStack.back()
1297  float FontSize; // (Shortcut) == FontBaseSize * g.CurrentWindow->FontWindowScale == window->FontSize(). Text height for current window.
1298  float FontBaseSize; // (Shortcut) == IO.FontGlobalScale * Font->Scale * Font->FontSize. Base text height.
1299  ImDrawListSharedData DrawListSharedData;
1300  double Time;
1301  int FrameCount;
1302  int FrameCountEnded;
1303  int FrameCountRendered;
1304  bool WithinFrameScope; // Set by NewFrame(), cleared by EndFrame()
1305  bool WithinFrameScopeWithImplicitWindow; // Set by NewFrame(), cleared by EndFrame() when the implicit debug window has been pushed
1306  bool WithinEndChild; // Set within EndChild()
1307  bool GcCompactAll; // Request full GC
1308  bool TestEngineHookItems; // Will call test engine hooks: ImGuiTestEngineHook_ItemAdd(), ImGuiTestEngineHook_ItemInfo(), ImGuiTestEngineHook_Log()
1309  ImGuiID TestEngineHookIdInfo; // Will call test engine hooks: ImGuiTestEngineHook_IdInfo() from GetID()
1310  void* TestEngine; // Test engine user data
1311 
1312  // Windows state
1313  ImVector<ImGuiWindow*> Windows; // Windows, sorted in display order, back to front
1314  ImVector<ImGuiWindow*> WindowsFocusOrder; // Windows, sorted in focus order, back to front. (FIXME: We could only store root windows here! Need to sort out the Docking equivalent which is RootWindowDockStop and is unfortunately a little more dynamic)
1315  ImVector<ImGuiWindow*> WindowsTempSortBuffer; // Temporary buffer used in EndFrame() to reorder windows so parents are kept before their child
1316  ImVector<ImGuiWindow*> CurrentWindowStack;
1317  ImGuiStorage WindowsById; // Map window's ImGuiID to ImGuiWindow*
1318  int WindowsActiveCount; // Number of unique windows submitted by frame
1319  ImGuiWindow* CurrentWindow; // Window being drawn into
1320  ImGuiWindow* HoveredWindow; // Window the mouse is hovering. Will typically catch mouse inputs.
1321  ImGuiWindow* HoveredWindowUnderMovingWindow; // Hovered window ignoring MovingWindow. Only set if MovingWindow is set.
1322  ImGuiWindow* MovingWindow; // Track the window we clicked on (in order to preserve focus). The actual window that is moved is generally MovingWindow->RootWindow.
1323  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.
1324  ImVec2 WheelingWindowRefMousePos;
1325  float WheelingWindowTimer;
1326 
1327  // Item/widgets state and tracking information
1328  ImGuiID HoveredId; // Hovered widget, filled during the frame
1329  ImGuiID HoveredIdPreviousFrame;
1330  bool HoveredIdAllowOverlap;
1331  bool HoveredIdUsingMouseWheel; // Hovered widget will use mouse wheel. Blocks scrolling the underlying window.
1332  bool HoveredIdPreviousFrameUsingMouseWheel;
1333  bool HoveredIdDisabled; // 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.
1334  float HoveredIdTimer; // Measure contiguous hovering time
1335  float HoveredIdNotActiveTimer; // Measure contiguous hovering time where the item has not been active
1336  ImGuiID ActiveId; // Active widget
1337  ImGuiID ActiveIdIsAlive; // Active widget has been seen this frame (we can't use a bool as the ActiveId may change within the frame)
1338  float ActiveIdTimer;
1339  bool ActiveIdIsJustActivated; // Set at the time of activation for one frame
1340  bool ActiveIdAllowOverlap; // Active widget allows another widget to steal active id (generally for overlapping widgets, but not always)
1341  bool ActiveIdNoClearOnFocusLoss; // Disable losing active id if the active id window gets unfocused.
1342  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.
1343  bool ActiveIdHasBeenEditedBefore; // Was the value associated to the widget Edited over the course of the Active state.
1344  bool ActiveIdHasBeenEditedThisFrame;
1345  bool ActiveIdUsingMouseWheel; // Active widget will want to read mouse wheel. Blocks scrolling the underlying window.
1346  ImU32 ActiveIdUsingNavDirMask; // Active widget will want to read those nav move requests (e.g. can activate a button and move away from it)
1347  ImU32 ActiveIdUsingNavInputMask; // Active widget will want to read those nav inputs.
1348  ImU64 ActiveIdUsingKeyInputMask; // Active widget will want to read those key inputs. When we grow the ImGuiKey enum we'll need to either to order the enum to make useful keys come first, either redesign this into e.g. a small array.
1349  ImVec2 ActiveIdClickOffset; // Clicked offset from upper-left corner, if applicable (currently only set by ButtonBehavior)
1350  ImGuiWindow* ActiveIdWindow;
1351  ImGuiInputSource ActiveIdSource; // Activating with mouse or nav (gamepad/keyboard)
1352  int ActiveIdMouseButton;
1353  ImGuiID ActiveIdPreviousFrame;
1354  bool ActiveIdPreviousFrameIsAlive;
1355  bool ActiveIdPreviousFrameHasBeenEditedBefore;
1356  ImGuiWindow* ActiveIdPreviousFrameWindow;
1357  ImGuiID LastActiveId; // Store the last non-zero ActiveId, useful for animation.
1358  float LastActiveIdTimer; // Store the last non-zero ActiveId timer since the beginning of activation, useful for animation.
1359 
1360  // Next window/item data
1361  ImGuiNextWindowData NextWindowData; // Storage for SetNextWindow** functions
1362  ImGuiNextItemData NextItemData; // Storage for SetNextItem** functions
1363 
1364  // Shared stacks
1365  ImVector<ImGuiColorMod> ColorStack; // Stack for PushStyleColor()/PopStyleColor() - inherited by Begin()
1366  ImVector<ImGuiStyleMod> StyleVarStack; // Stack for PushStyleVar()/PopStyleVar() - inherited by Begin()
1367  ImVector<ImFont*> FontStack; // Stack for PushFont()/PopFont() - inherited by Begin()
1368  ImVector<ImGuiID> FocusScopeStack; // Stack for PushFocusScope()/PopFocusScope() - not inherited by Begin(), unless child window
1369  ImVector<ImGuiItemFlags>ItemFlagsStack; // Stack for PushItemFlag()/PopItemFlag() - inherited by Begin()
1370  ImVector<ImGuiGroupData>GroupStack; // Stack for BeginGroup()/EndGroup() - not inherited by Begin()
1371  ImVector<ImGuiPopupData>OpenPopupStack; // Which popups are open (persistent)
1372  ImVector<ImGuiPopupData>BeginPopupStack; // Which level of BeginPopup() we are in (reset every frame)
1373 
1374  // Viewports
1375  ImVector<ImGuiViewportP*> Viewports; // Active viewports (Size==1 in 'master' branch). Each viewports hold their copy of ImDrawData.
1376 
1377  // Gamepad/keyboard Navigation
1378  ImGuiWindow* NavWindow; // Focused window for navigation. Could be called 'FocusWindow'
1379  ImGuiID NavId; // Focused item for navigation
1380  ImGuiID NavFocusScopeId; // Identify a selection scope (selection code often wants to "clear other items" when landing on an item of the selection set)
1381  ImGuiID NavActivateId; // ~~ (g.ActiveId == 0) && IsNavInputPressed(ImGuiNavInput_Activate) ? NavId : 0, also set when calling ActivateItem()
1382  ImGuiID NavActivateDownId; // ~~ IsNavInputDown(ImGuiNavInput_Activate) ? NavId : 0
1383  ImGuiID NavActivatePressedId; // ~~ IsNavInputPressed(ImGuiNavInput_Activate) ? NavId : 0
1384  ImGuiID NavInputId; // ~~ IsNavInputPressed(ImGuiNavInput_Input) ? NavId : 0
1385  ImGuiID NavJustTabbedId; // Just tabbed to this id.
1386  ImGuiID NavJustMovedToId; // Just navigated to this id (result of a successfully MoveRequest).
1387  ImGuiID NavJustMovedToFocusScopeId; // Just navigated to this focus scope id (result of a successfully MoveRequest).
1388  ImGuiKeyModFlags NavJustMovedToKeyMods;
1389  ImGuiID NavNextActivateId; // Set by ActivateItem(), queued until next frame.
1390  ImGuiInputSource NavInputSource; // Keyboard or Gamepad mode? THIS WILL ONLY BE None or NavGamepad or NavKeyboard.
1391  ImRect NavScoringRect; // Rectangle used for scoring, in screen space. Based of window->NavRectRel[], modified for directional navigation scoring.
1392  int NavScoringCount; // Metrics for debugging
1393  ImGuiNavLayer NavLayer; // Layer we are navigating on. For now the system is hard-coded for 0=main contents and 1=menu/title bar, may expose layers later.
1394  int NavIdTabCounter; // == NavWindow->DC.FocusIdxTabCounter at time of NavId processing
1395  bool NavIdIsAlive; // Nav widget has been seen this frame ~~ NavRectRel is valid
1396  bool NavMousePosDirty; // When set we will update mouse position if (io.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos) if set (NB: this not enabled by default)
1397  bool NavDisableHighlight; // When user starts using mouse, we hide gamepad/keyboard highlight (NB: but they are still available, which is why NavDisableHighlight isn't always != NavDisableMouseHover)
1398  bool NavDisableMouseHover; // When user starts using gamepad/keyboard, we hide mouse hovering highlight until mouse is touched again.
1399  bool NavAnyRequest; // ~~ NavMoveRequest || NavInitRequest
1400  bool NavInitRequest; // Init request for appearing window to select first item
1401  bool NavInitRequestFromMove;
1402  ImGuiID NavInitResultId; // Init request result (first item of the window, or one for which SetItemDefaultFocus() was called)
1403  ImRect NavInitResultRectRel; // Init request result rectangle (relative to parent window)
1404  bool NavMoveRequest; // Move request for this frame
1405  ImGuiNavMoveFlags NavMoveRequestFlags;
1406  ImGuiNavForward NavMoveRequestForward; // None / ForwardQueued / ForwardActive (this is used to navigate sibling parent menus from a child menu)
1407  ImGuiKeyModFlags NavMoveRequestKeyMods;
1408  ImGuiDir NavMoveDir, NavMoveDirLast; // Direction of the move request (left/right/up/down), direction of the previous move request
1409  ImGuiDir NavMoveClipDir; // FIXME-NAV: Describe the purpose of this better. Might want to rename?
1410  ImGuiNavMoveResult NavMoveResultLocal; // Best move request candidate within NavWindow
1411  ImGuiNavMoveResult NavMoveResultLocalVisibleSet; // Best move request candidate within NavWindow that are mostly visible (when using ImGuiNavMoveFlags_AlsoScoreVisibleSet flag)
1412  ImGuiNavMoveResult NavMoveResultOther; // Best move request candidate within NavWindow's flattened hierarchy (when using ImGuiWindowFlags_NavFlattened flag)
1413  ImGuiWindow* NavWrapRequestWindow; // Window which requested trying nav wrap-around.
1414  ImGuiNavMoveFlags NavWrapRequestFlags; // Wrap-around operation flags.
1415 
1416  // Navigation: Windowing (CTRL+TAB for list, or Menu button + keys or directional pads to move/resize)
1417  ImGuiWindow* NavWindowingTarget; // Target window when doing CTRL+Tab (or Pad Menu + FocusPrev/Next), this window is temporarily displayed top-most!
1418  ImGuiWindow* NavWindowingTargetAnim; // Record of last valid NavWindowingTarget until DimBgRatio and NavWindowingHighlightAlpha becomes 0.0f, so the fade-out can stay on it.
1419  ImGuiWindow* NavWindowingListWindow; // Internal window actually listing the CTRL+Tab contents
1420  float NavWindowingTimer;
1421  float NavWindowingHighlightAlpha;
1422  bool NavWindowingToggleLayer;
1423 
1424  // Legacy Focus/Tabbing system (older than Nav, active even if Nav is disabled, misnamed. FIXME-NAV: This needs a redesign!)
1425  ImGuiWindow* TabFocusRequestCurrWindow; //
1426  ImGuiWindow* TabFocusRequestNextWindow; //
1427  int TabFocusRequestCurrCounterRegular; // Any item being requested for focus, stored as an index (we on layout to be stable between the frame pressing TAB and the next frame, semi-ouch)
1428  int TabFocusRequestCurrCounterTabStop; // Tab item being requested for focus, stored as an index
1429  int TabFocusRequestNextCounterRegular; // Stored for next frame
1430  int TabFocusRequestNextCounterTabStop; // "
1431  bool TabFocusPressed; //
1432 
1433  // Render
1434  float DimBgRatio; // 0.0..1.0 animation when fading in a dimming background (for modal window and CTRL+TAB list)
1435  ImGuiMouseCursor MouseCursor;
1436 
1437  // Drag and Drop
1438  bool DragDropActive;
1439  bool DragDropWithinSource; // Set when within a BeginDragDropXXX/EndDragDropXXX block for a drag source.
1440  bool DragDropWithinTarget; // Set when within a BeginDragDropXXX/EndDragDropXXX block for a drag target.
1441  ImGuiDragDropFlags DragDropSourceFlags;
1442  int DragDropSourceFrameCount;
1443  int DragDropMouseButton;
1444  ImGuiPayload DragDropPayload;
1445  ImRect DragDropTargetRect; // Store rectangle of current target candidate (we favor small targets when overlapping)
1446  ImGuiID DragDropTargetId;
1447  ImGuiDragDropFlags DragDropAcceptFlags;
1448  float DragDropAcceptIdCurrRectSurface; // Target item surface (we resolve overlapping targets by prioritizing the smaller surface)
1449  ImGuiID DragDropAcceptIdCurr; // Target item id (set at the time of accepting the payload)
1450  ImGuiID DragDropAcceptIdPrev; // Target item id from previous frame (we need to store this to allow for overlapping drag and drop targets)
1451  int DragDropAcceptFrameCount; // Last time a target expressed a desire to accept the source
1452  ImGuiID DragDropHoldJustPressedId; // Set when holding a payload just made ButtonBehavior() return a press.
1453  ImVector<unsigned char> DragDropPayloadBufHeap; // We don't expose the ImVector<> directly, ImGuiPayload only holds pointer+size
1454  unsigned char DragDropPayloadBufLocal[16]; // Local buffer for small payloads
1455 
1456  // Table
1457  ImGuiTable* CurrentTable;
1458  ImPool<ImGuiTable> Tables;
1459  ImVector<ImGuiPtrOrIndex> CurrentTableStack;
1460  ImVector<float> TablesLastTimeActive; // Last used timestamp of each tables (SOA, for efficient GC)
1461  ImVector<ImDrawChannel> DrawChannelsTempMergeBuffer;
1462 
1463  // Tab bars
1464  ImGuiTabBar* CurrentTabBar;
1465  ImPool<ImGuiTabBar> TabBars;
1466  ImVector<ImGuiPtrOrIndex> CurrentTabBarStack;
1467  ImVector<ImGuiShrinkWidthItem> ShrinkWidthBuffer;
1468 
1469  // Widget state
1470  ImVec2 LastValidMousePos;
1471  ImGuiInputTextState InputTextState;
1472  ImFont InputTextPasswordFont;
1473  ImGuiID TempInputId; // Temporary text input when CTRL+clicking on a slider, etc.
1474  ImGuiColorEditFlags ColorEditOptions; // Store user options for color edit widgets
1475  float ColorEditLastHue; // Backup of last Hue associated to LastColor[3], so we can restore Hue in lossy RGB<>HSV round trips
1476  float ColorEditLastSat; // Backup of last Saturation associated to LastColor[3], so we can restore Saturation in lossy RGB<>HSV round trips
1477  float ColorEditLastColor[3];
1478  ImVec4 ColorPickerRef; // Initial/reference color at the time of opening the color picker.
1479  float SliderCurrentAccum; // Accumulated slider delta when using navigation controls.
1480  bool SliderCurrentAccumDirty; // Has the accumulated slider delta changed since last time we tried to apply it?
1481  bool DragCurrentAccumDirty;
1482  float DragCurrentAccum; // Accumulator for dragging modification. Always high-precision, not rounded by end-user precision settings
1483  float DragSpeedDefaultRatio; // If speed == 0.0f, uses (max-min) * DragSpeedDefaultRatio
1484  float ScrollbarClickDeltaToGrabCenter; // Distance between mouse and center of grab box, normalized in parent space. Use storage?
1485  int TooltipOverrideCount;
1486  float TooltipSlowDelay; // Time before slow tooltips appears (FIXME: This is temporary until we merge in tooltip timer+priority work)
1487  ImVector<char> ClipboardHandlerData; // If no custom clipboard handler is defined
1488  ImVector<ImGuiID> MenusIdSubmittedThisFrame; // A list of menu IDs that were rendered at least once
1489 
1490  // Platform support
1491  ImVec2 PlatformImePos; // Cursor position request & last passed to the OS Input Method Editor
1492  ImVec2 PlatformImeLastPos;
1493  char PlatformLocaleDecimalPoint; // '.' or *localeconv()->decimal_point
1494 
1495  // Settings
1496  bool SettingsLoaded;
1497  float SettingsDirtyTimer; // Save .ini Settings to memory when time reaches zero
1498  ImGuiTextBuffer SettingsIniData; // In memory .ini settings
1499  ImVector<ImGuiSettingsHandler> SettingsHandlers; // List of .ini settings handlers
1500  ImChunkStream<ImGuiWindowSettings> SettingsWindows; // ImGuiWindow .ini settings entries
1501  ImChunkStream<ImGuiTableSettings> SettingsTables; // ImGuiTable .ini settings entries
1502  ImVector<ImGuiContextHook> Hooks; // Hooks for extensions (e.g. test engine)
1503  ImGuiID HookIdNext; // Next available HookId
1504 
1505  // Capture/Logging
1506  bool LogEnabled; // Currently capturing
1507  ImGuiLogType LogType; // Capture target
1508  ImFileHandle LogFile; // If != NULL log to stdout/ file
1509  ImGuiTextBuffer LogBuffer; // Accumulation buffer when log to clipboard. This is pointer so our GImGui static constructor doesn't call heap allocators.
1510  const char* LogNextPrefix;
1511  const char* LogNextSuffix;
1512  float LogLinePosY;
1513  bool LogLineFirstItem;
1514  int LogDepthRef;
1515  int LogDepthToExpand;
1516  int LogDepthToExpandDefault; // Default/stored value for LogDepthMaxExpand if not specified in the LogXXX function call.
1517 
1518  // Debug Tools
1519  bool DebugItemPickerActive; // Item picker is active (started with DebugStartItemPicker())
1520  ImGuiID DebugItemPickerBreakId; // Will call IM_DEBUG_BREAK() when encountering this id
1521  ImGuiMetricsConfig DebugMetricsConfig;
1522 
1523  // Misc
1524  float FramerateSecPerFrame[120]; // Calculate estimate of framerate for user over the last 2 seconds.
1525  int FramerateSecPerFrameIdx;
1526  float FramerateSecPerFrameAccum;
1527  int WantCaptureMouseNextFrame; // Explicit capture via CaptureKeyboardFromApp()/CaptureMouseFromApp() sets those flags
1528  int WantCaptureKeyboardNextFrame;
1529  int WantTextInputNextFrame;
1530  char TempBuffer[1024 * 3 + 1]; // Temporary text buffer
1531 
1532  ImGuiContext(ImFontAtlas* shared_font_atlas)
1533  {
1534  Initialized = false;
1535  FontAtlasOwnedByContext = shared_font_atlas ? false : true;
1536  Font = NULL;
1537  FontSize = FontBaseSize = 0.0f;
1538  IO.Fonts = shared_font_atlas ? shared_font_atlas : IM_NEW(ImFontAtlas)();
1539  Time = 0.0f;
1540  FrameCount = 0;
1541  FrameCountEnded = FrameCountRendered = -1;
1542  WithinFrameScope = WithinFrameScopeWithImplicitWindow = WithinEndChild = false;
1543  GcCompactAll = false;
1544  TestEngineHookItems = false;
1545  TestEngineHookIdInfo = 0;
1546  TestEngine = NULL;
1547 
1548  WindowsActiveCount = 0;
1549  CurrentWindow = NULL;
1550  HoveredWindow = NULL;
1551  HoveredWindowUnderMovingWindow = NULL;
1552  MovingWindow = NULL;
1553  WheelingWindow = NULL;
1554  WheelingWindowTimer = 0.0f;
1555 
1556  HoveredId = HoveredIdPreviousFrame = 0;
1557  HoveredIdAllowOverlap = false;
1558  HoveredIdUsingMouseWheel = HoveredIdPreviousFrameUsingMouseWheel = false;
1559  HoveredIdDisabled = false;
1560  HoveredIdTimer = HoveredIdNotActiveTimer = 0.0f;
1561  ActiveId = 0;
1562  ActiveIdIsAlive = 0;
1563  ActiveIdTimer = 0.0f;
1564  ActiveIdIsJustActivated = false;
1565  ActiveIdAllowOverlap = false;
1566  ActiveIdNoClearOnFocusLoss = false;
1567  ActiveIdHasBeenPressedBefore = false;
1568  ActiveIdHasBeenEditedBefore = false;
1569  ActiveIdHasBeenEditedThisFrame = false;
1570  ActiveIdUsingMouseWheel = false;
1571  ActiveIdUsingNavDirMask = 0x00;
1572  ActiveIdUsingNavInputMask = 0x00;
1573  ActiveIdUsingKeyInputMask = 0x00;
1574  ActiveIdClickOffset = ImVec2(-1, -1);
1575  ActiveIdWindow = NULL;
1576  ActiveIdSource = ImGuiInputSource_None;
1577  ActiveIdMouseButton = -1;
1578  ActiveIdPreviousFrame = 0;
1579  ActiveIdPreviousFrameIsAlive = false;
1580  ActiveIdPreviousFrameHasBeenEditedBefore = false;
1581  ActiveIdPreviousFrameWindow = NULL;
1582  LastActiveId = 0;
1583  LastActiveIdTimer = 0.0f;
1584 
1585  NavWindow = NULL;
1586  NavId = NavFocusScopeId = NavActivateId = NavActivateDownId = NavActivatePressedId = NavInputId = 0;
1587  NavJustTabbedId = NavJustMovedToId = NavJustMovedToFocusScopeId = NavNextActivateId = 0;
1588  NavJustMovedToKeyMods = ImGuiKeyModFlags_None;
1589  NavInputSource = ImGuiInputSource_None;
1590  NavScoringRect = ImRect();
1591  NavScoringCount = 0;
1592  NavLayer = ImGuiNavLayer_Main;
1593  NavIdTabCounter = INT_MAX;
1594  NavIdIsAlive = false;
1595  NavMousePosDirty = false;
1596  NavDisableHighlight = true;
1597  NavDisableMouseHover = false;
1598  NavAnyRequest = false;
1599  NavInitRequest = false;
1600  NavInitRequestFromMove = false;
1601  NavInitResultId = 0;
1602  NavMoveRequest = false;
1603  NavMoveRequestFlags = ImGuiNavMoveFlags_None;
1604  NavMoveRequestForward = ImGuiNavForward_None;
1605  NavMoveRequestKeyMods = ImGuiKeyModFlags_None;
1606  NavMoveDir = NavMoveDirLast = NavMoveClipDir = ImGuiDir_None;
1607  NavWrapRequestWindow = NULL;
1608  NavWrapRequestFlags = ImGuiNavMoveFlags_None;
1609 
1610  NavWindowingTarget = NavWindowingTargetAnim = NavWindowingListWindow = NULL;
1611  NavWindowingTimer = NavWindowingHighlightAlpha = 0.0f;
1612  NavWindowingToggleLayer = false;
1613 
1614  TabFocusRequestCurrWindow = TabFocusRequestNextWindow = NULL;
1615  TabFocusRequestCurrCounterRegular = TabFocusRequestCurrCounterTabStop = INT_MAX;
1616  TabFocusRequestNextCounterRegular = TabFocusRequestNextCounterTabStop = INT_MAX;
1617  TabFocusPressed = false;
1618 
1619  DimBgRatio = 0.0f;
1620  MouseCursor = ImGuiMouseCursor_Arrow;
1621 
1622  DragDropActive = DragDropWithinSource = DragDropWithinTarget = false;
1623  DragDropSourceFlags = ImGuiDragDropFlags_None;
1624  DragDropSourceFrameCount = -1;
1625  DragDropMouseButton = -1;
1626  DragDropTargetId = 0;
1627  DragDropAcceptFlags = ImGuiDragDropFlags_None;
1628  DragDropAcceptIdCurrRectSurface = 0.0f;
1629  DragDropAcceptIdPrev = DragDropAcceptIdCurr = 0;
1630  DragDropAcceptFrameCount = -1;
1631  DragDropHoldJustPressedId = 0;
1632  memset(DragDropPayloadBufLocal, 0, sizeof(DragDropPayloadBufLocal));
1633 
1634  CurrentTable = NULL;
1635  CurrentTabBar = NULL;
1636 
1637  LastValidMousePos = ImVec2(0.0f, 0.0f);
1638  TempInputId = 0;
1639  ColorEditOptions = ImGuiColorEditFlags__OptionsDefault;
1640  ColorEditLastHue = ColorEditLastSat = 0.0f;
1641  ColorEditLastColor[0] = ColorEditLastColor[1] = ColorEditLastColor[2] = FLT_MAX;
1642  SliderCurrentAccum = 0.0f;
1643  SliderCurrentAccumDirty = false;
1644  DragCurrentAccumDirty = false;
1645  DragCurrentAccum = 0.0f;
1646  DragSpeedDefaultRatio = 1.0f / 100.0f;
1647  ScrollbarClickDeltaToGrabCenter = 0.0f;
1648  TooltipOverrideCount = 0;
1649  TooltipSlowDelay = 0.50f;
1650 
1651  PlatformImePos = PlatformImeLastPos = ImVec2(FLT_MAX, FLT_MAX);
1652  PlatformLocaleDecimalPoint = '.';
1653 
1654  SettingsLoaded = false;
1655  SettingsDirtyTimer = 0.0f;
1656  HookIdNext = 0;
1657 
1658  LogEnabled = false;
1659  LogType = ImGuiLogType_None;
1660  LogNextPrefix = LogNextSuffix = NULL;
1661  LogFile = NULL;
1662  LogLinePosY = FLT_MAX;
1663  LogLineFirstItem = false;
1664  LogDepthRef = 0;
1665  LogDepthToExpand = LogDepthToExpandDefault = 2;
1666 
1667  DebugItemPickerActive = false;
1668  DebugItemPickerBreakId = 0;
1669 
1670  memset(FramerateSecPerFrame, 0, sizeof(FramerateSecPerFrame));
1671  FramerateSecPerFrameIdx = 0;
1672  FramerateSecPerFrameAccum = 0.0f;
1673  WantCaptureMouseNextFrame = WantCaptureKeyboardNextFrame = WantTextInputNextFrame = -1;
1674  memset(TempBuffer, 0, sizeof(TempBuffer));
1675  }
1676 };
1677 
1678 //-----------------------------------------------------------------------------
1679 // [SECTION] ImGuiWindowTempData, ImGuiWindow
1680 //-----------------------------------------------------------------------------
1681 
1682 // Transient per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the DC variable name in ImGuiWindow.
1683 // (That's theory, in practice the delimitation between ImGuiWindow and ImGuiWindowTempData is quite tenuous and could be reconsidered..)
1684 // (This doesn't need a constructor because we zero-clear it as part of ImGuiWindow and all frame-temporary data are setup on Begin)
1685 struct IMGUI_API ImGuiWindowTempData
1686 {
1687  // Layout
1688  ImVec2 CursorPos; // Current emitting position, in absolute coordinates.
1689  ImVec2 CursorPosPrevLine;
1690  ImVec2 CursorStartPos; // Initial position after Begin(), generally ~ window position + WindowPadding.
1691  ImVec2 CursorMaxPos; // Used to implicitly calculate ContentSize at the beginning of next frame, for scrolling range and auto-resize. Always growing during the frame.
1692  ImVec2 IdealMaxPos; // Used to implicitly calculate ContentSizeIdeal at the beginning of next frame, for auto-resize only. Always growing during the frame.
1693  ImVec2 CurrLineSize;
1694  ImVec2 PrevLineSize;
1695  float CurrLineTextBaseOffset; // Baseline offset (0.0f by default on a new line, generally == style.FramePadding.y when a framed item has been added).
1696  float PrevLineTextBaseOffset;
1697  ImVec1 Indent; // Indentation / start position from left of window (increased by TreePush/TreePop, etc.)
1698  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.
1699  ImVec1 GroupOffset;
1700 
1701  // Last item status
1702  ImGuiID LastItemId; // ID for last item
1703  ImGuiItemStatusFlags LastItemStatusFlags; // Status flags for last item (see ImGuiItemStatusFlags_)
1704  ImRect LastItemRect; // Interaction rect for last item
1705  ImRect LastItemDisplayRect; // End-user display rect for last item (only valid if LastItemStatusFlags & ImGuiItemStatusFlags_HasDisplayRect)
1706 
1707  // Keyboard/Gamepad navigation
1708  ImGuiNavLayer NavLayerCurrent; // Current layer, 0..31 (we currently only use 0..1)
1709  int NavLayerActiveMask; // Which layers have been written to (result from previous frame)
1710  int NavLayerActiveMaskNext; // Which layers have been written to (accumulator for current frame)
1711  ImGuiID NavFocusScopeIdCurrent; // Current focus scope ID while appending
1712  bool NavHideHighlightOneFrame;
1713  bool NavHasScroll; // Set when scrolling can be used (ScrollMax > 0.0f)
1714 
1715  // Miscellaneous
1716  bool MenuBarAppending; // FIXME: Remove this
1717  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.
1718  ImGuiMenuColumns MenuColumns; // Simplified columns storage for menu items measurement
1719  int TreeDepth; // Current tree depth.
1720  ImU32 TreeJumpToParentOnPopMask; // Store a copy of !g.NavIdIsAlive for TreeDepth 0..31.. Could be turned into a ImU64 if necessary.
1721  ImVector<ImGuiWindow*> ChildWindows;
1722  ImGuiStorage* StateStorage; // Current persistent per-window storage (store e.g. tree node open/close state)
1723  ImGuiOldColumns* CurrentColumns; // Current columns set
1724  int CurrentTableIdx; // Current table index (into g.Tables)
1725  ImGuiLayoutType LayoutType;
1726  ImGuiLayoutType ParentLayoutType; // Layout type of parent window at the time of Begin()
1727  int FocusCounterRegular; // (Legacy Focus/Tabbing system) Sequential counter, start at -1 and increase as assigned via FocusableItemRegister() (FIXME-NAV: Needs redesign)
1728  int FocusCounterTabStop; // (Legacy Focus/Tabbing system) Same, but only count widgets which you can Tab through.
1729 
1730  // Local parameters stacks
1731  // 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.
1732  ImGuiItemFlags ItemFlags; // == g.ItemFlagsStack.back()
1733  float ItemWidth; // Current item width (>0.0: width in pixels, <0.0: align xx pixels to the right of window).
1734  float TextWrapPos; // Current text wrap pos.
1735  ImVector<float> ItemWidthStack; // Store item widths to restore (attention: .back() is not == ItemWidth)
1736  ImVector<float> TextWrapPosStack; // Store text wrap pos to restore (attention: .back() is not == TextWrapPos)
1737  ImGuiStackSizes StackSizesOnBegin; // Store size of various stacks for asserting
1738 };
1739 
1740 // Storage for one window
1741 struct IMGUI_API ImGuiWindow
1742 {
1743  char* Name; // Window name, owned by the window.
1744  ImGuiID ID; // == ImHashStr(Name)
1745  ImGuiWindowFlags Flags; // See enum ImGuiWindowFlags_
1746  ImVec2 Pos; // Position (always rounded-up to nearest pixel)
1747  ImVec2 Size; // Current size (==SizeFull or collapsed title bar size)
1748  ImVec2 SizeFull; // Size when non collapsed
1749  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.
1750  ImVec2 ContentSizeIdeal;
1751  ImVec2 ContentSizeExplicit; // Size of contents/scrollable client area explicitly request by the user via SetNextWindowContentSize().
1752  ImVec2 WindowPadding; // Window padding at the time of Begin().
1753  float WindowRounding; // Window rounding at the time of Begin(). May be clamped lower to avoid rendering artifacts with title bar, menu bar etc.
1754  float WindowBorderSize; // Window border size at the time of Begin().
1755  int NameBufLen; // Size of buffer storing Name. May be larger than strlen(Name)!
1756  ImGuiID MoveId; // == window->GetID("#MOVE")
1757  ImGuiID ChildId; // ID of corresponding item in parent window (for navigation to return from child window to parent window)
1758  ImVec2 Scroll;
1759  ImVec2 ScrollMax;
1760  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)
1761  ImVec2 ScrollTargetCenterRatio; // 0.0f = scroll so that target position is at top, 0.5f = scroll so that target position is centered
1762  ImVec2 ScrollTargetEdgeSnapDist; // 0.0f = no snapping, >0.0f snapping threshold
1763  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.
1764  bool ScrollbarX, ScrollbarY; // Are scrollbars visible?
1765  bool Active; // Set to true on Begin(), unless Collapsed
1766  bool WasActive;
1767  bool WriteAccessed; // Set to true when any widget access the current window
1768  bool Collapsed; // Set when collapsing window to become only title-bar
1769  bool WantCollapseToggle;
1770  bool SkipItems; // Set when items can safely be all clipped (e.g. window not visible or collapsed)
1771  bool Appearing; // Set during the frame where the window is appearing (or re-appearing)
1772  bool Hidden; // Do not display (== HiddenFrames*** > 0)
1773  bool IsFallbackWindow; // Set on the "Debug##Default" window.
1774  bool HasCloseButton; // Set when the window has a close button (p_open != NULL)
1775  signed char ResizeBorderHeld; // Current border being held for resize (-1: none, otherwise 0-3)
1776  short BeginCount; // Number of Begin() during the current frame (generally 0 or 1, 1+ if appending via multiple Begin/End pairs)
1777  short BeginOrderWithinParent; // Order within immediate parent window, if we are a child window. Otherwise 0.
1778  short BeginOrderWithinContext; // Order within entire imgui context. This is mostly used for debugging submission order related issues.
1779  ImGuiID PopupId; // ID in the popup stack when this window is used as a popup/menu (because we use generic Name/ID for recycling)
1780  ImS8 AutoFitFramesX, AutoFitFramesY;
1781  ImS8 AutoFitChildAxises;
1782  bool AutoFitOnlyGrows;
1783  ImGuiDir AutoPosLastDirection;
1784  ImS8 HiddenFramesCanSkipItems; // Hide the window for N frames
1785  ImS8 HiddenFramesCannotSkipItems; // Hide the window for N frames while allowing items to be submitted so we can measure their size
1786  ImS8 HiddenFramesForRenderOnly; // Hide the window until frame N at Render() time only
1787  ImGuiCond SetWindowPosAllowFlags : 8; // store acceptable condition flags for SetNextWindowPos() use.
1788  ImGuiCond SetWindowSizeAllowFlags : 8; // store acceptable condition flags for SetNextWindowSize() use.
1789  ImGuiCond SetWindowCollapsedAllowFlags : 8; // store acceptable condition flags for SetNextWindowCollapsed() use.
1790  ImVec2 SetWindowPosVal; // store window position when using a non-zero Pivot (position set needs to be processed when we know the window size)
1791  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.
1792 
1793  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)
1794  ImGuiWindowTempData DC; // Temporary per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the "DC" variable name.
1795 
1796  // The best way to understand what those rectangles are is to use the 'Metrics->Tools->Show Windows Rectangles' viewer.
1797  // The main 'OuterRect', omitted as a field, is window->Rect().
1798  ImRect OuterRectClipped; // == Window->Rect() just after setup in Begin(). == window->Rect() for root window.
1799  ImRect InnerRect; // Inner rectangle (omit title bar, menu bar, scroll bar)
1800  ImRect InnerClipRect; // == InnerRect shrunk by WindowPadding*0.5f on each side, clipped within viewport or parent clip rect.
1801  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).
1802  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?
1803  ImRect ClipRect; // Current clipping/scissoring rectangle, evolve as we are using PushClipRect(), etc. == DrawList->clip_rect_stack.back().
1804  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.
1805  ImVec2ih HitTestHoleSize; // Define an optional rectangular hole where mouse will pass-through the window.
1806  ImVec2ih HitTestHoleOffset;
1807 
1808  int LastFrameActive; // Last frame number the window was Active.
1809  float LastTimeActive; // Last timestamp the window was Active (using float as we don't need high precision there)
1810  float ItemWidthDefault;
1811  ImGuiStorage StateStorage;
1812  ImVector<ImGuiOldColumns> ColumnsStorage;
1813  float FontWindowScale; // User scale multiplier per-window, via SetWindowFontScale()
1814  int SettingsOffset; // Offset into SettingsWindows[] (offsets are always valid as we only grow the array from the back)
1815 
1816  ImDrawList* DrawList; // == &DrawListInst (for backward compatibility reason with code using imgui_internal.h we keep this a pointer)
1817  ImDrawList DrawListInst;
1818  ImGuiWindow* ParentWindow; // If we are a child _or_ popup window, this is pointing to our parent. Otherwise NULL.
1819  ImGuiWindow* RootWindow; // Point to ourself or first ancestor that is not a child window == Top-level window.
1820  ImGuiWindow* RootWindowForTitleBarHighlight; // Point to ourself or first ancestor which will display TitleBgActive color when this window is active.
1821  ImGuiWindow* RootWindowForNav; // Point to ourself or first ancestor which doesn't have the NavFlattened flag.
1822 
1823  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.)
1824  ImGuiID NavLastIds[ImGuiNavLayer_COUNT]; // Last known NavId for this window, per layer (0/1)
1825  ImRect NavRectRel[ImGuiNavLayer_COUNT]; // Reference rectangle, in window relative space
1826 
1827  int MemoryDrawListIdxCapacity; // Backup of last idx/vtx count, so when waking up the window we can preallocate and avoid iterative alloc/copy
1828  int MemoryDrawListVtxCapacity;
1829  bool MemoryCompacted; // Set when window extraneous data have been garbage collected
1830 
1831 public:
1832  ImGuiWindow(ImGuiContext* context, const char* name);
1833  ~ImGuiWindow();
1834 
1835  ImGuiID GetID(const char* str, const char* str_end = NULL);
1836  ImGuiID GetID(const void* ptr);
1837  ImGuiID GetID(int n);
1838  ImGuiID GetIDNoKeepAlive(const char* str, const char* str_end = NULL);
1839  ImGuiID GetIDNoKeepAlive(const void* ptr);
1840  ImGuiID GetIDNoKeepAlive(int n);
1841  ImGuiID GetIDFromRectangle(const ImRect& r_abs);
1842 
1843  // We don't use g.FontSize because the window may be != g.CurrentWidow.
1844  ImRect Rect() const { return ImRect(Pos.x, Pos.y, Pos.x + Size.x, Pos.y + Size.y); }
1845  float CalcFontSize() const { ImGuiContext& g = *GImGui; float scale = g.FontBaseSize * FontWindowScale; if (ParentWindow) scale *= ParentWindow->FontWindowScale; return scale; }
1846  float TitleBarHeight() const { ImGuiContext& g = *GImGui; return (Flags & ImGuiWindowFlags_NoTitleBar) ? 0.0f : CalcFontSize() + g.Style.FramePadding.y * 2.0f; }
1847  ImRect TitleBarRect() const { return ImRect(Pos, ImVec2(Pos.x + SizeFull.x, Pos.y + TitleBarHeight())); }
1848  float MenuBarHeight() const { ImGuiContext& g = *GImGui; return (Flags & ImGuiWindowFlags_MenuBar) ? DC.MenuBarOffset.y + CalcFontSize() + g.Style.FramePadding.y * 2.0f : 0.0f; }
1849  ImRect MenuBarRect() const { float y1 = Pos.y + TitleBarHeight(); return ImRect(Pos.x, y1, Pos.x + SizeFull.x, y1 + MenuBarHeight()); }
1850 };
1851 
1852 // Backup and restore just enough data to be able to use IsItemHovered() on item A after another B in the same window has overwritten the data.
1854 {
1855  ImGuiID LastItemId;
1856  ImGuiItemStatusFlags LastItemStatusFlags;
1857  ImRect LastItemRect;
1858  ImRect LastItemDisplayRect;
1859 
1860  ImGuiLastItemDataBackup() { Backup(); }
1861  void Backup() { ImGuiWindow* window = GImGui->CurrentWindow; LastItemId = window->DC.LastItemId; LastItemStatusFlags = window->DC.LastItemStatusFlags; LastItemRect = window->DC.LastItemRect; LastItemDisplayRect = window->DC.LastItemDisplayRect; }
1862  void Restore() const { ImGuiWindow* window = GImGui->CurrentWindow; window->DC.LastItemId = LastItemId; window->DC.LastItemStatusFlags = LastItemStatusFlags; window->DC.LastItemRect = LastItemRect; window->DC.LastItemDisplayRect = LastItemDisplayRect; }
1863 };
1864 
1865 //-----------------------------------------------------------------------------
1866 // [SECTION] Tab bar, Tab item support
1867 //-----------------------------------------------------------------------------
1868 
1869 // Extend ImGuiTabBarFlags_
1870 enum ImGuiTabBarFlagsPrivate_
1871 {
1872  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]
1873  ImGuiTabBarFlags_IsFocused = 1 << 21,
1874  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
1875 };
1876 
1877 // Extend ImGuiTabItemFlags_
1878 enum ImGuiTabItemFlagsPrivate_
1879 {
1880  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)
1881  ImGuiTabItemFlags_Button = 1 << 21 // Used by TabItemButton, change the tab item behavior to mimic a button
1882 };
1883 
1884 // Storage for one active tab item (sizeof() 28~32 bytes)
1886 {
1887  ImGuiID ID;
1888  ImGuiTabItemFlags Flags;
1889  int LastFrameVisible;
1890  int LastFrameSelected; // This allows us to infer an ordered list of the last activated tabs with little maintenance
1891  float Offset; // Position relative to beginning of tab
1892  float Width; // Width currently displayed
1893  float ContentWidth; // Width of label, stored during BeginTabItem() call
1894  ImS16 NameOffset; // When Window==NULL, offset to name within parent ImGuiTabBar::TabsNames
1895  ImS16 BeginOrder; // BeginTabItem() order, used to re-order tabs after toggling ImGuiTabBarFlags_Reorderable
1896  ImS16 IndexDuringLayout; // Index only used during TabBarLayout()
1897  bool WantClose; // Marked as closed by SetTabItemClosed()
1898 
1899  ImGuiTabItem() { memset(this, 0, sizeof(*this)); LastFrameVisible = LastFrameSelected = -1; NameOffset = BeginOrder = IndexDuringLayout = -1; }
1900 };
1901 
1902 // Storage for a tab bar (sizeof() 152 bytes)
1904 {
1906  ImGuiTabBarFlags Flags;
1907  ImGuiID ID; // Zero for tab-bars used by docking
1908  ImGuiID SelectedTabId; // Selected tab/window
1909  ImGuiID NextSelectedTabId; // Next selected tab/window. Will also trigger a scrolling animation
1910  ImGuiID VisibleTabId; // Can occasionally be != SelectedTabId (e.g. when previewing contents for CTRL+TAB preview)
1911  int CurrFrameVisible;
1912  int PrevFrameVisible;
1913  ImRect BarRect;
1914  float CurrTabsContentsHeight;
1915  float PrevTabsContentsHeight; // Record the height of contents submitted below the tab bar
1916  float WidthAllTabs; // Actual width of all tabs (locked during layout)
1917  float WidthAllTabsIdeal; // Ideal width if all tabs were visible and not clipped
1918  float ScrollingAnim;
1919  float ScrollingTarget;
1920  float ScrollingTargetDistToVisibility;
1921  float ScrollingSpeed;
1922  float ScrollingRectMinX;
1923  float ScrollingRectMaxX;
1924  ImGuiID ReorderRequestTabId;
1925  ImS8 ReorderRequestDir;
1926  ImS8 BeginCount;
1927  bool WantLayout;
1928  bool VisibleTabWasSubmitted;
1929  bool TabsAddedNew; // Set to true when a new tab item or button has been added to the tab bar during last frame
1930  ImS16 TabsActiveCount; // Number of tabs submitted this frame.
1931  ImS16 LastTabItemIdx; // Index of last BeginTabItem() tab for use by EndTabItem()
1932  float ItemSpacingY;
1933  ImVec2 FramePadding; // style.FramePadding locked at the time of BeginTabBar()
1934  ImVec2 BackupCursorPos;
1935  ImGuiTextBuffer TabsNames; // For non-docking tab bar we re-append names in a contiguous buffer.
1936 
1937  ImGuiTabBar();
1938  int GetTabOrder(const ImGuiTabItem* tab) const { return Tabs.index_from_ptr(tab); }
1939  const char* GetTabName(const ImGuiTabItem* tab) const
1940  {
1941  IM_ASSERT(tab->NameOffset != -1 && (int)tab->NameOffset < TabsNames.Buf.Size);
1942  return TabsNames.Buf.Data + tab->NameOffset;
1943  }
1944 };
1945 
1946 //-----------------------------------------------------------------------------
1947 // [SECTION] Table support
1948 //-----------------------------------------------------------------------------
1949 
1950 #ifdef IMGUI_HAS_TABLE
1951 
1952 #define IM_COL32_DISABLE IM_COL32(0,0,0,1) // Special sentinel code which cannot be used as a regular color.
1953 #define IMGUI_TABLE_MAX_COLUMNS 64 // sizeof(ImU64) * 8. This is solely because we frequently encode columns set in a ImU64.
1954 #define IMGUI_TABLE_MAX_DRAW_CHANNELS (4 + 64 * 2) // See TableSetupDrawChannels()
1955 
1956 // Our current column maximum is 64 but we may raise that in the future.
1957 typedef ImS8 ImGuiTableColumnIdx;
1958 typedef ImU8 ImGuiTableDrawChannelIdx;
1959 
1960 // [Internal] sizeof() ~ 104
1961 // We use the terminology "Enabled" to refer to a column that is not Hidden by user/api.
1962 // We use the terminology "Clipped" to refer to a column that is out of sight because of scrolling/clipping.
1963 // This is in contrast with some user-facing api such as IsItemVisible() / IsRectVisible() which use "Visible" to mean "not clipped".
1964 struct ImGuiTableColumn
1965 {
1966  ImGuiTableColumnFlags Flags; // Flags after some patching (not directly same as provided by user). See ImGuiTableColumnFlags_
1967  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.
1968  float MinX; // Absolute positions
1969  float MaxX;
1970  float WidthRequest; // Master width absolute value when !(Flags & _WidthStretch). When Stretch this is derived every frame from StretchWeight in TableUpdateLayout()
1971  float WidthAuto; // Automatic width
1972  float StretchWeight; // Master width weight when (Flags & _WidthStretch). Often around ~1.0f initially.
1973  float InitStretchWeightOrWidth; // Value passed to TableSetupColumn(). For Width it is a content width (_without padding_).
1974  ImRect ClipRect; // Clipping rectangle for the column
1975  ImGuiID UserID; // Optional, value passed to TableSetupColumn()
1976  float WorkMinX; // Contents region min ~(MinX + CellPaddingX + CellSpacingX1) == cursor start position when entering column
1977  float WorkMaxX; // Contents region max ~(MaxX - CellPaddingX - CellSpacingX2)
1978  float ItemWidth; // Current item width for the column, preserved across rows
1979  float ContentMaxXFrozen; // Contents maximum position for frozen rows (apart from headers), from which we can infer content width.
1980  float ContentMaxXUnfrozen;
1981  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
1982  float ContentMaxXHeadersIdeal;
1983  ImS16 NameOffset; // Offset into parent ColumnsNames[]
1984  ImGuiTableColumnIdx DisplayOrder; // Index within Table's IndexToDisplayOrder[] (column may be reordered by users)
1985  ImGuiTableColumnIdx IndexWithinEnabledSet; // Index within enabled/visible set (<= IndexToDisplayOrder)
1986  ImGuiTableColumnIdx PrevEnabledColumn; // Index of prev enabled/visible column within Columns[], -1 if first enabled/visible column
1987  ImGuiTableColumnIdx NextEnabledColumn; // Index of next enabled/visible column within Columns[], -1 if last enabled/visible column
1988  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
1989  ImGuiTableDrawChannelIdx DrawChannelCurrent; // Index within DrawSplitter.Channels[]
1990  ImGuiTableDrawChannelIdx DrawChannelFrozen;
1991  ImGuiTableDrawChannelIdx DrawChannelUnfrozen;
1992  bool IsEnabled; // Is the column not marked Hidden by the user? (even if off view, e.g. clipped by scrolling).
1993  bool IsEnabledNextFrame;
1994  bool IsVisibleX; // Is actually in view (e.g. overlapping the host window clipping rectangle, not scrolled).
1995  bool IsVisibleY;
1996  bool IsRequestOutput; // Return value for TableSetColumnIndex() / TableNextColumn(): whether we request user to output contents or not.
1997  bool IsSkipItems; // Do we want item submissions to this column to be completely ignored (no layout will happen).
1998  bool IsPreserveWidthAuto;
1999  ImS8 NavLayerCurrent; // ImGuiNavLayer in 1 byte
2000  ImU8 AutoFitQueue; // Queue of 8 values for the next 8 frames to request auto-fit
2001  ImU8 CannotSkipItemsQueue; // Queue of 8 values for the next 8 frames to disable Clipped/SkipItem
2002  ImU8 SortDirection : 2; // ImGuiSortDirection_Ascending or ImGuiSortDirection_Descending
2003  ImU8 SortDirectionsAvailCount : 2; // Number of available sort directions (0 to 3)
2004  ImU8 SortDirectionsAvailMask : 4; // Mask of available sort directions (1-bit each)
2005  ImU8 SortDirectionsAvailList; // Ordered of available sort directions (2-bits each)
2006 
2007  ImGuiTableColumn()
2008  {
2009  memset(this, 0, sizeof(*this));
2010  StretchWeight = WidthRequest = -1.0f;
2011  NameOffset = -1;
2012  DisplayOrder = IndexWithinEnabledSet = -1;
2013  PrevEnabledColumn = NextEnabledColumn = -1;
2014  SortOrder = -1;
2015  SortDirection = ImGuiSortDirection_None;
2016  DrawChannelCurrent = DrawChannelFrozen = DrawChannelUnfrozen = (ImU8)-1;
2017  }
2018 };
2019 
2020 // Transient cell data stored per row.
2021 // sizeof() ~ 6
2022 struct ImGuiTableCellData
2023 {
2024  ImU32 BgColor; // Actual color
2025  ImGuiTableColumnIdx Column; // Column number
2026 };
2027 
2028 // FIXME-TABLE: transient data could be stored in a per-stacked table structure: DrawSplitter, SortSpecs, incoming RowData
2029 struct ImGuiTable
2030 {
2031  ImGuiID ID;
2032  ImGuiTableFlags Flags;
2033  void* RawData; // Single allocation to hold Columns[], DisplayOrderToIndex[] and RowCellData[]
2034  ImSpan<ImGuiTableColumn> Columns; // Point within RawData[]
2035  ImSpan<ImGuiTableColumnIdx> DisplayOrderToIndex; // Point within RawData[]. Store display order of columns (when not reordered, the values are 0...Count-1)
2036  ImSpan<ImGuiTableCellData> RowCellData; // Point within RawData[]. Store cells background requests for current row.
2037  ImU64 EnabledMaskByDisplayOrder; // Column DisplayOrder -> IsEnabled map
2038  ImU64 EnabledMaskByIndex; // Column Index -> IsEnabled map (== not hidden by user/api) in a format adequate for iterating column without touching cold data
2039  ImU64 VisibleMaskByIndex; // Column Index -> IsVisibleX|IsVisibleY map (== not hidden by user/api && not hidden by scrolling/cliprect)
2040  ImU64 RequestOutputMaskByIndex; // Column Index -> IsVisible || AutoFit (== expect user to submit items)
2041  ImGuiTableFlags SettingsLoadedFlags; // Which data were loaded from the .ini file (e.g. when order is not altered we won't save order)
2042  int SettingsOffset; // Offset in g.SettingsTables
2043  int LastFrameActive;
2044  int ColumnsCount; // Number of columns declared in BeginTable()
2045  int CurrentRow;
2046  int CurrentColumn;
2047  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.
2048  ImS16 InstanceInteracted; // Mark which instance (generally 0) of the same ID is being interacted with
2049  float RowPosY1;
2050  float RowPosY2;
2051  float RowMinHeight; // Height submitted to TableNextRow()
2052  float RowTextBaseline;
2053  float RowIndentOffsetX;
2054  ImGuiTableRowFlags RowFlags : 16; // Current row flags, see ImGuiTableRowFlags_
2055  ImGuiTableRowFlags LastRowFlags : 16;
2056  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.
2057  ImU32 RowBgColor[2]; // Background color override for current row.
2058  ImU32 BorderColorStrong;
2059  ImU32 BorderColorLight;
2060  float BorderX1;
2061  float BorderX2;
2062  float HostIndentX;
2063  float MinColumnWidth;
2064  float OuterPaddingX;
2065  float CellPaddingX; // Padding from each borders
2066  float CellPaddingY;
2067  float CellSpacingX1; // Spacing between non-bordered cells
2068  float CellSpacingX2;
2069  float LastOuterHeight; // Outer height from last frame
2070  float LastFirstRowHeight; // Height of first row from last frame
2071  float InnerWidth; // User value passed to BeginTable(), see comments at the top of BeginTable() for details.
2072  float ColumnsGivenWidth; // Sum of current column width
2073  float ColumnsAutoFitWidth; // Sum of ideal column width in order nothing to be clipped, used for auto-fitting and content width submission in outer window
2074  float ResizedColumnNextWidth;
2075  float ResizeLockMinContentsX2; // Lock minimum contents width while resizing down in order to not create feedback loops. But we allow growing the table.
2076  float RefScale; // Reference scale to be able to rescale columns on font/dpi changes.
2077  ImRect OuterRect; // Note: for non-scrolling table, OuterRect.Max.y is often FLT_MAX until EndTable(), unless a height has been specified in BeginTable().
2078  ImRect InnerRect; // InnerRect but without decoration. As with OuterRect, for non-scrolling tables, InnerRect.Max.y is
2079  ImRect WorkRect;
2080  ImRect InnerClipRect;
2081  ImRect BgClipRect; // We use this to cpu-clip cell background color fill
2082  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
2083  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.
2084  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.
2085  ImRect HostBackupWorkRect; // Backup of InnerWindow->WorkRect at the end of BeginTable()
2086  ImRect HostBackupParentWorkRect; // Backup of InnerWindow->ParentWorkRect at the end of BeginTable()
2087  ImRect HostBackupInnerClipRect; // Backup of InnerWindow->ClipRect during PushTableBackground()/PopTableBackground()
2088  ImVec2 HostBackupPrevLineSize; // Backup of InnerWindow->DC.PrevLineSize at the end of BeginTable()
2089  ImVec2 HostBackupCurrLineSize; // Backup of InnerWindow->DC.CurrLineSize at the end of BeginTable()
2090  ImVec2 HostBackupCursorMaxPos; // Backup of InnerWindow->DC.CursorMaxPos at the end of BeginTable()
2091  ImVec2 UserOuterSize; // outer_size.x passed to BeginTable()
2092  ImVec1 HostBackupColumnsOffset; // Backup of OuterWindow->DC.ColumnsOffset at the end of BeginTable()
2093  float HostBackupItemWidth; // Backup of OuterWindow->DC.ItemWidth at the end of BeginTable()
2094  int HostBackupItemWidthStackSize;// Backup of OuterWindow->DC.ItemWidthStack.Size at the end of BeginTable()
2095  ImGuiWindow* OuterWindow; // Parent window for the table
2096  ImGuiWindow* InnerWindow; // Window holding the table data (== OuterWindow or a child window)
2097  ImGuiTextBuffer ColumnsNames; // Contiguous buffer holding columns names
2098  ImDrawListSplitter DrawSplitter; // We carry our own ImDrawList splitter to allow recursion (FIXME: could be stored outside, worst case we need 1 splitter per recursing table)
2099  ImGuiTableColumnSortSpecs SortSpecsSingle;
2100  ImVector<ImGuiTableColumnSortSpecs> SortSpecsMulti; // FIXME-OPT: Using a small-vector pattern would work be good.
2101  ImGuiTableSortSpecs SortSpecs; // Public facing sorts specs, this is what we return in TableGetSortSpecs()
2102  ImGuiTableColumnIdx SortSpecsCount;
2103  ImGuiTableColumnIdx ColumnsEnabledCount; // Number of enabled columns (<= ColumnsCount)
2104  ImGuiTableColumnIdx ColumnsEnabledFixedCount; // Number of enabled columns (<= ColumnsCount)
2105  ImGuiTableColumnIdx DeclColumnsCount; // Count calls to TableSetupColumn()
2106  ImGuiTableColumnIdx HoveredColumnBody; // Index of column whose visible region is being hovered. Important: == ColumnsCount when hovering empty region after the right-most column!
2107  ImGuiTableColumnIdx HoveredColumnBorder; // Index of column whose right-border is being hovered (for resizing).
2108  ImGuiTableColumnIdx AutoFitSingleColumn; // Index of single column requesting auto-fit.
2109  ImGuiTableColumnIdx ResizedColumn; // Index of column being resized. Reset when InstanceCurrent==0.
2110  ImGuiTableColumnIdx LastResizedColumn; // Index of column being resized from previous frame.
2111  ImGuiTableColumnIdx HeldHeaderColumn; // Index of column header being held.
2112  ImGuiTableColumnIdx ReorderColumn; // Index of column being reordered. (not cleared)
2113  ImGuiTableColumnIdx ReorderColumnDir; // -1 or +1
2114  ImGuiTableColumnIdx LeftMostEnabledColumn; // Index of left-most non-hidden column.
2115  ImGuiTableColumnIdx RightMostEnabledColumn; // Index of right-most non-hidden column.
2116  ImGuiTableColumnIdx LeftMostStretchedColumn; // Index of left-most stretched column.
2117  ImGuiTableColumnIdx RightMostStretchedColumn; // Index of right-most stretched column.
2118  ImGuiTableColumnIdx ContextPopupColumn; // Column right-clicked on, of -1 if opening context menu from a neutral/empty spot
2119  ImGuiTableColumnIdx FreezeRowsRequest; // Requested frozen rows count
2120  ImGuiTableColumnIdx FreezeRowsCount; // Actual frozen row count (== FreezeRowsRequest, or == 0 when no scrolling offset)
2121  ImGuiTableColumnIdx FreezeColumnsRequest; // Requested frozen columns count
2122  ImGuiTableColumnIdx FreezeColumnsCount; // Actual frozen columns count (== FreezeColumnsRequest, or == 0 when no scrolling offset)
2123  ImGuiTableColumnIdx RowCellDataCurrent; // Index of current RowCellData[] entry in current row
2124  ImGuiTableDrawChannelIdx DummyDrawChannel; // Redirect non-visible columns here.
2125  ImGuiTableDrawChannelIdx Bg2DrawChannelCurrent; // For Selectable() and other widgets drawing across columns after the freezing line. Index within DrawSplitter.Channels[]
2126  ImGuiTableDrawChannelIdx Bg2DrawChannelUnfrozen;
2127  bool IsLayoutLocked; // Set by TableUpdateLayout() which is called when beginning the first row.
2128  bool IsInsideRow; // Set when inside TableBeginRow()/TableEndRow().
2129  bool IsInitializing;
2130  bool IsSortSpecsDirty;
2131  bool IsUsingHeaders; // Set when the first row had the ImGuiTableRowFlags_Headers flag.
2132  bool IsContextPopupOpen; // Set when default context menu is open (also see: ContextPopupColumn, InstanceInteracted).
2133  bool IsSettingsRequestLoad;
2134  bool IsSettingsDirty; // Set when table settings have changed and needs to be reported into ImGuiTableSetttings data.
2135  bool IsDefaultDisplayOrder; // Set when display order is unchanged from default (DisplayOrder contains 0...Count-1)
2136  bool IsResetAllRequest;
2137  bool IsResetDisplayOrderRequest;
2138  bool IsUnfrozenRows; // Set when we got past the frozen row.
2139  bool IsDefaultSizingPolicy; // Set if user didn't explicitly set a sizing policy in BeginTable()
2140  bool MemoryCompacted;
2141  bool HostSkipItems; // Backup of InnerWindow->SkipItem at the end of BeginTable(), because we will overwrite InnerWindow->SkipItem on a per-column basis
2142 
2143  IMGUI_API ImGuiTable() { memset(this, 0, sizeof(*this)); LastFrameActive = -1; }
2144  IMGUI_API ~ImGuiTable() { IM_FREE(RawData); }
2145 };
2146 
2147 // sizeof() ~ 12
2148 struct ImGuiTableColumnSettings
2149 {
2150  float WidthOrWeight;
2151  ImGuiID UserID;
2152  ImGuiTableColumnIdx Index;
2153  ImGuiTableColumnIdx DisplayOrder;
2154  ImGuiTableColumnIdx SortOrder;
2155  ImU8 SortDirection : 2;
2156  ImU8 IsEnabled : 1; // "Visible" in ini file
2157  ImU8 IsStretch : 1;
2158 
2159  ImGuiTableColumnSettings()
2160  {
2161  WidthOrWeight = 0.0f;
2162  UserID = 0;
2163  Index = -1;
2164  DisplayOrder = SortOrder = -1;
2165  SortDirection = ImGuiSortDirection_None;
2166  IsEnabled = 1;
2167  IsStretch = 0;
2168  }
2169 };
2170 
2171 // This is designed to be stored in a single ImChunkStream (1 header followed by N ImGuiTableColumnSettings, etc.)
2172 struct ImGuiTableSettings
2173 {
2174  ImGuiID ID; // Set to 0 to invalidate/delete the setting
2175  ImGuiTableFlags SaveFlags; // Indicate data we want to save using the Resizable/Reorderable/Sortable/Hideable flags (could be using its own flags..)
2176  float RefScale; // Reference scale to be able to rescale columns on font/dpi changes.
2177  ImGuiTableColumnIdx ColumnsCount;
2178  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
2179  bool WantApply; // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context)
2180 
2181  ImGuiTableSettings() { memset(this, 0, sizeof(*this)); }
2182  ImGuiTableColumnSettings* GetColumnSettings() { return (ImGuiTableColumnSettings*)(this + 1); }
2183 };
2184 
2185 #endif // #ifdef IMGUI_HAS_TABLE
2186 
2187 //-----------------------------------------------------------------------------
2188 // [SECTION] ImGui internal API
2189 // No guarantee of forward compatibility here!
2190 //-----------------------------------------------------------------------------
2191 
2192 namespace ImGui
2193 {
2194  // Windows
2195  // We should always have a CurrentWindow in the stack (there is an implicit "Debug" window)
2196  // If this ever crash because g.CurrentWindow is NULL it means that either
2197  // - ImGui::NewFrame() has never been called, which is illegal.
2198  // - You are calling ImGui functions after ImGui::EndFrame()/ImGui::Render() and before the next ImGui::NewFrame(), which is also illegal.
2199  inline ImGuiWindow* GetCurrentWindowRead() { ImGuiContext& g = *GImGui; return g.CurrentWindow; }
2200  inline ImGuiWindow* GetCurrentWindow() { ImGuiContext& g = *GImGui; g.CurrentWindow->WriteAccessed = true; return g.CurrentWindow; }
2201  IMGUI_API ImGuiWindow* FindWindowByID(ImGuiID id);
2202  IMGUI_API ImGuiWindow* FindWindowByName(const char* name);
2203  IMGUI_API void UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags flags, ImGuiWindow* parent_window);
2204  IMGUI_API ImVec2 CalcWindowNextAutoFitSize(ImGuiWindow* window);
2205  IMGUI_API bool IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent);
2206  IMGUI_API bool IsWindowAbove(ImGuiWindow* potential_above, ImGuiWindow* potential_below);
2207  IMGUI_API bool IsWindowNavFocusable(ImGuiWindow* window);
2208  IMGUI_API ImRect GetWindowAllowedExtentRect(ImGuiWindow* window);
2209  IMGUI_API void SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond = 0);
2210  IMGUI_API void SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond cond = 0);
2211  IMGUI_API void SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiCond cond = 0);
2212  IMGUI_API void SetWindowHitTestHole(ImGuiWindow* window, const ImVec2& pos, const ImVec2& size);
2213 
2214  // Windows: Display Order and Focus Order
2215  IMGUI_API void FocusWindow(ImGuiWindow* window);
2216  IMGUI_API void FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWindow* ignore_window);
2217  IMGUI_API void BringWindowToFocusFront(ImGuiWindow* window);
2218  IMGUI_API void BringWindowToDisplayFront(ImGuiWindow* window);
2219  IMGUI_API void BringWindowToDisplayBack(ImGuiWindow* window);
2220 
2221  // Fonts, drawing
2222  IMGUI_API void SetCurrentFont(ImFont* font);
2223  inline ImFont* GetDefaultFont() { ImGuiContext& g = *GImGui; return g.IO.FontDefault ? g.IO.FontDefault : g.IO.Fonts->Fonts[0]; }
2224  inline ImDrawList* GetForegroundDrawList(ImGuiWindow* window) { IM_UNUSED(window); return GetForegroundDrawList(); } // This seemingly unnecessary wrapper simplifies compatibility between the 'master' and 'docking' branches.
2225  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.
2226  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.
2227 
2228  // Init
2229  IMGUI_API void Initialize(ImGuiContext* context);
2230  IMGUI_API void Shutdown(ImGuiContext* context); // Since 1.60 this is a _private_ function. You can call DestroyContext() to destroy the context created by CreateContext().
2231 
2232  // NewFrame
2233  IMGUI_API void UpdateHoveredWindowAndCaptureFlags();
2234  IMGUI_API void StartMouseMovingWindow(ImGuiWindow* window);
2235  IMGUI_API void UpdateMouseMovingWindowNewFrame();
2236  IMGUI_API void UpdateMouseMovingWindowEndFrame();
2237 
2238  // Generic context hooks
2239  IMGUI_API ImGuiID AddContextHook(ImGuiContext* context, const ImGuiContextHook* hook);
2240  IMGUI_API void RemoveContextHook(ImGuiContext* context, ImGuiID hook_to_remove);
2241  IMGUI_API void CallContextHooks(ImGuiContext* context, ImGuiContextHookType type);
2242 
2243  // Settings
2244  IMGUI_API void MarkIniSettingsDirty();
2245  IMGUI_API void MarkIniSettingsDirty(ImGuiWindow* window);
2246  IMGUI_API void ClearIniSettings();
2247  IMGUI_API ImGuiWindowSettings* CreateNewWindowSettings(const char* name);
2248  IMGUI_API ImGuiWindowSettings* FindWindowSettings(ImGuiID id);
2249  IMGUI_API ImGuiWindowSettings* FindOrCreateWindowSettings(const char* name);
2250  IMGUI_API ImGuiSettingsHandler* FindSettingsHandler(const char* type_name);
2251 
2252  // Scrolling
2253  IMGUI_API void SetNextWindowScroll(const ImVec2& scroll); // Use -1.0f on one axis to leave as-is
2254  IMGUI_API void SetScrollX(ImGuiWindow* window, float scroll_x);
2255  IMGUI_API void SetScrollY(ImGuiWindow* window, float scroll_y);
2256  IMGUI_API void SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x_ratio);
2257  IMGUI_API void SetScrollFromPosY(ImGuiWindow* window, float local_y, float center_y_ratio);
2258  IMGUI_API ImVec2 ScrollToBringRectIntoView(ImGuiWindow* window, const ImRect& item_rect);
2259 
2260  // Basic Accessors
2261  inline ImGuiID GetItemID() { ImGuiContext& g = *GImGui; return g.CurrentWindow->DC.LastItemId; } // Get ID of last item (~~ often same ImGui::GetID(label) beforehand)
2262  inline ImGuiItemStatusFlags GetItemStatusFlags() { ImGuiContext& g = *GImGui; return g.CurrentWindow->DC.LastItemStatusFlags; }
2263  inline ImGuiID GetActiveID() { ImGuiContext& g = *GImGui; return g.ActiveId; }
2264  inline ImGuiID GetFocusID() { ImGuiContext& g = *GImGui; return g.NavId; }
2265  inline ImGuiItemFlags GetItemsFlags() { ImGuiContext& g = *GImGui; return g.CurrentWindow->DC.ItemFlags; }
2266  IMGUI_API void SetActiveID(ImGuiID id, ImGuiWindow* window);
2267  IMGUI_API void SetFocusID(ImGuiID id, ImGuiWindow* window);
2268  IMGUI_API void ClearActiveID();
2269  IMGUI_API ImGuiID GetHoveredID();
2270  IMGUI_API void SetHoveredID(ImGuiID id);
2271  IMGUI_API void KeepAliveID(ImGuiID id);
2272  IMGUI_API void MarkItemEdited(ImGuiID id); // Mark data associated to given item as "edited", used by IsItemDeactivatedAfterEdit() function.
2273  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)
2274  IMGUI_API ImGuiID GetIDWithSeed(const char* str_id_begin, const char* str_id_end, ImGuiID seed);
2275 
2276  // Basic Helpers for widget code
2277  IMGUI_API void ItemSize(const ImVec2& size, float text_baseline_y = -1.0f);
2278  IMGUI_API void ItemSize(const ImRect& bb, float text_baseline_y = -1.0f);
2279  IMGUI_API bool ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb = NULL);
2280  IMGUI_API bool ItemHoverable(const ImRect& bb, ImGuiID id);
2281  IMGUI_API bool IsClippedEx(const ImRect& bb, ImGuiID id, bool clip_even_when_logged);
2282  IMGUI_API void SetLastItemData(ImGuiWindow* window, ImGuiID item_id, ImGuiItemStatusFlags status_flags, const ImRect& item_rect);
2283  IMGUI_API bool FocusableItemRegister(ImGuiWindow* window, ImGuiID id); // Return true if focus is requested
2284  IMGUI_API void FocusableItemUnregister(ImGuiWindow* window);
2285  IMGUI_API ImVec2 CalcItemSize(ImVec2 size, float default_w, float default_h);
2286  IMGUI_API float CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x);
2287  IMGUI_API void PushMultiItemsWidths(int components, float width_full);
2288  IMGUI_API void PushItemFlag(ImGuiItemFlags option, bool enabled);
2289  IMGUI_API void PopItemFlag();
2290  IMGUI_API bool IsItemToggledSelection(); // Was the last item selection toggled? (after Selectable(), TreeNode() etc. We only returns toggle _event_ in order to handle clipping correctly)
2291  IMGUI_API ImVec2 GetContentRegionMaxAbs();
2292  IMGUI_API void ShrinkWidths(ImGuiShrinkWidthItem* items, int count, float width_excess);
2293 
2294  // Logging/Capture
2295  IMGUI_API void LogBegin(ImGuiLogType type, int auto_open_depth); // -> BeginCapture() when we design v2 api, for now stay under the radar by using the old name.
2296  IMGUI_API void LogToBuffer(int auto_open_depth = -1); // Start logging/capturing to internal buffer
2297  IMGUI_API void LogRenderedText(const ImVec2* ref_pos, const char* text, const char* text_end = NULL);
2298  IMGUI_API void LogSetNextTextDecoration(const char* prefix, const char* suffix);
2299 
2300  // Popups, Modals, Tooltips
2301  IMGUI_API bool BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags flags);
2302  IMGUI_API void OpenPopupEx(ImGuiID id, ImGuiPopupFlags popup_flags = ImGuiPopupFlags_None);
2303  IMGUI_API void ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_popup);
2304  IMGUI_API void ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to_window_under_popup);
2305  IMGUI_API bool IsPopupOpen(ImGuiID id, ImGuiPopupFlags popup_flags);
2306  IMGUI_API bool BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_flags);
2307  IMGUI_API void BeginTooltipEx(ImGuiWindowFlags extra_flags, ImGuiTooltipFlags tooltip_flags);
2308  IMGUI_API ImGuiWindow* GetTopMostPopupModal();
2309  IMGUI_API ImVec2 FindBestWindowPosForPopup(ImGuiWindow* window);
2310  IMGUI_API ImVec2 FindBestWindowPosForPopupEx(const ImVec2& ref_pos, const ImVec2& size, ImGuiDir* last_dir, const ImRect& r_outer, const ImRect& r_avoid, ImGuiPopupPositionPolicy policy);
2311 
2312  // Gamepad/Keyboard Navigation
2313  IMGUI_API void NavInitWindow(ImGuiWindow* window, bool force_reinit);
2314  IMGUI_API bool NavMoveRequestButNoResultYet();
2315  IMGUI_API void NavMoveRequestCancel();
2316  IMGUI_API void NavMoveRequestForward(ImGuiDir move_dir, ImGuiDir clip_dir, const ImRect& bb_rel, ImGuiNavMoveFlags move_flags);
2317  IMGUI_API void NavMoveRequestTryWrapping(ImGuiWindow* window, ImGuiNavMoveFlags move_flags);
2318  IMGUI_API float GetNavInputAmount(ImGuiNavInput n, ImGuiInputReadMode mode);
2319  IMGUI_API ImVec2 GetNavInputAmount2d(ImGuiNavDirSourceFlags dir_sources, ImGuiInputReadMode mode, float slow_factor = 0.0f, float fast_factor = 0.0f);
2320  IMGUI_API int CalcTypematicRepeatAmount(float t0, float t1, float repeat_delay, float repeat_rate);
2321  IMGUI_API void ActivateItem(ImGuiID id); // Remotely activate a button, checkbox, tree node etc. given its unique ID. activation is queued and processed on the next frame when the item is encountered again.
2322  IMGUI_API void SetNavID(ImGuiID id, int nav_layer, ImGuiID focus_scope_id, const ImRect& rect_rel);
2323 
2324  // Focus Scope (WIP)
2325  // This is generally used to identify a selection set (multiple of which may be in the same window), as selection
2326  // patterns generally need to react (e.g. clear selection) when landing on an item of the set.
2327  IMGUI_API void PushFocusScope(ImGuiID id);
2328  IMGUI_API void PopFocusScope();
2329  inline ImGuiID GetFocusedFocusScope() { ImGuiContext& g = *GImGui; return g.NavFocusScopeId; } // Focus scope which is actually active
2330  inline ImGuiID GetFocusScope() { ImGuiContext& g = *GImGui; return g.CurrentWindow->DC.NavFocusScopeIdCurrent; } // Focus scope we are outputting into, set by PushFocusScope()
2331 
2332  // Inputs
2333  // FIXME: Eventually we should aim to move e.g. IsActiveIdUsingKey() into IsKeyXXX functions.
2334  IMGUI_API void SetItemUsingMouseWheel();
2335  inline bool IsActiveIdUsingNavDir(ImGuiDir dir) { ImGuiContext& g = *GImGui; return (g.ActiveIdUsingNavDirMask & (1 << dir)) != 0; }
2336  inline bool IsActiveIdUsingNavInput(ImGuiNavInput input) { ImGuiContext& g = *GImGui; return (g.ActiveIdUsingNavInputMask & (1 << input)) != 0; }
2337  inline bool IsActiveIdUsingKey(ImGuiKey key) { ImGuiContext& g = *GImGui; IM_ASSERT(key < 64); return (g.ActiveIdUsingKeyInputMask & ((ImU64)1 << key)) != 0; }
2338  IMGUI_API bool IsMouseDragPastThreshold(ImGuiMouseButton button, float lock_threshold = -1.0f);
2339  inline bool IsKeyPressedMap(ImGuiKey key, bool repeat = true) { ImGuiContext& g = *GImGui; const int key_index = g.IO.KeyMap[key]; return (key_index >= 0) ? IsKeyPressed(key_index, repeat) : false; }
2340  inline bool IsNavInputDown(ImGuiNavInput n) { ImGuiContext& g = *GImGui; return g.IO.NavInputs[n] > 0.0f; }
2341  inline bool IsNavInputTest(ImGuiNavInput n, ImGuiInputReadMode rm) { return (GetNavInputAmount(n, rm) > 0.0f); }
2342  IMGUI_API ImGuiKeyModFlags GetMergedKeyModFlags();
2343 
2344  // Drag and Drop
2345  IMGUI_API bool BeginDragDropTargetCustom(const ImRect& bb, ImGuiID id);
2346  IMGUI_API void ClearDragDrop();
2347  IMGUI_API bool IsDragDropPayloadBeingAccepted();
2348 
2349  // Internal Columns API (this is not exposed because we will encourage transitioning to the Tables API)
2350  IMGUI_API void SetWindowClipRectBeforeSetChannel(ImGuiWindow* window, const ImRect& clip_rect);
2351  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().
2352  IMGUI_API void EndColumns(); // close columns
2353  IMGUI_API void PushColumnClipRect(int column_index);
2354  IMGUI_API void PushColumnsBackground();
2355  IMGUI_API void PopColumnsBackground();
2356  IMGUI_API ImGuiID GetColumnsID(const char* str_id, int count);
2357  IMGUI_API ImGuiOldColumns* FindOrCreateColumns(ImGuiWindow* window, ImGuiID id);
2358  IMGUI_API float GetColumnOffsetFromNorm(const ImGuiOldColumns* columns, float offset_norm);
2359  IMGUI_API float GetColumnNormFromOffset(const ImGuiOldColumns* columns, float offset);
2360 
2361  // Tables: Candidates for public API
2362  IMGUI_API void TableOpenContextMenu(int column_n = -1);
2363  IMGUI_API void TableSetColumnEnabled(int column_n, bool enabled);
2364  IMGUI_API void TableSetColumnWidth(int column_n, float width);
2365  IMGUI_API void TableSetColumnSortDirection(int column_n, ImGuiSortDirection sort_direction, bool append_to_sort_specs);
2366  IMGUI_API int TableGetHoveredColumn(); // May use (TableGetColumnFlags() & ImGuiTableColumnFlags_IsHovered) instead. Return hovered column. return -1 when table is not hovered. return columns_count if the unused space at the right of visible columns is hovered.
2367  IMGUI_API float TableGetHeaderRowHeight();
2368  IMGUI_API void TablePushBackgroundChannel();
2369  IMGUI_API void TablePopBackgroundChannel();
2370 
2371  // Tables: Internals
2372  inline ImGuiTable* GetCurrentTable() { ImGuiContext& g = *GImGui; return g.CurrentTable; }
2373  IMGUI_API ImGuiTable* TableFindByID(ImGuiID id);
2374  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);
2375  IMGUI_API void TableBeginInitMemory(ImGuiTable* table, int columns_count);
2376  IMGUI_API void TableBeginApplyRequests(ImGuiTable* table);
2377  IMGUI_API void TableSetupDrawChannels(ImGuiTable* table);
2378  IMGUI_API void TableUpdateLayout(ImGuiTable* table);
2379  IMGUI_API void TableUpdateBorders(ImGuiTable* table);
2380  IMGUI_API void TableUpdateColumnsWeightFromWidth(ImGuiTable* table);
2381  IMGUI_API void TableDrawBorders(ImGuiTable* table);
2382  IMGUI_API void TableDrawContextMenu(ImGuiTable* table);
2383  IMGUI_API void TableMergeDrawChannels(ImGuiTable* table);
2384  IMGUI_API void TableSortSpecsSanitize(ImGuiTable* table);
2385  IMGUI_API void TableSortSpecsBuild(ImGuiTable* table);
2386  IMGUI_API ImGuiSortDirection TableGetColumnNextSortDirection(ImGuiTableColumn* column);
2387  IMGUI_API void TableFixColumnSortDirection(ImGuiTable* table, ImGuiTableColumn* column);
2388  IMGUI_API float TableGetColumnWidthAuto(ImGuiTable* table, ImGuiTableColumn* column);
2389  IMGUI_API void TableBeginRow(ImGuiTable* table);
2390  IMGUI_API void TableEndRow(ImGuiTable* table);
2391  IMGUI_API void TableBeginCell(ImGuiTable* table, int column_n);
2392  IMGUI_API void TableEndCell(ImGuiTable* table);
2393  IMGUI_API ImRect TableGetCellBgRect(const ImGuiTable* table, int column_n);
2394  IMGUI_API const char* TableGetColumnName(const ImGuiTable* table, int column_n);
2395  IMGUI_API ImGuiID TableGetColumnResizeID(const ImGuiTable* table, int column_n, int instance_no = 0);
2396  IMGUI_API float TableGetMaxColumnWidth(const ImGuiTable* table, int column_n);
2397  IMGUI_API void TableSetColumnWidthAutoSingle(ImGuiTable* table, int column_n);
2398  IMGUI_API void TableSetColumnWidthAutoAll(ImGuiTable* table);
2399  IMGUI_API void TableRemove(ImGuiTable* table);
2400  IMGUI_API void TableGcCompactTransientBuffers(ImGuiTable* table);
2401  IMGUI_API void TableGcCompactSettings();
2402 
2403  // Tables: Settings
2404  IMGUI_API void TableLoadSettings(ImGuiTable* table);
2405  IMGUI_API void TableSaveSettings(ImGuiTable* table);
2406  IMGUI_API void TableResetSettings(ImGuiTable* table);
2407  IMGUI_API ImGuiTableSettings* TableGetBoundSettings(ImGuiTable* table);
2408  IMGUI_API void TableSettingsInstallHandler(ImGuiContext* context);
2409  IMGUI_API ImGuiTableSettings* TableSettingsCreate(ImGuiID id, int columns_count);
2410  IMGUI_API ImGuiTableSettings* TableSettingsFindByID(ImGuiID id);
2411 
2412  // Tab Bars
2413  IMGUI_API bool BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& bb, ImGuiTabBarFlags flags);
2414  IMGUI_API ImGuiTabItem* TabBarFindTabByID(ImGuiTabBar* tab_bar, ImGuiID tab_id);
2415  IMGUI_API void TabBarRemoveTab(ImGuiTabBar* tab_bar, ImGuiID tab_id);
2416  IMGUI_API void TabBarCloseTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab);
2417  IMGUI_API void TabBarQueueReorder(ImGuiTabBar* tab_bar, const ImGuiTabItem* tab, int dir);
2418  IMGUI_API bool TabBarProcessReorder(ImGuiTabBar* tab_bar);
2419  IMGUI_API bool TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, ImGuiTabItemFlags flags);
2420  IMGUI_API ImVec2 TabItemCalcSize(const char* label, bool has_close_button);
2421  IMGUI_API void TabItemBackground(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImU32 col);
2422  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);
2423 
2424  // Render helpers
2425  // 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.
2426  // NB: All position are in absolute pixels coordinates (we are never using window coordinates internally)
2427  IMGUI_API void RenderText(ImVec2 pos, const char* text, const char* text_end = NULL, bool hide_text_after_hash = true);
2428  IMGUI_API void RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end, float wrap_width);
2429  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);
2430  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);
2431  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);
2432  IMGUI_API void RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border = true, float rounding = 0.0f);
2433  IMGUI_API void RenderFrameBorder(ImVec2 p_min, ImVec2 p_max, float rounding = 0.0f);
2434  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);
2435  IMGUI_API void RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFlags flags = ImGuiNavHighlightFlags_TypeDefault); // Navigation highlight
2436  IMGUI_API const char* FindRenderedTextEnd(const char* text, const char* text_end = NULL); // Find the optional ## from which we stop displaying text.
2437 
2438  // Render helpers (those functions don't access any ImGui state!)
2439  IMGUI_API void RenderArrow(ImDrawList* draw_list, ImVec2 pos, ImU32 col, ImGuiDir dir, float scale = 1.0f);
2440  IMGUI_API void RenderBullet(ImDrawList* draw_list, ImVec2 pos, ImU32 col);
2441  IMGUI_API void RenderCheckMark(ImDrawList* draw_list, ImVec2 pos, ImU32 col, float sz);
2442  IMGUI_API void RenderMouseCursor(ImDrawList* draw_list, ImVec2 pos, float scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow);
2443  IMGUI_API void RenderArrowPointingAt(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, ImGuiDir direction, ImU32 col);
2444  IMGUI_API void RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, ImU32 col, float x_start_norm, float x_end_norm, float rounding);
2445  IMGUI_API void RenderRectFilledWithHole(ImDrawList* draw_list, ImRect outer, ImRect inner, ImU32 col, float rounding);
2446 
2447 #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
2448  // [1.71: 2019/06/07: Updating prototypes of some of the internal functions. Leaving those for reference for a short while]
2449  inline void RenderArrow(ImVec2 pos, ImGuiDir dir, float scale=1.0f) { ImGuiWindow* window = GetCurrentWindow(); RenderArrow(window->DrawList, pos, GetColorU32(ImGuiCol_Text), dir, scale); }
2450  inline void RenderBullet(ImVec2 pos) { ImGuiWindow* window = GetCurrentWindow(); RenderBullet(window->DrawList, pos, GetColorU32(ImGuiCol_Text)); }
2451 #endif
2452 
2453  // Widgets
2454  IMGUI_API void TextEx(const char* text, const char* text_end = NULL, ImGuiTextFlags flags = 0);
2455  IMGUI_API bool ButtonEx(const char* label, const ImVec2& size_arg = ImVec2(0, 0), ImGuiButtonFlags flags = 0);
2456  IMGUI_API bool CloseButton(ImGuiID id, const ImVec2& pos);
2457  IMGUI_API bool CollapseButton(ImGuiID id, const ImVec2& pos);
2458  IMGUI_API bool ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size_arg, ImGuiButtonFlags flags = 0);
2459  IMGUI_API void Scrollbar(ImGuiAxis axis);
2460  IMGUI_API bool ScrollbarEx(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float* p_scroll_v, float avail_v, float contents_v, ImDrawFlags flags);
2461  IMGUI_API bool ImageButtonEx(ImGuiID id, ImTextureID texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec2& padding, const ImVec4& bg_col, const ImVec4& tint_col);
2462  IMGUI_API ImRect GetWindowScrollbarRect(ImGuiWindow* window, ImGuiAxis axis);
2463  IMGUI_API ImGuiID GetWindowScrollbarID(ImGuiWindow* window, ImGuiAxis axis);
2464  IMGUI_API ImGuiID GetWindowResizeID(ImGuiWindow* window, int n); // 0..3: corners, 4..7: borders
2465  IMGUI_API void SeparatorEx(ImGuiSeparatorFlags flags);
2466  IMGUI_API bool CheckboxFlags(const char* label, ImS64* flags, ImS64 flags_value);
2467  IMGUI_API bool CheckboxFlags(const char* label, ImU64* flags, ImU64 flags_value);
2468 
2469  // Widgets low-level behaviors
2470  IMGUI_API bool ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags = 0);
2471  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);
2472  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);
2473  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);
2474  IMGUI_API bool TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* label, const char* label_end = NULL);
2475  IMGUI_API bool TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags = 0); // Consume previous SetNextItemOpen() data, if any. May return true when logging
2476  IMGUI_API void TreePushOverrideID(ImGuiID id);
2477 
2478  // Template functions are instantiated in imgui_widgets.cpp for a finite number of types.
2479  // 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).
2480  // e.g. " extern template IMGUI_API float RoundScalarWithFormatT<float, float>(const char* format, ImGuiDataType data_type, float v); "
2481  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);
2482  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);
2483  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);
2484  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);
2485  template<typename T, typename SIGNED_T> IMGUI_API T RoundScalarWithFormatT(const char* format, ImGuiDataType data_type, T v);
2486  template<typename T> IMGUI_API bool CheckboxFlagsT(const char* label, T* flags, T flags_value);
2487 
2488  // Data type helpers
2489  IMGUI_API const ImGuiDataTypeInfo* DataTypeGetInfo(ImGuiDataType data_type);
2490  IMGUI_API int DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* p_data, const char* format);
2491  IMGUI_API void DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, const void* arg_1, const void* arg_2);
2492  IMGUI_API bool DataTypeApplyOpFromText(const char* buf, const char* initial_value_buf, ImGuiDataType data_type, void* p_data, const char* format);
2493  IMGUI_API int DataTypeCompare(ImGuiDataType data_type, const void* arg_1, const void* arg_2);
2494  IMGUI_API bool DataTypeClamp(ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max);
2495 
2496  // InputText
2497  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);
2498  IMGUI_API bool TempInputText(const ImRect& bb, ImGuiID id, const char* label, char* buf, int buf_size, ImGuiInputTextFlags flags);
2499  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);
2500  inline bool TempInputIsActive(ImGuiID id) { ImGuiContext& g = *GImGui; return (g.ActiveId == id && g.TempInputId == id); }
2501  inline ImGuiInputTextState* GetInputTextState(ImGuiID id) { ImGuiContext& g = *GImGui; return (g.InputTextState.ID == id) ? &g.InputTextState : NULL; } // Get input text state if active
2502 
2503  // Color
2504  IMGUI_API void ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags flags);
2505  IMGUI_API void ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags);
2506  IMGUI_API void ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags flags);
2507 
2508  // Plot
2509  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, ImVec2 frame_size);
2510 
2511  // Shade functions (write over already created vertices)
2512  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);
2513  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);
2514 
2515  // Garbage collection
2516  IMGUI_API void GcCompactTransientMiscBuffers();
2517  IMGUI_API void GcCompactTransientWindowBuffers(ImGuiWindow* window);
2518  IMGUI_API void GcAwakeTransientWindowBuffers(ImGuiWindow* window);
2519 
2520  // Debug Tools
2521  IMGUI_API void ErrorCheckEndFrameRecover(ImGuiErrorLogCallback log_callback, void* user_data = NULL);
2522  inline void DebugDrawItemRect(ImU32 col = IM_COL32(255,0,0,255)) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; GetForegroundDrawList(window)->AddRect(window->DC.LastItemRect.Min, window->DC.LastItemRect.Max, col); }
2523  inline void DebugStartItemPicker() { ImGuiContext& g = *GImGui; g.DebugItemPickerActive = true; }
2524 
2525  IMGUI_API void DebugNodeColumns(ImGuiOldColumns* columns);
2526  IMGUI_API void DebugNodeDrawList(ImGuiWindow* window, const ImDrawList* draw_list, const char* label);
2527  IMGUI_API void DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList* out_draw_list, const ImDrawList* draw_list, const ImDrawCmd* draw_cmd, bool show_mesh, bool show_aabb);
2528  IMGUI_API void DebugNodeStorage(ImGuiStorage* storage, const char* label);
2529  IMGUI_API void DebugNodeTabBar(ImGuiTabBar* tab_bar, const char* label);
2530  IMGUI_API void DebugNodeTable(ImGuiTable* table);
2531  IMGUI_API void DebugNodeTableSettings(ImGuiTableSettings* settings);
2532  IMGUI_API void DebugNodeWindow(ImGuiWindow* window, const char* label);
2533  IMGUI_API void DebugNodeWindowSettings(ImGuiWindowSettings* settings);
2534  IMGUI_API void DebugNodeWindowsList(ImVector<ImGuiWindow*>* windows, const char* label);
2535  IMGUI_API void DebugNodeViewport(ImGuiViewportP* viewport);
2536  IMGUI_API void DebugRenderViewportThumbnail(ImDrawList* draw_list, ImGuiViewportP* viewport, const ImRect& bb);
2537 
2538 } // namespace ImGui
2539 
2540 
2541 //-----------------------------------------------------------------------------
2542 // [SECTION] ImFontAtlas internal API
2543 //-----------------------------------------------------------------------------
2544 
2545 // This structure is likely to evolve as we add support for incremental atlas updates
2547 {
2548  bool (*FontBuilder_Build)(ImFontAtlas* atlas);
2549 };
2550 
2551 // Helper for font builder
2552 IMGUI_API const ImFontBuilderIO* ImFontAtlasGetBuilderForStbTruetype();
2553 IMGUI_API void ImFontAtlasBuildInit(ImFontAtlas* atlas);
2554 IMGUI_API void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* font_config, float ascent, float descent);
2555 IMGUI_API void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* stbrp_context_opaque);
2556 IMGUI_API void ImFontAtlasBuildFinish(ImFontAtlas* atlas);
2557 IMGUI_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);
2558 IMGUI_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);
2559 IMGUI_API void ImFontAtlasBuildMultiplyCalcLookupTable(unsigned char out_table[256], float in_multiply_factor);
2560 IMGUI_API void ImFontAtlasBuildMultiplyRectAlpha8(const unsigned char table[256], unsigned char* pixels, int x, int y, int w, int h, int stride);
2561 
2562 //-----------------------------------------------------------------------------
2563 // [SECTION] Test Engine specific hooks (imgui_test_engine)
2564 //-----------------------------------------------------------------------------
2565 
2566 #ifdef IMGUI_ENABLE_TEST_ENGINE
2567 extern void ImGuiTestEngineHook_ItemAdd(ImGuiContext* ctx, const ImRect& bb, ImGuiID id);
2568 extern void ImGuiTestEngineHook_ItemInfo(ImGuiContext* ctx, ImGuiID id, const char* label, ImGuiItemStatusFlags flags);
2569 extern void ImGuiTestEngineHook_IdInfo(ImGuiContext* ctx, ImGuiDataType data_type, ImGuiID id, const void* data_id);
2570 extern void ImGuiTestEngineHook_IdInfo(ImGuiContext* ctx, ImGuiDataType data_type, ImGuiID id, const void* data_id, const void* data_id_end);
2571 extern void ImGuiTestEngineHook_Log(ImGuiContext* ctx, const char* fmt, ...);
2572 #define IMGUI_TEST_ENGINE_ITEM_ADD(_BB,_ID) if (g.TestEngineHookItems) ImGuiTestEngineHook_ItemAdd(&g, _BB, _ID) // Register item bounding box
2573 #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)
2574 #define IMGUI_TEST_ENGINE_LOG(_FMT,...) if (g.TestEngineHookItems) ImGuiTestEngineHook_Log(&g, _FMT, __VA_ARGS__) // Custom log entry from user land into test log
2575 #define IMGUI_TEST_ENGINE_ID_INFO(_ID,_TYPE,_DATA) if (g.TestEngineHookIdInfo == id) ImGuiTestEngineHook_IdInfo(&g, _TYPE, _ID, (const void*)(_DATA));
2576 #define IMGUI_TEST_ENGINE_ID_INFO2(_ID,_TYPE,_DATA,_DATA2) if (g.TestEngineHookIdInfo == id) ImGuiTestEngineHook_IdInfo(&g, _TYPE, _ID, (const void*)(_DATA), (const void*)(_DATA2));
2577 #else
2578 #define IMGUI_TEST_ENGINE_ITEM_ADD(_BB,_ID) do { } while (0)
2579 #define IMGUI_TEST_ENGINE_ITEM_INFO(_ID,_LABEL,_FLAGS) do { } while (0)
2580 #define IMGUI_TEST_ENGINE_LOG(_FMT,...) do { } while (0)
2581 #define IMGUI_TEST_ENGINE_ID_INFO(_ID,_TYPE,_DATA) do { } while (0)
2582 #define IMGUI_TEST_ENGINE_ID_INFO2(_ID,_TYPE,_DATA,_DATA2) do { } while (0)
2583 #endif
2584 
2585 //-----------------------------------------------------------------------------
2586 
2587 #if defined(__clang__)
2588 #pragma clang diagnostic pop
2589 #elif defined(__GNUC__)
2590 #pragma GCC diagnostic pop
2591 #endif
2592 
2593 #ifdef _MSC_VER
2594 #pragma warning (pop)
2595 #endif
2596 
2597 #endif // #ifndef IMGUI_DISABLE
Definition: imgui.h:1959
Definition: imgui_internal.h:551
Definition: imgui_internal.h:1200
Definition: imgui_internal.h:601
Definition: imgui_internal.h:1231
Definition: imgui_internal.h:900
Definition: imgui.h:1973
Definition: imgui.h:230
Definition: imgui_internal.h:428
Definition: imgui_internal.h:318
Definition: imgui_internal.h:999
Definition: imgui.h:1701
Definition: imgui_internal.h:1174
Definition: imgui_internal.h:521
Definition: imgui_internal.h:158
Definition: imgui.h:2058
Definition: imgui_internal.h:1853
Definition: imgui_internal.h:1275
Definition: imgui_internal.h:1253
Definition: imgui_internal.h:894
Definition: imgui.h:2325
Definition: imgui.h:2216
Definition: imgui_internal.h:1741
Definition: imgui_internal.h:1212
Definition: imgui_internal.h:1069
Definition: imgui_internal.h:2546
Definition: imgui_internal.h:1903
Definition: imgui_internal.h:508
Definition: imgui_internal.h:494
Definition: imgui_internal.h:1685
Definition: imgui.h:2472
Definition: imgui.h:1937
Definition: imgui_internal.h:1121
Definition: imgui_internal.h:1012
Definition: imgui.h:243
Definition: imgui.h:2450
Definition: imgui_internal.h:1885
Definition: imgui_internal.h:651
Definition: imgui.h:2031
Definition: imgui_internal.h:924
Definition: imgui_internal.h:1131
Definition: imgui.h:2738
Definition: imgui.cpp:889
Definition: imgui.h:2667
Definition: imgui_internal.h:917
Definition: imgui_internal.h:1040
Definition: imgui_internal.h:574
Definition: imgui.h:2270
Definition: imgui_internal.h:950
Definition: imgui_internal.h:934
Definition: imgui.h:1755
Definition: imgui_internal.h:1087
Definition: imgui_internal.h:1081
Definition: imgui_internal.h:964
Definition: imgui_internal.h:438
Definition: imgui_internal.h:1290
Definition: imgui.h:2566
Definition: imgui_internal.h:420
Definition: imgui_internal.h:671