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