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