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