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