~mmach/netext73/mesa-haswell

« back to all changes in this revision

Viewing changes to src/imgui/imgui_internal.h

  • Committer: mmach
  • Date: 2022-09-22 19:56:13 UTC
  • Revision ID: netbit73@gmail.com-20220922195613-wtik9mmy20tmor0i
2022-09-22 21:17:09

Show diffs side-by-side

added added

removed removed

Lines of Context:
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);
155
 
static inline bool      ImCharIsBlankA(char c)          { return c == ' ' || c == '\t'; }
156
 
static inline bool      ImCharIsBlankW(unsigned int c)  { return c == ' ' || c == '\t' || c == 0x3000; }
157
 
static inline bool      ImIsPowerOfTwo(int v)           { return v != 0 && (v & (v - 1)) == 0; }
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
212
 
static inline float  ImFabs(float x)                                            { return fabsf(x); }
213
 
static inline float  ImSqrt(float x)                                            { return sqrtf(x); }
214
 
static inline float  ImPow(float x, float y)                                    { return powf(x, y); }
215
 
static inline double ImPow(double x, double y)                                  { return pow(x, y); }
216
 
static inline float  ImFmod(float x, float y)                                   { return fmodf(x, y); }
217
 
static inline double ImFmod(double x, double y)                                 { return fmod(x, y); }
218
 
static inline float  ImCos(float x)                                             { return cosf(x); }
219
 
static inline float  ImSin(float x)                                             { return sinf(x); }
220
 
static inline float  ImAcos(float x)                                            { return acosf(x); }
221
 
static inline float  ImAtan2(float y, float x)                                  { return atan2f(y, x); }
222
 
static inline double ImAtof(const char* s)                                      { return atof(s); }
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)
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
227
 
template<typename T> static inline T ImMin(T lhs, T rhs)                        { return lhs < rhs ? lhs : rhs; }
228
 
template<typename T> static inline T ImMax(T lhs, T rhs)                        { return lhs >= rhs ? lhs : rhs; }
229
 
template<typename T> static inline T ImClamp(T v, T mn, T mx)                   { return (v < mn) ? mn : (v > mx) ? mx : v; }
230
 
template<typename T> static inline T ImLerp(T a, T b, float t)                  { return (T)(a + (b - a) * t); }
231
 
template<typename T> static inline void ImSwap(T& a, T& b)                      { T tmp = a; a = b; b = tmp; }
232
 
// - Misc maths helpers
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); }
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); }
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); }
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); }
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); }
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); }
239
 
static inline float  ImSaturate(float f)                                        { return (f < 0.0f) ? 0.0f : (f > 1.0f) ? 1.0f : f; }
240
 
static inline float  ImLengthSqr(const ImVec2& lhs)                             { return lhs.x*lhs.x + lhs.y*lhs.y; }
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; }
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; }
243
 
static inline float  ImFloor(float f)                                           { return (float)(int)f; }
244
 
static inline ImVec2 ImFloor(const ImVec2& v)                                   { return ImVec2((float)(int)v.x, (float)(int)v.y); }
245
 
static inline float  ImDot(const ImVec2& a, const ImVec2& b)                    { return a.x * b.x + a.y * b.y; }
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); }
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; }
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;
255
 
    ImBoolVector()  { }
256
 
    void            Resize(int sz)          { Storage.resize((sz + 31) >> 5); memset(Storage.Data, 0, (size_t)Storage.Size * sizeof(Storage.Data[0])); }
257
 
    void            Clear()                 { Storage.clear(); }
258
 
    bool            GetBit(int n) const     { int off = (n >> 5); int mask = 1 << (n & 31); return (Storage[off] & mask) != 0; }
259
 
    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
 
 
272
 
    ImPool()    { FreeIdx = 0; }
273
 
    ~ImPool()   { Clear(); }
274
 
    T*          GetByKey(ImGuiID key)               { int idx = Map.GetInt(key, -1); return (idx != -1) ? &Data[idx] : NULL; }
275
 
    T*          GetByIndex(ImPoolIdx n)             { return &Data[n]; }
276
 
    ImPoolIdx   GetIndex(const T* p) const          { IM_ASSERT(p >= Data.Data && p < Data.Data + Data.Size); return (ImPoolIdx)(p - Data.Data); }
277
 
    T*          GetOrAddByKey(ImGuiID key)          { int* p_idx = Map.GetIntRef(key, -1); if (*p_idx != -1) return &Data[*p_idx]; *p_idx = FreeIdx; return Add(); }
278
 
    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; }
279
 
    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]; }
280
 
    void        Remove(ImGuiID key, const T* p)     { Remove(key, GetIndex(p)); }
281
 
    void        Remove(ImGuiID key, ImPoolIdx idx)  { Data[idx].~T(); *(int*)&Data[idx] = FreeIdx; FreeIdx = idx; Map.SetInt(key, -1); }
282
 
    void        Reserve(int capacity)               { Data.reserve(capacity); Map.Data.reserve(capacity); }
283
 
    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;
473
 
    ImVec1()         { x = 0.0f; }
474
 
    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
 
 
485
 
    ImRect()                                        : Min(FLT_MAX,FLT_MAX), Max(-FLT_MAX,-FLT_MAX)  {}
486
 
    ImRect(const ImVec2& min, const ImVec2& max)    : Min(min), Max(max)                            {}
487
 
    ImRect(const ImVec4& v)                         : Min(v.x, v.y), Max(v.z, v.w)                  {}
488
 
    ImRect(float x1, float y1, float x2, float y2)  : Min(x1, y1), Max(x2, y2)                      {}
