| // dear imgui, v1.80 WIP |
| // (internal structures/api) |
| |
| // You may use this file to debug, understand or extend ImGui features but we don't provide any guarantee of forward compatibility! |
| // Set: |
| // #define IMGUI_DEFINE_MATH_OPERATORS |
| // To implement maths operators for ImVec2 (disabled by default to not collide with using IM_VEC2_CLASS_EXTRA along with your own math types+operators) |
| |
| /* |
| |
| Index of this file: |
| |
| // [SECTION] Header mess |
| // [SECTION] Forward declarations |
| // [SECTION] Context pointer |
| // [SECTION] STB libraries includes |
| // [SECTION] Macros |
| // [SECTION] Generic helpers |
| // [SECTION] ImDrawList support |
| // [SECTION] Widgets support: flags, enums, data structures |
| // [SECTION] Columns support |
| // [SECTION] Multi-select support |
| // [SECTION] Docking support |
| // [SECTION] Viewport support |
| // [SECTION] Settings support |
| // [SECTION] Metrics, Debug |
| // [SECTION] Generic context hooks |
| // [SECTION] ImGuiContext (main imgui context) |
| // [SECTION] ImGuiWindowTempData, ImGuiWindow |
| // [SECTION] Tab bar, Tab item support |
| // [SECTION] Table support |
| // [SECTION] Internal API |
| // [SECTION] Test Engine specific hooks (imgui_test_engine) |
| |
| */ |
| |
| #pragma once |
| #ifndef IMGUI_DISABLE |
| |
| //----------------------------------------------------------------------------- |
| // [SECTION] Header mess |
| //----------------------------------------------------------------------------- |
| |
| #ifndef IMGUI_VERSION |
| #error Must include imgui.h before imgui_internal.h |
| #endif |
| |
| #include <stdio.h> // FILE*, sscanf |
| #include <stdlib.h> // NULL, malloc, free, qsort, atoi, atof |
| #include <math.h> // sqrtf, fabsf, fmodf, powf, floorf, ceilf, cosf, sinf |
| #include <limits.h> // INT_MIN, INT_MAX |
| |
| // Visual Studio warnings |
| #ifdef _MSC_VER |
| #pragma warning (push) |
| #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) |
| #endif |
| |
| // Clang/GCC warnings with -Weverything |
| #if defined(__clang__) |
| #pragma clang diagnostic push |
| #if __has_warning("-Wunknown-warning-option") |
| #pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx' |
| #endif |
| #pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx' |
| #pragma clang diagnostic ignored "-Wunused-function" // for stb_textedit.h |
| #pragma clang diagnostic ignored "-Wmissing-prototypes" // for stb_textedit.h |
| #pragma clang diagnostic ignored "-Wold-style-cast" |
| #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" |
| #pragma clang diagnostic ignored "-Wdouble-promotion" |
| #pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision |
| #elif defined(__GNUC__) |
| #pragma GCC diagnostic push |
| #pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind |
| #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 |
| #endif |
| |
| // Legacy defines |
| #ifdef IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS // Renamed in 1.74 |
| #error Use IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS |
| #endif |
| #ifdef IMGUI_DISABLE_MATH_FUNCTIONS // Renamed in 1.74 |
| #error Use IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS |
| #endif |
| |
| //----------------------------------------------------------------------------- |
| // [SECTION] Forward declarations |
| //----------------------------------------------------------------------------- |
| |
| struct ImBitVector; // Store 1-bit per value |
| struct ImRect; // An axis-aligned rectangle (2 points) |
| struct ImDrawDataBuilder; // Helper to build a ImDrawData instance |
| struct ImDrawListSharedData; // Data shared between all ImDrawList instances |
| struct ImGuiColorMod; // Stacked color modifier, backup of modified data so we can restore it |
| struct ImGuiContext; // Main Dear ImGui context |
| struct ImGuiContextHook; // Hook for extensions like ImGuiTestEngine |
| struct ImGuiDataTypeInfo; // Type information associated to a ImGuiDataType enum |
| struct ImGuiGroupData; // Stacked storage data for BeginGroup()/EndGroup() |
| struct ImGuiInputTextState; // Internal state of the currently focused/edited text input box |
| struct ImGuiLastItemDataBackup; // Backup and restore IsItemHovered() internal data |
| struct ImGuiMenuColumns; // Simple column measurement, currently used for MenuItem() only |
| struct ImGuiNavMoveResult; // Result of a gamepad/keyboard directional navigation move query result |
| struct ImGuiMetricsConfig; // Storage for ShowMetricsWindow() and DebugNodeXXX() functions |
| struct ImGuiNextWindowData; // Storage for SetNextWindow** functions |
| struct ImGuiNextItemData; // Storage for SetNextItem** functions |
| struct ImGuiOldColumnData; // Storage data for a single column for legacy Columns() api |
| struct ImGuiOldColumns; // Storage data for a columns set for legacy Columns() api |
| struct ImGuiPopupData; // Storage for current popup stack |
| struct ImGuiSettingsHandler; // Storage for one type registered in the .ini file |
| struct ImGuiStackSizes; // Storage of stack sizes for debugging/asserting |
| struct ImGuiStyleMod; // Stacked style modifier, backup of modified data so we can restore it |
| struct ImGuiTabBar; // Storage for a tab bar |
| struct ImGuiTabItem; // Storage for a tab item (within a tab bar) |
| struct ImGuiTable; // Storage for a table |
| struct ImGuiTableColumn; // Storage for one column of a table |
| struct ImGuiTableSettings; // Storage for a table .ini settings |
| struct ImGuiTableColumnsSettings; // Storage for a column .ini settings |
| struct ImGuiWindow; // Storage for one window |
| struct ImGuiWindowTempData; // Temporary storage for one window (that's the data which in theory we could ditch at the end of the frame) |
| struct ImGuiWindowSettings; // Storage for a window .ini settings (we keep one of those even if the actual window wasn't instanced during this session) |
| |
| // Use your programming IDE "Go to definition" facility on the names of the center columns to find the actual flags/enum lists. |
| typedef int ImGuiLayoutType; // -> enum ImGuiLayoutType_ // Enum: Horizontal or vertical |
| typedef int ImGuiItemFlags; // -> enum ImGuiItemFlags_ // Flags: for PushItemFlag() |
| typedef int ImGuiItemStatusFlags; // -> enum ImGuiItemStatusFlags_ // Flags: for DC.LastItemStatusFlags |
| typedef int ImGuiOldColumnFlags; // -> enum ImGuiOldColumnFlags_ // Flags: for BeginColumns() |
| typedef int ImGuiNavHighlightFlags; // -> enum ImGuiNavHighlightFlags_ // Flags: for RenderNavHighlight() |
| typedef int ImGuiNavDirSourceFlags; // -> enum ImGuiNavDirSourceFlags_ // Flags: for GetNavInputAmount2d() |
| typedef int ImGuiNavMoveFlags; // -> enum ImGuiNavMoveFlags_ // Flags: for navigation requests |
| typedef int ImGuiNextItemDataFlags; // -> enum ImGuiNextItemDataFlags_ // Flags: for SetNextItemXXX() functions |
| typedef int ImGuiNextWindowDataFlags; // -> enum ImGuiNextWindowDataFlags_// Flags: for SetNextWindowXXX() functions |
| typedef int ImGuiSeparatorFlags; // -> enum ImGuiSeparatorFlags_ // Flags: for SeparatorEx() |
| typedef int ImGuiTextFlags; // -> enum ImGuiTextFlags_ // Flags: for TextEx() |
| typedef int ImGuiTooltipFlags; // -> enum ImGuiTooltipFlags_ // Flags: for BeginTooltipEx() |
| |
| typedef void (*ImGuiErrorLogCallback)(void* user_data, const char* fmt, ...); |
| |
| //----------------------------------------------------------------------------- |
| // [SECTION] Context pointer |
| // See implementation of this variable in imgui.cpp for comments and details. |
| //----------------------------------------------------------------------------- |
| |
| #ifndef GImGui |
| extern IMGUI_API ImGuiContext* GImGui; // Current implicit context pointer |
| #endif |
| |
| //------------------------------------------------------------------------- |
| // [SECTION] STB libraries includes |
| //------------------------------------------------------------------------- |
| |
| namespace ImStb |
| { |
| |
| #undef STB_TEXTEDIT_STRING |
| #undef STB_TEXTEDIT_CHARTYPE |
| #define STB_TEXTEDIT_STRING ImGuiInputTextState |
| #define STB_TEXTEDIT_CHARTYPE ImWchar |
| #define STB_TEXTEDIT_GETWIDTH_NEWLINE (-1.0f) |
| #define STB_TEXTEDIT_UNDOSTATECOUNT 99 |
| #define STB_TEXTEDIT_UNDOCHARCOUNT 999 |
| #include "imstb_textedit.h" |
| |
| } // namespace ImStb |
| |
| //----------------------------------------------------------------------------- |
| // [SECTION] Macros |
| //----------------------------------------------------------------------------- |
| |
| // Debug Logging |
| #ifndef IMGUI_DEBUG_LOG |
| #define IMGUI_DEBUG_LOG(_FMT,...) printf("[%05d] " _FMT, GImGui->FrameCount, __VA_ARGS__) |
| #endif |
| |
| // Debug Logging for selected systems. Remove the '((void)0) //' to enable. |
| //#define IMGUI_DEBUG_LOG_POPUP IMGUI_DEBUG_LOG // Enable log |
| //#define IMGUI_DEBUG_LOG_NAV IMGUI_DEBUG_LOG // Enable log |
| #define IMGUI_DEBUG_LOG_POPUP(...) ((void)0) // Disable log |
| #define IMGUI_DEBUG_LOG_NAV(...) ((void)0) // Disable log |
| |
| // Static Asserts |
| #if (__cplusplus >= 201100) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201100) |
| #define IM_STATIC_ASSERT(_COND) static_assert(_COND, "") |
| #else |
| #define IM_STATIC_ASSERT(_COND) typedef char static_assertion_##__line__[(_COND)?1:-1] |
| #endif |
| |
| // "Paranoid" Debug Asserts are meant to only be enabled during specific debugging/work, otherwise would slow down the code too much. |
| // 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. |
| //#define IMGUI_DEBUG_PARANOID |
| #ifdef IMGUI_DEBUG_PARANOID |
| #define IM_ASSERT_PARANOID(_EXPR) IM_ASSERT(_EXPR) |
| #else |
| #define IM_ASSERT_PARANOID(_EXPR) |
| #endif |
| |
| // Error handling |
| // 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. |
| #ifndef IM_ASSERT_USER_ERROR |
| #define IM_ASSERT_USER_ERROR(_EXP,_MSG) IM_ASSERT((_EXP) && _MSG) // Recoverable User Error |
| #endif |
| |
| // Misc Macros |
| #define IM_PI 3.14159265358979323846f |
| #ifdef _WIN32 |
| #define IM_NEWLINE "\r\n" // Play it nice with Windows users (Update: since 2018-05, Notepad finally appears to support Unix-style carriage returns!) |
| #else |
| #define IM_NEWLINE "\n" |
| #endif |
| #define IM_TABSIZE (4) |
| #define IM_F32_TO_INT8_UNBOUND(_VAL) ((int)((_VAL) * 255.0f + ((_VAL)>=0 ? 0.5f : -0.5f))) // Unsaturated, for display purpose |
| #define IM_F32_TO_INT8_SAT(_VAL) ((int)(ImSaturate(_VAL) * 255.0f + 0.5f)) // Saturated, always output 0..255 |
| #define IM_FLOOR(_VAL) ((float)(int)(_VAL)) // ImFloor() is not inlined in MSVC debug builds |
| #define IM_ROUND(_VAL) ((float)(int)((_VAL) + 0.5f)) // |
| |
| // Enforce cdecl calling convention for functions called by the standard library, in case compilation settings changed the default to e.g. __vectorcall |
| #ifdef _MSC_VER |
| #define IMGUI_CDECL __cdecl |
| #else |
| #define IMGUI_CDECL |
| #endif |
| |
| // Debug Tools |
| // Use 'Metrics->Tools->Item Picker' to break into the call-stack of a specific item. |
| #ifndef IM_DEBUG_BREAK |
| #if defined(__clang__) |
| #define IM_DEBUG_BREAK() __builtin_debugtrap() |
| #elif defined (_MSC_VER) |
| #define IM_DEBUG_BREAK() __debugbreak() |
| #else |
| #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! |
| #endif |
| #endif // #ifndef IM_DEBUG_BREAK |
| |
| //----------------------------------------------------------------------------- |
| // [SECTION] Generic helpers |
| // Note that the ImXXX helpers functions are lower-level than ImGui functions. |
| // ImGui functions or the ImGui context are never called/used from other ImXXX functions. |
| //----------------------------------------------------------------------------- |
| // - Helpers: Hashing |
| // - Helpers: Sorting |
| // - Helpers: Bit manipulation |
| // - Helpers: String, Formatting |
| // - Helpers: UTF-8 <> wchar conversions |
| // - Helpers: ImVec2/ImVec4 operators |
| // - Helpers: Maths |
| // - Helpers: Geometry |
| // - Helper: ImVec1 |
| // - Helper: ImVec2ih |
| // - Helper: ImRect |
| // - Helper: ImBitArray |
| // - Helper: ImBitVector |
| // - Helper: ImSpan<>, ImSpanAllocator<> |
| // - Helper: ImPool<> |
| // - Helper: ImChunkStream<> |
| //----------------------------------------------------------------------------- |
| |
| // Helpers: Hashing |
| IMGUI_API ImGuiID ImHashData(const void* data, size_t data_size, ImU32 seed = 0); |
| IMGUI_API ImGuiID ImHashStr(const char* data, size_t data_size = 0, ImU32 seed = 0); |
| #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS |
| static inline ImGuiID ImHash(const void* data, int size, ImU32 seed = 0) { return size ? ImHashData(data, (size_t)size, seed) : ImHashStr((const char*)data, 0, seed); } // [moved to ImHashStr/ImHashData in 1.68] |
| #endif |
| |
| // Helpers: Sorting |
| #define ImQsort qsort |
| |
| // Helpers: Color Blending |
| IMGUI_API ImU32 ImAlphaBlendColors(ImU32 col_a, ImU32 col_b); |
| |
| // Helpers: Bit manipulation |
| static inline bool ImIsPowerOfTwo(int v) { return v != 0 && (v & (v - 1)) == 0; } |
| static inline bool ImIsPowerOfTwo(ImU64 v) { return v != 0 && (v & (v - 1)) == 0; } |
| 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; } |
| |
| // Helpers: String, Formatting |
| IMGUI_API int ImStricmp(const char* str1, const char* str2); |
| IMGUI_API int ImStrnicmp(const char* str1, const char* str2, size_t count); |
| IMGUI_API void ImStrncpy(char* dst, const char* src, size_t count); |
| IMGUI_API char* ImStrdup(const char* str); |
| IMGUI_API char* ImStrdupcpy(char* dst, size_t* p_dst_size, const char* str); |
| IMGUI_API const char* ImStrchrRange(const char* str_begin, const char* str_end, char c); |
| IMGUI_API int ImStrlenW(const ImWchar* str); |
| IMGUI_API const char* ImStreolRange(const char* str, const char* str_end); // End end-of-line |
| IMGUI_API const ImWchar*ImStrbolW(const ImWchar* buf_mid_line, const ImWchar* buf_begin); // Find beginning-of-line |
| IMGUI_API const char* ImStristr(const char* haystack, const char* haystack_end, const char* needle, const char* needle_end); |
| IMGUI_API void ImStrTrimBlanks(char* str); |
| IMGUI_API const char* ImStrSkipBlank(const char* str); |
| IMGUI_API int ImFormatString(char* buf, size_t buf_size, const char* fmt, ...) IM_FMTARGS(3); |
| IMGUI_API int ImFormatStringV(char* buf, size_t buf_size, const char* fmt, va_list args) IM_FMTLIST(3); |
| IMGUI_API const char* ImParseFormatFindStart(const char* format); |
| IMGUI_API const char* ImParseFormatFindEnd(const char* format); |
| IMGUI_API const char* ImParseFormatTrimDecorations(const char* format, char* buf, size_t buf_size); |
| IMGUI_API int ImParseFormatPrecision(const char* format, int default_value); |
| static inline bool ImCharIsBlankA(char c) { return c == ' ' || c == '\t'; } |
| static inline bool ImCharIsBlankW(unsigned int c) { return c == ' ' || c == '\t' || c == 0x3000; } |
| |
| // Helpers: UTF-8 <> wchar conversions |
| IMGUI_API int ImTextStrToUtf8(char* buf, int buf_size, const ImWchar* in_text, const ImWchar* in_text_end); // return output UTF-8 bytes count |
| 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 |
| IMGUI_API int ImTextStrFromUtf8(ImWchar* buf, int buf_size, const char* in_text, const char* in_text_end, const char** in_remaining = NULL); // return input UTF-8 bytes count |
| IMGUI_API int ImTextCountCharsFromUtf8(const char* in_text, const char* in_text_end); // return number of UTF-8 code-points (NOT bytes count) |
| IMGUI_API int ImTextCountUtf8BytesFromChar(const char* in_text, const char* in_text_end); // return number of bytes to express one char in UTF-8 |
| IMGUI_API int ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_end); // return number of bytes to express string in UTF-8 |
| |
| // Helpers: ImVec2/ImVec4 operators |
| // We are keeping those disabled by default so they don't leak in user space, to allow user enabling implicit cast operators between ImVec2 and their own types (using IM_VEC2_CLASS_EXTRA etc.) |
| // We unfortunately don't have a unary- operator for ImVec2 because this would needs to be defined inside the class itself. |
| #ifdef IMGUI_DEFINE_MATH_OPERATORS |
| static inline ImVec2 operator*(const ImVec2& lhs, const float rhs) { return ImVec2(lhs.x * rhs, lhs.y * rhs); } |
| static inline ImVec2 operator/(const ImVec2& lhs, const float rhs) { return ImVec2(lhs.x / rhs, lhs.y / rhs); } |
| static inline ImVec2 operator+(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x + rhs.x, lhs.y + rhs.y); } |
| static inline ImVec2 operator-(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x - rhs.x, lhs.y - rhs.y); } |
| static inline ImVec2 operator*(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x * rhs.x, lhs.y * rhs.y); } |
| static inline ImVec2 operator/(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x / rhs.x, lhs.y / rhs.y); } |
| static inline ImVec2& operator*=(ImVec2& lhs, const float rhs) { lhs.x *= rhs; lhs.y *= rhs; return lhs; } |
| static inline ImVec2& operator/=(ImVec2& lhs, const float rhs) { lhs.x /= rhs; lhs.y /= rhs; return lhs; } |
| static inline ImVec2& operator+=(ImVec2& lhs, const ImVec2& rhs) { lhs.x += rhs.x; lhs.y += rhs.y; return lhs; } |
| static inline ImVec2& operator-=(ImVec2& lhs, const ImVec2& rhs) { lhs.x -= rhs.x; lhs.y -= rhs.y; return lhs; } |
| static inline ImVec2& operator*=(ImVec2& lhs, const ImVec2& rhs) { lhs.x *= rhs.x; lhs.y *= rhs.y; return lhs; } |
| static inline ImVec2& operator/=(ImVec2& lhs, const ImVec2& rhs) { lhs.x /= rhs.x; lhs.y /= rhs.y; return lhs; } |
| static inline ImVec4 operator+(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x + rhs.x, lhs.y + rhs.y, lhs.z + rhs.z, lhs.w + rhs.w); } |
| static inline ImVec4 operator-(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x - rhs.x, lhs.y - rhs.y, lhs.z - rhs.z, lhs.w - rhs.w); } |
| static inline ImVec4 operator*(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x * rhs.x, lhs.y * rhs.y, lhs.z * rhs.z, lhs.w * rhs.w); } |
| #endif |
| |
| // Helpers: File System |
| #ifdef IMGUI_DISABLE_FILE_FUNCTIONS |
| #define IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS |
| typedef void* ImFileHandle; |
| static inline ImFileHandle ImFileOpen(const char*, const char*) { return NULL; } |
| static inline bool ImFileClose(ImFileHandle) { return false; } |
| static inline ImU64 ImFileGetSize(ImFileHandle) { return (ImU64)-1; } |
| static inline ImU64 ImFileRead(void*, ImU64, ImU64, ImFileHandle) { return 0; } |
| static inline ImU64 ImFileWrite(const void*, ImU64, ImU64, ImFileHandle) { return 0; } |
| #endif |
| #ifndef IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS |
| typedef FILE* ImFileHandle; |
| IMGUI_API ImFileHandle ImFileOpen(const char* filename, const char* mode); |
| IMGUI_API bool ImFileClose(ImFileHandle file); |
| IMGUI_API ImU64 ImFileGetSize(ImFileHandle file); |
| IMGUI_API ImU64 ImFileRead(void* data, ImU64 size, ImU64 count, ImFileHandle file); |
| IMGUI_API ImU64 ImFileWrite(const void* data, ImU64 size, ImU64 count, ImFileHandle file); |
| #else |
| #define IMGUI_DISABLE_TTY_FUNCTIONS // Can't use stdout, fflush if we are not using default file functions |
| #endif |
| IMGUI_API void* ImFileLoadToMemory(const char* filename, const char* mode, size_t* out_file_size = NULL, int padding_bytes = 0); |
| |
| // Helpers: Maths |
| // - Wrapper for standard libs functions. (Note that imgui_demo.cpp does _not_ use them to keep the code easy to copy) |
| #ifndef IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS |
| #define ImFabs(X) fabsf(X) |
| #define ImSqrt(X) sqrtf(X) |
| #define ImFmod(X, Y) fmodf((X), (Y)) |
| #define ImCos(X) cosf(X) |
| #define ImSin(X) sinf(X) |
| #define ImAcos(X) acosf(X) |
| #define ImAtan2(Y, X) atan2f((Y), (X)) |
| #define ImAtof(STR) atof(STR) |
| #define ImFloorStd(X) floorf(X) // We already uses our own ImFloor() { return (float)(int)v } internally so the standard one wrapper is named differently (it's used by e.g. stb_truetype) |
| #define ImCeil(X) ceilf(X) |
| static inline float ImPow(float x, float y) { return powf(x, y); } // DragBehaviorT/SliderBehaviorT uses ImPow with either float/double and need the precision |
| static inline double ImPow(double x, double y) { return pow(x, y); } |
| static inline float ImLog(float x) { return logf(x); } // DragBehaviorT/SliderBehaviorT uses ImLog with either float/double and need the precision |
| static inline double ImLog(double x) { return log(x); } |
| static inline float ImAbs(float x) { return fabsf(x); } |
| static inline double ImAbs(double x) { return fabs(x); } |
| 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 |
| static inline double ImSign(double x) { return (x < 0.0) ? -1.0 : ((x > 0.0) ? 1.0 : 0.0); } |
| #endif |
| // - ImMin/ImMax/ImClamp/ImLerp/ImSwap are used by widgets which support variety of types: signed/unsigned int/long long float/double |
| // (Exceptionally using templates here but we could also redefine them for those types) |
| template<typename T> static inline T ImMin(T lhs, T rhs) { return lhs < rhs ? lhs : rhs; } |
| template<typename T> static inline T ImMax(T lhs, T rhs) { return lhs >= rhs ? lhs : rhs; } |
| template<typename T> static inline T ImClamp(T v, T mn, T mx) { return (v < mn) ? mn : (v > mx) ? mx : v; } |
| template<typename T> static inline T ImLerp(T a, T b, float t) { return (T)(a + (b - a) * t); } |
| template<typename T> static inline void ImSwap(T& a, T& b) { T tmp = a; a = b; b = tmp; } |
| 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; } |
| 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; } |
| // - Misc maths helpers |
| 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); } |
| 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); } |
| static inline ImVec2 ImClamp(const ImVec2& v, const ImVec2& mn, ImVec2 mx) { return ImVec2((v.x < mn.x) ? mn.x : (v.x > mx.x) ? mx.x : v.x, (v.y < mn.y) ? mn.y : (v.y > mx.y) ? mx.y : v.y); } |
| 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); } |
| 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); } |
| 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); } |
| static inline float ImSaturate(float f) { return (f < 0.0f) ? 0.0f : (f > 1.0f) ? 1.0f : f; } |
| static inline float ImLengthSqr(const ImVec2& lhs) { return (lhs.x * lhs.x) + (lhs.y * lhs.y); } |
| static inline float ImLengthSqr(const ImVec4& lhs) { return (lhs.x * lhs.x) + (lhs.y * lhs.y) + (lhs.z * lhs.z) + (lhs.w * lhs.w); } |
| static inline float ImInvLength(const ImVec2& lhs, float fail_value) { float d = (lhs.x * lhs.x) + (lhs.y * lhs.y); if (d > 0.0f) return 1.0f / ImSqrt(d); return fail_value; } |
| static inline float ImFloor(float f) { return (float)(int)(f); } |
| static inline ImVec2 ImFloor(const ImVec2& v) { return ImVec2((float)(int)(v.x), (float)(int)(v.y)); } |
| static inline int ImModPositive(int a, int b) { return (a + b) % b; } |
| static inline float ImDot(const ImVec2& a, const ImVec2& b) { return a.x * b.x + a.y * b.y; } |
| 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); } |
| 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; } |
| static inline ImVec2 ImMul(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x * rhs.x, lhs.y * rhs.y); } |
| |
| // Helpers: Geometry |
| IMGUI_API ImVec2 ImBezierCubicCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, float t); |
| 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 |
| 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 |
| IMGUI_API ImVec2 ImBezierQuadraticCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, float t); |
| IMGUI_API ImVec2 ImLineClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& p); |
| IMGUI_API bool ImTriangleContainsPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p); |
| IMGUI_API ImVec2 ImTriangleClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p); |
| 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); |
| 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; } |
| IMGUI_API ImGuiDir ImGetDirQuadrantFromDelta(float dx, float dy); |
| |
| // Helper: ImVec1 (1D vector) |
| // (this odd construct is used to facilitate the transition between 1D and 2D, and the maintenance of some branches/patches) |
| struct ImVec1 |
| { |
| float x; |
| ImVec1() { x = 0.0f; } |
| ImVec1(float _x) { x = _x; } |
| }; |
| |
| // Helper: ImVec2ih (2D vector, half-size integer, for long-term packed storage) |
| struct ImVec2ih |
| { |
| short x, y; |
| ImVec2ih() { x = y = 0; } |
| ImVec2ih(short _x, short _y) { x = _x; y = _y; } |
| explicit ImVec2ih(const ImVec2& rhs) { x = (short)rhs.x; y = (short)rhs.y; } |
| }; |
| |
| // Helper: ImRect (2D axis aligned bounding-box) |
| // NB: we can't rely on ImVec2 math operators being available here! |
| struct IMGUI_API ImRect |
| { |
| ImVec2 Min; // Upper-left |
| ImVec2 Max; // Lower-right |
| |
| ImRect() : Min(0.0f, 0.0f), Max(0.0f, 0.0f) {} |
| ImRect(const ImVec2& min, const ImVec2& max) : Min(min), Max(max) {} |
| ImRect(const ImVec4& v) : Min(v.x, v.y), Max(v.z, v.w) {} |
| ImRect(float x1, float y1, float x2, float y2) : Min(x1, y1), Max(x2, y2) {} |
| |
| ImVec2 GetCenter() const { return ImVec2((Min.x + Max.x) * 0.5f, (Min.y + Max.y) * 0.5f); } |
| ImVec2 GetSize() const { return ImVec2(Max.x - Min.x, Max.y - Min.y); } |
| float GetWidth() const { return Max.x - Min.x; } |
| float GetHeight() const { return Max.y - Min.y; } |
| ImVec2 GetTL() const { return Min; } // Top-left |
| ImVec2 GetTR() const { return ImVec2(Max.x, Min.y); } // Top-right |
| ImVec2 GetBL() const { return ImVec2(Min.x, Max.y); } // Bottom-left |
| ImVec2 GetBR() const { return Max; } // Bottom-right |
| bool Contains(const ImVec2& p) const { return p.x >= Min.x && p.y >= Min.y && p.x < Max.x && p.y < Max.y; } |
| 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; } |
| 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; } |
| 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; } |
| 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; } |
| void Expand(const float amount) { Min.x -= amount; Min.y -= amount; Max.x += amount; Max.y += amount; } |
| void Expand(const ImVec2& amount) { Min.x -= amount.x; Min.y -= amount.y; Max.x += amount.x; Max.y += amount.y; } |
| void Translate(const ImVec2& d) { Min.x += d.x; Min.y += d.y; Max.x += d.x; Max.y += d.y; } |
| void TranslateX(float dx) { Min.x += dx; Max.x += dx; } |
| void TranslateY(float dy) { Min.y += dy; Max.y += dy; } |
| 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. |
| 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. |
| void Floor() { Min.x = IM_FLOOR(Min.x); Min.y = IM_FLOOR(Min.y); Max.x = IM_FLOOR(Max.x); Max.y = IM_FLOOR(Max.y); } |
| bool IsInverted() const { return Min.x > Max.x || Min.y > Max.y; } |
| ImVec4 ToVec4() const { return ImVec4(Min.x, Min.y, Max.x, Max.y); } |
| }; |
| |
| // Helper: ImBitArray |
| inline bool ImBitArrayTestBit(const ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); return (arr[n >> 5] & mask) != 0; } |
| inline void ImBitArrayClearBit(ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); arr[n >> 5] &= ~mask; } |
| inline void ImBitArraySetBit(ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); arr[n >> 5] |= mask; } |
| inline void ImBitArraySetBitRange(ImU32* arr, int n, int n2) |
| { |
| while (n <= n2) |
| { |
| int a_mod = (n & 31); |
| int b_mod = (n2 > (n | 31) ? 31 : (n2 & 31)) + 1; |
| ImU32 mask = (ImU32)(((ImU64)1 << b_mod) - 1) & ~(ImU32)(((ImU64)1 << a_mod) - 1); |
| arr[n >> 5] |= mask; |
| n = (n + 32) & ~31; |
| } |
| } |
| |
| // Helper: ImBitArray class (wrapper over ImBitArray functions) |
| // Store 1-bit per value. NOT CLEARED by constructor. |
| template<int BITCOUNT> |
| struct IMGUI_API ImBitArray |
| { |
| ImU32 Storage[(BITCOUNT + 31) >> 5]; |
| ImBitArray() { } |
| void ClearBits() { memset(Storage, 0, sizeof(Storage)); } |
| bool TestBit(int n) const { IM_ASSERT(n < BITCOUNT); return ImBitArrayTestBit(Storage, n); } |
| void SetBit(int n) { IM_ASSERT(n < BITCOUNT); ImBitArraySetBit(Storage, n); } |
| void ClearBit(int n) { IM_ASSERT(n < BITCOUNT); ImBitArrayClearBit(Storage, n); } |
| void SetBitRange(int n1, int n2) { ImBitArraySetBitRange(Storage, n1, n2); } |
| }; |
| |
| // Helper: ImBitVector |
| // Store 1-bit per value. |
| struct IMGUI_API ImBitVector |
| { |
| ImVector<ImU32> Storage; |
| void Create(int sz) { Storage.resize((sz + 31) >> 5); memset(Storage.Data, 0, (size_t)Storage.Size * sizeof(Storage.Data[0])); } |
| void Clear() { Storage.clear(); } |
| bool TestBit(int n) const { IM_ASSERT(n < (Storage.Size << 5)); return ImBitArrayTestBit(Storage.Data, n); } |
| void SetBit(int n) { IM_ASSERT(n < (Storage.Size << 5)); ImBitArraySetBit(Storage.Data, n); } |
| void ClearBit(int n) { IM_ASSERT(n < (Storage.Size << 5)); ImBitArrayClearBit(Storage.Data, n); } |
| }; |
| |
| // Helper: ImSpan<> |
| // Pointing to a span of data we don't own. |
| template<typename T> |
| struct ImSpan |
| { |
| T* Data; |
| T* DataEnd; |
| |
| // Constructors, destructor |
| inline ImSpan() { Data = DataEnd = NULL; } |
| inline ImSpan(T* data, int size) { Data = data; DataEnd = data + size; } |
| inline ImSpan(T* data, T* data_end) { Data = data; DataEnd = data_end; } |
| |
| inline void set(T* data, int size) { Data = data; DataEnd = data + size; } |
| inline void set(T* data, T* data_end) { Data = data; DataEnd = data_end; } |
| inline int size() const { return (int)(ptrdiff_t)(DataEnd - Data); } |
| inline int size_in_bytes() const { return (int)(ptrdiff_t)(DataEnd - Data) * (int)sizeof(T); } |
| inline T& operator[](int i) { T* p = Data + i; IM_ASSERT(p >= Data && p < DataEnd); return *p; } |
| inline const T& operator[](int i) const { const T* p = Data + i; IM_ASSERT(p >= Data && p < DataEnd); return *p; } |
| |
| inline T* begin() { return Data; } |
| inline const T* begin() const { return Data; } |
| inline T* end() { return DataEnd; } |
| inline const T* end() const { return DataEnd; } |
| |
| // Utilities |
| inline int index_from_ptr(const T* it) const { IM_ASSERT(it >= Data && it < DataEnd); const ptrdiff_t off = it - Data; return (int)off; } |
| }; |
| |
| // Helper: ImSpanAllocator<> |
| // Facilitate storing multiple chunks into a single large block (the "arena") |
| template<int CHUNKS> |
| struct ImSpanAllocator |
| { |
| char* BasePtr; |
| int TotalSize; |
| int CurrSpan; |
| int Offsets[CHUNKS]; |
| |
| ImSpanAllocator() { memset(this, 0, sizeof(*this)); } |
| inline void ReserveBytes(int n, size_t sz) { IM_ASSERT(n == CurrSpan && n < CHUNKS); IM_UNUSED(n); Offsets[CurrSpan++] = TotalSize; TotalSize += (int)sz; } |
| inline int GetArenaSizeInBytes() { return TotalSize; } |
| inline void SetArenaBasePtr(void* base_ptr) { BasePtr = (char*)base_ptr; } |
| inline void* GetSpanPtrBegin(int n) { IM_ASSERT(n >= 0 && n < CHUNKS && CurrSpan == CHUNKS); return (void*)(BasePtr + Offsets[n]); } |
| inline void* GetSpanPtrEnd(int n) { IM_ASSERT(n >= 0 && n < CHUNKS && CurrSpan == CHUNKS); return (n + 1 < CHUNKS) ? BasePtr + Offsets[n + 1] : (void*)(BasePtr + TotalSize); } |
| template<typename T> |
| inline void GetSpan(int n, ImSpan<T>* span) { span->set((T*)GetSpanPtrBegin(n), (T*)GetSpanPtrEnd(n)); } |
| }; |
| |
| // Helper: ImPool<> |
| // Basic keyed storage for contiguous instances, slow/amortized insertion, O(1) indexable, O(Log N) queries by ID over a dense/hot buffer, |
| // Honor constructor/destructor. Add/remove invalidate all pointers. Indexes have the same lifetime as the associated object. |
| typedef int ImPoolIdx; |
| template<typename T> |
| struct IMGUI_API ImPool |
| { |
| ImVector<T> Buf; // Contiguous data |
| ImGuiStorage Map; // ID->Index |
| ImPoolIdx FreeIdx; // Next free idx to use |
| |
| ImPool() { FreeIdx = 0; } |
| ~ImPool() { Clear(); } |
| T* GetByKey(ImGuiID key) { int idx = Map.GetInt(key, -1); return (idx != -1) ? &Buf[idx] : NULL; } |
| T* GetByIndex(ImPoolIdx n) { return &Buf[n]; } |
| ImPoolIdx GetIndex(const T* p) const { IM_ASSERT(p >= Buf.Data && p < Buf.Data + Buf.Size); return (ImPoolIdx)(p - Buf.Data); } |
| T* GetOrAddByKey(ImGuiID key) { int* p_idx = Map.GetIntRef(key, -1); if (*p_idx != -1) return &Buf[*p_idx]; *p_idx = FreeIdx; return Add(); } |
| bool Contains(const T* p) const { return (p >= Buf.Data && p < Buf.Data + Buf.Size); } |
| void Clear() { for (int n = 0; n < Map.Data.Size; n++) { int idx = Map.Data[n].val_i; if (idx != -1) Buf[idx].~T(); } Map.Clear(); Buf.clear(); FreeIdx = 0; } |
| T* Add() { int idx = FreeIdx; if (idx == Buf.Size) { Buf.resize(Buf.Size + 1); FreeIdx++; } else { FreeIdx = *(int*)&Buf[idx]; } IM_PLACEMENT_NEW(&Buf[idx]) T(); return &Buf[idx]; } |
| void Remove(ImGuiID key, const T* p) { Remove(key, GetIndex(p)); } |
| void Remove(ImGuiID key, ImPoolIdx idx) { Buf[idx].~T(); *(int*)&Buf[idx] = FreeIdx; FreeIdx = idx; Map.SetInt(key, -1); } |
| void Reserve(int capacity) { Buf.reserve(capacity); Map.Data.reserve(capacity); } |
| int GetSize() const { return Buf.Size; } |
| }; |
| |
| // Helper: ImChunkStream<> |
| // Build and iterate a contiguous stream of variable-sized structures. |
| // This is used by Settings to store persistent data while reducing allocation count. |
| // We store the chunk size first, and align the final size on 4 bytes boundaries (this what the '(X + 3) & ~3' statement is for) |
| // The tedious/zealous amount of casting is to avoid -Wcast-align warnings. |
| template<typename T> |
| struct IMGUI_API ImChunkStream |
| { |
| ImVector<char> Buf; |
| |
| void clear() { Buf.clear(); } |
| bool empty() const { return Buf.Size == 0; } |
| int size() const { return Buf.Size; } |
| T* alloc_chunk(size_t sz) { size_t HDR_SZ = 4; sz = ((HDR_SZ + sz) + 3u) & ~3u; 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); } |
| T* begin() { size_t HDR_SZ = 4; if (!Buf.Data) return NULL; return (T*)(void*)(Buf.Data + HDR_SZ); } |
| 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; } |
| int chunk_size(const T* p) { return ((const int*)p)[-1]; } |
| T* end() { return (T*)(void*)(Buf.Data + Buf.Size); } |
| 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; } |
| T* ptr_from_offset(int off) { IM_ASSERT(off >= 4 && off < Buf.Size); return (T*)(void*)(Buf.Data + off); } |
| void swap(ImChunkStream<T>& rhs) { rhs.Buf.swap(Buf); } |
| |
| }; |
| |
| //----------------------------------------------------------------------------- |
| // [SECTION] ImDrawList support |
| //----------------------------------------------------------------------------- |
| |
| // ImDrawList: Helper function to calculate a circle's segment count given its radius and a "maximum error" value. |
| #define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MIN 12 |
| #define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX 512 |
| #define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC(_RAD,_MAXERROR) ImClamp((int)((IM_PI * 2.0f) / ImAcos(((_RAD) - (_MAXERROR)) / (_RAD))), IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MIN, IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX) |
| |
| // ImDrawList: You may set this to higher values (e.g. 2 or 3) to increase tessellation of fast rounded corners path. |
| #ifndef IM_DRAWLIST_ARCFAST_TESSELLATION_MULTIPLIER |
| #define IM_DRAWLIST_ARCFAST_TESSELLATION_MULTIPLIER 1 |
| #endif |
| |
| // Data shared between all ImDrawList instances |
| // 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. |
| struct IMGUI_API ImDrawListSharedData |
| { |
| ImVec2 TexUvWhitePixel; // UV of white pixel in the atlas |
| ImFont* Font; // Current/default font (optional, for simplified AddText overload) |
| float FontSize; // Current/default font size (optional, for simplified AddText overload) |
| float CurveTessellationTol; // Tessellation tolerance when using PathBezierCurveTo() |
| float CircleSegmentMaxError; // Number of circle segments to use per pixel of radius for AddCircle() etc |
| ImVec4 ClipRectFullscreen; // Value for PushClipRectFullscreen() |
| ImDrawListFlags InitialFlags; // Initial flags at the beginning of the frame (it is possible to alter flags on a per-drawlist basis afterwards) |
| |
| // [Internal] Lookup tables |
| ImVec2 ArcFastVtx[12 * IM_DRAWLIST_ARCFAST_TESSELLATION_MULTIPLIER]; // FIXME: Bake rounded corners fill/borders in atlas |
| ImU8 CircleSegmentCounts[64]; // Precomputed segment count for given radius (array index + 1) before we calculate it dynamically (to avoid calculation overhead) |
| const ImVec4* TexUvLines; // UV of anti-aliased lines in the atlas |
| |
| ImDrawListSharedData(); |
| void SetCircleSegmentMaxError(float max_error); |
| }; |
| |
| struct ImDrawDataBuilder |
| { |
| ImVector<ImDrawList*> Layers[2]; // Global layers for: regular, tooltip |
| |
| void Clear() { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].resize(0); } |
| void ClearFreeMemory() { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].clear(); } |
| IMGUI_API void FlattenIntoSingleLayer(); |
| }; |
| |
| //----------------------------------------------------------------------------- |
| // [SECTION] Widgets support: flags, enums, data structures |
| //----------------------------------------------------------------------------- |
| |
| // Transient per-window flags, reset at the beginning of the frame. For child window, inherited from parent on first Begin(). |
| // This is going to be exposed in imgui.h when stabilized enough. |
| enum ImGuiItemFlags_ |
| { |
| ImGuiItemFlags_None = 0, |
| ImGuiItemFlags_NoTabStop = 1 << 0, // false |
| ImGuiItemFlags_ButtonRepeat = 1 << 1, // false // Button() will return true multiple times based on io.KeyRepeatDelay and io.KeyRepeatRate settings. |
| ImGuiItemFlags_Disabled = 1 << 2, // false // [BETA] Disable interactions but doesn't affect visuals yet. See github.com/ocornut/imgui/issues/211 |
| ImGuiItemFlags_NoNav = 1 << 3, // false |
| ImGuiItemFlags_NoNavDefaultFocus = 1 << 4, // false |
| ImGuiItemFlags_SelectableDontClosePopup = 1 << 5, // false // MenuItem/Selectable() automatically closes current Popup window |
| ImGuiItemFlags_MixedValue = 1 << 6, // false // [BETA] Represent a mixed/indeterminate value, generally multi-selection where values differ. Currently only supported by Checkbox() (later should support all sorts of widgets) |
| ImGuiItemFlags_ReadOnly = 1 << 7, // false // [ALPHA] Allow hovering interactions but underlying value is not changed. |
| ImGuiItemFlags_Default_ = 0 |
| }; |
| |
| // Storage for LastItem data |
| enum ImGuiItemStatusFlags_ |
| { |
| ImGuiItemStatusFlags_None = 0, |
| ImGuiItemStatusFlags_HoveredRect = 1 << 0, |
| ImGuiItemStatusFlags_HasDisplayRect = 1 << 1, |
| ImGuiItemStatusFlags_Edited = 1 << 2, // Value exposed by item was edited in the current frame (should match the bool return value of most widgets) |
| ImGuiItemStatusFlags_ToggledSelection = 1 << 3, // Set when Selectable(), TreeNode() reports toggling a selection. We can't report "Selected" because reporting the change allows us to handle clipping with less issues. |
| ImGuiItemStatusFlags_ToggledOpen = 1 << 4, // Set when TreeNode() reports toggling their open state. |
| ImGuiItemStatusFlags_HasDeactivated = 1 << 5, // Set if the widget/group is able to provide data for the ImGuiItemStatusFlags_Deactivated flag. |
| ImGuiItemStatusFlags_Deactivated = 1 << 6 // Only valid if ImGuiItemStatusFlags_HasDeactivated is set. |
| |
| #ifdef IMGUI_ENABLE_TEST_ENGINE |
| , // [imgui_tests only] |
| ImGuiItemStatusFlags_Openable = 1 << 10, // |
| ImGuiItemStatusFlags_Opened = 1 << 11, // |
| ImGuiItemStatusFlags_Checkable = 1 << 12, // |
| ImGuiItemStatusFlags_Checked = 1 << 13 // |
| #endif |
| }; |
| |
| // Extend ImGuiButtonFlags_ |
| enum ImGuiButtonFlagsPrivate_ |
| { |
| ImGuiButtonFlags_PressedOnClick = 1 << 4, // return true on click (mouse down event) |
| ImGuiButtonFlags_PressedOnClickRelease = 1 << 5, // [Default] return true on click + release on same item <-- this is what the majority of Button are using |
| ImGuiButtonFlags_PressedOnClickReleaseAnywhere = 1 << 6, // return true on click + release even if the release event is not done while hovering the item |
| ImGuiButtonFlags_PressedOnRelease = 1 << 7, // return true on release (default requires click+release) |
| ImGuiButtonFlags_PressedOnDoubleClick = 1 << 8, // return true on double-click (default requires click+release) |
| 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) |
| ImGuiButtonFlags_Repeat = 1 << 10, // hold to repeat |
| ImGuiButtonFlags_FlattenChildren = 1 << 11, // allow interactions even if a child window is overlapping |
| ImGuiButtonFlags_AllowItemOverlap = 1 << 12, // require previous frame HoveredId to either match id or be null before being usable, use along with SetItemAllowOverlap() |
| ImGuiButtonFlags_DontClosePopups = 1 << 13, // disable automatically closing parent popup on press // [UNUSED] |
| ImGuiButtonFlags_Disabled = 1 << 14, // disable interactions |
| 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 |
| ImGuiButtonFlags_NoKeyModifiers = 1 << 16, // disable mouse interaction if a key modifier is held |
| ImGuiButtonFlags_NoHoldingActiveId = 1 << 17, // don't set ActiveId while holding the mouse (ImGuiButtonFlags_PressedOnClick only) |
| ImGuiButtonFlags_NoNavFocus = 1 << 18, // don't override navigation focus when activated |
| ImGuiButtonFlags_NoHoveredOnFocus = 1 << 19, // don't report as hovered when nav focus is on this item |
| ImGuiButtonFlags_PressedOnMask_ = ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnClickReleaseAnywhere | ImGuiButtonFlags_PressedOnRelease | ImGuiButtonFlags_PressedOnDoubleClick | ImGuiButtonFlags_PressedOnDragDropHold, |
| ImGuiButtonFlags_PressedOnDefault_ = ImGuiButtonFlags_PressedOnClickRelease |
| }; |
| |
| // Extend ImGuiSliderFlags_ |
| enum ImGuiSliderFlagsPrivate_ |
| { |
| ImGuiSliderFlags_Vertical = 1 << 20, // Should this slider be orientated vertically? |
| ImGuiSliderFlags_ReadOnly = 1 << 21 |
| }; |
| |
| // Extend ImGuiSelectableFlags_ |
| enum ImGuiSelectableFlagsPrivate_ |
| { |
| // NB: need to be in sync with last value of ImGuiSelectableFlags_ |
| ImGuiSelectableFlags_NoHoldingActiveID = 1 << 20, |
| ImGuiSelectableFlags_SelectOnClick = 1 << 21, // Override button behavior to react on Click (default is Click+Release) |
| ImGuiSelectableFlags_SelectOnRelease = 1 << 22, // Override button behavior to react on Release (default is Click+Release) |
| ImGuiSelectableFlags_SpanAvailWidth = 1 << 23, // Span all avail width even if we declared less for layout purpose. FIXME: We may be able to remove this (added in 6251d379, 2bcafc86 for menus) |
| ImGuiSelectableFlags_DrawHoveredWhenHeld = 1 << 24, // Always show active when held, even is not hovered. This concept could probably be renamed/formalized somehow. |
| ImGuiSelectableFlags_SetNavIdOnHover = 1 << 25, // Set Nav/Focus ID on mouse hover (used by MenuItem) |
| ImGuiSelectableFlags_NoPadWithHalfSpacing = 1 << 26 // Disable padding each side with ItemSpacing * 0.5f |
| }; |
| |
| // Extend ImGuiTreeNodeFlags_ |
| enum ImGuiTreeNodeFlagsPrivate_ |
| { |
| ImGuiTreeNodeFlags_ClipLabelForTrailingButton = 1 << 20 |
| }; |
| |
| enum ImGuiSeparatorFlags_ |
| { |
| ImGuiSeparatorFlags_None = 0, |
| ImGuiSeparatorFlags_Horizontal = 1 << 0, // Axis default to current layout type, so generally Horizontal unless e.g. in a menu bar |
| ImGuiSeparatorFlags_Vertical = 1 << 1, |
| ImGuiSeparatorFlags_SpanAllColumns = 1 << 2 |
| }; |
| |
| enum ImGuiTextFlags_ |
| { |
| ImGuiTextFlags_None = 0, |
| ImGuiTextFlags_NoWidthForLargeClippedText = 1 << 0 |
| }; |
| |
| enum ImGuiTooltipFlags_ |
| { |
| ImGuiTooltipFlags_None = 0, |
| ImGuiTooltipFlags_OverridePreviousTooltip = 1 << 0 // Override will clear/ignore previously submitted tooltip (defaults to append) |
| }; |
| |
| // FIXME: this is in development, not exposed/functional as a generic feature yet. |
| // Horizontal/Vertical enums are fixed to 0/1 so they may be used to index ImVec2 |
| enum ImGuiLayoutType_ |
| { |
| ImGuiLayoutType_Horizontal = 0, |
| ImGuiLayoutType_Vertical = 1 |
| }; |
| |
| enum ImGuiLogType |
| { |
| ImGuiLogType_None = 0, |
| ImGuiLogType_TTY, |
| ImGuiLogType_File, |
| ImGuiLogType_Buffer, |
| ImGuiLogType_Clipboard |
| }; |
| |
| // X/Y enums are fixed to 0/1 so they may be used to index ImVec2 |
| enum ImGuiAxis |
| { |
| ImGuiAxis_None = -1, |
| ImGuiAxis_X = 0, |
| ImGuiAxis_Y = 1 |
| }; |
| |
| enum ImGuiPlotType |
| { |
| ImGuiPlotType_Lines, |
| ImGuiPlotType_Histogram |
| }; |
| |
| enum ImGuiInputSource |
| { |
| ImGuiInputSource_None = 0, |
| ImGuiInputSource_Mouse, |
| ImGuiInputSource_Nav, |
| ImGuiInputSource_NavKeyboard, // Only used occasionally for storage, not tested/handled by most code |
| ImGuiInputSource_NavGamepad, // " |
| ImGuiInputSource_COUNT |
| }; |
| |
| // FIXME-NAV: Clarify/expose various repeat delay/rate |
| enum ImGuiInputReadMode |
| { |
| ImGuiInputReadMode_Down, |
| ImGuiInputReadMode_Pressed, |
| ImGuiInputReadMode_Released, |
| ImGuiInputReadMode_Repeat, |
| ImGuiInputReadMode_RepeatSlow, |
| ImGuiInputReadMode_RepeatFast |
| }; |
| |
| enum ImGuiNavHighlightFlags_ |
| { |
| ImGuiNavHighlightFlags_None = 0, |
| ImGuiNavHighlightFlags_TypeDefault = 1 << 0, |
| ImGuiNavHighlightFlags_TypeThin = 1 << 1, |
| ImGuiNavHighlightFlags_AlwaysDraw = 1 << 2, // Draw rectangular highlight if (g.NavId == id) _even_ when using the mouse. |
| ImGuiNavHighlightFlags_NoRounding = 1 << 3 |
| }; |
| |
| enum ImGuiNavDirSourceFlags_ |
| { |
| ImGuiNavDirSourceFlags_None = 0, |
| ImGuiNavDirSourceFlags_Keyboard = 1 << 0, |
| ImGuiNavDirSourceFlags_PadDPad = 1 << 1, |
| ImGuiNavDirSourceFlags_PadLStick = 1 << 2 |
| }; |
| |
| enum ImGuiNavMoveFlags_ |
| { |
| ImGuiNavMoveFlags_None = 0, |
| ImGuiNavMoveFlags_LoopX = 1 << 0, // On failed request, restart from opposite side |
| ImGuiNavMoveFlags_LoopY = 1 << 1, |
| ImGuiNavMoveFlags_WrapX = 1 << 2, // On failed request, request from opposite side one line down (when NavDir==right) or one line up (when NavDir==left) |
| ImGuiNavMoveFlags_WrapY = 1 << 3, // This is not super useful for provided for completeness |
| 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) |
| ImGuiNavMoveFlags_AlsoScoreVisibleSet = 1 << 5, // Store alternate result in NavMoveResultLocalVisibleSet that only comprise elements that are already fully visible. |
| ImGuiNavMoveFlags_ScrollToEdge = 1 << 6 |
| }; |
| |
| enum ImGuiNavForward |
| { |
| ImGuiNavForward_None, |
| ImGuiNavForward_ForwardQueued, |
| ImGuiNavForward_ForwardActive |
| }; |
| |
| enum ImGuiNavLayer |
| { |
| ImGuiNavLayer_Main = 0, // Main scrolling layer |
| ImGuiNavLayer_Menu = 1, // Menu layer (access with Alt/ImGuiNavInput_Menu) |
| ImGuiNavLayer_COUNT |
| }; |
| |
| enum ImGuiPopupPositionPolicy |
| { |
| ImGuiPopupPositionPolicy_Default, |
| ImGuiPopupPositionPolicy_ComboBox, |
| ImGuiPopupPositionPolicy_Tooltip |
| }; |
| |
| struct ImGuiDataTypeTempStorage |
| { |
| ImU8 Data[8]; // Can fit any data up to ImGuiDataType_COUNT |
| }; |
| |
| // Type information associated to one ImGuiDataType. Retrieve with DataTypeGetInfo(). |
| struct ImGuiDataTypeInfo |
| { |
| size_t Size; // Size in bytes |
| const char* Name; // Short descriptive name for the type, for debugging |
| const char* PrintFmt; // Default printf format for the type |
| const char* ScanFmt; // Default scanf format for the type |
| }; |
| |
| // Extend ImGuiDataType_ |
| enum ImGuiDataTypePrivate_ |
| { |
| ImGuiDataType_String = ImGuiDataType_COUNT + 1, |
| ImGuiDataType_Pointer, |
| ImGuiDataType_ID |
| }; |
| |
| // Stacked color modifier, backup of modified data so we can restore it |
| struct ImGuiColorMod |
| { |
| ImGuiCol Col; |
| ImVec4 BackupValue; |
| }; |
| |
| // Stacked style modifier, backup of modified data so we can restore it. Data type inferred from the variable. |
| struct ImGuiStyleMod |
| { |
| ImGuiStyleVar VarIdx; |
| union { int BackupInt[2]; float BackupFloat[2]; }; |
| ImGuiStyleMod(ImGuiStyleVar idx, int v) { VarIdx = idx; BackupInt[0] = v; } |
| ImGuiStyleMod(ImGuiStyleVar idx, float v) { VarIdx = idx; BackupFloat[0] = v; } |
| ImGuiStyleMod(ImGuiStyleVar idx, ImVec2 v) { VarIdx = idx; BackupFloat[0] = v.x; BackupFloat[1] = v.y; } |
| }; |
| |
| // Stacked storage data for BeginGroup()/EndGroup() |
| struct ImGuiGroupData |
| { |
| ImGuiID WindowID; |
| ImVec2 BackupCursorPos; |
| ImVec2 BackupCursorMaxPos; |
| ImVec1 BackupIndent; |
| ImVec1 BackupGroupOffset; |
| ImVec2 BackupCurrLineSize; |
| float BackupCurrLineTextBaseOffset; |
| ImGuiID BackupActiveIdIsAlive; |
| bool BackupActiveIdPreviousFrameIsAlive; |
| bool EmitItem; |
| }; |
| |
| // Simple column measurement, currently used for MenuItem() only.. This is very short-sighted/throw-away code and NOT a generic helper. |
| struct IMGUI_API ImGuiMenuColumns |
| { |
| float Spacing; |
| float Width, NextWidth; |
| float Pos[3], NextWidths[3]; |
| |
| ImGuiMenuColumns() { memset(this, 0, sizeof(*this)); } |
| void Update(int count, float spacing, bool clear); |
| float DeclColumns(float w0, float w1, float w2); |
| float CalcExtraSpace(float avail_w) const; |
| }; |
| |
| // Internal state of the currently focused/edited text input box |
| // For a given item ID, access with ImGui::GetInputTextState() |
| struct IMGUI_API ImGuiInputTextState |
| { |
| ImGuiID ID; // widget id owning the text state |
| 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. |
| 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. |
| ImVector<char> TextA; // temporary UTF8 buffer for callbacks and other operations. this is not updated in every code-path! size=capacity. |
| ImVector<char> InitialTextA; // backup of end-user buffer at the time of focus (in UTF-8, unaltered) |
| bool TextAIsValid; // temporary UTF8 buffer is not initially valid before we make the widget active (until then we pull the data from user argument) |
| int BufCapacityA; // end-user buffer capacity |
| float ScrollX; // horizontal scrolling/offset |
| ImStb::STB_TexteditState Stb; // state for stb_textedit.h |
| float CursorAnim; // timer for cursor blink, reset on every user action so the cursor reappears immediately |
| bool CursorFollow; // set when we want scrolling to follow the current cursor position (not always!) |
| bool SelectedAllMouseLock; // after a double-click to select all, we ignore further mouse drags to update selection |
| bool Edited; // edited this frame |
| ImGuiInputTextFlags UserFlags; // Temporarily set while we call user's callback |
| ImGuiInputTextCallback UserCallback; // " |
| void* UserCallbackData; // " |
| |
| ImGuiInputTextState() { memset(this, 0, sizeof(*this)); } |
| void ClearText() { CurLenW = CurLenA = 0; TextW[0] = 0; TextA[0] = 0; CursorClamp(); } |
| void ClearFreeMemory() { TextW.clear(); TextA.clear(); InitialTextA.clear(); } |
| int GetUndoAvailCount() const { return Stb.undostate.undo_point; } |
| int GetRedoAvailCount() const { return STB_TEXTEDIT_UNDOSTATECOUNT - Stb.undostate.redo_point; } |
| void OnKeyPressed(int key); // Cannot be inline because we call in code in stb_textedit.h implementation |
| |
| // Cursor & Selection |
| void CursorAnimReset() { CursorAnim = -0.30f; } // After a user-input the cursor stays on for a while without blinking |
| void CursorClamp() { Stb.cursor = ImMin(Stb.cursor, CurLenW); Stb.select_start = ImMin(Stb.select_start, CurLenW); Stb.select_end = ImMin(Stb.select_end, CurLenW); } |
| bool HasSelection() const { return Stb.select_start != Stb.select_end; } |
| void ClearSelection() { Stb.select_start = Stb.select_end = Stb.cursor; } |
| void SelectAll() { Stb.select_start = 0; Stb.cursor = Stb.select_end = CurLenW; Stb.has_preferred_x = 0; } |
| }; |
| |
| // Storage for current popup stack |
| struct ImGuiPopupData |
| { |
| ImGuiID PopupId; // Set on OpenPopup() |
| ImGuiWindow* Window; // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup() |
| ImGuiWindow* SourceWindow; // Set on OpenPopup() copy of NavWindow at the time of opening the popup |
| int OpenFrameCount; // Set on OpenPopup() |
| 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) |
| ImVec2 OpenPopupPos; // Set on OpenPopup(), preferred popup position (typically == OpenMousePos when using mouse) |
| ImVec2 OpenMousePos; // Set on OpenPopup(), copy of mouse position at the time of opening popup |
| |
| ImGuiPopupData() { memset(this, 0, sizeof(*this)); OpenFrameCount = -1; } |
| }; |
| |
| struct ImGuiNavMoveResult |
| { |
| ImGuiWindow* Window; // Best candidate window |
| ImGuiID ID; // Best candidate ID |
| ImGuiID FocusScopeId; // Best candidate focus scope ID |
| float DistBox; // Best candidate box distance to current NavId |
| float DistCenter; // Best candidate center distance to current NavId |
| float DistAxial; |
| ImRect RectRel; // Best candidate bounding box in window relative space |
| |
| ImGuiNavMoveResult() { Clear(); } |
| void Clear() { Window = NULL; ID = FocusScopeId = 0; DistBox = DistCenter = DistAxial = FLT_MAX; RectRel = ImRect(); } |
| }; |
| |
| enum ImGuiNextWindowDataFlags_ |
| { |
| ImGuiNextWindowDataFlags_None = 0, |
| ImGuiNextWindowDataFlags_HasPos = 1 << 0, |
| ImGuiNextWindowDataFlags_HasSize = 1 << 1, |
| ImGuiNextWindowDataFlags_HasContentSize = 1 << 2, |
| ImGuiNextWindowDataFlags_HasCollapsed = 1 << 3, |
| ImGuiNextWindowDataFlags_HasSizeConstraint = 1 << 4, |
| ImGuiNextWindowDataFlags_HasFocus = 1 << 5, |
| ImGuiNextWindowDataFlags_HasBgAlpha = 1 << 6, |
| ImGuiNextWindowDataFlags_HasScroll = 1 << 7 |
| }; |
| |
| // Storage for SetNexWindow** functions |
| struct ImGuiNextWindowData |
| { |
| ImGuiNextWindowDataFlags Flags; |
| ImGuiCond PosCond; |
| ImGuiCond SizeCond; |
| ImGuiCond CollapsedCond; |
| ImVec2 PosVal; |
| ImVec2 PosPivotVal; |
| ImVec2 SizeVal; |
| ImVec2 ContentSizeVal; |
| ImVec2 ScrollVal; |
| bool CollapsedVal; |
| ImRect SizeConstraintRect; |
| ImGuiSizeCallback SizeCallback; |
| void* SizeCallbackUserData; |
| float BgAlphaVal; // Override background alpha |
| ImVec2 MenuBarOffsetMinVal; // *Always on* This is not exposed publicly, so we don't clear it. |
| |
| ImGuiNextWindowData() { memset(this, 0, sizeof(*this)); } |
| inline void ClearFlags() { Flags = ImGuiNextWindowDataFlags_None; } |
| }; |
| |
| enum ImGuiNextItemDataFlags_ |
| { |
| ImGuiNextItemDataFlags_None = 0, |
| ImGuiNextItemDataFlags_HasWidth = 1 << 0, |
| ImGuiNextItemDataFlags_HasOpen = 1 << 1 |
| }; |
| |
| struct ImGuiNextItemData |
| { |
| ImGuiNextItemDataFlags Flags; |
| float Width; // Set by SetNextItemWidth() |
| ImGuiID FocusScopeId; // Set by SetNextItemMultiSelectData() (!= 0 signify value has been set, so it's an alternate version of HasSelectionData, we don't use Flags for this because they are cleared too early. This is mostly used for debugging) |
| ImGuiCond OpenCond; |
| bool OpenVal; // Set by SetNextItemOpen() |
| |
| ImGuiNextItemData() { memset(this, 0, sizeof(*this)); } |
| inline void ClearFlags() { Flags = ImGuiNextItemDataFlags_None; } // Also cleared manually by ItemAdd()! |
| }; |
| |
| struct ImGuiShrinkWidthItem |
| { |
| int Index; |
| float Width; |
| }; |
| |
| struct ImGuiPtrOrIndex |
| { |
| void* Ptr; // Either field can be set, not both. e.g. Dock node tab bars are loose while BeginTabBar() ones are in a pool. |
| int Index; // Usually index in a main pool. |
| |
| ImGuiPtrOrIndex(void* ptr) { Ptr = ptr; Index = -1; } |
| ImGuiPtrOrIndex(int index) { Ptr = NULL; Index = index; } |
| }; |
| |
| //----------------------------------------------------------------------------- |
| // [SECTION] Columns support |
| //----------------------------------------------------------------------------- |
| |
| // Flags for internal's BeginColumns(). Prefix using BeginTable() nowadays! |
| enum ImGuiOldColumnFlags_ |
| { |
| ImGuiOldColumnFlags_None = 0, |
| ImGuiOldColumnFlags_NoBorder = 1 << 0, // Disable column dividers |
| ImGuiOldColumnFlags_NoResize = 1 << 1, // Disable resizing columns when clicking on the dividers |
| ImGuiOldColumnFlags_NoPreserveWidths = 1 << 2, // Disable column width preservation when adjusting columns |
| ImGuiOldColumnFlags_NoForceWithinWindow = 1 << 3, // Disable forcing columns to fit within window |
| ImGuiOldColumnFlags_GrowParentContentsSize = 1 << 4 // (WIP) Restore pre-1.51 behavior of extending the parent window contents size but _without affecting the columns width at all_. Will eventually remove. |
| |
| // Obsolete names (will be removed) |
| #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS |
| , ImGuiColumnsFlags_None = ImGuiOldColumnFlags_None, |
| ImGuiColumnsFlags_NoBorder = ImGuiOldColumnFlags_NoBorder, |
| ImGuiColumnsFlags_NoResize = ImGuiOldColumnFlags_NoResize, |
| ImGuiColumnsFlags_NoPreserveWidths = ImGuiOldColumnFlags_NoPreserveWidths, |
| ImGuiColumnsFlags_NoForceWithinWindow = ImGuiOldColumnFlags_NoForceWithinWindow, |
| ImGuiColumnsFlags_GrowParentContentsSize = ImGuiOldColumnFlags_GrowParentContentsSize |
| #endif |
| }; |
| |
| struct ImGuiOldColumnData |
| { |
| float OffsetNorm; // Column start offset, normalized 0.0 (far left) -> 1.0 (far right) |
| float OffsetNormBeforeResize; |
| ImGuiOldColumnFlags Flags; // Not exposed |
| ImRect ClipRect; |
| |
| ImGuiOldColumnData() { memset(this, 0, sizeof(*this)); } |
| }; |
| |
| struct ImGuiOldColumns |
| { |
| ImGuiID ID; |
| ImGuiOldColumnFlags Flags; |
| bool IsFirstFrame; |
| bool IsBeingResized; |
| int Current; |
| int Count; |
| float OffMinX, OffMaxX; // Offsets from HostWorkRect.Min.x |
| float LineMinY, LineMaxY; |
| float HostCursorPosY; // Backup of CursorPos at the time of BeginColumns() |
| float HostCursorMaxPosX; // Backup of CursorMaxPos at the time of BeginColumns() |
| ImRect HostInitialClipRect; // Backup of ClipRect at the time of BeginColumns() |
| ImRect HostBackupClipRect; // Backup of ClipRect during PushColumnsBackground()/PopColumnsBackground() |
| ImRect HostBackupParentWorkRect;//Backup of WorkRect at the time of BeginColumns() |
| ImVector<ImGuiOldColumnData> Columns; |
| ImDrawListSplitter Splitter; |
| |
| ImGuiOldColumns() { memset(this, 0, sizeof(*this)); } |
| }; |
| |
| //----------------------------------------------------------------------------- |
| // [SECTION] Multi-select support |
| //----------------------------------------------------------------------------- |
| |
| #ifdef IMGUI_HAS_MULTI_SELECT |
| // <this is filled in 'range_select' branch> |
| #endif // #ifdef IMGUI_HAS_MULTI_SELECT |
| |
| //----------------------------------------------------------------------------- |
| // [SECTION] Docking support |
| //----------------------------------------------------------------------------- |
| |
| #ifdef IMGUI_HAS_DOCK |
| // <this is filled in 'docking' branch> |
| #endif // #ifdef IMGUI_HAS_DOCK |
| |
| //----------------------------------------------------------------------------- |
| // [SECTION] Viewport support |
| //----------------------------------------------------------------------------- |
| |
| #ifdef IMGUI_HAS_VIEWPORT |
| // <this is filled in 'docking' branch> |
| #endif // #ifdef IMGUI_HAS_VIEWPORT |
| |
| //----------------------------------------------------------------------------- |
| // [SECTION] Settings support |
| //----------------------------------------------------------------------------- |
| |
| // Windows data saved in imgui.ini file |
| // Because we never destroy or rename ImGuiWindowSettings, we can store the names in a separate buffer easily. |
| // (this is designed to be stored in a ImChunkStream buffer, with the variable-length Name following our structure) |
| struct ImGuiWindowSettings |
| { |
| ImGuiID ID; |
| ImVec2ih Pos; |
| ImVec2ih Size; |
| bool Collapsed; |
| bool WantApply; // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context) |
| |
| ImGuiWindowSettings() { memset(this, 0, sizeof(*this)); } |
| char* GetName() { return (char*)(this + 1); } |
| }; |
| |
| struct ImGuiSettingsHandler |
| { |
| const char* TypeName; // Short description stored in .ini file. Disallowed characters: '[' ']' |
| ImGuiID TypeHash; // == ImHashStr(TypeName) |
| void (*ClearAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Clear all settings data |
| void (*ReadInitFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Read: Called before reading (in registration order) |
| void* (*ReadOpenFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, const char* name); // Read: Called when entering into a new ini entry e.g. "[Window][Name]" |
| void (*ReadLineFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, void* entry, const char* line); // Read: Called for every line of text within an ini entry |
| void (*ApplyAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Read: Called after reading (in registration order) |
| void (*WriteAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* out_buf); // Write: Output every entries into 'out_buf' |
| void* UserData; |
| |
| ImGuiSettingsHandler() { memset(this, 0, sizeof(*this)); } |
| }; |
| |
| //----------------------------------------------------------------------------- |
| // [SECTION] Metrics, Debug |
| //----------------------------------------------------------------------------- |
| |
| struct ImGuiMetricsConfig |
| { |
| bool ShowWindowsRects; |
| bool ShowWindowsBeginOrder; |
| bool ShowTablesRects; |
| bool ShowDrawCmdMesh; |
| bool ShowDrawCmdBoundingBoxes; |
| int ShowWindowsRectsType; |
| int ShowTablesRectsType; |
| |
| ImGuiMetricsConfig() |
| { |
| ShowWindowsRects = false; |
| ShowWindowsBeginOrder = false; |
| ShowTablesRects = false; |
| ShowDrawCmdMesh = true; |
| ShowDrawCmdBoundingBoxes = true; |
| ShowWindowsRectsType = -1; |
| ShowTablesRectsType = -1; |
| } |
| }; |
| |
| struct IMGUI_API ImGuiStackSizes |
| { |
| short SizeOfIDStack; |
| short SizeOfColorStack; |
| short SizeOfStyleVarStack; |
| short SizeOfFontStack; |
| short SizeOfFocusScopeStack; |
| short SizeOfGroupStack; |
| short SizeOfBeginPopupStack; |
| |
| ImGuiStackSizes() { memset(this, 0, sizeof(*this)); } |
| void SetToCurrentState(); |
| void CompareWithCurrentState(); |
| }; |
| |
| //----------------------------------------------------------------------------- |
| // [SECTION] Generic context hooks |
| //----------------------------------------------------------------------------- |
| |
| typedef void (*ImGuiContextHookCallback)(ImGuiContext* ctx, ImGuiContextHook* hook); |
| enum ImGuiContextHookType { ImGuiContextHookType_NewFramePre, ImGuiContextHookType_NewFramePost, ImGuiContextHookType_EndFramePre, ImGuiContextHookType_EndFramePost, ImGuiContextHookType_RenderPre, ImGuiContextHookType_RenderPost, ImGuiContextHookType_Shutdown }; |
| |
| struct ImGuiContextHook |
| { |
| ImGuiContextHookType Type; |
| ImGuiID Owner; |
| ImGuiContextHookCallback Callback; |
| void* UserData; |
| |
| ImGuiContextHook() { memset(this, 0, sizeof(*this)); } |
| }; |
| |
| //----------------------------------------------------------------------------- |
| // [SECTION] ImGuiContext (main imgui context) |
| //----------------------------------------------------------------------------- |
| |
| struct ImGuiContext |
| { |
| bool Initialized; |
| bool FontAtlasOwnedByContext; // IO.Fonts-> is owned by the ImGuiContext and will be destructed along with it. |
| ImGuiIO IO; |
| ImGuiStyle Style; |
| ImFont* Font; // (Shortcut) == FontStack.empty() ? IO.Font : FontStack.back() |
| float FontSize; // (Shortcut) == FontBaseSize * g.CurrentWindow->FontWindowScale == window->FontSize(). Text height for current window. |
| float FontBaseSize; // (Shortcut) == IO.FontGlobalScale * Font->Scale * Font->FontSize. Base text height. |
| ImDrawListSharedData DrawListSharedData; |
| double Time; |
| int FrameCount; |
| int FrameCountEnded; |
| int FrameCountRendered; |
| bool WithinFrameScope; // Set by NewFrame(), cleared by EndFrame() |
| bool WithinFrameScopeWithImplicitWindow; // Set by NewFrame(), cleared by EndFrame() when the implicit debug window has been pushed |
| bool WithinEndChild; // Set within EndChild() |
| bool GcCompactAll; // Request full GC |
| bool TestEngineHookItems; // Will call test engine hooks: ImGuiTestEngineHook_ItemAdd(), ImGuiTestEngineHook_ItemInfo(), ImGuiTestEngineHook_Log() |
| ImGuiID TestEngineHookIdInfo; // Will call test engine hooks: ImGuiTestEngineHook_IdInfo() from GetID() |
| void* TestEngine; // Test engine user data |
| |
| // Windows state |
| ImVector<ImGuiWindow*> Windows; // Windows, sorted in display order, back to front |
| ImVector<ImGuiWindow*> WindowsFocusOrder; // Windows, sorted in focus order, back to front. (FIXME: We could only store root windows here! Need to sort out the Docking equivalent which is RootWindowDockStop and is unfortunately a little more dynamic) |
| ImVector<ImGuiWindow*> WindowsTempSortBuffer; // Temporary buffer used in EndFrame() to reorder windows so parents are kept before their child |
| ImVector<ImGuiWindow*> CurrentWindowStack; |
| ImGuiStorage WindowsById; // Map window's ImGuiID to ImGuiWindow* |
| int WindowsActiveCount; // Number of unique windows submitted by frame |
| ImGuiWindow* CurrentWindow; // Window being drawn into |
| ImGuiWindow* HoveredWindow; // Window the mouse is hovering. Will typically catch mouse inputs. |
| ImGuiWindow* HoveredRootWindow; // == HoveredWindow ? HoveredWindow->RootWindow : NULL, merely a shortcut to avoid null test in some situation. |
| ImGuiWindow* HoveredWindowUnderMovingWindow; // Hovered window ignoring MovingWindow. Only set if MovingWindow is set. |
| ImGuiWindow* MovingWindow; // Track the window we clicked on (in order to preserve focus). The actual window that is moved is generally MovingWindow->RootWindow. |
| 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. |
| ImVec2 WheelingWindowRefMousePos; |
| float WheelingWindowTimer; |
| |
| // Item/widgets state and tracking information |
| ImGuiID HoveredId; // Hovered widget, filled during the frame |
| ImGuiID HoveredIdPreviousFrame; |
| bool HoveredIdAllowOverlap; |
| bool HoveredIdUsingMouseWheel; // Hovered widget will use mouse wheel. Blocks scrolling the underlying window. |
| bool HoveredIdPreviousFrameUsingMouseWheel; |
| bool HoveredIdDisabled; // At least one widget passed the rect test, but has been discarded by disabled flag or popup inhibit. May be true even if HoveredId == 0. |
| float HoveredIdTimer; // Measure contiguous hovering time |
| float HoveredIdNotActiveTimer; // Measure contiguous hovering time where the item has not been active |
| ImGuiID ActiveId; // Active widget |
| ImGuiID ActiveIdIsAlive; // Active widget has been seen this frame (we can't use a bool as the ActiveId may change within the frame) |
| float ActiveIdTimer; |
| bool ActiveIdIsJustActivated; // Set at the time of activation for one frame |
| bool ActiveIdAllowOverlap; // Active widget allows another widget to steal active id (generally for overlapping widgets, but not always) |
| bool ActiveIdNoClearOnFocusLoss; // Disable losing active id if the active id window gets unfocused. |
| 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. |
| bool ActiveIdHasBeenEditedBefore; // Was the value associated to the widget Edited over the course of the Active state. |
| bool ActiveIdHasBeenEditedThisFrame; |
| bool ActiveIdUsingMouseWheel; // Active widget will want to read mouse wheel. Blocks scrolling the underlying window. |
| ImU32 ActiveIdUsingNavDirMask; // Active widget will want to read those nav move requests (e.g. can activate a button and move away from it) |
| ImU32 ActiveIdUsingNavInputMask; // Active widget will want to read those nav inputs. |
| ImU64 ActiveIdUsingKeyInputMask; // Active widget will want to read those key inputs. When we grow the ImGuiKey enum we'll need to either to order the enum to make useful keys come first, either redesign this into e.g. a small array. |
| ImVec2 ActiveIdClickOffset; // Clicked offset from upper-left corner, if applicable (currently only set by ButtonBehavior) |
| ImGuiWindow* ActiveIdWindow; |
| ImGuiInputSource ActiveIdSource; // Activating with mouse or nav (gamepad/keyboard) |
| int ActiveIdMouseButton; |
| ImGuiID ActiveIdPreviousFrame; |
| bool ActiveIdPreviousFrameIsAlive; |
| bool ActiveIdPreviousFrameHasBeenEditedBefore; |
| ImGuiWindow* ActiveIdPreviousFrameWindow; |
| ImGuiID LastActiveId; // Store the last non-zero ActiveId, useful for animation. |
| float LastActiveIdTimer; // Store the last non-zero ActiveId timer since the beginning of activation, useful for animation. |
| |
| // Next window/item data |
| ImGuiNextWindowData NextWindowData; // Storage for SetNextWindow** functions |
| ImGuiNextItemData NextItemData; // Storage for SetNextItem** functions |
| |
| // Shared stacks |
| ImVector<ImGuiColorMod> ColorStack; // Stack for PushStyleColor()/PopStyleColor() - inherited by Begin() |
| ImVector<ImGuiStyleMod> StyleVarStack; // Stack for PushStyleVar()/PopStyleVar() - inherited by Begin() |
| ImVector<ImFont*> FontStack; // Stack for PushFont()/PopFont() - inherited by Begin() |
| ImVector<ImGuiID> FocusScopeStack; // Stack for PushFocusScope()/PopFocusScope() - not inherited by Begin(), unless child window |
| ImVector<ImGuiItemFlags>ItemFlagsStack; // Stack for PushItemFlag()/PopItemFlag() - inherited by Begin() |
| ImVector<ImGuiGroupData>GroupStack; // Stack for BeginGroup()/EndGroup() - not inherited by Begin() |
| ImVector<ImGuiPopupData>OpenPopupStack; // Which popups are open (persistent) |
| ImVector<ImGuiPopupData>BeginPopupStack; // Which level of BeginPopup() we are in (reset every frame) |
| |
| // Gamepad/keyboard Navigation |
| ImGuiWindow* NavWindow; // Focused window for navigation. Could be called 'FocusWindow' |
| ImGuiID NavId; // Focused item for navigation |
| ImGuiID NavFocusScopeId; // Identify a selection scope (selection code often wants to "clear other items" when landing on an item of the selection set) |
| ImGuiID NavActivateId; // ~~ (g.ActiveId == 0) && IsNavInputPressed(ImGuiNavInput_Activate) ? NavId : 0, also set when calling ActivateItem() |
| ImGuiID NavActivateDownId; // ~~ IsNavInputDown(ImGuiNavInput_Activate) ? NavId : 0 |
| ImGuiID NavActivatePressedId; // ~~ IsNavInputPressed(ImGuiNavInput_Activate) ? NavId : 0 |
| ImGuiID NavInputId; // ~~ IsNavInputPressed(ImGuiNavInput_Input) ? NavId : 0 |
| ImGuiID NavJustTabbedId; // Just tabbed to this id. |
| ImGuiID NavJustMovedToId; // Just navigated to this id (result of a successfully MoveRequest). |
| ImGuiID NavJustMovedToFocusScopeId; // Just navigated to this focus scope id (result of a successfully MoveRequest). |
| ImGuiKeyModFlags NavJustMovedToKeyMods; |
| ImGuiID NavNextActivateId; // Set by ActivateItem(), queued until next frame. |
| ImGuiInputSource NavInputSource; // Keyboard or Gamepad mode? THIS WILL ONLY BE None or NavGamepad or NavKeyboard. |
| ImRect NavScoringRect; // Rectangle used for scoring, in screen space. Based of window->NavRectRel[], modified for directional navigation scoring. |
| int NavScoringCount; // Metrics for debugging |
| ImGuiNavLayer NavLayer; // Layer we are navigating on. For now the system is hard-coded for 0=main contents and 1=menu/title bar, may expose layers later. |
| int NavIdTabCounter; // == NavWindow->DC.FocusIdxTabCounter at time of NavId processing |
| bool NavIdIsAlive; // Nav widget has been seen this frame ~~ NavRectRel is valid |
| bool NavMousePosDirty; // When set we will update mouse position if (io.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos) if set (NB: this not enabled by default) |
| 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) |
| bool NavDisableMouseHover; // When user starts using gamepad/keyboard, we hide mouse hovering highlight until mouse is touched again. |
| bool NavAnyRequest; // ~~ NavMoveRequest || NavInitRequest |
| bool NavInitRequest; // Init request for appearing window to select first item |
| bool NavInitRequestFromMove; |
| ImGuiID NavInitResultId; // Init request result (first item of the window, or one for which SetItemDefaultFocus() was called) |
| ImRect NavInitResultRectRel; // Init request result rectangle (relative to parent window) |
| bool NavMoveRequest; // Move request for this frame |
| ImGuiNavMoveFlags NavMoveRequestFlags; |
| ImGuiNavForward NavMoveRequestForward; // None / ForwardQueued / ForwardActive (this is used to navigate sibling parent menus from a child menu) |
| ImGuiKeyModFlags NavMoveRequestKeyMods; |
| ImGuiDir NavMoveDir, NavMoveDirLast; // Direction of the move request (left/right/up/down), direction of the previous move request |
| ImGuiDir NavMoveClipDir; // FIXME-NAV: Describe the purpose of this better. Might want to rename? |
| ImGuiNavMoveResult NavMoveResultLocal; // Best move request candidate within NavWindow |
| ImGuiNavMoveResult NavMoveResultLocalVisibleSet; // Best move request candidate within NavWindow that are mostly visible (when using ImGuiNavMoveFlags_AlsoScoreVisibleSet flag) |
| ImGuiNavMoveResult NavMoveResultOther; // Best move request candidate within NavWindow's flattened hierarchy (when using ImGuiWindowFlags_NavFlattened flag) |
| ImGuiWindow* NavWrapRequestWindow; // Window which requested trying nav wrap-around. |
| ImGuiNavMoveFlags NavWrapRequestFlags; // Wrap-around operation flags. |
| |
| // Navigation: Windowing (CTRL+TAB for list, or Menu button + keys or directional pads to move/resize) |
| ImGuiWindow* NavWindowingTarget; // Target window when doing CTRL+Tab (or Pad Menu + FocusPrev/Next), this window is temporarily displayed top-most! |
| ImGuiWindow* NavWindowingTargetAnim; // Record of last valid NavWindowingTarget until DimBgRatio and NavWindowingHighlightAlpha becomes 0.0f, so the fade-out can stay on it. |
| ImGuiWindow* NavWindowingListWindow; // Internal window actually listing the CTRL+Tab contents |
| float NavWindowingTimer; |
| float NavWindowingHighlightAlpha; |
| bool NavWindowingToggleLayer; |
| |
| // Legacy Focus/Tabbing system (older than Nav, active even if Nav is disabled, misnamed. FIXME-NAV: This needs a redesign!) |
| ImGuiWindow* FocusRequestCurrWindow; // |
| ImGuiWindow* FocusRequestNextWindow; // |
| int FocusRequestCurrCounterRegular; // Any item being requested for focus, stored as an index (we on layout to be stable between the frame pressing TAB and the next frame, semi-ouch) |
| int FocusRequestCurrCounterTabStop; // Tab item being requested for focus, stored as an index |
| int FocusRequestNextCounterRegular; // Stored for next frame |
| int FocusRequestNextCounterTabStop; // " |
| bool FocusTabPressed; // |
| |
| // Render |
| ImDrawData DrawData; // Main ImDrawData instance to pass render information to the user |
| ImDrawDataBuilder DrawDataBuilder; |
| float DimBgRatio; // 0.0..1.0 animation when fading in a dimming background (for modal window and CTRL+TAB list) |
| ImDrawList BackgroundDrawList; // First draw list to be rendered. |
| ImDrawList ForegroundDrawList; // Last draw list to be rendered. This is where we the render software mouse cursor (if io.MouseDrawCursor is set) and most debug overlays. |
| ImGuiMouseCursor MouseCursor; |
| |
| // Drag and Drop |
| bool DragDropActive; |
| bool DragDropWithinSource; // Set when within a BeginDragDropXXX/EndDragDropXXX block for a drag source. |
| bool DragDropWithinTarget; // Set when within a BeginDragDropXXX/EndDragDropXXX block for a drag target. |
| ImGuiDragDropFlags DragDropSourceFlags; |
| int DragDropSourceFrameCount; |
| int DragDropMouseButton; |
| ImGuiPayload DragDropPayload; |
| ImRect DragDropTargetRect; // Store rectangle of current target candidate (we favor small targets when overlapping) |
| ImGuiID DragDropTargetId; |
| ImGuiDragDropFlags DragDropAcceptFlags; |
| float DragDropAcceptIdCurrRectSurface; // Target item surface (we resolve overlapping targets by prioritizing the smaller surface) |
| ImGuiID DragDropAcceptIdCurr; // Target item id (set at the time of accepting the payload) |
| ImGuiID DragDropAcceptIdPrev; // Target item id from previous frame (we need to store this to allow for overlapping drag and drop targets) |
| int DragDropAcceptFrameCount; // Last time a target expressed a desire to accept the source |
| ImGuiID DragDropHoldJustPressedId; // Set when holding a payload just made ButtonBehavior() return a press. |
| ImVector<unsigned char> DragDropPayloadBufHeap; // We don't expose the ImVector<> directly, ImGuiPayload only holds pointer+size |
| unsigned char DragDropPayloadBufLocal[16]; // Local buffer for small payloads |
| |
| // Table |
| ImGuiTable* CurrentTable; |
| ImPool<ImGuiTable> Tables; |
| ImVector<ImGuiPtrOrIndex> CurrentTableStack; |
| ImVector<float> TablesLastTimeActive; // Last used timestamp of each tables (SOA, for efficient GC) |
| ImVector<ImDrawChannel> DrawChannelsTempMergeBuffer; |
| |
| // Tab bars |
| ImGuiTabBar* CurrentTabBar; |
| ImPool<ImGuiTabBar> TabBars; |
| ImVector<ImGuiPtrOrIndex> CurrentTabBarStack; |
| ImVector<ImGuiShrinkWidthItem> ShrinkWidthBuffer; |
| |
| // Widget state |
| ImVec2 LastValidMousePos; |
| ImGuiInputTextState InputTextState; |
| ImFont InputTextPasswordFont; |
| ImGuiID TempInputId; // Temporary text input when CTRL+clicking on a slider, etc. |
| ImGuiColorEditFlags ColorEditOptions; // Store user options for color edit widgets |
| float ColorEditLastHue; // Backup of last Hue associated to LastColor[3], so we can restore Hue in lossy RGB<>HSV round trips |
| float ColorEditLastSat; // Backup of last Saturation associated to LastColor[3], so we can restore Saturation in lossy RGB<>HSV round trips |
| float ColorEditLastColor[3]; |
| ImVec4 ColorPickerRef; // Initial/reference color at the time of opening the color picker. |
| float SliderCurrentAccum; // Accumulated slider delta when using navigation controls. |
| bool SliderCurrentAccumDirty; // Has the accumulated slider delta changed since last time we tried to apply it? |
| bool DragCurrentAccumDirty; |
| float DragCurrentAccum; // Accumulator for dragging modification. Always high-precision, not rounded by end-user precision settings |
| float DragSpeedDefaultRatio; // If speed == 0.0f, uses (max-min) * DragSpeedDefaultRatio |
| float ScrollbarClickDeltaToGrabCenter; // Distance between mouse and center of grab box, normalized in parent space. Use storage? |
| int TooltipOverrideCount; |
| float TooltipSlowDelay; // Time before slow tooltips appears (FIXME: This is temporary until we merge in tooltip timer+priority work) |
| ImVector<char> ClipboardHandlerData; // If no custom clipboard handler is defined |
| ImVector<ImGuiID> MenusIdSubmittedThisFrame; // A list of menu IDs that were rendered at least once |
| |
| // Platform support |
| ImVec2 PlatformImePos; // Cursor position request & last passed to the OS Input Method Editor |
| ImVec2 PlatformImeLastPos; |
| char PlatformLocaleDecimalPoint; // '.' or *localeconv()->decimal_point |
| |
| // Settings |
| bool SettingsLoaded; |
| float SettingsDirtyTimer; // Save .ini Settings to memory when time reaches zero |
| ImGuiTextBuffer SettingsIniData; // In memory .ini settings |
| ImVector<ImGuiSettingsHandler> SettingsHandlers; // List of .ini settings handlers |
| ImChunkStream<ImGuiWindowSettings> SettingsWindows; // ImGuiWindow .ini settings entries |
| ImChunkStream<ImGuiTableSettings> SettingsTables; // ImGuiTable .ini settings entries |
| ImVector<ImGuiContextHook> Hooks; // Hooks for extensions (e.g. test engine) |
| |
| // Capture/Logging |
| bool LogEnabled; // Currently capturing |
| ImGuiLogType LogType; // Capture target |
| ImFileHandle LogFile; // If != NULL log to stdout/ file |
| ImGuiTextBuffer LogBuffer; // Accumulation buffer when log to clipboard. This is pointer so our GImGui static constructor doesn't call heap allocators. |
| float LogLinePosY; |
| bool LogLineFirstItem; |
| int LogDepthRef; |
| int LogDepthToExpand; |
| int LogDepthToExpandDefault; // Default/stored value for LogDepthMaxExpand if not specified in the LogXXX function call. |
| |
| // Debug Tools |
| bool DebugItemPickerActive; // Item picker is active (started with DebugStartItemPicker()) |
| ImGuiID DebugItemPickerBreakId; // Will call IM_DEBUG_BREAK() when encountering this id |
| ImGuiMetricsConfig DebugMetricsConfig; |
| |
| // Misc |
| float FramerateSecPerFrame[120]; // Calculate estimate of framerate for user over the last 2 seconds. |
| int FramerateSecPerFrameIdx; |
| float FramerateSecPerFrameAccum; |
| int WantCaptureMouseNextFrame; // Explicit capture via CaptureKeyboardFromApp()/CaptureMouseFromApp() sets those flags |
| int WantCaptureKeyboardNextFrame; |
| int WantTextInputNextFrame; |
| char TempBuffer[1024 * 3 + 1]; // Temporary text buffer |
| |
| ImGuiContext(ImFontAtlas* shared_font_atlas) : BackgroundDrawList(&DrawListSharedData), ForegroundDrawList(&DrawListSharedData) |
| { |
| Initialized = false; |
| FontAtlasOwnedByContext = shared_font_atlas ? false : true; |
| Font = NULL; |
| FontSize = FontBaseSize = 0.0f; |
| IO.Fonts = shared_font_atlas ? shared_font_atlas : IM_NEW(ImFontAtlas)(); |
| Time = 0.0f; |
| FrameCount = 0; |
| FrameCountEnded = FrameCountRendered = -1; |
| WithinFrameScope = WithinFrameScopeWithImplicitWindow = WithinEndChild = false; |
| GcCompactAll = false; |
| TestEngineHookItems = false; |
| TestEngineHookIdInfo = 0; |
| TestEngine = NULL; |
| |
| WindowsActiveCount = 0; |
| CurrentWindow = NULL; |
| HoveredWindow = NULL; |
| HoveredRootWindow = NULL; |
| HoveredWindowUnderMovingWindow = NULL; |
| MovingWindow = NULL; |
| WheelingWindow = NULL; |
| WheelingWindowTimer = 0.0f; |
| |
| HoveredId = HoveredIdPreviousFrame = 0; |
| HoveredIdAllowOverlap = false; |
| HoveredIdUsingMouseWheel = HoveredIdPreviousFrameUsingMouseWheel = false; |
| HoveredIdDisabled = false; |
| HoveredIdTimer = HoveredIdNotActiveTimer = 0.0f; |
| ActiveId = 0; |
| ActiveIdIsAlive = 0; |
| ActiveIdTimer = 0.0f; |
| ActiveIdIsJustActivated = false; |
| ActiveIdAllowOverlap = false; |
| ActiveIdNoClearOnFocusLoss = false; |
| ActiveIdHasBeenPressedBefore = false; |
| ActiveIdHasBeenEditedBefore = false; |
| ActiveIdHasBeenEditedThisFrame = false; |
| ActiveIdUsingMouseWheel = false; |
| ActiveIdUsingNavDirMask = 0x00; |
| ActiveIdUsingNavInputMask = 0x00; |
| ActiveIdUsingKeyInputMask = 0x00; |
| ActiveIdClickOffset = ImVec2(-1, -1); |
| ActiveIdWindow = NULL; |
| ActiveIdSource = ImGuiInputSource_None; |
| ActiveIdMouseButton = 0; |
| ActiveIdPreviousFrame = 0; |
| ActiveIdPreviousFrameIsAlive = false; |
| ActiveIdPreviousFrameHasBeenEditedBefore = false; |
| ActiveIdPreviousFrameWindow = NULL; |
| LastActiveId = 0; |
| LastActiveIdTimer = 0.0f; |
| |
| NavWindow = NULL; |
| NavId = NavFocusScopeId = NavActivateId = NavActivateDownId = NavActivatePressedId = NavInputId = 0; |
| NavJustTabbedId = NavJustMovedToId = NavJustMovedToFocusScopeId = NavNextActivateId = 0; |
| NavJustMovedToKeyMods = ImGuiKeyModFlags_None; |
| NavInputSource = ImGuiInputSource_None; |
| NavScoringRect = ImRect(); |
| NavScoringCount = 0; |
| NavLayer = ImGuiNavLayer_Main; |
| NavIdTabCounter = INT_MAX; |
| NavIdIsAlive = false; |
| NavMousePosDirty = false; |
| NavDisableHighlight = true; |
| NavDisableMouseHover = false; |
| NavAnyRequest = false; |
| NavInitRequest = false; |
| NavInitRequestFromMove = false; |
| NavInitResultId = 0; |
| NavMoveRequest = false; |
| NavMoveRequestFlags = ImGuiNavMoveFlags_None; |
| NavMoveRequestForward = ImGuiNavForward_None; |
| NavMoveRequestKeyMods = ImGuiKeyModFlags_None; |
| NavMoveDir = NavMoveDirLast = NavMoveClipDir = ImGuiDir_None; |
| NavWrapRequestWindow = NULL; |
| NavWrapRequestFlags = ImGuiNavMoveFlags_None; |
| |
| NavWindowingTarget = NavWindowingTargetAnim = NavWindowingListWindow = NULL; |
| NavWindowingTimer = NavWindowingHighlightAlpha = 0.0f; |
| NavWindowingToggleLayer = false; |
| |
| FocusRequestCurrWindow = FocusRequestNextWindow = NULL; |
| FocusRequestCurrCounterRegular = FocusRequestCurrCounterTabStop = INT_MAX; |
| FocusRequestNextCounterRegular = FocusRequestNextCounterTabStop = INT_MAX; |
| FocusTabPressed = false; |
| |
| DimBgRatio = 0.0f; |
| BackgroundDrawList._OwnerName = "##Background"; // Give it a name for debugging |
| ForegroundDrawList._OwnerName = "##Foreground"; // Give it a name for debugging |
| MouseCursor = ImGuiMouseCursor_Arrow; |
| |
| DragDropActive = DragDropWithinSource = DragDropWithinTarget = false; |
| DragDropSourceFlags = ImGuiDragDropFlags_None; |
| DragDropSourceFrameCount = -1; |
| DragDropMouseButton = -1; |
| DragDropTargetId = 0; |
| DragDropAcceptFlags = ImGuiDragDropFlags_None; |
| DragDropAcceptIdCurrRectSurface = 0.0f; |
| DragDropAcceptIdPrev = DragDropAcceptIdCurr = 0; |
| DragDropAcceptFrameCount = -1; |
| DragDropHoldJustPressedId = 0; |
| memset(DragDropPayloadBufLocal, 0, sizeof(DragDropPayloadBufLocal)); |
| |
| CurrentTable = NULL; |
| CurrentTabBar = NULL; |
| |
| LastValidMousePos = ImVec2(0.0f, 0.0f); |
| TempInputId = 0; |
| ColorEditOptions = ImGuiColorEditFlags__OptionsDefault; |
| ColorEditLastHue = ColorEditLastSat = 0.0f; |
| ColorEditLastColor[0] = ColorEditLastColor[1] = ColorEditLastColor[2] = FLT_MAX; |
| SliderCurrentAccum = 0.0f; |
| SliderCurrentAccumDirty = false; |
| DragCurrentAccumDirty = false; |
| DragCurrentAccum = 0.0f; |
| DragSpeedDefaultRatio = 1.0f / 100.0f; |
| ScrollbarClickDeltaToGrabCenter = 0.0f; |
| TooltipOverrideCount = 0; |
| TooltipSlowDelay = 0.50f; |
| |
| PlatformImePos = PlatformImeLastPos = ImVec2(FLT_MAX, FLT_MAX); |
| PlatformLocaleDecimalPoint = '.'; |
| |
| SettingsLoaded = false; |
| SettingsDirtyTimer = 0.0f; |
| |
| LogEnabled = false; |
| LogType = ImGuiLogType_None; |
| LogFile = NULL; |
| LogLinePosY = FLT_MAX; |
| LogLineFirstItem = false; |
| LogDepthRef = 0; |
| LogDepthToExpand = LogDepthToExpandDefault = 2; |
| |
| DebugItemPickerActive = false; |
| DebugItemPickerBreakId = 0; |
| |
| memset(FramerateSecPerFrame, 0, sizeof(FramerateSecPerFrame)); |
| FramerateSecPerFrameIdx = 0; |
| FramerateSecPerFrameAccum = 0.0f; |
| WantCaptureMouseNextFrame = WantCaptureKeyboardNextFrame = WantTextInputNextFrame = -1; |
| memset(TempBuffer, 0, sizeof(TempBuffer)); |
| } |
| }; |
| |
| //----------------------------------------------------------------------------- |
| // [SECTION] ImGuiWindowTempData, ImGuiWindow |
| //----------------------------------------------------------------------------- |
| |
| // Transient per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the DC variable name in ImGuiWindow. |
| // (That's theory, in practice the delimitation between ImGuiWindow and ImGuiWindowTempData is quite tenuous and could be reconsidered..) |
| // (This doesn't need a constructor because we zero-clear it as part of ImGuiWindow and all frame-temporary data are setup on Begin) |
| struct IMGUI_API ImGuiWindowTempData |
| { |
| // Layout |
| ImVec2 CursorPos; // Current emitting position, in absolute coordinates. |
| ImVec2 CursorPosPrevLine; |
| ImVec2 CursorStartPos; // Initial position after Begin(), generally ~ window position + WindowPadding. |
| ImVec2 CursorMaxPos; // Used to implicitly calculate the size of our contents, always growing during the frame. Used to calculate window->ContentSize at the beginning of next frame |
| ImVec2 CurrLineSize; |
| ImVec2 PrevLineSize; |
| float CurrLineTextBaseOffset; // Baseline offset (0.0f by default on a new line, generally == style.FramePadding.y when a framed item has been added). |
| float PrevLineTextBaseOffset; |
| ImVec1 Indent; // Indentation / start position from left of window (increased by TreePush/TreePop, etc.) |
| 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. |
| ImVec1 GroupOffset; |
| |
| // Last item status |
| ImGuiID LastItemId; // ID for last item |
| ImGuiItemStatusFlags LastItemStatusFlags; // Status flags for last item (see ImGuiItemStatusFlags_) |
| ImRect LastItemRect; // Interaction rect for last item |
| ImRect LastItemDisplayRect; // End-user display rect for last item (only valid if LastItemStatusFlags & ImGuiItemStatusFlags_HasDisplayRect) |
| |
| // Keyboard/Gamepad navigation |
| ImGuiNavLayer NavLayerCurrent; // Current layer, 0..31 (we currently only use 0..1) |
| int NavLayerActiveMask; // Which layers have been written to (result from previous frame) |
| int NavLayerActiveMaskNext; // Which layers have been written to (accumulator for current frame) |
| ImGuiID NavFocusScopeIdCurrent; // Current focus scope ID while appending |
| bool NavHideHighlightOneFrame; |
| bool NavHasScroll; // Set when scrolling can be used (ScrollMax > 0.0f) |
| |
| // Miscellaneous |
| bool MenuBarAppending; // FIXME: Remove this |
| 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. |
| ImGuiMenuColumns MenuColumns; // Simplified columns storage for menu items measurement |
| int TreeDepth; // Current tree depth. |
| ImU32 TreeJumpToParentOnPopMask; // Store a copy of !g.NavIdIsAlive for TreeDepth 0..31.. Could be turned into a ImU64 if necessary. |
| ImVector<ImGuiWindow*> ChildWindows; |
| ImGuiStorage* StateStorage; // Current persistent per-window storage (store e.g. tree node open/close state) |
| ImGuiOldColumns* CurrentColumns; // Current columns set |
| int CurrentTableIdx; // Current table index (into g.Tables) |
| ImGuiLayoutType LayoutType; |
| ImGuiLayoutType ParentLayoutType; // Layout type of parent window at the time of Begin() |
| int FocusCounterRegular; // (Legacy Focus/Tabbing system) Sequential counter, start at -1 and increase as assigned via FocusableItemRegister() (FIXME-NAV: Needs redesign) |
| int FocusCounterTabStop; // (Legacy Focus/Tabbing system) Same, but only count widgets which you can Tab through. |
| |
| // Local parameters stacks |
| // 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. |
| ImGuiItemFlags ItemFlags; // == g.ItemFlagsStack.back() |
| float ItemWidth; // == ItemWidthStack.back(). 0.0: default, >0.0: width in pixels, <0.0: align xx pixels to the right of window |
| float TextWrapPos; // == TextWrapPosStack.back() [empty == -1.0f] |
| ImVector<float> ItemWidthStack; |
| ImVector<float> TextWrapPosStack; |
| ImGuiStackSizes StackSizesOnBegin; // Store size of various stacks for asserting |
| }; |
| |
| // Storage for one window |
| struct IMGUI_API ImGuiWindow |
| { |
| char* Name; // Window name, owned by the window. |
| ImGuiID ID; // == ImHashStr(Name) |
| ImGuiWindowFlags Flags; // See enum ImGuiWindowFlags_ |
| ImVec2 Pos; // Position (always rounded-up to nearest pixel) |
| ImVec2 Size; // Current size (==SizeFull or collapsed title bar size) |
| ImVec2 SizeFull; // Size when non collapsed |
| 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. |
| ImVec2 ContentSizeExplicit; // Size of contents/scrollable client area explicitly request by the user via SetNextWindowContentSize(). |
| ImVec2 WindowPadding; // Window padding at the time of Begin(). |
| float WindowRounding; // Window rounding at the time of Begin(). May be clamped lower to avoid rendering artifacts with title bar, menu bar etc. |
| float WindowBorderSize; // Window border size at the time of Begin(). |
| int NameBufLen; // Size of buffer storing Name. May be larger than strlen(Name)! |
| ImGuiID MoveId; // == window->GetID("#MOVE") |
| ImGuiID ChildId; // ID of corresponding item in parent window (for navigation to return from child window to parent window) |
| ImVec2 Scroll; |
| ImVec2 ScrollMax; |
| 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) |
| ImVec2 ScrollTargetCenterRatio; // 0.0f = scroll so that target position is at top, 0.5f = scroll so that target position is centered |
| ImVec2 ScrollTargetEdgeSnapDist; // 0.0f = no snapping, >0.0f snapping threshold |
| 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. |
| bool ScrollbarX, ScrollbarY; // Are scrollbars visible? |
| bool Active; // Set to true on Begin(), unless Collapsed |
| bool WasActive; |
| bool WriteAccessed; // Set to true when any widget access the current window |
| bool Collapsed; // Set when collapsing window to become only title-bar |
| bool WantCollapseToggle; |
| bool SkipItems; // Set when items can safely be all clipped (e.g. window not visible or collapsed) |
| bool Appearing; // Set during the frame where the window is appearing (or re-appearing) |
| bool Hidden; // Do not display (== HiddenFrames*** > 0) |
| bool IsFallbackWindow; // Set on the "Debug##Default" window. |
| bool HasCloseButton; // Set when the window has a close button (p_open != NULL) |
| signed char ResizeBorderHeld; // Current border being held for resize (-1: none, otherwise 0-3) |
| short BeginCount; // Number of Begin() during the current frame (generally 0 or 1, 1+ if appending via multiple Begin/End pairs) |
| short BeginOrderWithinParent; // Order within immediate parent window, if we are a child window. Otherwise 0. |
| short BeginOrderWithinContext; // Order within entire imgui context. This is mostly used for debugging submission order related issues. |
| ImGuiID PopupId; // ID in the popup stack when this window is used as a popup/menu (because we use generic Name/ID for recycling) |
| ImS8 AutoFitFramesX, AutoFitFramesY; |
| ImS8 AutoFitChildAxises; |
| bool AutoFitOnlyGrows; |
| ImGuiDir AutoPosLastDirection; |
| ImS8 HiddenFramesCanSkipItems; // Hide the window for N frames |
| ImS8 HiddenFramesCannotSkipItems; // Hide the window for N frames while allowing items to be submitted so we can measure their size |
| ImS8 HiddenFramesForRenderOnly; // Hide the window until frame N at Render() time only |
| ImGuiCond SetWindowPosAllowFlags : 8; // store acceptable condition flags for SetNextWindowPos() use. |
| ImGuiCond SetWindowSizeAllowFlags : 8; // store acceptable condition flags for SetNextWindowSize() use. |
| ImGuiCond SetWindowCollapsedAllowFlags : 8; // store acceptable condition flags for SetNextWindowCollapsed() use. |
| ImVec2 SetWindowPosVal; // store window position when using a non-zero Pivot (position set needs to be processed when we know the window size) |
| 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. |
| |
| 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) |
| ImGuiWindowTempData DC; // Temporary per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the "DC" variable name. |
| |
| // The best way to understand what those rectangles are is to use the 'Metrics->Tools->Show Windows Rectangles' viewer. |
| // The main 'OuterRect', omitted as a field, is window->Rect(). |
| ImRect OuterRectClipped; // == Window->Rect() just after setup in Begin(). == window->Rect() for root window. |
| ImRect InnerRect; // Inner rectangle (omit title bar, menu bar, scroll bar) |
| ImRect InnerClipRect; // == InnerRect shrunk by WindowPadding*0.5f on each side, clipped within viewport or parent clip rect. |
| 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). |
| 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? |
| ImRect ClipRect; // Current clipping/scissoring rectangle, evolve as we are using PushClipRect(), etc. == DrawList->clip_rect_stack.back(). |
| 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. |
| ImVec2ih HitTestHoleSize; // Define an optional rectangular hole where mouse will pass-through the window. |
| ImVec2ih HitTestHoleOffset; |
| |
| int LastFrameActive; // Last frame number the window was Active. |
| float LastTimeActive; // Last timestamp the window was Active (using float as we don't need high precision there) |
| float ItemWidthDefault; |
| ImGuiStorage StateStorage; |
| ImVector<ImGuiOldColumns> ColumnsStorage; |
| float FontWindowScale; // User scale multiplier per-window, via SetWindowFontScale() |
| int SettingsOffset; // Offset into SettingsWindows[] (offsets are always valid as we only grow the array from the back) |
| |
| ImDrawList* DrawList; // == &DrawListInst (for backward compatibility reason with code using imgui_internal.h we keep this a pointer) |
| ImDrawList DrawListInst; |
| ImGuiWindow* ParentWindow; // If we are a child _or_ popup window, this is pointing to our parent. Otherwise NULL. |
| ImGuiWindow* RootWindow; // Point to ourself or first ancestor that is not a child window == Top-level window. |
| ImGuiWindow* RootWindowForTitleBarHighlight; // Point to ourself or first ancestor which will display TitleBgActive color when this window is active. |
| ImGuiWindow* RootWindowForNav; // Point to ourself or first ancestor which doesn't have the NavFlattened flag. |
| |
| 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.) |
| ImGuiID NavLastIds[ImGuiNavLayer_COUNT]; // Last known NavId for this window, per layer (0/1) |
| ImRect NavRectRel[ImGuiNavLayer_COUNT]; // Reference rectangle, in window relative space |
| |
| int MemoryDrawListIdxCapacity; // Backup of last idx/vtx count, so when waking up the window we can preallocate and avoid iterative alloc/copy |
| int MemoryDrawListVtxCapacity; |
| bool MemoryCompacted; // Set when window extraneous data have been garbage collected |
| |
| public: |
| ImGuiWindow(ImGuiContext* context, const char* name); |
| ~ImGuiWindow(); |
| |
| ImGuiID GetID(const char* str, const char* str_end = NULL); |
| ImGuiID GetID(const void* ptr); |
| ImGuiID GetID(int n); |
| ImGuiID GetIDNoKeepAlive(const char* str, const char* str_end = NULL); |
| ImGuiID GetIDNoKeepAlive(const void* ptr); |
| ImGuiID GetIDNoKeepAlive(int n); |
| ImGuiID GetIDFromRectangle(const ImRect& r_abs); |
| |
| // We don't use g.FontSize because the window may be != g.CurrentWidow. |
| ImRect Rect() const { return ImRect(Pos.x, Pos.y, Pos.x + Size.x, Pos.y + Size.y); } |
| float CalcFontSize() const { ImGuiContext& g = *GImGui; float scale = g.FontBaseSize * FontWindowScale; if (ParentWindow) scale *= ParentWindow->FontWindowScale; return scale; } |
| float TitleBarHeight() const { ImGuiContext& g = *GImGui; return (Flags & ImGuiWindowFlags_NoTitleBar) ? 0.0f : CalcFontSize() + g.Style.FramePadding.y * 2.0f; } |
| ImRect TitleBarRect() const { return ImRect(Pos, ImVec2(Pos.x + SizeFull.x, Pos.y + TitleBarHeight())); } |
| float MenuBarHeight() const { ImGuiContext& g = *GImGui; return (Flags & ImGuiWindowFlags_MenuBar) ? DC.MenuBarOffset.y + CalcFontSize() + g.Style.FramePadding.y * 2.0f : 0.0f; } |
| ImRect MenuBarRect() const { float y1 = Pos.y + TitleBarHeight(); return ImRect(Pos.x, y1, Pos.x + SizeFull.x, y1 + MenuBarHeight()); } |
| }; |
| |
| // Backup and restore just enough data to be able to use IsItemHovered() on item A after another B in the same window has overwritten the data. |
| struct ImGuiLastItemDataBackup |
| { |
| ImGuiID LastItemId; |
| ImGuiItemStatusFlags LastItemStatusFlags; |
| ImRect LastItemRect; |
| ImRect LastItemDisplayRect; |
| |
| ImGuiLastItemDataBackup() { Backup(); } |
| void Backup() { ImGuiWindow* window = GImGui->CurrentWindow; LastItemId = window->DC.LastItemId; LastItemStatusFlags = window->DC.LastItemStatusFlags; LastItemRect = window->DC.LastItemRect; LastItemDisplayRect = window->DC.LastItemDisplayRect; } |
| void Restore() const { ImGuiWindow* window = GImGui->CurrentWindow; window->DC.LastItemId = LastItemId; window->DC.LastItemStatusFlags = LastItemStatusFlags; window->DC.LastItemRect = LastItemRect; window->DC.LastItemDisplayRect = LastItemDisplayRect; } |
| }; |
| |
| //----------------------------------------------------------------------------- |
| // [SECTION] Tab bar, Tab item support |
| //----------------------------------------------------------------------------- |
| |
| // Extend ImGuiTabBarFlags_ |
| enum ImGuiTabBarFlagsPrivate_ |
| { |
| 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] |
| ImGuiTabBarFlags_IsFocused = 1 << 21, |
| 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 |
| }; |
| |
| // Extend ImGuiTabItemFlags_ |
| enum ImGuiTabItemFlagsPrivate_ |
| { |
| 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) |
| ImGuiTabItemFlags_Button = 1 << 21 // Used by TabItemButton, change the tab item behavior to mimic a button |
| }; |
| |
| // Storage for one active tab item (sizeof() 28~32 bytes) |
| struct ImGuiTabItem |
| { |
| ImGuiID ID; |
| ImGuiTabItemFlags Flags; |
| int LastFrameVisible; |
| int LastFrameSelected; // This allows us to infer an ordered list of the last activated tabs with little maintenance |
| float Offset; // Position relative to beginning of tab |
| float Width; // Width currently displayed |
| float ContentWidth; // Width of label, stored during BeginTabItem() call |
| ImS16 NameOffset; // When Window==NULL, offset to name within parent ImGuiTabBar::TabsNames |
| ImS16 BeginOrder; // BeginTabItem() order, used to re-order tabs after toggling ImGuiTabBarFlags_Reorderable |
| ImS16 IndexDuringLayout; // Index only used during TabBarLayout() |
| bool WantClose; // Marked as closed by SetTabItemClosed() |
| |
| ImGuiTabItem() { memset(this, 0, sizeof(*this)); LastFrameVisible = LastFrameSelected = -1; NameOffset = BeginOrder = IndexDuringLayout = -1; } |
| }; |
| |
| // Storage for a tab bar (sizeof() 152 bytes) |
| struct ImGuiTabBar |
| { |
| ImVector<ImGuiTabItem> Tabs; |
| ImGuiTabBarFlags Flags; |
| ImGuiID ID; // Zero for tab-bars used by docking |
| ImGuiID SelectedTabId; // Selected tab/window |
| ImGuiID NextSelectedTabId; |
| ImGuiID VisibleTabId; // Can occasionally be != SelectedTabId (e.g. when previewing contents for CTRL+TAB preview) |
| int CurrFrameVisible; |
| int PrevFrameVisible; |
| ImRect BarRect; |
| float CurrTabsContentsHeight; |
| float PrevTabsContentsHeight; // Record the height of contents submitted below the tab bar |
| float WidthAllTabs; // Actual width of all tabs (locked during layout) |
| float WidthAllTabsIdeal; // Ideal width if all tabs were visible and not clipped |
| float ScrollingAnim; |
| float ScrollingTarget; |
| float ScrollingTargetDistToVisibility; |
| float ScrollingSpeed; |
| float ScrollingRectMinX; |
| float ScrollingRectMaxX; |
| ImGuiID ReorderRequestTabId; |
| ImS8 ReorderRequestDir; |
| ImS8 BeginCount; |
| bool WantLayout; |
| bool VisibleTabWasSubmitted; |
| bool TabsAddedNew; // Set to true when a new tab item or button has been added to the tab bar during last frame |
| ImS16 TabsActiveCount; // Number of tabs submitted this frame. |
| ImS16 LastTabItemIdx; // Index of last BeginTabItem() tab for use by EndTabItem() |
| float ItemSpacingY; |
| ImVec2 FramePadding; // style.FramePadding locked at the time of BeginTabBar() |
| ImVec2 BackupCursorPos; |
| ImGuiTextBuffer TabsNames; // For non-docking tab bar we re-append names in a contiguous buffer. |
| |
| ImGuiTabBar(); |
| int GetTabOrder(const ImGuiTabItem* tab) const { return Tabs.index_from_ptr(tab); } |
| const char* GetTabName(const ImGuiTabItem* tab) const |
| { |
| IM_ASSERT(tab->NameOffset != -1 && (int)tab->NameOffset < TabsNames.Buf.Size); |
| return TabsNames.Buf.Data + tab->NameOffset; |
| } |
| }; |
| |
| //----------------------------------------------------------------------------- |
| // [SECTION] Table support |
| //----------------------------------------------------------------------------- |
| |
| #ifdef IMGUI_HAS_TABLE |
| |
| #define IM_COL32_DISABLE IM_COL32(0,0,0,1) // Special sentinel code which cannot be used as a regular color. |
| #define IMGUI_TABLE_MAX_COLUMNS 64 // sizeof(ImU64) * 8. This is solely because we frequently encode columns set in a ImU64. |
| #define IMGUI_TABLE_MAX_DRAW_CHANNELS (4 + 64 * 2) // See TableSetupDrawChannels() |
| |
| // Our current column maximum is 64 but we may raise that in the future. |
| typedef ImS8 ImGuiTableColumnIdx; |
| typedef ImU8 ImGuiTableDrawChannelIdx; |
| |
| // [Internal] sizeof() ~ 104 |
| // We use the terminology "Enabled" to refer to a column that is not Hidden by user/api. |
| // We use the terminology "Clipped" to refer to a column that is out of sight because of scrolling/clipping. |
| // This is in contrast with some user-facing api such as IsItemVisible() / IsRectVisible() which use "Visible" to mean "not clipped". |
| struct ImGuiTableColumn |
| { |
| ImGuiTableColumnFlags Flags; // Flags after some patching (not directly same as provided by user). See ImGuiTableColumnFlags_ |
| 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. |
| float MinX; // Absolute positions |
| float MaxX; |
| float WidthRequest; // Master width absolute value when !(Flags & _WidthStretch). When Stretch this is derived every frame from StretchWeight in TableUpdateLayout() |
| float WidthAuto; // Automatic width |
| float StretchWeight; // Master width weight when (Flags & _WidthStretch). Often around ~1.0f initially. |
| float InitStretchWeightOrWidth; // Value passed to TableSetupColumn(). For Width it is a content width (_without padding_). |
| ImRect ClipRect; // Clipping rectangle for the column |
| ImGuiID UserID; // Optional, value passed to TableSetupColumn() |
| float WorkMinX; // Contents region min ~(MinX + CellPaddingX + CellSpacingX1) == cursor start position when entering column |
| float WorkMaxX; // Contents region max ~(MaxX - CellPaddingX - CellSpacingX2) |
| float ItemWidth; // Current item width for the column, preserved across rows |
| float ContentMaxXFrozen; // Contents maximum position for frozen rows (apart from headers), from which we can infer content width. |
| float ContentMaxXUnfrozen; |
| 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 |
| float ContentMaxXHeadersIdeal; |
| ImS16 NameOffset; // Offset into parent ColumnsNames[] |
| ImGuiTableColumnIdx DisplayOrder; // Index within Table's IndexToDisplayOrder[] (column may be reordered by users) |
| ImGuiTableColumnIdx IndexWithinEnabledSet; // Index within enabled/visible set (<= IndexToDisplayOrder) |
| ImGuiTableColumnIdx PrevEnabledColumn; // Index of prev enabled/visible column within Columns[], -1 if first enabled/visible column |
| ImGuiTableColumnIdx NextEnabledColumn; // Index of next enabled/visible column within Columns[], -1 if last enabled/visible column |
| 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 |
| ImGuiTableDrawChannelIdx DrawChannelCurrent; // Index within DrawSplitter.Channels[] |
| ImGuiTableDrawChannelIdx DrawChannelFrozen; |
| ImGuiTableDrawChannelIdx DrawChannelUnfrozen; |
| bool IsEnabled; // Is the column not marked Hidden by the user? (even if off view, e.g. clipped by scrolling). |
| bool IsEnabledNextFrame; |
| bool IsVisibleX; // Is actually in view (e.g. overlapping the host window clipping rectangle, not scrolled). |
| bool IsVisibleY; |
| bool IsRequestOutput; // Return value for TableSetColumnIndex() / TableNextColumn(): whether we request user to output contents or not. |
| bool IsSkipItems; // Do we want item submissions to this column to be completely ignored (no layout will happen). |
| bool IsPreserveWidthAuto; |
| ImS8 NavLayerCurrent; // ImGuiNavLayer in 1 byte |
| ImU8 AutoFitQueue; // Queue of 8 values for the next 8 frames to request auto-fit |
| ImU8 CannotSkipItemsQueue; // Queue of 8 values for the next 8 frames to disable Clipped/SkipItem |
| ImU8 SortDirection : 2; // ImGuiSortDirection_Ascending or ImGuiSortDirection_Descending |
| ImU8 SortDirectionsAvailCount : 2; // Number of available sort directions (0 to 3) |
| ImU8 SortDirectionsAvailMask : 4; // Mask of available sort directions (1-bit each) |
| ImU8 SortDirectionsAvailList; // Ordered of available sort directions (2-bits each) |
| |
| ImGuiTableColumn() |
| { |
| memset(this, 0, sizeof(*this)); |
| StretchWeight = WidthRequest = -1.0f; |
| NameOffset = -1; |
| DisplayOrder = IndexWithinEnabledSet = -1; |
| PrevEnabledColumn = NextEnabledColumn = -1; |
| SortOrder = -1; |
| SortDirection = ImGuiSortDirection_None; |
| DrawChannelCurrent = DrawChannelFrozen = DrawChannelUnfrozen = (ImU8)-1; |
| } |
| }; |
| |
| // Transient cell data stored per row. |
| // sizeof() ~ 6 |
| struct ImGuiTableCellData |
| { |
| ImU32 BgColor; // Actual color |
| ImGuiTableColumnIdx Column; // Column number |
| }; |
| |
| // FIXME-TABLE: transient data could be stored in a per-stacked table structure: DrawSplitter, SortSpecs, incoming RowData |
| struct ImGuiTable |
| { |
| ImGuiID ID; |
| ImGuiTableFlags Flags; |
| void* RawData; // Single allocation to hold Columns[], DisplayOrderToIndex[] and RowCellData[] |
| ImSpan<ImGuiTableColumn> Columns; // Point within RawData[] |
| ImSpan<ImGuiTableColumnIdx> DisplayOrderToIndex; // Point within RawData[]. Store display order of columns (when not reordered, the values are 0...Count-1) |
| ImSpan<ImGuiTableCellData> RowCellData; // Point within RawData[]. Store cells background requests for current row. |
| ImU64 EnabledMaskByDisplayOrder; // Column DisplayOrder -> IsEnabled map |
| ImU64 EnabledMaskByIndex; // Column Index -> IsEnabled map (== not hidden by user/api) in a format adequate for iterating column without touching cold data |
| ImU64 VisibleMaskByIndex; // Column Index -> IsVisibleX|IsVisibleY map (== not hidden by user/api && not hidden by scrolling/cliprect) |
| ImU64 RequestOutputMaskByIndex; // Column Index -> IsVisible || AutoFit (== expect user to submit items) |
| ImGuiTableFlags SettingsLoadedFlags; // Which data were loaded from the .ini file (e.g. when order is not altered we won't save order) |
| int SettingsOffset; // Offset in g.SettingsTables |
| int LastFrameActive; |
| int ColumnsCount; // Number of columns declared in BeginTable() |
| int CurrentRow; |
| int CurrentColumn; |
| 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. |
| ImS16 InstanceInteracted; // Mark which instance (generally 0) of the same ID is being interacted with |
| float RowPosY1; |
| float RowPosY2; |
| float RowMinHeight; // Height submitted to TableNextRow() |
| float RowTextBaseline; |
| float RowIndentOffsetX; |
| ImGuiTableRowFlags RowFlags : 16; // Current row flags, see ImGuiTableRowFlags_ |
| ImGuiTableRowFlags LastRowFlags : 16; |
| 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. |
| ImU32 RowBgColor[2]; // Background color override for current row. |
| ImU32 BorderColorStrong; |
| ImU32 BorderColorLight; |
| float BorderX1; |
| float BorderX2; |
| float HostIndentX; |
| float MinColumnWidth; |
| float OuterPaddingX; |
| float CellPaddingX; // Padding from each borders |
| float CellPaddingY; |
| float CellSpacingX1; // Spacing between non-bordered cells |
| float CellSpacingX2; |
| float LastOuterHeight; // Outer height from last frame |
| float LastFirstRowHeight; // Height of first row from last frame |
| float InnerWidth; // User value passed to BeginTable(), see comments at the top of BeginTable() for details. |
| float ColumnsGivenWidth; // Sum of current column width |
| float ColumnsAutoFitWidth; // Sum of ideal column width in order nothing to be clipped, used for auto-fitting and content width submission in outer window |
| float ResizedColumnNextWidth; |
| float ResizeLockMinContentsX2; // Lock minimum contents width while resizing down in order to not create feedback loops. But we allow growing the table. |
| float RefScale; // Reference scale to be able to rescale columns on font/dpi changes. |
| ImRect OuterRect; // Note: for non-scrolling table, OuterRect.Max.y is often FLT_MAX until EndTable(), unless a height has been specified in BeginTable(). |
| ImRect InnerRect; // InnerRect but without decoration. As with OuterRect, for non-scrolling tables, InnerRect.Max.y is |
| ImRect WorkRect; |
| ImRect InnerClipRect; |
| ImRect BgClipRect; // We use this to cpu-clip cell background color fill |
| 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 |
| 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. |
| 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. |
| ImRect HostBackupWorkRect; // Backup of InnerWindow->WorkRect at the end of BeginTable() |
| ImRect HostBackupParentWorkRect; // Backup of InnerWindow->ParentWorkRect at the end of BeginTable() |
| ImRect HostBackupInnerClipRect; // Backup of InnerWindow->ClipRect during PushTableBackground()/PopTableBackground() |
| ImVec2 HostBackupPrevLineSize; // Backup of InnerWindow->DC.PrevLineSize at the end of BeginTable() |
| ImVec2 HostBackupCurrLineSize; // Backup of InnerWindow->DC.CurrLineSize at the end of BeginTable() |
| ImVec2 HostBackupCursorMaxPos; // Backup of InnerWindow->DC.CursorMaxPos at the end of BeginTable() |
| ImVec1 HostBackupColumnsOffset; // Backup of OuterWindow->DC.ColumnsOffset at the end of BeginTable() |
| float HostBackupItemWidth; // Backup of OuterWindow->DC.ItemWidth at the end of BeginTable() |
| int HostBackupItemWidthStackSize;// Backup of OuterWindow->DC.ItemWidthStack.Size at the end of BeginTable() |
| ImGuiWindow* OuterWindow; // Parent window for the table |
| ImGuiWindow* InnerWindow; // Window holding the table data (== OuterWindow or a child window) |
| ImGuiTextBuffer ColumnsNames; // Contiguous buffer holding columns names |
| ImDrawListSplitter DrawSplitter; // We carry our own ImDrawList splitter to allow recursion (FIXME: could be stored outside, worst case we need 1 splitter per recursing table) |
| ImGuiTableColumnSortSpecs SortSpecsSingle; |
| ImVector<ImGuiTableColumnSortSpecs> SortSpecsMulti; // FIXME-OPT: Using a small-vector pattern would work be good. |
| ImGuiTableSortSpecs SortSpecs; // Public facing sorts specs, this is what we return in TableGetSortSpecs() |
| ImGuiTableColumnIdx SortSpecsCount; |
| ImGuiTableColumnIdx ColumnsEnabledCount; // Number of enabled columns (<= ColumnsCount) |
| ImGuiTableColumnIdx ColumnsEnabledFixedCount; // Number of enabled columns (<= ColumnsCount) |
| ImGuiTableColumnIdx DeclColumnsCount; // Count calls to TableSetupColumn() |
| ImGuiTableColumnIdx HoveredColumnBody; // Index of column whose visible region is being hovered. Important: == ColumnsCount when hovering empty region after the right-most column! |
| ImGuiTableColumnIdx HoveredColumnBorder; // Index of column whose right-border is being hovered (for resizing). |
| ImGuiTableColumnIdx AutoFitSingleColumn; // Index of single column requesting auto-fit. |
| ImGuiTableColumnIdx ResizedColumn; // Index of column being resized. Reset when InstanceCurrent==0. |
| ImGuiTableColumnIdx LastResizedColumn; // Index of column being resized from previous frame. |
| ImGuiTableColumnIdx HeldHeaderColumn; // Index of column header being held. |
| ImGuiTableColumnIdx ReorderColumn; // Index of column being reordered. (not cleared) |
| ImGuiTableColumnIdx ReorderColumnDir; // -1 or +1 |
| ImGuiTableColumnIdx LeftMostStretchedColumn; // Index of left-most stretched column. |
| ImGuiTableColumnIdx RightMostStretchedColumn; // Index of right-most stretched column. |
| ImGuiTableColumnIdx RightMostEnabledColumn; // Index of right-most non-hidden column. |
| ImGuiTableColumnIdx ContextPopupColumn; // Column right-clicked on, of -1 if opening context menu from a neutral/empty spot |
| ImGuiTableColumnIdx FreezeRowsRequest; // Requested frozen rows count |
| ImGuiTableColumnIdx FreezeRowsCount; // Actual frozen row count (== FreezeRowsRequest, or == 0 when no scrolling offset) |
| ImGuiTableColumnIdx FreezeColumnsRequest; // Requested frozen columns count |
| ImGuiTableColumnIdx FreezeColumnsCount; // Actual frozen columns count (== FreezeColumnsRequest, or == 0 when no scrolling offset) |
| ImGuiTableColumnIdx RowCellDataCurrent; // Index of current RowCellData[] entry in current row |
| ImGuiTableDrawChannelIdx DummyDrawChannel; // Redirect non-visible columns here. |
| ImGuiTableDrawChannelIdx Bg2DrawChannelCurrent; // For Selectable() and other widgets drawing accross columns after the freezing line. Index within DrawSplitter.Channels[] |
| ImGuiTableDrawChannelIdx Bg2DrawChannelUnfrozen; |
| bool IsLayoutLocked; // Set by TableUpdateLayout() which is called when beginning the first row. |
| bool IsInsideRow; // Set when inside TableBeginRow()/TableEndRow(). |
| bool IsInitializing; |
| bool IsSortSpecsDirty; |
| bool IsUsingHeaders; // Set when the first row had the ImGuiTableRowFlags_Headers flag. |
| bool IsContextPopupOpen; // Set when default context menu is open (also see: ContextPopupColumn, InstanceInteracted). |
| bool IsSettingsRequestLoad; |
| bool IsSettingsDirty; // Set when table settings have changed and needs to be reported into ImGuiTableSetttings data. |
| bool IsDefaultDisplayOrder; // Set when display order is unchanged from default (DisplayOrder contains 0...Count-1) |
| bool IsResetAllRequest; |
| bool IsResetDisplayOrderRequest; |
| bool IsUnfrozenRows; // Set when we got past the frozen row. |
| bool IsOuterRectAutoFitX; // Set when outer_size.x == 0.0f in BeginTable(), scrolling is disabled, and there are stretch columns. |
| bool MemoryCompacted; |
| bool HostSkipItems; // Backup of InnerWindow->SkipItem at the end of BeginTable(), because we will overwrite InnerWindow->SkipItem on a per-column basis |
| |
| IMGUI_API ImGuiTable() { memset(this, 0, sizeof(*this)); LastFrameActive = -1; } |
| IMGUI_API ~ImGuiTable() { IM_FREE(RawData); } |
| }; |
| |
| // sizeof() ~ 12 |
| struct ImGuiTableColumnSettings |
| { |
| float WidthOrWeight; |
| ImGuiID UserID; |
| ImGuiTableColumnIdx Index; |
| ImGuiTableColumnIdx DisplayOrder; |
| ImGuiTableColumnIdx SortOrder; |
| ImU8 SortDirection : 2; |
| ImU8 IsEnabled : 1; // "Visible" in ini file |
| ImU8 IsStretch : 1; |
| |
| ImGuiTableColumnSettings() |
| { |
| WidthOrWeight = 0.0f; |
| UserID = 0; |
| Index = -1; |
| DisplayOrder = SortOrder = -1; |
| SortDirection = ImGuiSortDirection_None; |
| IsEnabled = 1; |
| IsStretch = 0; |
| } |
| }; |
| |
| // This is designed to be stored in a single ImChunkStream (1 header followed by N ImGuiTableColumnSettings, etc.) |
| struct ImGuiTableSettings |
| { |
| ImGuiID ID; // Set to 0 to invalidate/delete the setting |
| ImGuiTableFlags SaveFlags; // Indicate data we want to save using the Resizable/Reorderable/Sortable/Hideable flags (could be using its own flags..) |
| float RefScale; // Reference scale to be able to rescale columns on font/dpi changes. |
| ImGuiTableColumnIdx ColumnsCount; |
| 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 |
| bool WantApply; // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context) |
| |
| ImGuiTableSettings() { memset(this, 0, sizeof(*this)); } |
| ImGuiTableColumnSettings* GetColumnSettings() { return (ImGuiTableColumnSettings*)(this + 1); } |
| }; |
| |
| #endif // #ifdef IMGUI_HAS_TABLE |
| |
| //----------------------------------------------------------------------------- |
| // [SECTION] Internal API |
| // No guarantee of forward compatibility here! |
| //----------------------------------------------------------------------------- |
| |
| namespace ImGui |
| { |
| // Windows |
| // We should always have a CurrentWindow in the stack (there is an implicit "Debug" window) |
| // If this ever crash because g.CurrentWindow is NULL it means that either |
| // - ImGui::NewFrame() has never been called, which is illegal. |
| // - You are calling ImGui functions after ImGui::EndFrame()/ImGui::Render() and before the next ImGui::NewFrame(), which is also illegal. |
| inline ImGuiWindow* GetCurrentWindowRead() { ImGuiContext& g = *GImGui; return g.CurrentWindow; } |
| inline ImGuiWindow* GetCurrentWindow() { ImGuiContext& g = *GImGui; g.CurrentWindow->WriteAccessed = true; return g.CurrentWindow; } |
| IMGUI_API ImGuiWindow* FindWindowByID(ImGuiID id); |
| IMGUI_API ImGuiWindow* FindWindowByName(const char* name); |
| IMGUI_API void UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags flags, ImGuiWindow* parent_window); |
| IMGUI_API ImVec2 CalcWindowExpectedSize(ImGuiWindow* window); |
| IMGUI_API bool IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent); |
| IMGUI_API bool IsWindowAbove(ImGuiWindow* potential_above, ImGuiWindow* potential_below); |
| IMGUI_API bool IsWindowNavFocusable(ImGuiWindow* window); |
| IMGUI_API ImRect GetWindowAllowedExtentRect(ImGuiWindow* window); |
| IMGUI_API void SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond = 0); |
| IMGUI_API void SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond cond = 0); |
| IMGUI_API void SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiCond cond = 0); |
| IMGUI_API void SetWindowHitTestHole(ImGuiWindow* window, const ImVec2& pos, const ImVec2& size); |
| |
| // Windows: Display Order and Focus Order |
| IMGUI_API void FocusWindow(ImGuiWindow* window); |
| IMGUI_API void FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWindow* ignore_window); |
| IMGUI_API void BringWindowToFocusFront(ImGuiWindow* window); |
| IMGUI_API void BringWindowToDisplayFront(ImGuiWindow* window); |
| IMGUI_API void BringWindowToDisplayBack(ImGuiWindow* window); |
| |
| // Fonts, drawing |
| IMGUI_API void SetCurrentFont(ImFont* font); |
| inline ImFont* GetDefaultFont() { ImGuiContext& g = *GImGui; return g.IO.FontDefault ? g.IO.FontDefault : g.IO.Fonts->Fonts[0]; } |
| inline ImDrawList* GetForegroundDrawList(ImGuiWindow* window) { IM_UNUSED(window); ImGuiContext& g = *GImGui; return &g.ForegroundDrawList; } // This seemingly unnecessary wrapper simplifies compatibility between the 'master' and 'docking' branches. |
| |
| // Init |
| IMGUI_API void Initialize(ImGuiContext* context); |
| IMGUI_API void Shutdown(ImGuiContext* context); // Since 1.60 this is a _private_ function. You can call DestroyContext() to destroy the context created by CreateContext(). |
| |
| // NewFrame |
| IMGUI_API void UpdateHoveredWindowAndCaptureFlags(); |
| IMGUI_API void StartMouseMovingWindow(ImGuiWindow* window); |
| IMGUI_API void UpdateMouseMovingWindowNewFrame(); |
| IMGUI_API void UpdateMouseMovingWindowEndFrame(); |
| |
| // Generic context hooks |
| IMGUI_API void AddContextHook(ImGuiContext* context, const ImGuiContextHook* hook); |
| IMGUI_API void CallContextHooks(ImGuiContext* context, ImGuiContextHookType type); |
| |
| // Settings |
| IMGUI_API void MarkIniSettingsDirty(); |
| IMGUI_API void MarkIniSettingsDirty(ImGuiWindow* window); |
| IMGUI_API void ClearIniSettings(); |
| IMGUI_API ImGuiWindowSettings* CreateNewWindowSettings(const char* name); |
| IMGUI_API ImGuiWindowSettings* FindWindowSettings(ImGuiID id); |
| IMGUI_API ImGuiWindowSettings* FindOrCreateWindowSettings(const char* name); |
| IMGUI_API ImGuiSettingsHandler* FindSettingsHandler(const char* type_name); |
| |
| // Scrolling |
| IMGUI_API void SetNextWindowScroll(const ImVec2& scroll); // Use -1.0f on one axis to leave as-is |
| IMGUI_API void SetScrollX(ImGuiWindow* window, float scroll_x); |
| IMGUI_API void SetScrollY(ImGuiWindow* window, float scroll_y); |
| IMGUI_API void SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x_ratio); |
| IMGUI_API void SetScrollFromPosY(ImGuiWindow* window, float local_y, float center_y_ratio); |
| IMGUI_API ImVec2 ScrollToBringRectIntoView(ImGuiWindow* window, const ImRect& item_rect); |
| |
| // Basic Accessors |
| inline ImGuiID GetItemID() { ImGuiContext& g = *GImGui; return g.CurrentWindow->DC.LastItemId; } // Get ID of last item (~~ often same ImGui::GetID(label) beforehand) |
| inline ImGuiItemStatusFlags GetItemStatusFlags() { ImGuiContext& g = *GImGui; return g.CurrentWindow->DC.LastItemStatusFlags; } |
| inline ImGuiID GetActiveID() { ImGuiContext& g = *GImGui; return g.ActiveId; } |
| inline ImGuiID GetFocusID() { ImGuiContext& g = *GImGui; return g.NavId; } |
| inline ImGuiItemFlags GetItemsFlags() { ImGuiContext& g = *GImGui; return g.CurrentWindow->DC.ItemFlags; } |
| IMGUI_API void SetActiveID(ImGuiID id, ImGuiWindow* window); |
| IMGUI_API void SetFocusID(ImGuiID id, ImGuiWindow* window); |
| IMGUI_API void ClearActiveID(); |
| IMGUI_API ImGuiID GetHoveredID(); |
| IMGUI_API void SetHoveredID(ImGuiID id); |
| IMGUI_API void KeepAliveID(ImGuiID id); |
| IMGUI_API void MarkItemEdited(ImGuiID id); // Mark data associated to given item as "edited", used by IsItemDeactivatedAfterEdit() function. |
| 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) |
| IMGUI_API ImGuiID GetIDWithSeed(const char* str_id_begin, const char* str_id_end, ImGuiID seed); |
| |
| // Basic Helpers for widget code |
| IMGUI_API void ItemSize(const ImVec2& size, float text_baseline_y = -1.0f); |
| IMGUI_API void ItemSize(const ImRect& bb, float text_baseline_y = -1.0f); |
| IMGUI_API bool ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb = NULL); |
| IMGUI_API bool ItemHoverable(const ImRect& bb, ImGuiID id); |
| IMGUI_API bool IsClippedEx(const ImRect& bb, ImGuiID id, bool clip_even_when_logged); |
| IMGUI_API void SetLastItemData(ImGuiWindow* window, ImGuiID item_id, ImGuiItemStatusFlags status_flags, const ImRect& item_rect); |
| IMGUI_API bool FocusableItemRegister(ImGuiWindow* |