imgui_internal.h (192731B)
1 // dear imgui, v1.83 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 13 // [SECTION] Header mess 14 // [SECTION] Forward declarations 15 // [SECTION] Context pointer 16 // [SECTION] STB libraries includes 17 // [SECTION] Macros 18 // [SECTION] Generic helpers 19 // [SECTION] ImDrawList support 20 // [SECTION] Widgets support: flags, enums, data structures 21 // [SECTION] Columns support 22 // [SECTION] Multi-select support 23 // [SECTION] Docking support 24 // [SECTION] Viewport support 25 // [SECTION] Settings support 26 // [SECTION] Metrics, Debug 27 // [SECTION] Generic context hooks 28 // [SECTION] ImGuiContext (main imgui context) 29 // [SECTION] ImGuiWindowTempData, ImGuiWindow 30 // [SECTION] Tab bar, Tab item support 31 // [SECTION] Table support 32 // [SECTION] ImGui internal API 33 // [SECTION] ImFontAtlas internal API 34 // [SECTION] Test Engine specific hooks (imgui_test_engine) 35 36 */ 37 38 #pragma once 39 #ifndef IMGUI_DISABLE 40 41 //----------------------------------------------------------------------------- 42 // [SECTION] Header mess 43 //----------------------------------------------------------------------------- 44 45 #ifndef IMGUI_VERSION 46 #error Must include imgui.h before imgui_internal.h 47 #endif 48 49 #include <stdio.h> // FILE*, sscanf 50 #include <stdlib.h> // NULL, malloc, free, qsort, atoi, atof 51 #include <math.h> // sqrtf, fabsf, fmodf, powf, floorf, ceilf, cosf, sinf 52 #include <limits.h> // INT_MIN, INT_MAX 53 54 // Enable SSE intrinsics if available 55 #if defined __SSE__ || defined __x86_64__ || defined _M_X64 56 #define IMGUI_ENABLE_SSE 57 #include <immintrin.h> 58 #endif 59 60 // Visual Studio warnings 61 #ifdef _MSC_VER 62 #pragma warning (push) 63 #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) 64 #pragma warning (disable: 26812) // The enum type 'xxx' is unscoped. Prefer 'enum class' over 'enum' (Enum.3). [MSVC Static Analyzer) 65 #pragma warning (disable: 26495) // [Static Analyzer] Variable 'XXX' is uninitialized. Always initialize a member variable (type.6). 66 67 #endif 68 69 // Clang/GCC warnings with -Weverything 70 #if defined(__clang__) 71 #pragma clang diagnostic push 72 #if __has_warning("-Wunknown-warning-option") 73 #pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx' 74 #endif 75 #pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx' 76 #pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants ok, for ImFloorSigned() 77 #pragma clang diagnostic ignored "-Wunused-function" // for stb_textedit.h 78 #pragma clang diagnostic ignored "-Wmissing-prototypes" // for stb_textedit.h 79 #pragma clang diagnostic ignored "-Wold-style-cast" 80 #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" 81 #pragma clang diagnostic ignored "-Wdouble-promotion" 82 #pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision 83 #elif defined(__GNUC__) 84 #pragma GCC diagnostic push 85 #pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind 86 #pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead 87 #endif 88 89 // Legacy defines 90 #ifdef IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS // Renamed in 1.74 91 #error Use IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS 92 #endif 93 #ifdef IMGUI_DISABLE_MATH_FUNCTIONS // Renamed in 1.74 94 #error Use IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS 95 #endif 96 97 // Enable stb_truetype by default unless FreeType is enabled. 98 // You can compile with both by defining both IMGUI_ENABLE_FREETYPE and IMGUI_ENABLE_STB_TRUETYPE together. 99 #ifndef IMGUI_ENABLE_FREETYPE 100 #define IMGUI_ENABLE_STB_TRUETYPE 101 #endif 102 103 //----------------------------------------------------------------------------- 104 // [SECTION] Forward declarations 105 //----------------------------------------------------------------------------- 106 107 struct ImBitVector; // Store 1-bit per value 108 struct ImRect; // An axis-aligned rectangle (2 points) 109 struct ImDrawDataBuilder; // Helper to build a ImDrawData instance 110 struct ImDrawListSharedData; // Data shared between all ImDrawList instances 111 struct ImGuiColorMod; // Stacked color modifier, backup of modified data so we can restore it 112 struct ImGuiContext; // Main Dear ImGui context 113 struct ImGuiContextHook; // Hook for extensions like ImGuiTestEngine 114 struct ImGuiDataTypeInfo; // Type information associated to a ImGuiDataType enum 115 struct ImGuiGroupData; // Stacked storage data for BeginGroup()/EndGroup() 116 struct ImGuiInputTextState; // Internal state of the currently focused/edited text input box 117 struct ImGuiLastItemDataBackup; // Backup and restore IsItemHovered() internal data 118 struct ImGuiMenuColumns; // Simple column measurement, currently used for MenuItem() only 119 struct ImGuiNavItemData; // Result of a gamepad/keyboard directional navigation move query result 120 struct ImGuiMetricsConfig; // Storage for ShowMetricsWindow() and DebugNodeXXX() functions 121 struct ImGuiNextWindowData; // Storage for SetNextWindow** functions 122 struct ImGuiNextItemData; // Storage for SetNextItem** functions 123 struct ImGuiOldColumnData; // Storage data for a single column for legacy Columns() api 124 struct ImGuiOldColumns; // Storage data for a columns set for legacy Columns() api 125 struct ImGuiPopupData; // Storage for current popup stack 126 struct ImGuiSettingsHandler; // Storage for one type registered in the .ini file 127 struct ImGuiStackSizes; // Storage of stack sizes for debugging/asserting 128 struct ImGuiStyleMod; // Stacked style modifier, backup of modified data so we can restore it 129 struct ImGuiTabBar; // Storage for a tab bar 130 struct ImGuiTabItem; // Storage for a tab item (within a tab bar) 131 struct ImGuiTable; // Storage for a table 132 struct ImGuiTableColumn; // Storage for one column of a table 133 struct ImGuiTableTempData; // Temporary storage for one table (one per table in the stack), shared between tables. 134 struct ImGuiTableSettings; // Storage for a table .ini settings 135 struct ImGuiTableColumnsSettings; // Storage for a column .ini settings 136 struct ImGuiWindow; // Storage for one window 137 struct ImGuiWindowTempData; // Temporary storage for one window (that's the data which in theory we could ditch at the end of the frame, in practice we currently keep it for each window) 138 struct ImGuiWindowSettings; // Storage for a window .ini settings (we keep one of those even if the actual window wasn't instanced during this session) 139 140 // Use your programming IDE "Go to definition" facility on the names of the center columns to find the actual flags/enum lists. 141 typedef int ImGuiLayoutType; // -> enum ImGuiLayoutType_ // Enum: Horizontal or vertical 142 typedef int ImGuiItemFlags; // -> enum ImGuiItemFlags_ // Flags: for PushItemFlag() 143 typedef int ImGuiItemAddFlags; // -> enum ImGuiItemAddFlags_ // Flags: for ItemAdd() 144 typedef int ImGuiItemStatusFlags; // -> enum ImGuiItemStatusFlags_ // Flags: for DC.LastItemStatusFlags 145 typedef int ImGuiOldColumnFlags; // -> enum ImGuiOldColumnFlags_ // Flags: for BeginColumns() 146 typedef int ImGuiNavHighlightFlags; // -> enum ImGuiNavHighlightFlags_ // Flags: for RenderNavHighlight() 147 typedef int ImGuiNavDirSourceFlags; // -> enum ImGuiNavDirSourceFlags_ // Flags: for GetNavInputAmount2d() 148 typedef int ImGuiNavMoveFlags; // -> enum ImGuiNavMoveFlags_ // Flags: for navigation requests 149 typedef int ImGuiNextItemDataFlags; // -> enum ImGuiNextItemDataFlags_ // Flags: for SetNextItemXXX() functions 150 typedef int ImGuiNextWindowDataFlags; // -> enum ImGuiNextWindowDataFlags_// Flags: for SetNextWindowXXX() functions 151 typedef int ImGuiSeparatorFlags; // -> enum ImGuiSeparatorFlags_ // Flags: for SeparatorEx() 152 typedef int ImGuiTextFlags; // -> enum ImGuiTextFlags_ // Flags: for TextEx() 153 typedef int ImGuiTooltipFlags; // -> enum ImGuiTooltipFlags_ // Flags: for BeginTooltipEx() 154 155 typedef void (*ImGuiErrorLogCallback)(void* user_data, const char* fmt, ...); 156 157 //----------------------------------------------------------------------------- 158 // [SECTION] Context pointer 159 // See implementation of this variable in imgui.cpp for comments and details. 160 //----------------------------------------------------------------------------- 161 162 #ifndef GImGui 163 extern IMGUI_API ImGuiContext* GImGui; // Current implicit context pointer 164 #endif 165 166 //------------------------------------------------------------------------- 167 // [SECTION] STB libraries includes 168 //------------------------------------------------------------------------- 169 170 namespace ImStb 171 { 172 173 #undef STB_TEXTEDIT_STRING 174 #undef STB_TEXTEDIT_CHARTYPE 175 #define STB_TEXTEDIT_STRING ImGuiInputTextState 176 #define STB_TEXTEDIT_CHARTYPE ImWchar 177 #define STB_TEXTEDIT_GETWIDTH_NEWLINE (-1.0f) 178 #define STB_TEXTEDIT_UNDOSTATECOUNT 99 179 #define STB_TEXTEDIT_UNDOCHARCOUNT 999 180 #include "imstb_textedit.h" 181 182 } // namespace ImStb 183 184 //----------------------------------------------------------------------------- 185 // [SECTION] Macros 186 //----------------------------------------------------------------------------- 187 188 // Debug Logging 189 #ifndef IMGUI_DEBUG_LOG 190 #define IMGUI_DEBUG_LOG(_FMT,...) printf("[%05d] " _FMT, GImGui->FrameCount, __VA_ARGS__) 191 #endif 192 193 // Debug Logging for selected systems. Remove the '((void)0) //' to enable. 194 //#define IMGUI_DEBUG_LOG_POPUP IMGUI_DEBUG_LOG // Enable log 195 //#define IMGUI_DEBUG_LOG_NAV IMGUI_DEBUG_LOG // Enable log 196 #define IMGUI_DEBUG_LOG_POPUP(...) ((void)0) // Disable log 197 #define IMGUI_DEBUG_LOG_NAV(...) ((void)0) // Disable log 198 199 // Static Asserts 200 #if (__cplusplus >= 201100) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201100) 201 #define IM_STATIC_ASSERT(_COND) static_assert(_COND, "") 202 #else 203 #define IM_STATIC_ASSERT(_COND) typedef char static_assertion_##__line__[(_COND)?1:-1] 204 #endif 205 206 // "Paranoid" Debug Asserts are meant to only be enabled during specific debugging/work, otherwise would slow down the code too much. 207 // We currently don't have many of those so the effect is currently negligible, but onward intent to add more aggressive ones in the code. 208 //#define IMGUI_DEBUG_PARANOID 209 #ifdef IMGUI_DEBUG_PARANOID 210 #define IM_ASSERT_PARANOID(_EXPR) IM_ASSERT(_EXPR) 211 #else 212 #define IM_ASSERT_PARANOID(_EXPR) 213 #endif 214 215 // Error handling 216 // Down the line in some frameworks/languages we would like to have a way to redirect those to the programmer and recover from more faults. 217 #ifndef IM_ASSERT_USER_ERROR 218 #define IM_ASSERT_USER_ERROR(_EXP,_MSG) IM_ASSERT((_EXP) && _MSG) // Recoverable User Error 219 #endif 220 221 // Misc Macros 222 #define IM_PI 3.14159265358979323846f 223 #ifdef _WIN32 224 #define IM_NEWLINE "\r\n" // Play it nice with Windows users (Update: since 2018-05, Notepad finally appears to support Unix-style carriage returns!) 225 #else 226 #define IM_NEWLINE "\n" 227 #endif 228 #define IM_TABSIZE (4) 229 #define IM_MEMALIGN(_OFF,_ALIGN) (((_OFF) + (_ALIGN - 1)) & ~(_ALIGN - 1)) // Memory align e.g. IM_ALIGN(0,4)=0, IM_ALIGN(1,4)=4, IM_ALIGN(4,4)=4, IM_ALIGN(5,4)=8 230 #define IM_F32_TO_INT8_UNBOUND(_VAL) ((int)((_VAL) * 255.0f + ((_VAL)>=0 ? 0.5f : -0.5f))) // Unsaturated, for display purpose 231 #define IM_F32_TO_INT8_SAT(_VAL) ((int)(ImSaturate(_VAL) * 255.0f + 0.5f)) // Saturated, always output 0..255 232 #define IM_FLOOR(_VAL) ((float)(int)(_VAL)) // ImFloor() is not inlined in MSVC debug builds 233 #define IM_ROUND(_VAL) ((float)(int)((_VAL) + 0.5f)) // 234 235 // Enforce cdecl calling convention for functions called by the standard library, in case compilation settings changed the default to e.g. __vectorcall 236 #ifdef _MSC_VER 237 #define IMGUI_CDECL __cdecl 238 #else 239 #define IMGUI_CDECL 240 #endif 241 242 // Warnings 243 #if defined(_MSC_VER) && !defined(__clang__) 244 #define IM_MSVC_WARNING_SUPPRESS(XXXX) __pragma(warning(suppress: XXXX)) 245 #else 246 #define IM_MSVC_WARNING_SUPPRESS(XXXX) 247 #endif 248 249 // Debug Tools 250 // Use 'Metrics->Tools->Item Picker' to break into the call-stack of a specific item. 251 #ifndef IM_DEBUG_BREAK 252 #if defined(__clang__) 253 #define IM_DEBUG_BREAK() __builtin_debugtrap() 254 #elif defined (_MSC_VER) 255 #define IM_DEBUG_BREAK() __debugbreak() 256 #else 257 #define IM_DEBUG_BREAK() IM_ASSERT(0) // It is expected that you define IM_DEBUG_BREAK() into something that will break nicely in a debugger! 258 #endif 259 #endif // #ifndef IM_DEBUG_BREAK 260 261 //----------------------------------------------------------------------------- 262 // [SECTION] Generic helpers 263 // Note that the ImXXX helpers functions are lower-level than ImGui functions. 264 // ImGui functions or the ImGui context are never called/used from other ImXXX functions. 265 //----------------------------------------------------------------------------- 266 // - Helpers: Hashing 267 // - Helpers: Sorting 268 // - Helpers: Bit manipulation 269 // - Helpers: String, Formatting 270 // - Helpers: UTF-8 <> wchar conversions 271 // - Helpers: ImVec2/ImVec4 operators 272 // - Helpers: Maths 273 // - Helpers: Geometry 274 // - Helper: ImVec1 275 // - Helper: ImVec2ih 276 // - Helper: ImRect 277 // - Helper: ImBitArray 278 // - Helper: ImBitVector 279 // - Helper: ImSpan<>, ImSpanAllocator<> 280 // - Helper: ImPool<> 281 // - Helper: ImChunkStream<> 282 //----------------------------------------------------------------------------- 283 284 // Helpers: Hashing 285 IMGUI_API ImGuiID ImHashData(const void* data, size_t data_size, ImU32 seed = 0); 286 IMGUI_API ImGuiID ImHashStr(const char* data, size_t data_size = 0, ImU32 seed = 0); 287 #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS 288 static inline ImGuiID 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] 289 #endif 290 291 // Helpers: Sorting 292 #define ImQsort qsort 293 294 // Helpers: Color Blending 295 IMGUI_API ImU32 ImAlphaBlendColors(ImU32 col_a, ImU32 col_b); 296 297 // Helpers: Bit manipulation 298 static inline bool ImIsPowerOfTwo(int v) { return v != 0 && (v & (v - 1)) == 0; } 299 static inline bool ImIsPowerOfTwo(ImU64 v) { return v != 0 && (v & (v - 1)) == 0; } 300 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; } 301 302 // Helpers: String, Formatting 303 IMGUI_API int ImStricmp(const char* str1, const char* str2); 304 IMGUI_API int ImStrnicmp(const char* str1, const char* str2, size_t count); 305 IMGUI_API void ImStrncpy(char* dst, const char* src, size_t count); 306 IMGUI_API char* ImStrdup(const char* str); 307 IMGUI_API char* ImStrdupcpy(char* dst, size_t* p_dst_size, const char* str); 308 IMGUI_API const char* ImStrchrRange(const char* str_begin, const char* str_end, char c); 309 IMGUI_API int ImStrlenW(const ImWchar* str); 310 IMGUI_API const char* ImStreolRange(const char* str, const char* str_end); // End end-of-line 311 IMGUI_API const ImWchar*ImStrbolW(const ImWchar* buf_mid_line, const ImWchar* buf_begin); // Find beginning-of-line 312 IMGUI_API const char* ImStristr(const char* haystack, const char* haystack_end, const char* needle, const char* needle_end); 313 IMGUI_API void ImStrTrimBlanks(char* str); 314 IMGUI_API const char* ImStrSkipBlank(const char* str); 315 IMGUI_API int ImFormatString(char* buf, size_t buf_size, const char* fmt, ...) IM_FMTARGS(3); 316 IMGUI_API int ImFormatStringV(char* buf, size_t buf_size, const char* fmt, va_list args) IM_FMTLIST(3); 317 IMGUI_API const char* ImParseFormatFindStart(const char* format); 318 IMGUI_API const char* ImParseFormatFindEnd(const char* format); 319 IMGUI_API const char* ImParseFormatTrimDecorations(const char* format, char* buf, size_t buf_size); 320 IMGUI_API int ImParseFormatPrecision(const char* format, int default_value); 321 static inline bool ImCharIsBlankA(char c) { return c == ' ' || c == '\t'; } 322 static inline bool ImCharIsBlankW(unsigned int c) { return c == ' ' || c == '\t' || c == 0x3000; } 323 324 // Helpers: UTF-8 <> wchar conversions 325 IMGUI_API int ImTextStrToUtf8(char* buf, int buf_size, const ImWchar* in_text, const ImWchar* in_text_end); // return output UTF-8 bytes count 326 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 327 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 328 IMGUI_API int ImTextCountCharsFromUtf8(const char* in_text, const char* in_text_end); // return number of UTF-8 code-points (NOT bytes count) 329 IMGUI_API int ImTextCountUtf8BytesFromChar(const char* in_text, const char* in_text_end); // return number of bytes to express one char in UTF-8 330 IMGUI_API int ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_end); // return number of bytes to express string in UTF-8 331 332 // Helpers: ImVec2/ImVec4 operators 333 // 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.) 334 // We unfortunately don't have a unary- operator for ImVec2 because this would needs to be defined inside the class itself. 335 #ifdef IMGUI_DEFINE_MATH_OPERATORS 336 IM_MSVC_RUNTIME_CHECKS_OFF 337 static inline ImVec2 operator*(const ImVec2& lhs, const float rhs) { return ImVec2(lhs.x * rhs, lhs.y * rhs); } 338 static inline ImVec2 operator/(const ImVec2& lhs, const float rhs) { return ImVec2(lhs.x / rhs, lhs.y / rhs); } 339 static inline ImVec2 operator+(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x + rhs.x, lhs.y + rhs.y); } 340 static inline ImVec2 operator-(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x - rhs.x, lhs.y - rhs.y); } 341 static inline ImVec2 operator*(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x * rhs.x, lhs.y * rhs.y); } 342 static inline ImVec2 operator/(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x / rhs.x, lhs.y / rhs.y); } 343 static inline ImVec2& operator*=(ImVec2& lhs, const float rhs) { lhs.x *= rhs; lhs.y *= rhs; return lhs; } 344 static inline ImVec2& operator/=(ImVec2& lhs, const float rhs) { lhs.x /= rhs; lhs.y /= rhs; return lhs; } 345 static inline ImVec2& operator+=(ImVec2& lhs, const ImVec2& rhs) { lhs.x += rhs.x; lhs.y += rhs.y; return lhs; } 346 static inline ImVec2& operator-=(ImVec2& lhs, const ImVec2& rhs) { lhs.x -= rhs.x; lhs.y -= rhs.y; return lhs; } 347 static inline ImVec2& operator*=(ImVec2& lhs, const ImVec2& rhs) { lhs.x *= rhs.x; lhs.y *= rhs.y; return lhs; } 348 static inline ImVec2& operator/=(ImVec2& lhs, const ImVec2& rhs) { lhs.x /= rhs.x; lhs.y /= rhs.y; return lhs; } 349 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); } 350 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); } 351 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); } 352 IM_MSVC_RUNTIME_CHECKS_RESTORE 353 #endif 354 355 // Helpers: File System 356 #ifdef IMGUI_DISABLE_FILE_FUNCTIONS 357 #define IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS 358 typedef void* ImFileHandle; 359 static inline ImFileHandle ImFileOpen(const char*, const char*) { return NULL; } 360 static inline bool ImFileClose(ImFileHandle) { return false; } 361 static inline ImU64 ImFileGetSize(ImFileHandle) { return (ImU64)-1; } 362 static inline ImU64 ImFileRead(void*, ImU64, ImU64, ImFileHandle) { return 0; } 363 static inline ImU64 ImFileWrite(const void*, ImU64, ImU64, ImFileHandle) { return 0; } 364 #endif 365 #ifndef IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS 366 typedef FILE* ImFileHandle; 367 IMGUI_API ImFileHandle ImFileOpen(const char* filename, const char* mode); 368 IMGUI_API bool ImFileClose(ImFileHandle file); 369 IMGUI_API ImU64 ImFileGetSize(ImFileHandle file); 370 IMGUI_API ImU64 ImFileRead(void* data, ImU64 size, ImU64 count, ImFileHandle file); 371 IMGUI_API ImU64 ImFileWrite(const void* data, ImU64 size, ImU64 count, ImFileHandle file); 372 #else 373 #define IMGUI_DISABLE_TTY_FUNCTIONS // Can't use stdout, fflush if we are not using default file functions 374 #endif 375 IMGUI_API void* ImFileLoadToMemory(const char* filename, const char* mode, size_t* out_file_size = NULL, int padding_bytes = 0); 376 377 // Helpers: Maths 378 IM_MSVC_RUNTIME_CHECKS_OFF 379 // - Wrapper for standard libs functions. (Note that imgui_demo.cpp does _not_ use them to keep the code easy to copy) 380 #ifndef IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS 381 #define ImFabs(X) fabsf(X) 382 #define ImSqrt(X) sqrtf(X) 383 #define ImFmod(X, Y) fmodf((X), (Y)) 384 #define ImCos(X) cosf(X) 385 #define ImSin(X) sinf(X) 386 #define ImAcos(X) acosf(X) 387 #define ImAtan2(Y, X) atan2f((Y), (X)) 388 #define ImAtof(STR) atof(STR) 389 //#define ImFloorStd(X) floorf(X) // We use our own, see ImFloor() and ImFloorSigned() 390 #define ImCeil(X) ceilf(X) 391 static inline float ImPow(float x, float y) { return powf(x, y); } // DragBehaviorT/SliderBehaviorT uses ImPow with either float/double and need the precision 392 static inline double ImPow(double x, double y) { return pow(x, y); } 393 static inline float ImLog(float x) { return logf(x); } // DragBehaviorT/SliderBehaviorT uses ImLog with either float/double and need the precision 394 static inline double ImLog(double x) { return log(x); } 395 static inline int ImAbs(int x) { return x < 0 ? -x : x; } 396 static inline float ImAbs(float x) { return fabsf(x); } 397 static inline double ImAbs(double x) { return fabs(x); } 398 static inline float ImSign(float x) { return (x < 0.0f) ? -1.0f : ((x > 0.0f) ? 1.0f : 0.0f); } // Sign operator - returns -1, 0 or 1 based on sign of argument 399 static inline double ImSign(double x) { return (x < 0.0) ? -1.0 : ((x > 0.0) ? 1.0 : 0.0); } 400 #ifdef IMGUI_ENABLE_SSE 401 static inline float ImRsqrt(float x) { return _mm_cvtss_f32(_mm_rsqrt_ss(_mm_set_ss(x))); } 402 #else 403 static inline float ImRsqrt(float x) { return 1.0f / sqrtf(x); } 404 #endif 405 static inline double ImRsqrt(double x) { return 1.0 / sqrt(x); } 406 #endif 407 // - ImMin/ImMax/ImClamp/ImLerp/ImSwap are used by widgets which support variety of types: signed/unsigned int/long long float/double 408 // (Exceptionally using templates here but we could also redefine them for those types) 409 template<typename T> static inline T ImMin(T lhs, T rhs) { return lhs < rhs ? lhs : rhs; } 410 template<typename T> static inline T ImMax(T lhs, T rhs) { return lhs >= rhs ? lhs : rhs; } 411 template<typename T> static inline T ImClamp(T v, T mn, T mx) { return (v < mn) ? mn : (v > mx) ? mx : v; } 412 template<typename T> static inline T ImLerp(T a, T b, float t) { return (T)(a + (b - a) * t); } 413 template<typename T> static inline void ImSwap(T& a, T& b) { T tmp = a; a = b; b = tmp; } 414 template<typename T> static inline T ImAddClampOverflow(T a, T b, T mn, T mx) { if (b < 0 && (a < mn - b)) return mn; if (b > 0 && (a > mx - b)) return mx; return a + b; } 415 template<typename T> static inline T ImSubClampOverflow(T a, T b, T mn, T mx) { if (b > 0 && (a < mn + b)) return mn; if (b < 0 && (a > mx + b)) return mx; return a - b; } 416 // - Misc maths helpers 417 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); } 418 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); } 419 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); } 420 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); } 421 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); } 422 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); } 423 static inline float ImSaturate(float f) { return (f < 0.0f) ? 0.0f : (f > 1.0f) ? 1.0f : f; } 424 static inline float ImLengthSqr(const ImVec2& lhs) { return (lhs.x * lhs.x) + (lhs.y * lhs.y); } 425 static inline float ImLengthSqr(const ImVec4& lhs) { return (lhs.x * lhs.x) + (lhs.y * lhs.y) + (lhs.z * lhs.z) + (lhs.w * lhs.w); } 426 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 ImRsqrt(d); return fail_value; } 427 static inline float ImFloor(float f) { return (float)(int)(f); } 428 static inline float ImFloorSigned(float f) { return (float)((f >= 0 || (int)f == f) ? (int)f : (int)f - 1); } // Decent replacement for floorf() 429 static inline ImVec2 ImFloor(const ImVec2& v) { return ImVec2((float)(int)(v.x), (float)(int)(v.y)); } 430 static inline int ImModPositive(int a, int b) { return (a + b) % b; } 431 static inline float ImDot(const ImVec2& a, const ImVec2& b) { return a.x * b.x + a.y * b.y; } 432 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); } 433 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; } 434 static inline ImVec2 ImMul(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x * rhs.x, lhs.y * rhs.y); } 435 IM_MSVC_RUNTIME_CHECKS_RESTORE 436 437 // Helpers: Geometry 438 IMGUI_API ImVec2 ImBezierCubicCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, float t); 439 IMGUI_API ImVec2 ImBezierCubicClosestPoint(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p, int num_segments); // For curves with explicit number of segments 440 IMGUI_API ImVec2 ImBezierCubicClosestPointCasteljau(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p, float tess_tol);// For auto-tessellated curves you can use tess_tol = style.CurveTessellationTol 441 IMGUI_API ImVec2 ImBezierQuadraticCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, float t); 442 IMGUI_API ImVec2 ImLineClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& p); 443 IMGUI_API bool ImTriangleContainsPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p); 444 IMGUI_API ImVec2 ImTriangleClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p); 445 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); 446 inline float ImTriangleArea(const ImVec2& a, const ImVec2& b, const ImVec2& c) { return ImFabs((a.x * (b.y - c.y)) + (b.x * (c.y - a.y)) + (c.x * (a.y - b.y))) * 0.5f; } 447 IMGUI_API ImGuiDir ImGetDirQuadrantFromDelta(float dx, float dy); 448 449 // Helper: ImVec1 (1D vector) 450 // (this odd construct is used to facilitate the transition between 1D and 2D, and the maintenance of some branches/patches) 451 IM_MSVC_RUNTIME_CHECKS_OFF 452 struct ImVec1 453 { 454 float x; 455 ImVec1() { x = 0.0f; } 456 ImVec1(float _x) { x = _x; } 457 }; 458 459 // Helper: ImVec2ih (2D vector, half-size integer, for long-term packed storage) 460 struct ImVec2ih 461 { 462 short x, y; 463 ImVec2ih() { x = y = 0; } 464 ImVec2ih(short _x, short _y) { x = _x; y = _y; } 465 explicit ImVec2ih(const ImVec2& rhs) { x = (short)rhs.x; y = (short)rhs.y; } 466 }; 467 468 // Helper: ImRect (2D axis aligned bounding-box) 469 // NB: we can't rely on ImVec2 math operators being available here! 470 struct IMGUI_API ImRect 471 { 472 ImVec2 Min; // Upper-left 473 ImVec2 Max; // Lower-right 474 475 ImRect() : Min(0.0f, 0.0f), Max(0.0f, 0.0f) {} 476 ImRect(const ImVec2& min, const ImVec2& max) : Min(min), Max(max) {} 477 ImRect(const ImVec4& v) : Min(v.x, v.y), Max(v.z, v.w) {} 478 ImRect(float x1, float y1, float x2, float y2) : Min(x1, y1), Max(x2, y2) {} 479 480 ImVec2 GetCenter() const { return ImVec2((Min.x + Max.x) * 0.5f, (Min.y + Max.y) * 0.5f); } 481 ImVec2 GetSize() const { return ImVec2(Max.x - Min.x, Max.y - Min.y); } 482 float GetWidth() const { return Max.x - Min.x; } 483 float GetHeight() const { return Max.y - Min.y; } 484 float GetArea() const { return (Max.x - Min.x) * (Max.y - Min.y); } 485 ImVec2 GetTL() const { return Min; } // Top-left 486 ImVec2 GetTR() const { return ImVec2(Max.x, Min.y); } // Top-right 487 ImVec2 GetBL() const { return ImVec2(Min.x, Max.y); } // Bottom-left 488 ImVec2 GetBR() const { return Max; } // Bottom-right 489 bool Contains(const ImVec2& p) const { return p.x >= Min.x && p.y >= Min.y && p.x < Max.x && p.y < Max.y; } 490 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; } 491 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; } 492 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; } 493 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; } 494 void Expand(const float amount) { Min.x -= amount; Min.y -= amount; Max.x += amount; Max.y += amount; } 495 void Expand(const ImVec2& amount) { Min.x -= amount.x; Min.y -= amount.y; Max.x += amount.x; Max.y += amount.y; } 496 void Translate(const ImVec2& d) { Min.x += d.x; Min.y += d.y; Max.x += d.x; Max.y += d.y; } 497 void TranslateX(float dx) { Min.x += dx; Max.x += dx; } 498 void TranslateY(float dy) { Min.y += dy; Max.y += dy; } 499 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. 500 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. 501 void Floor() { Min.x = IM_FLOOR(Min.x); Min.y = IM_FLOOR(Min.y); Max.x = IM_FLOOR(Max.x); Max.y = IM_FLOOR(Max.y); } 502 bool IsInverted() const { return Min.x > Max.x || Min.y > Max.y; } 503 ImVec4 ToVec4() const { return ImVec4(Min.x, Min.y, Max.x, Max.y); } 504 }; 505 IM_MSVC_RUNTIME_CHECKS_RESTORE 506 507 // Helper: ImBitArray 508 inline bool ImBitArrayTestBit(const ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); return (arr[n >> 5] & mask) != 0; } 509 inline void ImBitArrayClearBit(ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); arr[n >> 5] &= ~mask; } 510 inline void ImBitArraySetBit(ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); arr[n >> 5] |= mask; } 511 inline void ImBitArraySetBitRange(ImU32* arr, int n, int n2) // Works on range [n..n2) 512 { 513 n2--; 514 while (n <= n2) 515 { 516 int a_mod = (n & 31); 517 int b_mod = (n2 > (n | 31) ? 31 : (n2 & 31)) + 1; 518 ImU32 mask = (ImU32)(((ImU64)1 << b_mod) - 1) & ~(ImU32)(((ImU64)1 << a_mod) - 1); 519 arr[n >> 5] |= mask; 520 n = (n + 32) & ~31; 521 } 522 } 523 524 // Helper: ImBitArray class (wrapper over ImBitArray functions) 525 // Store 1-bit per value. 526 template<int BITCOUNT> 527 struct IMGUI_API ImBitArray 528 { 529 ImU32 Storage[(BITCOUNT + 31) >> 5]; 530 ImBitArray() { ClearAllBits(); } 531 void ClearAllBits() { memset(Storage, 0, sizeof(Storage)); } 532 void SetAllBits() { memset(Storage, 255, sizeof(Storage)); } 533 bool TestBit(int n) const { IM_ASSERT(n < BITCOUNT); return ImBitArrayTestBit(Storage, n); } 534 void SetBit(int n) { IM_ASSERT(n < BITCOUNT); ImBitArraySetBit(Storage, n); } 535 void ClearBit(int n) { IM_ASSERT(n < BITCOUNT); ImBitArrayClearBit(Storage, n); } 536 void SetBitRange(int n, int n2) { ImBitArraySetBitRange(Storage, n, n2); } // Works on range [n..n2) 537 }; 538 539 // Helper: ImBitVector 540 // Store 1-bit per value. 541 struct IMGUI_API ImBitVector 542 { 543 ImVector<ImU32> Storage; 544 void Create(int sz) { Storage.resize((sz + 31) >> 5); memset(Storage.Data, 0, (size_t)Storage.Size * sizeof(Storage.Data[0])); } 545 void Clear() { Storage.clear(); } 546 bool TestBit(int n) const { IM_ASSERT(n < (Storage.Size << 5)); return ImBitArrayTestBit(Storage.Data, n); } 547 void SetBit(int n) { IM_ASSERT(n < (Storage.Size << 5)); ImBitArraySetBit(Storage.Data, n); } 548 void ClearBit(int n) { IM_ASSERT(n < (Storage.Size << 5)); ImBitArrayClearBit(Storage.Data, n); } 549 }; 550 551 // Helper: ImSpan<> 552 // Pointing to a span of data we don't own. 553 template<typename T> 554 struct ImSpan 555 { 556 T* Data; 557 T* DataEnd; 558 559 // Constructors, destructor 560 inline ImSpan() { Data = DataEnd = NULL; } 561 inline ImSpan(T* data, int size) { Data = data; DataEnd = data + size; } 562 inline ImSpan(T* data, T* data_end) { Data = data; DataEnd = data_end; } 563 564 inline void set(T* data, int size) { Data = data; DataEnd = data + size; } 565 inline void set(T* data, T* data_end) { Data = data; DataEnd = data_end; } 566 inline int size() const { return (int)(ptrdiff_t)(DataEnd - Data); } 567 inline int size_in_bytes() const { return (int)(ptrdiff_t)(DataEnd - Data) * (int)sizeof(T); } 568 inline T& operator[](int i) { T* p = Data + i; IM_ASSERT(p >= Data && p < DataEnd); return *p; } 569 inline const T& operator[](int i) const { const T* p = Data + i; IM_ASSERT(p >= Data && p < DataEnd); return *p; } 570 571 inline T* begin() { return Data; } 572 inline const T* begin() const { return Data; } 573 inline T* end() { return DataEnd; } 574 inline const T* end() const { return DataEnd; } 575 576 // Utilities 577 inline int index_from_ptr(const T* it) const { IM_ASSERT(it >= Data && it < DataEnd); const ptrdiff_t off = it - Data; return (int)off; } 578 }; 579 580 // Helper: ImSpanAllocator<> 581 // Facilitate storing multiple chunks into a single large block (the "arena") 582 // - Usage: call Reserve() N times, allocate GetArenaSizeInBytes() worth, pass it to SetArenaBasePtr(), call GetSpan() N times to retrieve the aligned ranges. 583 template<int CHUNKS> 584 struct ImSpanAllocator 585 { 586 char* BasePtr; 587 int CurrOff; 588 int CurrIdx; 589 int Offsets[CHUNKS]; 590 int Sizes[CHUNKS]; 591 592 ImSpanAllocator() { memset(this, 0, sizeof(*this)); } 593 inline void Reserve(int n, size_t sz, int a=4) { IM_ASSERT(n == CurrIdx && n < CHUNKS); CurrOff = IM_MEMALIGN(CurrOff, a); Offsets[n] = CurrOff; Sizes[n] = (int)sz; CurrIdx++; CurrOff += (int)sz; } 594 inline int GetArenaSizeInBytes() { return CurrOff; } 595 inline void SetArenaBasePtr(void* base_ptr) { BasePtr = (char*)base_ptr; } 596 inline void* GetSpanPtrBegin(int n) { IM_ASSERT(n >= 0 && n < CHUNKS && CurrIdx == CHUNKS); return (void*)(BasePtr + Offsets[n]); } 597 inline void* GetSpanPtrEnd(int n) { IM_ASSERT(n >= 0 && n < CHUNKS && CurrIdx == CHUNKS); return (void*)(BasePtr + Offsets[n] + Sizes[n]); } 598 template<typename T> 599 inline void GetSpan(int n, ImSpan<T>* span) { span->set((T*)GetSpanPtrBegin(n), (T*)GetSpanPtrEnd(n)); } 600 }; 601 602 // Helper: ImPool<> 603 // Basic keyed storage for contiguous instances, slow/amortized insertion, O(1) indexable, O(Log N) queries by ID over a dense/hot buffer, 604 // Honor constructor/destructor. Add/remove invalidate all pointers. Indexes have the same lifetime as the associated object. 605 typedef int ImPoolIdx; 606 template<typename T> 607 struct IMGUI_API ImPool 608 { 609 ImVector<T> Buf; // Contiguous data 610 ImGuiStorage Map; // ID->Index 611 ImPoolIdx FreeIdx; // Next free idx to use 612 613 ImPool() { FreeIdx = 0; } 614 ~ImPool() { Clear(); } 615 T* GetByKey(ImGuiID key) { int idx = Map.GetInt(key, -1); return (idx != -1) ? &Buf[idx] : NULL; } 616 T* GetByIndex(ImPoolIdx n) { return &Buf[n]; } 617 ImPoolIdx GetIndex(const T* p) const { IM_ASSERT(p >= Buf.Data && p < Buf.Data + Buf.Size); return (ImPoolIdx)(p - Buf.Data); } 618 T* GetOrAddByKey(ImGuiID key) { int* p_idx = Map.GetIntRef(key, -1); if (*p_idx != -1) return &Buf[*p_idx]; *p_idx = FreeIdx; return Add(); } 619 bool Contains(const T* p) const { return (p >= Buf.Data && p < Buf.Data + Buf.Size); } 620 void Clear() { for (int n = 0; n < Map.Data.Size; n++) { int idx = Map.Data[n].val_i; if (idx != -1) Buf[idx].~T(); } Map.Clear(); Buf.clear(); FreeIdx = 0; } 621 T* Add() { int idx = FreeIdx; if (idx == Buf.Size) { Buf.resize(Buf.Size + 1); FreeIdx++; } else { FreeIdx = *(int*)&Buf[idx]; } IM_PLACEMENT_NEW(&Buf[idx]) T(); return &Buf[idx]; } 622 void Remove(ImGuiID key, const T* p) { Remove(key, GetIndex(p)); } 623 void Remove(ImGuiID key, ImPoolIdx idx) { Buf[idx].~T(); *(int*)&Buf[idx] = FreeIdx; FreeIdx = idx; Map.SetInt(key, -1); } 624 void Reserve(int capacity) { Buf.reserve(capacity); Map.Data.reserve(capacity); } 625 int GetSize() const { return Buf.Size; } 626 }; 627 628 // Helper: ImChunkStream<> 629 // Build and iterate a contiguous stream of variable-sized structures. 630 // This is used by Settings to store persistent data while reducing allocation count. 631 // We store the chunk size first, and align the final size on 4 bytes boundaries. 632 // The tedious/zealous amount of casting is to avoid -Wcast-align warnings. 633 template<typename T> 634 struct IMGUI_API ImChunkStream 635 { 636 ImVector<char> Buf; 637 638 void clear() { Buf.clear(); } 639 bool empty() const { return Buf.Size == 0; } 640 int size() const { return Buf.Size; } 641 T* alloc_chunk(size_t sz) { size_t HDR_SZ = 4; sz = IM_MEMALIGN(HDR_SZ + sz, 4u); int off = Buf.Size; Buf.resize(off + (int)sz); ((int*)(void*)(Buf.Data + off))[0] = (int)sz; return (T*)(void*)(Buf.Data + off + (int)HDR_SZ); } 642 T* begin() { size_t HDR_SZ = 4; if (!Buf.Data) return NULL; return (T*)(void*)(Buf.Data + HDR_SZ); } 643 T* next_chunk(T* p) { size_t HDR_SZ = 4; IM_ASSERT(p >= begin() && p < end()); p = (T*)(void*)((char*)(void*)p + chunk_size(p)); if (p == (T*)(void*)((char*)end() + HDR_SZ)) return (T*)0; IM_ASSERT(p < end()); return p; } 644 int chunk_size(const T* p) { return ((const int*)p)[-1]; } 645 T* end() { return (T*)(void*)(Buf.Data + Buf.Size); } 646 int offset_from_ptr(const T* p) { IM_ASSERT(p >= begin() && p < end()); const ptrdiff_t off = (const char*)p - Buf.Data; return (int)off; } 647 T* ptr_from_offset(int off) { IM_ASSERT(off >= 4 && off < Buf.Size); return (T*)(void*)(Buf.Data + off); } 648 void swap(ImChunkStream<T>& rhs) { rhs.Buf.swap(Buf); } 649 650 }; 651 652 //----------------------------------------------------------------------------- 653 // [SECTION] ImDrawList support 654 //----------------------------------------------------------------------------- 655 656 // ImDrawList: Helper function to calculate a circle's segment count given its radius and a "maximum error" value. 657 // Estimation of number of circle segment based on error is derived using method described in https://stackoverflow.com/a/2244088/15194693 658 // Number of segments (N) is calculated using equation: 659 // N = ceil ( pi / acos(1 - error / r) ) where r > 0, error <= r 660 // Our equation is significantly simpler that one in the post thanks for choosing segment that is 661 // perpendicular to X axis. Follow steps in the article from this starting condition and you will 662 // will get this result. 663 // 664 // Rendering circles with an odd number of segments, while mathematically correct will produce 665 // asymmetrical results on the raster grid. Therefore we're rounding N to next even number (7->8, 8->8, 9->10 etc.) 666 // 667 #define IM_ROUNDUP_TO_EVEN(_V) ((((_V) + 1) / 2) * 2) 668 #define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MIN 4 669 #define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX 512 670 #define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC(_RAD,_MAXERROR) ImClamp(IM_ROUNDUP_TO_EVEN((int)ImCeil(IM_PI / ImAcos(1 - ImMin((_MAXERROR), (_RAD)) / (_RAD)))), IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MIN, IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX) 671 672 // Raw equation from IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC rewritten for 'r' and 'error'. 673 #define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_R(_N,_MAXERROR) ((_MAXERROR) / (1 - ImCos(IM_PI / ImMax((float)(_N), IM_PI)))) 674 #define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_ERROR(_N,_RAD) ((1 - ImCos(IM_PI / ImMax((float)(_N), IM_PI))) / (_RAD)) 675 676 // ImDrawList: Lookup table size for adaptive arc drawing, cover full circle. 677 #ifndef IM_DRAWLIST_ARCFAST_TABLE_SIZE 678 #define IM_DRAWLIST_ARCFAST_TABLE_SIZE 48 // Number of samples in lookup table. 679 #endif 680 #define IM_DRAWLIST_ARCFAST_SAMPLE_MAX IM_DRAWLIST_ARCFAST_TABLE_SIZE // Sample index _PathArcToFastEx() for 360 angle. 681 682 // Data shared between all ImDrawList instances 683 // You may want to create your own instance of this if you want to use ImDrawList completely without ImGui. In that case, watch out for future changes to this structure. 684 struct IMGUI_API ImDrawListSharedData 685 { 686 ImVec2 TexUvWhitePixel; // UV of white pixel in the atlas 687 ImFont* Font; // Current/default font (optional, for simplified AddText overload) 688 float FontSize; // Current/default font size (optional, for simplified AddText overload) 689 float CurveTessellationTol; // Tessellation tolerance when using PathBezierCurveTo() 690 float CircleSegmentMaxError; // Number of circle segments to use per pixel of radius for AddCircle() etc 691 ImVec4 ClipRectFullscreen; // Value for PushClipRectFullscreen() 692 ImDrawListFlags InitialFlags; // Initial flags at the beginning of the frame (it is possible to alter flags on a per-drawlist basis afterwards) 693 694 // [Internal] Lookup tables 695 ImVec2 ArcFastVtx[IM_DRAWLIST_ARCFAST_TABLE_SIZE]; // Sample points on the quarter of the circle. 696 float ArcFastRadiusCutoff; // Cutoff radius after which arc drawing will fallback to slower PathArcTo() 697 ImU8 CircleSegmentCounts[64]; // Precomputed segment count for given radius before we calculate it dynamically (to avoid calculation overhead) 698 const ImVec4* TexUvLines; // UV of anti-aliased lines in the atlas 699 700 ImDrawListSharedData(); 701 void SetCircleTessellationMaxError(float max_error); 702 }; 703 704 struct ImDrawDataBuilder 705 { 706 ImVector<ImDrawList*> Layers[2]; // Global layers for: regular, tooltip 707 708 void Clear() { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].resize(0); } 709 void ClearFreeMemory() { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].clear(); } 710 int GetDrawListCount() const { int count = 0; for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) count += Layers[n].Size; return count; } 711 IMGUI_API void FlattenIntoSingleLayer(); 712 }; 713 714 //----------------------------------------------------------------------------- 715 // [SECTION] Widgets support: flags, enums, data structures 716 //----------------------------------------------------------------------------- 717 718 // Transient per-window flags, reset at the beginning of the frame. For child window, inherited from parent on first Begin(). 719 // This is going to be exposed in imgui.h when stabilized enough. 720 enum ImGuiItemFlags_ 721 { 722 ImGuiItemFlags_None = 0, 723 ImGuiItemFlags_NoTabStop = 1 << 0, // false 724 ImGuiItemFlags_ButtonRepeat = 1 << 1, // false // Button() will return true multiple times based on io.KeyRepeatDelay and io.KeyRepeatRate settings. 725 ImGuiItemFlags_Disabled = 1 << 2, // false // [BETA] Disable interactions but doesn't affect visuals yet. See github.com/ocornut/imgui/issues/211 726 ImGuiItemFlags_NoNav = 1 << 3, // false 727 ImGuiItemFlags_NoNavDefaultFocus = 1 << 4, // false 728 ImGuiItemFlags_SelectableDontClosePopup = 1 << 5, // false // MenuItem/Selectable() automatically closes current Popup window 729 ImGuiItemFlags_MixedValue = 1 << 6, // false // [BETA] Represent a mixed/indeterminate value, generally multi-selection where values differ. Currently only supported by Checkbox() (later should support all sorts of widgets) 730 ImGuiItemFlags_ReadOnly = 1 << 7 // false // [ALPHA] Allow hovering interactions but underlying value is not changed. 731 }; 732 733 // Flags for ItemAdd() 734 // FIXME-NAV: _Focusable is _ALMOST_ what you would expect to be called '_TabStop' but because SetKeyboardFocusHere() works on items with no TabStop we distinguish Focusable from TabStop. 735 enum ImGuiItemAddFlags_ 736 { 737 ImGuiItemAddFlags_None = 0, 738 ImGuiItemAddFlags_Focusable = 1 << 0 // FIXME-NAV: In current/legacy scheme, Focusable+TabStop support are opt-in by widgets. We will transition it toward being opt-out, so this flag is expected to eventually disappear. 739 }; 740 741 // Storage for LastItem data 742 enum ImGuiItemStatusFlags_ 743 { 744 ImGuiItemStatusFlags_None = 0, 745 ImGuiItemStatusFlags_HoveredRect = 1 << 0, // Mouse position is within item rectangle (does NOT mean that the window is in correct z-order and can be hovered!, this is only one part of the most-common IsItemHovered test) 746 ImGuiItemStatusFlags_HasDisplayRect = 1 << 1, // window->DC.LastItemDisplayRect is valid 747 ImGuiItemStatusFlags_Edited = 1 << 2, // Value exposed by item was edited in the current frame (should match the bool return value of most widgets) 748 ImGuiItemStatusFlags_ToggledSelection = 1 << 3, // Set when Selectable(), TreeNode() reports toggling a selection. We can't report "Selected", only state changes, in order to easily handle clipping with less issues. 749 ImGuiItemStatusFlags_ToggledOpen = 1 << 4, // Set when TreeNode() reports toggling their open state. 750 ImGuiItemStatusFlags_HasDeactivated = 1 << 5, // Set if the widget/group is able to provide data for the ImGuiItemStatusFlags_Deactivated flag. 751 ImGuiItemStatusFlags_Deactivated = 1 << 6, // Only valid if ImGuiItemStatusFlags_HasDeactivated is set. 752 ImGuiItemStatusFlags_HoveredWindow = 1 << 7, // Override the HoveredWindow test to allow cross-window hover testing. 753 ImGuiItemStatusFlags_FocusedByCode = 1 << 8, // Set when the Focusable item just got focused from code. 754 ImGuiItemStatusFlags_FocusedByTabbing = 1 << 9, // Set when the Focusable item just got focused by Tabbing. 755 ImGuiItemStatusFlags_Focused = ImGuiItemStatusFlags_FocusedByCode | ImGuiItemStatusFlags_FocusedByTabbing 756 757 #ifdef IMGUI_ENABLE_TEST_ENGINE 758 , // [imgui_tests only] 759 ImGuiItemStatusFlags_Openable = 1 << 20, // 760 ImGuiItemStatusFlags_Opened = 1 << 21, // 761 ImGuiItemStatusFlags_Checkable = 1 << 22, // 762 ImGuiItemStatusFlags_Checked = 1 << 23 // 763 #endif 764 }; 765 766 // Extend ImGuiInputTextFlags_ 767 enum ImGuiInputTextFlagsPrivate_ 768 { 769 // [Internal] 770 ImGuiInputTextFlags_Multiline = 1 << 26, // For internal use by InputTextMultiline() 771 ImGuiInputTextFlags_NoMarkEdited = 1 << 27, // For internal use by functions using InputText() before reformatting data 772 ImGuiInputTextFlags_MergedItem = 1 << 28 // For internal use by TempInputText(), will skip calling ItemAdd(). Require bounding-box to strictly match. 773 }; 774 775 // Extend ImGuiButtonFlags_ 776 enum ImGuiButtonFlagsPrivate_ 777 { 778 ImGuiButtonFlags_PressedOnClick = 1 << 4, // return true on click (mouse down event) 779 ImGuiButtonFlags_PressedOnClickRelease = 1 << 5, // [Default] return true on click + release on same item <-- this is what the majority of Button are using 780 ImGuiButtonFlags_PressedOnClickReleaseAnywhere = 1 << 6, // return true on click + release even if the release event is not done while hovering the item 781 ImGuiButtonFlags_PressedOnRelease = 1 << 7, // return true on release (default requires click+release) 782 ImGuiButtonFlags_PressedOnDoubleClick = 1 << 8, // return true on double-click (default requires click+release) 783 ImGuiButtonFlags_PressedOnDragDropHold = 1 << 9, // return true when held into while we are drag and dropping another item (used by e.g. tree nodes, collapsing headers) 784 ImGuiButtonFlags_Repeat = 1 << 10, // hold to repeat 785 ImGuiButtonFlags_FlattenChildren = 1 << 11, // allow interactions even if a child window is overlapping 786 ImGuiButtonFlags_AllowItemOverlap = 1 << 12, // require previous frame HoveredId to either match id or be null before being usable, use along with SetItemAllowOverlap() 787 ImGuiButtonFlags_DontClosePopups = 1 << 13, // disable automatically closing parent popup on press // [UNUSED] 788 ImGuiButtonFlags_Disabled = 1 << 14, // disable interactions 789 ImGuiButtonFlags_AlignTextBaseLine = 1 << 15, // vertically align button to match text baseline - ButtonEx() only // FIXME: Should be removed and handled by SmallButton(), not possible currently because of DC.CursorPosPrevLine 790 ImGuiButtonFlags_NoKeyModifiers = 1 << 16, // disable mouse interaction if a key modifier is held 791 ImGuiButtonFlags_NoHoldingActiveId = 1 << 17, // don't set ActiveId while holding the mouse (ImGuiButtonFlags_PressedOnClick only) 792 ImGuiButtonFlags_NoNavFocus = 1 << 18, // don't override navigation focus when activated 793 ImGuiButtonFlags_NoHoveredOnFocus = 1 << 19, // don't report as hovered when nav focus is on this item 794 ImGuiButtonFlags_PressedOnMask_ = ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnClickReleaseAnywhere | ImGuiButtonFlags_PressedOnRelease | ImGuiButtonFlags_PressedOnDoubleClick | ImGuiButtonFlags_PressedOnDragDropHold, 795 ImGuiButtonFlags_PressedOnDefault_ = ImGuiButtonFlags_PressedOnClickRelease 796 }; 797 798 // Extend ImGuiSliderFlags_ 799 enum ImGuiSliderFlagsPrivate_ 800 { 801 ImGuiSliderFlags_Vertical = 1 << 20, // Should this slider be orientated vertically? 802 ImGuiSliderFlags_ReadOnly = 1 << 21 803 }; 804 805 // Extend ImGuiSelectableFlags_ 806 enum ImGuiSelectableFlagsPrivate_ 807 { 808 // NB: need to be in sync with last value of ImGuiSelectableFlags_ 809 ImGuiSelectableFlags_NoHoldingActiveID = 1 << 20, 810 ImGuiSelectableFlags_SelectOnClick = 1 << 21, // Override button behavior to react on Click (default is Click+Release) 811 ImGuiSelectableFlags_SelectOnRelease = 1 << 22, // Override button behavior to react on Release (default is Click+Release) 812 ImGuiSelectableFlags_SpanAvailWidth = 1 << 23, // Span all avail width even if we declared less for layout purpose. FIXME: We may be able to remove this (added in 6251d379, 2bcafc86 for menus) 813 ImGuiSelectableFlags_DrawHoveredWhenHeld = 1 << 24, // Always show active when held, even is not hovered. This concept could probably be renamed/formalized somehow. 814 ImGuiSelectableFlags_SetNavIdOnHover = 1 << 25, // Set Nav/Focus ID on mouse hover (used by MenuItem) 815 ImGuiSelectableFlags_NoPadWithHalfSpacing = 1 << 26 // Disable padding each side with ItemSpacing * 0.5f 816 }; 817 818 // Extend ImGuiTreeNodeFlags_ 819 enum ImGuiTreeNodeFlagsPrivate_ 820 { 821 ImGuiTreeNodeFlags_ClipLabelForTrailingButton = 1 << 20 822 }; 823 824 enum ImGuiSeparatorFlags_ 825 { 826 ImGuiSeparatorFlags_None = 0, 827 ImGuiSeparatorFlags_Horizontal = 1 << 0, // Axis default to current layout type, so generally Horizontal unless e.g. in a menu bar 828 ImGuiSeparatorFlags_Vertical = 1 << 1, 829 ImGuiSeparatorFlags_SpanAllColumns = 1 << 2 830 }; 831 832 enum ImGuiTextFlags_ 833 { 834 ImGuiTextFlags_None = 0, 835 ImGuiTextFlags_NoWidthForLargeClippedText = 1 << 0 836 }; 837 838 enum ImGuiTooltipFlags_ 839 { 840 ImGuiTooltipFlags_None = 0, 841 ImGuiTooltipFlags_OverridePreviousTooltip = 1 << 0 // Override will clear/ignore previously submitted tooltip (defaults to append) 842 }; 843 844 // FIXME: this is in development, not exposed/functional as a generic feature yet. 845 // Horizontal/Vertical enums are fixed to 0/1 so they may be used to index ImVec2 846 enum ImGuiLayoutType_ 847 { 848 ImGuiLayoutType_Horizontal = 0, 849 ImGuiLayoutType_Vertical = 1 850 }; 851 852 enum ImGuiLogType 853 { 854 ImGuiLogType_None = 0, 855 ImGuiLogType_TTY, 856 ImGuiLogType_File, 857 ImGuiLogType_Buffer, 858 ImGuiLogType_Clipboard 859 }; 860 861 // X/Y enums are fixed to 0/1 so they may be used to index ImVec2 862 enum ImGuiAxis 863 { 864 ImGuiAxis_None = -1, 865 ImGuiAxis_X = 0, 866 ImGuiAxis_Y = 1 867 }; 868 869 enum ImGuiPlotType 870 { 871 ImGuiPlotType_Lines, 872 ImGuiPlotType_Histogram 873 }; 874 875 enum ImGuiInputSource 876 { 877 ImGuiInputSource_None = 0, 878 ImGuiInputSource_Mouse, 879 ImGuiInputSource_Keyboard, 880 ImGuiInputSource_Gamepad, 881 ImGuiInputSource_Nav, // Stored in g.ActiveIdSource only 882 ImGuiInputSource_Clipboard, // Currently only used by InputText() 883 ImGuiInputSource_COUNT 884 }; 885 886 // FIXME-NAV: Clarify/expose various repeat delay/rate 887 enum ImGuiInputReadMode 888 { 889 ImGuiInputReadMode_Down, 890 ImGuiInputReadMode_Pressed, 891 ImGuiInputReadMode_Released, 892 ImGuiInputReadMode_Repeat, 893 ImGuiInputReadMode_RepeatSlow, 894 ImGuiInputReadMode_RepeatFast 895 }; 896 897 enum ImGuiNavHighlightFlags_ 898 { 899 ImGuiNavHighlightFlags_None = 0, 900 ImGuiNavHighlightFlags_TypeDefault = 1 << 0, 901 ImGuiNavHighlightFlags_TypeThin = 1 << 1, 902 ImGuiNavHighlightFlags_AlwaysDraw = 1 << 2, // Draw rectangular highlight if (g.NavId == id) _even_ when using the mouse. 903 ImGuiNavHighlightFlags_NoRounding = 1 << 3 904 }; 905 906 enum ImGuiNavDirSourceFlags_ 907 { 908 ImGuiNavDirSourceFlags_None = 0, 909 ImGuiNavDirSourceFlags_Keyboard = 1 << 0, 910 ImGuiNavDirSourceFlags_PadDPad = 1 << 1, 911 ImGuiNavDirSourceFlags_PadLStick = 1 << 2 912 }; 913 914 enum ImGuiNavMoveFlags_ 915 { 916 ImGuiNavMoveFlags_None = 0, 917 ImGuiNavMoveFlags_LoopX = 1 << 0, // On failed request, restart from opposite side 918 ImGuiNavMoveFlags_LoopY = 1 << 1, 919 ImGuiNavMoveFlags_WrapX = 1 << 2, // On failed request, request from opposite side one line down (when NavDir==right) or one line up (when NavDir==left) 920 ImGuiNavMoveFlags_WrapY = 1 << 3, // This is not super useful for provided for completeness 921 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) 922 ImGuiNavMoveFlags_AlsoScoreVisibleSet = 1 << 5, // Store alternate result in NavMoveResultLocalVisibleSet that only comprise elements that are already fully visible. 923 ImGuiNavMoveFlags_ScrollToEdge = 1 << 6 924 }; 925 926 enum ImGuiNavForward 927 { 928 ImGuiNavForward_None, 929 ImGuiNavForward_ForwardQueued, 930 ImGuiNavForward_ForwardActive 931 }; 932 933 enum ImGuiNavLayer 934 { 935 ImGuiNavLayer_Main = 0, // Main scrolling layer 936 ImGuiNavLayer_Menu = 1, // Menu layer (access with Alt/ImGuiNavInput_Menu) 937 ImGuiNavLayer_COUNT 938 }; 939 940 enum ImGuiPopupPositionPolicy 941 { 942 ImGuiPopupPositionPolicy_Default, 943 ImGuiPopupPositionPolicy_ComboBox, 944 ImGuiPopupPositionPolicy_Tooltip 945 }; 946 947 struct ImGuiDataTypeTempStorage 948 { 949 ImU8 Data[8]; // Can fit any data up to ImGuiDataType_COUNT 950 }; 951 952 // Type information associated to one ImGuiDataType. Retrieve with DataTypeGetInfo(). 953 struct ImGuiDataTypeInfo 954 { 955 size_t Size; // Size in bytes 956 const char* Name; // Short descriptive name for the type, for debugging 957 const char* PrintFmt; // Default printf format for the type 958 const char* ScanFmt; // Default scanf format for the type 959 }; 960 961 // Extend ImGuiDataType_ 962 enum ImGuiDataTypePrivate_ 963 { 964 ImGuiDataType_String = ImGuiDataType_COUNT + 1, 965 ImGuiDataType_Pointer, 966 ImGuiDataType_ID 967 }; 968 969 // Stacked color modifier, backup of modified data so we can restore it 970 struct ImGuiColorMod 971 { 972 ImGuiCol Col; 973 ImVec4 BackupValue; 974 }; 975 976 // Stacked style modifier, backup of modified data so we can restore it. Data type inferred from the variable. 977 struct ImGuiStyleMod 978 { 979 ImGuiStyleVar VarIdx; 980 union { int BackupInt[2]; float BackupFloat[2]; }; 981 ImGuiStyleMod(ImGuiStyleVar idx, int v) { VarIdx = idx; BackupInt[0] = v; } 982 ImGuiStyleMod(ImGuiStyleVar idx, float v) { VarIdx = idx; BackupFloat[0] = v; } 983 ImGuiStyleMod(ImGuiStyleVar idx, ImVec2 v) { VarIdx = idx; BackupFloat[0] = v.x; BackupFloat[1] = v.y; } 984 }; 985 986 // Stacked storage data for BeginGroup()/EndGroup() 987 struct IMGUI_API ImGuiGroupData 988 { 989 ImGuiID WindowID; 990 ImVec2 BackupCursorPos; 991 ImVec2 BackupCursorMaxPos; 992 ImVec1 BackupIndent; 993 ImVec1 BackupGroupOffset; 994 ImVec2 BackupCurrLineSize; 995 float BackupCurrLineTextBaseOffset; 996 ImGuiID BackupActiveIdIsAlive; 997 bool BackupActiveIdPreviousFrameIsAlive; 998 bool BackupHoveredIdIsAlive; 999 bool EmitItem; 1000 }; 1001 1002 // Simple column measurement, currently used for MenuItem() only.. This is very short-sighted/throw-away code and NOT a generic helper. 1003 struct IMGUI_API ImGuiMenuColumns 1004 { 1005 float Spacing; 1006 float Width, NextWidth; 1007 float Pos[3], NextWidths[3]; 1008 1009 ImGuiMenuColumns() { memset(this, 0, sizeof(*this)); } 1010 void Update(int count, float spacing, bool clear); 1011 float DeclColumns(float w0, float w1, float w2); 1012 float CalcExtraSpace(float avail_w) const; 1013 }; 1014 1015 // Internal state of the currently focused/edited text input box 1016 // For a given item ID, access with ImGui::GetInputTextState() 1017 struct IMGUI_API ImGuiInputTextState 1018 { 1019 ImGuiID ID; // widget id owning the text state 1020 int CurLenW, CurLenA; // we need to maintain our buffer length in both UTF-8 and wchar format. UTF-8 length is valid even if TextA is not. 1021 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. 1022 ImVector<char> TextA; // temporary UTF8 buffer for callbacks and other operations. this is not updated in every code-path! size=capacity. 1023 ImVector<char> InitialTextA; // backup of end-user buffer at the time of focus (in UTF-8, unaltered) 1024 bool TextAIsValid; // temporary UTF8 buffer is not initially valid before we make the widget active (until then we pull the data from user argument) 1025 int BufCapacityA; // end-user buffer capacity 1026 float ScrollX; // horizontal scrolling/offset 1027 ImStb::STB_TexteditState Stb; // state for stb_textedit.h 1028 float CursorAnim; // timer for cursor blink, reset on every user action so the cursor reappears immediately 1029 bool CursorFollow; // set when we want scrolling to follow the current cursor position (not always!) 1030 bool SelectedAllMouseLock; // after a double-click to select all, we ignore further mouse drags to update selection 1031 bool Edited; // edited this frame 1032 ImGuiInputTextFlags Flags; // copy of InputText() flags 1033 ImGuiInputTextCallback UserCallback; // " 1034 void* UserCallbackData; // " 1035 1036 ImGuiInputTextState() { memset(this, 0, sizeof(*this)); } 1037 void ClearText() { CurLenW = CurLenA = 0; TextW[0] = 0; TextA[0] = 0; CursorClamp(); } 1038 void ClearFreeMemory() { TextW.clear(); TextA.clear(); InitialTextA.clear(); } 1039 int GetUndoAvailCount() const { return Stb.undostate.undo_point; } 1040 int GetRedoAvailCount() const { return STB_TEXTEDIT_UNDOSTATECOUNT - Stb.undostate.redo_point; } 1041 void OnKeyPressed(int key); // Cannot be inline because we call in code in stb_textedit.h implementation 1042 1043 // Cursor & Selection 1044 void CursorAnimReset() { CursorAnim = -0.30f; } // After a user-input the cursor stays on for a while without blinking 1045 void CursorClamp() { Stb.cursor = ImMin(Stb.cursor, CurLenW); Stb.select_start = ImMin(Stb.select_start, CurLenW); Stb.select_end = ImMin(Stb.select_end, CurLenW); } 1046 bool HasSelection() const { return Stb.select_start != Stb.select_end; } 1047 void ClearSelection() { Stb.select_start = Stb.select_end = Stb.cursor; } 1048 void SelectAll() { Stb.select_start = 0; Stb.cursor = Stb.select_end = CurLenW; Stb.has_preferred_x = 0; } 1049 }; 1050 1051 // Storage for current popup stack 1052 struct ImGuiPopupData 1053 { 1054 ImGuiID PopupId; // Set on OpenPopup() 1055 ImGuiWindow* Window; // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup() 1056 ImGuiWindow* SourceWindow; // Set on OpenPopup() copy of NavWindow at the time of opening the popup 1057 int OpenFrameCount; // Set on OpenPopup() 1058 ImGuiID OpenParentId; // Set on OpenPopup(), we need this to differentiate multiple menu sets from each others (e.g. inside menu bar vs loose menu items) 1059 ImVec2 OpenPopupPos; // Set on OpenPopup(), preferred popup position (typically == OpenMousePos when using mouse) 1060 ImVec2 OpenMousePos; // Set on OpenPopup(), copy of mouse position at the time of opening popup 1061 1062 ImGuiPopupData() { memset(this, 0, sizeof(*this)); OpenFrameCount = -1; } 1063 }; 1064 1065 struct ImGuiNavItemData 1066 { 1067 ImGuiWindow* Window; // Init,Move // Best candidate window (result->ItemWindow->RootWindowForNav == request->Window) 1068 ImGuiID ID; // Init,Move // Best candidate item ID 1069 ImGuiID FocusScopeId; // Init,Move // Best candidate focus scope ID 1070 ImRect RectRel; // Init,Move // Best candidate bounding box in window relative space 1071 float DistBox; // Move // Best candidate box distance to current NavId 1072 float DistCenter; // Move // Best candidate center distance to current NavId 1073 float DistAxial; // Move // Best candidate axial distance to current NavId 1074 1075 ImGuiNavItemData() { Clear(); } 1076 void Clear() { Window = NULL; ID = FocusScopeId = 0; RectRel = ImRect(); DistBox = DistCenter = DistAxial = FLT_MAX; } 1077 }; 1078 1079 enum ImGuiNextWindowDataFlags_ 1080 { 1081 ImGuiNextWindowDataFlags_None = 0, 1082 ImGuiNextWindowDataFlags_HasPos = 1 << 0, 1083 ImGuiNextWindowDataFlags_HasSize = 1 << 1, 1084 ImGuiNextWindowDataFlags_HasContentSize = 1 << 2, 1085 ImGuiNextWindowDataFlags_HasCollapsed = 1 << 3, 1086 ImGuiNextWindowDataFlags_HasSizeConstraint = 1 << 4, 1087 ImGuiNextWindowDataFlags_HasFocus = 1 << 5, 1088 ImGuiNextWindowDataFlags_HasBgAlpha = 1 << 6, 1089 ImGuiNextWindowDataFlags_HasScroll = 1 << 7 1090 }; 1091 1092 // Storage for SetNexWindow** functions 1093 struct ImGuiNextWindowData 1094 { 1095 ImGuiNextWindowDataFlags Flags; 1096 ImGuiCond PosCond; 1097 ImGuiCond SizeCond; 1098 ImGuiCond CollapsedCond; 1099 ImVec2 PosVal; 1100 ImVec2 PosPivotVal; 1101 ImVec2 SizeVal; 1102 ImVec2 ContentSizeVal; 1103 ImVec2 ScrollVal; 1104 bool CollapsedVal; 1105 ImRect SizeConstraintRect; 1106 ImGuiSizeCallback SizeCallback; 1107 void* SizeCallbackUserData; 1108 float BgAlphaVal; // Override background alpha 1109 ImVec2 MenuBarOffsetMinVal; // *Always on* This is not exposed publicly, so we don't clear it. 1110 1111 ImGuiNextWindowData() { memset(this, 0, sizeof(*this)); } 1112 inline void ClearFlags() { Flags = ImGuiNextWindowDataFlags_None; } 1113 }; 1114 1115 enum ImGuiNextItemDataFlags_ 1116 { 1117 ImGuiNextItemDataFlags_None = 0, 1118 ImGuiNextItemDataFlags_HasWidth = 1 << 0, 1119 ImGuiNextItemDataFlags_HasOpen = 1 << 1 1120 }; 1121 1122 struct ImGuiNextItemData 1123 { 1124 ImGuiNextItemDataFlags Flags; 1125 float Width; // Set by SetNextItemWidth() 1126 ImGuiID FocusScopeId; // Set by SetNextItemMultiSelectData() (!= 0 signify value has been set, so it's an alternate version of HasSelectionData, we don't use Flags for this because they are cleared too early. This is mostly used for debugging) 1127 ImGuiCond OpenCond; 1128 bool OpenVal; // Set by SetNextItemOpen() 1129 1130 ImGuiNextItemData() { memset(this, 0, sizeof(*this)); } 1131 inline void ClearFlags() { Flags = ImGuiNextItemDataFlags_None; } // Also cleared manually by ItemAdd()! 1132 }; 1133 1134 struct ImGuiShrinkWidthItem 1135 { 1136 int Index; 1137 float Width; 1138 }; 1139 1140 struct ImGuiPtrOrIndex 1141 { 1142 void* Ptr; // Either field can be set, not both. e.g. Dock node tab bars are loose while BeginTabBar() ones are in a pool. 1143 int Index; // Usually index in a main pool. 1144 1145 ImGuiPtrOrIndex(void* ptr) { Ptr = ptr; Index = -1; } 1146 ImGuiPtrOrIndex(int index) { Ptr = NULL; Index = index; } 1147 }; 1148 1149 //----------------------------------------------------------------------------- 1150 // [SECTION] Columns support 1151 //----------------------------------------------------------------------------- 1152 1153 // Flags for internal's BeginColumns(). Prefix using BeginTable() nowadays! 1154 enum ImGuiOldColumnFlags_ 1155 { 1156 ImGuiOldColumnFlags_None = 0, 1157 ImGuiOldColumnFlags_NoBorder = 1 << 0, // Disable column dividers 1158 ImGuiOldColumnFlags_NoResize = 1 << 1, // Disable resizing columns when clicking on the dividers 1159 ImGuiOldColumnFlags_NoPreserveWidths = 1 << 2, // Disable column width preservation when adjusting columns 1160 ImGuiOldColumnFlags_NoForceWithinWindow = 1 << 3, // Disable forcing columns to fit within window 1161 ImGuiOldColumnFlags_GrowParentContentsSize = 1 << 4 // (WIP) Restore pre-1.51 behavior of extending the parent window contents size but _without affecting the columns width at all_. Will eventually remove. 1162 1163 // Obsolete names (will be removed) 1164 #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS 1165 , ImGuiColumnsFlags_None = ImGuiOldColumnFlags_None, 1166 ImGuiColumnsFlags_NoBorder = ImGuiOldColumnFlags_NoBorder, 1167 ImGuiColumnsFlags_NoResize = ImGuiOldColumnFlags_NoResize, 1168 ImGuiColumnsFlags_NoPreserveWidths = ImGuiOldColumnFlags_NoPreserveWidths, 1169 ImGuiColumnsFlags_NoForceWithinWindow = ImGuiOldColumnFlags_NoForceWithinWindow, 1170 ImGuiColumnsFlags_GrowParentContentsSize = ImGuiOldColumnFlags_GrowParentContentsSize 1171 #endif 1172 }; 1173 1174 struct ImGuiOldColumnData 1175 { 1176 float OffsetNorm; // Column start offset, normalized 0.0 (far left) -> 1.0 (far right) 1177 float OffsetNormBeforeResize; 1178 ImGuiOldColumnFlags Flags; // Not exposed 1179 ImRect ClipRect; 1180 1181 ImGuiOldColumnData() { memset(this, 0, sizeof(*this)); } 1182 }; 1183 1184 struct ImGuiOldColumns 1185 { 1186 ImGuiID ID; 1187 ImGuiOldColumnFlags Flags; 1188 bool IsFirstFrame; 1189 bool IsBeingResized; 1190 int Current; 1191 int Count; 1192 float OffMinX, OffMaxX; // Offsets from HostWorkRect.Min.x 1193 float LineMinY, LineMaxY; 1194 float HostCursorPosY; // Backup of CursorPos at the time of BeginColumns() 1195 float HostCursorMaxPosX; // Backup of CursorMaxPos at the time of BeginColumns() 1196 ImRect HostInitialClipRect; // Backup of ClipRect at the time of BeginColumns() 1197 ImRect HostBackupClipRect; // Backup of ClipRect during PushColumnsBackground()/PopColumnsBackground() 1198 ImRect HostBackupParentWorkRect;//Backup of WorkRect at the time of BeginColumns() 1199 ImVector<ImGuiOldColumnData> Columns; 1200 ImDrawListSplitter Splitter; 1201 1202 ImGuiOldColumns() { memset(this, 0, sizeof(*this)); } 1203 }; 1204 1205 //----------------------------------------------------------------------------- 1206 // [SECTION] Multi-select support 1207 //----------------------------------------------------------------------------- 1208 1209 #ifdef IMGUI_HAS_MULTI_SELECT 1210 // <this is filled in 'range_select' branch> 1211 #endif // #ifdef IMGUI_HAS_MULTI_SELECT 1212 1213 //----------------------------------------------------------------------------- 1214 // [SECTION] Docking support 1215 //----------------------------------------------------------------------------- 1216 1217 #ifdef IMGUI_HAS_DOCK 1218 // <this is filled in 'docking' branch> 1219 #endif // #ifdef IMGUI_HAS_DOCK 1220 1221 //----------------------------------------------------------------------------- 1222 // [SECTION] Viewport support 1223 //----------------------------------------------------------------------------- 1224 1225 // ImGuiViewport Private/Internals fields (cardinal sin: we are using inheritance!) 1226 // Every instance of ImGuiViewport is in fact a ImGuiViewportP. 1227 struct ImGuiViewportP : public ImGuiViewport 1228 { 1229 int DrawListsLastFrame[2]; // Last frame number the background (0) and foreground (1) draw lists were used 1230 ImDrawList* DrawLists[2]; // Convenience background (0) and foreground (1) draw lists. We use them to draw software mouser cursor when io.MouseDrawCursor is set and to draw most debug overlays. 1231 ImDrawData DrawDataP; 1232 ImDrawDataBuilder DrawDataBuilder; 1233 1234 ImVec2 WorkOffsetMin; // Work Area: Offset from Pos to top-left corner of Work Area. Generally (0,0) or (0,+main_menu_bar_height). Work Area is Full Area but without menu-bars/status-bars (so WorkArea always fit inside Pos/Size!) 1235 ImVec2 WorkOffsetMax; // Work Area: Offset from Pos+Size to bottom-right corner of Work Area. Generally (0,0) or (0,-status_bar_height). 1236 ImVec2 BuildWorkOffsetMin; // Work Area: Offset being built during current frame. Generally >= 0.0f. 1237 ImVec2 BuildWorkOffsetMax; // Work Area: Offset being built during current frame. Generally <= 0.0f. 1238 1239 ImGuiViewportP() { DrawListsLastFrame[0] = DrawListsLastFrame[1] = -1; DrawLists[0] = DrawLists[1] = NULL; } 1240 ~ImGuiViewportP() { if (DrawLists[0]) IM_DELETE(DrawLists[0]); if (DrawLists[1]) IM_DELETE(DrawLists[1]); } 1241 1242 // Calculate work rect pos/size given a set of offset (we have 1 pair of offset for rect locked from last frame data, and 1 pair for currently building rect) 1243 ImVec2 CalcWorkRectPos(const ImVec2& off_min) const { return ImVec2(Pos.x + off_min.x, Pos.y + off_min.y); } 1244 ImVec2 CalcWorkRectSize(const ImVec2& off_min, const ImVec2& off_max) const { return ImVec2(ImMax(0.0f, Size.x - off_min.x + off_max.x), ImMax(0.0f, Size.y - off_min.y + off_max.y)); } 1245 void UpdateWorkRect() { WorkPos = CalcWorkRectPos(WorkOffsetMin); WorkSize = CalcWorkRectSize(WorkOffsetMin, WorkOffsetMax); } // Update public fields 1246 1247 // Helpers to retrieve ImRect (we don't need to store BuildWorkRect as every access tend to change it, hence the code asymmetry) 1248 ImRect GetMainRect() const { return ImRect(Pos.x, Pos.y, Pos.x + Size.x, Pos.y + Size.y); } 1249 ImRect GetWorkRect() const { return ImRect(WorkPos.x, WorkPos.y, WorkPos.x + WorkSize.x, WorkPos.y + WorkSize.y); } 1250 ImRect GetBuildWorkRect() const { ImVec2 pos = CalcWorkRectPos(BuildWorkOffsetMin); ImVec2 size = CalcWorkRectSize(BuildWorkOffsetMin, BuildWorkOffsetMax); return ImRect(pos.x, pos.y, pos.x + size.x, pos.y + size.y); } 1251 }; 1252 1253 //----------------------------------------------------------------------------- 1254 // [SECTION] Settings support 1255 //----------------------------------------------------------------------------- 1256 1257 // Windows data saved in imgui.ini file 1258 // Because we never destroy or rename ImGuiWindowSettings, we can store the names in a separate buffer easily. 1259 // (this is designed to be stored in a ImChunkStream buffer, with the variable-length Name following our structure) 1260 struct ImGuiWindowSettings 1261 { 1262 ImGuiID ID; 1263 ImVec2ih Pos; 1264 ImVec2ih Size; 1265 bool Collapsed; 1266 bool WantApply; // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context) 1267 1268 ImGuiWindowSettings() { memset(this, 0, sizeof(*this)); } 1269 char* GetName() { return (char*)(this + 1); } 1270 }; 1271 1272 struct ImGuiSettingsHandler 1273 { 1274 const char* TypeName; // Short description stored in .ini file. Disallowed characters: '[' ']' 1275 ImGuiID TypeHash; // == ImHashStr(TypeName) 1276 void (*ClearAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Clear all settings data 1277 void (*ReadInitFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Read: Called before reading (in registration order) 1278 void* (*ReadOpenFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, const char* name); // Read: Called when entering into a new ini entry e.g. "[Window][Name]" 1279 void (*ReadLineFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, void* entry, const char* line); // Read: Called for every line of text within an ini entry 1280 void (*ApplyAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Read: Called after reading (in registration order) 1281 void (*WriteAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* out_buf); // Write: Output every entries into 'out_buf' 1282 void* UserData; 1283 1284 ImGuiSettingsHandler() { memset(this, 0, sizeof(*this)); } 1285 }; 1286 1287 //----------------------------------------------------------------------------- 1288 // [SECTION] Metrics, Debug 1289 //----------------------------------------------------------------------------- 1290 1291 struct ImGuiMetricsConfig 1292 { 1293 bool ShowWindowsRects; 1294 bool ShowWindowsBeginOrder; 1295 bool ShowTablesRects; 1296 bool ShowDrawCmdMesh; 1297 bool ShowDrawCmdBoundingBoxes; 1298 int ShowWindowsRectsType; 1299 int ShowTablesRectsType; 1300 1301 ImGuiMetricsConfig() 1302 { 1303 ShowWindowsRects = false; 1304 ShowWindowsBeginOrder = false; 1305 ShowTablesRects = false; 1306 ShowDrawCmdMesh = true; 1307 ShowDrawCmdBoundingBoxes = true; 1308 ShowWindowsRectsType = -1; 1309 ShowTablesRectsType = -1; 1310 } 1311 }; 1312 1313 struct IMGUI_API ImGuiStackSizes 1314 { 1315 short SizeOfIDStack; 1316 short SizeOfColorStack; 1317 short SizeOfStyleVarStack; 1318 short SizeOfFontStack; 1319 short SizeOfFocusScopeStack; 1320 short SizeOfGroupStack; 1321 short SizeOfBeginPopupStack; 1322 1323 ImGuiStackSizes() { memset(this, 0, sizeof(*this)); } 1324 void SetToCurrentState(); 1325 void CompareWithCurrentState(); 1326 }; 1327 1328 //----------------------------------------------------------------------------- 1329 // [SECTION] Generic context hooks 1330 //----------------------------------------------------------------------------- 1331 1332 typedef void (*ImGuiContextHookCallback)(ImGuiContext* ctx, ImGuiContextHook* hook); 1333 enum ImGuiContextHookType { ImGuiContextHookType_NewFramePre, ImGuiContextHookType_NewFramePost, ImGuiContextHookType_EndFramePre, ImGuiContextHookType_EndFramePost, ImGuiContextHookType_RenderPre, ImGuiContextHookType_RenderPost, ImGuiContextHookType_Shutdown, ImGuiContextHookType_PendingRemoval_ }; 1334 1335 struct ImGuiContextHook 1336 { 1337 ImGuiID HookId; // A unique ID assigned by AddContextHook() 1338 ImGuiContextHookType Type; 1339 ImGuiID Owner; 1340 ImGuiContextHookCallback Callback; 1341 void* UserData; 1342 1343 ImGuiContextHook() { memset(this, 0, sizeof(*this)); } 1344 }; 1345 1346 //----------------------------------------------------------------------------- 1347 // [SECTION] ImGuiContext (main imgui context) 1348 //----------------------------------------------------------------------------- 1349 1350 struct ImGuiContext 1351 { 1352 bool Initialized; 1353 bool FontAtlasOwnedByContext; // IO.Fonts-> is owned by the ImGuiContext and will be destructed along with it. 1354 ImGuiIO IO; 1355 ImGuiStyle Style; 1356 ImFont* Font; // (Shortcut) == FontStack.empty() ? IO.Font : FontStack.back() 1357 float FontSize; // (Shortcut) == FontBaseSize * g.CurrentWindow->FontWindowScale == window->FontSize(). Text height for current window. 1358 float FontBaseSize; // (Shortcut) == IO.FontGlobalScale * Font->Scale * Font->FontSize. Base text height. 1359 ImDrawListSharedData DrawListSharedData; 1360 double Time; 1361 int FrameCount; 1362 int FrameCountEnded; 1363 int FrameCountRendered; 1364 bool WithinFrameScope; // Set by NewFrame(), cleared by EndFrame() 1365 bool WithinFrameScopeWithImplicitWindow; // Set by NewFrame(), cleared by EndFrame() when the implicit debug window has been pushed 1366 bool WithinEndChild; // Set within EndChild() 1367 bool GcCompactAll; // Request full GC 1368 bool TestEngineHookItems; // Will call test engine hooks: ImGuiTestEngineHook_ItemAdd(), ImGuiTestEngineHook_ItemInfo(), ImGuiTestEngineHook_Log() 1369 ImGuiID TestEngineHookIdInfo; // Will call test engine hooks: ImGuiTestEngineHook_IdInfo() from GetID() 1370 void* TestEngine; // Test engine user data 1371 1372 // Windows state 1373 ImVector<ImGuiWindow*> Windows; // Windows, sorted in display order, back to front 1374 ImVector<ImGuiWindow*> WindowsFocusOrder; // Root windows, sorted in focus order, back to front. 1375 ImVector<ImGuiWindow*> WindowsTempSortBuffer; // Temporary buffer used in EndFrame() to reorder windows so parents are kept before their child 1376 ImVector<ImGuiWindow*> CurrentWindowStack; 1377 ImGuiStorage WindowsById; // Map window's ImGuiID to ImGuiWindow* 1378 int WindowsActiveCount; // Number of unique windows submitted by frame 1379 ImVec2 WindowsHoverPadding; // Padding around resizable windows for which hovering on counts as hovering the window == ImMax(style.TouchExtraPadding, WINDOWS_HOVER_PADDING) 1380 ImGuiWindow* CurrentWindow; // Window being drawn into 1381 ImGuiWindow* HoveredWindow; // Window the mouse is hovering. Will typically catch mouse inputs. 1382 ImGuiWindow* HoveredWindowUnderMovingWindow; // Hovered window ignoring MovingWindow. Only set if MovingWindow is set. 1383 ImGuiWindow* MovingWindow; // Track the window we clicked on (in order to preserve focus). The actual window that is moved is generally MovingWindow->RootWindow. 1384 ImGuiWindow* WheelingWindow; // Track the window we started mouse-wheeling on. Until a timer elapse or mouse has moved, generally keep scrolling the same window even if during the course of scrolling the mouse ends up hovering a child window. 1385 ImVec2 WheelingWindowRefMousePos; 1386 float WheelingWindowTimer; 1387 1388 // Item/widgets state and tracking information 1389 ImGuiItemFlags CurrentItemFlags; // == g.ItemFlagsStack.back() 1390 ImGuiID HoveredId; // Hovered widget, filled during the frame 1391 ImGuiID HoveredIdPreviousFrame; 1392 bool HoveredIdAllowOverlap; 1393 bool HoveredIdUsingMouseWheel; // Hovered widget will use mouse wheel. Blocks scrolling the underlying window. 1394 bool HoveredIdPreviousFrameUsingMouseWheel; 1395 bool HoveredIdDisabled; // At least one widget passed the rect test, but has been discarded by disabled flag or popup inhibit. May be true even if HoveredId == 0. 1396 float HoveredIdTimer; // Measure contiguous hovering time 1397 float HoveredIdNotActiveTimer; // Measure contiguous hovering time where the item has not been active 1398 ImGuiID ActiveId; // Active widget 1399 ImGuiID ActiveIdIsAlive; // Active widget has been seen this frame (we can't use a bool as the ActiveId may change within the frame) 1400 float ActiveIdTimer; 1401 bool ActiveIdIsJustActivated; // Set at the time of activation for one frame 1402 bool ActiveIdAllowOverlap; // Active widget allows another widget to steal active id (generally for overlapping widgets, but not always) 1403 bool ActiveIdNoClearOnFocusLoss; // Disable losing active id if the active id window gets unfocused. 1404 bool ActiveIdHasBeenPressedBefore; // Track whether the active id led to a press (this is to allow changing between PressOnClick and PressOnRelease without pressing twice). Used by range_select branch. 1405 bool ActiveIdHasBeenEditedBefore; // Was the value associated to the widget Edited over the course of the Active state. 1406 bool ActiveIdHasBeenEditedThisFrame; 1407 bool ActiveIdUsingMouseWheel; // Active widget will want to read mouse wheel. Blocks scrolling the underlying window. 1408 ImU32 ActiveIdUsingNavDirMask; // Active widget will want to read those nav move requests (e.g. can activate a button and move away from it) 1409 ImU32 ActiveIdUsingNavInputMask; // Active widget will want to read those nav inputs. 1410 ImU64 ActiveIdUsingKeyInputMask; // Active widget will want to read those key inputs. When we grow the ImGuiKey enum we'll need to either to order the enum to make useful keys come first, either redesign this into e.g. a small array. 1411 ImVec2 ActiveIdClickOffset; // Clicked offset from upper-left corner, if applicable (currently only set by ButtonBehavior) 1412 ImGuiWindow* ActiveIdWindow; 1413 ImGuiInputSource ActiveIdSource; // Activating with mouse or nav (gamepad/keyboard) 1414 int ActiveIdMouseButton; 1415 ImGuiID ActiveIdPreviousFrame; 1416 bool ActiveIdPreviousFrameIsAlive; 1417 bool ActiveIdPreviousFrameHasBeenEditedBefore; 1418 ImGuiWindow* ActiveIdPreviousFrameWindow; 1419 ImGuiID LastActiveId; // Store the last non-zero ActiveId, useful for animation. 1420 float LastActiveIdTimer; // Store the last non-zero ActiveId timer since the beginning of activation, useful for animation. 1421 1422 // Next window/item data 1423 ImGuiNextWindowData NextWindowData; // Storage for SetNextWindow** functions 1424 ImGuiNextItemData NextItemData; // Storage for SetNextItem** functions 1425 1426 // Shared stacks 1427 ImVector<ImGuiColorMod> ColorStack; // Stack for PushStyleColor()/PopStyleColor() - inherited by Begin() 1428 ImVector<ImGuiStyleMod> StyleVarStack; // Stack for PushStyleVar()/PopStyleVar() - inherited by Begin() 1429 ImVector<ImFont*> FontStack; // Stack for PushFont()/PopFont() - inherited by Begin() 1430 ImVector<ImGuiID> FocusScopeStack; // Stack for PushFocusScope()/PopFocusScope() - not inherited by Begin(), unless child window 1431 ImVector<ImGuiItemFlags>ItemFlagsStack; // Stack for PushItemFlag()/PopItemFlag() - inherited by Begin() 1432 ImVector<ImGuiGroupData>GroupStack; // Stack for BeginGroup()/EndGroup() - not inherited by Begin() 1433 ImVector<ImGuiPopupData>OpenPopupStack; // Which popups are open (persistent) 1434 ImVector<ImGuiPopupData>BeginPopupStack; // Which level of BeginPopup() we are in (reset every frame) 1435 1436 // Viewports 1437 ImVector<ImGuiViewportP*> Viewports; // Active viewports (Size==1 in 'master' branch). Each viewports hold their copy of ImDrawData. 1438 1439 // Gamepad/keyboard Navigation 1440 ImGuiWindow* NavWindow; // Focused window for navigation. Could be called 'FocusWindow' 1441 ImGuiID NavId; // Focused item for navigation 1442 ImGuiID NavFocusScopeId; // Identify a selection scope (selection code often wants to "clear other items" when landing on an item of the selection set) 1443 ImGuiID NavActivateId; // ~~ (g.ActiveId == 0) && IsNavInputPressed(ImGuiNavInput_Activate) ? NavId : 0, also set when calling ActivateItem() 1444 ImGuiID NavActivateDownId; // ~~ IsNavInputDown(ImGuiNavInput_Activate) ? NavId : 0 1445 ImGuiID NavActivatePressedId; // ~~ IsNavInputPressed(ImGuiNavInput_Activate) ? NavId : 0 1446 ImGuiID NavInputId; // ~~ IsNavInputPressed(ImGuiNavInput_Input) ? NavId : 0 1447 ImGuiID NavJustTabbedId; // Just tabbed to this id. 1448 ImGuiID NavJustMovedToId; // Just navigated to this id (result of a successfully MoveRequest). 1449 ImGuiID NavJustMovedToFocusScopeId; // Just navigated to this focus scope id (result of a successfully MoveRequest). 1450 ImGuiKeyModFlags NavJustMovedToKeyMods; 1451 ImGuiID NavNextActivateId; // Set by ActivateItem(), queued until next frame. 1452 ImGuiInputSource NavInputSource; // Keyboard or Gamepad mode? THIS WILL ONLY BE None or NavGamepad or NavKeyboard. 1453 ImRect NavScoringRect; // Rectangle used for scoring, in screen space. Based of window->NavRectRel[], modified for directional navigation scoring. 1454 int NavScoringCount; // Metrics for debugging 1455 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. 1456 int NavIdTabCounter; // == NavWindow->DC.FocusIdxTabCounter at time of NavId processing 1457 bool NavIdIsAlive; // Nav widget has been seen this frame ~~ NavRectRel is valid 1458 bool NavMousePosDirty; // When set we will update mouse position if (io.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos) if set (NB: this not enabled by default) 1459 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) 1460 bool NavDisableMouseHover; // When user starts using gamepad/keyboard, we hide mouse hovering highlight until mouse is touched again. 1461 bool NavAnyRequest; // ~~ NavMoveRequest || NavInitRequest 1462 bool NavInitRequest; // Init request for appearing window to select first item 1463 bool NavInitRequestFromMove; 1464 ImGuiID NavInitResultId; // Init request result (first item of the window, or one for which SetItemDefaultFocus() was called) 1465 ImRect NavInitResultRectRel; // Init request result rectangle (relative to parent window) 1466 bool NavMoveRequest; // Move request for this frame 1467 ImGuiNavMoveFlags NavMoveRequestFlags; 1468 ImGuiNavForward NavMoveRequestForward; // None / ForwardQueued / ForwardActive (this is used to navigate sibling parent menus from a child menu) 1469 ImGuiKeyModFlags NavMoveRequestKeyMods; 1470 ImGuiDir NavMoveDir, NavMoveDirLast; // Direction of the move request (left/right/up/down), direction of the previous move request 1471 ImGuiDir NavMoveClipDir; // FIXME-NAV: Describe the purpose of this better. Might want to rename? 1472 ImGuiNavItemData NavMoveResultLocal; // Best move request candidate within NavWindow 1473 ImGuiNavItemData NavMoveResultLocalVisibleSet; // Best move request candidate within NavWindow that are mostly visible (when using ImGuiNavMoveFlags_AlsoScoreVisibleSet flag) 1474 ImGuiNavItemData NavMoveResultOther; // Best move request candidate within NavWindow's flattened hierarchy (when using ImGuiWindowFlags_NavFlattened flag) 1475 ImGuiWindow* NavWrapRequestWindow; // Window which requested trying nav wrap-around. 1476 ImGuiNavMoveFlags NavWrapRequestFlags; // Wrap-around operation flags. 1477 1478 // Navigation: Windowing (CTRL+TAB for list, or Menu button + keys or directional pads to move/resize) 1479 ImGuiWindow* NavWindowingTarget; // Target window when doing CTRL+Tab (or Pad Menu + FocusPrev/Next), this window is temporarily displayed top-most! 1480 ImGuiWindow* NavWindowingTargetAnim; // Record of last valid NavWindowingTarget until DimBgRatio and NavWindowingHighlightAlpha becomes 0.0f, so the fade-out can stay on it. 1481 ImGuiWindow* NavWindowingListWindow; // Internal window actually listing the CTRL+Tab contents 1482 float NavWindowingTimer; 1483 float NavWindowingHighlightAlpha; 1484 bool NavWindowingToggleLayer; 1485 1486 // Legacy Focus/Tabbing system (older than Nav, active even if Nav is disabled, misnamed. FIXME-NAV: This needs a redesign!) 1487 ImGuiWindow* TabFocusRequestCurrWindow; // 1488 ImGuiWindow* TabFocusRequestNextWindow; // 1489 int TabFocusRequestCurrCounterRegular; // Any item being requested for focus, stored as an index (we on layout to be stable between the frame pressing TAB and the next frame, semi-ouch) 1490 int TabFocusRequestCurrCounterTabStop; // Tab item being requested for focus, stored as an index 1491 int TabFocusRequestNextCounterRegular; // Stored for next frame 1492 int TabFocusRequestNextCounterTabStop; // " 1493 bool TabFocusPressed; // Set in NewFrame() when user pressed Tab 1494 1495 // Render 1496 float DimBgRatio; // 0.0..1.0 animation when fading in a dimming background (for modal window and CTRL+TAB list) 1497 ImGuiMouseCursor MouseCursor; 1498 1499 // Drag and Drop 1500 bool DragDropActive; 1501 bool DragDropWithinSource; // Set when within a BeginDragDropXXX/EndDragDropXXX block for a drag source. 1502 bool DragDropWithinTarget; // Set when within a BeginDragDropXXX/EndDragDropXXX block for a drag target. 1503 ImGuiDragDropFlags DragDropSourceFlags; 1504 int DragDropSourceFrameCount; 1505 int DragDropMouseButton; 1506 ImGuiPayload DragDropPayload; 1507 ImRect DragDropTargetRect; // Store rectangle of current target candidate (we favor small targets when overlapping) 1508 ImGuiID DragDropTargetId; 1509 ImGuiDragDropFlags DragDropAcceptFlags; 1510 float DragDropAcceptIdCurrRectSurface; // Target item surface (we resolve overlapping targets by prioritizing the smaller surface) 1511 ImGuiID DragDropAcceptIdCurr; // Target item id (set at the time of accepting the payload) 1512 ImGuiID DragDropAcceptIdPrev; // Target item id from previous frame (we need to store this to allow for overlapping drag and drop targets) 1513 int DragDropAcceptFrameCount; // Last time a target expressed a desire to accept the source 1514 ImGuiID DragDropHoldJustPressedId; // Set when holding a payload just made ButtonBehavior() return a press. 1515 ImVector<unsigned char> DragDropPayloadBufHeap; // We don't expose the ImVector<> directly, ImGuiPayload only holds pointer+size 1516 unsigned char DragDropPayloadBufLocal[16]; // Local buffer for small payloads 1517 1518 // Table 1519 ImGuiTable* CurrentTable; 1520 int CurrentTableStackIdx; 1521 ImPool<ImGuiTable> Tables; 1522 ImVector<ImGuiTableTempData> TablesTempDataStack; 1523 ImVector<float> TablesLastTimeActive; // Last used timestamp of each tables (SOA, for efficient GC) 1524 ImVector<ImDrawChannel> DrawChannelsTempMergeBuffer; 1525 1526 // Tab bars 1527 ImGuiTabBar* CurrentTabBar; 1528 ImPool<ImGuiTabBar> TabBars; 1529 ImVector<ImGuiPtrOrIndex> CurrentTabBarStack; 1530 ImVector<ImGuiShrinkWidthItem> ShrinkWidthBuffer; 1531 1532 // Widget state 1533 ImVec2 LastValidMousePos; 1534 ImGuiInputTextState InputTextState; 1535 ImFont InputTextPasswordFont; 1536 ImGuiID TempInputId; // Temporary text input when CTRL+clicking on a slider, etc. 1537 ImGuiColorEditFlags ColorEditOptions; // Store user options for color edit widgets 1538 float ColorEditLastHue; // Backup of last Hue associated to LastColor[3], so we can restore Hue in lossy RGB<>HSV round trips 1539 float ColorEditLastSat; // Backup of last Saturation associated to LastColor[3], so we can restore Saturation in lossy RGB<>HSV round trips 1540 float ColorEditLastColor[3]; 1541 ImVec4 ColorPickerRef; // Initial/reference color at the time of opening the color picker. 1542 float SliderCurrentAccum; // Accumulated slider delta when using navigation controls. 1543 bool SliderCurrentAccumDirty; // Has the accumulated slider delta changed since last time we tried to apply it? 1544 bool DragCurrentAccumDirty; 1545 float DragCurrentAccum; // Accumulator for dragging modification. Always high-precision, not rounded by end-user precision settings 1546 float DragSpeedDefaultRatio; // If speed == 0.0f, uses (max-min) * DragSpeedDefaultRatio 1547 float ScrollbarClickDeltaToGrabCenter; // Distance between mouse and center of grab box, normalized in parent space. Use storage? 1548 int TooltipOverrideCount; 1549 float TooltipSlowDelay; // Time before slow tooltips appears (FIXME: This is temporary until we merge in tooltip timer+priority work) 1550 ImVector<char> ClipboardHandlerData; // If no custom clipboard handler is defined 1551 ImVector<ImGuiID> MenusIdSubmittedThisFrame; // A list of menu IDs that were rendered at least once 1552 1553 // Platform support 1554 ImVec2 PlatformImePos; // Cursor position request & last passed to the OS Input Method Editor 1555 ImVec2 PlatformImeLastPos; 1556 char PlatformLocaleDecimalPoint; // '.' or *localeconv()->decimal_point 1557 1558 // Settings 1559 bool SettingsLoaded; 1560 float SettingsDirtyTimer; // Save .ini Settings to memory when time reaches zero 1561 ImGuiTextBuffer SettingsIniData; // In memory .ini settings 1562 ImVector<ImGuiSettingsHandler> SettingsHandlers; // List of .ini settings handlers 1563 ImChunkStream<ImGuiWindowSettings> SettingsWindows; // ImGuiWindow .ini settings entries 1564 ImChunkStream<ImGuiTableSettings> SettingsTables; // ImGuiTable .ini settings entries 1565 ImVector<ImGuiContextHook> Hooks; // Hooks for extensions (e.g. test engine) 1566 ImGuiID HookIdNext; // Next available HookId 1567 1568 // Capture/Logging 1569 bool LogEnabled; // Currently capturing 1570 ImGuiLogType LogType; // Capture target 1571 ImFileHandle LogFile; // If != NULL log to stdout/ file 1572 ImGuiTextBuffer LogBuffer; // Accumulation buffer when log to clipboard. This is pointer so our GImGui static constructor doesn't call heap allocators. 1573 const char* LogNextPrefix; 1574 const char* LogNextSuffix; 1575 float LogLinePosY; 1576 bool LogLineFirstItem; 1577 int LogDepthRef; 1578 int LogDepthToExpand; 1579 int LogDepthToExpandDefault; // Default/stored value for LogDepthMaxExpand if not specified in the LogXXX function call. 1580 1581 // Debug Tools 1582 bool DebugItemPickerActive; // Item picker is active (started with DebugStartItemPicker()) 1583 ImGuiID DebugItemPickerBreakId; // Will call IM_DEBUG_BREAK() when encountering this id 1584 ImGuiMetricsConfig DebugMetricsConfig; 1585 1586 // Misc 1587 float FramerateSecPerFrame[120]; // Calculate estimate of framerate for user over the last 2 seconds. 1588 int FramerateSecPerFrameIdx; 1589 int FramerateSecPerFrameCount; 1590 float FramerateSecPerFrameAccum; 1591 int WantCaptureMouseNextFrame; // Explicit capture via CaptureKeyboardFromApp()/CaptureMouseFromApp() sets those flags 1592 int WantCaptureKeyboardNextFrame; 1593 int WantTextInputNextFrame; 1594 char TempBuffer[1024 * 3 + 1]; // Temporary text buffer 1595 1596 ImGuiContext(ImFontAtlas* shared_font_atlas) 1597 { 1598 Initialized = false; 1599 FontAtlasOwnedByContext = shared_font_atlas ? false : true; 1600 Font = NULL; 1601 FontSize = FontBaseSize = 0.0f; 1602 IO.Fonts = shared_font_atlas ? shared_font_atlas : IM_NEW(ImFontAtlas)(); 1603 Time = 0.0f; 1604 FrameCount = 0; 1605 FrameCountEnded = FrameCountRendered = -1; 1606 WithinFrameScope = WithinFrameScopeWithImplicitWindow = WithinEndChild = false; 1607 GcCompactAll = false; 1608 TestEngineHookItems = false; 1609 TestEngineHookIdInfo = 0; 1610 TestEngine = NULL; 1611 1612 WindowsActiveCount = 0; 1613 CurrentWindow = NULL; 1614 HoveredWindow = NULL; 1615 HoveredWindowUnderMovingWindow = NULL; 1616 MovingWindow = NULL; 1617 WheelingWindow = NULL; 1618 WheelingWindowTimer = 0.0f; 1619 1620 CurrentItemFlags = ImGuiItemFlags_None; 1621 HoveredId = HoveredIdPreviousFrame = 0; 1622 HoveredIdAllowOverlap = false; 1623 HoveredIdUsingMouseWheel = HoveredIdPreviousFrameUsingMouseWheel = false; 1624 HoveredIdDisabled = false; 1625 HoveredIdTimer = HoveredIdNotActiveTimer = 0.0f; 1626 ActiveId = 0; 1627 ActiveIdIsAlive = 0; 1628 ActiveIdTimer = 0.0f; 1629 ActiveIdIsJustActivated = false; 1630 ActiveIdAllowOverlap = false; 1631 ActiveIdNoClearOnFocusLoss = false; 1632 ActiveIdHasBeenPressedBefore = false; 1633 ActiveIdHasBeenEditedBefore = false; 1634 ActiveIdHasBeenEditedThisFrame = false; 1635 ActiveIdUsingMouseWheel = false; 1636 ActiveIdUsingNavDirMask = 0x00; 1637 ActiveIdUsingNavInputMask = 0x00; 1638 ActiveIdUsingKeyInputMask = 0x00; 1639 ActiveIdClickOffset = ImVec2(-1, -1); 1640 ActiveIdWindow = NULL; 1641 ActiveIdSource = ImGuiInputSource_None; 1642 ActiveIdMouseButton = -1; 1643 ActiveIdPreviousFrame = 0; 1644 ActiveIdPreviousFrameIsAlive = false; 1645 ActiveIdPreviousFrameHasBeenEditedBefore = false; 1646 ActiveIdPreviousFrameWindow = NULL; 1647 LastActiveId = 0; 1648 LastActiveIdTimer = 0.0f; 1649 1650 NavWindow = NULL; 1651 NavId = NavFocusScopeId = NavActivateId = NavActivateDownId = NavActivatePressedId = NavInputId = 0; 1652 NavJustTabbedId = NavJustMovedToId = NavJustMovedToFocusScopeId = NavNextActivateId = 0; 1653 NavJustMovedToKeyMods = ImGuiKeyModFlags_None; 1654 NavInputSource = ImGuiInputSource_None; 1655 NavScoringRect = ImRect(); 1656 NavScoringCount = 0; 1657 NavLayer = ImGuiNavLayer_Main; 1658 NavIdTabCounter = INT_MAX; 1659 NavIdIsAlive = false; 1660 NavMousePosDirty = false; 1661 NavDisableHighlight = true; 1662 NavDisableMouseHover = false; 1663 NavAnyRequest = false; 1664 NavInitRequest = false; 1665 NavInitRequestFromMove = false; 1666 NavInitResultId = 0; 1667 NavMoveRequest = false; 1668 NavMoveRequestFlags = ImGuiNavMoveFlags_None; 1669 NavMoveRequestForward = ImGuiNavForward_None; 1670 NavMoveRequestKeyMods = ImGuiKeyModFlags_None; 1671 NavMoveDir = NavMoveDirLast = NavMoveClipDir = ImGuiDir_None; 1672 NavWrapRequestWindow = NULL; 1673 NavWrapRequestFlags = ImGuiNavMoveFlags_None; 1674 1675 NavWindowingTarget = NavWindowingTargetAnim = NavWindowingListWindow = NULL; 1676 NavWindowingTimer = NavWindowingHighlightAlpha = 0.0f; 1677 NavWindowingToggleLayer = false; 1678 1679 TabFocusRequestCurrWindow = TabFocusRequestNextWindow = NULL; 1680 TabFocusRequestCurrCounterRegular = TabFocusRequestCurrCounterTabStop = INT_MAX; 1681 TabFocusRequestNextCounterRegular = TabFocusRequestNextCounterTabStop = INT_MAX; 1682 TabFocusPressed = false; 1683 1684 DimBgRatio = 0.0f; 1685 MouseCursor = ImGuiMouseCursor_Arrow; 1686 1687 DragDropActive = DragDropWithinSource = DragDropWithinTarget = false; 1688 DragDropSourceFlags = ImGuiDragDropFlags_None; 1689 DragDropSourceFrameCount = -1; 1690 DragDropMouseButton = -1; 1691 DragDropTargetId = 0; 1692 DragDropAcceptFlags = ImGuiDragDropFlags_None; 1693 DragDropAcceptIdCurrRectSurface = 0.0f; 1694 DragDropAcceptIdPrev = DragDropAcceptIdCurr = 0; 1695 DragDropAcceptFrameCount = -1; 1696 DragDropHoldJustPressedId = 0; 1697 memset(DragDropPayloadBufLocal, 0, sizeof(DragDropPayloadBufLocal)); 1698 1699 CurrentTable = NULL; 1700 CurrentTableStackIdx = -1; 1701 CurrentTabBar = NULL; 1702 1703 LastValidMousePos = ImVec2(0.0f, 0.0f); 1704 TempInputId = 0; 1705 ColorEditOptions = ImGuiColorEditFlags__OptionsDefault; 1706 ColorEditLastHue = ColorEditLastSat = 0.0f; 1707 ColorEditLastColor[0] = ColorEditLastColor[1] = ColorEditLastColor[2] = FLT_MAX; 1708 SliderCurrentAccum = 0.0f; 1709 SliderCurrentAccumDirty = false; 1710 DragCurrentAccumDirty = false; 1711 DragCurrentAccum = 0.0f; 1712 DragSpeedDefaultRatio = 1.0f / 100.0f; 1713 ScrollbarClickDeltaToGrabCenter = 0.0f; 1714 TooltipOverrideCount = 0; 1715 TooltipSlowDelay = 0.50f; 1716 1717 PlatformImePos = PlatformImeLastPos = ImVec2(FLT_MAX, FLT_MAX); 1718 PlatformLocaleDecimalPoint = '.'; 1719 1720 SettingsLoaded = false; 1721 SettingsDirtyTimer = 0.0f; 1722 HookIdNext = 0; 1723 1724 LogEnabled = false; 1725 LogType = ImGuiLogType_None; 1726 LogNextPrefix = LogNextSuffix = NULL; 1727 LogFile = NULL; 1728 LogLinePosY = FLT_MAX; 1729 LogLineFirstItem = false; 1730 LogDepthRef = 0; 1731 LogDepthToExpand = LogDepthToExpandDefault = 2; 1732 1733 DebugItemPickerActive = false; 1734 DebugItemPickerBreakId = 0; 1735 1736 memset(FramerateSecPerFrame, 0, sizeof(FramerateSecPerFrame)); 1737 FramerateSecPerFrameIdx = FramerateSecPerFrameCount = 0; 1738 FramerateSecPerFrameAccum = 0.0f; 1739 WantCaptureMouseNextFrame = WantCaptureKeyboardNextFrame = WantTextInputNextFrame = -1; 1740 memset(TempBuffer, 0, sizeof(TempBuffer)); 1741 } 1742 }; 1743 1744 //----------------------------------------------------------------------------- 1745 // [SECTION] ImGuiWindowTempData, ImGuiWindow 1746 //----------------------------------------------------------------------------- 1747 1748 // Transient per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the DC variable name in ImGuiWindow. 1749 // (That's theory, in practice the delimitation between ImGuiWindow and ImGuiWindowTempData is quite tenuous and could be reconsidered..) 1750 // (This doesn't need a constructor because we zero-clear it as part of ImGuiWindow and all frame-temporary data are setup on Begin) 1751 struct IMGUI_API ImGuiWindowTempData 1752 { 1753 // Layout 1754 ImVec2 CursorPos; // Current emitting position, in absolute coordinates. 1755 ImVec2 CursorPosPrevLine; 1756 ImVec2 CursorStartPos; // Initial position after Begin(), generally ~ window position + WindowPadding. 1757 ImVec2 CursorMaxPos; // Used to implicitly calculate ContentSize at the beginning of next frame, for scrolling range and auto-resize. Always growing during the frame. 1758 ImVec2 IdealMaxPos; // Used to implicitly calculate ContentSizeIdeal at the beginning of next frame, for auto-resize only. Always growing during the frame. 1759 ImVec2 CurrLineSize; 1760 ImVec2 PrevLineSize; 1761 float CurrLineTextBaseOffset; // Baseline offset (0.0f by default on a new line, generally == style.FramePadding.y when a framed item has been added). 1762 float PrevLineTextBaseOffset; 1763 ImVec1 Indent; // Indentation / start position from left of window (increased by TreePush/TreePop, etc.) 1764 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. 1765 ImVec1 GroupOffset; 1766 1767 // Last item status 1768 ImGuiID LastItemId; // ID for last item 1769 ImGuiItemStatusFlags LastItemStatusFlags; // Status flags for last item (see ImGuiItemStatusFlags_) 1770 ImRect LastItemRect; // Interaction rect for last item 1771 ImRect LastItemDisplayRect; // End-user display rect for last item (only valid if LastItemStatusFlags & ImGuiItemStatusFlags_HasDisplayRect) 1772 1773 // Keyboard/Gamepad navigation 1774 ImGuiNavLayer NavLayerCurrent; // Current layer, 0..31 (we currently only use 0..1) 1775 short NavLayersActiveMask; // Which layers have been written to (result from previous frame) 1776 short NavLayersActiveMaskNext;// Which layers have been written to (accumulator for current frame) 1777 ImGuiID NavFocusScopeIdCurrent; // Current focus scope ID while appending 1778 bool NavHideHighlightOneFrame; 1779 bool NavHasScroll; // Set when scrolling can be used (ScrollMax > 0.0f) 1780 1781 // Miscellaneous 1782 bool MenuBarAppending; // FIXME: Remove this 1783 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. 1784 ImGuiMenuColumns MenuColumns; // Simplified columns storage for menu items measurement 1785 int TreeDepth; // Current tree depth. 1786 ImU32 TreeJumpToParentOnPopMask; // Store a copy of !g.NavIdIsAlive for TreeDepth 0..31.. Could be turned into a ImU64 if necessary. 1787 ImVector<ImGuiWindow*> ChildWindows; 1788 ImGuiStorage* StateStorage; // Current persistent per-window storage (store e.g. tree node open/close state) 1789 ImGuiOldColumns* CurrentColumns; // Current columns set 1790 int CurrentTableIdx; // Current table index (into g.Tables) 1791 ImGuiLayoutType LayoutType; 1792 ImGuiLayoutType ParentLayoutType; // Layout type of parent window at the time of Begin() 1793 int FocusCounterRegular; // (Legacy Focus/Tabbing system) Sequential counter, start at -1 and increase as assigned via FocusableItemRegister() (FIXME-NAV: Needs redesign) 1794 int FocusCounterTabStop; // (Legacy Focus/Tabbing system) Same, but only count widgets which you can Tab through. 1795 1796 // Local parameters stacks 1797 // 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. 1798 float ItemWidth; // Current item width (>0.0: width in pixels, <0.0: align xx pixels to the right of window). 1799 float TextWrapPos; // Current text wrap pos. 1800 ImVector<float> ItemWidthStack; // Store item widths to restore (attention: .back() is not == ItemWidth) 1801 ImVector<float> TextWrapPosStack; // Store text wrap pos to restore (attention: .back() is not == TextWrapPos) 1802 ImGuiStackSizes StackSizesOnBegin; // Store size of various stacks for asserting 1803 }; 1804 1805 // Storage for one window 1806 struct IMGUI_API ImGuiWindow 1807 { 1808 char* Name; // Window name, owned by the window. 1809 ImGuiID ID; // == ImHashStr(Name) 1810 ImGuiWindowFlags Flags; // See enum ImGuiWindowFlags_ 1811 ImVec2 Pos; // Position (always rounded-up to nearest pixel) 1812 ImVec2 Size; // Current size (==SizeFull or collapsed title bar size) 1813 ImVec2 SizeFull; // Size when non collapsed 1814 ImVec2 ContentSize; // Size of contents/scrollable client area (calculated from the extents reach of the cursor) from previous frame. Does not include window decoration or window padding. 1815 ImVec2 ContentSizeIdeal; 1816 ImVec2 ContentSizeExplicit; // Size of contents/scrollable client area explicitly request by the user via SetNextWindowContentSize(). 1817 ImVec2 WindowPadding; // Window padding at the time of Begin(). 1818 float WindowRounding; // Window rounding at the time of Begin(). May be clamped lower to avoid rendering artifacts with title bar, menu bar etc. 1819 float WindowBorderSize; // Window border size at the time of Begin(). 1820 int NameBufLen; // Size of buffer storing Name. May be larger than strlen(Name)! 1821 ImGuiID MoveId; // == window->GetID("#MOVE") 1822 ImGuiID ChildId; // ID of corresponding item in parent window (for navigation to return from child window to parent window) 1823 ImVec2 Scroll; 1824 ImVec2 ScrollMax; 1825 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) 1826 ImVec2 ScrollTargetCenterRatio; // 0.0f = scroll so that target position is at top, 0.5f = scroll so that target position is centered 1827 ImVec2 ScrollTargetEdgeSnapDist; // 0.0f = no snapping, >0.0f snapping threshold 1828 ImVec2 ScrollbarSizes; // Size taken by each scrollbars on their smaller axis. Pay attention! ScrollbarSizes.x == width of the vertical scrollbar, ScrollbarSizes.y = height of the horizontal scrollbar. 1829 bool ScrollbarX, ScrollbarY; // Are scrollbars visible? 1830 bool Active; // Set to true on Begin(), unless Collapsed 1831 bool WasActive; 1832 bool WriteAccessed; // Set to true when any widget access the current window 1833 bool Collapsed; // Set when collapsing window to become only title-bar 1834 bool WantCollapseToggle; 1835 bool SkipItems; // Set when items can safely be all clipped (e.g. window not visible or collapsed) 1836 bool Appearing; // Set during the frame where the window is appearing (or re-appearing) 1837 bool Hidden; // Do not display (== HiddenFrames*** > 0) 1838 bool IsFallbackWindow; // Set on the "Debug##Default" window. 1839 bool HasCloseButton; // Set when the window has a close button (p_open != NULL) 1840 signed char ResizeBorderHeld; // Current border being held for resize (-1: none, otherwise 0-3) 1841 short BeginCount; // Number of Begin() during the current frame (generally 0 or 1, 1+ if appending via multiple Begin/End pairs) 1842 short BeginOrderWithinParent; // Begin() order within immediate parent window, if we are a child window. Otherwise 0. 1843 short BeginOrderWithinContext; // Begin() order within entire imgui context. This is mostly used for debugging submission order related issues. 1844 short FocusOrder; // Order within WindowsFocusOrder[], altered when windows are focused. 1845 ImGuiID PopupId; // ID in the popup stack when this window is used as a popup/menu (because we use generic Name/ID for recycling) 1846 ImS8 AutoFitFramesX, AutoFitFramesY; 1847 ImS8 AutoFitChildAxises; 1848 bool AutoFitOnlyGrows; 1849 ImGuiDir AutoPosLastDirection; 1850 ImS8 HiddenFramesCanSkipItems; // Hide the window for N frames 1851 ImS8 HiddenFramesCannotSkipItems; // Hide the window for N frames while allowing items to be submitted so we can measure their size 1852 ImS8 HiddenFramesForRenderOnly; // Hide the window until frame N at Render() time only 1853 ImS8 DisableInputsFrames; // Disable window interactions for N frames 1854 ImGuiCond SetWindowPosAllowFlags : 8; // store acceptable condition flags for SetNextWindowPos() use. 1855 ImGuiCond SetWindowSizeAllowFlags : 8; // store acceptable condition flags for SetNextWindowSize() use. 1856 ImGuiCond SetWindowCollapsedAllowFlags : 8; // store acceptable condition flags for SetNextWindowCollapsed() use. 1857 ImVec2 SetWindowPosVal; // store window position when using a non-zero Pivot (position set needs to be processed when we know the window size) 1858 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. 1859 1860 ImVector<ImGuiID> IDStack; // ID stack. ID are hashes seeded with the value at the top of the stack. (In theory this should be in the TempData structure) 1861 ImGuiWindowTempData DC; // Temporary per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the "DC" variable name. 1862 1863 // The best way to understand what those rectangles are is to use the 'Metrics->Tools->Show Windows Rectangles' viewer. 1864 // The main 'OuterRect', omitted as a field, is window->Rect(). 1865 ImRect OuterRectClipped; // == Window->Rect() just after setup in Begin(). == window->Rect() for root window. 1866 ImRect InnerRect; // Inner rectangle (omit title bar, menu bar, scroll bar) 1867 ImRect InnerClipRect; // == InnerRect shrunk by WindowPadding*0.5f on each side, clipped within viewport or parent clip rect. 1868 ImRect WorkRect; // Initially covers the whole scrolling region. Reduced by containers e.g columns/tables when active. Shrunk by WindowPadding*1.0f on each side. This is meant to replace ContentRegionRect over time (from 1.71+ onward). 1869 ImRect ParentWorkRect; // Backup of WorkRect before entering a container such as columns/tables. Used by e.g. SpanAllColumns functions to easily access. Stacked containers are responsible for maintaining this. // FIXME-WORKRECT: Could be a stack? 1870 ImRect ClipRect; // Current clipping/scissoring rectangle, evolve as we are using PushClipRect(), etc. == DrawList->clip_rect_stack.back(). 1871 ImRect ContentRegionRect; // FIXME: This is currently confusing/misleading. It is essentially WorkRect but not handling of scrolling. We currently rely on it as right/bottom aligned sizing operation need some size to rely on. 1872 ImVec2ih HitTestHoleSize; // Define an optional rectangular hole where mouse will pass-through the window. 1873 ImVec2ih HitTestHoleOffset; 1874 1875 int LastFrameActive; // Last frame number the window was Active. 1876 float LastTimeActive; // Last timestamp the window was Active (using float as we don't need high precision there) 1877 float ItemWidthDefault; 1878 ImGuiStorage StateStorage; 1879 ImVector<ImGuiOldColumns> ColumnsStorage; 1880 float FontWindowScale; // User scale multiplier per-window, via SetWindowFontScale() 1881 int SettingsOffset; // Offset into SettingsWindows[] (offsets are always valid as we only grow the array from the back) 1882 1883 ImDrawList* DrawList; // == &DrawListInst (for backward compatibility reason with code using imgui_internal.h we keep this a pointer) 1884 ImDrawList DrawListInst; 1885 ImGuiWindow* ParentWindow; // If we are a child _or_ popup window, this is pointing to our parent. Otherwise NULL. 1886 ImGuiWindow* RootWindow; // Point to ourself or first ancestor that is not a child window == Top-level window. 1887 ImGuiWindow* RootWindowForTitleBarHighlight; // Point to ourself or first ancestor which will display TitleBgActive color when this window is active. 1888 ImGuiWindow* RootWindowForNav; // Point to ourself or first ancestor which doesn't have the NavFlattened flag. 1889 1890 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.) 1891 ImGuiID NavLastIds[ImGuiNavLayer_COUNT]; // Last known NavId for this window, per layer (0/1) 1892 ImRect NavRectRel[ImGuiNavLayer_COUNT]; // Reference rectangle, in window relative space 1893 1894 int MemoryDrawListIdxCapacity; // Backup of last idx/vtx count, so when waking up the window we can preallocate and avoid iterative alloc/copy 1895 int MemoryDrawListVtxCapacity; 1896 bool MemoryCompacted; // Set when window extraneous data have been garbage collected 1897 1898 public: 1899 ImGuiWindow(ImGuiContext* context, const char* name); 1900 ~ImGuiWindow(); 1901 1902 ImGuiID GetID(const char* str, const char* str_end = NULL); 1903 ImGuiID GetID(const void* ptr); 1904 ImGuiID GetID(int n); 1905 ImGuiID GetIDNoKeepAlive(const char* str, const char* str_end = NULL); 1906 ImGuiID GetIDNoKeepAlive(const void* ptr); 1907 ImGuiID GetIDNoKeepAlive(int n); 1908 ImGuiID GetIDFromRectangle(const ImRect& r_abs); 1909 1910 // We don't use g.FontSize because the window may be != g.CurrentWidow. 1911 ImRect Rect() const { return ImRect(Pos.x, Pos.y, Pos.x + Size.x, Pos.y + Size.y); } 1912 float CalcFontSize() const { ImGuiContext& g = *GImGui; float scale = g.FontBaseSize * FontWindowScale; if (ParentWindow) scale *= ParentWindow->FontWindowScale; return scale; } 1913 float TitleBarHeight() const { ImGuiContext& g = *GImGui; return (Flags & ImGuiWindowFlags_NoTitleBar) ? 0.0f : CalcFontSize() + g.Style.FramePadding.y * 2.0f; } 1914 ImRect TitleBarRect() const { return ImRect(Pos, ImVec2(Pos.x + SizeFull.x, Pos.y + TitleBarHeight())); } 1915 float MenuBarHeight() const { ImGuiContext& g = *GImGui; return (Flags & ImGuiWindowFlags_MenuBar) ? DC.MenuBarOffset.y + CalcFontSize() + g.Style.FramePadding.y * 2.0f : 0.0f; } 1916 ImRect MenuBarRect() const { float y1 = Pos.y + TitleBarHeight(); return ImRect(Pos.x, y1, Pos.x + SizeFull.x, y1 + MenuBarHeight()); } 1917 }; 1918 1919 // 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. 1920 struct ImGuiLastItemDataBackup 1921 { 1922 ImGuiID LastItemId; 1923 ImGuiItemStatusFlags LastItemStatusFlags; 1924 ImRect LastItemRect; 1925 ImRect LastItemDisplayRect; 1926 1927 ImGuiLastItemDataBackup() { Backup(); } 1928 void Backup() { ImGuiWindow* window = GImGui->CurrentWindow; LastItemId = window->DC.LastItemId; LastItemStatusFlags = window->DC.LastItemStatusFlags; LastItemRect = window->DC.LastItemRect; LastItemDisplayRect = window->DC.LastItemDisplayRect; } 1929 void Restore() const { ImGuiWindow* window = GImGui->CurrentWindow; window->DC.LastItemId = LastItemId; window->DC.LastItemStatusFlags = LastItemStatusFlags; window->DC.LastItemRect = LastItemRect; window->DC.LastItemDisplayRect = LastItemDisplayRect; } 1930 }; 1931 1932 //----------------------------------------------------------------------------- 1933 // [SECTION] Tab bar, Tab item support 1934 //----------------------------------------------------------------------------- 1935 1936 // Extend ImGuiTabBarFlags_ 1937 enum ImGuiTabBarFlagsPrivate_ 1938 { 1939 ImGuiTabBarFlags_DockNode = 1 << 20, // Part of a dock node [we don't use this in the master branch but it facilitate branch syncing to keep this around] 1940 ImGuiTabBarFlags_IsFocused = 1 << 21, 1941 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 1942 }; 1943 1944 // Extend ImGuiTabItemFlags_ 1945 enum ImGuiTabItemFlagsPrivate_ 1946 { 1947 ImGuiTabItemFlags_SectionMask_ = ImGuiTabItemFlags_Leading | ImGuiTabItemFlags_Trailing, 1948 ImGuiTabItemFlags_NoCloseButton = 1 << 20, // Track whether p_open was set or not (we'll need this info on the next frame to recompute ContentWidth during layout) 1949 ImGuiTabItemFlags_Button = 1 << 21 // Used by TabItemButton, change the tab item behavior to mimic a button 1950 }; 1951 1952 // Storage for one active tab item (sizeof() 28~32 bytes) 1953 struct ImGuiTabItem 1954 { 1955 ImGuiID ID; 1956 ImGuiTabItemFlags Flags; 1957 int LastFrameVisible; 1958 int LastFrameSelected; // This allows us to infer an ordered list of the last activated tabs with little maintenance 1959 float Offset; // Position relative to beginning of tab 1960 float Width; // Width currently displayed 1961 float ContentWidth; // Width of label, stored during BeginTabItem() call 1962 ImS16 NameOffset; // When Window==NULL, offset to name within parent ImGuiTabBar::TabsNames 1963 ImS16 BeginOrder; // BeginTabItem() order, used to re-order tabs after toggling ImGuiTabBarFlags_Reorderable 1964 ImS16 IndexDuringLayout; // Index only used during TabBarLayout() 1965 bool WantClose; // Marked as closed by SetTabItemClosed() 1966 1967 ImGuiTabItem() { memset(this, 0, sizeof(*this)); LastFrameVisible = LastFrameSelected = -1; NameOffset = BeginOrder = IndexDuringLayout = -1; } 1968 }; 1969 1970 // Storage for a tab bar (sizeof() 152 bytes) 1971 struct ImGuiTabBar 1972 { 1973 ImVector<ImGuiTabItem> Tabs; 1974 ImGuiTabBarFlags Flags; 1975 ImGuiID ID; // Zero for tab-bars used by docking 1976 ImGuiID SelectedTabId; // Selected tab/window 1977 ImGuiID NextSelectedTabId; // Next selected tab/window. Will also trigger a scrolling animation 1978 ImGuiID VisibleTabId; // Can occasionally be != SelectedTabId (e.g. when previewing contents for CTRL+TAB preview) 1979 int CurrFrameVisible; 1980 int PrevFrameVisible; 1981 ImRect BarRect; 1982 float CurrTabsContentsHeight; 1983 float PrevTabsContentsHeight; // Record the height of contents submitted below the tab bar 1984 float WidthAllTabs; // Actual width of all tabs (locked during layout) 1985 float WidthAllTabsIdeal; // Ideal width if all tabs were visible and not clipped 1986 float ScrollingAnim; 1987 float ScrollingTarget; 1988 float ScrollingTargetDistToVisibility; 1989 float ScrollingSpeed; 1990 float ScrollingRectMinX; 1991 float ScrollingRectMaxX; 1992 ImGuiID ReorderRequestTabId; 1993 ImS16 ReorderRequestOffset; 1994 ImS8 BeginCount; 1995 bool WantLayout; 1996 bool VisibleTabWasSubmitted; 1997 bool TabsAddedNew; // Set to true when a new tab item or button has been added to the tab bar during last frame 1998 ImS16 TabsActiveCount; // Number of tabs submitted this frame. 1999 ImS16 LastTabItemIdx; // Index of last BeginTabItem() tab for use by EndTabItem() 2000 float ItemSpacingY; 2001 ImVec2 FramePadding; // style.FramePadding locked at the time of BeginTabBar() 2002 ImVec2 BackupCursorPos; 2003 ImGuiTextBuffer TabsNames; // For non-docking tab bar we re-append names in a contiguous buffer. 2004 2005 ImGuiTabBar(); 2006 int GetTabOrder(const ImGuiTabItem* tab) const { return Tabs.index_from_ptr(tab); } 2007 const char* GetTabName(const ImGuiTabItem* tab) const 2008 { 2009 IM_ASSERT(tab->NameOffset != -1 && (int)tab->NameOffset < TabsNames.Buf.Size); 2010 return TabsNames.Buf.Data + tab->NameOffset; 2011 } 2012 }; 2013 2014 //----------------------------------------------------------------------------- 2015 // [SECTION] Table support 2016 //----------------------------------------------------------------------------- 2017 2018 #define IM_COL32_DISABLE IM_COL32(0,0,0,1) // Special sentinel code which cannot be used as a regular color. 2019 #define IMGUI_TABLE_MAX_COLUMNS 64 // sizeof(ImU64) * 8. This is solely because we frequently encode columns set in a ImU64. 2020 #define IMGUI_TABLE_MAX_DRAW_CHANNELS (4 + 64 * 2) // See TableSetupDrawChannels() 2021 2022 // Our current column maximum is 64 but we may raise that in the future. 2023 typedef ImS8 ImGuiTableColumnIdx; 2024 typedef ImU8 ImGuiTableDrawChannelIdx; 2025 2026 // [Internal] sizeof() ~ 104 2027 // We use the terminology "Enabled" to refer to a column that is not Hidden by user/api. 2028 // We use the terminology "Clipped" to refer to a column that is out of sight because of scrolling/clipping. 2029 // This is in contrast with some user-facing api such as IsItemVisible() / IsRectVisible() which use "Visible" to mean "not clipped". 2030 struct ImGuiTableColumn 2031 { 2032 ImGuiTableColumnFlags Flags; // Flags after some patching (not directly same as provided by user). See ImGuiTableColumnFlags_ 2033 float WidthGiven; // Final/actual width visible == (MaxX - MinX), locked in TableUpdateLayout(). May be > WidthRequest to honor minimum width, may be < WidthRequest to honor shrinking columns down in tight space. 2034 float MinX; // Absolute positions 2035 float MaxX; 2036 float WidthRequest; // Master width absolute value when !(Flags & _WidthStretch). When Stretch this is derived every frame from StretchWeight in TableUpdateLayout() 2037 float WidthAuto; // Automatic width 2038 float StretchWeight; // Master width weight when (Flags & _WidthStretch). Often around ~1.0f initially. 2039 float InitStretchWeightOrWidth; // Value passed to TableSetupColumn(). For Width it is a content width (_without padding_). 2040 ImRect ClipRect; // Clipping rectangle for the column 2041 ImGuiID UserID; // Optional, value passed to TableSetupColumn() 2042 float WorkMinX; // Contents region min ~(MinX + CellPaddingX + CellSpacingX1) == cursor start position when entering column 2043 float WorkMaxX; // Contents region max ~(MaxX - CellPaddingX - CellSpacingX2) 2044 float ItemWidth; // Current item width for the column, preserved across rows 2045 float ContentMaxXFrozen; // Contents maximum position for frozen rows (apart from headers), from which we can infer content width. 2046 float ContentMaxXUnfrozen; 2047 float ContentMaxXHeadersUsed; // Contents maximum position for headers rows (regardless of freezing). TableHeader() automatically softclip itself + report ideal desired size, to avoid creating extraneous draw calls 2048 float ContentMaxXHeadersIdeal; 2049 ImS16 NameOffset; // Offset into parent ColumnsNames[] 2050 ImGuiTableColumnIdx DisplayOrder; // Index within Table's IndexToDisplayOrder[] (column may be reordered by users) 2051 ImGuiTableColumnIdx IndexWithinEnabledSet; // Index within enabled/visible set (<= IndexToDisplayOrder) 2052 ImGuiTableColumnIdx PrevEnabledColumn; // Index of prev enabled/visible column within Columns[], -1 if first enabled/visible column 2053 ImGuiTableColumnIdx NextEnabledColumn; // Index of next enabled/visible column within Columns[], -1 if last enabled/visible column 2054 ImGuiTableColumnIdx SortOrder; // Index of this column within sort specs, -1 if not sorting on this column, 0 for single-sort, may be >0 on multi-sort 2055 ImGuiTableDrawChannelIdx DrawChannelCurrent; // Index within DrawSplitter.Channels[] 2056 ImGuiTableDrawChannelIdx DrawChannelFrozen; 2057 ImGuiTableDrawChannelIdx DrawChannelUnfrozen; 2058 bool IsEnabled; // Is the column not marked Hidden by the user? (even if off view, e.g. clipped by scrolling). 2059 bool IsEnabledNextFrame; 2060 bool IsVisibleX; // Is actually in view (e.g. overlapping the host window clipping rectangle, not scrolled). 2061 bool IsVisibleY; 2062 bool IsRequestOutput; // Return value for TableSetColumnIndex() / TableNextColumn(): whether we request user to output contents or not. 2063 bool IsSkipItems; // Do we want item submissions to this column to be completely ignored (no layout will happen). 2064 bool IsPreserveWidthAuto; 2065 ImS8 NavLayerCurrent; // ImGuiNavLayer in 1 byte 2066 ImU8 AutoFitQueue; // Queue of 8 values for the next 8 frames to request auto-fit 2067 ImU8 CannotSkipItemsQueue; // Queue of 8 values for the next 8 frames to disable Clipped/SkipItem 2068 ImU8 SortDirection : 2; // ImGuiSortDirection_Ascending or ImGuiSortDirection_Descending 2069 ImU8 SortDirectionsAvailCount : 2; // Number of available sort directions (0 to 3) 2070 ImU8 SortDirectionsAvailMask : 4; // Mask of available sort directions (1-bit each) 2071 ImU8 SortDirectionsAvailList; // Ordered of available sort directions (2-bits each) 2072 2073 ImGuiTableColumn() 2074 { 2075 memset(this, 0, sizeof(*this)); 2076 StretchWeight = WidthRequest = -1.0f; 2077 NameOffset = -1; 2078 DisplayOrder = IndexWithinEnabledSet = -1; 2079 PrevEnabledColumn = NextEnabledColumn = -1; 2080 SortOrder = -1; 2081 SortDirection = ImGuiSortDirection_None; 2082 DrawChannelCurrent = DrawChannelFrozen = DrawChannelUnfrozen = (ImU8)-1; 2083 } 2084 }; 2085 2086 // Transient cell data stored per row. 2087 // sizeof() ~ 6 2088 struct ImGuiTableCellData 2089 { 2090 ImU32 BgColor; // Actual color 2091 ImGuiTableColumnIdx Column; // Column number 2092 }; 2093 2094 // FIXME-TABLE: more transient data could be stored in a per-stacked table structure: DrawSplitter, SortSpecs, incoming RowData 2095 struct ImGuiTable 2096 { 2097 ImGuiID ID; 2098 ImGuiTableFlags Flags; 2099 void* RawData; // Single allocation to hold Columns[], DisplayOrderToIndex[] and RowCellData[] 2100 ImGuiTableTempData* TempData; // Transient data while table is active. Point within g.CurrentTableStack[] 2101 ImSpan<ImGuiTableColumn> Columns; // Point within RawData[] 2102 ImSpan<ImGuiTableColumnIdx> DisplayOrderToIndex; // Point within RawData[]. Store display order of columns (when not reordered, the values are 0...Count-1) 2103 ImSpan<ImGuiTableCellData> RowCellData; // Point within RawData[]. Store cells background requests for current row. 2104 ImU64 EnabledMaskByDisplayOrder; // Column DisplayOrder -> IsEnabled map 2105 ImU64 EnabledMaskByIndex; // Column Index -> IsEnabled map (== not hidden by user/api) in a format adequate for iterating column without touching cold data 2106 ImU64 VisibleMaskByIndex; // Column Index -> IsVisibleX|IsVisibleY map (== not hidden by user/api && not hidden by scrolling/cliprect) 2107 ImU64 RequestOutputMaskByIndex; // Column Index -> IsVisible || AutoFit (== expect user to submit items) 2108 ImGuiTableFlags SettingsLoadedFlags; // Which data were loaded from the .ini file (e.g. when order is not altered we won't save order) 2109 int SettingsOffset; // Offset in g.SettingsTables 2110 int LastFrameActive; 2111 int ColumnsCount; // Number of columns declared in BeginTable() 2112 int CurrentRow; 2113 int CurrentColumn; 2114 ImS16 InstanceCurrent; // Count of BeginTable() calls with same ID in the same frame (generally 0). This is a little bit similar to BeginCount for a window, but multiple table with same ID look are multiple tables, they are just synched. 2115 ImS16 InstanceInteracted; // Mark which instance (generally 0) of the same ID is being interacted with 2116 float RowPosY1; 2117 float RowPosY2; 2118 float RowMinHeight; // Height submitted to TableNextRow() 2119 float RowTextBaseline; 2120 float RowIndentOffsetX; 2121 ImGuiTableRowFlags RowFlags : 16; // Current row flags, see ImGuiTableRowFlags_ 2122 ImGuiTableRowFlags LastRowFlags : 16; 2123 int RowBgColorCounter; // Counter for alternating background colors (can be fast-forwarded by e.g clipper), not same as CurrentRow because header rows typically don't increase this. 2124 ImU32 RowBgColor[2]; // Background color override for current row. 2125 ImU32 BorderColorStrong; 2126 ImU32 BorderColorLight; 2127 float BorderX1; 2128 float BorderX2; 2129 float HostIndentX; 2130 float MinColumnWidth; 2131 float OuterPaddingX; 2132 float CellPaddingX; // Padding from each borders 2133 float CellPaddingY; 2134 float CellSpacingX1; // Spacing between non-bordered cells 2135 float CellSpacingX2; 2136 float LastOuterHeight; // Outer height from last frame 2137 float LastFirstRowHeight; // Height of first row from last frame 2138 float InnerWidth; // User value passed to BeginTable(), see comments at the top of BeginTable() for details. 2139 float ColumnsGivenWidth; // Sum of current column width 2140 float ColumnsAutoFitWidth; // Sum of ideal column width in order nothing to be clipped, used for auto-fitting and content width submission in outer window 2141 float ResizedColumnNextWidth; 2142 float ResizeLockMinContentsX2; // Lock minimum contents width while resizing down in order to not create feedback loops. But we allow growing the table. 2143 float RefScale; // Reference scale to be able to rescale columns on font/dpi changes. 2144 ImRect OuterRect; // Note: for non-scrolling table, OuterRect.Max.y is often FLT_MAX until EndTable(), unless a height has been specified in BeginTable(). 2145 ImRect InnerRect; // InnerRect but without decoration. As with OuterRect, for non-scrolling tables, InnerRect.Max.y is 2146 ImRect WorkRect; 2147 ImRect InnerClipRect; 2148 ImRect BgClipRect; // We use this to cpu-clip cell background color fill 2149 ImRect Bg0ClipRectForDrawCmd; // Actual ImDrawCmd clip rect for BG0/1 channel. This tends to be == OuterWindow->ClipRect at BeginTable() because output in BG0/BG1 is cpu-clipped 2150 ImRect Bg2ClipRectForDrawCmd; // Actual ImDrawCmd clip rect for BG2 channel. This tends to be a correct, tight-fit, because output to BG2 are done by widgets relying on regular ClipRect. 2151 ImRect HostClipRect; // This is used to check if we can eventually merge our columns draw calls into the current draw call of the current window. 2152 ImRect HostBackupInnerClipRect; // Backup of InnerWindow->ClipRect during PushTableBackground()/PopTableBackground() 2153 ImGuiWindow* OuterWindow; // Parent window for the table 2154 ImGuiWindow* InnerWindow; // Window holding the table data (== OuterWindow or a child window) 2155 ImGuiTextBuffer ColumnsNames; // Contiguous buffer holding columns names 2156 ImDrawListSplitter* DrawSplitter; // Shortcut to TempData->DrawSplitter while in table. Isolate draw commands per columns to avoid switching clip rect constantly 2157 ImGuiTableSortSpecs SortSpecs; // Public facing sorts specs, this is what we return in TableGetSortSpecs() 2158 ImGuiTableColumnIdx SortSpecsCount; 2159 ImGuiTableColumnIdx ColumnsEnabledCount; // Number of enabled columns (<= ColumnsCount) 2160 ImGuiTableColumnIdx ColumnsEnabledFixedCount; // Number of enabled columns (<= ColumnsCount) 2161 ImGuiTableColumnIdx DeclColumnsCount; // Count calls to TableSetupColumn() 2162 ImGuiTableColumnIdx HoveredColumnBody; // Index of column whose visible region is being hovered. Important: == ColumnsCount when hovering empty region after the right-most column! 2163 ImGuiTableColumnIdx HoveredColumnBorder; // Index of column whose right-border is being hovered (for resizing). 2164 ImGuiTableColumnIdx AutoFitSingleColumn; // Index of single column requesting auto-fit. 2165 ImGuiTableColumnIdx ResizedColumn; // Index of column being resized. Reset when InstanceCurrent==0. 2166 ImGuiTableColumnIdx LastResizedColumn; // Index of column being resized from previous frame. 2167 ImGuiTableColumnIdx HeldHeaderColumn; // Index of column header being held. 2168 ImGuiTableColumnIdx ReorderColumn; // Index of column being reordered. (not cleared) 2169 ImGuiTableColumnIdx ReorderColumnDir; // -1 or +1 2170 ImGuiTableColumnIdx LeftMostEnabledColumn; // Index of left-most non-hidden column. 2171 ImGuiTableColumnIdx RightMostEnabledColumn; // Index of right-most non-hidden column. 2172 ImGuiTableColumnIdx LeftMostStretchedColumn; // Index of left-most stretched column. 2173 ImGuiTableColumnIdx RightMostStretchedColumn; // Index of right-most stretched column. 2174 ImGuiTableColumnIdx ContextPopupColumn; // Column right-clicked on, of -1 if opening context menu from a neutral/empty spot 2175 ImGuiTableColumnIdx FreezeRowsRequest; // Requested frozen rows count 2176 ImGuiTableColumnIdx FreezeRowsCount; // Actual frozen row count (== FreezeRowsRequest, or == 0 when no scrolling offset) 2177 ImGuiTableColumnIdx FreezeColumnsRequest; // Requested frozen columns count 2178 ImGuiTableColumnIdx FreezeColumnsCount; // Actual frozen columns count (== FreezeColumnsRequest, or == 0 when no scrolling offset) 2179 ImGuiTableColumnIdx RowCellDataCurrent; // Index of current RowCellData[] entry in current row 2180 ImGuiTableDrawChannelIdx DummyDrawChannel; // Redirect non-visible columns here. 2181 ImGuiTableDrawChannelIdx Bg2DrawChannelCurrent; // For Selectable() and other widgets drawing across columns after the freezing line. Index within DrawSplitter.Channels[] 2182 ImGuiTableDrawChannelIdx Bg2DrawChannelUnfrozen; 2183 bool IsLayoutLocked; // Set by TableUpdateLayout() which is called when beginning the first row. 2184 bool IsInsideRow; // Set when inside TableBeginRow()/TableEndRow(). 2185 bool IsInitializing; 2186 bool IsSortSpecsDirty; 2187 bool IsUsingHeaders; // Set when the first row had the ImGuiTableRowFlags_Headers flag. 2188 bool IsContextPopupOpen; // Set when default context menu is open (also see: ContextPopupColumn, InstanceInteracted). 2189 bool IsSettingsRequestLoad; 2190 bool IsSettingsDirty; // Set when table settings have changed and needs to be reported into ImGuiTableSetttings data. 2191 bool IsDefaultDisplayOrder; // Set when display order is unchanged from default (DisplayOrder contains 0...Count-1) 2192 bool IsResetAllRequest; 2193 bool IsResetDisplayOrderRequest; 2194 bool IsUnfrozenRows; // Set when we got past the frozen row. 2195 bool IsDefaultSizingPolicy; // Set if user didn't explicitly set a sizing policy in BeginTable() 2196 bool MemoryCompacted; 2197 bool HostSkipItems; // Backup of InnerWindow->SkipItem at the end of BeginTable(), because we will overwrite InnerWindow->SkipItem on a per-column basis 2198 2199 IMGUI_API ImGuiTable() { memset(this, 0, sizeof(*this)); LastFrameActive = -1; } 2200 IMGUI_API ~ImGuiTable() { IM_FREE(RawData); } 2201 }; 2202 2203 // Transient data that are only needed between BeginTable() and EndTable(), those buffers are shared (1 per level of stacked table). 2204 // - Accessing those requires chasing an extra pointer so for very frequently used data we leave them in the main table structure. 2205 // - We also leave out of this structure data that tend to be particularly useful for debugging/metrics. 2206 // FIXME-TABLE: more transient data could be stored here: DrawSplitter, incoming RowData? 2207 struct ImGuiTableTempData 2208 { 2209 int TableIndex; // Index in g.Tables.Buf[] pool 2210 float LastTimeActive; // Last timestamp this structure was used 2211 2212 ImVec2 UserOuterSize; // outer_size.x passed to BeginTable() 2213 ImDrawListSplitter DrawSplitter; 2214 ImGuiTableColumnSortSpecs SortSpecsSingle; 2215 ImVector<ImGuiTableColumnSortSpecs> SortSpecsMulti; // FIXME-OPT: Using a small-vector pattern would be good. 2216 2217 ImRect HostBackupWorkRect; // Backup of InnerWindow->WorkRect at the end of BeginTable() 2218 ImRect HostBackupParentWorkRect; // Backup of InnerWindow->ParentWorkRect at the end of BeginTable() 2219 ImVec2 HostBackupPrevLineSize; // Backup of InnerWindow->DC.PrevLineSize at the end of BeginTable() 2220 ImVec2 HostBackupCurrLineSize; // Backup of InnerWindow->DC.CurrLineSize at the end of BeginTable() 2221 ImVec2 HostBackupCursorMaxPos; // Backup of InnerWindow->DC.CursorMaxPos at the end of BeginTable() 2222 ImVec1 HostBackupColumnsOffset; // Backup of OuterWindow->DC.ColumnsOffset at the end of BeginTable() 2223 float HostBackupItemWidth; // Backup of OuterWindow->DC.ItemWidth at the end of BeginTable() 2224 int HostBackupItemWidthStackSize;//Backup of OuterWindow->DC.ItemWidthStack.Size at the end of BeginTable() 2225 2226 IMGUI_API ImGuiTableTempData() { memset(this, 0, sizeof(*this)); LastTimeActive = -1.0f; } 2227 }; 2228 2229 // sizeof() ~ 12 2230 struct ImGuiTableColumnSettings 2231 { 2232 float WidthOrWeight; 2233 ImGuiID UserID; 2234 ImGuiTableColumnIdx Index; 2235 ImGuiTableColumnIdx DisplayOrder; 2236 ImGuiTableColumnIdx SortOrder; 2237 ImU8 SortDirection : 2; 2238 ImU8 IsEnabled : 1; // "Visible" in ini file 2239 ImU8 IsStretch : 1; 2240 2241 ImGuiTableColumnSettings() 2242 { 2243 WidthOrWeight = 0.0f; 2244 UserID = 0; 2245 Index = -1; 2246 DisplayOrder = SortOrder = -1; 2247 SortDirection = ImGuiSortDirection_None; 2248 IsEnabled = 1; 2249 IsStretch = 0; 2250 } 2251 }; 2252 2253 // This is designed to be stored in a single ImChunkStream (1 header followed by N ImGuiTableColumnSettings, etc.) 2254 struct ImGuiTableSettings 2255 { 2256 ImGuiID ID; // Set to 0 to invalidate/delete the setting 2257 ImGuiTableFlags SaveFlags; // Indicate data we want to save using the Resizable/Reorderable/Sortable/Hideable flags (could be using its own flags..) 2258 float RefScale; // Reference scale to be able to rescale columns on font/dpi changes. 2259 ImGuiTableColumnIdx ColumnsCount; 2260 ImGuiTableColumnIdx ColumnsCountMax; // Maximum number of columns this settings instance can store, we can recycle a settings instance with lower number of columns but not higher 2261 bool WantApply; // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context) 2262 2263 ImGuiTableSettings() { memset(this, 0, sizeof(*this)); } 2264 ImGuiTableColumnSettings* GetColumnSettings() { return (ImGuiTableColumnSettings*)(this + 1); } 2265 }; 2266 2267 //----------------------------------------------------------------------------- 2268 // [SECTION] ImGui internal API 2269 // No guarantee of forward compatibility here! 2270 //----------------------------------------------------------------------------- 2271 2272 namespace ImGui 2273 { 2274 // Windows 2275 // We should always have a CurrentWindow in the stack (there is an implicit "Debug" window) 2276 // If this ever crash because g.CurrentWindow is NULL it means that either 2277 // - ImGui::NewFrame() has never been called, which is illegal. 2278 // - You are calling ImGui functions after ImGui::EndFrame()/ImGui::Render() and before the next ImGui::NewFrame(), which is also illegal. 2279 inline ImGuiWindow* GetCurrentWindowRead() { ImGuiContext& g = *GImGui; return g.CurrentWindow; } 2280 inline ImGuiWindow* GetCurrentWindow() { ImGuiContext& g = *GImGui; g.CurrentWindow->WriteAccessed = true; return g.CurrentWindow; } 2281 IMGUI_API ImGuiWindow* FindWindowByID(ImGuiID id); 2282 IMGUI_API ImGuiWindow* FindWindowByName(const char* name); 2283 IMGUI_API void UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags flags, ImGuiWindow* parent_window); 2284 IMGUI_API ImVec2 CalcWindowNextAutoFitSize(ImGuiWindow* window); 2285 IMGUI_API bool IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent); 2286 IMGUI_API bool IsWindowAbove(ImGuiWindow* potential_above, ImGuiWindow* potential_below); 2287 IMGUI_API bool IsWindowNavFocusable(ImGuiWindow* window); 2288 IMGUI_API ImRect GetWindowAllowedExtentRect(ImGuiWindow* window); 2289 IMGUI_API void SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond = 0); 2290 IMGUI_API void SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond cond = 0); 2291 IMGUI_API void SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiCond cond = 0); 2292 IMGUI_API void SetWindowHitTestHole(ImGuiWindow* window, const ImVec2& pos, const ImVec2& size); 2293 2294 // Windows: Display Order and Focus Order 2295 IMGUI_API void FocusWindow(ImGuiWindow* window); 2296 IMGUI_API void FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWindow* ignore_window); 2297 IMGUI_API void BringWindowToFocusFront(ImGuiWindow* window); 2298 IMGUI_API void BringWindowToDisplayFront(ImGuiWindow* window); 2299 IMGUI_API void BringWindowToDisplayBack(ImGuiWindow* window); 2300 2301 // Fonts, drawing 2302 IMGUI_API void SetCurrentFont(ImFont* font); 2303 inline ImFont* GetDefaultFont() { ImGuiContext& g = *GImGui; return g.IO.FontDefault ? g.IO.FontDefault : g.IO.Fonts->Fonts[0]; } 2304 inline ImDrawList* GetForegroundDrawList(ImGuiWindow* window) { IM_UNUSED(window); return GetForegroundDrawList(); } // This seemingly unnecessary wrapper simplifies compatibility between the 'master' and 'docking' branches. 2305 IMGUI_API ImDrawList* GetBackgroundDrawList(ImGuiViewport* viewport); // get background draw list for the given viewport. this draw list will be the first rendering one. Useful to quickly draw shapes/text behind dear imgui contents. 2306 IMGUI_API ImDrawList* GetForegroundDrawList(ImGuiViewport* viewport); // get foreground draw list for the given viewport. this draw list will be the last rendered one. Useful to quickly draw shapes/text over dear imgui contents. 2307 2308 // Init 2309 IMGUI_API void Initialize(ImGuiContext* context); 2310 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(). 2311 2312 // NewFrame 2313 IMGUI_API void UpdateHoveredWindowAndCaptureFlags(); 2314 IMGUI_API void StartMouseMovingWindow(ImGuiWindow* window); 2315 IMGUI_API void UpdateMouseMovingWindowNewFrame(); 2316 IMGUI_API void UpdateMouseMovingWindowEndFrame(); 2317 2318 // Generic context hooks 2319 IMGUI_API ImGuiID AddContextHook(ImGuiContext* context, const ImGuiContextHook* hook); 2320 IMGUI_API void RemoveContextHook(ImGuiContext* context, ImGuiID hook_to_remove); 2321 IMGUI_API void CallContextHooks(ImGuiContext* context, ImGuiContextHookType type); 2322 2323 // Settings 2324 IMGUI_API void MarkIniSettingsDirty(); 2325 IMGUI_API void MarkIniSettingsDirty(ImGuiWindow* window); 2326 IMGUI_API void ClearIniSettings(); 2327 IMGUI_API ImGuiWindowSettings* CreateNewWindowSettings(const char* name); 2328 IMGUI_API ImGuiWindowSettings* FindWindowSettings(ImGuiID id); 2329 IMGUI_API ImGuiWindowSettings* FindOrCreateWindowSettings(const char* name); 2330 IMGUI_API ImGuiSettingsHandler* FindSettingsHandler(const char* type_name); 2331 2332 // Scrolling 2333 IMGUI_API void SetNextWindowScroll(const ImVec2& scroll); // Use -1.0f on one axis to leave as-is 2334 IMGUI_API void SetScrollX(ImGuiWindow* window, float scroll_x); 2335 IMGUI_API void SetScrollY(ImGuiWindow* window, float scroll_y); 2336 IMGUI_API void SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x_ratio); 2337 IMGUI_API void SetScrollFromPosY(ImGuiWindow* window, float local_y, float center_y_ratio); 2338 IMGUI_API ImVec2 ScrollToBringRectIntoView(ImGuiWindow* window, const ImRect& item_rect); 2339 2340 // Basic Accessors 2341 inline ImGuiID GetItemID() { ImGuiContext& g = *GImGui; return g.CurrentWindow->DC.LastItemId; } // Get ID of last item (~~ often same ImGui::GetID(label) beforehand) 2342 inline ImGuiItemStatusFlags GetItemStatusFlags() { ImGuiContext& g = *GImGui; return g.CurrentWindow->DC.LastItemStatusFlags; } 2343 inline ImGuiID GetActiveID() { ImGuiContext& g = *GImGui; return g.ActiveId; } 2344 inline ImGuiID GetFocusID() { ImGuiContext& g = *GImGui; return g.NavId; } 2345 inline ImGuiItemFlags GetItemFlags() { ImGuiContext& g = *GImGui; return g.CurrentItemFlags; } 2346 IMGUI_API void SetActiveID(ImGuiID id, ImGuiWindow* window); 2347 IMGUI_API void SetFocusID(ImGuiID id, ImGuiWindow* window); 2348 IMGUI_API void ClearActiveID(); 2349 IMGUI_API ImGuiID GetHoveredID(); 2350 IMGUI_API void SetHoveredID(ImGuiID id); 2351 IMGUI_API void KeepAliveID(ImGuiID id); 2352 IMGUI_API void MarkItemEdited(ImGuiID id); // Mark data associated to given item as "edited", used by IsItemDeactivatedAfterEdit() function. 2353 IMGUI_API void PushOverrideID(ImGuiID id); // Push given value as-is at the top of the ID stack (whereas PushID combines old and new hashes) 2354 IMGUI_API ImGuiID GetIDWithSeed(const char* str_id_begin, const char* str_id_end, ImGuiID seed); 2355 2356 // Basic Helpers for widget code 2357 IMGUI_API void ItemSize(const ImVec2& size, float text_baseline_y = -1.0f); 2358 IMGUI_API void ItemSize(const ImRect& bb, float text_baseline_y = -1.0f); 2359 IMGUI_API bool ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb = NULL, ImGuiItemAddFlags flags = 0); 2360 IMGUI_API bool ItemHoverable(const ImRect& bb, ImGuiID id); 2361 IMGUI_API void ItemFocusable(ImGuiWindow* window, ImGuiID id); 2362 IMGUI_API bool IsClippedEx(const ImRect& bb, ImGuiID id, bool clip_even_when_logged); 2363 IMGUI_API void SetLastItemData(ImGuiWindow* window, ImGuiID item_id, ImGuiItemStatusFlags status_flags, const ImRect& item_rect); 2364 IMGUI_API ImVec2 CalcItemSize(ImVec2 size, float default_w, float default_h); 2365 IMGUI_API float CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x); 2366 IMGUI_API void PushMultiItemsWidths(int components, float width_full); 2367 IMGUI_API void PushItemFlag(ImGuiItemFlags option, bool enabled); 2368 IMGUI_API void PopItemFlag(); 2369 IMGUI_API bool IsItemToggledSelection(); // Was the last item selection toggled? (after Selectable(), TreeNode() etc. We only returns toggle _event_ in order to handle clipping correctly) 2370 IMGUI_API ImVec2 GetContentRegionMaxAbs(); 2371 IMGUI_API void ShrinkWidths(ImGuiShrinkWidthItem* items, int count, float width_excess); 2372 2373 #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS 2374 // If you have old/custom copy-and-pasted widgets that used FocusableItemRegister(): 2375 // (Old) IMGUI_VERSION_NUM < 18209: using 'ItemAdd(....)' and 'bool focused = FocusableItemRegister(...)' 2376 // (New) IMGUI_VERSION_NUM >= 18209: using 'ItemAdd(..., ImGuiItemAddFlags_Focusable)' and 'bool focused = (GetItemStatusFlags() & ImGuiItemStatusFlags_Focused) != 0' 2377 // Widget code are simplified as there's no need to call FocusableItemUnregister() while managing the transition from regular widget to TempInputText() 2378 inline bool FocusableItemRegister(ImGuiWindow* window, ImGuiID id) { IM_ASSERT(0); IM_UNUSED(window); IM_UNUSED(id); return false; } // -> pass ImGuiItemAddFlags_Focusable flag to ItemAdd() 2379 inline void FocusableItemUnregister(ImGuiWindow* window) { IM_ASSERT(0); IM_UNUSED(window); } // -> unnecessary: TempInputText() uses ImGuiInputTextFlags_MergedItem 2380 #endif 2381 2382 // Logging/Capture 2383 IMGUI_API void LogBegin(ImGuiLogType type, int auto_open_depth); // -> BeginCapture() when we design v2 api, for now stay under the radar by using the old name. 2384 IMGUI_API void LogToBuffer(int auto_open_depth = -1); // Start logging/capturing to internal buffer 2385 IMGUI_API void LogRenderedText(const ImVec2* ref_pos, const char* text, const char* text_end = NULL); 2386 IMGUI_API void LogSetNextTextDecoration(const char* prefix, const char* suffix); 2387 2388 // Popups, Modals, Tooltips 2389 IMGUI_API bool BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags flags); 2390 IMGUI_API void OpenPopupEx(ImGuiID id, ImGuiPopupFlags popup_flags = ImGuiPopupFlags_None); 2391 IMGUI_API void ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_popup); 2392 IMGUI_API void ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to_window_under_popup); 2393 IMGUI_API bool IsPopupOpen(ImGuiID id, ImGuiPopupFlags popup_flags); 2394 IMGUI_API bool BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_flags); 2395 IMGUI_API void BeginTooltipEx(ImGuiWindowFlags extra_flags, ImGuiTooltipFlags tooltip_flags); 2396 IMGUI_API ImGuiWindow* GetTopMostPopupModal(); 2397 IMGUI_API ImVec2 FindBestWindowPosForPopup(ImGuiWindow* window); 2398 IMGUI_API ImVec2 FindBestWindowPosForPopupEx(const ImVec2& ref_pos, const ImVec2& size, ImGuiDir* last_dir, const ImRect& r_outer, const ImRect& r_avoid, ImGuiPopupPositionPolicy policy); 2399 IMGUI_API bool BeginViewportSideBar(const char* name, ImGuiViewport* viewport, ImGuiDir dir, float size, ImGuiWindowFlags window_flags); 2400 2401 // Gamepad/Keyboard Navigation 2402 IMGUI_API void NavInitWindow(ImGuiWindow* window, bool force_reinit); 2403 IMGUI_API bool NavMoveRequestButNoResultYet(); 2404 IMGUI_API void NavMoveRequestCancel(); 2405 IMGUI_API void NavMoveRequestForward(ImGuiDir move_dir, ImGuiDir clip_dir, const ImRect& bb_rel, ImGuiNavMoveFlags move_flags); 2406 IMGUI_API void NavMoveRequestTryWrapping(ImGuiWindow* window, ImGuiNavMoveFlags move_flags); 2407 IMGUI_API float GetNavInputAmount(ImGuiNavInput n, ImGuiInputReadMode mode); 2408 IMGUI_API ImVec2 GetNavInputAmount2d(ImGuiNavDirSourceFlags dir_sources, ImGuiInputReadMode mode, float slow_factor = 0.0f, float fast_factor = 0.0f); 2409 IMGUI_API int CalcTypematicRepeatAmount(float t0, float t1, float repeat_delay, float repeat_rate); 2410 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. 2411 IMGUI_API void SetNavID(ImGuiID id, ImGuiNavLayer nav_layer, ImGuiID focus_scope_id, const ImRect& rect_rel); 2412 2413 // Focus Scope (WIP) 2414 // This is generally used to identify a selection set (multiple of which may be in the same window), as selection 2415 // patterns generally need to react (e.g. clear selection) when landing on an item of the set. 2416 IMGUI_API void PushFocusScope(ImGuiID id); 2417 IMGUI_API void PopFocusScope(); 2418 inline ImGuiID GetFocusedFocusScope() { ImGuiContext& g = *GImGui; return g.NavFocusScopeId; } // Focus scope which is actually active 2419 inline ImGuiID GetFocusScope() { ImGuiContext& g = *GImGui; return g.CurrentWindow->DC.NavFocusScopeIdCurrent; } // Focus scope we are outputting into, set by PushFocusScope() 2420 2421 // Inputs 2422 // FIXME: Eventually we should aim to move e.g. IsActiveIdUsingKey() into IsKeyXXX functions. 2423 IMGUI_API void SetItemUsingMouseWheel(); 2424 inline bool IsActiveIdUsingNavDir(ImGuiDir dir) { ImGuiContext& g = *GImGui; return (g.ActiveIdUsingNavDirMask & (1 << dir)) != 0; } 2425 inline bool IsActiveIdUsingNavInput(ImGuiNavInput input) { ImGuiContext& g = *GImGui; return (g.ActiveIdUsingNavInputMask & (1 << input)) != 0; } 2426 inline bool IsActiveIdUsingKey(ImGuiKey key) { ImGuiContext& g = *GImGui; IM_ASSERT(key < 64); return (g.ActiveIdUsingKeyInputMask & ((ImU64)1 << key)) != 0; } 2427 IMGUI_API bool IsMouseDragPastThreshold(ImGuiMouseButton button, float lock_threshold = -1.0f); 2428 inline bool IsKeyPressedMap(ImGuiKey key, bool repeat = true) { ImGuiContext& g = *GImGui; const int key_index = g.IO.KeyMap[key]; return (key_index >= 0) ? IsKeyPressed(key_index, repeat) : false; } 2429 inline bool IsNavInputDown(ImGuiNavInput n) { ImGuiContext& g = *GImGui; return g.IO.NavInputs[n] > 0.0f; } 2430 inline bool IsNavInputTest(ImGuiNavInput n, ImGuiInputReadMode rm) { return (GetNavInputAmount(n, rm) > 0.0f); } 2431 IMGUI_API ImGuiKeyModFlags GetMergedKeyModFlags(); 2432 2433 // Drag and Drop 2434 IMGUI_API bool BeginDragDropTargetCustom(const ImRect& bb, ImGuiID id); 2435 IMGUI_API void ClearDragDrop(); 2436 IMGUI_API bool IsDragDropPayloadBeingAccepted(); 2437 2438 // Internal Columns API (this is not exposed because we will encourage transitioning to the Tables API) 2439 IMGUI_API void SetWindowClipRectBeforeSetChannel(ImGuiWindow* window, const ImRect& clip_rect); 2440 IMGUI_API void BeginColumns(const char* str_id, int count, ImGuiOldColumnFlags flags = 0); // setup number of columns. use an identifier to distinguish multiple column sets. close with EndColumns(). 2441 IMGUI_API void EndColumns(); // close columns 2442 IMGUI_API void PushColumnClipRect(int column_index); 2443 IMGUI_API void PushColumnsBackground(); 2444 IMGUI_API void PopColumnsBackground(); 2445 IMGUI_API ImGuiID GetColumnsID(const char* str_id, int count); 2446 IMGUI_API ImGuiOldColumns* FindOrCreateColumns(ImGuiWindow* window, ImGuiID id); 2447 IMGUI_API float GetColumnOffsetFromNorm(const ImGuiOldColumns* columns, float offset_norm); 2448 IMGUI_API float GetColumnNormFromOffset(const ImGuiOldColumns* columns, float offset); 2449 2450 // Tables: Candidates for public API 2451 IMGUI_API void TableOpenContextMenu(int column_n = -1); 2452 IMGUI_API void TableSetColumnWidth(int column_n, float width); 2453 IMGUI_API void TableSetColumnSortDirection(int column_n, ImGuiSortDirection sort_direction, bool append_to_sort_specs); 2454 IMGUI_API int TableGetHoveredColumn(); // May use (TableGetColumnFlags() & ImGuiTableColumnFlags_IsHovered) instead. Return hovered column. return -1 when table is not hovered. return columns_count if the unused space at the right of visible columns is hovered. 2455 IMGUI_API float TableGetHeaderRowHeight(); 2456 IMGUI_API void TablePushBackgroundChannel(); 2457 IMGUI_API void TablePopBackgroundChannel(); 2458 2459 // Tables: Internals 2460 inline ImGuiTable* GetCurrentTable() { ImGuiContext& g = *GImGui; return g.CurrentTable; } 2461 IMGUI_API ImGuiTable* TableFindByID(ImGuiID id); 2462 IMGUI_API bool BeginTableEx(const char* name, ImGuiID id, int columns_count, ImGuiTableFlags flags = 0, const ImVec2& outer_size = ImVec2(0, 0), float inner_width = 0.0f); 2463 IMGUI_API void TableBeginInitMemory(ImGuiTable* table, int columns_count); 2464 IMGUI_API void TableBeginApplyRequests(ImGuiTable* table); 2465 IMGUI_API void TableSetupDrawChannels(ImGuiTable* table); 2466 IMGUI_API void TableUpdateLayout(ImGuiTable* table); 2467 IMGUI_API void TableUpdateBorders(ImGuiTable* table); 2468 IMGUI_API void TableUpdateColumnsWeightFromWidth(ImGuiTable* table); 2469 IMGUI_API void TableDrawBorders(ImGuiTable* table); 2470 IMGUI_API void TableDrawContextMenu(ImGuiTable* table); 2471 IMGUI_API void TableMergeDrawChannels(ImGuiTable* table); 2472 IMGUI_API void TableSortSpecsSanitize(ImGuiTable* table); 2473 IMGUI_API void TableSortSpecsBuild(ImGuiTable* table); 2474 IMGUI_API ImGuiSortDirection TableGetColumnNextSortDirection(ImGuiTableColumn* column); 2475 IMGUI_API void TableFixColumnSortDirection(ImGuiTable* table, ImGuiTableColumn* column); 2476 IMGUI_API float TableGetColumnWidthAuto(ImGuiTable* table, ImGuiTableColumn* column); 2477 IMGUI_API void TableBeginRow(ImGuiTable* table); 2478 IMGUI_API void TableEndRow(ImGuiTable* table); 2479 IMGUI_API void TableBeginCell(ImGuiTable* table, int column_n); 2480 IMGUI_API void TableEndCell(ImGuiTable* table); 2481 IMGUI_API ImRect TableGetCellBgRect(const ImGuiTable* table, int column_n); 2482 IMGUI_API const char* TableGetColumnName(const ImGuiTable* table, int column_n); 2483 IMGUI_API ImGuiID TableGetColumnResizeID(const ImGuiTable* table, int column_n, int instance_no = 0); 2484 IMGUI_API float TableGetMaxColumnWidth(const ImGuiTable* table, int column_n); 2485 IMGUI_API void TableSetColumnWidthAutoSingle(ImGuiTable* table, int column_n); 2486 IMGUI_API void TableSetColumnWidthAutoAll(ImGuiTable* table); 2487 IMGUI_API void TableRemove(ImGuiTable* table); 2488 IMGUI_API void TableGcCompactTransientBuffers(ImGuiTable* table); 2489 IMGUI_API void TableGcCompactTransientBuffers(ImGuiTableTempData* table); 2490 IMGUI_API void TableGcCompactSettings(); 2491 2492 // Tables: Settings 2493 IMGUI_API void TableLoadSettings(ImGuiTable* table); 2494 IMGUI_API void TableSaveSettings(ImGuiTable* table); 2495 IMGUI_API void TableResetSettings(ImGuiTable* table); 2496 IMGUI_API ImGuiTableSettings* TableGetBoundSettings(ImGuiTable* table); 2497 IMGUI_API void TableSettingsInstallHandler(ImGuiContext* context); 2498 IMGUI_API ImGuiTableSettings* TableSettingsCreate(ImGuiID id, int columns_count); 2499 IMGUI_API ImGuiTableSettings* TableSettingsFindByID(ImGuiID id); 2500 2501 // Tab Bars 2502 IMGUI_API bool BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& bb, ImGuiTabBarFlags flags); 2503 IMGUI_API ImGuiTabItem* TabBarFindTabByID(ImGuiTabBar* tab_bar, ImGuiID tab_id); 2504 IMGUI_API void TabBarRemoveTab(ImGuiTabBar* tab_bar, ImGuiID tab_id); 2505 IMGUI_API void TabBarCloseTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab); 2506 IMGUI_API void TabBarQueueReorder(ImGuiTabBar* tab_bar, const ImGuiTabItem* tab, int offset); 2507 IMGUI_API void TabBarQueueReorderFromMousePos(ImGuiTabBar* tab_bar, const ImGuiTabItem* tab, ImVec2 mouse_pos); 2508 IMGUI_API bool TabBarProcessReorder(ImGuiTabBar* tab_bar); 2509 IMGUI_API bool TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, ImGuiTabItemFlags flags); 2510 IMGUI_API ImVec2 TabItemCalcSize(const char* label, bool has_close_button); 2511 IMGUI_API void TabItemBackground(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImU32 col); 2512 IMGUI_API void TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImVec2 frame_padding, const char* label, ImGuiID tab_id, ImGuiID close_button_id, bool is_contents_visible, bool* out_just_closed, bool* out_text_clipped); 2513 2514 // Render helpers 2515 // 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. 2516 // NB: All position are in absolute pixels coordinates (we are never using window coordinates internally) 2517 IMGUI_API void RenderText(ImVec2 pos, const char* text, const char* text_end = NULL, bool hide_text_after_hash = true); 2518 IMGUI_API void RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end, float wrap_width); 2519 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); 2520 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); 2521 IMGUI_API void RenderTextEllipsis(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, float clip_max_x, float ellipsis_max_x, const char* text, const char* text_end, const ImVec2* text_size_if_known); 2522 IMGUI_API void RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border = true, float rounding = 0.0f); 2523 IMGUI_API void RenderFrameBorder(ImVec2 p_min, ImVec2 p_max, float rounding = 0.0f); 2524 IMGUI_API void RenderColorRectWithAlphaCheckerboard(ImDrawList* draw_list, ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, float grid_step, ImVec2 grid_off, float rounding = 0.0f, ImDrawFlags flags = 0); 2525 IMGUI_API void RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFlags flags = ImGuiNavHighlightFlags_TypeDefault); // Navigation highlight 2526 IMGUI_API const char* FindRenderedTextEnd(const char* text, const char* text_end = NULL); // Find the optional ## from which we stop displaying text. 2527 2528 // Render helpers (those functions don't access any ImGui state!) 2529 IMGUI_API void RenderArrow(ImDrawList* draw_list, ImVec2 pos, ImU32 col, ImGuiDir dir, float scale = 1.0f); 2530 IMGUI_API void RenderBullet(ImDrawList* draw_list, ImVec2 pos, ImU32 col); 2531 IMGUI_API void RenderCheckMark(ImDrawList* draw_list, ImVec2 pos, ImU32 col, float sz); 2532 IMGUI_API void RenderMouseCursor(ImDrawList* draw_list, ImVec2 pos, float scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow); 2533 IMGUI_API void RenderArrowPointingAt(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, ImGuiDir direction, ImU32 col); 2534 IMGUI_API void RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, ImU32 col, float x_start_norm, float x_end_norm, float rounding); 2535 IMGUI_API void RenderRectFilledWithHole(ImDrawList* draw_list, ImRect outer, ImRect inner, ImU32 col, float rounding); 2536 2537 #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS 2538 // [1.71: 2019/06/07: Updating prototypes of some of the internal functions. Leaving those for reference for a short while] 2539 inline void RenderArrow(ImVec2 pos, ImGuiDir dir, float scale=1.0f) { ImGuiWindow* window = GetCurrentWindow(); RenderArrow(window->DrawList, pos, GetColorU32(ImGuiCol_Text), dir, scale); } 2540 inline void RenderBullet(ImVec2 pos) { ImGuiWindow* window = GetCurrentWindow(); RenderBullet(window->DrawList, pos, GetColorU32(ImGuiCol_Text)); } 2541 #endif 2542 2543 // Widgets 2544 IMGUI_API void TextEx(const char* text, const char* text_end = NULL, ImGuiTextFlags flags = 0); 2545 IMGUI_API bool ButtonEx(const char* label, const ImVec2& size_arg = ImVec2(0, 0), ImGuiButtonFlags flags = 0); 2546 IMGUI_API bool CloseButton(ImGuiID id, const ImVec2& pos); 2547 IMGUI_API bool CollapseButton(ImGuiID id, const ImVec2& pos); 2548 IMGUI_API bool ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size_arg, ImGuiButtonFlags flags = 0); 2549 IMGUI_API void Scrollbar(ImGuiAxis axis); 2550 IMGUI_API bool ScrollbarEx(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float* p_scroll_v, float avail_v, float contents_v, ImDrawFlags flags); 2551 IMGUI_API bool ImageButtonEx(ImGuiID id, ImTextureID texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec2& padding, const ImVec4& bg_col, const ImVec4& tint_col); 2552 IMGUI_API ImRect GetWindowScrollbarRect(ImGuiWindow* window, ImGuiAxis axis); 2553 IMGUI_API ImGuiID GetWindowScrollbarID(ImGuiWindow* window, ImGuiAxis axis); 2554 IMGUI_API ImGuiID GetWindowResizeCornerID(ImGuiWindow* window, int n); // 0..3: corners 2555 IMGUI_API ImGuiID GetWindowResizeBorderID(ImGuiWindow* window, ImGuiDir dir); 2556 IMGUI_API void SeparatorEx(ImGuiSeparatorFlags flags); 2557 IMGUI_API bool CheckboxFlags(const char* label, ImS64* flags, ImS64 flags_value); 2558 IMGUI_API bool CheckboxFlags(const char* label, ImU64* flags, ImU64 flags_value); 2559 2560 // Widgets low-level behaviors 2561 IMGUI_API bool ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags = 0); 2562 IMGUI_API bool DragBehavior(ImGuiID id, ImGuiDataType data_type, void* p_v, float v_speed, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags); 2563 IMGUI_API bool SliderBehavior(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, void* p_v, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags, ImRect* out_grab_bb); 2564 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); 2565 IMGUI_API bool TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* label, const char* label_end = NULL); 2566 IMGUI_API bool TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags = 0); // Consume previous SetNextItemOpen() data, if any. May return true when logging 2567 IMGUI_API void TreePushOverrideID(ImGuiID id); 2568 2569 // Template functions are instantiated in imgui_widgets.cpp for a finite number of types. 2570 // 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). 2571 // e.g. " extern template IMGUI_API float RoundScalarWithFormatT<float, float>(const char* format, ImGuiDataType data_type, float v); " 2572 template<typename T, typename SIGNED_T, typename FLOAT_T> IMGUI_API float ScaleRatioFromValueT(ImGuiDataType data_type, T v, T v_min, T v_max, bool is_logarithmic, float logarithmic_zero_epsilon, float zero_deadzone_size); 2573 template<typename T, typename SIGNED_T, typename FLOAT_T> IMGUI_API T ScaleValueFromRatioT(ImGuiDataType data_type, float t, T v_min, T v_max, bool is_logarithmic, float logarithmic_zero_epsilon, float zero_deadzone_size); 2574 template<typename T, typename SIGNED_T, typename FLOAT_T> IMGUI_API bool DragBehaviorT(ImGuiDataType data_type, T* v, float v_speed, T v_min, T v_max, const char* format, ImGuiSliderFlags flags); 2575 template<typename T, typename SIGNED_T, typename FLOAT_T> IMGUI_API bool SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, T* v, T v_min, T v_max, const char* format, ImGuiSliderFlags flags, ImRect* out_grab_bb); 2576 template<typename T, typename SIGNED_T> IMGUI_API T RoundScalarWithFormatT(const char* format, ImGuiDataType data_type, T v); 2577 template<typename T> IMGUI_API bool CheckboxFlagsT(const char* label, T* flags, T flags_value); 2578 2579 // Data type helpers 2580 IMGUI_API const ImGuiDataTypeInfo* DataTypeGetInfo(ImGuiDataType data_type); 2581 IMGUI_API int DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* p_data, const char* format); 2582 IMGUI_API void DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, const void* arg_1, const void* arg_2); 2583 IMGUI_API bool DataTypeApplyOpFromText(const char* buf, const char* initial_value_buf, ImGuiDataType data_type, void* p_data, const char* format); 2584 IMGUI_API int DataTypeCompare(ImGuiDataType data_type, const void* arg_1, const void* arg_2); 2585 IMGUI_API bool DataTypeClamp(ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max); 2586 2587 // InputText 2588 IMGUI_API bool InputTextEx(const char* label, const char* hint, char* buf, int buf_size, const ImVec2& size_arg, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); 2589 IMGUI_API bool TempInputText(const ImRect& bb, ImGuiID id, const char* label, char* buf, int buf_size, ImGuiInputTextFlags flags); 2590 IMGUI_API bool TempInputScalar(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* p_data, const char* format, const void* p_clamp_min = NULL, const void* p_clamp_max = NULL); 2591 inline bool TempInputIsActive(ImGuiID id) { ImGuiContext& g = *GImGui; return (g.ActiveId == id && g.TempInputId == id); } 2592 inline ImGuiInputTextState* GetInputTextState(ImGuiID id) { ImGuiContext& g = *GImGui; return (g.InputTextState.ID == id) ? &g.InputTextState : NULL; } // Get input text state if active 2593 2594 // Color 2595 IMGUI_API void ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags flags); 2596 IMGUI_API void ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags); 2597 IMGUI_API void ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags flags); 2598 2599 // Plot 2600 IMGUI_API int PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 frame_size); 2601 2602 // Shade functions (write over already created vertices) 2603 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); 2604 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); 2605 2606 // Garbage collection 2607 IMGUI_API void GcCompactTransientMiscBuffers(); 2608 IMGUI_API void GcCompactTransientWindowBuffers(ImGuiWindow* window); 2609 IMGUI_API void GcAwakeTransientWindowBuffers(ImGuiWindow* window); 2610 2611 // Debug Tools 2612 IMGUI_API void ErrorCheckEndFrameRecover(ImGuiErrorLogCallback log_callback, void* user_data = NULL); 2613 inline void DebugDrawItemRect(ImU32 col = IM_COL32(255,0,0,255)) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; GetForegroundDrawList(window)->AddRect(window->DC.LastItemRect.Min, window->DC.LastItemRect.Max, col); } 2614 inline void DebugStartItemPicker() { ImGuiContext& g = *GImGui; g.DebugItemPickerActive = true; } 2615 2616 IMGUI_API void DebugNodeColumns(ImGuiOldColumns* columns); 2617 IMGUI_API void DebugNodeDrawList(ImGuiWindow* window, const ImDrawList* draw_list, const char* label); 2618 IMGUI_API void DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList* out_draw_list, const ImDrawList* draw_list, const ImDrawCmd* draw_cmd, bool show_mesh, bool show_aabb); 2619 IMGUI_API void DebugNodeStorage(ImGuiStorage* storage, const char* label); 2620 IMGUI_API void DebugNodeTabBar(ImGuiTabBar* tab_bar, const char* label); 2621 IMGUI_API void DebugNodeTable(ImGuiTable* table); 2622 IMGUI_API void DebugNodeTableSettings(ImGuiTableSettings* settings); 2623 IMGUI_API void DebugNodeWindow(ImGuiWindow* window, const char* label); 2624 IMGUI_API void DebugNodeWindowSettings(ImGuiWindowSettings* settings); 2625 IMGUI_API void DebugNodeWindowsList(ImVector<ImGuiWindow*>* windows, const char* label); 2626 IMGUI_API void DebugNodeViewport(ImGuiViewportP* viewport); 2627 IMGUI_API void DebugRenderViewportThumbnail(ImDrawList* draw_list, ImGuiViewportP* viewport, const ImRect& bb); 2628 2629 } // namespace ImGui 2630 2631 2632 //----------------------------------------------------------------------------- 2633 // [SECTION] ImFontAtlas internal API 2634 //----------------------------------------------------------------------------- 2635 2636 // This structure is likely to evolve as we add support for incremental atlas updates 2637 struct ImFontBuilderIO 2638 { 2639 bool (*FontBuilder_Build)(ImFontAtlas* atlas); 2640 }; 2641 2642 // Helper for font builder 2643 IMGUI_API const ImFontBuilderIO* ImFontAtlasGetBuilderForStbTruetype(); 2644 IMGUI_API void ImFontAtlasBuildInit(ImFontAtlas* atlas); 2645 IMGUI_API void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* font_config, float ascent, float descent); 2646 IMGUI_API void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* stbrp_context_opaque); 2647 IMGUI_API void ImFontAtlasBuildFinish(ImFontAtlas* atlas); 2648 IMGUI_API void ImFontAtlasBuildRender8bppRectFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char, unsigned char in_marker_pixel_value); 2649 IMGUI_API void ImFontAtlasBuildRender32bppRectFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char, unsigned int in_marker_pixel_value); 2650 IMGUI_API void ImFontAtlasBuildMultiplyCalcLookupTable(unsigned char out_table[256], float in_multiply_factor); 2651 IMGUI_API void ImFontAtlasBuildMultiplyRectAlpha8(const unsigned char table[256], unsigned char* pixels, int x, int y, int w, int h, int stride); 2652 2653 //----------------------------------------------------------------------------- 2654 // [SECTION] Test Engine specific hooks (imgui_test_engine) 2655 //----------------------------------------------------------------------------- 2656 2657 #ifdef IMGUI_ENABLE_TEST_ENGINE 2658 extern void ImGuiTestEngineHook_ItemAdd(ImGuiContext* ctx, const ImRect& bb, ImGuiID id); 2659 extern void ImGuiTestEngineHook_ItemInfo(ImGuiContext* ctx, ImGuiID id, const char* label, ImGuiItemStatusFlags flags); 2660 extern void ImGuiTestEngineHook_IdInfo(ImGuiContext* ctx, ImGuiDataType data_type, ImGuiID id, const void* data_id); 2661 extern void ImGuiTestEngineHook_IdInfo(ImGuiContext* ctx, ImGuiDataType data_type, ImGuiID id, const void* data_id, const void* data_id_end); 2662 extern void ImGuiTestEngineHook_Log(ImGuiContext* ctx, const char* fmt, ...); 2663 #define IMGUI_TEST_ENGINE_ITEM_ADD(_BB,_ID) if (g.TestEngineHookItems) ImGuiTestEngineHook_ItemAdd(&g, _BB, _ID) // Register item bounding box 2664 #define IMGUI_TEST_ENGINE_ITEM_INFO(_ID,_LABEL,_FLAGS) if (g.TestEngineHookItems) ImGuiTestEngineHook_ItemInfo(&g, _ID, _LABEL, _FLAGS) // Register item label and status flags (optional) 2665 #define IMGUI_TEST_ENGINE_LOG(_FMT,...) if (g.TestEngineHookItems) ImGuiTestEngineHook_Log(&g, _FMT, __VA_ARGS__) // Custom log entry from user land into test log 2666 #define IMGUI_TEST_ENGINE_ID_INFO(_ID,_TYPE,_DATA) if (g.TestEngineHookIdInfo == id) ImGuiTestEngineHook_IdInfo(&g, _TYPE, _ID, (const void*)(_DATA)); 2667 #define IMGUI_TEST_ENGINE_ID_INFO2(_ID,_TYPE,_DATA,_DATA2) if (g.TestEngineHookIdInfo == id) ImGuiTestEngineHook_IdInfo(&g, _TYPE, _ID, (const void*)(_DATA), (const void*)(_DATA2)); 2668 #else 2669 #define IMGUI_TEST_ENGINE_ITEM_ADD(_BB,_ID) do { } while (0) 2670 #define IMGUI_TEST_ENGINE_ITEM_INFO(_ID,_LABEL,_FLAGS) do { } while (0) 2671 #define IMGUI_TEST_ENGINE_LOG(_FMT,...) do { } while (0) 2672 #define IMGUI_TEST_ENGINE_ID_INFO(_ID,_TYPE,_DATA) do { } while (0) 2673 #define IMGUI_TEST_ENGINE_ID_INFO2(_ID,_TYPE,_DATA,_DATA2) do { } while (0) 2674 #endif 2675 2676 //----------------------------------------------------------------------------- 2677 2678 #if defined(__clang__) 2679 #pragma clang diagnostic pop 2680 #elif defined(__GNUC__) 2681 #pragma GCC diagnostic pop 2682 #endif 2683 2684 #ifdef _MSC_VER 2685 #pragma warning (pop) 2686 #endif 2687 2688 #endif // #ifndef IMGUI_DISABLE