489
 
 
490
 
    ImVec2      GetCenter() const                   { return ImVec2((Min.x + Max.x) * 0.5f, (Min.y + Max.y) * 0.5f); }
491
 
    ImVec2      GetSize() const                     { return ImVec2(Max.x - Min.x, Max.y - Min.y); }
492
 
    float       GetWidth() const                    { return Max.x - Min.x; }
493
 
    float       GetHeight() const                   { return Max.y - Min.y; }
494
 
    ImVec2      GetTL() const                       { return Min; }                   // Top-left
495
 
    ImVec2      GetTR() const                       { return ImVec2(Max.x, Min.y); }  // Top-right
496
 
    ImVec2      GetBL() const                       { return ImVec2(Min.x, Max.y); }  // Bottom-left
497
 
    ImVec2      GetBR() const                       { return Max; }                   // Bottom-right
498
 
    bool        Contains(const ImVec2& p) const     { return p.x     >= Min.x && p.y     >= Min.y && p.x     <  Max.x && p.y     <  Max.y; }
499
 
    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; }
500
 
    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; }
501
 
    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; }
502
 
    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; }
503
 
    void        Expand(const float amount)          { Min.x -= amount;   Min.y -= amount;   Max.x += amount;   Max.y += amount; }
504
 
    void        Expand(const ImVec2& amount)        { Min.x -= amount.x; Min.y -= amount.y; Max.x += amount.x; Max.y += amount.y; }
505
 
    void        Translate(const ImVec2& d)          { Min.x += d.x; Min.y += d.y; Max.x += d.x; Max.y += d.y; }
506
 
    void        TranslateX(float dx)                { Min.x += dx; Max.x += dx; }
507
 
    void        TranslateY(float dy)                { Min.y += dy; Max.y += dy; }
508
 
    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.
509
 
    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.
510
 
    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; }
511
 
    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]; };
526
 
    ImGuiStyleMod(ImGuiStyleVar idx, int v)     { VarIdx = idx; BackupInt[0] = v; }
527
 
    ImGuiStyleMod(ImGuiStyleVar idx, float v)   { VarIdx = idx; BackupFloat[0] = v; }
528
 
    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
 
 
580
 
    ImGuiInputTextState()                           { memset(this, 0, sizeof(*this)); }
581
 
    void                CursorAnimReset()           { CursorAnim = -0.30f; }                                   // After a user-input the cursor stays on for a while without blinking
582
 
    void                CursorClamp()               { StbState.cursor = ImMin(StbState.cursor, CurLenW); StbState.select_start = ImMin(StbState.select_start, CurLenW); StbState.select_end = ImMin(StbState.select_end, CurLenW); }
583
 
    bool                HasSelection() const        { return StbState.select_start != StbState.select_end; }
584
 
    void                ClearSelection()            { StbState.select_start = StbState.select_end = StbState.cursor; }
585
 
    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
 
 
598
 
    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
 
 
610
 
    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
 
 
632
 
    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
 
 
649
 
    ImGuiColumnsSet()   { Clear(); }
650
 
    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
 
 
686
 
    void Clear()            { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].resize(0); }
687
 
    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
 
 
701
 
    ImGuiNavMoveResult() { Clear(); }
702
 
    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
 
 
726
 
    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
 
 
739
 
    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
 
 
933
 
    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
 
 
1095
 
    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.
1221
 
    ImRect      Rect() const                            { return ImRect(Pos.x, Pos.y, Pos.x+Size.x, Pos.y+Size.y); }
1222
 
    float       CalcFontSize() const                    { return GImGui->FontBaseSize * FontWindowScale; }
1223
 
    float       TitleBarHeight() const                  { return (Flags & ImGuiWindowFlags_NoTitleBar) ? 0.0f : CalcFontSize() + GImGui->Style.FramePadding.y * 2.0f; }
1224
 
    ImRect      TitleBarRect() const                    { return ImRect(Pos, ImVec2(Pos.x + SizeFull.x, Pos.y + TitleBarHeight())); }
1225
 
    float       MenuBarHeight() const                   { return (Flags & ImGuiWindowFlags_MenuBar) ? DC.MenuBarOffset.y + CalcFontSize() + GImGui->Style.FramePadding.y * 2.0f : 0.0f; }
1226
 
    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
 
 
1237
 
    ImGuiItemHoveredDataBackup() { Backup(); }
1238
 
    void Backup()           { ImGuiWindow* window = GImGui->CurrentWindow; LastItemId = window->DC.LastItemId; LastItemStatusFlags = window->DC.LastItemStatusFlags; LastItemRect = window->DC.LastItemRect; LastItemDisplayRect = window->DC.LastItemDisplayRect; }
1239
 
    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
 
 
1270
 
    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();
1299
 
    int                 GetTabOrder(const ImGuiTabItem* tab) const  { return Tabs.index_from_ptr(tab); }
1300
 
    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.
1318
 
    inline    ImGuiWindow*  GetCurrentWindowRead()      { ImGuiContext& g = *GImGui; return g.CurrentWindow; }
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);
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
1362
 
    inline ImGuiID          GetItemID()     { ImGuiContext& g = *GImGui; return g.CurrentWindow->DC.LastItemId; }
1363
 
    inline ImGuiID          GetActiveID()   { ImGuiContext& g = *GImGui; return g.ActiveId; }
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; }
1413
 
    inline bool             IsNavInputDown(ImGuiNavInput n)                             { return GImGui->IO.NavInputs[n] > 0.0f; }
1414
 
    inline bool             IsNavInputPressed(ImGuiNavInput n, ImGuiInputReadMode mode) { return GetNavInputAmount(n, mode) > 0.0f; }
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