1// dear imgui, v1.66b
2// (internal structures/api)
3
4// You may use this file to debug, understand or extend ImGui features but we don't provide any guarantee of forward compatibility!
5// Set:
6// #define IMGUI_DEFINE_MATH_OPERATORS
7// To implement maths operators for ImVec2 (disabled by default to not collide with using IM_VEC2_CLASS_EXTRA along with your own math types+operators)
8
9#pragma once
10
11#ifndef IMGUI_VERSION
12#error Must include imgui.h before imgui_internal.h
13#endif
14
15#include <stdio.h> // FILE*
16#include <stdlib.h> // NULL, malloc, free, qsort, atoi, atof
17#include <math.h> // sqrtf, fabsf, fmodf, powf, floorf, ceilf, cosf, sinf
18#include <limits.h> // INT_MIN, INT_MAX
19
20#ifdef _MSC_VER
21#pragma warning (push)
22#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)
23#endif
24
25#ifdef __clang__
26#pragma clang diagnostic push
27#pragma clang diagnostic ignored "-Wunused-function" // for stb_textedit.h
28#pragma clang diagnostic ignored "-Wmissing-prototypes" // for stb_textedit.h
29#pragma clang diagnostic ignored "-Wold-style-cast"
30#endif
31
32//-----------------------------------------------------------------------------
33// Forward Declarations
34//-----------------------------------------------------------------------------
35
36struct ImRect; // An axis-aligned rectangle (2 points)
37struct ImDrawDataBuilder; // Helper to build a ImDrawData instance
38struct ImDrawListSharedData; // Data shared between all ImDrawList instances
39struct ImGuiColorMod; // Stacked color modifier, backup of modified data so we can restore it
40struct ImGuiColumnData; // Storage data for a single column
41struct ImGuiColumnsSet; // Storage data for a columns set
42struct ImGuiContext; // Main imgui context
43struct ImGuiGroupData; // Stacked storage data for BeginGroup()/EndGroup()
44struct ImGuiInputTextState; // Internal state of the currently focused/edited text input box
45struct ImGuiItemHoveredDataBackup; // Backup and restore IsItemHovered() internal data
46struct ImGuiMenuColumns; // Simple column measurement, currently used for MenuItem() only
47struct ImGuiNavMoveResult; // Result of a directional navigation move query result
48struct ImGuiNextWindowData; // Storage for SetNexWindow** functions
49struct ImGuiPopupRef; // Storage for current popup stack
50struct ImGuiSettingsHandler; // Storage for one type registered in the .ini file
51struct ImGuiStyleMod; // Stacked style modifier, backup of modified data so we can restore it
52struct ImGuiWindow; // Storage for one window
53struct ImGuiWindowTempData; // Temporary storage for one window (that's the data which in theory we could ditch at the end of the frame)
54struct ImGuiWindowSettings; // Storage for window settings stored in .ini file (we keep one of those even if the actual window wasn't instanced during this session)
55
56// Use your programming IDE "Go to definition" facility on the names of the center columns to find the actual flags/enum lists.
57typedef int ImGuiLayoutType; // -> enum ImGuiLayoutType_ // Enum: Horizontal or vertical
58typedef int ImGuiButtonFlags; // -> enum ImGuiButtonFlags_ // Flags: for ButtonEx(), ButtonBehavior()
59typedef int ImGuiItemFlags; // -> enum ImGuiItemFlags_ // Flags: for PushItemFlag()
60typedef int ImGuiItemStatusFlags; // -> enum ImGuiItemStatusFlags_ // Flags: for DC.LastItemStatusFlags
61typedef int ImGuiNavHighlightFlags; // -> enum ImGuiNavHighlightFlags_ // Flags: for RenderNavHighlight()
62typedef int ImGuiNavDirSourceFlags; // -> enum ImGuiNavDirSourceFlags_ // Flags: for GetNavInputAmount2d()
63typedef int ImGuiNavMoveFlags; // -> enum ImGuiNavMoveFlags_ // Flags: for navigation requests
64typedef int ImGuiSeparatorFlags; // -> enum ImGuiSeparatorFlags_ // Flags: for Separator() - internal
65typedef int ImGuiSliderFlags; // -> enum ImGuiSliderFlags_ // Flags: for SliderBehavior()
66typedef int ImGuiDragFlags; // -> enum ImGuiDragFlags_ // Flags: for DragBehavior()
67
68//-------------------------------------------------------------------------
69// STB libraries
70//-------------------------------------------------------------------------
71
72namespace ImGuiStb
73{
74
75#undef STB_TEXTEDIT_STRING
76#undef STB_TEXTEDIT_CHARTYPE
77#define STB_TEXTEDIT_STRING ImGuiInputTextState
78#define STB_TEXTEDIT_CHARTYPE ImWchar
79#define STB_TEXTEDIT_GETWIDTH_NEWLINE -1.0f
80#include "imstb_textedit.h"
81
82} // namespace ImGuiStb
83
84//-----------------------------------------------------------------------------
85// Context
86//-----------------------------------------------------------------------------
87
88#ifndef GImGui
89extern IMGUI_API ImGuiContext* GImGui; // Current implicit ImGui context pointer
90#endif
91
92//-----------------------------------------------------------------------------
93// Helpers
94//-----------------------------------------------------------------------------
95
96#define IM_PI 3.14159265358979323846f
97#ifdef _WIN32
98#define IM_NEWLINE "\r\n" // Play it nice with Windows users (2018/05 news: Microsoft announced that Notepad will finally display Unix-style carriage returns!)
99#else
100#define IM_NEWLINE "\n"
101#endif
102#define IM_STATIC_ASSERT(_COND) typedef char static_assertion_##__line__[(_COND)?1:-1]
103#define IM_F32_TO_INT8_UNBOUND(_VAL) ((int)((_VAL) * 255.0f + ((_VAL)>=0 ? 0.5f : -0.5f))) // Unsaturated, for display purpose
104#define IM_F32_TO_INT8_SAT(_VAL) ((int)(ImSaturate(_VAL) * 255.0f + 0.5f)) // Saturated, always output 0..255
105
106// Enforce cdecl calling convention for functions called by the standard library, in case compilation settings changed the default to e.g. __vectorcall
107#ifdef _MSC_VER
108#define IMGUI_CDECL __cdecl
109#else
110#define IMGUI_CDECL
111#endif
112
113// Helpers: UTF-8 <> wchar
114IMGUI_API int ImTextStrToUtf8(char* buf, int buf_size, const ImWchar* in_text, const ImWchar* in_text_end); // return output UTF-8 bytes count
115IMGUI_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
116IMGUI_API int ImTextStrFromUtf8(ImWchar* buf, int buf_size, const char* in_text, const char* in_text_end, const char** in_remaining = NULL); // return input UTF-8 bytes count
117IMGUI_API int ImTextCountCharsFromUtf8(const char* in_text, const char* in_text_end); // return number of UTF-8 code-points (NOT bytes count)
118IMGUI_API int ImTextCountUtf8BytesFromChar(const char* in_text, const char* in_text_end); // return number of bytes to express one char in UTF-8
119IMGUI_API int ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_end); // return number of bytes to express string in UTF-8
120
121// Helpers: Misc
122IMGUI_API ImU32 ImHash(const void* data, int data_size, ImU32 seed = 0); // Pass data_size==0 for zero-terminated strings
123IMGUI_API void* ImFileLoadToMemory(const char* filename, const char* file_open_mode, size_t* out_file_size = NULL, int padding_bytes = 0);
124IMGUI_API FILE* ImFileOpen(const char* filename, const char* file_open_mode);
125static inline bool ImCharIsBlankA(char c) { return c == ' ' || c == '\t'; }
126static inline bool ImCharIsBlankW(unsigned int c) { return c == ' ' || c == '\t' || c == 0x3000; }
127static inline bool ImIsPowerOfTwo(int v) { return v != 0 && (v & (v - 1)) == 0; }
128static inline int ImUpperPowerOfTwo(int v) { v--; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v++; return v; }
129#define ImQsort qsort
130
131// Helpers: Geometry
132IMGUI_API ImVec2 ImLineClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& p);
133IMGUI_API bool ImTriangleContainsPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);
134IMGUI_API ImVec2 ImTriangleClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);
135IMGUI_API void ImTriangleBarycentricCoords(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p, float& out_u, float& out_v, float& out_w);
136IMGUI_API ImGuiDir ImGetDirQuadrantFromDelta(float dx, float dy);
137
138// Helpers: String
139IMGUI_API int ImStricmp(const char* str1, const char* str2);
140IMGUI_API int ImStrnicmp(const char* str1, const char* str2, size_t count);
141IMGUI_API void ImStrncpy(char* dst, const char* src, size_t count);
142IMGUI_API char* ImStrdup(const char* str);
143IMGUI_API const char* ImStrchrRange(const char* str_begin, const char* str_end, char c);
144IMGUI_API int ImStrlenW(const ImWchar* str);
145IMGUI_API const char* ImStreolRange(const char* str, const char* str_end); // End end-of-line
146IMGUI_API const ImWchar*ImStrbolW(const ImWchar* buf_mid_line, const ImWchar* buf_begin); // Find beginning-of-line
147IMGUI_API const char* ImStristr(const char* haystack, const char* haystack_end, const char* needle, const char* needle_end);
148IMGUI_API void ImStrTrimBlanks(char* str);
149IMGUI_API int ImFormatString(char* buf, size_t buf_size, const char* fmt, ...) IM_FMTARGS(3);
150IMGUI_API int ImFormatStringV(char* buf, size_t buf_size, const char* fmt, va_list args) IM_FMTLIST(3);
151IMGUI_API const char* ImParseFormatFindStart(const char* format);
152IMGUI_API const char* ImParseFormatFindEnd(const char* format);
153IMGUI_API const char* ImParseFormatTrimDecorations(const char* format, char* buf, int buf_size);
154IMGUI_API int ImParseFormatPrecision(const char* format, int default_value);
155
156// Helpers: ImVec2/ImVec4 operators
157// 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.)
158// We unfortunately don't have a unary- operator for ImVec2 because this would needs to be defined inside the class itself.
159#ifdef IMGUI_DEFINE_MATH_OPERATORS
160static inline ImVec2 operator*(const ImVec2& lhs, const float rhs) { return ImVec2(lhs.x*rhs, lhs.y*rhs); }
161static inline ImVec2 operator/(const ImVec2& lhs, const float rhs) { return ImVec2(lhs.x/rhs, lhs.y/rhs); }
162static inline ImVec2 operator+(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x+rhs.x, lhs.y+rhs.y); }
163static inline ImVec2 operator-(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x-rhs.x, lhs.y-rhs.y); }
164static inline ImVec2 operator*(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x*rhs.x, lhs.y*rhs.y); }
165static inline ImVec2 operator/(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x/rhs.x, lhs.y/rhs.y); }
166static inline ImVec2& operator+=(ImVec2& lhs, const ImVec2& rhs) { lhs.x += rhs.x; lhs.y += rhs.y; return lhs; }
167static inline ImVec2& operator-=(ImVec2& lhs, const ImVec2& rhs) { lhs.x -= rhs.x; lhs.y -= rhs.y; return lhs; }
168static inline ImVec2& operator*=(ImVec2& lhs, const float rhs) { lhs.x *= rhs; lhs.y *= rhs; return lhs; }
169static inline ImVec2& operator/=(ImVec2& lhs, const float rhs) { lhs.x /= rhs; lhs.y /= rhs; return lhs; }
170static 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); }
171static 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); }
172static 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); }
173#endif
174
175// Helpers: Maths
176// - Wrapper for standard libs functions. (Note that imgui_demo.cpp does _not_ use them to keep the code easy to copy)
177#ifndef IMGUI_DISABLE_MATH_FUNCTIONS
178static inline float ImFabs(float x) { return fabsf(x: x); }
179static inline float ImSqrt(float x) { return sqrtf(x: x); }
180static inline float ImPow(float x, float y) { return powf(x: x, y: y); }
181static inline double ImPow(double x, double y) { return pow(x: x, y: y); }
182static inline float ImFmod(float x, float y) { return fmodf(x: x, y: y); }
183static inline double ImFmod(double x, double y) { return fmod(x: x, y: y); }
184static inline float ImCos(float x) { return cosf(x: x); }
185static inline float ImSin(float x) { return sinf(x: x); }
186static inline float ImAcos(float x) { return acosf(x: x); }
187static inline float ImAtan2(float y, float x) { return atan2f(y: y, x: x); }
188static inline double ImAtof(const char* s) { return atof(nptr: s); }
189static inline float ImFloorStd(float x) { return floorf(x: x); } // we already uses our own ImFloor() { return (float)(int)v } internally so the standard one wrapper is named differently (it's used by stb_truetype)
190static inline float ImCeil(float x) { return ceilf(x: x); }
191#endif
192// - ImMin/ImMax/ImClamp/ImLerp/ImSwap are used by widgets which support for variety of types: signed/unsigned int/long long float/double, using templates here but we could also redefine them 6 times
193template<typename T> static inline T ImMin(T lhs, T rhs) { return lhs < rhs ? lhs : rhs; }
194template<typename T> static inline T ImMax(T lhs, T rhs) { return lhs >= rhs ? lhs : rhs; }
195template<typename T> static inline T ImClamp(T v, T mn, T mx) { return (v < mn) ? mn : (v > mx) ? mx : v; }
196template<typename T> static inline T ImLerp(T a, T b, float t) { return (T)(a + (b - a) * t); }
197template<typename T> static inline void ImSwap(T& a, T& b) { T tmp = a; a = b; b = tmp; }
198// - Misc maths helpers
199static 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); }
200static 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); }
201static 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); }
202static 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); }
203static 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); }
204static 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); }
205static inline float ImSaturate(float f) { return (f < 0.0f) ? 0.0f : (f > 1.0f) ? 1.0f : f; }
206static inline float ImLengthSqr(const ImVec2& lhs) { return lhs.x*lhs.x + lhs.y*lhs.y; }
207static inline float ImLengthSqr(const ImVec4& lhs) { return lhs.x*lhs.x + lhs.y*lhs.y + lhs.z*lhs.z + lhs.w*lhs.w; }
208static inline float ImInvLength(const ImVec2& lhs, float fail_value) { float d = lhs.x*lhs.x + lhs.y*lhs.y; if (d > 0.0f) return 1.0f / ImSqrt(x: d); return fail_value; }
209static inline float ImFloor(float f) { return (float)(int)f; }
210static inline ImVec2 ImFloor(const ImVec2& v) { return ImVec2((float)(int)v.x, (float)(int)v.y); }
211static inline float ImDot(const ImVec2& a, const ImVec2& b) { return a.x * b.x + a.y * b.y; }
212static 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); }
213static inline float ImLinearSweep(float current, float target, float speed) { if (current < target) return ImMin(lhs: current + speed, rhs: target); if (current > target) return ImMax(lhs: current - speed, rhs: target); return current; }
214static inline ImVec2 ImMul(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x * rhs.x, lhs.y * rhs.y); }
215
216// Helper: ImPool<>. Basic keyed storage for contiguous instances, slow/amortized insertion, O(1) indexable, O(Log N) queries by ID over a dense/hot buffer,
217// Honor constructor/destructor. Add/remove invalidate all pointers. Indexes have the same lifetime as the associated object.
218typedef int ImPoolIdx;
219template<typename T>
220struct IMGUI_API ImPool
221{
222 ImVector<T> Data; // Contiguous data
223 ImGuiStorage Map; // ID->Index
224 ImPoolIdx FreeIdx; // Next free idx to use
225
226 ImPool() { FreeIdx = 0; }
227 ~ImPool() { Clear(); }
228 T* GetByKey(ImGuiID key) { int idx = Map.GetInt(key, default_val: -1); return (idx != -1) ? &Data[idx] : NULL; }
229 T* GetByIndex(ImPoolIdx n) { return &Data[n]; }
230 ImPoolIdx GetIndex(const T* p) const { IM_ASSERT(p >= Data.Data && p < Data.Data + Data.Size); return (ImPoolIdx)(p - Data.Data); }
231 T* GetOrAddByKey(ImGuiID key) { int* p_idx = Map.GetIntRef(key, default_val: -1); if (*p_idx != -1) return &Data[*p_idx]; *p_idx = FreeIdx; return Add(); }
232 void Clear() { for (int n = 0; n < Map.Data.Size; n++) { int idx = Map.Data[n].val_i; if (idx != -1) Data[idx].~T(); } Map.Clear(); Data.clear(); FreeIdx = 0; }
233 T* Add() { int idx = FreeIdx; if (idx == Data.Size) { Data.resize(Data.Size + 1); FreeIdx++; } else { FreeIdx = *(int*)&Data[idx]; } IM_PLACEMENT_NEW(&Data[idx]) T(); return &Data[idx]; }
234 void Remove(ImGuiID key, const T* p) { Remove(key, GetIndex(p)); }
235 void Remove(ImGuiID key, ImPoolIdx idx) { Data[idx].~T(); *(int*)&Data[idx] = FreeIdx; FreeIdx = idx; Map.SetInt(key, val: -1); }
236 void Reserve(int capacity) { Data.reserve(capacity); Map.Data.reserve(new_capacity: capacity); }
237 int GetSize() const { return Data.Size; }
238};
239
240//-----------------------------------------------------------------------------
241// Types
242//-----------------------------------------------------------------------------
243
244// 1D vector (this odd construct is used to facilitate the transition between 1D and 2D and maintenance of some patches)
245struct ImVec1
246{
247 float x;
248 ImVec1() { x = 0.0f; }
249 ImVec1(float _x) { x = _x; }
250};
251
252enum ImGuiButtonFlags_
253{
254 ImGuiButtonFlags_None = 0,
255 ImGuiButtonFlags_Repeat = 1 << 0, // hold to repeat
256 ImGuiButtonFlags_PressedOnClickRelease = 1 << 1, // return true on click + release on same item [DEFAULT if no PressedOn* flag is set]
257 ImGuiButtonFlags_PressedOnClick = 1 << 2, // return true on click (default requires click+release)
258 ImGuiButtonFlags_PressedOnRelease = 1 << 3, // return true on release (default requires click+release)
259 ImGuiButtonFlags_PressedOnDoubleClick = 1 << 4, // return true on double-click (default requires click+release)
260 ImGuiButtonFlags_FlattenChildren = 1 << 5, // allow interactions even if a child window is overlapping
261 ImGuiButtonFlags_AllowItemOverlap = 1 << 6, // require previous frame HoveredId to either match id or be null before being usable, use along with SetItemAllowOverlap()
262 ImGuiButtonFlags_DontClosePopups = 1 << 7, // disable automatically closing parent popup on press // [UNUSED]
263 ImGuiButtonFlags_Disabled = 1 << 8, // disable interactions
264 ImGuiButtonFlags_AlignTextBaseLine = 1 << 9, // vertically align button to match text baseline - ButtonEx() only // FIXME: Should be removed and handled by SmallButton(), not possible currently because of DC.CursorPosPrevLine
265 ImGuiButtonFlags_NoKeyModifiers = 1 << 10, // disable interaction if a key modifier is held
266 ImGuiButtonFlags_NoHoldingActiveID = 1 << 11, // don't set ActiveId while holding the mouse (ImGuiButtonFlags_PressedOnClick only)
267 ImGuiButtonFlags_PressedOnDragDropHold = 1 << 12, // press when held into while we are drag and dropping another item (used by e.g. tree nodes, collapsing headers)
268 ImGuiButtonFlags_NoNavFocus = 1 << 13 // don't override navigation focus when activated
269};
270
271enum ImGuiSliderFlags_
272{
273 ImGuiSliderFlags_None = 0,
274 ImGuiSliderFlags_Vertical = 1 << 0
275};
276
277enum ImGuiDragFlags_
278{
279 ImGuiDragFlags_None = 0,
280 ImGuiDragFlags_Vertical = 1 << 0
281};
282
283enum ImGuiColumnsFlags_
284{
285 // Default: 0
286 ImGuiColumnsFlags_None = 0,
287 ImGuiColumnsFlags_NoBorder = 1 << 0, // Disable column dividers
288 ImGuiColumnsFlags_NoResize = 1 << 1, // Disable resizing columns when clicking on the dividers
289 ImGuiColumnsFlags_NoPreserveWidths = 1 << 2, // Disable column width preservation when adjusting columns
290 ImGuiColumnsFlags_NoForceWithinWindow = 1 << 3, // Disable forcing columns to fit within window
291 ImGuiColumnsFlags_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.
292};
293
294enum ImGuiSelectableFlagsPrivate_
295{
296 // NB: need to be in sync with last value of ImGuiSelectableFlags_
297 ImGuiSelectableFlags_NoHoldingActiveID = 1 << 10,
298 ImGuiSelectableFlags_PressedOnClick = 1 << 11,
299 ImGuiSelectableFlags_PressedOnRelease = 1 << 12,
300 ImGuiSelectableFlags_DrawFillAvailWidth = 1 << 13
301};
302
303enum ImGuiSeparatorFlags_
304{
305 ImGuiSeparatorFlags_None = 0,
306 ImGuiSeparatorFlags_Horizontal = 1 << 0, // Axis default to current layout type, so generally Horizontal unless e.g. in a menu bar
307 ImGuiSeparatorFlags_Vertical = 1 << 1
308};
309
310// Storage for LastItem data
311enum ImGuiItemStatusFlags_
312{
313 ImGuiItemStatusFlags_None = 0,
314 ImGuiItemStatusFlags_HoveredRect = 1 << 0,
315 ImGuiItemStatusFlags_HasDisplayRect = 1 << 1,
316 ImGuiItemStatusFlags_Edited = 1 << 2 // Value exposed by item was edited in the current frame (should match the bool return value of most widgets)
317};
318
319// FIXME: this is in development, not exposed/functional as a generic feature yet.
320enum ImGuiLayoutType_
321{
322 ImGuiLayoutType_Vertical,
323 ImGuiLayoutType_Horizontal
324};
325
326enum ImGuiAxis
327{
328 ImGuiAxis_None = -1,
329 ImGuiAxis_X = 0,
330 ImGuiAxis_Y = 1
331};
332
333enum ImGuiPlotType
334{
335 ImGuiPlotType_Lines,
336 ImGuiPlotType_Histogram
337};
338
339enum ImGuiInputSource
340{
341 ImGuiInputSource_None = 0,
342 ImGuiInputSource_Mouse,
343 ImGuiInputSource_Nav,
344 ImGuiInputSource_NavKeyboard, // Only used occasionally for storage, not tested/handled by most code
345 ImGuiInputSource_NavGamepad, // "
346 ImGuiInputSource_COUNT
347};
348
349// FIXME-NAV: Clarify/expose various repeat delay/rate
350enum ImGuiInputReadMode
351{
352 ImGuiInputReadMode_Down,
353 ImGuiInputReadMode_Pressed,
354 ImGuiInputReadMode_Released,
355 ImGuiInputReadMode_Repeat,
356 ImGuiInputReadMode_RepeatSlow,
357 ImGuiInputReadMode_RepeatFast
358};
359
360enum ImGuiNavHighlightFlags_
361{
362 ImGuiNavHighlightFlags_None = 0,
363 ImGuiNavHighlightFlags_TypeDefault = 1 << 0,
364 ImGuiNavHighlightFlags_TypeThin = 1 << 1,
365 ImGuiNavHighlightFlags_AlwaysDraw = 1 << 2,
366 ImGuiNavHighlightFlags_NoRounding = 1 << 3
367};
368
369enum ImGuiNavDirSourceFlags_
370{
371 ImGuiNavDirSourceFlags_None = 0,
372 ImGuiNavDirSourceFlags_Keyboard = 1 << 0,
373 ImGuiNavDirSourceFlags_PadDPad = 1 << 1,
374 ImGuiNavDirSourceFlags_PadLStick = 1 << 2
375};
376
377enum ImGuiNavMoveFlags_
378{
379 ImGuiNavMoveFlags_None = 0,
380 ImGuiNavMoveFlags_LoopX = 1 << 0, // On failed request, restart from opposite side
381 ImGuiNavMoveFlags_LoopY = 1 << 1,
382 ImGuiNavMoveFlags_WrapX = 1 << 2, // On failed request, request from opposite side one line down (when NavDir==right) or one line up (when NavDir==left)
383 ImGuiNavMoveFlags_WrapY = 1 << 3, // This is not super useful for provided for completeness
384 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)
385 ImGuiNavMoveFlags_AlsoScoreVisibleSet = 1 << 5 // Store alternate result in NavMoveResultLocalVisibleSet that only comprise elements that are already fully visible.
386};
387
388enum ImGuiNavForward
389{
390 ImGuiNavForward_None,
391 ImGuiNavForward_ForwardQueued,
392 ImGuiNavForward_ForwardActive
393};
394
395enum ImGuiPopupPositionPolicy
396{
397 ImGuiPopupPositionPolicy_Default,
398 ImGuiPopupPositionPolicy_ComboBox
399};
400
401// 2D axis aligned bounding-box
402// NB: we can't rely on ImVec2 math operators being available here
403struct IMGUI_API ImRect
404{
405 ImVec2 Min; // Upper-left
406 ImVec2 Max; // Lower-right
407
408 ImRect() : Min(FLT_MAX,FLT_MAX), Max(-FLT_MAX,-FLT_MAX) {}
409 ImRect(const ImVec2& min, const ImVec2& max) : Min(min), Max(max) {}
410 ImRect(const ImVec4& v) : Min(v.x, v.y), Max(v.z, v.w) {}
411 ImRect(float x1, float y1, float x2, float y2) : Min(x1, y1), Max(x2, y2) {}
412
413 ImVec2 GetCenter() const { return ImVec2((Min.x + Max.x) * 0.5f, (Min.y + Max.y) * 0.5f); }
414 ImVec2 GetSize() const { return ImVec2(Max.x - Min.x, Max.y - Min.y); }
415 float GetWidth() const { return Max.x - Min.x; }
416 float GetHeight() const { return Max.y - Min.y; }
417 ImVec2 GetTL() const { return Min; } // Top-left
418 ImVec2 GetTR() const { return ImVec2(Max.x, Min.y); } // Top-right
419 ImVec2 GetBL() const { return ImVec2(Min.x, Max.y); } // Bottom-left
420 ImVec2 GetBR() const { return Max; } // Bottom-right
421 bool Contains(const ImVec2& p) const { return p.x >= Min.x && p.y >= Min.y && p.x < Max.x && p.y < Max.y; }
422 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; }
423 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; }
424 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; }
425 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; }
426 void Expand(const float amount) { Min.x -= amount; Min.y -= amount; Max.x += amount; Max.y += amount; }
427 void Expand(const ImVec2& amount) { Min.x -= amount.x; Min.y -= amount.y; Max.x += amount.x; Max.y += amount.y; }
428 void Translate(const ImVec2& d) { Min.x += d.x; Min.y += d.y; Max.x += d.x; Max.y += d.y; }
429 void TranslateX(float dx) { Min.x += dx; Max.x += dx; }
430 void TranslateY(float dy) { Min.y += dy; Max.y += dy; }
431 void ClipWith(const ImRect& r) { Min = ImMax(lhs: Min, rhs: r.Min); Max = ImMin(lhs: Max, rhs: r.Max); } // Simple version, may lead to an inverted rectangle, which is fine for Contains/Overlaps test but not for display.
432 void ClipWithFull(const ImRect& r) { Min = ImClamp(v: Min, mn: r.Min, mx: r.Max); Max = ImClamp(v: Max, mn: r.Min, mx: r.Max); } // Full version, ensure both points are fully clipped.
433 void Floor() { Min.x = (float)(int)Min.x; Min.y = (float)(int)Min.y; Max.x = (float)(int)Max.x; Max.y = (float)(int)Max.y; }
434 bool IsInverted() const { return Min.x > Max.x || Min.y > Max.y; }
435};
436
437// Stacked color modifier, backup of modified data so we can restore it
438struct ImGuiColorMod
439{
440 ImGuiCol Col;
441 ImVec4 BackupValue;
442};
443
444// Stacked style modifier, backup of modified data so we can restore it. Data type inferred from the variable.
445struct ImGuiStyleMod
446{
447 ImGuiStyleVar VarIdx;
448 union { int BackupInt[2]; float BackupFloat[2]; };
449 ImGuiStyleMod(ImGuiStyleVar idx, int v) { VarIdx = idx; BackupInt[0] = v; }
450 ImGuiStyleMod(ImGuiStyleVar idx, float v) { VarIdx = idx; BackupFloat[0] = v; }
451 ImGuiStyleMod(ImGuiStyleVar idx, ImVec2 v) { VarIdx = idx; BackupFloat[0] = v.x; BackupFloat[1] = v.y; }
452};
453
454// Stacked storage data for BeginGroup()/EndGroup()
455struct ImGuiGroupData
456{
457 ImVec2 BackupCursorPos;
458 ImVec2 BackupCursorMaxPos;
459 ImVec1 BackupIndent;
460 ImVec1 BackupGroupOffset;
461 ImVec2 BackupCurrentLineSize;
462 float BackupCurrentLineTextBaseOffset;
463 float BackupLogLinePosY;
464 ImGuiID BackupActiveIdIsAlive;
465 bool BackupActiveIdPreviousFrameIsAlive;
466 bool AdvanceCursor;
467};
468
469// Simple column measurement, currently used for MenuItem() only.. This is very short-sighted/throw-away code and NOT a generic helper.
470struct IMGUI_API ImGuiMenuColumns
471{
472 int Count;
473 float Spacing;
474 float Width, NextWidth;
475 float Pos[4], NextWidths[4];
476
477 ImGuiMenuColumns();
478 void Update(int count, float spacing, bool clear);
479 float DeclColumns(float w0, float w1, float w2);
480 float CalcExtraSpace(float avail_w);
481};
482
483// Internal state of the currently focused/edited text input box
484struct IMGUI_API ImGuiInputTextState
485{
486 ImGuiID ID; // widget id owning the text state
487 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.
488 ImVector<char> InitialText; // backup of end-user buffer at the time of focus (in UTF-8, unaltered)
489 ImVector<char> TempBuffer; // temporary buffer for callback and other other operations. size=capacity.
490 int CurLenA, CurLenW; // we need to maintain our buffer length in both UTF-8 and wchar format.
491 int BufCapacityA; // end-user buffer capacity
492 float ScrollX;
493 ImGuiStb::STB_TexteditState StbState;
494 float CursorAnim;
495 bool CursorFollow;
496 bool SelectedAllMouseLock;
497
498 // Temporarily set when active
499 ImGuiInputTextFlags UserFlags;
500 ImGuiInputTextCallback UserCallback;
501 void* UserCallbackData;
502
503 ImGuiInputTextState() { memset(s: this, c: 0, n: sizeof(*this)); }
504 void CursorAnimReset() { CursorAnim = -0.30f; } // After a user-input the cursor stays on for a while without blinking
505 void CursorClamp() { StbState.cursor = ImMin(lhs: StbState.cursor, rhs: CurLenW); StbState.select_start = ImMin(lhs: StbState.select_start, rhs: CurLenW); StbState.select_end = ImMin(lhs: StbState.select_end, rhs: CurLenW); }
506 bool HasSelection() const { return StbState.select_start != StbState.select_end; }
507 void ClearSelection() { StbState.select_start = StbState.select_end = StbState.cursor; }
508 void SelectAll() { StbState.select_start = 0; StbState.cursor = StbState.select_end = CurLenW; StbState.has_preferred_x = false; }
509 void OnKeyPressed(int key); // Cannot be inline because we call in code in stb_textedit.h implementation
510};
511
512// Windows data saved in imgui.ini file
513struct ImGuiWindowSettings
514{
515 char* Name;
516 ImGuiID ID;
517 ImVec2 Pos;
518 ImVec2 Size;
519 bool Collapsed;
520
521 ImGuiWindowSettings() { Name = NULL; ID = 0; Pos = Size = ImVec2(0,0); Collapsed = false; }
522};
523
524struct ImGuiSettingsHandler
525{
526 const char* TypeName; // Short description stored in .ini file. Disallowed characters: '[' ']'
527 ImGuiID TypeHash; // == ImHash(TypeName, 0, 0)
528 void* (*ReadOpenFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, const char* name); // Read: Called when entering into a new ini entry e.g. "[Window][Name]"
529 void (*ReadLineFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, void* entry, const char* line); // Read: Called for every line of text within an ini entry
530 void (*WriteAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* out_buf); // Write: Output every entries into 'out_buf'
531 void* UserData;
532
533 ImGuiSettingsHandler() { memset(s: this, c: 0, n: sizeof(*this)); }
534};
535
536// Storage for current popup stack
537struct ImGuiPopupRef
538{
539 ImGuiID PopupId; // Set on OpenPopup()
540 ImGuiWindow* Window; // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup()
541 ImGuiWindow* ParentWindow; // Set on OpenPopup()
542 int OpenFrameCount; // Set on OpenPopup()
543 ImGuiID OpenParentId; // Set on OpenPopup(), we need this to differenciate multiple menu sets from each others (e.g. inside menu bar vs loose menu items)
544 ImVec2 OpenPopupPos; // Set on OpenPopup(), preferred popup position (typically == OpenMousePos when using mouse)
545 ImVec2 OpenMousePos; // Set on OpenPopup(), copy of mouse position at the time of opening popup
546};
547
548struct ImGuiColumnData
549{
550 float OffsetNorm; // Column start offset, normalized 0.0 (far left) -> 1.0 (far right)
551 float OffsetNormBeforeResize;
552 ImGuiColumnsFlags Flags; // Not exposed
553 ImRect ClipRect;
554
555 ImGuiColumnData() { OffsetNorm = OffsetNormBeforeResize = 0.0f; Flags = 0; }
556};
557
558struct ImGuiColumnsSet
559{
560 ImGuiID ID;
561 ImGuiColumnsFlags Flags;
562 bool IsFirstFrame;
563 bool IsBeingResized;
564 int Current;
565 int Count;
566 float MinX, MaxX;
567 float LineMinY, LineMaxY;
568 float StartPosY; // Copy of CursorPos
569 float StartMaxPosX; // Copy of CursorMaxPos
570 ImVector<ImGuiColumnData> Columns;
571
572 ImGuiColumnsSet() { Clear(); }
573 void Clear()
574 {
575 ID = 0;
576 Flags = 0;
577 IsFirstFrame = false;
578 IsBeingResized = false;
579 Current = 0;
580 Count = 1;
581 MinX = MaxX = 0.0f;
582 LineMinY = LineMaxY = 0.0f;
583 StartPosY = 0.0f;
584 StartMaxPosX = 0.0f;
585 Columns.clear();
586 }
587};
588
589// Data shared between all ImDrawList instances
590struct IMGUI_API ImDrawListSharedData
591{
592 ImVec2 TexUvWhitePixel; // UV of white pixel in the atlas
593 ImFont* Font; // Current/default font (optional, for simplified AddText overload)
594 float FontSize; // Current/default font size (optional, for simplified AddText overload)
595 float CurveTessellationTol;
596 ImVec4 ClipRectFullscreen; // Value for PushClipRectFullscreen()
597
598 // Const data
599 // FIXME: Bake rounded corners fill/borders in atlas
600 ImVec2 CircleVtx12[12];
601
602 ImDrawListSharedData();
603};
604
605struct ImDrawDataBuilder
606{
607 ImVector<ImDrawList*> Layers[2]; // Global layers for: regular, tooltip
608
609 void Clear() { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].resize(new_size: 0); }
610 void ClearFreeMemory() { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].clear(); }
611 IMGUI_API void FlattenIntoSingleLayer();
612};
613
614struct ImGuiNavMoveResult
615{
616 ImGuiID ID; // Best candidate
617 ImGuiWindow* Window; // Best candidate window
618 float DistBox; // Best candidate box distance to current NavId
619 float DistCenter; // Best candidate center distance to current NavId
620 float DistAxial;
621 ImRect RectRel; // Best candidate bounding box in window relative space
622
623 ImGuiNavMoveResult() { Clear(); }
624 void Clear() { ID = 0; Window = NULL; DistBox = DistCenter = DistAxial = FLT_MAX; RectRel = ImRect(); }
625};
626
627// Storage for SetNexWindow** functions
628struct ImGuiNextWindowData
629{
630 ImGuiCond PosCond;
631 ImGuiCond SizeCond;
632 ImGuiCond ContentSizeCond;
633 ImGuiCond CollapsedCond;
634 ImGuiCond SizeConstraintCond;
635 ImGuiCond FocusCond;
636 ImGuiCond BgAlphaCond;
637 ImVec2 PosVal;
638 ImVec2 PosPivotVal;
639 ImVec2 SizeVal;
640 ImVec2 ContentSizeVal;
641 bool CollapsedVal;
642 ImRect SizeConstraintRect;
643 ImGuiSizeCallback SizeCallback;
644 void* SizeCallbackUserData;
645 float BgAlphaVal;
646 ImVec2 MenuBarOffsetMinVal; // This is not exposed publicly, so we don't clear it.
647
648 ImGuiNextWindowData()
649 {
650 PosCond = SizeCond = ContentSizeCond = CollapsedCond = SizeConstraintCond = FocusCond = BgAlphaCond = 0;
651 PosVal = PosPivotVal = SizeVal = ImVec2(0.0f, 0.0f);
652 ContentSizeVal = ImVec2(0.0f, 0.0f);
653 CollapsedVal = false;
654 SizeConstraintRect = ImRect();
655 SizeCallback = NULL;
656 SizeCallbackUserData = NULL;
657 BgAlphaVal = FLT_MAX;
658 MenuBarOffsetMinVal = ImVec2(0.0f, 0.0f);
659 }
660
661 void Clear()
662 {
663 PosCond = SizeCond = ContentSizeCond = CollapsedCond = SizeConstraintCond = FocusCond = BgAlphaCond = 0;
664 }
665};
666
667// Main imgui context
668struct ImGuiContext
669{
670 bool Initialized;
671 bool FrameScopeActive; // Set by NewFrame(), cleared by EndFrame()/Render()
672 bool FontAtlasOwnedByContext; // Io.Fonts-> is owned by the ImGuiContext and will be destructed along with it.
673 ImGuiIO IO;
674 ImGuiStyle Style;
675 ImFont* Font; // (Shortcut) == FontStack.empty() ? IO.Font : FontStack.back()
676 float FontSize; // (Shortcut) == FontBaseSize * g.CurrentWindow->FontWindowScale == window->FontSize(). Text height for current window.
677 float FontBaseSize; // (Shortcut) == IO.FontGlobalScale * Font->Scale * Font->FontSize. Base text height.
678 ImDrawListSharedData DrawListSharedData;
679
680 double Time;
681 int FrameCount;
682 int FrameCountEnded;
683 int FrameCountRendered;
684 ImVector<ImGuiWindow*> Windows; // Windows, sorted in display order, back to front
685 ImVector<ImGuiWindow*> WindowsFocusOrder; // Windows, sorted in focus order, back to front
686 ImVector<ImGuiWindow*> WindowsSortBuffer;
687 ImVector<ImGuiWindow*> CurrentWindowStack;
688 ImGuiStorage WindowsById;
689 int WindowsActiveCount;
690 ImGuiWindow* CurrentWindow; // Being drawn into
691 ImGuiWindow* HoveredWindow; // Will catch mouse inputs
692 ImGuiWindow* HoveredRootWindow; // Will catch mouse inputs (for focus/move only)
693 ImGuiID HoveredId; // Hovered widget
694 bool HoveredIdAllowOverlap;
695 ImGuiID HoveredIdPreviousFrame;
696 float HoveredIdTimer; // Measure contiguous hovering time
697 float HoveredIdNotActiveTimer; // Measure contiguous hovering time where the item has not been active
698 ImGuiID ActiveId; // Active widget
699 ImGuiID ActiveIdPreviousFrame;
700 ImGuiID ActiveIdIsAlive; // Active widget has been seen this frame (we can't use a bool as the ActiveId may change within the frame)
701 float ActiveIdTimer;
702 bool ActiveIdIsJustActivated; // Set at the time of activation for one frame
703 bool ActiveIdAllowOverlap; // Active widget allows another widget to steal active id (generally for overlapping widgets, but not always)
704 bool ActiveIdHasBeenEdited; // Was the value associated to the widget Edited over the course of the Active state.
705 bool ActiveIdPreviousFrameIsAlive;
706 bool ActiveIdPreviousFrameHasBeenEdited;
707 int ActiveIdAllowNavDirFlags; // Active widget allows using directional navigation (e.g. can activate a button and move away from it)
708 ImVec2 ActiveIdClickOffset; // Clicked offset from upper-left corner, if applicable (currently only set by ButtonBehavior)
709 ImGuiWindow* ActiveIdWindow;
710 ImGuiWindow* ActiveIdPreviousFrameWindow;
711 ImGuiInputSource ActiveIdSource; // Activating with mouse or nav (gamepad/keyboard)
712 ImGuiID LastActiveId; // Store the last non-zero ActiveId, useful for animation.
713 float LastActiveIdTimer; // Store the last non-zero ActiveId timer since the beginning of activation, useful for animation.
714 ImVec2 LastValidMousePos;
715 ImGuiWindow* MovingWindow; // Track the window we clicked on (in order to preserve focus). The actually window that is moved is generally MovingWindow->RootWindow.
716 ImVector<ImGuiColorMod> ColorModifiers; // Stack for PushStyleColor()/PopStyleColor()
717 ImVector<ImGuiStyleMod> StyleModifiers; // Stack for PushStyleVar()/PopStyleVar()
718 ImVector<ImFont*> FontStack; // Stack for PushFont()/PopFont()
719 ImVector<ImGuiPopupRef> OpenPopupStack; // Which popups are open (persistent)
720 ImVector<ImGuiPopupRef> CurrentPopupStack; // Which level of BeginPopup() we are in (reset every frame)
721 ImGuiNextWindowData NextWindowData; // Storage for SetNextWindow** functions
722 bool NextTreeNodeOpenVal; // Storage for SetNextTreeNode** functions
723 ImGuiCond NextTreeNodeOpenCond;
724
725 // Navigation data (for gamepad/keyboard)
726 ImGuiWindow* NavWindow; // Focused window for navigation. Could be called 'FocusWindow'
727 ImGuiID NavId; // Focused item for navigation
728 ImGuiID NavActivateId; // ~~ (g.ActiveId == 0) && IsNavInputPressed(ImGuiNavInput_Activate) ? NavId : 0, also set when calling ActivateItem()
729 ImGuiID NavActivateDownId; // ~~ IsNavInputDown(ImGuiNavInput_Activate) ? NavId : 0
730 ImGuiID NavActivatePressedId; // ~~ IsNavInputPressed(ImGuiNavInput_Activate) ? NavId : 0
731 ImGuiID NavInputId; // ~~ IsNavInputPressed(ImGuiNavInput_Input) ? NavId : 0
732 ImGuiID NavJustTabbedId; // Just tabbed to this id.
733 ImGuiID NavJustMovedToId; // Just navigated to this id (result of a successfully MoveRequest)
734 ImGuiID NavNextActivateId; // Set by ActivateItem(), queued until next frame
735 ImGuiInputSource NavInputSource; // Keyboard or Gamepad mode? THIS WILL ONLY BE None or NavGamepad or NavKeyboard.
736 ImRect NavScoringRectScreen; // Rectangle used for scoring, in screen space. Based of window->DC.NavRefRectRel[], modified for directional navigation scoring.
737 int NavScoringCount; // Metrics for debugging
738 ImGuiWindow* NavWindowingTarget; // When selecting a window (holding Menu+FocusPrev/Next, or equivalent of CTRL-TAB) this window is temporarily displayed front-most.
739 ImGuiWindow* NavWindowingTargetAnim; // Record of last valid NavWindowingTarget until DimBgRatio and NavWindowingHighlightAlpha becomes 0.0f
740 ImGuiWindow* NavWindowingList;
741 float NavWindowingTimer;
742 float NavWindowingHighlightAlpha;
743 bool NavWindowingToggleLayer;
744 int 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.
745 int NavIdTabCounter; // == NavWindow->DC.FocusIdxTabCounter at time of NavId processing
746 bool NavIdIsAlive; // Nav widget has been seen this frame ~~ NavRefRectRel is valid
747 bool NavMousePosDirty; // When set we will update mouse position if (io.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos) if set (NB: this not enabled by default)
748 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)
749 bool NavDisableMouseHover; // When user starts using gamepad/keyboard, we hide mouse hovering highlight until mouse is touched again.
750 bool NavAnyRequest; // ~~ NavMoveRequest || NavInitRequest
751 bool NavInitRequest; // Init request for appearing window to select first item
752 bool NavInitRequestFromMove;
753 ImGuiID NavInitResultId;
754 ImRect NavInitResultRectRel;
755 bool NavMoveFromClampedRefRect; // Set by manual scrolling, if we scroll to a point where NavId isn't visible we reset navigation from visible items
756 bool NavMoveRequest; // Move request for this frame
757 ImGuiNavMoveFlags NavMoveRequestFlags;
758 ImGuiNavForward NavMoveRequestForward; // None / ForwardQueued / ForwardActive (this is used to navigate sibling parent menus from a child menu)
759 ImGuiDir NavMoveDir, NavMoveDirLast; // Direction of the move request (left/right/up/down), direction of the previous move request
760 ImGuiDir NavMoveClipDir;
761 ImGuiNavMoveResult NavMoveResultLocal; // Best move request candidate within NavWindow
762 ImGuiNavMoveResult NavMoveResultLocalVisibleSet; // Best move request candidate within NavWindow that are mostly visible (when using ImGuiNavMoveFlags_AlsoScoreVisibleSet flag)
763 ImGuiNavMoveResult NavMoveResultOther; // Best move request candidate within NavWindow's flattened hierarchy (when using ImGuiWindowFlags_NavFlattened flag)
764
765 // Render
766 ImDrawData DrawData; // Main ImDrawData instance to pass render information to the user
767 ImDrawDataBuilder DrawDataBuilder;
768 float DimBgRatio; // 0.0..1.0 animation when fading in a dimming background (for modal window and CTRL+TAB list)
769 ImDrawList OverlayDrawList; // Optional software render of mouse cursors, if io.MouseDrawCursor is set + a few debug overlays
770 ImGuiMouseCursor MouseCursor;
771
772 // Drag and Drop
773 bool DragDropActive;
774 bool DragDropWithinSourceOrTarget;
775 ImGuiDragDropFlags DragDropSourceFlags;
776 int DragDropSourceFrameCount;
777 int DragDropMouseButton;
778 ImGuiPayload DragDropPayload;
779 ImRect DragDropTargetRect;
780 ImGuiID DragDropTargetId;
781 ImGuiDragDropFlags DragDropAcceptFlags;
782 float DragDropAcceptIdCurrRectSurface; // Target item surface (we resolve overlapping targets by prioritizing the smaller surface)
783 ImGuiID DragDropAcceptIdCurr; // Target item id (set at the time of accepting the payload)
784 ImGuiID DragDropAcceptIdPrev; // Target item id from previous frame (we need to store this to allow for overlapping drag and drop targets)
785 int DragDropAcceptFrameCount; // Last time a target expressed a desire to accept the source
786 ImVector<unsigned char> DragDropPayloadBufHeap; // We don't expose the ImVector<> directly
787 unsigned char DragDropPayloadBufLocal[8]; // Local buffer for small payloads
788
789 // Widget state
790 ImGuiInputTextState InputTextState;
791 ImFont InputTextPasswordFont;
792 ImGuiID ScalarAsInputTextId; // Temporary text input when CTRL+clicking on a slider, etc.
793 ImGuiColorEditFlags ColorEditOptions; // Store user options for color edit widgets
794 ImVec4 ColorPickerRef;
795 bool DragCurrentAccumDirty;
796 float DragCurrentAccum; // Accumulator for dragging modification. Always high-precision, not rounded by end-user precision settings
797 float DragSpeedDefaultRatio; // If speed == 0.0f, uses (max-min) * DragSpeedDefaultRatio
798 ImVec2 ScrollbarClickDeltaToGrabCenter; // Distance between mouse and center of grab box, normalized in parent space. Use storage?
799 int TooltipOverrideCount;
800 ImVector<char> PrivateClipboard; // If no custom clipboard handler is defined
801 ImVec2 PlatformImePos, PlatformImeLastPos; // Cursor position request & last passed to the OS Input Method Editor
802
803 // Settings
804 bool SettingsLoaded;
805 float SettingsDirtyTimer; // Save .ini Settings to memory when time reaches zero
806 ImGuiTextBuffer SettingsIniData; // In memory .ini settings
807 ImVector<ImGuiSettingsHandler> SettingsHandlers; // List of .ini settings handlers
808 ImVector<ImGuiWindowSettings> SettingsWindows; // ImGuiWindow .ini settings entries (parsed from the last loaded .ini file and maintained on saving)
809
810 // Logging
811 bool LogEnabled;
812 FILE* LogFile; // If != NULL log to stdout/ file
813 ImGuiTextBuffer LogClipboard; // Accumulation buffer when log to clipboard. This is pointer so our GImGui static constructor doesn't call heap allocators.
814 int LogStartDepth;
815 int LogAutoExpandMaxDepth;
816
817 // Misc
818 float FramerateSecPerFrame[120]; // Calculate estimate of framerate for user over the last 2 seconds.
819 int FramerateSecPerFrameIdx;
820 float FramerateSecPerFrameAccum;
821 int WantCaptureMouseNextFrame; // Explicit capture via CaptureKeyboardFromApp()/CaptureMouseFromApp() sets those flags
822 int WantCaptureKeyboardNextFrame;
823 int WantTextInputNextFrame;
824 char TempBuffer[1024*3+1]; // Temporary text buffer
825
826 ImGuiContext(ImFontAtlas* shared_font_atlas) : OverlayDrawList(NULL)
827 {
828 Initialized = false;
829 FrameScopeActive = false;
830 Font = NULL;
831 FontSize = FontBaseSize = 0.0f;
832 FontAtlasOwnedByContext = shared_font_atlas ? false : true;
833 IO.Fonts = shared_font_atlas ? shared_font_atlas : IM_NEW(ImFontAtlas)();
834
835 Time = 0.0f;
836 FrameCount = 0;
837 FrameCountEnded = FrameCountRendered = -1;
838 WindowsActiveCount = 0;
839 CurrentWindow = NULL;
840 HoveredWindow = NULL;
841 HoveredRootWindow = NULL;
842 HoveredId = 0;
843 HoveredIdAllowOverlap = false;
844 HoveredIdPreviousFrame = 0;
845 HoveredIdTimer = HoveredIdNotActiveTimer = 0.0f;
846 ActiveId = 0;
847 ActiveIdPreviousFrame = 0;
848 ActiveIdIsAlive = 0;
849 ActiveIdTimer = 0.0f;
850 ActiveIdIsJustActivated = false;
851 ActiveIdAllowOverlap = false;
852 ActiveIdHasBeenEdited = false;
853 ActiveIdPreviousFrameIsAlive = false;
854 ActiveIdPreviousFrameHasBeenEdited = false;
855 ActiveIdAllowNavDirFlags = 0;
856 ActiveIdClickOffset = ImVec2(-1,-1);
857 ActiveIdWindow = ActiveIdPreviousFrameWindow = NULL;
858 ActiveIdSource = ImGuiInputSource_None;
859 LastActiveId = 0;
860 LastActiveIdTimer = 0.0f;
861 LastValidMousePos = ImVec2(0.0f, 0.0f);
862 MovingWindow = NULL;
863 NextTreeNodeOpenVal = false;
864 NextTreeNodeOpenCond = 0;
865
866 NavWindow = NULL;
867 NavId = NavActivateId = NavActivateDownId = NavActivatePressedId = NavInputId = 0;
868 NavJustTabbedId = NavJustMovedToId = NavNextActivateId = 0;
869 NavInputSource = ImGuiInputSource_None;
870 NavScoringRectScreen = ImRect();
871 NavScoringCount = 0;
872 NavWindowingTarget = NavWindowingTargetAnim = NavWindowingList = NULL;
873 NavWindowingTimer = NavWindowingHighlightAlpha = 0.0f;
874 NavWindowingToggleLayer = false;
875 NavLayer = 0;
876 NavIdTabCounter = INT_MAX;
877 NavIdIsAlive = false;
878 NavMousePosDirty = false;
879 NavDisableHighlight = true;
880 NavDisableMouseHover = false;
881 NavAnyRequest = false;
882 NavInitRequest = false;
883 NavInitRequestFromMove = false;
884 NavInitResultId = 0;
885 NavMoveFromClampedRefRect = false;
886 NavMoveRequest = false;
887 NavMoveRequestFlags = 0;
888 NavMoveRequestForward = ImGuiNavForward_None;
889 NavMoveDir = NavMoveDirLast = NavMoveClipDir = ImGuiDir_None;
890
891 DimBgRatio = 0.0f;
892 OverlayDrawList._Data = &DrawListSharedData;
893 OverlayDrawList._OwnerName = "##Overlay"; // Give it a name for debugging
894 MouseCursor = ImGuiMouseCursor_Arrow;
895
896 DragDropActive = DragDropWithinSourceOrTarget = false;
897 DragDropSourceFlags = 0;
898 DragDropSourceFrameCount = -1;
899 DragDropMouseButton = -1;
900 DragDropTargetId = 0;
901 DragDropAcceptFlags = 0;
902 DragDropAcceptIdCurrRectSurface = 0.0f;
903 DragDropAcceptIdPrev = DragDropAcceptIdCurr = 0;
904 DragDropAcceptFrameCount = -1;
905 memset(s: DragDropPayloadBufLocal, c: 0, n: sizeof(DragDropPayloadBufLocal));
906
907 ScalarAsInputTextId = 0;
908 ColorEditOptions = ImGuiColorEditFlags__OptionsDefault;
909 DragCurrentAccumDirty = false;
910 DragCurrentAccum = 0.0f;
911 DragSpeedDefaultRatio = 1.0f / 100.0f;
912 ScrollbarClickDeltaToGrabCenter = ImVec2(0.0f, 0.0f);
913 TooltipOverrideCount = 0;
914 PlatformImePos = PlatformImeLastPos = ImVec2(FLT_MAX, FLT_MAX);
915
916 SettingsLoaded = false;
917 SettingsDirtyTimer = 0.0f;
918
919 LogEnabled = false;
920 LogFile = NULL;
921 LogStartDepth = 0;
922 LogAutoExpandMaxDepth = 2;
923
924 memset(s: FramerateSecPerFrame, c: 0, n: sizeof(FramerateSecPerFrame));
925 FramerateSecPerFrameIdx = 0;
926 FramerateSecPerFrameAccum = 0.0f;
927 WantCaptureMouseNextFrame = WantCaptureKeyboardNextFrame = WantTextInputNextFrame = -1;
928 memset(s: TempBuffer, c: 0, n: sizeof(TempBuffer));
929 }
930};
931
932// Transient per-window flags, reset at the beginning of the frame. For child window, inherited from parent on first Begin().
933// This is going to be exposed in imgui.h when stabilized enough.
934enum ImGuiItemFlags_
935{
936 ImGuiItemFlags_NoTabStop = 1 << 0, // false
937 ImGuiItemFlags_ButtonRepeat = 1 << 1, // false // Button() will return true multiple times based on io.KeyRepeatDelay and io.KeyRepeatRate settings.
938 ImGuiItemFlags_Disabled = 1 << 2, // false // [BETA] Disable interactions but doesn't affect visuals yet. See github.com/ocornut/imgui/issues/211
939 ImGuiItemFlags_NoNav = 1 << 3, // false
940 ImGuiItemFlags_NoNavDefaultFocus = 1 << 4, // false
941 ImGuiItemFlags_SelectableDontClosePopup = 1 << 5, // false // MenuItem/Selectable() automatically closes current Popup window
942 ImGuiItemFlags_Default_ = 0
943};
944
945// Transient per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the DC variable name in ImGuiWindow.
946// FIXME: That's theory, in practice the delimitation between ImGuiWindow and ImGuiWindowTempData is quite tenuous and could be reconsidered.
947struct IMGUI_API ImGuiWindowTempData
948{
949 ImVec2 CursorPos;
950 ImVec2 CursorPosPrevLine;
951 ImVec2 CursorStartPos; // Initial position in client area with padding
952 ImVec2 CursorMaxPos; // Used to implicitly calculate the size of our contents, always growing during the frame. Turned into window->SizeContents at the beginning of next frame
953 ImVec2 CurrentLineSize;
954 float CurrentLineTextBaseOffset;
955 ImVec2 PrevLineSize;
956 float PrevLineTextBaseOffset;
957 float LogLinePosY;
958 int TreeDepth;
959 ImU32 TreeDepthMayJumpToParentOnPop; // Store a copy of !g.NavIdIsAlive for TreeDepth 0..31
960 ImGuiID LastItemId;
961 ImGuiItemStatusFlags LastItemStatusFlags;
962 ImRect LastItemRect; // Interaction rect
963 ImRect LastItemDisplayRect; // End-user display rect (only valid if LastItemStatusFlags & ImGuiItemStatusFlags_HasDisplayRect)
964 bool NavHideHighlightOneFrame;
965 bool NavHasScroll; // Set when scrolling can be used (ScrollMax > 0.0f)
966 int NavLayerCurrent; // Current layer, 0..31 (we currently only use 0..1)
967 int NavLayerCurrentMask; // = (1 << NavLayerCurrent) used by ItemAdd prior to clipping.
968 int NavLayerActiveMask; // Which layer have been written to (result from previous frame)
969 int NavLayerActiveMaskNext; // Which layer have been written to (buffer for current frame)
970 bool MenuBarAppending; // FIXME: Remove this
971 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.
972 ImVector<ImGuiWindow*> ChildWindows;
973 ImGuiStorage* StateStorage;
974 ImGuiLayoutType LayoutType;
975 ImGuiLayoutType ParentLayoutType; // Layout type of parent window at the time of Begin()
976
977 // 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.
978 ImGuiItemFlags ItemFlags; // == ItemFlagsStack.back() [empty == ImGuiItemFlags_Default]
979 float ItemWidth; // == ItemWidthStack.back(). 0.0: default, >0.0: width in pixels, <0.0: align xx pixels to the right of window
980 float TextWrapPos; // == TextWrapPosStack.back() [empty == -1.0f]
981 ImVector<ImGuiItemFlags>ItemFlagsStack;
982 ImVector<float> ItemWidthStack;
983 ImVector<float> TextWrapPosStack;
984 ImVector<ImGuiGroupData>GroupStack;
985 int StackSizesBackup[6]; // Store size of various stacks for asserting
986
987 ImVec1 Indent; // Indentation / start position from left of window (increased by TreePush/TreePop, etc.)
988 ImVec1 GroupOffset;
989 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.
990 ImGuiColumnsSet* ColumnsSet; // Current columns set
991
992 ImGuiWindowTempData()
993 {
994 CursorPos = CursorPosPrevLine = CursorStartPos = CursorMaxPos = ImVec2(0.0f, 0.0f);
995 CurrentLineSize = PrevLineSize = ImVec2(0.0f, 0.0f);
996 CurrentLineTextBaseOffset = PrevLineTextBaseOffset = 0.0f;
997 LogLinePosY = -1.0f;
998 TreeDepth = 0;
999 TreeDepthMayJumpToParentOnPop = 0x00;
1000 LastItemId = 0;
1001 LastItemStatusFlags = 0;
1002 LastItemRect = LastItemDisplayRect = ImRect();
1003 NavHideHighlightOneFrame = false;
1004 NavHasScroll = false;
1005 NavLayerActiveMask = NavLayerActiveMaskNext = 0x00;
1006 NavLayerCurrent = 0;
1007 NavLayerCurrentMask = 1 << 0;
1008 MenuBarAppending = false;
1009 MenuBarOffset = ImVec2(0.0f, 0.0f);
1010 StateStorage = NULL;
1011 LayoutType = ParentLayoutType = ImGuiLayoutType_Vertical;
1012 ItemWidth = 0.0f;
1013 ItemFlags = ImGuiItemFlags_Default_;
1014 TextWrapPos = -1.0f;
1015 memset(s: StackSizesBackup, c: 0, n: sizeof(StackSizesBackup));
1016
1017 Indent = ImVec1(0.0f);
1018 GroupOffset = ImVec1(0.0f);
1019 ColumnsOffset = ImVec1(0.0f);
1020 ColumnsSet = NULL;
1021 }
1022};
1023
1024// Storage for one window
1025struct IMGUI_API ImGuiWindow
1026{
1027 char* Name;
1028 ImGuiID ID; // == ImHash(Name)
1029 ImGuiWindowFlags Flags; // See enum ImGuiWindowFlags_
1030 ImVec2 Pos; // Position (always rounded-up to nearest pixel)
1031 ImVec2 Size; // Current size (==SizeFull or collapsed title bar size)
1032 ImVec2 SizeFull; // Size when non collapsed
1033 ImVec2 SizeFullAtLastBegin; // Copy of SizeFull at the end of Begin. This is the reference value we'll use on the next frame to decide if we need scrollbars.
1034 ImVec2 SizeContents; // Size of contents (== extents reach of the drawing cursor) from previous frame. Include decoration, window title, border, menu, etc.
1035 ImVec2 SizeContentsExplicit; // Size of contents explicitly set by the user via SetNextWindowContentSize()
1036 ImVec2 WindowPadding; // Window padding at the time of begin.
1037 float WindowRounding; // Window rounding at the time of begin.
1038 float WindowBorderSize; // Window border size at the time of begin.
1039 ImGuiID MoveId; // == window->GetID("#MOVE")
1040 ImGuiID ChildId; // ID of corresponding item in parent window (for navigation to return from child window to parent window)
1041 ImVec2 Scroll;
1042 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)
1043 ImVec2 ScrollTargetCenterRatio; // 0.0f = scroll so that target position is at top, 0.5f = scroll so that target position is centered
1044 ImVec2 ScrollbarSizes; // Size taken by scrollbars on each axis
1045 bool ScrollbarX, ScrollbarY;
1046 bool Active; // Set to true on Begin(), unless Collapsed
1047 bool WasActive;
1048 bool WriteAccessed; // Set to true when any widget access the current window
1049 bool Collapsed; // Set when collapsing window to become only title-bar
1050 bool WantCollapseToggle;
1051 bool SkipItems; // Set when items can safely be all clipped (e.g. window not visible or collapsed)
1052 bool Appearing; // Set during the frame where the window is appearing (or re-appearing)
1053 bool Hidden; // Do not display (== (HiddenFramesForResize > 0) ||
1054 bool HasCloseButton; // Set when the window has a close button (p_open != NULL)
1055 int BeginCount; // Number of Begin() during the current frame (generally 0 or 1, 1+ if appending via multiple Begin/End pairs)
1056 int BeginOrderWithinParent; // Order within immediate parent window, if we are a child window. Otherwise 0.
1057 int BeginOrderWithinContext; // Order within entire imgui context. This is mostly used for debugging submission order related issues.
1058 ImGuiID PopupId; // ID in the popup stack when this window is used as a popup/menu (because we use generic Name/ID for recycling)
1059 int AutoFitFramesX, AutoFitFramesY;
1060 bool AutoFitOnlyGrows;
1061 int AutoFitChildAxises;
1062 ImGuiDir AutoPosLastDirection;
1063 int HiddenFramesRegular; // Hide the window for N frames
1064 int HiddenFramesForResize; // Hide the window for N frames while allowing items to be submitted so we can measure their size
1065 ImGuiCond SetWindowPosAllowFlags; // store acceptable condition flags for SetNextWindowPos() use.
1066 ImGuiCond SetWindowSizeAllowFlags; // store acceptable condition flags for SetNextWindowSize() use.
1067 ImGuiCond SetWindowCollapsedAllowFlags; // store acceptable condition flags for SetNextWindowCollapsed() use.
1068 ImVec2 SetWindowPosVal; // store window position when using a non-zero Pivot (position set needs to be processed when we know the window size)
1069 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.
1070
1071 ImGuiWindowTempData DC; // Temporary per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the "DC" variable name.
1072 ImVector<ImGuiID> IDStack; // ID stack. ID are hashes seeded with the value at the top of the stack
1073 ImRect ClipRect; // Current clipping rectangle. = DrawList->clip_rect_stack.back(). Scissoring / clipping rectangle. x1, y1, x2, y2.
1074 ImRect OuterRectClipped; // = WindowRect just after setup in Begin(). == window->Rect() for root window.
1075 ImRect InnerMainRect, InnerClipRect;
1076 ImRect ContentsRegionRect; // FIXME: This is currently confusing/misleading. Maximum visible content position ~~ Pos + (SizeContentsExplicit ? SizeContentsExplicit : Size - ScrollbarSizes) - CursorStartPos, per axis
1077 int LastFrameActive; // Last frame number the window was Active.
1078 float ItemWidthDefault;
1079 ImGuiMenuColumns MenuColumns; // Simplified columns storage for menu items
1080 ImGuiStorage StateStorage;
1081 ImVector<ImGuiColumnsSet> ColumnsStorage;
1082 float FontWindowScale; // User scale multiplier per-window
1083 int SettingsIdx; // Index into SettingsWindow[] (indices are always valid as we only grow the array from the back)
1084
1085 ImDrawList* DrawList; // == &DrawListInst (for backward compatibility reason with code using imgui_internal.h we keep this a pointer)
1086 ImDrawList DrawListInst;
1087 ImGuiWindow* ParentWindow; // If we are a child _or_ popup window, this is pointing to our parent. Otherwise NULL.
1088 ImGuiWindow* RootWindow; // Point to ourself or first ancestor that is not a child window.
1089 ImGuiWindow* RootWindowForTitleBarHighlight; // Point to ourself or first ancestor which will display TitleBgActive color when this window is active.
1090 ImGuiWindow* RootWindowForNav; // Point to ourself or first ancestor which doesn't have the NavFlattened flag.
1091
1092 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.)
1093 ImGuiID NavLastIds[2]; // Last known NavId for this window, per layer (0/1)
1094 ImRect NavRectRel[2]; // Reference rectangle, in window relative space
1095
1096 // Navigation / Focus
1097 // FIXME-NAV: Merge all this with the new Nav system, at least the request variables should be moved to ImGuiContext
1098 int FocusIdxAllCounter; // Start at -1 and increase as assigned via FocusItemRegister()
1099 int FocusIdxTabCounter; // (same, but only count widgets which you can Tab through)
1100 int FocusIdxAllRequestCurrent; // Item being requested for focus
1101 int FocusIdxTabRequestCurrent; // Tab-able item being requested for focus
1102 int FocusIdxAllRequestNext; // Item being requested for focus, for next update (relies on layout to be stable between the frame pressing TAB and the next frame)
1103 int FocusIdxTabRequestNext; // "
1104
1105public:
1106 ImGuiWindow(ImGuiContext* context, const char* name);
1107 ~ImGuiWindow();
1108
1109 ImGuiID GetID(const char* str, const char* str_end = NULL);
1110 ImGuiID GetID(const void* ptr);
1111 ImGuiID GetIDNoKeepAlive(const char* str, const char* str_end = NULL);
1112 ImGuiID GetIDNoKeepAlive(const void* ptr);
1113 ImGuiID GetIDFromRectangle(const ImRect& r_abs);
1114
1115 // We don't use g.FontSize because the window may be != g.CurrentWidow.
1116 ImRect Rect() const { return ImRect(Pos.x, Pos.y, Pos.x+Size.x, Pos.y+Size.y); }
1117 float CalcFontSize() const { return GImGui->FontBaseSize * FontWindowScale; }
1118 float TitleBarHeight() const { return (Flags & ImGuiWindowFlags_NoTitleBar) ? 0.0f : CalcFontSize() + GImGui->Style.FramePadding.y * 2.0f; }
1119 ImRect TitleBarRect() const { return ImRect(Pos, ImVec2(Pos.x + SizeFull.x, Pos.y + TitleBarHeight())); }
1120 float MenuBarHeight() const { return (Flags & ImGuiWindowFlags_MenuBar) ? DC.MenuBarOffset.y + CalcFontSize() + GImGui->Style.FramePadding.y * 2.0f : 0.0f; }
1121 ImRect MenuBarRect() const { float y1 = Pos.y + TitleBarHeight(); return ImRect(Pos.x, y1, Pos.x + SizeFull.x, y1 + MenuBarHeight()); }
1122};
1123
1124// Backup and restore just enough data to be able to use IsItemHovered() on item A after another B in the same window has overwritten the data.
1125struct ImGuiItemHoveredDataBackup
1126{
1127 ImGuiID LastItemId;
1128 ImGuiItemStatusFlags LastItemStatusFlags;
1129 ImRect LastItemRect;
1130 ImRect LastItemDisplayRect;
1131
1132 ImGuiItemHoveredDataBackup() { Backup(); }
1133 void Backup() { ImGuiWindow* window = GImGui->CurrentWindow; LastItemId = window->DC.LastItemId; LastItemStatusFlags = window->DC.LastItemStatusFlags; LastItemRect = window->DC.LastItemRect; LastItemDisplayRect = window->DC.LastItemDisplayRect; }
1134 void Restore() const { ImGuiWindow* window = GImGui->CurrentWindow; window->DC.LastItemId = LastItemId; window->DC.LastItemStatusFlags = LastItemStatusFlags; window->DC.LastItemRect = LastItemRect; window->DC.LastItemDisplayRect = LastItemDisplayRect; }
1135};
1136
1137//-----------------------------------------------------------------------------
1138// Internal API
1139// No guarantee of forward compatibility here.
1140//-----------------------------------------------------------------------------
1141
1142namespace ImGui
1143{
1144 // We should always have a CurrentWindow in the stack (there is an implicit "Debug" window)
1145 // If this ever crash because g.CurrentWindow is NULL it means that either
1146 // - ImGui::NewFrame() has never been called, which is illegal.
1147 // - You are calling ImGui functions after ImGui::EndFrame()/ImGui::Render() and before the next ImGui::NewFrame(), which is also illegal.
1148 inline ImGuiWindow* GetCurrentWindowRead() { ImGuiContext& g = *GImGui; return g.CurrentWindow; }
1149 inline ImGuiWindow* GetCurrentWindow() { ImGuiContext& g = *GImGui; g.CurrentWindow->WriteAccessed = true; return g.CurrentWindow; }
1150 IMGUI_API ImGuiWindow* FindWindowByID(ImGuiID id);
1151 IMGUI_API ImGuiWindow* FindWindowByName(const char* name);
1152 IMGUI_API void FocusWindow(ImGuiWindow* window);
1153 IMGUI_API void FocusPreviousWindowIgnoringOne(ImGuiWindow* ignore_window);
1154 IMGUI_API void BringWindowToFocusFront(ImGuiWindow* window);
1155 IMGUI_API void BringWindowToDisplayFront(ImGuiWindow* window);
1156 IMGUI_API void BringWindowToDisplayBack(ImGuiWindow* window);
1157 IMGUI_API void UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags flags, ImGuiWindow* parent_window);
1158 IMGUI_API ImVec2 CalcWindowExpectedSize(ImGuiWindow* window);
1159 IMGUI_API bool IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent);
1160 IMGUI_API bool IsWindowNavFocusable(ImGuiWindow* window);
1161 IMGUI_API void SetWindowScrollX(ImGuiWindow* window, float new_scroll_x);
1162 IMGUI_API void SetWindowScrollY(ImGuiWindow* window, float new_scroll_y);
1163 IMGUI_API float GetWindowScrollMaxX(ImGuiWindow* window);
1164 IMGUI_API float GetWindowScrollMaxY(ImGuiWindow* window);
1165 IMGUI_API ImRect GetWindowAllowedExtentRect(ImGuiWindow* window);
1166 IMGUI_API void SetCurrentFont(ImFont* font);
1167 inline ImFont* GetDefaultFont() { ImGuiContext& g = *GImGui; return g.IO.FontDefault ? g.IO.FontDefault : g.IO.Fonts->Fonts[0]; }
1168
1169 // Init
1170 IMGUI_API void Initialize(ImGuiContext* context);
1171 IMGUI_API void Shutdown(ImGuiContext* context); // Since 1.60 this is a _private_ function. You can call DestroyContext() to destroy the context created by CreateContext().
1172
1173 // NewFrame
1174 IMGUI_API void UpdateHoveredWindowAndCaptureFlags();
1175 IMGUI_API void StartMouseMovingWindow(ImGuiWindow* window);
1176 IMGUI_API void UpdateMouseMovingWindow();
1177
1178 // Settings
1179 IMGUI_API void MarkIniSettingsDirty();
1180 IMGUI_API void MarkIniSettingsDirty(ImGuiWindow* window);
1181 IMGUI_API ImGuiWindowSettings* CreateNewWindowSettings(const char* name);
1182 IMGUI_API ImGuiWindowSettings* FindWindowSettings(ImGuiID id);
1183 IMGUI_API ImGuiSettingsHandler* FindSettingsHandler(const char* type_name);
1184
1185 // Basic Accessors
1186 inline ImGuiID GetItemID() { ImGuiContext& g = *GImGui; return g.CurrentWindow->DC.LastItemId; }
1187 inline ImGuiID GetActiveID() { ImGuiContext& g = *GImGui; return g.ActiveId; }
1188 inline ImGuiID GetFocusID() { ImGuiContext& g = *GImGui; return g.NavId; }
1189 IMGUI_API void SetActiveID(ImGuiID id, ImGuiWindow* window);
1190 IMGUI_API void SetFocusID(ImGuiID id, ImGuiWindow* window);
1191 IMGUI_API void ClearActiveID();
1192 IMGUI_API ImGuiID GetHoveredID();
1193 IMGUI_API void SetHoveredID(ImGuiID id);
1194 IMGUI_API void KeepAliveID(ImGuiID id);
1195 IMGUI_API void MarkItemEdited(ImGuiID id);
1196
1197 // Basic Helpers for widget code
1198 IMGUI_API void ItemSize(const ImVec2& size, float text_offset_y = 0.0f);
1199 IMGUI_API void ItemSize(const ImRect& bb, float text_offset_y = 0.0f);
1200 IMGUI_API bool ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb = NULL);
1201 IMGUI_API bool ItemHoverable(const ImRect& bb, ImGuiID id);
1202 IMGUI_API bool IsClippedEx(const ImRect& bb, ImGuiID id, bool clip_even_when_logged);
1203 IMGUI_API bool FocusableItemRegister(ImGuiWindow* window, ImGuiID id, bool tab_stop = true); // Return true if focus is requested
1204 IMGUI_API void FocusableItemUnregister(ImGuiWindow* window);
1205 IMGUI_API ImVec2 CalcItemSize(ImVec2 size, float default_x, float default_y);
1206 IMGUI_API float CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x);
1207 IMGUI_API void PushMultiItemsWidths(int components, float width_full = 0.0f);
1208 IMGUI_API void PushItemFlag(ImGuiItemFlags option, bool enabled);
1209 IMGUI_API void PopItemFlag();
1210
1211 // Popups, Modals, Tooltips
1212 IMGUI_API void OpenPopupEx(ImGuiID id);
1213 IMGUI_API void ClosePopup(ImGuiID id);
1214 IMGUI_API void ClosePopupToLevel(int remaining);
1215 IMGUI_API void ClosePopupsOverWindow(ImGuiWindow* ref_window);
1216 IMGUI_API bool IsPopupOpen(ImGuiID id);
1217 IMGUI_API bool BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_flags);
1218 IMGUI_API void BeginTooltipEx(ImGuiWindowFlags extra_flags, bool override_previous_tooltip = true);
1219 IMGUI_API ImGuiWindow* GetFrontMostPopupModal();
1220 IMGUI_API ImVec2 FindBestWindowPosForPopup(ImGuiWindow* window);
1221 IMGUI_API ImVec2 FindBestWindowPosForPopupEx(const ImVec2& ref_pos, const ImVec2& size, ImGuiDir* last_dir, const ImRect& r_outer, const ImRect& r_avoid, ImGuiPopupPositionPolicy policy = ImGuiPopupPositionPolicy_Default);
1222
1223 // Navigation
1224 IMGUI_API void NavInitWindow(ImGuiWindow* window, bool force_reinit);
1225 IMGUI_API bool NavMoveRequestButNoResultYet();
1226 IMGUI_API void NavMoveRequestCancel();
1227 IMGUI_API void NavMoveRequestForward(ImGuiDir move_dir, ImGuiDir clip_dir, const ImRect& bb_rel, ImGuiNavMoveFlags move_flags);
1228 IMGUI_API void NavMoveRequestTryWrapping(ImGuiWindow* window, ImGuiNavMoveFlags move_flags);
1229 IMGUI_API float GetNavInputAmount(ImGuiNavInput n, ImGuiInputReadMode mode);
1230 IMGUI_API ImVec2 GetNavInputAmount2d(ImGuiNavDirSourceFlags dir_sources, ImGuiInputReadMode mode, float slow_factor = 0.0f, float fast_factor = 0.0f);
1231 IMGUI_API int CalcTypematicPressedRepeatAmount(float t, float t_prev, float repeat_delay, float repeat_rate);
1232 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.
1233 IMGUI_API void SetNavID(ImGuiID id, int nav_layer);
1234 IMGUI_API void SetNavIDWithRectRel(ImGuiID id, int nav_layer, const ImRect& rect_rel);
1235
1236 // Inputs
1237 inline bool IsKeyPressedMap(ImGuiKey key, bool repeat = true) { const int key_index = GImGui->IO.KeyMap[key]; return (key_index >= 0) ? IsKeyPressed(user_key_index: key_index, repeat) : false; }
1238 inline bool IsNavInputDown(ImGuiNavInput n) { return GImGui->IO.NavInputs[n] > 0.0f; }
1239 inline bool IsNavInputPressed(ImGuiNavInput n, ImGuiInputReadMode mode) { return GetNavInputAmount(n, mode) > 0.0f; }
1240 inline bool IsNavInputPressedAnyOfTwo(ImGuiNavInput n1, ImGuiNavInput n2, ImGuiInputReadMode mode) { return (GetNavInputAmount(n: n1, mode) + GetNavInputAmount(n: n2, mode)) > 0.0f; }
1241
1242 // Drag and Drop
1243 IMGUI_API bool BeginDragDropTargetCustom(const ImRect& bb, ImGuiID id);
1244 IMGUI_API void ClearDragDrop();
1245 IMGUI_API bool IsDragDropPayloadBeingAccepted();
1246
1247 // New Columns API (FIXME-WIP)
1248 IMGUI_API void BeginColumns(const char* str_id, int count, ImGuiColumnsFlags flags = 0); // setup number of columns. use an identifier to distinguish multiple column sets. close with EndColumns().
1249 IMGUI_API void EndColumns(); // close columns
1250 IMGUI_API void PushColumnClipRect(int column_index = -1);
1251
1252 // Render helpers
1253 // 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.
1254 // NB: All position are in absolute pixels coordinates (we are never using window coordinates internally)
1255 IMGUI_API void RenderText(ImVec2 pos, const char* text, const char* text_end = NULL, bool hide_text_after_hash = true);
1256 IMGUI_API void RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end, float wrap_width);
1257 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);
1258 IMGUI_API void RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border = true, float rounding = 0.0f);
1259 IMGUI_API void RenderFrameBorder(ImVec2 p_min, ImVec2 p_max, float rounding = 0.0f);
1260 IMGUI_API void RenderColorRectWithAlphaCheckerboard(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, float grid_step, ImVec2 grid_off, float rounding = 0.0f, int rounding_corners_flags = ~0);
1261 IMGUI_API void RenderArrow(ImVec2 pos, ImGuiDir dir, float scale = 1.0f);
1262 IMGUI_API void RenderBullet(ImVec2 pos);
1263 IMGUI_API void RenderCheckMark(ImVec2 pos, ImU32 col, float sz);
1264 IMGUI_API void RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFlags flags = ImGuiNavHighlightFlags_TypeDefault); // Navigation highlight
1265 IMGUI_API const char* FindRenderedTextEnd(const char* text, const char* text_end = NULL); // Find the optional ## from which we stop displaying text.
1266 IMGUI_API void LogRenderedText(const ImVec2* ref_pos, const char* text, const char* text_end = NULL);
1267
1268 // Render helpers (those functions don't access any ImGui state!)
1269 IMGUI_API void RenderMouseCursor(ImDrawList* draw_list, ImVec2 pos, float scale, ImGuiMouseCursor mouse_cursor = ImGuiMouseCursor_Arrow);
1270 IMGUI_API void RenderArrowPointingAt(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, ImGuiDir direction, ImU32 col);
1271 IMGUI_API void RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, ImU32 col, float x_start_norm, float x_end_norm, float rounding);
1272
1273 // Widgets
1274 IMGUI_API bool ButtonEx(const char* label, const ImVec2& size_arg = ImVec2(0,0), ImGuiButtonFlags flags = 0);
1275 IMGUI_API bool CloseButton(ImGuiID id, const ImVec2& pos, float radius);
1276 IMGUI_API bool CollapseButton(ImGuiID id, const ImVec2& pos);
1277 IMGUI_API bool ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size_arg, ImGuiButtonFlags flags);
1278 IMGUI_API void Scrollbar(ImGuiLayoutType direction);
1279 IMGUI_API void VerticalSeparator(); // Vertical separator, for menu bars (use current line height). Not exposed because it is misleading and it doesn't have an effect on regular layout.
1280
1281 // Widgets low-level behaviors
1282 IMGUI_API bool ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags = 0);
1283 IMGUI_API bool DragBehavior(ImGuiID id, ImGuiDataType data_type, void* v, float v_speed, const void* v_min, const void* v_max, const char* format, float power, ImGuiDragFlags flags);
1284 IMGUI_API bool SliderBehavior(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, void* v, const void* v_min, const void* v_max, const char* format, float power, ImGuiSliderFlags flags, ImRect* out_grab_bb);
1285 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);
1286 IMGUI_API bool TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* label, const char* label_end = NULL);
1287 IMGUI_API bool TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags = 0); // Consume previous SetNextTreeNodeOpened() data, if any. May return true when logging
1288 IMGUI_API void TreePushRawID(ImGuiID id);
1289
1290 // Template functions are instantiated in imgui_widgets.cpp for a finite number of types.
1291 // 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).
1292 // e.g. " extern template IMGUI_API float RoundScalarWithFormatT<float, float>(const char* format, ImGuiDataType data_type, float v); "
1293 template<typename T, typename SIGNED_T, typename FLOAT_T> IMGUI_API bool DragBehaviorT(ImGuiDataType data_type, T* v, float v_speed, const T v_min, const T v_max, const char* format, float power, ImGuiDragFlags flags);
1294 template<typename T, typename SIGNED_T, typename FLOAT_T> IMGUI_API bool SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, T* v, const T v_min, const T v_max, const char* format, float power, ImGuiSliderFlags flags, ImRect* out_grab_bb);
1295 template<typename T, typename FLOAT_T> IMGUI_API float SliderCalcRatioFromValueT(ImGuiDataType data_type, T v, T v_min, T v_max, float power, float linear_zero_pos);
1296 template<typename T, typename SIGNED_T> IMGUI_API T RoundScalarWithFormatT(const char* format, ImGuiDataType data_type, T v);
1297
1298 // InputText
1299 IMGUI_API bool InputTextEx(const char* label, char* buf, int buf_size, const ImVec2& size_arg, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback = NULL, void* user_data = NULL);
1300 IMGUI_API bool InputScalarAsWidgetReplacement(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* data_ptr, const char* format);
1301
1302 // Color
1303 IMGUI_API void ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags flags);
1304 IMGUI_API void ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags);
1305 IMGUI_API void ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags flags);
1306
1307 // Plot
1308 IMGUI_API void 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, ImVec2 graph_size);
1309
1310 // Shade functions (write over already created vertices)
1311 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);
1312 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);
1313
1314} // namespace ImGui
1315
1316// ImFontAtlas internals
1317IMGUI_API bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas);
1318IMGUI_API void ImFontAtlasBuildRegisterDefaultCustomRects(ImFontAtlas* atlas);
1319IMGUI_API void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* font_config, float ascent, float descent);
1320IMGUI_API void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* spc);
1321IMGUI_API void ImFontAtlasBuildFinish(ImFontAtlas* atlas);
1322IMGUI_API void ImFontAtlasBuildMultiplyCalcLookupTable(unsigned char out_table[256], float in_multiply_factor);
1323IMGUI_API void ImFontAtlasBuildMultiplyRectAlpha8(const unsigned char table[256], unsigned char* pixels, int x, int y, int w, int h, int stride);
1324
1325#ifdef __clang__
1326#pragma clang diagnostic pop
1327#endif
1328
1329#ifdef _MSC_VER
1330#pragma warning (pop)
1331#endif
1332

source code of qt3d/src/3rdparty/imgui/imgui_internal.h