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