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