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