upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

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