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