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