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