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