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