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