git repos / blockattack-game

blame: source/code/Libs/imgui/imgui_internal.h

normal view · raw

4e9e2555 Poul Sander 2025-10-05 10:15 1
// dear imgui, v1.92.3
1193b4be Poul Sander 2025-02-03 21:28 2
// (internal structures/api)
1193b4be Poul Sander 2025-02-03 21:28 3
1193b4be Poul Sander 2025-02-03 21:28 4
// You may use this file to debug, understand or extend Dear ImGui features but we don't provide any guarantee of forward compatibility.
1193b4be Poul Sander 2025-02-03 21:28 5
1193b4be Poul Sander 2025-02-03 21:28 6
/*
1193b4be Poul Sander 2025-02-03 21:28 7
1193b4be Poul Sander 2025-02-03 21:28 8
Index of this file:
1193b4be Poul Sander 2025-02-03 21:28 9
1193b4be Poul Sander 2025-02-03 21:28 10
// [SECTION] Header mess
1193b4be Poul Sander 2025-02-03 21:28 11
// [SECTION] Forward declarations
1193b4be Poul Sander 2025-02-03 21:28 12
// [SECTION] Context pointer
1193b4be Poul Sander 2025-02-03 21:28 13
// [SECTION] STB libraries includes
1193b4be Poul Sander 2025-02-03 21:28 14
// [SECTION] Macros
1193b4be Poul Sander 2025-02-03 21:28 15
// [SECTION] Generic helpers
1193b4be Poul Sander 2025-02-03 21:28 16
// [SECTION] ImDrawList support
4e9e2555 Poul Sander 2025-10-05 10:15 17
// [SECTION] Style support
1193b4be Poul Sander 2025-02-03 21:28 18
// [SECTION] Data types support
1193b4be Poul Sander 2025-02-03 21:28 19
// [SECTION] Widgets support: flags, enums, data structures
1193b4be Poul Sander 2025-02-03 21:28 20
// [SECTION] Popup support
1193b4be Poul Sander 2025-02-03 21:28 21
// [SECTION] Inputs support
1193b4be Poul Sander 2025-02-03 21:28 22
// [SECTION] Clipper support
1193b4be Poul Sander 2025-02-03 21:28 23
// [SECTION] Navigation support
1193b4be Poul Sander 2025-02-03 21:28 24
// [SECTION] Typing-select support
1193b4be Poul Sander 2025-02-03 21:28 25
// [SECTION] Columns support
1193b4be Poul Sander 2025-02-03 21:28 26
// [SECTION] Box-select support
1193b4be Poul Sander 2025-02-03 21:28 27
// [SECTION] Multi-select support
1193b4be Poul Sander 2025-02-03 21:28 28
// [SECTION] Docking support
1193b4be Poul Sander 2025-02-03 21:28 29
// [SECTION] Viewport support
1193b4be Poul Sander 2025-02-03 21:28 30
// [SECTION] Settings support
1193b4be Poul Sander 2025-02-03 21:28 31
// [SECTION] Localization support
1193b4be Poul Sander 2025-02-03 21:28 32
// [SECTION] Error handling, State recovery support
1193b4be Poul Sander 2025-02-03 21:28 33
// [SECTION] Metrics, Debug tools
1193b4be Poul Sander 2025-02-03 21:28 34
// [SECTION] Generic context hooks
1193b4be Poul Sander 2025-02-03 21:28 35
// [SECTION] ImGuiContext (main imgui context)
1193b4be Poul Sander 2025-02-03 21:28 36
// [SECTION] ImGuiWindowTempData, ImGuiWindow
1193b4be Poul Sander 2025-02-03 21:28 37
// [SECTION] Tab bar, Tab item support
1193b4be Poul Sander 2025-02-03 21:28 38
// [SECTION] Table support
1193b4be Poul Sander 2025-02-03 21:28 39
// [SECTION] ImGui internal API
4e9e2555 Poul Sander 2025-10-05 10:15 40
// [SECTION] ImFontLoader
1193b4be Poul Sander 2025-02-03 21:28 41
// [SECTION] ImFontAtlas internal API
1193b4be Poul Sander 2025-02-03 21:28 42
// [SECTION] Test Engine specific hooks (imgui_test_engine)
1193b4be Poul Sander 2025-02-03 21:28 43
1193b4be Poul Sander 2025-02-03 21:28 44
*/
1193b4be Poul Sander 2025-02-03 21:28 45
1193b4be Poul Sander 2025-02-03 21:28 46
#pragma once
1193b4be Poul Sander 2025-02-03 21:28 47
#ifndef IMGUI_DISABLE
1193b4be Poul Sander 2025-02-03 21:28 48
1193b4be Poul Sander 2025-02-03 21:28 49
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 50
// [SECTION] Header mess
1193b4be Poul Sander 2025-02-03 21:28 51
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 52
1193b4be Poul Sander 2025-02-03 21:28 53
#ifndef IMGUI_VERSION
1193b4be Poul Sander 2025-02-03 21:28 54
#include "imgui.h"
1193b4be Poul Sander 2025-02-03 21:28 55
#endif
1193b4be Poul Sander 2025-02-03 21:28 56
1193b4be Poul Sander 2025-02-03 21:28 57
#include <stdio.h>      // FILE*, sscanf
1193b4be Poul Sander 2025-02-03 21:28 58
#include <stdlib.h>     // NULL, malloc, free, qsort, atoi, atof
1193b4be Poul Sander 2025-02-03 21:28 59
#include <math.h>       // sqrtf, fabsf, fmodf, powf, floorf, ceilf, cosf, sinf
1193b4be Poul Sander 2025-02-03 21:28 60
#include <limits.h>     // INT_MIN, INT_MAX
1193b4be Poul Sander 2025-02-03 21:28 61
1193b4be Poul Sander 2025-02-03 21:28 62
// Enable SSE intrinsics if available
1193b4be Poul Sander 2025-02-03 21:28 63
#if (defined __SSE__ || defined __x86_64__ || defined _M_X64 || (defined(_M_IX86_FP) && (_M_IX86_FP >= 1))) && !defined(IMGUI_DISABLE_SSE)
1193b4be Poul Sander 2025-02-03 21:28 64
#define IMGUI_ENABLE_SSE
1193b4be Poul Sander 2025-02-03 21:28 65
#include <immintrin.h>
4e9e2555 Poul Sander 2025-10-05 10:15 66
#if (defined __AVX__ || defined __SSE4_2__)
4e9e2555 Poul Sander 2025-10-05 10:15 67
#define IMGUI_ENABLE_SSE4_2
4e9e2555 Poul Sander 2025-10-05 10:15 68
#include <nmmintrin.h>
4e9e2555 Poul Sander 2025-10-05 10:15 69
#endif
4e9e2555 Poul Sander 2025-10-05 10:15 70
#endif
4e9e2555 Poul Sander 2025-10-05 10:15 71
// Emscripten has partial SSE 4.2 support where _mm_crc32_u32 is not available. See https://emscripten.org/docs/porting/simd.html#id11 and #8213
4e9e2555 Poul Sander 2025-10-05 10:15 72
#if defined(IMGUI_ENABLE_SSE4_2) && !defined(IMGUI_USE_LEGACY_CRC32_ADLER) && !defined(__EMSCRIPTEN__)
4e9e2555 Poul Sander 2025-10-05 10:15 73
#define IMGUI_ENABLE_SSE4_2_CRC
1193b4be Poul Sander 2025-02-03 21:28 74
#endif
1193b4be Poul Sander 2025-02-03 21:28 75
1193b4be Poul Sander 2025-02-03 21:28 76
// Visual Studio warnings
1193b4be Poul Sander 2025-02-03 21:28 77
#ifdef _MSC_VER
1193b4be Poul Sander 2025-02-03 21:28 78
#pragma warning (push)
1193b4be Poul Sander 2025-02-03 21:28 79
#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)
1193b4be Poul Sander 2025-02-03 21:28 80
#pragma warning (disable: 26495)    // [Static Analyzer] Variable 'XXX' is uninitialized. Always initialize a member variable (type.6).
4e9e2555 Poul Sander 2025-10-05 10:15 81
#pragma warning (disable: 26812)    // [Static Analyzer] The enum type 'xxx' is unscoped. Prefer 'enum class' over 'enum' (Enum.3).
1193b4be Poul Sander 2025-02-03 21:28 82
#if defined(_MSC_VER) && _MSC_VER >= 1922 // MSVC 2019 16.2 or later
1193b4be Poul Sander 2025-02-03 21:28 83
#pragma warning (disable: 5054)     // operator '|': deprecated between enumerations of different types
1193b4be Poul Sander 2025-02-03 21:28 84
#endif
1193b4be Poul Sander 2025-02-03 21:28 85
#endif
1193b4be Poul Sander 2025-02-03 21:28 86
1193b4be Poul Sander 2025-02-03 21:28 87
// Clang/GCC warnings with -Weverything
1193b4be Poul Sander 2025-02-03 21:28 88
#if defined(__clang__)
1193b4be Poul Sander 2025-02-03 21:28 89
#pragma clang diagnostic push
1193b4be Poul Sander 2025-02-03 21:28 90
#if __has_warning("-Wunknown-warning-option")
1193b4be Poul Sander 2025-02-03 21:28 91
#pragma clang diagnostic ignored "-Wunknown-warning-option"         // warning: unknown warning group 'xxx'
1193b4be Poul Sander 2025-02-03 21:28 92
#endif
1193b4be Poul Sander 2025-02-03 21:28 93
#pragma clang diagnostic ignored "-Wunknown-pragmas"                // warning: unknown warning group 'xxx'
1193b4be Poul Sander 2025-02-03 21:28 94
#pragma clang diagnostic ignored "-Wfloat-equal"                    // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants ok, for ImFloor()
4e9e2555 Poul Sander 2025-10-05 10:15 95
#pragma clang diagnostic ignored "-Wold-style-cast"                 // warning: use of old-style cast
4e9e2555 Poul Sander 2025-10-05 10:15 96
#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"  // warning: zero as null pointer constant
4e9e2555 Poul Sander 2025-10-05 10:15 97
#pragma clang diagnostic ignored "-Wdouble-promotion"               // warning: implicit conversion from 'float' to 'double' when passing argument to function
1193b4be Poul Sander 2025-02-03 21:28 98
#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion"  // warning: implicit conversion from 'xxx' to 'float' may lose precision
1193b4be Poul Sander 2025-02-03 21:28 99
#pragma clang diagnostic ignored "-Wmissing-noreturn"               // warning: function 'xxx' could be declared with attribute 'noreturn'
1193b4be Poul Sander 2025-02-03 21:28 100
#pragma clang diagnostic ignored "-Wdeprecated-enum-enum-conversion"// warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated
1193b4be Poul Sander 2025-02-03 21:28 101
#pragma clang diagnostic ignored "-Wunsafe-buffer-usage"            // warning: 'xxx' is an unsafe pointer used for buffer access
4e9e2555 Poul Sander 2025-10-05 10:15 102
#pragma clang diagnostic ignored "-Wnontrivial-memaccess"           // warning: first argument in call to 'memset' is a pointer to non-trivially copyable type
1193b4be Poul Sander 2025-02-03 21:28 103
#elif defined(__GNUC__)
1193b4be Poul Sander 2025-02-03 21:28 104
#pragma GCC diagnostic push
1193b4be Poul Sander 2025-02-03 21:28 105
#pragma GCC diagnostic ignored "-Wpragmas"                          // warning: unknown option after '#pragma GCC diagnostic' kind
4e9e2555 Poul Sander 2025-10-05 10:15 106
#pragma GCC diagnostic ignored "-Wfloat-equal"                      // warning: comparing floating-point with '==' or '!=' is unsafe
1193b4be Poul Sander 2025-02-03 21:28 107
#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
1193b4be Poul Sander 2025-02-03 21:28 108
#pragma GCC diagnostic ignored "-Wdeprecated-enum-enum-conversion"  // warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated
1193b4be Poul Sander 2025-02-03 21:28 109
#endif
1193b4be Poul Sander 2025-02-03 21:28 110
1193b4be Poul Sander 2025-02-03 21:28 111
// In 1.89.4, we moved the implementation of "courtesy maths operators" from imgui_internal.h in imgui.h
1193b4be Poul Sander 2025-02-03 21:28 112
// As they are frequently requested, we do not want to encourage to many people using imgui_internal.h
1193b4be Poul Sander 2025-02-03 21:28 113
#if defined(IMGUI_DEFINE_MATH_OPERATORS) && !defined(IMGUI_DEFINE_MATH_OPERATORS_IMPLEMENTED)
1193b4be Poul Sander 2025-02-03 21:28 114
#error Please '#define IMGUI_DEFINE_MATH_OPERATORS' _BEFORE_ including imgui.h!
1193b4be Poul Sander 2025-02-03 21:28 115
#endif
1193b4be Poul Sander 2025-02-03 21:28 116
1193b4be Poul Sander 2025-02-03 21:28 117
// Legacy defines
1193b4be Poul Sander 2025-02-03 21:28 118
#ifdef IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS            // Renamed in 1.74
1193b4be Poul Sander 2025-02-03 21:28 119
#error Use IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS
1193b4be Poul Sander 2025-02-03 21:28 120
#endif
1193b4be Poul Sander 2025-02-03 21:28 121
#ifdef IMGUI_DISABLE_MATH_FUNCTIONS                     // Renamed in 1.74
1193b4be Poul Sander 2025-02-03 21:28 122
#error Use IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS
1193b4be Poul Sander 2025-02-03 21:28 123
#endif
1193b4be Poul Sander 2025-02-03 21:28 124
1193b4be Poul Sander 2025-02-03 21:28 125
// Enable stb_truetype by default unless FreeType is enabled.
1193b4be Poul Sander 2025-02-03 21:28 126
// You can compile with both by defining both IMGUI_ENABLE_FREETYPE and IMGUI_ENABLE_STB_TRUETYPE together.
1193b4be Poul Sander 2025-02-03 21:28 127
#ifndef IMGUI_ENABLE_FREETYPE
1193b4be Poul Sander 2025-02-03 21:28 128
#define IMGUI_ENABLE_STB_TRUETYPE
1193b4be Poul Sander 2025-02-03 21:28 129
#endif
1193b4be Poul Sander 2025-02-03 21:28 130
1193b4be Poul Sander 2025-02-03 21:28 131
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 132
// [SECTION] Forward declarations
1193b4be Poul Sander 2025-02-03 21:28 133
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 134
4e9e2555 Poul Sander 2025-10-05 10:15 135
// Utilities
4e9e2555 Poul Sander 2025-10-05 10:15 136
// (other types which are not forwarded declared are: ImBitArray<>, ImSpan<>, ImSpanAllocator<>, ImStableVector<>, ImPool<>, ImChunkStream<>)
1193b4be Poul Sander 2025-02-03 21:28 137
struct ImBitVector;                 // Store 1-bit per value
1193b4be Poul Sander 2025-02-03 21:28 138
struct ImRect;                      // An axis-aligned rectangle (2 points)
4e9e2555 Poul Sander 2025-10-05 10:15 139
struct ImGuiTextIndex;              // Maintain a line index for a text buffer.
4e9e2555 Poul Sander 2025-10-05 10:15 140
4e9e2555 Poul Sander 2025-10-05 10:15 141
// ImDrawList/ImFontAtlas
1193b4be Poul Sander 2025-02-03 21:28 142
struct ImDrawDataBuilder;           // Helper to build a ImDrawData instance
1193b4be Poul Sander 2025-02-03 21:28 143
struct ImDrawListSharedData;        // Data shared between all ImDrawList instances
4e9e2555 Poul Sander 2025-10-05 10:15 144
struct ImFontAtlasBuilder;          // Internal storage for incrementally packing and building a ImFontAtlas
4e9e2555 Poul Sander 2025-10-05 10:15 145
struct ImFontAtlasPostProcessData;  // Data available to potential texture post-processing functions
4e9e2555 Poul Sander 2025-10-05 10:15 146
struct ImFontAtlasRectEntry;        // Packed rectangle lookup entry
4e9e2555 Poul Sander 2025-10-05 10:15 147
4e9e2555 Poul Sander 2025-10-05 10:15 148
// ImGui
1193b4be Poul Sander 2025-02-03 21:28 149
struct ImGuiBoxSelectState;         // Box-selection state (currently used by multi-selection, could potentially be used by others)
1193b4be Poul Sander 2025-02-03 21:28 150
struct ImGuiColorMod;               // Stacked color modifier, backup of modified data so we can restore it
1193b4be Poul Sander 2025-02-03 21:28 151
struct ImGuiContext;                // Main Dear ImGui context
1193b4be Poul Sander 2025-02-03 21:28 152
struct ImGuiContextHook;            // Hook for extensions like ImGuiTestEngine
1193b4be Poul Sander 2025-02-03 21:28 153
struct ImGuiDataTypeInfo;           // Type information associated to a ImGuiDataType enum
4e9e2555 Poul Sander 2025-10-05 10:15 154
struct ImGuiDeactivatedItemData;    // Data for IsItemDeactivated()/IsItemDeactivatedAfterEdit() function.
1193b4be Poul Sander 2025-02-03 21:28 155
struct ImGuiDockContext;            // Docking system context
1193b4be Poul Sander 2025-02-03 21:28 156
struct ImGuiDockRequest;            // Docking system dock/undock queued request
1193b4be Poul Sander 2025-02-03 21:28 157
struct ImGuiDockNode;               // Docking system node (hold a list of Windows OR two child dock nodes)
1193b4be Poul Sander 2025-02-03 21:28 158
struct ImGuiDockNodeSettings;       // Storage for a dock node in .ini file (we preserve those even if the associated dock node isn't active during the session)
1193b4be Poul Sander 2025-02-03 21:28 159
struct ImGuiErrorRecoveryState;     // Storage of stack sizes for error handling and recovery
1193b4be Poul Sander 2025-02-03 21:28 160
struct ImGuiGroupData;              // Stacked storage data for BeginGroup()/EndGroup()
1193b4be Poul Sander 2025-02-03 21:28 161
struct ImGuiInputTextState;         // Internal state of the currently focused/edited text input box
1193b4be Poul Sander 2025-02-03 21:28 162
struct ImGuiInputTextDeactivateData;// Short term storage to backup text of a deactivating InputText() while another is stealing active id
1193b4be Poul Sander 2025-02-03 21:28 163
struct ImGuiLastItemData;           // Status storage for last submitted items
1193b4be Poul Sander 2025-02-03 21:28 164
struct ImGuiLocEntry;               // A localization entry.
1193b4be Poul Sander 2025-02-03 21:28 165
struct ImGuiMenuColumns;            // Simple column measurement, currently used for MenuItem() only
1193b4be Poul Sander 2025-02-03 21:28 166
struct ImGuiMultiSelectState;       // Multi-selection persistent state (for focused selection).
1193b4be Poul Sander 2025-02-03 21:28 167
struct ImGuiMultiSelectTempData;    // Multi-selection temporary state (while traversing).
1193b4be Poul Sander 2025-02-03 21:28 168
struct ImGuiNavItemData;            // Result of a keyboard/gamepad directional navigation move query result
1193b4be Poul Sander 2025-02-03 21:28 169
struct ImGuiMetricsConfig;          // Storage for ShowMetricsWindow() and DebugNodeXXX() functions
1193b4be Poul Sander 2025-02-03 21:28 170
struct ImGuiNextWindowData;         // Storage for SetNextWindow** functions
1193b4be Poul Sander 2025-02-03 21:28 171
struct ImGuiNextItemData;           // Storage for SetNextItem** functions
1193b4be Poul Sander 2025-02-03 21:28 172
struct ImGuiOldColumnData;          // Storage data for a single column for legacy Columns() api
1193b4be Poul Sander 2025-02-03 21:28 173
struct ImGuiOldColumns;             // Storage data for a columns set for legacy Columns() api
1193b4be Poul Sander 2025-02-03 21:28 174
struct ImGuiPopupData;              // Storage for current popup stack
1193b4be Poul Sander 2025-02-03 21:28 175
struct ImGuiSettingsHandler;        // Storage for one type registered in the .ini file
1193b4be Poul Sander 2025-02-03 21:28 176
struct ImGuiStyleMod;               // Stacked style modifier, backup of modified data so we can restore it
4e9e2555 Poul Sander 2025-10-05 10:15 177
struct ImGuiStyleVarInfo;           // Style variable information (e.g. to access style variables from an enum)
1193b4be Poul Sander 2025-02-03 21:28 178
struct ImGuiTabBar;                 // Storage for a tab bar
1193b4be Poul Sander 2025-02-03 21:28 179
struct ImGuiTabItem;                // Storage for a tab item (within a tab bar)
1193b4be Poul Sander 2025-02-03 21:28 180
struct ImGuiTable;                  // Storage for a table
1193b4be Poul Sander 2025-02-03 21:28 181
struct ImGuiTableHeaderData;        // Storage for TableAngledHeadersRow()
1193b4be Poul Sander 2025-02-03 21:28 182
struct ImGuiTableColumn;            // Storage for one column of a table
1193b4be Poul Sander 2025-02-03 21:28 183
struct ImGuiTableInstanceData;      // Storage for one instance of a same table
1193b4be Poul Sander 2025-02-03 21:28 184
struct ImGuiTableTempData;          // Temporary storage for one table (one per table in the stack), shared between tables.
1193b4be Poul Sander 2025-02-03 21:28 185
struct ImGuiTableSettings;          // Storage for a table .ini settings
1193b4be Poul Sander 2025-02-03 21:28 186
struct ImGuiTableColumnsSettings;   // Storage for a column .ini settings
1193b4be Poul Sander 2025-02-03 21:28 187
struct ImGuiTreeNodeStackData;      // Temporary storage for TreeNode().
1193b4be Poul Sander 2025-02-03 21:28 188
struct ImGuiTypingSelectState;      // Storage for GetTypingSelectRequest()
1193b4be Poul Sander 2025-02-03 21:28 189
struct ImGuiTypingSelectRequest;    // Storage for GetTypingSelectRequest() (aimed to be public)
1193b4be Poul Sander 2025-02-03 21:28 190
struct ImGuiWindow;                 // Storage for one window
1193b4be Poul Sander 2025-02-03 21:28 191
struct ImGuiWindowDockStyle;        // Storage for window-style data which needs to be stored for docking purpose
1193b4be Poul Sander 2025-02-03 21:28 192
struct ImGuiWindowTempData;         // Temporary storage for one window (that's the data which in theory we could ditch at the end of the frame, in practice we currently keep it for each window)
1193b4be Poul Sander 2025-02-03 21:28 193
struct ImGuiWindowSettings;         // Storage for a window .ini settings (we keep one of those even if the actual window wasn't instanced during this session)
1193b4be Poul Sander 2025-02-03 21:28 194
1193b4be Poul Sander 2025-02-03 21:28 195
// Enumerations
1193b4be Poul Sander 2025-02-03 21:28 196
// Use your programming IDE "Go to definition" facility on the names of the center columns to find the actual flags/enum lists.
1193b4be Poul Sander 2025-02-03 21:28 197
enum ImGuiLocKey : int;                 // -> enum ImGuiLocKey              // Enum: a localization entry for translation.
1193b4be Poul Sander 2025-02-03 21:28 198
typedef int ImGuiDataAuthority;         // -> enum ImGuiDataAuthority_      // Enum: for storing the source authority (dock node vs window) of a field
1193b4be Poul Sander 2025-02-03 21:28 199
typedef int ImGuiLayoutType;            // -> enum ImGuiLayoutType_         // Enum: Horizontal or vertical
1193b4be Poul Sander 2025-02-03 21:28 200
1193b4be Poul Sander 2025-02-03 21:28 201
// Flags
4e9e2555 Poul Sander 2025-10-05 10:15 202
typedef int ImDrawTextFlags;            // -> enum ImDrawTextFlags_         // Flags: for ImTextCalcWordWrapPositionEx()
1193b4be Poul Sander 2025-02-03 21:28 203
typedef int ImGuiActivateFlags;         // -> enum ImGuiActivateFlags_      // Flags: for navigation/focus function (will be for ActivateItem() later)
1193b4be Poul Sander 2025-02-03 21:28 204
typedef int ImGuiDebugLogFlags;         // -> enum ImGuiDebugLogFlags_      // Flags: for ShowDebugLogWindow(), g.DebugLogFlags
1193b4be Poul Sander 2025-02-03 21:28 205
typedef int ImGuiFocusRequestFlags;     // -> enum ImGuiFocusRequestFlags_  // Flags: for FocusWindow()
1193b4be Poul Sander 2025-02-03 21:28 206
typedef int ImGuiItemStatusFlags;       // -> enum ImGuiItemStatusFlags_    // Flags: for g.LastItemData.StatusFlags
1193b4be Poul Sander 2025-02-03 21:28 207
typedef int ImGuiOldColumnFlags;        // -> enum ImGuiOldColumnFlags_     // Flags: for BeginColumns()
4e9e2555 Poul Sander 2025-10-05 10:15 208
typedef int ImGuiLogFlags;              // -> enum ImGuiLogFlags_           // Flags: for LogBegin() text capturing function
1193b4be Poul Sander 2025-02-03 21:28 209
typedef int ImGuiNavRenderCursorFlags;  // -> enum ImGuiNavRenderCursorFlags_//Flags: for RenderNavCursor()
1193b4be Poul Sander 2025-02-03 21:28 210
typedef int ImGuiNavMoveFlags;          // -> enum ImGuiNavMoveFlags_       // Flags: for navigation requests
1193b4be Poul Sander 2025-02-03 21:28 211
typedef int ImGuiNextItemDataFlags;     // -> enum ImGuiNextItemDataFlags_  // Flags: for SetNextItemXXX() functions
1193b4be Poul Sander 2025-02-03 21:28 212
typedef int ImGuiNextWindowDataFlags;   // -> enum ImGuiNextWindowDataFlags_// Flags: for SetNextWindowXXX() functions
1193b4be Poul Sander 2025-02-03 21:28 213
typedef int ImGuiScrollFlags;           // -> enum ImGuiScrollFlags_        // Flags: for ScrollToItem() and navigation requests
1193b4be Poul Sander 2025-02-03 21:28 214
typedef int ImGuiSeparatorFlags;        // -> enum ImGuiSeparatorFlags_     // Flags: for SeparatorEx()
1193b4be Poul Sander 2025-02-03 21:28 215
typedef int ImGuiTextFlags;             // -> enum ImGuiTextFlags_          // Flags: for TextEx()
1193b4be Poul Sander 2025-02-03 21:28 216
typedef int ImGuiTooltipFlags;          // -> enum ImGuiTooltipFlags_       // Flags: for BeginTooltipEx()
1193b4be Poul Sander 2025-02-03 21:28 217
typedef int ImGuiTypingSelectFlags;     // -> enum ImGuiTypingSelectFlags_  // Flags: for GetTypingSelectRequest()
1193b4be Poul Sander 2025-02-03 21:28 218
typedef int ImGuiWindowRefreshFlags;    // -> enum ImGuiWindowRefreshFlags_ // Flags: for SetNextWindowRefreshPolicy()
1193b4be Poul Sander 2025-02-03 21:28 219
4e9e2555 Poul Sander 2025-10-05 10:15 220
// Table column indexing
4e9e2555 Poul Sander 2025-10-05 10:15 221
typedef ImS16 ImGuiTableColumnIdx;
4e9e2555 Poul Sander 2025-10-05 10:15 222
typedef ImU16 ImGuiTableDrawChannelIdx;
4e9e2555 Poul Sander 2025-10-05 10:15 223
1193b4be Poul Sander 2025-02-03 21:28 224
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 225
// [SECTION] Context pointer
1193b4be Poul Sander 2025-02-03 21:28 226
// See implementation of this variable in imgui.cpp for comments and details.
1193b4be Poul Sander 2025-02-03 21:28 227
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 228
1193b4be Poul Sander 2025-02-03 21:28 229
#ifndef GImGui
1193b4be Poul Sander 2025-02-03 21:28 230
extern IMGUI_API ImGuiContext* GImGui;  // Current implicit context pointer
1193b4be Poul Sander 2025-02-03 21:28 231
#endif
1193b4be Poul Sander 2025-02-03 21:28 232
1193b4be Poul Sander 2025-02-03 21:28 233
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 234
// [SECTION] Macros
1193b4be Poul Sander 2025-02-03 21:28 235
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 236
1193b4be Poul Sander 2025-02-03 21:28 237
// Internal Drag and Drop payload types. String starting with '_' are reserved for Dear ImGui.
1193b4be Poul Sander 2025-02-03 21:28 238
#define IMGUI_PAYLOAD_TYPE_WINDOW       "_IMWINDOW"     // Payload == ImGuiWindow*
1193b4be Poul Sander 2025-02-03 21:28 239
1193b4be Poul Sander 2025-02-03 21:28 240
// Debug Printing Into TTY
1193b4be Poul Sander 2025-02-03 21:28 241
// (since IMGUI_VERSION_NUM >= 18729: IMGUI_DEBUG_LOG was reworked into IMGUI_DEBUG_PRINTF (and removed framecount from it). If you were using a #define IMGUI_DEBUG_LOG please rename)
1193b4be Poul Sander 2025-02-03 21:28 242
#ifndef IMGUI_DEBUG_PRINTF
1193b4be Poul Sander 2025-02-03 21:28 243
#ifndef IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS
1193b4be Poul Sander 2025-02-03 21:28 244
#define IMGUI_DEBUG_PRINTF(_FMT,...)    printf(_FMT, __VA_ARGS__)
1193b4be Poul Sander 2025-02-03 21:28 245
#else
1193b4be Poul Sander 2025-02-03 21:28 246
#define IMGUI_DEBUG_PRINTF(_FMT,...)    ((void)0)
1193b4be Poul Sander 2025-02-03 21:28 247
#endif
1193b4be Poul Sander 2025-02-03 21:28 248
#endif
1193b4be Poul Sander 2025-02-03 21:28 249
1193b4be Poul Sander 2025-02-03 21:28 250
// Debug Logging for ShowDebugLogWindow(). This is designed for relatively rare events so please don't spam.
4e9e2555 Poul Sander 2025-10-05 10:15 251
#define IMGUI_DEBUG_LOG_ERROR(...)      do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventError)       IMGUI_DEBUG_LOG(__VA_ARGS__); else g.DebugLogSkippedErrors++; } while (0)
1193b4be Poul Sander 2025-02-03 21:28 252
#define IMGUI_DEBUG_LOG_ACTIVEID(...)   do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventActiveId)    IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
1193b4be Poul Sander 2025-02-03 21:28 253
#define IMGUI_DEBUG_LOG_FOCUS(...)      do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventFocus)       IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
1193b4be Poul Sander 2025-02-03 21:28 254
#define IMGUI_DEBUG_LOG_POPUP(...)      do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventPopup)       IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
1193b4be Poul Sander 2025-02-03 21:28 255
#define IMGUI_DEBUG_LOG_NAV(...)        do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventNav)         IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
1193b4be Poul Sander 2025-02-03 21:28 256
#define IMGUI_DEBUG_LOG_SELECTION(...)  do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventSelection)   IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
1193b4be Poul Sander 2025-02-03 21:28 257
#define IMGUI_DEBUG_LOG_CLIPPER(...)    do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventClipper)     IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
1193b4be Poul Sander 2025-02-03 21:28 258
#define IMGUI_DEBUG_LOG_IO(...)         do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventIO)          IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
4e9e2555 Poul Sander 2025-10-05 10:15 259
#define IMGUI_DEBUG_LOG_FONT(...)       do { ImGuiContext* g2 = GImGui; if (g2 && g2->DebugLogFlags & ImGuiDebugLogFlags_EventFont) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) // Called from ImFontAtlas function which may operate without a context.
1193b4be Poul Sander 2025-02-03 21:28 260
#define IMGUI_DEBUG_LOG_INPUTROUTING(...) do{if (g.DebugLogFlags & ImGuiDebugLogFlags_EventInputRouting)IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
1193b4be Poul Sander 2025-02-03 21:28 261
#define IMGUI_DEBUG_LOG_DOCKING(...)    do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventDocking)     IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
1193b4be Poul Sander 2025-02-03 21:28 262
#define IMGUI_DEBUG_LOG_VIEWPORT(...)   do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventViewport)    IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
1193b4be Poul Sander 2025-02-03 21:28 263
1193b4be Poul Sander 2025-02-03 21:28 264
// Static Asserts
1193b4be Poul Sander 2025-02-03 21:28 265
#define IM_STATIC_ASSERT(_COND)         static_assert(_COND, "")
1193b4be Poul Sander 2025-02-03 21:28 266
1193b4be Poul Sander 2025-02-03 21:28 267
// "Paranoid" Debug Asserts are meant to only be enabled during specific debugging/work, otherwise would slow down the code too much.
1193b4be Poul Sander 2025-02-03 21:28 268
// 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.
1193b4be Poul Sander 2025-02-03 21:28 269
//#define IMGUI_DEBUG_PARANOID
1193b4be Poul Sander 2025-02-03 21:28 270
#ifdef IMGUI_DEBUG_PARANOID
1193b4be Poul Sander 2025-02-03 21:28 271
#define IM_ASSERT_PARANOID(_EXPR)       IM_ASSERT(_EXPR)
1193b4be Poul Sander 2025-02-03 21:28 272
#else
1193b4be Poul Sander 2025-02-03 21:28 273
#define IM_ASSERT_PARANOID(_EXPR)
1193b4be Poul Sander 2025-02-03 21:28 274
#endif
1193b4be Poul Sander 2025-02-03 21:28 275
1193b4be Poul Sander 2025-02-03 21:28 276
// Misc Macros
1193b4be Poul Sander 2025-02-03 21:28 277
#define IM_PI                           3.14159265358979323846f
1193b4be Poul Sander 2025-02-03 21:28 278
#ifdef _WIN32
1193b4be Poul Sander 2025-02-03 21:28 279
#define IM_NEWLINE                      "\r\n"   // Play it nice with Windows users (Update: since 2018-05, Notepad finally appears to support Unix-style carriage returns!)
1193b4be Poul Sander 2025-02-03 21:28 280
#else
1193b4be Poul Sander 2025-02-03 21:28 281
#define IM_NEWLINE                      "\n"
1193b4be Poul Sander 2025-02-03 21:28 282
#endif
1193b4be Poul Sander 2025-02-03 21:28 283
#ifndef IM_TABSIZE                      // Until we move this to runtime and/or add proper tab support, at least allow users to compile-time override
1193b4be Poul Sander 2025-02-03 21:28 284
#define IM_TABSIZE                      (4)
1193b4be Poul Sander 2025-02-03 21:28 285
#endif
1193b4be Poul Sander 2025-02-03 21:28 286
#define IM_MEMALIGN(_OFF,_ALIGN)        (((_OFF) + ((_ALIGN) - 1)) & ~((_ALIGN) - 1))           // Memory align e.g. IM_ALIGN(0,4)=0, IM_ALIGN(1,4)=4, IM_ALIGN(4,4)=4, IM_ALIGN(5,4)=8
1193b4be Poul Sander 2025-02-03 21:28 287
#define IM_F32_TO_INT8_UNBOUND(_VAL)    ((int)((_VAL) * 255.0f + ((_VAL)>=0 ? 0.5f : -0.5f)))   // Unsaturated, for display purpose
1193b4be Poul Sander 2025-02-03 21:28 288
#define IM_F32_TO_INT8_SAT(_VAL)        ((int)(ImSaturate(_VAL) * 255.0f + 0.5f))               // Saturated, always output 0..255
1193b4be Poul Sander 2025-02-03 21:28 289
#define IM_TRUNC(_VAL)                  ((float)(int)(_VAL))                                    // ImTrunc() is not inlined in MSVC debug builds
1193b4be Poul Sander 2025-02-03 21:28 290
#define IM_ROUND(_VAL)                  ((float)(int)((_VAL) + 0.5f))                           //
1193b4be Poul Sander 2025-02-03 21:28 291
#define IM_STRINGIFY_HELPER(_X)         #_X
1193b4be Poul Sander 2025-02-03 21:28 292
#define IM_STRINGIFY(_X)                IM_STRINGIFY_HELPER(_X)                                 // Preprocessor idiom to stringify e.g. an integer.
1193b4be Poul Sander 2025-02-03 21:28 293
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
1193b4be Poul Sander 2025-02-03 21:28 294
#define IM_FLOOR IM_TRUNC
1193b4be Poul Sander 2025-02-03 21:28 295
#endif
1193b4be Poul Sander 2025-02-03 21:28 296
4e9e2555 Poul Sander 2025-10-05 10:15 297
// Hint for branch prediction
4e9e2555 Poul Sander 2025-10-05 10:15 298
#if (defined(__cplusplus) && (__cplusplus >= 202002L)) || (defined(_MSVC_LANG) && (_MSVC_LANG >= 202002L))
4e9e2555 Poul Sander 2025-10-05 10:15 299
#define IM_LIKELY   [[likely]]
4e9e2555 Poul Sander 2025-10-05 10:15 300
#define IM_UNLIKELY [[unlikely]]
4e9e2555 Poul Sander 2025-10-05 10:15 301
#else
4e9e2555 Poul Sander 2025-10-05 10:15 302
#define IM_LIKELY
4e9e2555 Poul Sander 2025-10-05 10:15 303
#define IM_UNLIKELY
4e9e2555 Poul Sander 2025-10-05 10:15 304
#endif
4e9e2555 Poul Sander 2025-10-05 10:15 305
1193b4be Poul Sander 2025-02-03 21:28 306
// Enforce cdecl calling convention for functions called by the standard library, in case compilation settings changed the default to e.g. __vectorcall
1193b4be Poul Sander 2025-02-03 21:28 307
#ifdef _MSC_VER
1193b4be Poul Sander 2025-02-03 21:28 308
#define IMGUI_CDECL __cdecl
1193b4be Poul Sander 2025-02-03 21:28 309
#else
1193b4be Poul Sander 2025-02-03 21:28 310
#define IMGUI_CDECL
1193b4be Poul Sander 2025-02-03 21:28 311
#endif
1193b4be Poul Sander 2025-02-03 21:28 312
1193b4be Poul Sander 2025-02-03 21:28 313
// Warnings
1193b4be Poul Sander 2025-02-03 21:28 314
#if defined(_MSC_VER) && !defined(__clang__)
1193b4be Poul Sander 2025-02-03 21:28 315
#define IM_MSVC_WARNING_SUPPRESS(XXXX)  __pragma(warning(suppress: XXXX))
1193b4be Poul Sander 2025-02-03 21:28 316
#else
1193b4be Poul Sander 2025-02-03 21:28 317
#define IM_MSVC_WARNING_SUPPRESS(XXXX)
1193b4be Poul Sander 2025-02-03 21:28 318
#endif
1193b4be Poul Sander 2025-02-03 21:28 319
1193b4be Poul Sander 2025-02-03 21:28 320
// Debug Tools
1193b4be Poul Sander 2025-02-03 21:28 321
// Use 'Metrics/Debugger->Tools->Item Picker' to break into the call-stack of a specific item.
1193b4be Poul Sander 2025-02-03 21:28 322
// This will call IM_DEBUG_BREAK() which you may redefine yourself. See https://github.com/scottt/debugbreak for more reference.
1193b4be Poul Sander 2025-02-03 21:28 323
#ifndef IM_DEBUG_BREAK
1193b4be Poul Sander 2025-02-03 21:28 324
#if defined (_MSC_VER)
1193b4be Poul Sander 2025-02-03 21:28 325
#define IM_DEBUG_BREAK()    __debugbreak()
1193b4be Poul Sander 2025-02-03 21:28 326
#elif defined(__clang__)
1193b4be Poul Sander 2025-02-03 21:28 327
#define IM_DEBUG_BREAK()    __builtin_debugtrap()
1193b4be Poul Sander 2025-02-03 21:28 328
#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
1193b4be Poul Sander 2025-02-03 21:28 329
#define IM_DEBUG_BREAK()    __asm__ volatile("int3;nop")
1193b4be Poul Sander 2025-02-03 21:28 330
#elif defined(__GNUC__) && defined(__thumb__)
1193b4be Poul Sander 2025-02-03 21:28 331
#define IM_DEBUG_BREAK()    __asm__ volatile(".inst 0xde01")
1193b4be Poul Sander 2025-02-03 21:28 332
#elif defined(__GNUC__) && defined(__arm__) && !defined(__thumb__)
1193b4be Poul Sander 2025-02-03 21:28 333
#define IM_DEBUG_BREAK()    __asm__ volatile(".inst 0xe7f001f0")
1193b4be Poul Sander 2025-02-03 21:28 334
#else
1193b4be Poul Sander 2025-02-03 21:28 335
#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!
1193b4be Poul Sander 2025-02-03 21:28 336
#endif
1193b4be Poul Sander 2025-02-03 21:28 337
#endif // #ifndef IM_DEBUG_BREAK
1193b4be Poul Sander 2025-02-03 21:28 338
1193b4be Poul Sander 2025-02-03 21:28 339
// Format specifiers, printing 64-bit hasn't been decently standardized...
1193b4be Poul Sander 2025-02-03 21:28 340
// In a real application you should be using PRId64 and PRIu64 from <inttypes.h> (non-windows) and on Windows define them yourself.
1193b4be Poul Sander 2025-02-03 21:28 341
#if defined(_MSC_VER) && !defined(__clang__)
1193b4be Poul Sander 2025-02-03 21:28 342
#define IM_PRId64   "I64d"
1193b4be Poul Sander 2025-02-03 21:28 343
#define IM_PRIu64   "I64u"
1193b4be Poul Sander 2025-02-03 21:28 344
#define IM_PRIX64   "I64X"
1193b4be Poul Sander 2025-02-03 21:28 345
#else
1193b4be Poul Sander 2025-02-03 21:28 346
#define IM_PRId64   "lld"
1193b4be Poul Sander 2025-02-03 21:28 347
#define IM_PRIu64   "llu"
1193b4be Poul Sander 2025-02-03 21:28 348
#define IM_PRIX64   "llX"
1193b4be Poul Sander 2025-02-03 21:28 349
#endif
4e9e2555 Poul Sander 2025-10-05 10:15 350
#define IM_TEXTUREID_TO_U64(_TEXID) ((ImU64)(intptr_t)(_TEXID))
1193b4be Poul Sander 2025-02-03 21:28 351
1193b4be Poul Sander 2025-02-03 21:28 352
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 353
// [SECTION] Generic helpers
1193b4be Poul Sander 2025-02-03 21:28 354
// Note that the ImXXX helpers functions are lower-level than ImGui functions.
1193b4be Poul Sander 2025-02-03 21:28 355
// ImGui functions or the ImGui context are never called/used from other ImXXX functions.
1193b4be Poul Sander 2025-02-03 21:28 356
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 357
// - Helpers: Hashing
1193b4be Poul Sander 2025-02-03 21:28 358
// - Helpers: Sorting
1193b4be Poul Sander 2025-02-03 21:28 359
// - Helpers: Bit manipulation
1193b4be Poul Sander 2025-02-03 21:28 360
// - Helpers: String
1193b4be Poul Sander 2025-02-03 21:28 361
// - Helpers: Formatting
1193b4be Poul Sander 2025-02-03 21:28 362
// - Helpers: UTF-8 <> wchar conversions
1193b4be Poul Sander 2025-02-03 21:28 363
// - Helpers: ImVec2/ImVec4 operators
1193b4be Poul Sander 2025-02-03 21:28 364
// - Helpers: Maths
1193b4be Poul Sander 2025-02-03 21:28 365
// - Helpers: Geometry
1193b4be Poul Sander 2025-02-03 21:28 366
// - Helper: ImVec1
1193b4be Poul Sander 2025-02-03 21:28 367
// - Helper: ImVec2ih
1193b4be Poul Sander 2025-02-03 21:28 368
// - Helper: ImRect
1193b4be Poul Sander 2025-02-03 21:28 369
// - Helper: ImBitArray
1193b4be Poul Sander 2025-02-03 21:28 370
// - Helper: ImBitVector
1193b4be Poul Sander 2025-02-03 21:28 371
// - Helper: ImSpan<>, ImSpanAllocator<>
4e9e2555 Poul Sander 2025-10-05 10:15 372
// - Helper: ImStableVector<>
1193b4be Poul Sander 2025-02-03 21:28 373
// - Helper: ImPool<>
1193b4be Poul Sander 2025-02-03 21:28 374
// - Helper: ImChunkStream<>
1193b4be Poul Sander 2025-02-03 21:28 375
// - Helper: ImGuiTextIndex
1193b4be Poul Sander 2025-02-03 21:28 376
// - Helper: ImGuiStorage
1193b4be Poul Sander 2025-02-03 21:28 377
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 378
1193b4be Poul Sander 2025-02-03 21:28 379
// Helpers: Hashing
1193b4be Poul Sander 2025-02-03 21:28 380
IMGUI_API ImGuiID       ImHashData(const void* data, size_t data_size, ImGuiID seed = 0);
1193b4be Poul Sander 2025-02-03 21:28 381
IMGUI_API ImGuiID       ImHashStr(const char* data, size_t data_size = 0, ImGuiID seed = 0);
4e9e2555 Poul Sander 2025-10-05 10:15 382
IMGUI_API const char*   ImHashSkipUncontributingPrefix(const char* label);
1193b4be Poul Sander 2025-02-03 21:28 383
1193b4be Poul Sander 2025-02-03 21:28 384
// Helpers: Sorting
1193b4be Poul Sander 2025-02-03 21:28 385
#ifndef ImQsort
4e9e2555 Poul Sander 2025-10-05 10:15 386
inline void             ImQsort(void* base, size_t count, size_t size_of_element, int(IMGUI_CDECL *compare_func)(void const*, void const*)) { if (count > 1) qsort(base, count, size_of_element, compare_func); }
1193b4be Poul Sander 2025-02-03 21:28 387
#endif
1193b4be Poul Sander 2025-02-03 21:28 388
1193b4be Poul Sander 2025-02-03 21:28 389
// Helpers: Color Blending
1193b4be Poul Sander 2025-02-03 21:28 390
IMGUI_API ImU32         ImAlphaBlendColors(ImU32 col_a, ImU32 col_b);
1193b4be Poul Sander 2025-02-03 21:28 391
1193b4be Poul Sander 2025-02-03 21:28 392
// Helpers: Bit manipulation
4e9e2555 Poul Sander 2025-10-05 10:15 393
inline bool             ImIsPowerOfTwo(int v)               { return v != 0 && (v & (v - 1)) == 0; }
4e9e2555 Poul Sander 2025-10-05 10:15 394
inline bool             ImIsPowerOfTwo(ImU64 v)             { return v != 0 && (v & (v - 1)) == 0; }
4e9e2555 Poul Sander 2025-10-05 10:15 395
inline int              ImUpperPowerOfTwo(int v)            { v--; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v++; return v; }
4e9e2555 Poul Sander 2025-10-05 10:15 396
inline unsigned int     ImCountSetBits(unsigned int v)      { unsigned int count = 0; while (v > 0) { v = v & (v - 1); count++; } return count; }
1193b4be Poul Sander 2025-02-03 21:28 397
1193b4be Poul Sander 2025-02-03 21:28 398
// Helpers: String
4e9e2555 Poul Sander 2025-10-05 10:15 399
#define ImStrlen strlen
4e9e2555 Poul Sander 2025-10-05 10:15 400
#define ImMemchr memchr
1193b4be Poul Sander 2025-02-03 21:28 401
IMGUI_API int           ImStricmp(const char* str1, const char* str2);                      // Case insensitive compare.
1193b4be Poul Sander 2025-02-03 21:28 402
IMGUI_API int           ImStrnicmp(const char* str1, const char* str2, size_t count);       // Case insensitive compare to a certain count.
1193b4be Poul Sander 2025-02-03 21:28 403
IMGUI_API void          ImStrncpy(char* dst, const char* src, size_t count);                // Copy to a certain count and always zero terminate (strncpy doesn't).
1193b4be Poul Sander 2025-02-03 21:28 404
IMGUI_API char*         ImStrdup(const char* str);                                          // Duplicate a string.
4e9e2555 Poul Sander 2025-10-05 10:15 405
IMGUI_API void*         ImMemdup(const void* src, size_t size);                             // Duplicate a chunk of memory.
1193b4be Poul Sander 2025-02-03 21:28 406
IMGUI_API char*         ImStrdupcpy(char* dst, size_t* p_dst_size, const char* str);        // Copy in provided buffer, recreate buffer if needed.
1193b4be Poul Sander 2025-02-03 21:28 407
IMGUI_API const char*   ImStrchrRange(const char* str_begin, const char* str_end, char c);  // Find first occurrence of 'c' in string range.
1193b4be Poul Sander 2025-02-03 21:28 408
IMGUI_API const char*   ImStreolRange(const char* str, const char* str_end);                // End end-of-line
1193b4be Poul Sander 2025-02-03 21:28 409
IMGUI_API const char*   ImStristr(const char* haystack, const char* haystack_end, const char* needle, const char* needle_end);  // Find a substring in a string range.
1193b4be Poul Sander 2025-02-03 21:28 410
IMGUI_API void          ImStrTrimBlanks(char* str);                                         // Remove leading and trailing blanks from a buffer.
1193b4be Poul Sander 2025-02-03 21:28 411
IMGUI_API const char*   ImStrSkipBlank(const char* str);                                    // Find first non-blank character.
1193b4be Poul Sander 2025-02-03 21:28 412
IMGUI_API int           ImStrlenW(const ImWchar* str);                                      // Computer string length (ImWchar string)
1193b4be Poul Sander 2025-02-03 21:28 413
IMGUI_API const char*   ImStrbol(const char* buf_mid_line, const char* buf_begin);          // Find beginning-of-line
1193b4be Poul Sander 2025-02-03 21:28 414
IM_MSVC_RUNTIME_CHECKS_OFF
4e9e2555 Poul Sander 2025-10-05 10:15 415
inline char             ImToUpper(char c)               { return (c >= 'a' && c <= 'z') ? c &= ~32 : c; }
4e9e2555 Poul Sander 2025-10-05 10:15 416
inline bool             ImCharIsBlankA(char c)          { return c == ' ' || c == '\t'; }
4e9e2555 Poul Sander 2025-10-05 10:15 417
inline bool             ImCharIsBlankW(unsigned int c)  { return c == ' ' || c == '\t' || c == 0x3000; }
4e9e2555 Poul Sander 2025-10-05 10:15 418
inline bool             ImCharIsXdigitA(char c)         { return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f'); }
1193b4be Poul Sander 2025-02-03 21:28 419
IM_MSVC_RUNTIME_CHECKS_RESTORE
1193b4be Poul Sander 2025-02-03 21:28 420
1193b4be Poul Sander 2025-02-03 21:28 421
// Helpers: Formatting
1193b4be Poul Sander 2025-02-03 21:28 422
IMGUI_API int           ImFormatString(char* buf, size_t buf_size, const char* fmt, ...) IM_FMTARGS(3);
1193b4be Poul Sander 2025-02-03 21:28 423
IMGUI_API int           ImFormatStringV(char* buf, size_t buf_size, const char* fmt, va_list args) IM_FMTLIST(3);
1193b4be Poul Sander 2025-02-03 21:28 424
IMGUI_API void          ImFormatStringToTempBuffer(const char** out_buf, const char** out_buf_end, const char* fmt, ...) IM_FMTARGS(3);
1193b4be Poul Sander 2025-02-03 21:28 425
IMGUI_API void          ImFormatStringToTempBufferV(const char** out_buf, const char** out_buf_end, const char* fmt, va_list args) IM_FMTLIST(3);
1193b4be Poul Sander 2025-02-03 21:28 426
IMGUI_API const char*   ImParseFormatFindStart(const char* format);
1193b4be Poul Sander 2025-02-03 21:28 427
IMGUI_API const char*   ImParseFormatFindEnd(const char* format);
1193b4be Poul Sander 2025-02-03 21:28 428
IMGUI_API const char*   ImParseFormatTrimDecorations(const char* format, char* buf, size_t buf_size);
1193b4be Poul Sander 2025-02-03 21:28 429
IMGUI_API void          ImParseFormatSanitizeForPrinting(const char* fmt_in, char* fmt_out, size_t fmt_out_size);
1193b4be Poul Sander 2025-02-03 21:28 430
IMGUI_API const char*   ImParseFormatSanitizeForScanning(const char* fmt_in, char* fmt_out, size_t fmt_out_size);
1193b4be Poul Sander 2025-02-03 21:28 431
IMGUI_API int           ImParseFormatPrecision(const char* format, int default_value);
1193b4be Poul Sander 2025-02-03 21:28 432
1193b4be Poul Sander 2025-02-03 21:28 433
// Helpers: UTF-8 <> wchar conversions
4e9e2555 Poul Sander 2025-10-05 10:15 434
IMGUI_API int           ImTextCharToUtf8(char out_buf[5], unsigned int c);                                                      // return output UTF-8 bytes count
1193b4be Poul Sander 2025-02-03 21:28 435
IMGUI_API int           ImTextStrToUtf8(char* out_buf, int out_buf_size, const ImWchar* in_text, const ImWchar* in_text_end);   // return output UTF-8 bytes count
1193b4be Poul Sander 2025-02-03 21:28 436
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
1193b4be Poul Sander 2025-02-03 21:28 437
IMGUI_API int           ImTextStrFromUtf8(ImWchar* out_buf, int out_buf_size, const char* in_text, const char* in_text_end, const char** in_remaining = NULL);   // return input UTF-8 bytes count
1193b4be Poul Sander 2025-02-03 21:28 438
IMGUI_API int           ImTextCountCharsFromUtf8(const char* in_text, const char* in_text_end);                                 // return number of UTF-8 code-points (NOT bytes count)
1193b4be Poul Sander 2025-02-03 21:28 439
IMGUI_API int           ImTextCountUtf8BytesFromChar(const char* in_text, const char* in_text_end);                             // return number of bytes to express one char in UTF-8
1193b4be Poul Sander 2025-02-03 21:28 440
IMGUI_API int           ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_end);                        // return number of bytes to express string in UTF-8
1193b4be Poul Sander 2025-02-03 21:28 441
IMGUI_API const char*   ImTextFindPreviousUtf8Codepoint(const char* in_text_start, const char* in_text_curr);                   // return previous UTF-8 code-point.
1193b4be Poul Sander 2025-02-03 21:28 442
IMGUI_API int           ImTextCountLines(const char* in_text, const char* in_text_end);                                         // return number of lines taken by text. trailing carriage return doesn't count as an extra line.
1193b4be Poul Sander 2025-02-03 21:28 443
4e9e2555 Poul Sander 2025-10-05 10:15 444
// Helpers: High-level text functions (DO NOT USE!!! THIS IS A MINIMAL SUBSET OF LARGER UPCOMING CHANGES)
4e9e2555 Poul Sander 2025-10-05 10:15 445
enum ImDrawTextFlags_
4e9e2555 Poul Sander 2025-10-05 10:15 446
{
4e9e2555 Poul Sander 2025-10-05 10:15 447
    ImDrawTextFlags_None                = 0,
4e9e2555 Poul Sander 2025-10-05 10:15 448
    ImDrawTextFlags_CpuFineClip         = 1 << 0,    // Must be == 1/true for legacy with 'bool cpu_fine_clip' arg to RenderText()
4e9e2555 Poul Sander 2025-10-05 10:15 449
    ImDrawTextFlags_WrapKeepBlanks      = 1 << 1,
4e9e2555 Poul Sander 2025-10-05 10:15 450
    ImDrawTextFlags_StopOnNewLine       = 1 << 2,
4e9e2555 Poul Sander 2025-10-05 10:15 451
};
4e9e2555 Poul Sander 2025-10-05 10:15 452
IMGUI_API ImVec2        ImFontCalcTextSizeEx(ImFont* font, float size, float max_width, float wrap_width, const char* text_begin, const char* text_end_display, const char* text_end, const char** out_remaining, ImVec2* out_offset, ImDrawTextFlags flags);
4e9e2555 Poul Sander 2025-10-05 10:15 453
IMGUI_API const char*   ImFontCalcWordWrapPositionEx(ImFont* font, float size, const char* text, const char* text_end, float wrap_width, ImDrawTextFlags flags = 0);
4e9e2555 Poul Sander 2025-10-05 10:15 454
IMGUI_API const char*   ImTextCalcWordWrapNextLineStart(const char* text, const char* text_end, ImDrawTextFlags flags = 0); // trim trailing space and find beginning of next line
4e9e2555 Poul Sander 2025-10-05 10:15 455
1193b4be Poul Sander 2025-02-03 21:28 456
// Helpers: File System
1193b4be Poul Sander 2025-02-03 21:28 457
#ifdef IMGUI_DISABLE_FILE_FUNCTIONS
1193b4be Poul Sander 2025-02-03 21:28 458
#define IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS
1193b4be Poul Sander 2025-02-03 21:28 459
typedef void* ImFileHandle;
4e9e2555 Poul Sander 2025-10-05 10:15 460
inline ImFileHandle         ImFileOpen(const char*, const char*)                    { return NULL; }
4e9e2555 Poul Sander 2025-10-05 10:15 461
inline bool                 ImFileClose(ImFileHandle)                               { return false; }
4e9e2555 Poul Sander 2025-10-05 10:15 462
inline ImU64                ImFileGetSize(ImFileHandle)                             { return (ImU64)-1; }
4e9e2555 Poul Sander 2025-10-05 10:15 463
inline ImU64                ImFileRead(void*, ImU64, ImU64, ImFileHandle)           { return 0; }
4e9e2555 Poul Sander 2025-10-05 10:15 464
inline ImU64                ImFileWrite(const void*, ImU64, ImU64, ImFileHandle)    { return 0; }
1193b4be Poul Sander 2025-02-03 21:28 465
#endif
1193b4be Poul Sander 2025-02-03 21:28 466
#ifndef IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS
1193b4be Poul Sander 2025-02-03 21:28 467
typedef FILE* ImFileHandle;
1193b4be Poul Sander 2025-02-03 21:28 468
IMGUI_API ImFileHandle      ImFileOpen(const char* filename, const char* mode);
1193b4be Poul Sander 2025-02-03 21:28 469
IMGUI_API bool              ImFileClose(ImFileHandle file);
1193b4be Poul Sander 2025-02-03 21:28 470
IMGUI_API ImU64             ImFileGetSize(ImFileHandle file);
1193b4be Poul Sander 2025-02-03 21:28 471
IMGUI_API ImU64             ImFileRead(void* data, ImU64 size, ImU64 count, ImFileHandle file);
1193b4be Poul Sander 2025-02-03 21:28 472
IMGUI_API ImU64             ImFileWrite(const void* data, ImU64 size, ImU64 count, ImFileHandle file);
1193b4be Poul Sander 2025-02-03 21:28 473
#else
1193b4be Poul Sander 2025-02-03 21:28 474
#define IMGUI_DISABLE_TTY_FUNCTIONS // Can't use stdout, fflush if we are not using default file functions
1193b4be Poul Sander 2025-02-03 21:28 475
#endif
1193b4be Poul Sander 2025-02-03 21:28 476
IMGUI_API void*             ImFileLoadToMemory(const char* filename, const char* mode, size_t* out_file_size = NULL, int padding_bytes = 0);
1193b4be Poul Sander 2025-02-03 21:28 477
1193b4be Poul Sander 2025-02-03 21:28 478
// Helpers: Maths
1193b4be Poul Sander 2025-02-03 21:28 479
IM_MSVC_RUNTIME_CHECKS_OFF
1193b4be Poul Sander 2025-02-03 21:28 480
// - Wrapper for standard libs functions. (Note that imgui_demo.cpp does _not_ use them to keep the code easy to copy)
1193b4be Poul Sander 2025-02-03 21:28 481
#ifndef IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS
1193b4be Poul Sander 2025-02-03 21:28 482
#define ImFabs(X)           fabsf(X)
1193b4be Poul Sander 2025-02-03 21:28 483
#define ImSqrt(X)           sqrtf(X)
1193b4be Poul Sander 2025-02-03 21:28 484
#define ImFmod(X, Y)        fmodf((X), (Y))
1193b4be Poul Sander 2025-02-03 21:28 485
#define ImCos(X)            cosf(X)
1193b4be Poul Sander 2025-02-03 21:28 486
#define ImSin(X)            sinf(X)
1193b4be Poul Sander 2025-02-03 21:28 487
#define ImAcos(X)           acosf(X)
1193b4be Poul Sander 2025-02-03 21:28 488
#define ImAtan2(Y, X)       atan2f((Y), (X))
1193b4be Poul Sander 2025-02-03 21:28 489
#define ImAtof(STR)         atof(STR)
1193b4be Poul Sander 2025-02-03 21:28 490
#define ImCeil(X)           ceilf(X)
4e9e2555 Poul Sander 2025-10-05 10:15 491
inline float  ImPow(float x, float y)    { return powf(x, y); }          // DragBehaviorT/SliderBehaviorT uses ImPow with either float/double and need the precision
4e9e2555 Poul Sander 2025-10-05 10:15 492
inline double ImPow(double x, double y)  { return pow(x, y); }
4e9e2555 Poul Sander 2025-10-05 10:15 493
inline float  ImLog(float x)             { return logf(x); }             // DragBehaviorT/SliderBehaviorT uses ImLog with either float/double and need the precision
4e9e2555 Poul Sander 2025-10-05 10:15 494
inline double ImLog(double x)            { return log(x); }
4e9e2555 Poul Sander 2025-10-05 10:15 495
inline int    ImAbs(int x)               { return x < 0 ? -x : x; }
4e9e2555 Poul Sander 2025-10-05 10:15 496
inline float  ImAbs(float x)             { return fabsf(x); }
4e9e2555 Poul Sander 2025-10-05 10:15 497
inline double ImAbs(double x)            { return fabs(x); }
4e9e2555 Poul Sander 2025-10-05 10:15 498
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
4e9e2555 Poul Sander 2025-10-05 10:15 499
inline double ImSign(double x)           { return (x < 0.0) ? -1.0 : (x > 0.0) ? 1.0 : 0.0; }
1193b4be Poul Sander 2025-02-03 21:28 500
#ifdef IMGUI_ENABLE_SSE
4e9e2555 Poul Sander 2025-10-05 10:15 501
inline float  ImRsqrt(float x)           { return _mm_cvtss_f32(_mm_rsqrt_ss(_mm_set_ss(x))); }
1193b4be Poul Sander 2025-02-03 21:28 502
#else
4e9e2555 Poul Sander 2025-10-05 10:15 503
inline float  ImRsqrt(float x)           { return 1.0f / sqrtf(x); }
1193b4be Poul Sander 2025-02-03 21:28 504
#endif
4e9e2555 Poul Sander 2025-10-05 10:15 505
inline double ImRsqrt(double x)          { return 1.0 / sqrt(x); }
1193b4be Poul Sander 2025-02-03 21:28 506
#endif
1193b4be Poul Sander 2025-02-03 21:28 507
// - ImMin/ImMax/ImClamp/ImLerp/ImSwap are used by widgets which support variety of types: signed/unsigned int/long long float/double
1193b4be Poul Sander 2025-02-03 21:28 508
// (Exceptionally using templates here but we could also redefine them for those types)
4e9e2555 Poul Sander 2025-10-05 10:15 509
template<typename T> T ImMin(T lhs, T rhs)                              { return lhs < rhs ? lhs : rhs; }
4e9e2555 Poul Sander 2025-10-05 10:15 510
template<typename T> T ImMax(T lhs, T rhs)                              { return lhs >= rhs ? lhs : rhs; }
4e9e2555 Poul Sander 2025-10-05 10:15 511
template<typename T> T ImClamp(T v, T mn, T mx)                         { return (v < mn) ? mn : (v > mx) ? mx : v; }
4e9e2555 Poul Sander 2025-10-05 10:15 512
template<typename T> T ImLerp(T a, T b, float t)                        { return (T)(a + (b - a) * t); }
4e9e2555 Poul Sander 2025-10-05 10:15 513
template<typename T> void ImSwap(T& a, T& b)                            { T tmp = a; a = b; b = tmp; }
4e9e2555 Poul Sander 2025-10-05 10:15 514
template<typename T> 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; }
4e9e2555 Poul Sander 2025-10-05 10:15 515
template<typename T> 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; }
1193b4be Poul Sander 2025-02-03 21:28 516
// - Misc maths helpers
4e9e2555 Poul Sander 2025-10-05 10:15 517
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); }
4e9e2555 Poul Sander 2025-10-05 10:15 518
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); }
4e9e2555 Poul Sander 2025-10-05 10:15 519
inline ImVec2 ImClamp(const ImVec2& v, const ImVec2&mn, const ImVec2&mx){ return ImVec2((v.x < mn.x) ? mn.x : (v.x > mx.x) ? mx.x : v.x, (v.y < mn.y) ? mn.y : (v.y > mx.y) ? mx.y : v.y); }
4e9e2555 Poul Sander 2025-10-05 10:15 520
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); }
4e9e2555 Poul Sander 2025-10-05 10:15 521
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); }
4e9e2555 Poul Sander 2025-10-05 10:15 522
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); }
4e9e2555 Poul Sander 2025-10-05 10:15 523
inline float  ImSaturate(float f)                                       { return (f < 0.0f) ? 0.0f : (f > 1.0f) ? 1.0f : f; }
4e9e2555 Poul Sander 2025-10-05 10:15 524
inline float  ImLengthSqr(const ImVec2& lhs)                            { return (lhs.x * lhs.x) + (lhs.y * lhs.y); }
4e9e2555 Poul Sander 2025-10-05 10:15 525
inline float  ImLengthSqr(const ImVec4& lhs)                            { return (lhs.x * lhs.x) + (lhs.y * lhs.y) + (lhs.z * lhs.z) + (lhs.w * lhs.w); }
4e9e2555 Poul Sander 2025-10-05 10:15 526
inline float  ImInvLength(const ImVec2& lhs, float fail_value)          { float d = (lhs.x * lhs.x) + (lhs.y * lhs.y); if (d > 0.0f) return ImRsqrt(d); return fail_value; }
4e9e2555 Poul Sander 2025-10-05 10:15 527
inline float  ImTrunc(float f)                                          { return (float)(int)(f); }
4e9e2555 Poul Sander 2025-10-05 10:15 528
inline ImVec2 ImTrunc(const ImVec2& v)                                  { return ImVec2((float)(int)(v.x), (float)(int)(v.y)); }
4e9e2555 Poul Sander 2025-10-05 10:15 529
inline float  ImFloor(float f)                                          { return (float)((f >= 0 || (float)(int)f == f) ? (int)f : (int)f - 1); } // Decent replacement for floorf()
4e9e2555 Poul Sander 2025-10-05 10:15 530
inline ImVec2 ImFloor(const ImVec2& v)                                  { return ImVec2(ImFloor(v.x), ImFloor(v.y)); }
4e9e2555 Poul Sander 2025-10-05 10:15 531
inline float  ImTrunc64(float f)                                        { return (float)(ImS64)(f); }
4e9e2555 Poul Sander 2025-10-05 10:15 532
inline float  ImRound64(float f)                                        { return (float)(ImS64)(f + 0.5f); }
4e9e2555 Poul Sander 2025-10-05 10:15 533
inline int    ImModPositive(int a, int b)                               { return (a + b) % b; }
4e9e2555 Poul Sander 2025-10-05 10:15 534
inline float  ImDot(const ImVec2& a, const ImVec2& b)                   { return a.x * b.x + a.y * b.y; }
4e9e2555 Poul Sander 2025-10-05 10:15 535
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); }
4e9e2555 Poul Sander 2025-10-05 10:15 536
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; }
4e9e2555 Poul Sander 2025-10-05 10:15 537
inline float  ImLinearRemapClamp(float s0, float s1, float d0, float d1, float x) { return ImSaturate((x - s0) / (s1 - s0)) * (d1 - d0) + d0; }
4e9e2555 Poul Sander 2025-10-05 10:15 538
inline ImVec2 ImMul(const ImVec2& lhs, const ImVec2& rhs)               { return ImVec2(lhs.x * rhs.x, lhs.y * rhs.y); }
4e9e2555 Poul Sander 2025-10-05 10:15 539
inline bool   ImIsFloatAboveGuaranteedIntegerPrecision(float f)         { return f <= -16777216 || f >= 16777216; }
4e9e2555 Poul Sander 2025-10-05 10:15 540
inline float  ImExponentialMovingAverage(float avg, float sample, int n){ avg -= avg / n; avg += sample / n; return avg; }
1193b4be Poul Sander 2025-02-03 21:28 541
IM_MSVC_RUNTIME_CHECKS_RESTORE
1193b4be Poul Sander 2025-02-03 21:28 542
1193b4be Poul Sander 2025-02-03 21:28 543
// Helpers: Geometry
1193b4be Poul Sander 2025-02-03 21:28 544
IMGUI_API ImVec2     ImBezierCubicCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, float t);
1193b4be Poul Sander 2025-02-03 21:28 545
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
1193b4be Poul Sander 2025-02-03 21:28 546
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
1193b4be Poul Sander 2025-02-03 21:28 547
IMGUI_API ImVec2     ImBezierQuadraticCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, float t);
1193b4be Poul Sander 2025-02-03 21:28 548
IMGUI_API ImVec2     ImLineClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& p);
1193b4be Poul Sander 2025-02-03 21:28 549
IMGUI_API bool       ImTriangleContainsPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);
1193b4be Poul Sander 2025-02-03 21:28 550
IMGUI_API ImVec2     ImTriangleClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);
1193b4be Poul Sander 2025-02-03 21:28 551
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);
1193b4be Poul Sander 2025-02-03 21:28 552
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; }
1193b4be Poul Sander 2025-02-03 21:28 553
inline bool          ImTriangleIsClockwise(const ImVec2& a, const ImVec2& b, const ImVec2& c)   { return ((b.x - a.x) * (c.y - b.y)) - ((c.x - b.x) * (b.y - a.y)) > 0.0f; }
1193b4be Poul Sander 2025-02-03 21:28 554
1193b4be Poul Sander 2025-02-03 21:28 555
// Helper: ImVec1 (1D vector)
1193b4be Poul Sander 2025-02-03 21:28 556
// (this odd construct is used to facilitate the transition between 1D and 2D, and the maintenance of some branches/patches)
1193b4be Poul Sander 2025-02-03 21:28 557
IM_MSVC_RUNTIME_CHECKS_OFF
1193b4be Poul Sander 2025-02-03 21:28 558
struct ImVec1
1193b4be Poul Sander 2025-02-03 21:28 559
{
1193b4be Poul Sander 2025-02-03 21:28 560
    float   x;
1193b4be Poul Sander 2025-02-03 21:28 561
    constexpr ImVec1()         : x(0.0f) { }
1193b4be Poul Sander 2025-02-03 21:28 562
    constexpr ImVec1(float _x) : x(_x) { }
1193b4be Poul Sander 2025-02-03 21:28 563
};
1193b4be Poul Sander 2025-02-03 21:28 564
4e9e2555 Poul Sander 2025-10-05 10:15 565
// Helper: ImVec2i (2D vector, integer)
4e9e2555 Poul Sander 2025-10-05 10:15 566
struct ImVec2i
4e9e2555 Poul Sander 2025-10-05 10:15 567
{
4e9e2555 Poul Sander 2025-10-05 10:15 568
    int         x, y;
4e9e2555 Poul Sander 2025-10-05 10:15 569
    constexpr ImVec2i()                             : x(0), y(0) {}
4e9e2555 Poul Sander 2025-10-05 10:15 570
    constexpr ImVec2i(int _x, int _y)               : x(_x), y(_y) {}
4e9e2555 Poul Sander 2025-10-05 10:15 571
};
4e9e2555 Poul Sander 2025-10-05 10:15 572
1193b4be Poul Sander 2025-02-03 21:28 573
// Helper: ImVec2ih (2D vector, half-size integer, for long-term packed storage)
1193b4be Poul Sander 2025-02-03 21:28 574
struct ImVec2ih
1193b4be Poul Sander 2025-02-03 21:28 575
{
1193b4be Poul Sander 2025-02-03 21:28 576
    short   x, y;
1193b4be Poul Sander 2025-02-03 21:28 577
    constexpr ImVec2ih()                           : x(0), y(0) {}
1193b4be Poul Sander 2025-02-03 21:28 578
    constexpr ImVec2ih(short _x, short _y)         : x(_x), y(_y) {}
1193b4be Poul Sander 2025-02-03 21:28 579
    constexpr explicit ImVec2ih(const ImVec2& rhs) : x((short)rhs.x), y((short)rhs.y) {}
1193b4be Poul Sander 2025-02-03 21:28 580
};
1193b4be Poul Sander 2025-02-03 21:28 581
1193b4be Poul Sander 2025-02-03 21:28 582
// Helper: ImRect (2D axis aligned bounding-box)
1193b4be Poul Sander 2025-02-03 21:28 583
// NB: we can't rely on ImVec2 math operators being available here!
1193b4be Poul Sander 2025-02-03 21:28 584
struct IMGUI_API ImRect
1193b4be Poul Sander 2025-02-03 21:28 585
{
1193b4be Poul Sander 2025-02-03 21:28 586
    ImVec2      Min;    // Upper-left
1193b4be Poul Sander 2025-02-03 21:28 587
    ImVec2      Max;    // Lower-right
1193b4be Poul Sander 2025-02-03 21:28 588
1193b4be Poul Sander 2025-02-03 21:28 589
    constexpr ImRect()                                        : Min(0.0f, 0.0f), Max(0.0f, 0.0f)  {}
1193b4be Poul Sander 2025-02-03 21:28 590
    constexpr ImRect(const ImVec2& min, const ImVec2& max)    : Min(min), Max(max)                {}
1193b4be Poul Sander 2025-02-03 21:28 591
    constexpr ImRect(const ImVec4& v)                         : Min(v.x, v.y), Max(v.z, v.w)      {}
1193b4be Poul Sander 2025-02-03 21:28 592
    constexpr ImRect(float x1, float y1, float x2, float y2)  : Min(x1, y1), Max(x2, y2)          {}
1193b4be Poul Sander 2025-02-03 21:28 593
1193b4be Poul Sander 2025-02-03 21:28 594
    ImVec2      GetCenter() const                   { return ImVec2((Min.x + Max.x) * 0.5f, (Min.y + Max.y) * 0.5f); }
1193b4be Poul Sander 2025-02-03 21:28 595
    ImVec2      GetSize() const                     { return ImVec2(Max.x - Min.x, Max.y - Min.y); }
1193b4be Poul Sander 2025-02-03 21:28 596
    float       GetWidth() const                    { return Max.x - Min.x; }
1193b4be Poul Sander 2025-02-03 21:28 597
    float       GetHeight() const                   { return Max.y - Min.y; }
1193b4be Poul Sander 2025-02-03 21:28 598
    float       GetArea() const                     { return (Max.x - Min.x) * (Max.y - Min.y); }
1193b4be Poul Sander 2025-02-03 21:28 599
    ImVec2      GetTL() const                       { return Min; }                   // Top-left
1193b4be Poul Sander 2025-02-03 21:28 600
    ImVec2      GetTR() const                       { return ImVec2(Max.x, Min.y); }  // Top-right
1193b4be Poul Sander 2025-02-03 21:28 601
    ImVec2      GetBL() const                       { return ImVec2(Min.x, Max.y); }  // Bottom-left
1193b4be Poul Sander 2025-02-03 21:28 602
    ImVec2      GetBR() const                       { return Max; }                   // Bottom-right
1193b4be Poul Sander 2025-02-03 21:28 603
    bool        Contains(const ImVec2& p) const     { return p.x     >= Min.x && p.y     >= Min.y && p.x     <  Max.x && p.y     <  Max.y; }
1193b4be Poul Sander 2025-02-03 21:28 604
    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; }
1193b4be Poul Sander 2025-02-03 21:28 605
    bool        ContainsWithPad(const ImVec2& p, const ImVec2& pad) const { return p.x >= Min.x - pad.x && p.y >= Min.y - pad.y && p.x < Max.x + pad.x && p.y < Max.y + pad.y; }
1193b4be Poul Sander 2025-02-03 21:28 606
    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; }
1193b4be Poul Sander 2025-02-03 21:28 607
    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; }
1193b4be Poul Sander 2025-02-03 21:28 608
    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; }
1193b4be Poul Sander 2025-02-03 21:28 609
    void        Expand(const float amount)          { Min.x -= amount;   Min.y -= amount;   Max.x += amount;   Max.y += amount; }
1193b4be Poul Sander 2025-02-03 21:28 610
    void        Expand(const ImVec2& amount)        { Min.x -= amount.x; Min.y -= amount.y; Max.x += amount.x; Max.y += amount.y; }
1193b4be Poul Sander 2025-02-03 21:28 611
    void        Translate(const ImVec2& d)          { Min.x += d.x; Min.y += d.y; Max.x += d.x; Max.y += d.y; }
1193b4be Poul Sander 2025-02-03 21:28 612
    void        TranslateX(float dx)                { Min.x += dx; Max.x += dx; }
1193b4be Poul Sander 2025-02-03 21:28 613
    void        TranslateY(float dy)                { Min.y += dy; Max.y += dy; }
1193b4be Poul Sander 2025-02-03 21:28 614
    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.
1193b4be Poul Sander 2025-02-03 21:28 615
    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.
1193b4be Poul Sander 2025-02-03 21:28 616
    void        Floor()                             { Min.x = IM_TRUNC(Min.x); Min.y = IM_TRUNC(Min.y); Max.x = IM_TRUNC(Max.x); Max.y = IM_TRUNC(Max.y); }
1193b4be Poul Sander 2025-02-03 21:28 617
    bool        IsInverted() const                  { return Min.x > Max.x || Min.y > Max.y; }
1193b4be Poul Sander 2025-02-03 21:28 618
    ImVec4      ToVec4() const                      { return ImVec4(Min.x, Min.y, Max.x, Max.y); }
4e9e2555 Poul Sander 2025-10-05 10:15 619
    const ImVec4& AsVec4() const                    { return *(const ImVec4*)&Min.x; }
1193b4be Poul Sander 2025-02-03 21:28 620
};
1193b4be Poul Sander 2025-02-03 21:28 621
1193b4be Poul Sander 2025-02-03 21:28 622
// Helper: ImBitArray
1193b4be Poul Sander 2025-02-03 21:28 623
#define         IM_BITARRAY_TESTBIT(_ARRAY, _N)                 ((_ARRAY[(_N) >> 5] & ((ImU32)1 << ((_N) & 31))) != 0) // Macro version of ImBitArrayTestBit(): ensure args have side-effect or are costly!
1193b4be Poul Sander 2025-02-03 21:28 624
#define         IM_BITARRAY_CLEARBIT(_ARRAY, _N)                ((_ARRAY[(_N) >> 5] &= ~((ImU32)1 << ((_N) & 31))))    // Macro version of ImBitArrayClearBit(): ensure args have side-effect or are costly!
1193b4be Poul Sander 2025-02-03 21:28 625
inline size_t   ImBitArrayGetStorageSizeInBytes(int bitcount)   { return (size_t)((bitcount + 31) >> 5) << 2; }
1193b4be Poul Sander 2025-02-03 21:28 626
inline void     ImBitArrayClearAllBits(ImU32* arr, int bitcount){ memset(arr, 0, ImBitArrayGetStorageSizeInBytes(bitcount)); }
1193b4be Poul Sander 2025-02-03 21:28 627
inline bool     ImBitArrayTestBit(const ImU32* arr, int n)      { ImU32 mask = (ImU32)1 << (n & 31); return (arr[n >> 5] & mask) != 0; }
1193b4be Poul Sander 2025-02-03 21:28 628
inline void     ImBitArrayClearBit(ImU32* arr, int n)           { ImU32 mask = (ImU32)1 << (n & 31); arr[n >> 5] &= ~mask; }
1193b4be Poul Sander 2025-02-03 21:28 629
inline void     ImBitArraySetBit(ImU32* arr, int n)             { ImU32 mask = (ImU32)1 << (n & 31); arr[n >> 5] |= mask; }
1193b4be Poul Sander 2025-02-03 21:28 630
inline void     ImBitArraySetBitRange(ImU32* arr, int n, int n2) // Works on range [n..n2)
1193b4be Poul Sander 2025-02-03 21:28 631
{
1193b4be Poul Sander 2025-02-03 21:28 632
    n2--;
1193b4be Poul Sander 2025-02-03 21:28 633
    while (n <= n2)
1193b4be Poul Sander 2025-02-03 21:28 634
    {
1193b4be Poul Sander 2025-02-03 21:28 635
        int a_mod = (n & 31);
1193b4be Poul Sander 2025-02-03 21:28 636
        int b_mod = (n2 > (n | 31) ? 31 : (n2 & 31)) + 1;
1193b4be Poul Sander 2025-02-03 21:28 637
        ImU32 mask = (ImU32)(((ImU64)1 << b_mod) - 1) & ~(ImU32)(((ImU64)1 << a_mod) - 1);
1193b4be Poul Sander 2025-02-03 21:28 638
        arr[n >> 5] |= mask;
1193b4be Poul Sander 2025-02-03 21:28 639
        n = (n + 32) & ~31;
1193b4be Poul Sander 2025-02-03 21:28 640
    }
1193b4be Poul Sander 2025-02-03 21:28 641
}
1193b4be Poul Sander 2025-02-03 21:28 642
1193b4be Poul Sander 2025-02-03 21:28 643
typedef ImU32* ImBitArrayPtr; // Name for use in structs
1193b4be Poul Sander 2025-02-03 21:28 644
1193b4be Poul Sander 2025-02-03 21:28 645
// Helper: ImBitArray class (wrapper over ImBitArray functions)
1193b4be Poul Sander 2025-02-03 21:28 646
// Store 1-bit per value.
1193b4be Poul Sander 2025-02-03 21:28 647
template<int BITCOUNT, int OFFSET = 0>
1193b4be Poul Sander 2025-02-03 21:28 648
struct ImBitArray
1193b4be Poul Sander 2025-02-03 21:28 649
{
1193b4be Poul Sander 2025-02-03 21:28 650
    ImU32           Storage[(BITCOUNT + 31) >> 5];
1193b4be Poul Sander 2025-02-03 21:28 651
    ImBitArray()                                { ClearAllBits(); }
1193b4be Poul Sander 2025-02-03 21:28 652
    void            ClearAllBits()              { memset(Storage, 0, sizeof(Storage)); }
1193b4be Poul Sander 2025-02-03 21:28 653
    void            SetAllBits()                { memset(Storage, 255, sizeof(Storage)); }
1193b4be Poul Sander 2025-02-03 21:28 654
    bool            TestBit(int n) const        { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); return IM_BITARRAY_TESTBIT(Storage, n); }
1193b4be Poul Sander 2025-02-03 21:28 655
    void            SetBit(int n)               { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); ImBitArraySetBit(Storage, n); }
1193b4be Poul Sander 2025-02-03 21:28 656
    void            ClearBit(int n)             { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); ImBitArrayClearBit(Storage, n); }
1193b4be Poul Sander 2025-02-03 21:28 657
    void            SetBitRange(int n, int n2)  { n += OFFSET; n2 += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT && n2 > n && n2 <= BITCOUNT); ImBitArraySetBitRange(Storage, n, n2); } // Works on range [n..n2)
1193b4be Poul Sander 2025-02-03 21:28 658
    bool            operator[](int n) const     { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); return IM_BITARRAY_TESTBIT(Storage, n); }
1193b4be Poul Sander 2025-02-03 21:28 659
};
1193b4be Poul Sander 2025-02-03 21:28 660
1193b4be Poul Sander 2025-02-03 21:28 661
// Helper: ImBitVector
1193b4be Poul Sander 2025-02-03 21:28 662
// Store 1-bit per value.
1193b4be Poul Sander 2025-02-03 21:28 663
struct IMGUI_API ImBitVector
1193b4be Poul Sander 2025-02-03 21:28 664
{
1193b4be Poul Sander 2025-02-03 21:28 665
    ImVector<ImU32> Storage;
1193b4be Poul Sander 2025-02-03 21:28 666
    void            Create(int sz)              { Storage.resize((sz + 31) >> 5); memset(Storage.Data, 0, (size_t)Storage.Size * sizeof(Storage.Data[0])); }
1193b4be Poul Sander 2025-02-03 21:28 667
    void            Clear()                     { Storage.clear(); }
1193b4be Poul Sander 2025-02-03 21:28 668
    bool            TestBit(int n) const        { IM_ASSERT(n < (Storage.Size << 5)); return IM_BITARRAY_TESTBIT(Storage.Data, n); }
1193b4be Poul Sander 2025-02-03 21:28 669
    void            SetBit(int n)               { IM_ASSERT(n < (Storage.Size << 5)); ImBitArraySetBit(Storage.Data, n); }
1193b4be Poul Sander 2025-02-03 21:28 670
    void            ClearBit(int n)             { IM_ASSERT(n < (Storage.Size << 5)); ImBitArrayClearBit(Storage.Data, n); }
1193b4be Poul Sander 2025-02-03 21:28 671
};
1193b4be Poul Sander 2025-02-03 21:28 672
IM_MSVC_RUNTIME_CHECKS_RESTORE
1193b4be Poul Sander 2025-02-03 21:28 673
1193b4be Poul Sander 2025-02-03 21:28 674
// Helper: ImSpan<>
1193b4be Poul Sander 2025-02-03 21:28 675
// Pointing to a span of data we don't own.
1193b4be Poul Sander 2025-02-03 21:28 676
template<typename T>
1193b4be Poul Sander 2025-02-03 21:28 677
struct ImSpan
1193b4be Poul Sander 2025-02-03 21:28 678
{
1193b4be Poul Sander 2025-02-03 21:28 679
    T*                  Data;
1193b4be Poul Sander 2025-02-03 21:28 680
    T*                  DataEnd;
1193b4be Poul Sander 2025-02-03 21:28 681
1193b4be Poul Sander 2025-02-03 21:28 682
    // Constructors, destructor
1193b4be Poul Sander 2025-02-03 21:28 683
    inline ImSpan()                                 { Data = DataEnd = NULL; }
1193b4be Poul Sander 2025-02-03 21:28 684
    inline ImSpan(T* data, int size)                { Data = data; DataEnd = data + size; }
1193b4be Poul Sander 2025-02-03 21:28 685
    inline ImSpan(T* data, T* data_end)             { Data = data; DataEnd = data_end; }
1193b4be Poul Sander 2025-02-03 21:28 686
1193b4be Poul Sander 2025-02-03 21:28 687
    inline void         set(T* data, int size)      { Data = data; DataEnd = data + size; }
1193b4be Poul Sander 2025-02-03 21:28 688
    inline void         set(T* data, T* data_end)   { Data = data; DataEnd = data_end; }
1193b4be Poul Sander 2025-02-03 21:28 689
    inline int          size() const                { return (int)(ptrdiff_t)(DataEnd - Data); }
1193b4be Poul Sander 2025-02-03 21:28 690
    inline int          size_in_bytes() const       { return (int)(ptrdiff_t)(DataEnd - Data) * (int)sizeof(T); }
1193b4be Poul Sander 2025-02-03 21:28 691
    inline T&           operator[](int i)           { T* p = Data + i; IM_ASSERT(p >= Data && p < DataEnd); return *p; }
1193b4be Poul Sander 2025-02-03 21:28 692
    inline const T&     operator[](int i) const     { const T* p = Data + i; IM_ASSERT(p >= Data && p < DataEnd); return *p; }
1193b4be Poul Sander 2025-02-03 21:28 693
1193b4be Poul Sander 2025-02-03 21:28 694
    inline T*           begin()                     { return Data; }
1193b4be Poul Sander 2025-02-03 21:28 695
    inline const T*     begin() const               { return Data; }
1193b4be Poul Sander 2025-02-03 21:28 696
    inline T*           end()                       { return DataEnd; }
1193b4be Poul Sander 2025-02-03 21:28 697
    inline const T*     end() const                 { return DataEnd; }
1193b4be Poul Sander 2025-02-03 21:28 698
1193b4be Poul Sander 2025-02-03 21:28 699
    // Utilities
1193b4be Poul Sander 2025-02-03 21:28 700
    inline int  index_from_ptr(const T* it) const   { IM_ASSERT(it >= Data && it < DataEnd); const ptrdiff_t off = it - Data; return (int)off; }
1193b4be Poul Sander 2025-02-03 21:28 701
};
1193b4be Poul Sander 2025-02-03 21:28 702
1193b4be Poul Sander 2025-02-03 21:28 703
// Helper: ImSpanAllocator<>
1193b4be Poul Sander 2025-02-03 21:28 704
// Facilitate storing multiple chunks into a single large block (the "arena")
1193b4be Poul Sander 2025-02-03 21:28 705
// - Usage: call Reserve() N times, allocate GetArenaSizeInBytes() worth, pass it to SetArenaBasePtr(), call GetSpan() N times to retrieve the aligned ranges.
1193b4be Poul Sander 2025-02-03 21:28 706
template<int CHUNKS>
1193b4be Poul Sander 2025-02-03 21:28 707
struct ImSpanAllocator
1193b4be Poul Sander 2025-02-03 21:28 708
{
1193b4be Poul Sander 2025-02-03 21:28 709
    char*   BasePtr;
1193b4be Poul Sander 2025-02-03 21:28 710
    int     CurrOff;
1193b4be Poul Sander 2025-02-03 21:28 711
    int     CurrIdx;
1193b4be Poul Sander 2025-02-03 21:28 712
    int     Offsets[CHUNKS];
1193b4be Poul Sander 2025-02-03 21:28 713
    int     Sizes[CHUNKS];
1193b4be Poul Sander 2025-02-03 21:28 714
1193b4be Poul Sander 2025-02-03 21:28 715
    ImSpanAllocator()                               { memset(this, 0, sizeof(*this)); }
1193b4be Poul Sander 2025-02-03 21:28 716
    inline void  Reserve(int n, size_t sz, int a=4) { IM_ASSERT(n == CurrIdx && n < CHUNKS); CurrOff = IM_MEMALIGN(CurrOff, a); Offsets[n] = CurrOff; Sizes[n] = (int)sz; CurrIdx++; CurrOff += (int)sz; }
1193b4be Poul Sander 2025-02-03 21:28 717
    inline int   GetArenaSizeInBytes()              { return CurrOff; }
1193b4be Poul Sander 2025-02-03 21:28 718
    inline void  SetArenaBasePtr(void* base_ptr)    { BasePtr = (char*)base_ptr; }
1193b4be Poul Sander 2025-02-03 21:28 719
    inline void* GetSpanPtrBegin(int n)             { IM_ASSERT(n >= 0 && n < CHUNKS && CurrIdx == CHUNKS); return (void*)(BasePtr + Offsets[n]); }
1193b4be Poul Sander 2025-02-03 21:28 720
    inline void* GetSpanPtrEnd(int n)               { IM_ASSERT(n >= 0 && n < CHUNKS && CurrIdx == CHUNKS); return (void*)(BasePtr + Offsets[n] + Sizes[n]); }
1193b4be Poul Sander 2025-02-03 21:28 721
    template<typename T>
1193b4be Poul Sander 2025-02-03 21:28 722
    inline void  GetSpan(int n, ImSpan<T>* span)    { span->set((T*)GetSpanPtrBegin(n), (T*)GetSpanPtrEnd(n)); }
1193b4be Poul Sander 2025-02-03 21:28 723
};
1193b4be Poul Sander 2025-02-03 21:28 724
4e9e2555 Poul Sander 2025-10-05 10:15 725
// Helper: ImStableVector<>
4e9e2555 Poul Sander 2025-10-05 10:15 726
// Allocating chunks of BLOCK_SIZE items. Objects pointers are never invalidated when growing, only by clear().
4e9e2555 Poul Sander 2025-10-05 10:15 727
// Important: does not destruct anything!
4e9e2555 Poul Sander 2025-10-05 10:15 728
// Implemented only the minimum set of functions we need for it.
4e9e2555 Poul Sander 2025-10-05 10:15 729
template<typename T, int BLOCK_SIZE>
4e9e2555 Poul Sander 2025-10-05 10:15 730
struct ImStableVector
4e9e2555 Poul Sander 2025-10-05 10:15 731
{
4e9e2555 Poul Sander 2025-10-05 10:15 732
    int                 Size = 0;
4e9e2555 Poul Sander 2025-10-05 10:15 733
    int                 Capacity = 0;
4e9e2555 Poul Sander 2025-10-05 10:15 734
    ImVector<T*>        Blocks;
4e9e2555 Poul Sander 2025-10-05 10:15 735
4e9e2555 Poul Sander 2025-10-05 10:15 736
    // Functions
4e9e2555 Poul Sander 2025-10-05 10:15 737
    inline ~ImStableVector()                        { for (T* block : Blocks) IM_FREE(block); }
4e9e2555 Poul Sander 2025-10-05 10:15 738
4e9e2555 Poul Sander 2025-10-05 10:15 739
    inline void         clear()                     { Size = Capacity = 0; Blocks.clear_delete(); }
4e9e2555 Poul Sander 2025-10-05 10:15 740
    inline void         resize(int new_size)        { if (new_size > Capacity) reserve(new_size); Size = new_size; }
4e9e2555 Poul Sander 2025-10-05 10:15 741
    inline void         reserve(int new_cap)
4e9e2555 Poul Sander 2025-10-05 10:15 742
    {
4e9e2555 Poul Sander 2025-10-05 10:15 743
        new_cap = IM_MEMALIGN(new_cap, BLOCK_SIZE);
4e9e2555 Poul Sander 2025-10-05 10:15 744
        int old_count = Capacity / BLOCK_SIZE;
4e9e2555 Poul Sander 2025-10-05 10:15 745
        int new_count = new_cap / BLOCK_SIZE;
4e9e2555 Poul Sander 2025-10-05 10:15 746
        if (new_count <= old_count)
4e9e2555 Poul Sander 2025-10-05 10:15 747
            return;
4e9e2555 Poul Sander 2025-10-05 10:15 748
        Blocks.resize(new_count);
4e9e2555 Poul Sander 2025-10-05 10:15 749
        for (int n = old_count; n < new_count; n++)
4e9e2555 Poul Sander 2025-10-05 10:15 750
            Blocks[n] = (T*)IM_ALLOC(sizeof(T) * BLOCK_SIZE);
4e9e2555 Poul Sander 2025-10-05 10:15 751
        Capacity = new_cap;
4e9e2555 Poul Sander 2025-10-05 10:15 752
    }
4e9e2555 Poul Sander 2025-10-05 10:15 753
    inline T&           operator[](int i)           { IM_ASSERT(i >= 0 && i < Size); return Blocks[i / BLOCK_SIZE][i % BLOCK_SIZE]; }
4e9e2555 Poul Sander 2025-10-05 10:15 754
    inline const T&     operator[](int i) const     { IM_ASSERT(i >= 0 && i < Size); return Blocks[i / BLOCK_SIZE][i % BLOCK_SIZE]; }
4e9e2555 Poul Sander 2025-10-05 10:15 755
    inline T*           push_back(const T& v)       { int i = Size; IM_ASSERT(i >= 0); if (Size == Capacity) reserve(Capacity + BLOCK_SIZE); void* ptr = &Blocks[i / BLOCK_SIZE][i % BLOCK_SIZE]; memcpy(ptr, &v, sizeof(v)); Size++; return (T*)ptr; }
4e9e2555 Poul Sander 2025-10-05 10:15 756
};
4e9e2555 Poul Sander 2025-10-05 10:15 757
1193b4be Poul Sander 2025-02-03 21:28 758
// Helper: ImPool<>
1193b4be Poul Sander 2025-02-03 21:28 759
// Basic keyed storage for contiguous instances, slow/amortized insertion, O(1) indexable, O(Log N) queries by ID over a dense/hot buffer,
1193b4be Poul Sander 2025-02-03 21:28 760
// Honor constructor/destructor. Add/remove invalidate all pointers. Indexes have the same lifetime as the associated object.
1193b4be Poul Sander 2025-02-03 21:28 761
typedef int ImPoolIdx;
1193b4be Poul Sander 2025-02-03 21:28 762
template<typename T>
1193b4be Poul Sander 2025-02-03 21:28 763
struct ImPool
1193b4be Poul Sander 2025-02-03 21:28 764
{
1193b4be Poul Sander 2025-02-03 21:28 765
    ImVector<T>     Buf;        // Contiguous data
1193b4be Poul Sander 2025-02-03 21:28 766
    ImGuiStorage    Map;        // ID->Index
1193b4be Poul Sander 2025-02-03 21:28 767
    ImPoolIdx       FreeIdx;    // Next free idx to use
1193b4be Poul Sander 2025-02-03 21:28 768
    ImPoolIdx       AliveCount; // Number of active/alive items (for display purpose)
1193b4be Poul Sander 2025-02-03 21:28 769
1193b4be Poul Sander 2025-02-03 21:28 770
    ImPool()    { FreeIdx = AliveCount = 0; }
1193b4be Poul Sander 2025-02-03 21:28 771
    ~ImPool()   { Clear(); }
1193b4be Poul Sander 2025-02-03 21:28 772
    T*          GetByKey(ImGuiID key)               { int idx = Map.GetInt(key, -1); return (idx != -1) ? &Buf[idx] : NULL; }
1193b4be Poul Sander 2025-02-03 21:28 773
    T*          GetByIndex(ImPoolIdx n)             { return &Buf[n]; }
1193b4be Poul Sander 2025-02-03 21:28 774
    ImPoolIdx   GetIndex(const T* p) const          { IM_ASSERT(p >= Buf.Data && p < Buf.Data + Buf.Size); return (ImPoolIdx)(p - Buf.Data); }
1193b4be Poul Sander 2025-02-03 21:28 775
    T*          GetOrAddByKey(ImGuiID key)          { int* p_idx = Map.GetIntRef(key, -1); if (*p_idx != -1) return &Buf[*p_idx]; *p_idx = FreeIdx; return Add(); }
1193b4be Poul Sander 2025-02-03 21:28 776
    bool        Contains(const T* p) const          { return (p >= Buf.Data && p < Buf.Data + Buf.Size); }
1193b4be Poul Sander 2025-02-03 21:28 777
    void        Clear()                             { for (int n = 0; n < Map.Data.Size; n++) { int idx = Map.Data[n].val_i; if (idx != -1) Buf[idx].~T(); } Map.Clear(); Buf.clear(); FreeIdx = AliveCount = 0; }
1193b4be Poul Sander 2025-02-03 21:28 778
    T*          Add()                               { int idx = FreeIdx; if (idx == Buf.Size) { Buf.resize(Buf.Size + 1); FreeIdx++; } else { FreeIdx = *(int*)&Buf[idx]; } IM_PLACEMENT_NEW(&Buf[idx]) T(); AliveCount++; return &Buf[idx]; }
1193b4be Poul Sander 2025-02-03 21:28 779
    void        Remove(ImGuiID key, const T* p)     { Remove(key, GetIndex(p)); }
1193b4be Poul Sander 2025-02-03 21:28 780
    void        Remove(ImGuiID key, ImPoolIdx idx)  { Buf[idx].~T(); *(int*)&Buf[idx] = FreeIdx; FreeIdx = idx; Map.SetInt(key, -1); AliveCount--; }
1193b4be Poul Sander 2025-02-03 21:28 781
    void        Reserve(int capacity)               { Buf.reserve(capacity); Map.Data.reserve(capacity); }
1193b4be Poul Sander 2025-02-03 21:28 782
1193b4be Poul Sander 2025-02-03 21:28 783
    // To iterate a ImPool: for (int n = 0; n < pool.GetMapSize(); n++) if (T* t = pool.TryGetMapData(n)) { ... }
1193b4be Poul Sander 2025-02-03 21:28 784
    // Can be avoided if you know .Remove() has never been called on the pool, or AliveCount == GetMapSize()
1193b4be Poul Sander 2025-02-03 21:28 785
    int         GetAliveCount() const               { return AliveCount; }      // Number of active/alive items in the pool (for display purpose)
1193b4be Poul Sander 2025-02-03 21:28 786
    int         GetBufSize() const                  { return Buf.Size; }
1193b4be Poul Sander 2025-02-03 21:28 787
    int         GetMapSize() const                  { return Map.Data.Size; }   // It is the map we need iterate to find valid items, since we don't have "alive" storage anywhere
1193b4be Poul Sander 2025-02-03 21:28 788
    T*          TryGetMapData(ImPoolIdx n)          { int idx = Map.Data[n].val_i; if (idx == -1) return NULL; return GetByIndex(idx); }
1193b4be Poul Sander 2025-02-03 21:28 789
};
1193b4be Poul Sander 2025-02-03 21:28 790
1193b4be Poul Sander 2025-02-03 21:28 791
// Helper: ImChunkStream<>
1193b4be Poul Sander 2025-02-03 21:28 792
// Build and iterate a contiguous stream of variable-sized structures.
1193b4be Poul Sander 2025-02-03 21:28 793
// This is used by Settings to store persistent data while reducing allocation count.
1193b4be Poul Sander 2025-02-03 21:28 794
// We store the chunk size first, and align the final size on 4 bytes boundaries.
1193b4be Poul Sander 2025-02-03 21:28 795
// The tedious/zealous amount of casting is to avoid -Wcast-align warnings.
1193b4be Poul Sander 2025-02-03 21:28 796
template<typename T>
1193b4be Poul Sander 2025-02-03 21:28 797
struct ImChunkStream
1193b4be Poul Sander 2025-02-03 21:28 798
{
1193b4be Poul Sander 2025-02-03 21:28 799
    ImVector<char>  Buf;
1193b4be Poul Sander 2025-02-03 21:28 800
1193b4be Poul Sander 2025-02-03 21:28 801
    void    clear()                     { Buf.clear(); }
1193b4be Poul Sander 2025-02-03 21:28 802
    bool    empty() const               { return Buf.Size == 0; }
1193b4be Poul Sander 2025-02-03 21:28 803
    int     size() const                { return Buf.Size; }
1193b4be Poul Sander 2025-02-03 21:28 804
    T*      alloc_chunk(size_t sz)      { size_t HDR_SZ = 4; sz = IM_MEMALIGN(HDR_SZ + sz, 4u); int off = Buf.Size; Buf.resize(off + (int)sz); ((int*)(void*)(Buf.Data + off))[0] = (int)sz; return (T*)(void*)(Buf.Data + off + (int)HDR_SZ); }
1193b4be Poul Sander 2025-02-03 21:28 805
    T*      begin()                     { size_t HDR_SZ = 4; if (!Buf.Data) return NULL; return (T*)(void*)(Buf.Data + HDR_SZ); }
1193b4be Poul Sander 2025-02-03 21:28 806
    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; }
1193b4be Poul Sander 2025-02-03 21:28 807
    int     chunk_size(const T* p)      { return ((const int*)p)[-1]; }
1193b4be Poul Sander 2025-02-03 21:28 808
    T*      end()                       { return (T*)(void*)(Buf.Data + Buf.Size); }
1193b4be Poul Sander 2025-02-03 21:28 809
    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; }
1193b4be Poul Sander 2025-02-03 21:28 810
    T*      ptr_from_offset(int off)    { IM_ASSERT(off >= 4 && off < Buf.Size); return (T*)(void*)(Buf.Data + off); }
1193b4be Poul Sander 2025-02-03 21:28 811
    void    swap(ImChunkStream<T>& rhs) { rhs.Buf.swap(Buf); }
1193b4be Poul Sander 2025-02-03 21:28 812
};
1193b4be Poul Sander 2025-02-03 21:28 813
1193b4be Poul Sander 2025-02-03 21:28 814
// Helper: ImGuiTextIndex
1193b4be Poul Sander 2025-02-03 21:28 815
// Maintain a line index for a text buffer. This is a strong candidate to be moved into the public API.
1193b4be Poul Sander 2025-02-03 21:28 816
struct ImGuiTextIndex
1193b4be Poul Sander 2025-02-03 21:28 817
{
4e9e2555 Poul Sander 2025-10-05 10:15 818
    ImVector<int>   Offsets;
1193b4be Poul Sander 2025-02-03 21:28 819
    int             EndOffset = 0;                          // Because we don't own text buffer we need to maintain EndOffset (may bake in LineOffsets?)
1193b4be Poul Sander 2025-02-03 21:28 820
4e9e2555 Poul Sander 2025-10-05 10:15 821
    void            clear()                                 { Offsets.clear(); EndOffset = 0; }
4e9e2555 Poul Sander 2025-10-05 10:15 822
    int             size()                                  { return Offsets.Size; }
4e9e2555 Poul Sander 2025-10-05 10:15 823
    const char*     get_line_begin(const char* base, int n) { return base + (Offsets.Size != 0 ? Offsets[n] : 0); }
4e9e2555 Poul Sander 2025-10-05 10:15 824
    const char*     get_line_end(const char* base, int n)   { return base + (n + 1 < Offsets.Size ? (Offsets[n + 1] - 1) : EndOffset); }
1193b4be Poul Sander 2025-02-03 21:28 825
    void            append(const char* base, int old_size, int new_size);
1193b4be Poul Sander 2025-02-03 21:28 826
};
1193b4be Poul Sander 2025-02-03 21:28 827
1193b4be Poul Sander 2025-02-03 21:28 828
// Helper: ImGuiStorage
1193b4be Poul Sander 2025-02-03 21:28 829
IMGUI_API ImGuiStoragePair* ImLowerBound(ImGuiStoragePair* in_begin, ImGuiStoragePair* in_end, ImGuiID key);
4e9e2555 Poul Sander 2025-10-05 10:15 830
1193b4be Poul Sander 2025-02-03 21:28 831
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 832
// [SECTION] ImDrawList support
1193b4be Poul Sander 2025-02-03 21:28 833
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 834
1193b4be Poul Sander 2025-02-03 21:28 835
// ImDrawList: Helper function to calculate a circle's segment count given its radius and a "maximum error" value.
1193b4be Poul Sander 2025-02-03 21:28 836
// Estimation of number of circle segment based on error is derived using method described in https://stackoverflow.com/a/2244088/15194693
1193b4be Poul Sander 2025-02-03 21:28 837
// Number of segments (N) is calculated using equation:
1193b4be Poul Sander 2025-02-03 21:28 838
//   N = ceil ( pi / acos(1 - error / r) )     where r > 0, error <= r
1193b4be Poul Sander 2025-02-03 21:28 839
// Our equation is significantly simpler that one in the post thanks for choosing segment that is
1193b4be Poul Sander 2025-02-03 21:28 840
// perpendicular to X axis. Follow steps in the article from this starting condition and you will
1193b4be Poul Sander 2025-02-03 21:28 841
// will get this result.
1193b4be Poul Sander 2025-02-03 21:28 842
//
1193b4be Poul Sander 2025-02-03 21:28 843
// Rendering circles with an odd number of segments, while mathematically correct will produce
1193b4be Poul Sander 2025-02-03 21:28 844
// asymmetrical results on the raster grid. Therefore we're rounding N to next even number (7->8, 8->8, 9->10 etc.)
1193b4be Poul Sander 2025-02-03 21:28 845
#define IM_ROUNDUP_TO_EVEN(_V)                                  ((((_V) + 1) / 2) * 2)
1193b4be Poul Sander 2025-02-03 21:28 846
#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MIN                     4
1193b4be Poul Sander 2025-02-03 21:28 847
#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX                     512
1193b4be Poul Sander 2025-02-03 21:28 848
#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC(_RAD,_MAXERROR)    ImClamp(IM_ROUNDUP_TO_EVEN((int)ImCeil(IM_PI / ImAcos(1 - ImMin((_MAXERROR), (_RAD)) / (_RAD)))), IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MIN, IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX)
1193b4be Poul Sander 2025-02-03 21:28 849
1193b4be Poul Sander 2025-02-03 21:28 850
// Raw equation from IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC rewritten for 'r' and 'error'.
1193b4be Poul Sander 2025-02-03 21:28 851
#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_R(_N,_MAXERROR)    ((_MAXERROR) / (1 - ImCos(IM_PI / ImMax((float)(_N), IM_PI))))
1193b4be Poul Sander 2025-02-03 21:28 852
#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_ERROR(_N,_RAD)     ((1 - ImCos(IM_PI / ImMax((float)(_N), IM_PI))) / (_RAD))
1193b4be Poul Sander 2025-02-03 21:28 853
1193b4be Poul Sander 2025-02-03 21:28 854
// ImDrawList: Lookup table size for adaptive arc drawing, cover full circle.
1193b4be Poul Sander 2025-02-03 21:28 855
#ifndef IM_DRAWLIST_ARCFAST_TABLE_SIZE
1193b4be Poul Sander 2025-02-03 21:28 856
#define IM_DRAWLIST_ARCFAST_TABLE_SIZE                          48 // Number of samples in lookup table.
1193b4be Poul Sander 2025-02-03 21:28 857
#endif
1193b4be Poul Sander 2025-02-03 21:28 858
#define IM_DRAWLIST_ARCFAST_SAMPLE_MAX                          IM_DRAWLIST_ARCFAST_TABLE_SIZE // Sample index _PathArcToFastEx() for 360 angle.
1193b4be Poul Sander 2025-02-03 21:28 859
1193b4be Poul Sander 2025-02-03 21:28 860
// Data shared between all ImDrawList instances
4e9e2555 Poul Sander 2025-10-05 10:15 861
// Conceptually this could have been called e.g. ImDrawListSharedContext
4e9e2555 Poul Sander 2025-10-05 10:15 862
// Typically one ImGui context would create and maintain one of this.
4e9e2555 Poul Sander 2025-10-05 10:15 863
// You may want to create your own instance of you try to ImDrawList completely without ImGui. In that case, watch out for future changes to this structure.
1193b4be Poul Sander 2025-02-03 21:28 864
struct IMGUI_API ImDrawListSharedData
1193b4be Poul Sander 2025-02-03 21:28 865
{
4e9e2555 Poul Sander 2025-10-05 10:15 866
    ImVec2          TexUvWhitePixel;            // UV of white pixel in the atlas (== FontAtlas->TexUvWhitePixel)
4e9e2555 Poul Sander 2025-10-05 10:15 867
    const ImVec4*   TexUvLines;                 // UV of anti-aliased lines in the atlas (== FontAtlas->TexUvLines)
4e9e2555 Poul Sander 2025-10-05 10:15 868
    ImFontAtlas*    FontAtlas;                  // Current font atlas
4e9e2555 Poul Sander 2025-10-05 10:15 869
    ImFont*         Font;                       // Current font (used for simplified AddText overload)
4e9e2555 Poul Sander 2025-10-05 10:15 870
    float           FontSize;                   // Current font size (used for for simplified AddText overload)
4e9e2555 Poul Sander 2025-10-05 10:15 871
    float           FontScale;                  // Current font scale (== FontSize / Font->FontSize)
1193b4be Poul Sander 2025-02-03 21:28 872
    float           CurveTessellationTol;       // Tessellation tolerance when using PathBezierCurveTo()
1193b4be Poul Sander 2025-02-03 21:28 873
    float           CircleSegmentMaxError;      // Number of circle segments to use per pixel of radius for AddCircle() etc
4e9e2555 Poul Sander 2025-10-05 10:15 874
    float           InitialFringeScale;         // Initial scale to apply to AA fringe
1193b4be Poul Sander 2025-02-03 21:28 875
    ImDrawListFlags InitialFlags;               // Initial flags at the beginning of the frame (it is possible to alter flags on a per-drawlist basis afterwards)
4e9e2555 Poul Sander 2025-10-05 10:15 876
    ImVec4          ClipRectFullscreen;         // Value for PushClipRectFullscreen()
4e9e2555 Poul Sander 2025-10-05 10:15 877
    ImVector<ImVec2> TempBuffer;                // Temporary write buffer
4e9e2555 Poul Sander 2025-10-05 10:15 878
    ImVector<ImDrawList*> DrawLists;            // All draw lists associated to this ImDrawListSharedData
4e9e2555 Poul Sander 2025-10-05 10:15 879
    ImGuiContext*   Context;                    // [OPTIONAL] Link to Dear ImGui context. 99% of ImDrawList/ImFontAtlas can function without an ImGui context, but this facilitate handling one legacy edge case.
1193b4be Poul Sander 2025-02-03 21:28 880
4e9e2555 Poul Sander 2025-10-05 10:15 881
    // Lookup tables
1193b4be Poul Sander 2025-02-03 21:28 882
    ImVec2          ArcFastVtx[IM_DRAWLIST_ARCFAST_TABLE_SIZE]; // Sample points on the quarter of the circle.
1193b4be Poul Sander 2025-02-03 21:28 883
    float           ArcFastRadiusCutoff;                        // Cutoff radius after which arc drawing will fallback to slower PathArcTo()
1193b4be Poul Sander 2025-02-03 21:28 884
    ImU8            CircleSegmentCounts[64];    // Precomputed segment count for given radius before we calculate it dynamically (to avoid calculation overhead)
1193b4be Poul Sander 2025-02-03 21:28 885
1193b4be Poul Sander 2025-02-03 21:28 886
    ImDrawListSharedData();
4e9e2555 Poul Sander 2025-10-05 10:15 887
    ~ImDrawListSharedData();
1193b4be Poul Sander 2025-02-03 21:28 888
    void SetCircleTessellationMaxError(float max_error);
1193b4be Poul Sander 2025-02-03 21:28 889
};
1193b4be Poul Sander 2025-02-03 21:28 890
1193b4be Poul Sander 2025-02-03 21:28 891
struct ImDrawDataBuilder
1193b4be Poul Sander 2025-02-03 21:28 892
{
1193b4be Poul Sander 2025-02-03 21:28 893
    ImVector<ImDrawList*>*  Layers[2];      // Pointers to global layers for: regular, tooltip. LayersP[0] is owned by DrawData.
1193b4be Poul Sander 2025-02-03 21:28 894
    ImVector<ImDrawList*>   LayerData1;
1193b4be Poul Sander 2025-02-03 21:28 895
1193b4be Poul Sander 2025-02-03 21:28 896
    ImDrawDataBuilder()                     { memset(this, 0, sizeof(*this)); }
1193b4be Poul Sander 2025-02-03 21:28 897
};
1193b4be Poul Sander 2025-02-03 21:28 898
4e9e2555 Poul Sander 2025-10-05 10:15 899
struct ImFontStackData
4e9e2555 Poul Sander 2025-10-05 10:15 900
{
4e9e2555 Poul Sander 2025-10-05 10:15 901
    ImFont*     Font;
4e9e2555 Poul Sander 2025-10-05 10:15 902
    float       FontSizeBeforeScaling;      // ~~ style.FontSizeBase
4e9e2555 Poul Sander 2025-10-05 10:15 903
    float       FontSizeAfterScaling;       // ~~ g.FontSize
4e9e2555 Poul Sander 2025-10-05 10:15 904
};
4e9e2555 Poul Sander 2025-10-05 10:15 905
1193b4be Poul Sander 2025-02-03 21:28 906
//-----------------------------------------------------------------------------
4e9e2555 Poul Sander 2025-10-05 10:15 907
// [SECTION] Style support
1193b4be Poul Sander 2025-02-03 21:28 908
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 909
4e9e2555 Poul Sander 2025-10-05 10:15 910
struct ImGuiStyleVarInfo
1193b4be Poul Sander 2025-02-03 21:28 911
{
4e9e2555 Poul Sander 2025-10-05 10:15 912
    ImU32           Count : 8;      // 1+
4e9e2555 Poul Sander 2025-10-05 10:15 913
    ImGuiDataType   DataType : 8;
4e9e2555 Poul Sander 2025-10-05 10:15 914
    ImU32           Offset : 16;    // Offset in parent structure
1193b4be Poul Sander 2025-02-03 21:28 915
    void* GetVarPtr(void* parent) const { return (void*)((unsigned char*)parent + Offset); }
1193b4be Poul Sander 2025-02-03 21:28 916
};
1193b4be Poul Sander 2025-02-03 21:28 917
4e9e2555 Poul Sander 2025-10-05 10:15 918
// Stacked color modifier, backup of modified data so we can restore it
4e9e2555 Poul Sander 2025-10-05 10:15 919
struct ImGuiColorMod
4e9e2555 Poul Sander 2025-10-05 10:15 920
{
4e9e2555 Poul Sander 2025-10-05 10:15 921
    ImGuiCol        Col;
4e9e2555 Poul Sander 2025-10-05 10:15 922
    ImVec4          BackupValue;
4e9e2555 Poul Sander 2025-10-05 10:15 923
};
4e9e2555 Poul Sander 2025-10-05 10:15 924
4e9e2555 Poul Sander 2025-10-05 10:15 925
// Stacked style modifier, backup of modified data so we can restore it. Data type inferred from the variable.
4e9e2555 Poul Sander 2025-10-05 10:15 926
struct ImGuiStyleMod
4e9e2555 Poul Sander 2025-10-05 10:15 927
{
4e9e2555 Poul Sander 2025-10-05 10:15 928
    ImGuiStyleVar   VarIdx;
4e9e2555 Poul Sander 2025-10-05 10:15 929
    union           { int BackupInt[2]; float BackupFloat[2]; };
4e9e2555 Poul Sander 2025-10-05 10:15 930
    ImGuiStyleMod(ImGuiStyleVar idx, int v)     { VarIdx = idx; BackupInt[0] = v; }
4e9e2555 Poul Sander 2025-10-05 10:15 931
    ImGuiStyleMod(ImGuiStyleVar idx, float v)   { VarIdx = idx; BackupFloat[0] = v; }
4e9e2555 Poul Sander 2025-10-05 10:15 932
    ImGuiStyleMod(ImGuiStyleVar idx, ImVec2 v)  { VarIdx = idx; BackupFloat[0] = v.x; BackupFloat[1] = v.y; }
4e9e2555 Poul Sander 2025-10-05 10:15 933
};
4e9e2555 Poul Sander 2025-10-05 10:15 934
4e9e2555 Poul Sander 2025-10-05 10:15 935
//-----------------------------------------------------------------------------
4e9e2555 Poul Sander 2025-10-05 10:15 936
// [SECTION] Data types support
4e9e2555 Poul Sander 2025-10-05 10:15 937
//-----------------------------------------------------------------------------
4e9e2555 Poul Sander 2025-10-05 10:15 938
1193b4be Poul Sander 2025-02-03 21:28 939
struct ImGuiDataTypeStorage
1193b4be Poul Sander 2025-02-03 21:28 940
{
1193b4be Poul Sander 2025-02-03 21:28 941
    ImU8        Data[8];        // Opaque storage to fit any data up to ImGuiDataType_COUNT
1193b4be Poul Sander 2025-02-03 21:28 942
};
1193b4be Poul Sander 2025-02-03 21:28 943
1193b4be Poul Sander 2025-02-03 21:28 944
// Type information associated to one ImGuiDataType. Retrieve with DataTypeGetInfo().
1193b4be Poul Sander 2025-02-03 21:28 945
struct ImGuiDataTypeInfo
1193b4be Poul Sander 2025-02-03 21:28 946
{
1193b4be Poul Sander 2025-02-03 21:28 947
    size_t      Size;           // Size in bytes
1193b4be Poul Sander 2025-02-03 21:28 948
    const char* Name;           // Short descriptive name for the type, for debugging
1193b4be Poul Sander 2025-02-03 21:28 949
    const char* PrintFmt;       // Default printf format for the type
1193b4be Poul Sander 2025-02-03 21:28 950
    const char* ScanFmt;        // Default scanf format for the type
1193b4be Poul Sander 2025-02-03 21:28 951
};
1193b4be Poul Sander 2025-02-03 21:28 952
1193b4be Poul Sander 2025-02-03 21:28 953
// Extend ImGuiDataType_
1193b4be Poul Sander 2025-02-03 21:28 954
enum ImGuiDataTypePrivate_
1193b4be Poul Sander 2025-02-03 21:28 955
{
4e9e2555 Poul Sander 2025-10-05 10:15 956
    ImGuiDataType_Pointer = ImGuiDataType_COUNT,
1193b4be Poul Sander 2025-02-03 21:28 957
    ImGuiDataType_ID,
1193b4be Poul Sander 2025-02-03 21:28 958
};
1193b4be Poul Sander 2025-02-03 21:28 959
1193b4be Poul Sander 2025-02-03 21:28 960
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 961
// [SECTION] Widgets support: flags, enums, data structures
1193b4be Poul Sander 2025-02-03 21:28 962
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 963
1193b4be Poul Sander 2025-02-03 21:28 964
// Extend ImGuiItemFlags
1193b4be Poul Sander 2025-02-03 21:28 965
// - input: PushItemFlag() manipulates g.CurrentItemFlags, g.NextItemData.ItemFlags, ItemAdd() calls may add extra flags too.
1193b4be Poul Sander 2025-02-03 21:28 966
// - output: stored in g.LastItemData.ItemFlags
1193b4be Poul Sander 2025-02-03 21:28 967
enum ImGuiItemFlagsPrivate_
1193b4be Poul Sander 2025-02-03 21:28 968
{
1193b4be Poul Sander 2025-02-03 21:28 969
    // Controlled by user
1193b4be Poul Sander 2025-02-03 21:28 970
    ImGuiItemFlags_Disabled                 = 1 << 10, // false     // Disable interactions (DOES NOT affect visuals. DO NOT mix direct use of this with BeginDisabled(). See BeginDisabled()/EndDisabled() for full disable feature, and github #211).
1193b4be Poul Sander 2025-02-03 21:28 971
    ImGuiItemFlags_ReadOnly                 = 1 << 11, // false     // [ALPHA] Allow hovering interactions but underlying value is not changed.
1193b4be Poul Sander 2025-02-03 21:28 972
    ImGuiItemFlags_MixedValue               = 1 << 12, // false     // [BETA] Represent a mixed/indeterminate value, generally multi-selection where values differ. Currently only supported by Checkbox() (later should support all sorts of widgets)
1193b4be Poul Sander 2025-02-03 21:28 973
    ImGuiItemFlags_NoWindowHoverableCheck   = 1 << 13, // false     // Disable hoverable check in ItemHoverable()
1193b4be Poul Sander 2025-02-03 21:28 974
    ImGuiItemFlags_AllowOverlap             = 1 << 14, // false     // Allow being overlapped by another widget. Not-hovered to Hovered transition deferred by a frame.
1193b4be Poul Sander 2025-02-03 21:28 975
    ImGuiItemFlags_NoNavDisableMouseHover   = 1 << 15, // false     // Nav keyboard/gamepad mode doesn't disable hover highlight (behave as if NavHighlightItemUnderNav==false).
1193b4be Poul Sander 2025-02-03 21:28 976
    ImGuiItemFlags_NoMarkEdited             = 1 << 16, // false     // Skip calling MarkItemEdited()
4e9e2555 Poul Sander 2025-10-05 10:15 977
    ImGuiItemFlags_NoFocus                  = 1 << 17, // false     // [EXPERIMENTAL: Not very well specced] Clicking doesn't take focus. Automatically sets ImGuiButtonFlags_NoFocus + ImGuiButtonFlags_NoNavFocus in ButtonBehavior().
1193b4be Poul Sander 2025-02-03 21:28 978
1193b4be Poul Sander 2025-02-03 21:28 979
    // Controlled by widget code
1193b4be Poul Sander 2025-02-03 21:28 980
    ImGuiItemFlags_Inputable                = 1 << 20, // false     // [WIP] Auto-activate input mode when tab focused. Currently only used and supported by a few items before it becomes a generic feature.
1193b4be Poul Sander 2025-02-03 21:28 981
    ImGuiItemFlags_HasSelectionUserData     = 1 << 21, // false     // Set by SetNextItemSelectionUserData()
1193b4be Poul Sander 2025-02-03 21:28 982
    ImGuiItemFlags_IsMultiSelect            = 1 << 22, // false     // Set by SetNextItemSelectionUserData()
1193b4be Poul Sander 2025-02-03 21:28 983
1193b4be Poul Sander 2025-02-03 21:28 984
    ImGuiItemFlags_Default_                 = ImGuiItemFlags_AutoClosePopups,    // Please don't change, use PushItemFlag() instead.
1193b4be Poul Sander 2025-02-03 21:28 985
1193b4be Poul Sander 2025-02-03 21:28 986
    // Obsolete
1193b4be Poul Sander 2025-02-03 21:28 987
    //ImGuiItemFlags_SelectableDontClosePopup = !ImGuiItemFlags_AutoClosePopups, // Can't have a redirect as we inverted the behavior
1193b4be Poul Sander 2025-02-03 21:28 988
};
1193b4be Poul Sander 2025-02-03 21:28 989
1193b4be Poul Sander 2025-02-03 21:28 990
// Status flags for an already submitted item
1193b4be Poul Sander 2025-02-03 21:28 991
// - output: stored in g.LastItemData.StatusFlags
1193b4be Poul Sander 2025-02-03 21:28 992
enum ImGuiItemStatusFlags_
1193b4be Poul Sander 2025-02-03 21:28 993
{
1193b4be Poul Sander 2025-02-03 21:28 994
    ImGuiItemStatusFlags_None               = 0,
1193b4be Poul Sander 2025-02-03 21:28 995
    ImGuiItemStatusFlags_HoveredRect        = 1 << 0,   // Mouse position is within item rectangle (does NOT mean that the window is in correct z-order and can be hovered!, this is only one part of the most-common IsItemHovered test)
1193b4be Poul Sander 2025-02-03 21:28 996
    ImGuiItemStatusFlags_HasDisplayRect     = 1 << 1,   // g.LastItemData.DisplayRect is valid
1193b4be Poul Sander 2025-02-03 21:28 997
    ImGuiItemStatusFlags_Edited             = 1 << 2,   // Value exposed by item was edited in the current frame (should match the bool return value of most widgets)
1193b4be Poul Sander 2025-02-03 21:28 998
    ImGuiItemStatusFlags_ToggledSelection   = 1 << 3,   // Set when Selectable(), TreeNode() reports toggling a selection. We can't report "Selected", only state changes, in order to easily handle clipping with less issues.
1193b4be Poul Sander 2025-02-03 21:28 999
    ImGuiItemStatusFlags_ToggledOpen        = 1 << 4,   // Set when TreeNode() reports toggling their open state.
1193b4be Poul Sander 2025-02-03 21:28 1000
    ImGuiItemStatusFlags_HasDeactivated     = 1 << 5,   // Set if the widget/group is able to provide data for the ImGuiItemStatusFlags_Deactivated flag.
1193b4be Poul Sander 2025-02-03 21:28 1001
    ImGuiItemStatusFlags_Deactivated        = 1 << 6,   // Only valid if ImGuiItemStatusFlags_HasDeactivated is set.
1193b4be Poul Sander 2025-02-03 21:28 1002
    ImGuiItemStatusFlags_HoveredWindow      = 1 << 7,   // Override the HoveredWindow test to allow cross-window hover testing.
1193b4be Poul Sander 2025-02-03 21:28 1003
    ImGuiItemStatusFlags_Visible            = 1 << 8,   // [WIP] Set when item is overlapping the current clipping rectangle (Used internally. Please don't use yet: API/system will change as we refactor Itemadd()).
1193b4be Poul Sander 2025-02-03 21:28 1004
    ImGuiItemStatusFlags_HasClipRect        = 1 << 9,   // g.LastItemData.ClipRect is valid.
1193b4be Poul Sander 2025-02-03 21:28 1005
    ImGuiItemStatusFlags_HasShortcut        = 1 << 10,  // g.LastItemData.Shortcut valid. Set by SetNextItemShortcut() -> ItemAdd().
4e9e2555 Poul Sander 2025-10-05 10:15 1006
    //ImGuiItemStatusFlags_FocusedByTabbing = 1 << 8,   // Removed IN 1.90.1 (Dec 2023). The trigger is part of g.NavActivateId. See commit 54c1bdeceb.
1193b4be Poul Sander 2025-02-03 21:28 1007
1193b4be Poul Sander 2025-02-03 21:28 1008
    // Additional status + semantic for ImGuiTestEngine
1193b4be Poul Sander 2025-02-03 21:28 1009
#ifdef IMGUI_ENABLE_TEST_ENGINE
1193b4be Poul Sander 2025-02-03 21:28 1010
    ImGuiItemStatusFlags_Openable           = 1 << 20,  // Item is an openable (e.g. TreeNode)
1193b4be Poul Sander 2025-02-03 21:28 1011
    ImGuiItemStatusFlags_Opened             = 1 << 21,  // Opened status
1193b4be Poul Sander 2025-02-03 21:28 1012
    ImGuiItemStatusFlags_Checkable          = 1 << 22,  // Item is a checkable (e.g. CheckBox, MenuItem)
1193b4be Poul Sander 2025-02-03 21:28 1013
    ImGuiItemStatusFlags_Checked            = 1 << 23,  // Checked status
1193b4be Poul Sander 2025-02-03 21:28 1014
    ImGuiItemStatusFlags_Inputable          = 1 << 24,  // Item is a text-inputable (e.g. InputText, SliderXXX, DragXXX)
1193b4be Poul Sander 2025-02-03 21:28 1015
#endif
1193b4be Poul Sander 2025-02-03 21:28 1016
};
1193b4be Poul Sander 2025-02-03 21:28 1017
1193b4be Poul Sander 2025-02-03 21:28 1018
// Extend ImGuiHoveredFlags_
1193b4be Poul Sander 2025-02-03 21:28 1019
enum ImGuiHoveredFlagsPrivate_
1193b4be Poul Sander 2025-02-03 21:28 1020
{
1193b4be Poul Sander 2025-02-03 21:28 1021
    ImGuiHoveredFlags_DelayMask_                    = ImGuiHoveredFlags_DelayNone | ImGuiHoveredFlags_DelayShort | ImGuiHoveredFlags_DelayNormal | ImGuiHoveredFlags_NoSharedDelay,
1193b4be Poul Sander 2025-02-03 21:28 1022
    ImGuiHoveredFlags_AllowedMaskForIsWindowHovered = ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_AnyWindow | ImGuiHoveredFlags_NoPopupHierarchy | ImGuiHoveredFlags_DockHierarchy | ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem | ImGuiHoveredFlags_ForTooltip | ImGuiHoveredFlags_Stationary,
1193b4be Poul Sander 2025-02-03 21:28 1023
    ImGuiHoveredFlags_AllowedMaskForIsItemHovered   = ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem | ImGuiHoveredFlags_AllowWhenOverlapped | ImGuiHoveredFlags_AllowWhenDisabled | ImGuiHoveredFlags_NoNavOverride | ImGuiHoveredFlags_ForTooltip | ImGuiHoveredFlags_Stationary | ImGuiHoveredFlags_DelayMask_,
1193b4be Poul Sander 2025-02-03 21:28 1024
};
1193b4be Poul Sander 2025-02-03 21:28 1025
1193b4be Poul Sander 2025-02-03 21:28 1026
// Extend ImGuiInputTextFlags_
1193b4be Poul Sander 2025-02-03 21:28 1027
enum ImGuiInputTextFlagsPrivate_
1193b4be Poul Sander 2025-02-03 21:28 1028
{
1193b4be Poul Sander 2025-02-03 21:28 1029
    // [Internal]
1193b4be Poul Sander 2025-02-03 21:28 1030
    ImGuiInputTextFlags_Multiline           = 1 << 26,  // For internal use by InputTextMultiline()
1193b4be Poul Sander 2025-02-03 21:28 1031
    ImGuiInputTextFlags_MergedItem          = 1 << 27,  // For internal use by TempInputText(), will skip calling ItemAdd(). Require bounding-box to strictly match.
1193b4be Poul Sander 2025-02-03 21:28 1032
    ImGuiInputTextFlags_LocalizeDecimalPoint= 1 << 28,  // For internal use by InputScalar() and TempInputScalar()
1193b4be Poul Sander 2025-02-03 21:28 1033
};
1193b4be Poul Sander 2025-02-03 21:28 1034
1193b4be Poul Sander 2025-02-03 21:28 1035
// Extend ImGuiButtonFlags_
1193b4be Poul Sander 2025-02-03 21:28 1036
enum ImGuiButtonFlagsPrivate_
1193b4be Poul Sander 2025-02-03 21:28 1037
{
1193b4be Poul Sander 2025-02-03 21:28 1038
    ImGuiButtonFlags_PressedOnClick         = 1 << 4,   // return true on click (mouse down event)
1193b4be Poul Sander 2025-02-03 21:28 1039
    ImGuiButtonFlags_PressedOnClickRelease  = 1 << 5,   // [Default] return true on click + release on same item <-- this is what the majority of Button are using
1193b4be Poul Sander 2025-02-03 21:28 1040
    ImGuiButtonFlags_PressedOnClickReleaseAnywhere = 1 << 6, // return true on click + release even if the release event is not done while hovering the item
1193b4be Poul Sander 2025-02-03 21:28 1041
    ImGuiButtonFlags_PressedOnRelease       = 1 << 7,   // return true on release (default requires click+release)
1193b4be Poul Sander 2025-02-03 21:28 1042
    ImGuiButtonFlags_PressedOnDoubleClick   = 1 << 8,   // return true on double-click (default requires click+release)
1193b4be Poul Sander 2025-02-03 21:28 1043
    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)
4e9e2555 Poul Sander 2025-10-05 10:15 1044
    //ImGuiButtonFlags_Repeat               = 1 << 10,  // hold to repeat -> use ImGuiItemFlags_ButtonRepeat instead.
1193b4be Poul Sander 2025-02-03 21:28 1045
    ImGuiButtonFlags_FlattenChildren        = 1 << 11,  // allow interactions even if a child window is overlapping
1193b4be Poul Sander 2025-02-03 21:28 1046
    ImGuiButtonFlags_AllowOverlap           = 1 << 12,  // require previous frame HoveredId to either match id or be null before being usable.
1193b4be Poul Sander 2025-02-03 21:28 1047
    //ImGuiButtonFlags_DontClosePopups      = 1 << 13,  // disable automatically closing parent popup on press
1193b4be Poul Sander 2025-02-03 21:28 1048
    //ImGuiButtonFlags_Disabled             = 1 << 14,  // disable interactions -> use BeginDisabled() or ImGuiItemFlags_Disabled
1193b4be Poul Sander 2025-02-03 21:28 1049
    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
1193b4be Poul Sander 2025-02-03 21:28 1050
    ImGuiButtonFlags_NoKeyModsAllowed       = 1 << 16,  // disable mouse interaction if a key modifier is held
1193b4be Poul Sander 2025-02-03 21:28 1051
    ImGuiButtonFlags_NoHoldingActiveId      = 1 << 17,  // don't set ActiveId while holding the mouse (ImGuiButtonFlags_PressedOnClick only)
1193b4be Poul Sander 2025-02-03 21:28 1052
    ImGuiButtonFlags_NoNavFocus             = 1 << 18,  // don't override navigation focus when activated (FIXME: this is essentially used every time an item uses ImGuiItemFlags_NoNav, but because legacy specs don't requires LastItemData to be set ButtonBehavior(), we can't poll g.LastItemData.ItemFlags)
1193b4be Poul Sander 2025-02-03 21:28 1053
    ImGuiButtonFlags_NoHoveredOnFocus       = 1 << 19,  // don't report as hovered when nav focus is on this item
1193b4be Poul Sander 2025-02-03 21:28 1054
    ImGuiButtonFlags_NoSetKeyOwner          = 1 << 20,  // don't set key/input owner on the initial click (note: mouse buttons are keys! often, the key in question will be ImGuiKey_MouseLeft!)
1193b4be Poul Sander 2025-02-03 21:28 1055
    ImGuiButtonFlags_NoTestKeyOwner         = 1 << 21,  // don't test key/input owner when polling the key (note: mouse buttons are keys! often, the key in question will be ImGuiKey_MouseLeft!)
4e9e2555 Poul Sander 2025-10-05 10:15 1056
    ImGuiButtonFlags_NoFocus                = 1 << 22,  // [EXPERIMENTAL: Not very well specced]. Don't focus parent window when clicking.
1193b4be Poul Sander 2025-02-03 21:28 1057
    ImGuiButtonFlags_PressedOnMask_         = ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnClickReleaseAnywhere | ImGuiButtonFlags_PressedOnRelease | ImGuiButtonFlags_PressedOnDoubleClick | ImGuiButtonFlags_PressedOnDragDropHold,
1193b4be Poul Sander 2025-02-03 21:28 1058
    ImGuiButtonFlags_PressedOnDefault_      = ImGuiButtonFlags_PressedOnClickRelease,
4e9e2555 Poul Sander 2025-10-05 10:15 1059
    //ImGuiButtonFlags_NoKeyModifiers       = ImGuiButtonFlags_NoKeyModsAllowed, // Renamed in 1.91.4
1193b4be Poul Sander 2025-02-03 21:28 1060
};
1193b4be Poul Sander 2025-02-03 21:28 1061
1193b4be Poul Sander 2025-02-03 21:28 1062
// Extend ImGuiComboFlags_
1193b4be Poul Sander 2025-02-03 21:28 1063
enum ImGuiComboFlagsPrivate_
1193b4be Poul Sander 2025-02-03 21:28 1064
{
1193b4be Poul Sander 2025-02-03 21:28 1065
    ImGuiComboFlags_CustomPreview           = 1 << 20,  // enable BeginComboPreview()
1193b4be Poul Sander 2025-02-03 21:28 1066
};
1193b4be Poul Sander 2025-02-03 21:28 1067
1193b4be Poul Sander 2025-02-03 21:28 1068
// Extend ImGuiSliderFlags_
1193b4be Poul Sander 2025-02-03 21:28 1069
enum ImGuiSliderFlagsPrivate_
1193b4be Poul Sander 2025-02-03 21:28 1070
{
1193b4be Poul Sander 2025-02-03 21:28 1071
    ImGuiSliderFlags_Vertical               = 1 << 20,  // Should this slider be orientated vertically?
1193b4be Poul Sander 2025-02-03 21:28 1072
    ImGuiSliderFlags_ReadOnly               = 1 << 21,  // Consider using g.NextItemData.ItemFlags |= ImGuiItemFlags_ReadOnly instead.
1193b4be Poul Sander 2025-02-03 21:28 1073
};
1193b4be Poul Sander 2025-02-03 21:28 1074
1193b4be Poul Sander 2025-02-03 21:28 1075
// Extend ImGuiSelectableFlags_
1193b4be Poul Sander 2025-02-03 21:28 1076
enum ImGuiSelectableFlagsPrivate_
1193b4be Poul Sander 2025-02-03 21:28 1077
{
1193b4be Poul Sander 2025-02-03 21:28 1078
    // NB: need to be in sync with last value of ImGuiSelectableFlags_
1193b4be Poul Sander 2025-02-03 21:28 1079
    ImGuiSelectableFlags_NoHoldingActiveID      = 1 << 20,
1193b4be Poul Sander 2025-02-03 21:28 1080
    ImGuiSelectableFlags_SelectOnClick          = 1 << 22,  // Override button behavior to react on Click (default is Click+Release)
1193b4be Poul Sander 2025-02-03 21:28 1081
    ImGuiSelectableFlags_SelectOnRelease        = 1 << 23,  // Override button behavior to react on Release (default is Click+Release)
1193b4be Poul Sander 2025-02-03 21:28 1082
    ImGuiSelectableFlags_SpanAvailWidth         = 1 << 24,  // Span all avail width even if we declared less for layout purpose. FIXME: We may be able to remove this (added in 6251d379, 2bcafc86 for menus)
1193b4be Poul Sander 2025-02-03 21:28 1083
    ImGuiSelectableFlags_SetNavIdOnHover        = 1 << 25,  // Set Nav/Focus ID on mouse hover (used by MenuItem)
1193b4be Poul Sander 2025-02-03 21:28 1084
    ImGuiSelectableFlags_NoPadWithHalfSpacing   = 1 << 26,  // Disable padding each side with ItemSpacing * 0.5f
1193b4be Poul Sander 2025-02-03 21:28 1085
    ImGuiSelectableFlags_NoSetKeyOwner          = 1 << 27,  // Don't set key/input owner on the initial click (note: mouse buttons are keys! often, the key in question will be ImGuiKey_MouseLeft!)
1193b4be Poul Sander 2025-02-03 21:28 1086
};
1193b4be Poul Sander 2025-02-03 21:28 1087
1193b4be Poul Sander 2025-02-03 21:28 1088
// Extend ImGuiTreeNodeFlags_
1193b4be Poul Sander 2025-02-03 21:28 1089
enum ImGuiTreeNodeFlagsPrivate_
1193b4be Poul Sander 2025-02-03 21:28 1090
{
4e9e2555 Poul Sander 2025-10-05 10:15 1091
    ImGuiTreeNodeFlags_NoNavFocus                 = 1 << 27,// Don't claim nav focus when interacting with this item (#8551)
1193b4be Poul Sander 2025-02-03 21:28 1092
    ImGuiTreeNodeFlags_ClipLabelForTrailingButton = 1 << 28,// FIXME-WIP: Hard-coded for CollapsingHeader()
1193b4be Poul Sander 2025-02-03 21:28 1093
    ImGuiTreeNodeFlags_UpsideDownArrow            = 1 << 29,// FIXME-WIP: Turn Down arrow into an Up arrow, for reversed trees (#6517)
1193b4be Poul Sander 2025-02-03 21:28 1094
    ImGuiTreeNodeFlags_OpenOnMask_                = ImGuiTreeNodeFlags_OpenOnDoubleClick | ImGuiTreeNodeFlags_OpenOnArrow,
4e9e2555 Poul Sander 2025-10-05 10:15 1095
    ImGuiTreeNodeFlags_DrawLinesMask_             = ImGuiTreeNodeFlags_DrawLinesNone | ImGuiTreeNodeFlags_DrawLinesFull | ImGuiTreeNodeFlags_DrawLinesToNodes,
1193b4be Poul Sander 2025-02-03 21:28 1096
};
1193b4be Poul Sander 2025-02-03 21:28 1097
1193b4be Poul Sander 2025-02-03 21:28 1098
enum ImGuiSeparatorFlags_
1193b4be Poul Sander 2025-02-03 21:28 1099
{
1193b4be Poul Sander 2025-02-03 21:28 1100
    ImGuiSeparatorFlags_None                    = 0,
1193b4be Poul Sander 2025-02-03 21:28 1101
    ImGuiSeparatorFlags_Horizontal              = 1 << 0,   // Axis default to current layout type, so generally Horizontal unless e.g. in a menu bar
1193b4be Poul Sander 2025-02-03 21:28 1102
    ImGuiSeparatorFlags_Vertical                = 1 << 1,
1193b4be Poul Sander 2025-02-03 21:28 1103
    ImGuiSeparatorFlags_SpanAllColumns          = 1 << 2,   // Make separator cover all columns of a legacy Columns() set.
1193b4be Poul Sander 2025-02-03 21:28 1104
};
1193b4be Poul Sander 2025-02-03 21:28 1105
1193b4be Poul Sander 2025-02-03 21:28 1106
// Flags for FocusWindow(). This is not called ImGuiFocusFlags to avoid confusion with public-facing ImGuiFocusedFlags.
1193b4be Poul Sander 2025-02-03 21:28 1107
// FIXME: Once we finishing replacing more uses of GetTopMostPopupModal()+IsWindowWithinBeginStackOf()
1193b4be Poul Sander 2025-02-03 21:28 1108
// and FindBlockingModal() with this, we may want to change the flag to be opt-out instead of opt-in.
1193b4be Poul Sander 2025-02-03 21:28 1109
enum ImGuiFocusRequestFlags_
1193b4be Poul Sander 2025-02-03 21:28 1110
{
1193b4be Poul Sander 2025-02-03 21:28 1111
    ImGuiFocusRequestFlags_None                 = 0,
1193b4be Poul Sander 2025-02-03 21:28 1112
    ImGuiFocusRequestFlags_RestoreFocusedChild  = 1 << 0,   // Find last focused child (if any) and focus it instead.
1193b4be Poul Sander 2025-02-03 21:28 1113
    ImGuiFocusRequestFlags_UnlessBelowModal     = 1 << 1,   // Do not set focus if the window is below a modal.
1193b4be Poul Sander 2025-02-03 21:28 1114
};
1193b4be Poul Sander 2025-02-03 21:28 1115
1193b4be Poul Sander 2025-02-03 21:28 1116
enum ImGuiTextFlags_
1193b4be Poul Sander 2025-02-03 21:28 1117
{
1193b4be Poul Sander 2025-02-03 21:28 1118
    ImGuiTextFlags_None                         = 0,
1193b4be Poul Sander 2025-02-03 21:28 1119
    ImGuiTextFlags_NoWidthForLargeClippedText   = 1 << 0,
1193b4be Poul Sander 2025-02-03 21:28 1120
};
1193b4be Poul Sander 2025-02-03 21:28 1121
1193b4be Poul Sander 2025-02-03 21:28 1122
enum ImGuiTooltipFlags_
1193b4be Poul Sander 2025-02-03 21:28 1123
{
1193b4be Poul Sander 2025-02-03 21:28 1124
    ImGuiTooltipFlags_None                      = 0,
1193b4be Poul Sander 2025-02-03 21:28 1125
    ImGuiTooltipFlags_OverridePrevious          = 1 << 1,   // Clear/ignore previously submitted tooltip (defaults to append)
1193b4be Poul Sander 2025-02-03 21:28 1126
};
1193b4be Poul Sander 2025-02-03 21:28 1127
1193b4be Poul Sander 2025-02-03 21:28 1128
// FIXME: this is in development, not exposed/functional as a generic feature yet.
1193b4be Poul Sander 2025-02-03 21:28 1129
// Horizontal/Vertical enums are fixed to 0/1 so they may be used to index ImVec2
1193b4be Poul Sander 2025-02-03 21:28 1130
enum ImGuiLayoutType_
1193b4be Poul Sander 2025-02-03 21:28 1131
{
1193b4be Poul Sander 2025-02-03 21:28 1132
    ImGuiLayoutType_Horizontal = 0,
1193b4be Poul Sander 2025-02-03 21:28 1133
    ImGuiLayoutType_Vertical = 1
1193b4be Poul Sander 2025-02-03 21:28 1134
};
1193b4be Poul Sander 2025-02-03 21:28 1135
4e9e2555 Poul Sander 2025-10-05 10:15 1136
// Flags for LogBegin() text capturing function
4e9e2555 Poul Sander 2025-10-05 10:15 1137
enum ImGuiLogFlags_
1193b4be Poul Sander 2025-02-03 21:28 1138
{
4e9e2555 Poul Sander 2025-10-05 10:15 1139
    ImGuiLogFlags_None = 0,
4e9e2555 Poul Sander 2025-10-05 10:15 1140
4e9e2555 Poul Sander 2025-10-05 10:15 1141
    ImGuiLogFlags_OutputTTY         = 1 << 0,
4e9e2555 Poul Sander 2025-10-05 10:15 1142
    ImGuiLogFlags_OutputFile        = 1 << 1,
4e9e2555 Poul Sander 2025-10-05 10:15 1143
    ImGuiLogFlags_OutputBuffer      = 1 << 2,
4e9e2555 Poul Sander 2025-10-05 10:15 1144
    ImGuiLogFlags_OutputClipboard   = 1 << 3,
4e9e2555 Poul Sander 2025-10-05 10:15 1145
    ImGuiLogFlags_OutputMask_       = ImGuiLogFlags_OutputTTY | ImGuiLogFlags_OutputFile | ImGuiLogFlags_OutputBuffer | ImGuiLogFlags_OutputClipboard,
1193b4be Poul Sander 2025-02-03 21:28 1146
};
1193b4be Poul Sander 2025-02-03 21:28 1147
1193b4be Poul Sander 2025-02-03 21:28 1148
// X/Y enums are fixed to 0/1 so they may be used to index ImVec2
1193b4be Poul Sander 2025-02-03 21:28 1149
enum ImGuiAxis
1193b4be Poul Sander 2025-02-03 21:28 1150
{
1193b4be Poul Sander 2025-02-03 21:28 1151
    ImGuiAxis_None = -1,
1193b4be Poul Sander 2025-02-03 21:28 1152
    ImGuiAxis_X = 0,
1193b4be Poul Sander 2025-02-03 21:28 1153
    ImGuiAxis_Y = 1
1193b4be Poul Sander 2025-02-03 21:28 1154
};
1193b4be Poul Sander 2025-02-03 21:28 1155
1193b4be Poul Sander 2025-02-03 21:28 1156
enum ImGuiPlotType
1193b4be Poul Sander 2025-02-03 21:28 1157
{
1193b4be Poul Sander 2025-02-03 21:28 1158
    ImGuiPlotType_Lines,
1193b4be Poul Sander 2025-02-03 21:28 1159
    ImGuiPlotType_Histogram,
1193b4be Poul Sander 2025-02-03 21:28 1160
};
1193b4be Poul Sander 2025-02-03 21:28 1161
1193b4be Poul Sander 2025-02-03 21:28 1162
// Storage data for BeginComboPreview()/EndComboPreview()
1193b4be Poul Sander 2025-02-03 21:28 1163
struct IMGUI_API ImGuiComboPreviewData
1193b4be Poul Sander 2025-02-03 21:28 1164
{
1193b4be Poul Sander 2025-02-03 21:28 1165
    ImRect          PreviewRect;
1193b4be Poul Sander 2025-02-03 21:28 1166
    ImVec2          BackupCursorPos;
1193b4be Poul Sander 2025-02-03 21:28 1167
    ImVec2          BackupCursorMaxPos;
1193b4be Poul Sander 2025-02-03 21:28 1168
    ImVec2          BackupCursorPosPrevLine;
1193b4be Poul Sander 2025-02-03 21:28 1169
    float           BackupPrevLineTextBaseOffset;
1193b4be Poul Sander 2025-02-03 21:28 1170
    ImGuiLayoutType BackupLayout;
1193b4be Poul Sander 2025-02-03 21:28 1171
1193b4be Poul Sander 2025-02-03 21:28 1172
    ImGuiComboPreviewData() { memset(this, 0, sizeof(*this)); }
1193b4be Poul Sander 2025-02-03 21:28 1173
};
1193b4be Poul Sander 2025-02-03 21:28 1174
1193b4be Poul Sander 2025-02-03 21:28 1175
// Stacked storage data for BeginGroup()/EndGroup()
1193b4be Poul Sander 2025-02-03 21:28 1176
struct IMGUI_API ImGuiGroupData
1193b4be Poul Sander 2025-02-03 21:28 1177
{
1193b4be Poul Sander 2025-02-03 21:28 1178
    ImGuiID     WindowID;
1193b4be Poul Sander 2025-02-03 21:28 1179
    ImVec2      BackupCursorPos;
1193b4be Poul Sander 2025-02-03 21:28 1180
    ImVec2      BackupCursorMaxPos;
1193b4be Poul Sander 2025-02-03 21:28 1181
    ImVec2      BackupCursorPosPrevLine;
1193b4be Poul Sander 2025-02-03 21:28 1182
    ImVec1      BackupIndent;
1193b4be Poul Sander 2025-02-03 21:28 1183
    ImVec1      BackupGroupOffset;
1193b4be Poul Sander 2025-02-03 21:28 1184
    ImVec2      BackupCurrLineSize;
1193b4be Poul Sander 2025-02-03 21:28 1185
    float       BackupCurrLineTextBaseOffset;
1193b4be Poul Sander 2025-02-03 21:28 1186
    ImGuiID     BackupActiveIdIsAlive;
4e9e2555 Poul Sander 2025-10-05 10:15 1187
    bool        BackupDeactivatedIdIsAlive;
1193b4be Poul Sander 2025-02-03 21:28 1188
    bool        BackupHoveredIdIsAlive;
1193b4be Poul Sander 2025-02-03 21:28 1189
    bool        BackupIsSameLine;
1193b4be Poul Sander 2025-02-03 21:28 1190
    bool        EmitItem;
1193b4be Poul Sander 2025-02-03 21:28 1191
};
1193b4be Poul Sander 2025-02-03 21:28 1192
1193b4be Poul Sander 2025-02-03 21:28 1193
// Simple column measurement, currently used for MenuItem() only.. This is very short-sighted/throw-away code and NOT a generic helper.
1193b4be Poul Sander 2025-02-03 21:28 1194
struct IMGUI_API ImGuiMenuColumns
1193b4be Poul Sander 2025-02-03 21:28 1195
{
1193b4be Poul Sander 2025-02-03 21:28 1196
    ImU32       TotalWidth;
1193b4be Poul Sander 2025-02-03 21:28 1197
    ImU32       NextTotalWidth;
1193b4be Poul Sander 2025-02-03 21:28 1198
    ImU16       Spacing;
1193b4be Poul Sander 2025-02-03 21:28 1199
    ImU16       OffsetIcon;         // Always zero for now
1193b4be Poul Sander 2025-02-03 21:28 1200
    ImU16       OffsetLabel;        // Offsets are locked in Update()
1193b4be Poul Sander 2025-02-03 21:28 1201
    ImU16       OffsetShortcut;
1193b4be Poul Sander 2025-02-03 21:28 1202
    ImU16       OffsetMark;
1193b4be Poul Sander 2025-02-03 21:28 1203
    ImU16       Widths[4];          // Width of:   Icon, Label, Shortcut, Mark  (accumulators for current frame)
1193b4be Poul Sander 2025-02-03 21:28 1204
1193b4be Poul Sander 2025-02-03 21:28 1205
    ImGuiMenuColumns() { memset(this, 0, sizeof(*this)); }
1193b4be Poul Sander 2025-02-03 21:28 1206
    void        Update(float spacing, bool window_reappearing);
1193b4be Poul Sander 2025-02-03 21:28 1207
    float       DeclColumns(float w_icon, float w_label, float w_shortcut, float w_mark);
1193b4be Poul Sander 2025-02-03 21:28 1208
    void        CalcNextTotalWidth(bool update_offsets);
1193b4be Poul Sander 2025-02-03 21:28 1209
};
1193b4be Poul Sander 2025-02-03 21:28 1210
1193b4be Poul Sander 2025-02-03 21:28 1211
// Internal temporary state for deactivating InputText() instances.
1193b4be Poul Sander 2025-02-03 21:28 1212
struct IMGUI_API ImGuiInputTextDeactivatedState
1193b4be Poul Sander 2025-02-03 21:28 1213
{
1193b4be Poul Sander 2025-02-03 21:28 1214
    ImGuiID            ID;              // widget id owning the text state (which just got deactivated)
1193b4be Poul Sander 2025-02-03 21:28 1215
    ImVector<char>     TextA;           // text buffer
1193b4be Poul Sander 2025-02-03 21:28 1216
1193b4be Poul Sander 2025-02-03 21:28 1217
    ImGuiInputTextDeactivatedState()    { memset(this, 0, sizeof(*this)); }
1193b4be Poul Sander 2025-02-03 21:28 1218
    void    ClearFreeMemory()           { ID = 0; TextA.clear(); }
1193b4be Poul Sander 2025-02-03 21:28 1219
};
1193b4be Poul Sander 2025-02-03 21:28 1220
1193b4be Poul Sander 2025-02-03 21:28 1221
// Forward declare imstb_textedit.h structure + make its main configuration define accessible
1193b4be Poul Sander 2025-02-03 21:28 1222
#undef IMSTB_TEXTEDIT_STRING
1193b4be Poul Sander 2025-02-03 21:28 1223
#undef IMSTB_TEXTEDIT_CHARTYPE
1193b4be Poul Sander 2025-02-03 21:28 1224
#define IMSTB_TEXTEDIT_STRING             ImGuiInputTextState
1193b4be Poul Sander 2025-02-03 21:28 1225
#define IMSTB_TEXTEDIT_CHARTYPE           char
1193b4be Poul Sander 2025-02-03 21:28 1226
#define IMSTB_TEXTEDIT_GETWIDTH_NEWLINE   (-1.0f)
1193b4be Poul Sander 2025-02-03 21:28 1227
#define IMSTB_TEXTEDIT_UNDOSTATECOUNT     99
1193b4be Poul Sander 2025-02-03 21:28 1228
#define IMSTB_TEXTEDIT_UNDOCHARCOUNT      999
1193b4be Poul Sander 2025-02-03 21:28 1229
namespace ImStb { struct STB_TexteditState; }
1193b4be Poul Sander 2025-02-03 21:28 1230
typedef ImStb::STB_TexteditState ImStbTexteditState;
1193b4be Poul Sander 2025-02-03 21:28 1231
1193b4be Poul Sander 2025-02-03 21:28 1232
// Internal state of the currently focused/edited text input box
1193b4be Poul Sander 2025-02-03 21:28 1233
// For a given item ID, access with ImGui::GetInputTextState()
1193b4be Poul Sander 2025-02-03 21:28 1234
struct IMGUI_API ImGuiInputTextState
1193b4be Poul Sander 2025-02-03 21:28 1235
{
1193b4be Poul Sander 2025-02-03 21:28 1236
    ImGuiContext*           Ctx;                    // parent UI context (needs to be set explicitly by parent).
1193b4be Poul Sander 2025-02-03 21:28 1237
    ImStbTexteditState*     Stb;                    // State for stb_textedit.h
4e9e2555 Poul Sander 2025-10-05 10:15 1238
    ImGuiInputTextFlags     Flags;                  // copy of InputText() flags. may be used to check if e.g. ImGuiInputTextFlags_Password is set.
1193b4be Poul Sander 2025-02-03 21:28 1239
    ImGuiID                 ID;                     // widget id owning the text state
4e9e2555 Poul Sander 2025-10-05 10:15 1240
    int                     TextLen;                // UTF-8 length of the string in TextA (in bytes)
4e9e2555 Poul Sander 2025-10-05 10:15 1241
    const char*             TextSrc;                // == TextA.Data unless read-only, in which case == buf passed to InputText(). Field only set and valid _inside_ the call InputText() call.
4e9e2555 Poul Sander 2025-10-05 10:15 1242
    ImVector<char>          TextA;                  // main UTF8 buffer. TextA.Size is a buffer size! Should always be >= buf_size passed by user (and of course >= CurLenA + 1).
4e9e2555 Poul Sander 2025-10-05 10:15 1243
    ImVector<char>          TextToRevertTo;         // value to revert to when pressing Escape = backup of end-user buffer at the time of focus (in UTF-8, unaltered)
1193b4be Poul Sander 2025-02-03 21:28 1244
    ImVector<char>          CallbackTextBackup;     // temporary storage for callback to support automatic reconcile of undo-stack
4e9e2555 Poul Sander 2025-10-05 10:15 1245
    int                     BufCapacity;            // end-user buffer capacity (include zero terminator)
1193b4be Poul Sander 2025-02-03 21:28 1246
    ImVec2                  Scroll;                 // horizontal offset (managed manually) + vertical scrolling (pulled from child window's own Scroll.y)
4e9e2555 Poul Sander 2025-10-05 10:15 1247
    int                     LineCount;              // last line count (solely for debugging)
4e9e2555 Poul Sander 2025-10-05 10:15 1248
    float                   WrapWidth;              // word-wrapping width
1193b4be Poul Sander 2025-02-03 21:28 1249
    float                   CursorAnim;             // timer for cursor blink, reset on every user action so the cursor reappears immediately
1193b4be Poul Sander 2025-02-03 21:28 1250
    bool                    CursorFollow;           // set when we want scrolling to follow the current cursor position (not always!)
4e9e2555 Poul Sander 2025-10-05 10:15 1251
    bool                    CursorCenterY;          // set when we want scrolling to be centered over the cursor position (while resizing a word-wrapping field)
1193b4be Poul Sander 2025-02-03 21:28 1252
    bool                    SelectedAllMouseLock;   // after a double-click to select all, we ignore further mouse drags to update selection
1193b4be Poul Sander 2025-02-03 21:28 1253
    bool                    Edited;                 // edited this frame
4e9e2555 Poul Sander 2025-10-05 10:15 1254
    bool                    WantReloadUserBuf;      // force a reload of user buf so it may be modified externally. may be automatic in future version.
4e9e2555 Poul Sander 2025-10-05 10:15 1255
    ImS8                    LastMoveDirectionLR;    // ImGuiDir_Left or ImGuiDir_Right. track last movement direction so when cursor cross over a word-wrapping boundaries we can display it on either line depending on last move.s
4e9e2555 Poul Sander 2025-10-05 10:15 1256
    int                     ReloadSelectionStart;
1193b4be Poul Sander 2025-02-03 21:28 1257
    int                     ReloadSelectionEnd;
1193b4be Poul Sander 2025-02-03 21:28 1258
1193b4be Poul Sander 2025-02-03 21:28 1259
    ImGuiInputTextState();
1193b4be Poul Sander 2025-02-03 21:28 1260
    ~ImGuiInputTextState();
4e9e2555 Poul Sander 2025-10-05 10:15 1261
    void        ClearText()                 { TextLen = 0; TextA[0] = 0; CursorClamp(); }
4e9e2555 Poul Sander 2025-10-05 10:15 1262
    void        ClearFreeMemory()           { TextA.clear(); TextToRevertTo.clear(); }
1193b4be Poul Sander 2025-02-03 21:28 1263
    void        OnKeyPressed(int key);      // Cannot be inline because we call in code in stb_textedit.h implementation
1193b4be Poul Sander 2025-02-03 21:28 1264
    void        OnCharPressed(unsigned int c);
4e9e2555 Poul Sander 2025-10-05 10:15 1265
    float       GetPreferredOffsetX() const;
1193b4be Poul Sander 2025-02-03 21:28 1266
1193b4be Poul Sander 2025-02-03 21:28 1267
    // Cursor & Selection
1193b4be Poul Sander 2025-02-03 21:28 1268
    void        CursorAnimReset();
1193b4be Poul Sander 2025-02-03 21:28 1269
    void        CursorClamp();
1193b4be Poul Sander 2025-02-03 21:28 1270
    bool        HasSelection() const;
1193b4be Poul Sander 2025-02-03 21:28 1271
    void        ClearSelection();
1193b4be Poul Sander 2025-02-03 21:28 1272
    int         GetCursorPos() const;
1193b4be Poul Sander 2025-02-03 21:28 1273
    int         GetSelectionStart() const;
1193b4be Poul Sander 2025-02-03 21:28 1274
    int         GetSelectionEnd() const;
1193b4be Poul Sander 2025-02-03 21:28 1275
    void        SelectAll();
1193b4be Poul Sander 2025-02-03 21:28 1276
1193b4be Poul Sander 2025-02-03 21:28 1277
    // Reload user buf (WIP #2890)
1193b4be Poul Sander 2025-02-03 21:28 1278
    // If you modify underlying user-passed const char* while active you need to call this (InputText V2 may lift this)
1193b4be Poul Sander 2025-02-03 21:28 1279
    //   strcpy(my_buf, "hello");
1193b4be Poul Sander 2025-02-03 21:28 1280
    //   if (ImGuiInputTextState* state = ImGui::GetInputTextState(id)) // id may be ImGui::GetItemID() is last item
1193b4be Poul Sander 2025-02-03 21:28 1281
    //       state->ReloadUserBufAndSelectAll();
1193b4be Poul Sander 2025-02-03 21:28 1282
    void        ReloadUserBufAndSelectAll();
1193b4be Poul Sander 2025-02-03 21:28 1283
    void        ReloadUserBufAndKeepSelection();
1193b4be Poul Sander 2025-02-03 21:28 1284
    void        ReloadUserBufAndMoveToEnd();
1193b4be Poul Sander 2025-02-03 21:28 1285
};
1193b4be Poul Sander 2025-02-03 21:28 1286
1193b4be Poul Sander 2025-02-03 21:28 1287
enum ImGuiWindowRefreshFlags_
1193b4be Poul Sander 2025-02-03 21:28 1288
{
1193b4be Poul Sander 2025-02-03 21:28 1289
    ImGuiWindowRefreshFlags_None                = 0,
1193b4be Poul Sander 2025-02-03 21:28 1290
    ImGuiWindowRefreshFlags_TryToAvoidRefresh   = 1 << 0,   // [EXPERIMENTAL] Try to keep existing contents, USER MUST NOT HONOR BEGIN() RETURNING FALSE AND NOT APPEND.
1193b4be Poul Sander 2025-02-03 21:28 1291
    ImGuiWindowRefreshFlags_RefreshOnHover      = 1 << 1,   // [EXPERIMENTAL] Always refresh on hover
1193b4be Poul Sander 2025-02-03 21:28 1292
    ImGuiWindowRefreshFlags_RefreshOnFocus      = 1 << 2,   // [EXPERIMENTAL] Always refresh on focus
1193b4be Poul Sander 2025-02-03 21:28 1293
    // Refresh policy/frequency, Load Balancing etc.
1193b4be Poul Sander 2025-02-03 21:28 1294
};
1193b4be Poul Sander 2025-02-03 21:28 1295
1193b4be Poul Sander 2025-02-03 21:28 1296
enum ImGuiNextWindowDataFlags_
1193b4be Poul Sander 2025-02-03 21:28 1297
{
1193b4be Poul Sander 2025-02-03 21:28 1298
    ImGuiNextWindowDataFlags_None               = 0,
1193b4be Poul Sander 2025-02-03 21:28 1299
    ImGuiNextWindowDataFlags_HasPos             = 1 << 0,
1193b4be Poul Sander 2025-02-03 21:28 1300
    ImGuiNextWindowDataFlags_HasSize            = 1 << 1,
1193b4be Poul Sander 2025-02-03 21:28 1301
    ImGuiNextWindowDataFlags_HasContentSize     = 1 << 2,
1193b4be Poul Sander 2025-02-03 21:28 1302
    ImGuiNextWindowDataFlags_HasCollapsed       = 1 << 3,
1193b4be Poul Sander 2025-02-03 21:28 1303
    ImGuiNextWindowDataFlags_HasSizeConstraint  = 1 << 4,
1193b4be Poul Sander 2025-02-03 21:28 1304
    ImGuiNextWindowDataFlags_HasFocus           = 1 << 5,
1193b4be Poul Sander 2025-02-03 21:28 1305
    ImGuiNextWindowDataFlags_HasBgAlpha         = 1 << 6,
1193b4be Poul Sander 2025-02-03 21:28 1306
    ImGuiNextWindowDataFlags_HasScroll          = 1 << 7,
4e9e2555 Poul Sander 2025-10-05 10:15 1307
    ImGuiNextWindowDataFlags_HasWindowFlags     = 1 << 8,
4e9e2555 Poul Sander 2025-10-05 10:15 1308
    ImGuiNextWindowDataFlags_HasChildFlags      = 1 << 9,
4e9e2555 Poul Sander 2025-10-05 10:15 1309
    ImGuiNextWindowDataFlags_HasRefreshPolicy   = 1 << 10,
4e9e2555 Poul Sander 2025-10-05 10:15 1310
    ImGuiNextWindowDataFlags_HasViewport        = 1 << 11,
4e9e2555 Poul Sander 2025-10-05 10:15 1311
    ImGuiNextWindowDataFlags_HasDock            = 1 << 12,
4e9e2555 Poul Sander 2025-10-05 10:15 1312
    ImGuiNextWindowDataFlags_HasWindowClass     = 1 << 13,
1193b4be Poul Sander 2025-02-03 21:28 1313
};
1193b4be Poul Sander 2025-02-03 21:28 1314
1193b4be Poul Sander 2025-02-03 21:28 1315
// Storage for SetNexWindow** functions
1193b4be Poul Sander 2025-02-03 21:28 1316
struct ImGuiNextWindowData
1193b4be Poul Sander 2025-02-03 21:28 1317
{
4e9e2555 Poul Sander 2025-10-05 10:15 1318
    ImGuiNextWindowDataFlags    HasFlags;
4e9e2555 Poul Sander 2025-10-05 10:15 1319
4e9e2555 Poul Sander 2025-10-05 10:15 1320
    // Members below are NOT cleared. Always rely on HasFlags.
1193b4be Poul Sander 2025-02-03 21:28 1321
    ImGuiCond                   PosCond;
1193b4be Poul Sander 2025-02-03 21:28 1322
    ImGuiCond                   SizeCond;
1193b4be Poul Sander 2025-02-03 21:28 1323
    ImGuiCond                   CollapsedCond;
1193b4be Poul Sander 2025-02-03 21:28 1324
    ImGuiCond                   DockCond;
1193b4be Poul Sander 2025-02-03 21:28 1325
    ImVec2                      PosVal;
1193b4be Poul Sander 2025-02-03 21:28 1326
    ImVec2                      PosPivotVal;
1193b4be Poul Sander 2025-02-03 21:28 1327
    ImVec2                      SizeVal;
1193b4be Poul Sander 2025-02-03 21:28 1328
    ImVec2                      ContentSizeVal;
1193b4be Poul Sander 2025-02-03 21:28 1329
    ImVec2                      ScrollVal;
4e9e2555 Poul Sander 2025-10-05 10:15 1330
    ImGuiWindowFlags            WindowFlags;            // Only honored by BeginTable()
1193b4be Poul Sander 2025-02-03 21:28 1331
    ImGuiChildFlags             ChildFlags;
1193b4be Poul Sander 2025-02-03 21:28 1332
    bool                        PosUndock;
1193b4be Poul Sander 2025-02-03 21:28 1333
    bool                        CollapsedVal;
1193b4be Poul Sander 2025-02-03 21:28 1334
    ImRect                      SizeConstraintRect;
1193b4be Poul Sander 2025-02-03 21:28 1335
    ImGuiSizeCallback           SizeCallback;
1193b4be Poul Sander 2025-02-03 21:28 1336
    void*                       SizeCallbackUserData;
1193b4be Poul Sander 2025-02-03 21:28 1337
    float                       BgAlphaVal;             // Override background alpha
1193b4be Poul Sander 2025-02-03 21:28 1338
    ImGuiID                     ViewportId;
1193b4be Poul Sander 2025-02-03 21:28 1339
    ImGuiID                     DockId;
1193b4be Poul Sander 2025-02-03 21:28 1340
    ImGuiWindowClass            WindowClass;
1193b4be Poul Sander 2025-02-03 21:28 1341
    ImVec2                      MenuBarOffsetMinVal;    // (Always on) This is not exposed publicly, so we don't clear it and it doesn't have a corresponding flag (could we? for consistency?)
1193b4be Poul Sander 2025-02-03 21:28 1342
    ImGuiWindowRefreshFlags     RefreshFlagsVal;
1193b4be Poul Sander 2025-02-03 21:28 1343
1193b4be Poul Sander 2025-02-03 21:28 1344
    ImGuiNextWindowData()       { memset(this, 0, sizeof(*this)); }
4e9e2555 Poul Sander 2025-10-05 10:15 1345
    inline void ClearFlags()    { HasFlags = ImGuiNextWindowDataFlags_None; }
1193b4be Poul Sander 2025-02-03 21:28 1346
};
1193b4be Poul Sander 2025-02-03 21:28 1347
1193b4be Poul Sander 2025-02-03 21:28 1348
enum ImGuiNextItemDataFlags_
1193b4be Poul Sander 2025-02-03 21:28 1349
{
1193b4be Poul Sander 2025-02-03 21:28 1350
    ImGuiNextItemDataFlags_None         = 0,
1193b4be Poul Sander 2025-02-03 21:28 1351
    ImGuiNextItemDataFlags_HasWidth     = 1 << 0,
1193b4be Poul Sander 2025-02-03 21:28 1352
    ImGuiNextItemDataFlags_HasOpen      = 1 << 1,
1193b4be Poul Sander 2025-02-03 21:28 1353
    ImGuiNextItemDataFlags_HasShortcut  = 1 << 2,
1193b4be Poul Sander 2025-02-03 21:28 1354
    ImGuiNextItemDataFlags_HasRefVal    = 1 << 3,
1193b4be Poul Sander 2025-02-03 21:28 1355
    ImGuiNextItemDataFlags_HasStorageID = 1 << 4,
1193b4be Poul Sander 2025-02-03 21:28 1356
};
1193b4be Poul Sander 2025-02-03 21:28 1357
1193b4be Poul Sander 2025-02-03 21:28 1358
struct ImGuiNextItemData
1193b4be Poul Sander 2025-02-03 21:28 1359
{
1193b4be Poul Sander 2025-02-03 21:28 1360
    ImGuiNextItemDataFlags      HasFlags;           // Called HasFlags instead of Flags to avoid mistaking this
1193b4be Poul Sander 2025-02-03 21:28 1361
    ImGuiItemFlags              ItemFlags;          // Currently only tested/used for ImGuiItemFlags_AllowOverlap and ImGuiItemFlags_HasSelectionUserData.
4e9e2555 Poul Sander 2025-10-05 10:15 1362
4e9e2555 Poul Sander 2025-10-05 10:15 1363
    // Members below are NOT cleared by ItemAdd() meaning they are still valid during e.g. NavProcessItem(). Always rely on HasFlags.
1193b4be Poul Sander 2025-02-03 21:28 1364
    ImGuiID                     FocusScopeId;       // Set by SetNextItemSelectionUserData()
1193b4be Poul Sander 2025-02-03 21:28 1365
    ImGuiSelectionUserData      SelectionUserData;  // Set by SetNextItemSelectionUserData() (note that NULL/0 is a valid value, we use -1 == ImGuiSelectionUserData_Invalid to mark invalid values)
1193b4be Poul Sander 2025-02-03 21:28 1366
    float                       Width;              // Set by SetNextItemWidth()
1193b4be Poul Sander 2025-02-03 21:28 1367
    ImGuiKeyChord               Shortcut;           // Set by SetNextItemShortcut()
1193b4be Poul Sander 2025-02-03 21:28 1368
    ImGuiInputFlags             ShortcutFlags;      // Set by SetNextItemShortcut()
1193b4be Poul Sander 2025-02-03 21:28 1369
    bool                        OpenVal;            // Set by SetNextItemOpen()
1193b4be Poul Sander 2025-02-03 21:28 1370
    ImU8                        OpenCond;           // Set by SetNextItemOpen()
1193b4be Poul Sander 2025-02-03 21:28 1371
    ImGuiDataTypeStorage        RefVal;             // Not exposed yet, for ImGuiInputTextFlags_ParseEmptyAsRefVal
1193b4be Poul Sander 2025-02-03 21:28 1372
    ImGuiID                     StorageId;          // Set by SetNextItemStorageID()
1193b4be Poul Sander 2025-02-03 21:28 1373
1193b4be Poul Sander 2025-02-03 21:28 1374
    ImGuiNextItemData()         { memset(this, 0, sizeof(*this)); SelectionUserData = -1; }
1193b4be Poul Sander 2025-02-03 21:28 1375
    inline void ClearFlags()    { HasFlags = ImGuiNextItemDataFlags_None; ItemFlags = ImGuiItemFlags_None; } // Also cleared manually by ItemAdd()!
1193b4be Poul Sander 2025-02-03 21:28 1376
};
1193b4be Poul Sander 2025-02-03 21:28 1377
1193b4be Poul Sander 2025-02-03 21:28 1378
// Status storage for the last submitted item
1193b4be Poul Sander 2025-02-03 21:28 1379
struct ImGuiLastItemData
1193b4be Poul Sander 2025-02-03 21:28 1380
{
1193b4be Poul Sander 2025-02-03 21:28 1381
    ImGuiID                 ID;
4e9e2555 Poul Sander 2025-10-05 10:15 1382
    ImGuiItemFlags          ItemFlags;          // See ImGuiItemFlags_ (called 'InFlags' before v1.91.4).
1193b4be Poul Sander 2025-02-03 21:28 1383
    ImGuiItemStatusFlags    StatusFlags;        // See ImGuiItemStatusFlags_
1193b4be Poul Sander 2025-02-03 21:28 1384
    ImRect                  Rect;               // Full rectangle
1193b4be Poul Sander 2025-02-03 21:28 1385
    ImRect                  NavRect;            // Navigation scoring rectangle (not displayed)
4e9e2555 Poul Sander 2025-10-05 10:15 1386
    // Rarely used fields are not explicitly cleared, only valid when the corresponding ImGuiItemStatusFlags are set.
1193b4be Poul Sander 2025-02-03 21:28 1387
    ImRect                  DisplayRect;        // Display rectangle. ONLY VALID IF (StatusFlags & ImGuiItemStatusFlags_HasDisplayRect) is set.
1193b4be Poul Sander 2025-02-03 21:28 1388
    ImRect                  ClipRect;           // Clip rectangle at the time of submitting item. ONLY VALID IF (StatusFlags & ImGuiItemStatusFlags_HasClipRect) is set..
1193b4be Poul Sander 2025-02-03 21:28 1389
    ImGuiKeyChord           Shortcut;           // Shortcut at the time of submitting item. ONLY VALID IF (StatusFlags & ImGuiItemStatusFlags_HasShortcut) is set..
1193b4be Poul Sander 2025-02-03 21:28 1390
1193b4be Poul Sander 2025-02-03 21:28 1391
    ImGuiLastItemData()     { memset(this, 0, sizeof(*this)); }
1193b4be Poul Sander 2025-02-03 21:28 1392
};
1193b4be Poul Sander 2025-02-03 21:28 1393
1193b4be Poul Sander 2025-02-03 21:28 1394
// Store data emitted by TreeNode() for usage by TreePop()
4e9e2555 Poul Sander 2025-10-05 10:15 1395
// - To implement ImGuiTreeNodeFlags_NavLeftJumpsToParent: store the minimum amount of data
1193b4be Poul Sander 2025-02-03 21:28 1396
//   which we can't infer in TreePop(), to perform the equivalent of NavApplyItemToResult().
1193b4be Poul Sander 2025-02-03 21:28 1397
//   Only stored when the node is a potential candidate for landing on a Left arrow jump.
1193b4be Poul Sander 2025-02-03 21:28 1398
struct ImGuiTreeNodeStackData
1193b4be Poul Sander 2025-02-03 21:28 1399
{
1193b4be Poul Sander 2025-02-03 21:28 1400
    ImGuiID                 ID;
1193b4be Poul Sander 2025-02-03 21:28 1401
    ImGuiTreeNodeFlags      TreeFlags;
4e9e2555 Poul Sander 2025-10-05 10:15 1402
    ImGuiItemFlags          ItemFlags;      // Used for nav landing
4e9e2555 Poul Sander 2025-10-05 10:15 1403
    ImRect                  NavRect;        // Used for nav landing
4e9e2555 Poul Sander 2025-10-05 10:15 1404
    float                   DrawLinesX1;
4e9e2555 Poul Sander 2025-10-05 10:15 1405
    float                   DrawLinesToNodesY2;
4e9e2555 Poul Sander 2025-10-05 10:15 1406
    ImGuiTableColumnIdx     DrawLinesTableColumn;
1193b4be Poul Sander 2025-02-03 21:28 1407
};
1193b4be Poul Sander 2025-02-03 21:28 1408
1193b4be Poul Sander 2025-02-03 21:28 1409
// sizeof() = 20
1193b4be Poul Sander 2025-02-03 21:28 1410
struct IMGUI_API ImGuiErrorRecoveryState
1193b4be Poul Sander 2025-02-03 21:28 1411
{
1193b4be Poul Sander 2025-02-03 21:28 1412
    short   SizeOfWindowStack;
1193b4be Poul Sander 2025-02-03 21:28 1413
    short   SizeOfIDStack;
1193b4be Poul Sander 2025-02-03 21:28 1414
    short   SizeOfTreeStack;
1193b4be Poul Sander 2025-02-03 21:28 1415
    short   SizeOfColorStack;
1193b4be Poul Sander 2025-02-03 21:28 1416
    short   SizeOfStyleVarStack;
1193b4be Poul Sander 2025-02-03 21:28 1417
    short   SizeOfFontStack;
1193b4be Poul Sander 2025-02-03 21:28 1418
    short   SizeOfFocusScopeStack;
1193b4be Poul Sander 2025-02-03 21:28 1419
    short   SizeOfGroupStack;
1193b4be Poul Sander 2025-02-03 21:28 1420
    short   SizeOfItemFlagsStack;
1193b4be Poul Sander 2025-02-03 21:28 1421
    short   SizeOfBeginPopupStack;
1193b4be Poul Sander 2025-02-03 21:28 1422
    short   SizeOfDisabledStack;
1193b4be Poul Sander 2025-02-03 21:28 1423
1193b4be Poul Sander 2025-02-03 21:28 1424
    ImGuiErrorRecoveryState() { memset(this, 0, sizeof(*this)); }
1193b4be Poul Sander 2025-02-03 21:28 1425
};
1193b4be Poul Sander 2025-02-03 21:28 1426
1193b4be Poul Sander 2025-02-03 21:28 1427
// Data saved for each window pushed into the stack
1193b4be Poul Sander 2025-02-03 21:28 1428
struct ImGuiWindowStackData
1193b4be Poul Sander 2025-02-03 21:28 1429
{
1193b4be Poul Sander 2025-02-03 21:28 1430
    ImGuiWindow*            Window;
1193b4be Poul Sander 2025-02-03 21:28 1431
    ImGuiLastItemData       ParentLastItemDataBackup;
1193b4be Poul Sander 2025-02-03 21:28 1432
    ImGuiErrorRecoveryState StackSizesInBegin;          // Store size of various stacks for asserting
1193b4be Poul Sander 2025-02-03 21:28 1433
    bool                    DisabledOverrideReenable;   // Non-child window override disabled flag
4e9e2555 Poul Sander 2025-10-05 10:15 1434
    float                   DisabledOverrideReenableAlphaBackup;
1193b4be Poul Sander 2025-02-03 21:28 1435
};
1193b4be Poul Sander 2025-02-03 21:28 1436
1193b4be Poul Sander 2025-02-03 21:28 1437
struct ImGuiShrinkWidthItem
1193b4be Poul Sander 2025-02-03 21:28 1438
{
1193b4be Poul Sander 2025-02-03 21:28 1439
    int         Index;
1193b4be Poul Sander 2025-02-03 21:28 1440
    float       Width;
1193b4be Poul Sander 2025-02-03 21:28 1441
    float       InitialWidth;
1193b4be Poul Sander 2025-02-03 21:28 1442
};
1193b4be Poul Sander 2025-02-03 21:28 1443
1193b4be Poul Sander 2025-02-03 21:28 1444
struct ImGuiPtrOrIndex
1193b4be Poul Sander 2025-02-03 21:28 1445
{
1193b4be Poul Sander 2025-02-03 21:28 1446
    void*       Ptr;            // Either field can be set, not both. e.g. Dock node tab bars are loose while BeginTabBar() ones are in a pool.
1193b4be Poul Sander 2025-02-03 21:28 1447
    int         Index;          // Usually index in a main pool.
1193b4be Poul Sander 2025-02-03 21:28 1448
1193b4be Poul Sander 2025-02-03 21:28 1449
    ImGuiPtrOrIndex(void* ptr)  { Ptr = ptr; Index = -1; }
1193b4be Poul Sander 2025-02-03 21:28 1450
    ImGuiPtrOrIndex(int index)  { Ptr = NULL; Index = index; }
1193b4be Poul Sander 2025-02-03 21:28 1451
};
1193b4be Poul Sander 2025-02-03 21:28 1452
4e9e2555 Poul Sander 2025-10-05 10:15 1453
// Data used by IsItemDeactivated()/IsItemDeactivatedAfterEdit() functions
4e9e2555 Poul Sander 2025-10-05 10:15 1454
struct ImGuiDeactivatedItemData
4e9e2555 Poul Sander 2025-10-05 10:15 1455
{
4e9e2555 Poul Sander 2025-10-05 10:15 1456
    ImGuiID     ID;
4e9e2555 Poul Sander 2025-10-05 10:15 1457
    int         ElapseFrame;
4e9e2555 Poul Sander 2025-10-05 10:15 1458
    bool        HasBeenEditedBefore;
4e9e2555 Poul Sander 2025-10-05 10:15 1459
    bool        IsAlive;
4e9e2555 Poul Sander 2025-10-05 10:15 1460
};
4e9e2555 Poul Sander 2025-10-05 10:15 1461
1193b4be Poul Sander 2025-02-03 21:28 1462
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 1463
// [SECTION] Popup support
1193b4be Poul Sander 2025-02-03 21:28 1464
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 1465
1193b4be Poul Sander 2025-02-03 21:28 1466
enum ImGuiPopupPositionPolicy
1193b4be Poul Sander 2025-02-03 21:28 1467
{
1193b4be Poul Sander 2025-02-03 21:28 1468
    ImGuiPopupPositionPolicy_Default,
1193b4be Poul Sander 2025-02-03 21:28 1469
    ImGuiPopupPositionPolicy_ComboBox,
1193b4be Poul Sander 2025-02-03 21:28 1470
    ImGuiPopupPositionPolicy_Tooltip,
1193b4be Poul Sander 2025-02-03 21:28 1471
};
1193b4be Poul Sander 2025-02-03 21:28 1472
1193b4be Poul Sander 2025-02-03 21:28 1473
// Storage for popup stacks (g.OpenPopupStack and g.BeginPopupStack)
1193b4be Poul Sander 2025-02-03 21:28 1474
struct ImGuiPopupData
1193b4be Poul Sander 2025-02-03 21:28 1475
{
1193b4be Poul Sander 2025-02-03 21:28 1476
    ImGuiID             PopupId;        // Set on OpenPopup()
1193b4be Poul Sander 2025-02-03 21:28 1477
    ImGuiWindow*        Window;         // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup()
1193b4be Poul Sander 2025-02-03 21:28 1478
    ImGuiWindow*        RestoreNavWindow;// Set on OpenPopup(), a NavWindow that will be restored on popup close
1193b4be Poul Sander 2025-02-03 21:28 1479
    int                 ParentNavLayer; // Resolved on BeginPopup(). Actually a ImGuiNavLayer type (declared down below), initialized to -1 which is not part of an enum, but serves well-enough as "not any of layers" value
1193b4be Poul Sander 2025-02-03 21:28 1480
    int                 OpenFrameCount; // Set on OpenPopup()
1193b4be Poul Sander 2025-02-03 21:28 1481
    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)
1193b4be Poul Sander 2025-02-03 21:28 1482
    ImVec2              OpenPopupPos;   // Set on OpenPopup(), preferred popup position (typically == OpenMousePos when using mouse)
1193b4be Poul Sander 2025-02-03 21:28 1483
    ImVec2              OpenMousePos;   // Set on OpenPopup(), copy of mouse position at the time of opening popup
1193b4be Poul Sander 2025-02-03 21:28 1484
1193b4be Poul Sander 2025-02-03 21:28 1485
    ImGuiPopupData()    { memset(this, 0, sizeof(*this)); ParentNavLayer = OpenFrameCount = -1; }
1193b4be Poul Sander 2025-02-03 21:28 1486
};
1193b4be Poul Sander 2025-02-03 21:28 1487
1193b4be Poul Sander 2025-02-03 21:28 1488
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 1489
// [SECTION] Inputs support
1193b4be Poul Sander 2025-02-03 21:28 1490
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 1491
1193b4be Poul Sander 2025-02-03 21:28 1492
// Bit array for named keys
1193b4be Poul Sander 2025-02-03 21:28 1493
typedef ImBitArray<ImGuiKey_NamedKey_COUNT, -ImGuiKey_NamedKey_BEGIN>    ImBitArrayForNamedKeys;
1193b4be Poul Sander 2025-02-03 21:28 1494
1193b4be Poul Sander 2025-02-03 21:28 1495
// [Internal] Key ranges
1193b4be Poul Sander 2025-02-03 21:28 1496
#define ImGuiKey_LegacyNativeKey_BEGIN  0
1193b4be Poul Sander 2025-02-03 21:28 1497
#define ImGuiKey_LegacyNativeKey_END    512
1193b4be Poul Sander 2025-02-03 21:28 1498
#define ImGuiKey_Keyboard_BEGIN         (ImGuiKey_NamedKey_BEGIN)
1193b4be Poul Sander 2025-02-03 21:28 1499
#define ImGuiKey_Keyboard_END           (ImGuiKey_GamepadStart)
1193b4be Poul Sander 2025-02-03 21:28 1500
#define ImGuiKey_Gamepad_BEGIN          (ImGuiKey_GamepadStart)
1193b4be Poul Sander 2025-02-03 21:28 1501
#define ImGuiKey_Gamepad_END            (ImGuiKey_GamepadRStickDown + 1)
1193b4be Poul Sander 2025-02-03 21:28 1502
#define ImGuiKey_Mouse_BEGIN            (ImGuiKey_MouseLeft)
1193b4be Poul Sander 2025-02-03 21:28 1503
#define ImGuiKey_Mouse_END              (ImGuiKey_MouseWheelY + 1)
1193b4be Poul Sander 2025-02-03 21:28 1504
#define ImGuiKey_Aliases_BEGIN          (ImGuiKey_Mouse_BEGIN)
1193b4be Poul Sander 2025-02-03 21:28 1505
#define ImGuiKey_Aliases_END            (ImGuiKey_Mouse_END)
1193b4be Poul Sander 2025-02-03 21:28 1506
1193b4be Poul Sander 2025-02-03 21:28 1507
// [Internal] Named shortcuts for Navigation
1193b4be Poul Sander 2025-02-03 21:28 1508
#define ImGuiKey_NavKeyboardTweakSlow   ImGuiMod_Ctrl
1193b4be Poul Sander 2025-02-03 21:28 1509
#define ImGuiKey_NavKeyboardTweakFast   ImGuiMod_Shift
1193b4be Poul Sander 2025-02-03 21:28 1510
#define ImGuiKey_NavGamepadTweakSlow    ImGuiKey_GamepadL1
1193b4be Poul Sander 2025-02-03 21:28 1511
#define ImGuiKey_NavGamepadTweakFast    ImGuiKey_GamepadR1
1193b4be Poul Sander 2025-02-03 21:28 1512
#define ImGuiKey_NavGamepadActivate     (g.IO.ConfigNavSwapGamepadButtons ? ImGuiKey_GamepadFaceRight : ImGuiKey_GamepadFaceDown)
1193b4be Poul Sander 2025-02-03 21:28 1513
#define ImGuiKey_NavGamepadCancel       (g.IO.ConfigNavSwapGamepadButtons ? ImGuiKey_GamepadFaceDown : ImGuiKey_GamepadFaceRight)
1193b4be Poul Sander 2025-02-03 21:28 1514
#define ImGuiKey_NavGamepadMenu         ImGuiKey_GamepadFaceLeft
1193b4be Poul Sander 2025-02-03 21:28 1515
#define ImGuiKey_NavGamepadInput        ImGuiKey_GamepadFaceUp
1193b4be Poul Sander 2025-02-03 21:28 1516
1193b4be Poul Sander 2025-02-03 21:28 1517
enum ImGuiInputEventType
1193b4be Poul Sander 2025-02-03 21:28 1518
{
1193b4be Poul Sander 2025-02-03 21:28 1519
    ImGuiInputEventType_None = 0,
1193b4be Poul Sander 2025-02-03 21:28 1520
    ImGuiInputEventType_MousePos,
1193b4be Poul Sander 2025-02-03 21:28 1521
    ImGuiInputEventType_MouseWheel,
1193b4be Poul Sander 2025-02-03 21:28 1522
    ImGuiInputEventType_MouseButton,
1193b4be Poul Sander 2025-02-03 21:28 1523
    ImGuiInputEventType_MouseViewport,
1193b4be Poul Sander 2025-02-03 21:28 1524
    ImGuiInputEventType_Key,
1193b4be Poul Sander 2025-02-03 21:28 1525
    ImGuiInputEventType_Text,
1193b4be Poul Sander 2025-02-03 21:28 1526
    ImGuiInputEventType_Focus,
1193b4be Poul Sander 2025-02-03 21:28 1527
    ImGuiInputEventType_COUNT
1193b4be Poul Sander 2025-02-03 21:28 1528
};
1193b4be Poul Sander 2025-02-03 21:28 1529
4e9e2555 Poul Sander 2025-10-05 10:15 1530
enum ImGuiInputSource : int
1193b4be Poul Sander 2025-02-03 21:28 1531
{
1193b4be Poul Sander 2025-02-03 21:28 1532
    ImGuiInputSource_None = 0,
1193b4be Poul Sander 2025-02-03 21:28 1533
    ImGuiInputSource_Mouse,         // Note: may be Mouse or TouchScreen or Pen. See io.MouseSource to distinguish them.
1193b4be Poul Sander 2025-02-03 21:28 1534
    ImGuiInputSource_Keyboard,
1193b4be Poul Sander 2025-02-03 21:28 1535
    ImGuiInputSource_Gamepad,
1193b4be Poul Sander 2025-02-03 21:28 1536
    ImGuiInputSource_COUNT
1193b4be Poul Sander 2025-02-03 21:28 1537
};
1193b4be Poul Sander 2025-02-03 21:28 1538
1193b4be Poul Sander 2025-02-03 21:28 1539
// FIXME: Structures in the union below need to be declared as anonymous unions appears to be an extension?
1193b4be Poul Sander 2025-02-03 21:28 1540
// Using ImVec2() would fail on Clang 'union member 'MousePos' has a non-trivial default constructor'
1193b4be Poul Sander 2025-02-03 21:28 1541
struct ImGuiInputEventMousePos      { float PosX, PosY; ImGuiMouseSource MouseSource; };
1193b4be Poul Sander 2025-02-03 21:28 1542
struct ImGuiInputEventMouseWheel    { float WheelX, WheelY; ImGuiMouseSource MouseSource; };
1193b4be Poul Sander 2025-02-03 21:28 1543
struct ImGuiInputEventMouseButton   { int Button; bool Down; ImGuiMouseSource MouseSource; };
1193b4be Poul Sander 2025-02-03 21:28 1544
struct ImGuiInputEventMouseViewport { ImGuiID HoveredViewportID; };
1193b4be Poul Sander 2025-02-03 21:28 1545
struct ImGuiInputEventKey           { ImGuiKey Key; bool Down; float AnalogValue; };
1193b4be Poul Sander 2025-02-03 21:28 1546
struct ImGuiInputEventText          { unsigned int Char; };
1193b4be Poul Sander 2025-02-03 21:28 1547
struct ImGuiInputEventAppFocused    { bool Focused; };
1193b4be Poul Sander 2025-02-03 21:28 1548
1193b4be Poul Sander 2025-02-03 21:28 1549
struct ImGuiInputEvent
1193b4be Poul Sander 2025-02-03 21:28 1550
{
1193b4be Poul Sander 2025-02-03 21:28 1551
    ImGuiInputEventType             Type;
1193b4be Poul Sander 2025-02-03 21:28 1552
    ImGuiInputSource                Source;
1193b4be Poul Sander 2025-02-03 21:28 1553
    ImU32                           EventId;        // Unique, sequential increasing integer to identify an event (if you need to correlate them to other data).
1193b4be Poul Sander 2025-02-03 21:28 1554
    union
1193b4be Poul Sander 2025-02-03 21:28 1555
    {
1193b4be Poul Sander 2025-02-03 21:28 1556
        ImGuiInputEventMousePos     MousePos;       // if Type == ImGuiInputEventType_MousePos
1193b4be Poul Sander 2025-02-03 21:28 1557
        ImGuiInputEventMouseWheel   MouseWheel;     // if Type == ImGuiInputEventType_MouseWheel
1193b4be Poul Sander 2025-02-03 21:28 1558
        ImGuiInputEventMouseButton  MouseButton;    // if Type == ImGuiInputEventType_MouseButton
1193b4be Poul Sander 2025-02-03 21:28 1559
        ImGuiInputEventMouseViewport MouseViewport; // if Type == ImGuiInputEventType_MouseViewport
1193b4be Poul Sander 2025-02-03 21:28 1560
        ImGuiInputEventKey          Key;            // if Type == ImGuiInputEventType_Key
1193b4be Poul Sander 2025-02-03 21:28 1561
        ImGuiInputEventText         Text;           // if Type == ImGuiInputEventType_Text
1193b4be Poul Sander 2025-02-03 21:28 1562
        ImGuiInputEventAppFocused   AppFocused;     // if Type == ImGuiInputEventType_Focus
1193b4be Poul Sander 2025-02-03 21:28 1563
    };
1193b4be Poul Sander 2025-02-03 21:28 1564
    bool                            AddedByTestEngine;
1193b4be Poul Sander 2025-02-03 21:28 1565
1193b4be Poul Sander 2025-02-03 21:28 1566
    ImGuiInputEvent() { memset(this, 0, sizeof(*this)); }
1193b4be Poul Sander 2025-02-03 21:28 1567
};
1193b4be Poul Sander 2025-02-03 21:28 1568
1193b4be Poul Sander 2025-02-03 21:28 1569
// Input function taking an 'ImGuiID owner_id' argument defaults to (ImGuiKeyOwner_Any == 0) aka don't test ownership, which matches legacy behavior.
1193b4be Poul Sander 2025-02-03 21:28 1570
#define ImGuiKeyOwner_Any           ((ImGuiID)0)    // Accept key that have an owner, UNLESS a call to SetKeyOwner() explicitly used ImGuiInputFlags_LockThisFrame or ImGuiInputFlags_LockUntilRelease.
1193b4be Poul Sander 2025-02-03 21:28 1571
#define ImGuiKeyOwner_NoOwner       ((ImGuiID)-1)   // Require key to have no owner.
1193b4be Poul Sander 2025-02-03 21:28 1572
//#define ImGuiKeyOwner_None ImGuiKeyOwner_NoOwner  // We previously called this 'ImGuiKeyOwner_None' but it was inconsistent with our pattern that _None values == 0 and quite dangerous. Also using _NoOwner makes the IsKeyPressed() calls more explicit.
1193b4be Poul Sander 2025-02-03 21:28 1573
1193b4be Poul Sander 2025-02-03 21:28 1574
typedef ImS16 ImGuiKeyRoutingIndex;
1193b4be Poul Sander 2025-02-03 21:28 1575
1193b4be Poul Sander 2025-02-03 21:28 1576
// Routing table entry (sizeof() == 16 bytes)
1193b4be Poul Sander 2025-02-03 21:28 1577
struct ImGuiKeyRoutingData
1193b4be Poul Sander 2025-02-03 21:28 1578
{
1193b4be Poul Sander 2025-02-03 21:28 1579
    ImGuiKeyRoutingIndex            NextEntryIndex;
1193b4be Poul Sander 2025-02-03 21:28 1580
    ImU16                           Mods;               // Technically we'd only need 4-bits but for simplify we store ImGuiMod_ values which need 16-bits.
1193b4be Poul Sander 2025-02-03 21:28 1581
    ImU8                            RoutingCurrScore;   // [DEBUG] For debug display
1193b4be Poul Sander 2025-02-03 21:28 1582
    ImU8                            RoutingNextScore;   // Lower is better (0: perfect score)
1193b4be Poul Sander 2025-02-03 21:28 1583
    ImGuiID                         RoutingCurr;
1193b4be Poul Sander 2025-02-03 21:28 1584
    ImGuiID                         RoutingNext;
1193b4be Poul Sander 2025-02-03 21:28 1585
1193b4be Poul Sander 2025-02-03 21:28 1586
    ImGuiKeyRoutingData()           { NextEntryIndex = -1; Mods = 0; RoutingCurrScore = RoutingNextScore = 255; RoutingCurr = RoutingNext = ImGuiKeyOwner_NoOwner; }
1193b4be Poul Sander 2025-02-03 21:28 1587
};
1193b4be Poul Sander 2025-02-03 21:28 1588
1193b4be Poul Sander 2025-02-03 21:28 1589
// Routing table: maintain a desired owner for each possible key-chord (key + mods), and setup owner in NewFrame() when mods are matching.
1193b4be Poul Sander 2025-02-03 21:28 1590
// Stored in main context (1 instance)
1193b4be Poul Sander 2025-02-03 21:28 1591
struct ImGuiKeyRoutingTable
1193b4be Poul Sander 2025-02-03 21:28 1592
{
1193b4be Poul Sander 2025-02-03 21:28 1593
    ImGuiKeyRoutingIndex            Index[ImGuiKey_NamedKey_COUNT]; // Index of first entry in Entries[]
1193b4be Poul Sander 2025-02-03 21:28 1594
    ImVector<ImGuiKeyRoutingData>   Entries;
1193b4be Poul Sander 2025-02-03 21:28 1595
    ImVector<ImGuiKeyRoutingData>   EntriesNext;                    // Double-buffer to avoid reallocation (could use a shared buffer)
1193b4be Poul Sander 2025-02-03 21:28 1596
1193b4be Poul Sander 2025-02-03 21:28 1597
    ImGuiKeyRoutingTable()          { Clear(); }
1193b4be Poul Sander 2025-02-03 21:28 1598
    void Clear()                    { for (int n = 0; n < IM_ARRAYSIZE(Index); n++) Index[n] = -1; Entries.clear(); EntriesNext.clear(); }
1193b4be Poul Sander 2025-02-03 21:28 1599
};
1193b4be Poul Sander 2025-02-03 21:28 1600
1193b4be Poul Sander 2025-02-03 21:28 1601
// This extends ImGuiKeyData but only for named keys (legacy keys don't support the new features)
1193b4be Poul Sander 2025-02-03 21:28 1602
// Stored in main context (1 per named key). In the future it might be merged into ImGuiKeyData.
1193b4be Poul Sander 2025-02-03 21:28 1603
struct ImGuiKeyOwnerData
1193b4be Poul Sander 2025-02-03 21:28 1604
{
1193b4be Poul Sander 2025-02-03 21:28 1605
    ImGuiID     OwnerCurr;
1193b4be Poul Sander 2025-02-03 21:28 1606
    ImGuiID     OwnerNext;
1193b4be Poul Sander 2025-02-03 21:28 1607
    bool        LockThisFrame;      // Reading this key requires explicit owner id (until end of frame). Set by ImGuiInputFlags_LockThisFrame.
1193b4be Poul Sander 2025-02-03 21:28 1608
    bool        LockUntilRelease;   // Reading this key requires explicit owner id (until key is released). Set by ImGuiInputFlags_LockUntilRelease. When this is true LockThisFrame is always true as well.
1193b4be Poul Sander 2025-02-03 21:28 1609
1193b4be Poul Sander 2025-02-03 21:28 1610
    ImGuiKeyOwnerData()             { OwnerCurr = OwnerNext = ImGuiKeyOwner_NoOwner; LockThisFrame = LockUntilRelease = false; }
1193b4be Poul Sander 2025-02-03 21:28 1611
};
1193b4be Poul Sander 2025-02-03 21:28 1612
1193b4be Poul Sander 2025-02-03 21:28 1613
// Extend ImGuiInputFlags_
1193b4be Poul Sander 2025-02-03 21:28 1614
// Flags for extended versions of IsKeyPressed(), IsMouseClicked(), Shortcut(), SetKeyOwner(), SetItemKeyOwner()
1193b4be Poul Sander 2025-02-03 21:28 1615
// Don't mistake with ImGuiInputTextFlags! (which is for ImGui::InputText() function)
1193b4be Poul Sander 2025-02-03 21:28 1616
enum ImGuiInputFlagsPrivate_
1193b4be Poul Sander 2025-02-03 21:28 1617
{
1193b4be Poul Sander 2025-02-03 21:28 1618
    // Flags for IsKeyPressed(), IsKeyChordPressed(), IsMouseClicked(), Shortcut()
1193b4be Poul Sander 2025-02-03 21:28 1619
    // - Repeat mode: Repeat rate selection
1193b4be Poul Sander 2025-02-03 21:28 1620
    ImGuiInputFlags_RepeatRateDefault           = 1 << 1,   // Repeat rate: Regular (default)
1193b4be Poul Sander 2025-02-03 21:28 1621
    ImGuiInputFlags_RepeatRateNavMove           = 1 << 2,   // Repeat rate: Fast
1193b4be Poul Sander 2025-02-03 21:28 1622
    ImGuiInputFlags_RepeatRateNavTweak          = 1 << 3,   // Repeat rate: Faster
1193b4be Poul Sander 2025-02-03 21:28 1623
    // - Repeat mode: Specify when repeating key pressed can be interrupted.
1193b4be Poul Sander 2025-02-03 21:28 1624
    // - In theory ImGuiInputFlags_RepeatUntilOtherKeyPress may be a desirable default, but it would break too many behavior so everything is opt-in.
1193b4be Poul Sander 2025-02-03 21:28 1625
    ImGuiInputFlags_RepeatUntilRelease          = 1 << 4,   // Stop repeating when released (default for all functions except Shortcut). This only exists to allow overriding Shortcut() default behavior.
1193b4be Poul Sander 2025-02-03 21:28 1626
    ImGuiInputFlags_RepeatUntilKeyModsChange    = 1 << 5,   // Stop repeating when released OR if keyboard mods are changed (default for Shortcut)
1193b4be Poul Sander 2025-02-03 21:28 1627
    ImGuiInputFlags_RepeatUntilKeyModsChangeFromNone = 1 << 6,  // Stop repeating when released OR if keyboard mods are leaving the None state. Allows going from Mod+Key to Key by releasing Mod.
1193b4be Poul Sander 2025-02-03 21:28 1628
    ImGuiInputFlags_RepeatUntilOtherKeyPress    = 1 << 7,   // Stop repeating when released OR if any other keyboard key is pressed during the repeat
1193b4be Poul Sander 2025-02-03 21:28 1629
1193b4be Poul Sander 2025-02-03 21:28 1630
    // Flags for SetKeyOwner(), SetItemKeyOwner()
1193b4be Poul Sander 2025-02-03 21:28 1631
    // - Locking key away from non-input aware code. Locking is useful to make input-owner-aware code steal keys from non-input-owner-aware code. If all code is input-owner-aware locking would never be necessary.
1193b4be Poul Sander 2025-02-03 21:28 1632
    ImGuiInputFlags_LockThisFrame               = 1 << 20,  // Further accesses to key data will require EXPLICIT owner ID (ImGuiKeyOwner_Any/0 will NOT accepted for polling). Cleared at end of frame.
1193b4be Poul Sander 2025-02-03 21:28 1633
    ImGuiInputFlags_LockUntilRelease            = 1 << 21,  // Further accesses to key data will require EXPLICIT owner ID (ImGuiKeyOwner_Any/0 will NOT accepted for polling). Cleared when the key is released or at end of each frame if key is released.
1193b4be Poul Sander 2025-02-03 21:28 1634
1193b4be Poul Sander 2025-02-03 21:28 1635
    // - Condition for SetItemKeyOwner()
1193b4be Poul Sander 2025-02-03 21:28 1636
    ImGuiInputFlags_CondHovered                 = 1 << 22,  // Only set if item is hovered (default to both)
1193b4be Poul Sander 2025-02-03 21:28 1637
    ImGuiInputFlags_CondActive                  = 1 << 23,  // Only set if item is active (default to both)
1193b4be Poul Sander 2025-02-03 21:28 1638
    ImGuiInputFlags_CondDefault_                = ImGuiInputFlags_CondHovered | ImGuiInputFlags_CondActive,
1193b4be Poul Sander 2025-02-03 21:28 1639
1193b4be Poul Sander 2025-02-03 21:28 1640
    // [Internal] Mask of which function support which flags
1193b4be Poul Sander 2025-02-03 21:28 1641
    ImGuiInputFlags_RepeatRateMask_             = ImGuiInputFlags_RepeatRateDefault | ImGuiInputFlags_RepeatRateNavMove | ImGuiInputFlags_RepeatRateNavTweak,
1193b4be Poul Sander 2025-02-03 21:28 1642
    ImGuiInputFlags_RepeatUntilMask_            = ImGuiInputFlags_RepeatUntilRelease | ImGuiInputFlags_RepeatUntilKeyModsChange | ImGuiInputFlags_RepeatUntilKeyModsChangeFromNone | ImGuiInputFlags_RepeatUntilOtherKeyPress,
1193b4be Poul Sander 2025-02-03 21:28 1643
    ImGuiInputFlags_RepeatMask_                 = ImGuiInputFlags_Repeat | ImGuiInputFlags_RepeatRateMask_ | ImGuiInputFlags_RepeatUntilMask_,
1193b4be Poul Sander 2025-02-03 21:28 1644
    ImGuiInputFlags_CondMask_                   = ImGuiInputFlags_CondHovered | ImGuiInputFlags_CondActive,
1193b4be Poul Sander 2025-02-03 21:28 1645
    ImGuiInputFlags_RouteTypeMask_              = ImGuiInputFlags_RouteActive | ImGuiInputFlags_RouteFocused | ImGuiInputFlags_RouteGlobal | ImGuiInputFlags_RouteAlways,
1193b4be Poul Sander 2025-02-03 21:28 1646
    ImGuiInputFlags_RouteOptionsMask_           = ImGuiInputFlags_RouteOverFocused | ImGuiInputFlags_RouteOverActive | ImGuiInputFlags_RouteUnlessBgFocused | ImGuiInputFlags_RouteFromRootWindow,
1193b4be Poul Sander 2025-02-03 21:28 1647
    ImGuiInputFlags_SupportedByIsKeyPressed     = ImGuiInputFlags_RepeatMask_,
1193b4be Poul Sander 2025-02-03 21:28 1648
    ImGuiInputFlags_SupportedByIsMouseClicked   = ImGuiInputFlags_Repeat,
1193b4be Poul Sander 2025-02-03 21:28 1649
    ImGuiInputFlags_SupportedByShortcut         = ImGuiInputFlags_RepeatMask_ | ImGuiInputFlags_RouteTypeMask_ | ImGuiInputFlags_RouteOptionsMask_,
1193b4be Poul Sander 2025-02-03 21:28 1650
    ImGuiInputFlags_SupportedBySetNextItemShortcut = ImGuiInputFlags_RepeatMask_ | ImGuiInputFlags_RouteTypeMask_ | ImGuiInputFlags_RouteOptionsMask_ | ImGuiInputFlags_Tooltip,
1193b4be Poul Sander 2025-02-03 21:28 1651
    ImGuiInputFlags_SupportedBySetKeyOwner      = ImGuiInputFlags_LockThisFrame | ImGuiInputFlags_LockUntilRelease,
1193b4be Poul Sander 2025-02-03 21:28 1652
    ImGuiInputFlags_SupportedBySetItemKeyOwner  = ImGuiInputFlags_SupportedBySetKeyOwner | ImGuiInputFlags_CondMask_,
1193b4be Poul Sander 2025-02-03 21:28 1653
};
1193b4be Poul Sander 2025-02-03 21:28 1654
1193b4be Poul Sander 2025-02-03 21:28 1655
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 1656
// [SECTION] Clipper support
1193b4be Poul Sander 2025-02-03 21:28 1657
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 1658
1193b4be Poul Sander 2025-02-03 21:28 1659
// Note that Max is exclusive, so perhaps should be using a Begin/End convention.
1193b4be Poul Sander 2025-02-03 21:28 1660
struct ImGuiListClipperRange
1193b4be Poul Sander 2025-02-03 21:28 1661
{
1193b4be Poul Sander 2025-02-03 21:28 1662
    int     Min;
1193b4be Poul Sander 2025-02-03 21:28 1663
    int     Max;
1193b4be Poul Sander 2025-02-03 21:28 1664
    bool    PosToIndexConvert;      // Begin/End are absolute position (will be converted to indices later)
1193b4be Poul Sander 2025-02-03 21:28 1665
    ImS8    PosToIndexOffsetMin;    // Add to Min after converting to indices
1193b4be Poul Sander 2025-02-03 21:28 1666
    ImS8    PosToIndexOffsetMax;    // Add to Min after converting to indices
1193b4be Poul Sander 2025-02-03 21:28 1667
1193b4be Poul Sander 2025-02-03 21:28 1668
    static ImGuiListClipperRange    FromIndices(int min, int max)                               { ImGuiListClipperRange r = { min, max, false, 0, 0 }; return r; }
1193b4be Poul Sander 2025-02-03 21:28 1669
    static ImGuiListClipperRange    FromPositions(float y1, float y2, int off_min, int off_max) { ImGuiListClipperRange r = { (int)y1, (int)y2, true, (ImS8)off_min, (ImS8)off_max }; return r; }
1193b4be Poul Sander 2025-02-03 21:28 1670
};
1193b4be Poul Sander 2025-02-03 21:28 1671
1193b4be Poul Sander 2025-02-03 21:28 1672
// Temporary clipper data, buffers shared/reused between instances
1193b4be Poul Sander 2025-02-03 21:28 1673
struct ImGuiListClipperData
1193b4be Poul Sander 2025-02-03 21:28 1674
{
1193b4be Poul Sander 2025-02-03 21:28 1675
    ImGuiListClipper*               ListClipper;
1193b4be Poul Sander 2025-02-03 21:28 1676
    float                           LossynessOffset;
1193b4be Poul Sander 2025-02-03 21:28 1677
    int                             StepNo;
1193b4be Poul Sander 2025-02-03 21:28 1678
    int                             ItemsFrozen;
1193b4be Poul Sander 2025-02-03 21:28 1679
    ImVector<ImGuiListClipperRange> Ranges;
1193b4be Poul Sander 2025-02-03 21:28 1680
1193b4be Poul Sander 2025-02-03 21:28 1681
    ImGuiListClipperData()          { memset(this, 0, sizeof(*this)); }
1193b4be Poul Sander 2025-02-03 21:28 1682
    void                            Reset(ImGuiListClipper* clipper) { ListClipper = clipper; StepNo = ItemsFrozen = 0; Ranges.resize(0); }
1193b4be Poul Sander 2025-02-03 21:28 1683
};
1193b4be Poul Sander 2025-02-03 21:28 1684
1193b4be Poul Sander 2025-02-03 21:28 1685
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 1686
// [SECTION] Navigation support
1193b4be Poul Sander 2025-02-03 21:28 1687
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 1688
1193b4be Poul Sander 2025-02-03 21:28 1689
enum ImGuiActivateFlags_
1193b4be Poul Sander 2025-02-03 21:28 1690
{
1193b4be Poul Sander 2025-02-03 21:28 1691
    ImGuiActivateFlags_None                 = 0,
1193b4be Poul Sander 2025-02-03 21:28 1692
    ImGuiActivateFlags_PreferInput          = 1 << 0,       // Favor activation that requires keyboard text input (e.g. for Slider/Drag). Default for Enter key.
1193b4be Poul Sander 2025-02-03 21:28 1693
    ImGuiActivateFlags_PreferTweak          = 1 << 1,       // Favor activation for tweaking with arrows or gamepad (e.g. for Slider/Drag). Default for Space key and if keyboard is not used.
1193b4be Poul Sander 2025-02-03 21:28 1694
    ImGuiActivateFlags_TryToPreserveState   = 1 << 2,       // Request widget to preserve state if it can (e.g. InputText will try to preserve cursor/selection)
4e9e2555 Poul Sander 2025-10-05 10:15 1695
    ImGuiActivateFlags_FromTabbing          = 1 << 3,       // Activation requested by a tabbing request (ImGuiNavMoveFlags_IsTabbing)
1193b4be Poul Sander 2025-02-03 21:28 1696
    ImGuiActivateFlags_FromShortcut         = 1 << 4,       // Activation requested by an item shortcut via SetNextItemShortcut() function.
4e9e2555 Poul Sander 2025-10-05 10:15 1697
    ImGuiActivateFlags_FromFocusApi         = 1 << 5,       // Activation requested by an api request (ImGuiNavMoveFlags_FocusApi)
1193b4be Poul Sander 2025-02-03 21:28 1698
};
1193b4be Poul Sander 2025-02-03 21:28 1699
1193b4be Poul Sander 2025-02-03 21:28 1700
// Early work-in-progress API for ScrollToItem()
1193b4be Poul Sander 2025-02-03 21:28 1701
enum ImGuiScrollFlags_
1193b4be Poul Sander 2025-02-03 21:28 1702
{
1193b4be Poul Sander 2025-02-03 21:28 1703
    ImGuiScrollFlags_None                   = 0,
1193b4be Poul Sander 2025-02-03 21:28 1704
    ImGuiScrollFlags_KeepVisibleEdgeX       = 1 << 0,       // If item is not visible: scroll as little as possible on X axis to bring item back into view [default for X axis]
1193b4be Poul Sander 2025-02-03 21:28 1705
    ImGuiScrollFlags_KeepVisibleEdgeY       = 1 << 1,       // If item is not visible: scroll as little as possible on Y axis to bring item back into view [default for Y axis for windows that are already visible]
1193b4be Poul Sander 2025-02-03 21:28 1706
    ImGuiScrollFlags_KeepVisibleCenterX     = 1 << 2,       // If item is not visible: scroll to make the item centered on X axis [rarely used]
1193b4be Poul Sander 2025-02-03 21:28 1707
    ImGuiScrollFlags_KeepVisibleCenterY     = 1 << 3,       // If item is not visible: scroll to make the item centered on Y axis
1193b4be Poul Sander 2025-02-03 21:28 1708
    ImGuiScrollFlags_AlwaysCenterX          = 1 << 4,       // Always center the result item on X axis [rarely used]
1193b4be Poul Sander 2025-02-03 21:28 1709
    ImGuiScrollFlags_AlwaysCenterY          = 1 << 5,       // Always center the result item on Y axis [default for Y axis for appearing window)
1193b4be Poul Sander 2025-02-03 21:28 1710
    ImGuiScrollFlags_NoScrollParent         = 1 << 6,       // Disable forwarding scrolling to parent window if required to keep item/rect visible (only scroll window the function was applied to).
1193b4be Poul Sander 2025-02-03 21:28 1711
    ImGuiScrollFlags_MaskX_                 = ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_KeepVisibleCenterX | ImGuiScrollFlags_AlwaysCenterX,
1193b4be Poul Sander 2025-02-03 21:28 1712
    ImGuiScrollFlags_MaskY_                 = ImGuiScrollFlags_KeepVisibleEdgeY | ImGuiScrollFlags_KeepVisibleCenterY | ImGuiScrollFlags_AlwaysCenterY,
1193b4be Poul Sander 2025-02-03 21:28 1713
};
1193b4be Poul Sander 2025-02-03 21:28 1714
1193b4be Poul Sander 2025-02-03 21:28 1715
enum ImGuiNavRenderCursorFlags_
1193b4be Poul Sander 2025-02-03 21:28 1716
{
1193b4be Poul Sander 2025-02-03 21:28 1717
    ImGuiNavRenderCursorFlags_None          = 0,
1193b4be Poul Sander 2025-02-03 21:28 1718
    ImGuiNavRenderCursorFlags_Compact       = 1 << 1,       // Compact highlight, no padding/distance from focused item
1193b4be Poul Sander 2025-02-03 21:28 1719
    ImGuiNavRenderCursorFlags_AlwaysDraw    = 1 << 2,       // Draw rectangular highlight if (g.NavId == id) even when g.NavCursorVisible == false, aka even when using the mouse.
1193b4be Poul Sander 2025-02-03 21:28 1720
    ImGuiNavRenderCursorFlags_NoRounding    = 1 << 3,
1193b4be Poul Sander 2025-02-03 21:28 1721
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
1193b4be Poul Sander 2025-02-03 21:28 1722
    ImGuiNavHighlightFlags_None             = ImGuiNavRenderCursorFlags_None,       // Renamed in 1.91.4
1193b4be Poul Sander 2025-02-03 21:28 1723
    ImGuiNavHighlightFlags_Compact          = ImGuiNavRenderCursorFlags_Compact,    // Renamed in 1.91.4
1193b4be Poul Sander 2025-02-03 21:28 1724
    ImGuiNavHighlightFlags_AlwaysDraw       = ImGuiNavRenderCursorFlags_AlwaysDraw, // Renamed in 1.91.4
1193b4be Poul Sander 2025-02-03 21:28 1725
    ImGuiNavHighlightFlags_NoRounding       = ImGuiNavRenderCursorFlags_NoRounding, // Renamed in 1.91.4
4e9e2555 Poul Sander 2025-10-05 10:15 1726
    //ImGuiNavHighlightFlags_TypeThin       = ImGuiNavRenderCursorFlags_Compact,    // Renamed in 1.90.2
1193b4be Poul Sander 2025-02-03 21:28 1727
#endif
1193b4be Poul Sander 2025-02-03 21:28 1728
};
1193b4be Poul Sander 2025-02-03 21:28 1729
1193b4be Poul Sander 2025-02-03 21:28 1730
enum ImGuiNavMoveFlags_
1193b4be Poul Sander 2025-02-03 21:28 1731
{
1193b4be Poul Sander 2025-02-03 21:28 1732
    ImGuiNavMoveFlags_None                  = 0,
1193b4be Poul Sander 2025-02-03 21:28 1733
    ImGuiNavMoveFlags_LoopX                 = 1 << 0,   // On failed request, restart from opposite side
1193b4be Poul Sander 2025-02-03 21:28 1734
    ImGuiNavMoveFlags_LoopY                 = 1 << 1,
1193b4be Poul Sander 2025-02-03 21:28 1735
    ImGuiNavMoveFlags_WrapX                 = 1 << 2,   // On failed request, request from opposite side one line down (when NavDir==right) or one line up (when NavDir==left)
1193b4be Poul Sander 2025-02-03 21:28 1736
    ImGuiNavMoveFlags_WrapY                 = 1 << 3,   // This is not super useful but provided for completeness
1193b4be Poul Sander 2025-02-03 21:28 1737
    ImGuiNavMoveFlags_WrapMask_             = ImGuiNavMoveFlags_LoopX | ImGuiNavMoveFlags_LoopY | ImGuiNavMoveFlags_WrapX | ImGuiNavMoveFlags_WrapY,
1193b4be Poul Sander 2025-02-03 21:28 1738
    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)
1193b4be Poul Sander 2025-02-03 21:28 1739
    ImGuiNavMoveFlags_AlsoScoreVisibleSet   = 1 << 5,   // Store alternate result in NavMoveResultLocalVisible that only comprise elements that are already fully visible (used by PageUp/PageDown)
1193b4be Poul Sander 2025-02-03 21:28 1740
    ImGuiNavMoveFlags_ScrollToEdgeY         = 1 << 6,   // Force scrolling to min/max (used by Home/End) // FIXME-NAV: Aim to remove or reword, probably unnecessary
1193b4be Poul Sander 2025-02-03 21:28 1741
    ImGuiNavMoveFlags_Forwarded             = 1 << 7,
1193b4be Poul Sander 2025-02-03 21:28 1742
    ImGuiNavMoveFlags_DebugNoResult         = 1 << 8,   // Dummy scoring for debug purpose, don't apply result
1193b4be Poul Sander 2025-02-03 21:28 1743
    ImGuiNavMoveFlags_FocusApi              = 1 << 9,   // Requests from focus API can land/focus/activate items even if they are marked with _NoTabStop (see NavProcessItemForTabbingRequest() for details)
1193b4be Poul Sander 2025-02-03 21:28 1744
    ImGuiNavMoveFlags_IsTabbing             = 1 << 10,  // == Focus + Activate if item is Inputable + DontChangeNavHighlight
1193b4be Poul Sander 2025-02-03 21:28 1745
    ImGuiNavMoveFlags_IsPageMove            = 1 << 11,  // Identify a PageDown/PageUp request.
1193b4be Poul Sander 2025-02-03 21:28 1746
    ImGuiNavMoveFlags_Activate              = 1 << 12,  // Activate/select target item.
1193b4be Poul Sander 2025-02-03 21:28 1747
    ImGuiNavMoveFlags_NoSelect              = 1 << 13,  // Don't trigger selection by not setting g.NavJustMovedTo
1193b4be Poul Sander 2025-02-03 21:28 1748
    ImGuiNavMoveFlags_NoSetNavCursorVisible = 1 << 14,  // Do not alter the nav cursor visible state
1193b4be Poul Sander 2025-02-03 21:28 1749
    ImGuiNavMoveFlags_NoClearActiveId       = 1 << 15,  // (Experimental) Do not clear active id when applying move result
1193b4be Poul Sander 2025-02-03 21:28 1750
};
1193b4be Poul Sander 2025-02-03 21:28 1751
1193b4be Poul Sander 2025-02-03 21:28 1752
enum ImGuiNavLayer
1193b4be Poul Sander 2025-02-03 21:28 1753
{
1193b4be Poul Sander 2025-02-03 21:28 1754
    ImGuiNavLayer_Main  = 0,    // Main scrolling layer
1193b4be Poul Sander 2025-02-03 21:28 1755
    ImGuiNavLayer_Menu  = 1,    // Menu layer (access with Alt)
1193b4be Poul Sander 2025-02-03 21:28 1756
    ImGuiNavLayer_COUNT
1193b4be Poul Sander 2025-02-03 21:28 1757
};
1193b4be Poul Sander 2025-02-03 21:28 1758
1193b4be Poul Sander 2025-02-03 21:28 1759
// Storage for navigation query/results
1193b4be Poul Sander 2025-02-03 21:28 1760
struct ImGuiNavItemData
1193b4be Poul Sander 2025-02-03 21:28 1761
{
1193b4be Poul Sander 2025-02-03 21:28 1762
    ImGuiWindow*        Window;         // Init,Move    // Best candidate window (result->ItemWindow->RootWindowForNav == request->Window)
1193b4be Poul Sander 2025-02-03 21:28 1763
    ImGuiID             ID;             // Init,Move    // Best candidate item ID
1193b4be Poul Sander 2025-02-03 21:28 1764
    ImGuiID             FocusScopeId;   // Init,Move    // Best candidate focus scope ID
1193b4be Poul Sander 2025-02-03 21:28 1765
    ImRect              RectRel;        // Init,Move    // Best candidate bounding box in window relative space
1193b4be Poul Sander 2025-02-03 21:28 1766
    ImGuiItemFlags      ItemFlags;      // ????,Move    // Best candidate item flags
1193b4be Poul Sander 2025-02-03 21:28 1767
    float               DistBox;        //      Move    // Best candidate box distance to current NavId
1193b4be Poul Sander 2025-02-03 21:28 1768
    float               DistCenter;     //      Move    // Best candidate center distance to current NavId
1193b4be Poul Sander 2025-02-03 21:28 1769
    float               DistAxial;      //      Move    // Best candidate axial distance to current NavId
1193b4be Poul Sander 2025-02-03 21:28 1770
    ImGuiSelectionUserData SelectionUserData;//I+Mov    // Best candidate SetNextItemSelectionUserData() value. Valid if (ItemFlags & ImGuiItemFlags_HasSelectionUserData)
1193b4be Poul Sander 2025-02-03 21:28 1771
1193b4be Poul Sander 2025-02-03 21:28 1772
    ImGuiNavItemData()  { Clear(); }
1193b4be Poul Sander 2025-02-03 21:28 1773
    void Clear()        { Window = NULL; ID = FocusScopeId = 0; ItemFlags = 0; SelectionUserData = -1; DistBox = DistCenter = DistAxial = FLT_MAX; }
1193b4be Poul Sander 2025-02-03 21:28 1774
};
1193b4be Poul Sander 2025-02-03 21:28 1775
1193b4be Poul Sander 2025-02-03 21:28 1776
// Storage for PushFocusScope(), g.FocusScopeStack[], g.NavFocusRoute[]
1193b4be Poul Sander 2025-02-03 21:28 1777
struct ImGuiFocusScopeData
1193b4be Poul Sander 2025-02-03 21:28 1778
{
1193b4be Poul Sander 2025-02-03 21:28 1779
    ImGuiID             ID;
1193b4be Poul Sander 2025-02-03 21:28 1780
    ImGuiID             WindowID;
1193b4be Poul Sander 2025-02-03 21:28 1781
};
1193b4be Poul Sander 2025-02-03 21:28 1782
1193b4be Poul Sander 2025-02-03 21:28 1783
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 1784
// [SECTION] Typing-select support
1193b4be Poul Sander 2025-02-03 21:28 1785
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 1786
1193b4be Poul Sander 2025-02-03 21:28 1787
// Flags for GetTypingSelectRequest()
1193b4be Poul Sander 2025-02-03 21:28 1788
enum ImGuiTypingSelectFlags_
1193b4be Poul Sander 2025-02-03 21:28 1789
{
1193b4be Poul Sander 2025-02-03 21:28 1790
    ImGuiTypingSelectFlags_None                 = 0,
1193b4be Poul Sander 2025-02-03 21:28 1791
    ImGuiTypingSelectFlags_AllowBackspace       = 1 << 0,   // Backspace to delete character inputs. If using: ensure GetTypingSelectRequest() is not called more than once per frame (filter by e.g. focus state)
1193b4be Poul Sander 2025-02-03 21:28 1792
    ImGuiTypingSelectFlags_AllowSingleCharMode  = 1 << 1,   // Allow "single char" search mode which is activated when pressing the same character multiple times.
1193b4be Poul Sander 2025-02-03 21:28 1793
};
1193b4be Poul Sander 2025-02-03 21:28 1794
1193b4be Poul Sander 2025-02-03 21:28 1795
// Returned by GetTypingSelectRequest(), designed to eventually be public.
1193b4be Poul Sander 2025-02-03 21:28 1796
struct IMGUI_API ImGuiTypingSelectRequest
1193b4be Poul Sander 2025-02-03 21:28 1797
{
1193b4be Poul Sander 2025-02-03 21:28 1798
    ImGuiTypingSelectFlags  Flags;              // Flags passed to GetTypingSelectRequest()
1193b4be Poul Sander 2025-02-03 21:28 1799
    int                     SearchBufferLen;
1193b4be Poul Sander 2025-02-03 21:28 1800
    const char*             SearchBuffer;       // Search buffer contents (use full string. unless SingleCharMode is set, in which case use SingleCharSize).
1193b4be Poul Sander 2025-02-03 21:28 1801
    bool                    SelectRequest;      // Set when buffer was modified this frame, requesting a selection.
1193b4be Poul Sander 2025-02-03 21:28 1802
    bool                    SingleCharMode;     // Notify when buffer contains same character repeated, to implement special mode. In this situation it preferred to not display any on-screen search indication.
1193b4be Poul Sander 2025-02-03 21:28 1803
    ImS8                    SingleCharSize;     // Length in bytes of first letter codepoint (1 for ascii, 2-4 for UTF-8). If (SearchBufferLen==RepeatCharSize) only 1 letter has been input.
1193b4be Poul Sander 2025-02-03 21:28 1804
};
1193b4be Poul Sander 2025-02-03 21:28 1805
1193b4be Poul Sander 2025-02-03 21:28 1806
// Storage for GetTypingSelectRequest()
1193b4be Poul Sander 2025-02-03 21:28 1807
struct IMGUI_API ImGuiTypingSelectState
1193b4be Poul Sander 2025-02-03 21:28 1808
{
1193b4be Poul Sander 2025-02-03 21:28 1809
    ImGuiTypingSelectRequest Request;           // User-facing data
1193b4be Poul Sander 2025-02-03 21:28 1810
    char            SearchBuffer[64];           // Search buffer: no need to make dynamic as this search is very transient.
1193b4be Poul Sander 2025-02-03 21:28 1811
    ImGuiID         FocusScope;
1193b4be Poul Sander 2025-02-03 21:28 1812
    int             LastRequestFrame = 0;
1193b4be Poul Sander 2025-02-03 21:28 1813
    float           LastRequestTime = 0.0f;
1193b4be Poul Sander 2025-02-03 21:28 1814
    bool            SingleCharModeLock = false; // After a certain single char repeat count we lock into SingleCharMode. Two benefits: 1) buffer never fill, 2) we can provide an immediate SingleChar mode without timer elapsing.
1193b4be Poul Sander 2025-02-03 21:28 1815
1193b4be Poul Sander 2025-02-03 21:28 1816
    ImGuiTypingSelectState() { memset(this, 0, sizeof(*this)); }
1193b4be Poul Sander 2025-02-03 21:28 1817
    void            Clear()  { SearchBuffer[0] = 0; SingleCharModeLock = false; } // We preserve remaining data for easier debugging
1193b4be Poul Sander 2025-02-03 21:28 1818
};
1193b4be Poul Sander 2025-02-03 21:28 1819
1193b4be Poul Sander 2025-02-03 21:28 1820
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 1821
// [SECTION] Columns support
1193b4be Poul Sander 2025-02-03 21:28 1822
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 1823
1193b4be Poul Sander 2025-02-03 21:28 1824
// Flags for internal's BeginColumns(). This is an obsolete API. Prefer using BeginTable() nowadays!
1193b4be Poul Sander 2025-02-03 21:28 1825
enum ImGuiOldColumnFlags_
1193b4be Poul Sander 2025-02-03 21:28 1826
{
1193b4be Poul Sander 2025-02-03 21:28 1827
    ImGuiOldColumnFlags_None                    = 0,
1193b4be Poul Sander 2025-02-03 21:28 1828
    ImGuiOldColumnFlags_NoBorder                = 1 << 0,   // Disable column dividers
1193b4be Poul Sander 2025-02-03 21:28 1829
    ImGuiOldColumnFlags_NoResize                = 1 << 1,   // Disable resizing columns when clicking on the dividers
1193b4be Poul Sander 2025-02-03 21:28 1830
    ImGuiOldColumnFlags_NoPreserveWidths        = 1 << 2,   // Disable column width preservation when adjusting columns
1193b4be Poul Sander 2025-02-03 21:28 1831
    ImGuiOldColumnFlags_NoForceWithinWindow     = 1 << 3,   // Disable forcing columns to fit within window
1193b4be Poul Sander 2025-02-03 21:28 1832
    ImGuiOldColumnFlags_GrowParentContentsSize  = 1 << 4,   // Restore pre-1.51 behavior of extending the parent window contents size but _without affecting the columns width at all_. Will eventually remove.
1193b4be Poul Sander 2025-02-03 21:28 1833
1193b4be Poul Sander 2025-02-03 21:28 1834
    // Obsolete names (will be removed)
1193b4be Poul Sander 2025-02-03 21:28 1835
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
1193b4be Poul Sander 2025-02-03 21:28 1836
    //ImGuiColumnsFlags_None                    = ImGuiOldColumnFlags_None,
1193b4be Poul Sander 2025-02-03 21:28 1837
    //ImGuiColumnsFlags_NoBorder                = ImGuiOldColumnFlags_NoBorder,
1193b4be Poul Sander 2025-02-03 21:28 1838
    //ImGuiColumnsFlags_NoResize                = ImGuiOldColumnFlags_NoResize,
1193b4be Poul Sander 2025-02-03 21:28 1839
    //ImGuiColumnsFlags_NoPreserveWidths        = ImGuiOldColumnFlags_NoPreserveWidths,
1193b4be Poul Sander 2025-02-03 21:28 1840
    //ImGuiColumnsFlags_NoForceWithinWindow     = ImGuiOldColumnFlags_NoForceWithinWindow,
1193b4be Poul Sander 2025-02-03 21:28 1841
    //ImGuiColumnsFlags_GrowParentContentsSize  = ImGuiOldColumnFlags_GrowParentContentsSize,
1193b4be Poul Sander 2025-02-03 21:28 1842
#endif
1193b4be Poul Sander 2025-02-03 21:28 1843
};
1193b4be Poul Sander 2025-02-03 21:28 1844
1193b4be Poul Sander 2025-02-03 21:28 1845
struct ImGuiOldColumnData
1193b4be Poul Sander 2025-02-03 21:28 1846
{
1193b4be Poul Sander 2025-02-03 21:28 1847
    float               OffsetNorm;             // Column start offset, normalized 0.0 (far left) -> 1.0 (far right)
1193b4be Poul Sander 2025-02-03 21:28 1848
    float               OffsetNormBeforeResize;
1193b4be Poul Sander 2025-02-03 21:28 1849
    ImGuiOldColumnFlags Flags;                  // Not exposed
1193b4be Poul Sander 2025-02-03 21:28 1850
    ImRect              ClipRect;
1193b4be Poul Sander 2025-02-03 21:28 1851
1193b4be Poul Sander 2025-02-03 21:28 1852
    ImGuiOldColumnData() { memset(this, 0, sizeof(*this)); }
1193b4be Poul Sander 2025-02-03 21:28 1853
};
1193b4be Poul Sander 2025-02-03 21:28 1854
1193b4be Poul Sander 2025-02-03 21:28 1855
struct ImGuiOldColumns
1193b4be Poul Sander 2025-02-03 21:28 1856
{
1193b4be Poul Sander 2025-02-03 21:28 1857
    ImGuiID             ID;
1193b4be Poul Sander 2025-02-03 21:28 1858
    ImGuiOldColumnFlags Flags;
1193b4be Poul Sander 2025-02-03 21:28 1859
    bool                IsFirstFrame;
1193b4be Poul Sander 2025-02-03 21:28 1860
    bool                IsBeingResized;
1193b4be Poul Sander 2025-02-03 21:28 1861
    int                 Current;
1193b4be Poul Sander 2025-02-03 21:28 1862
    int                 Count;
1193b4be Poul Sander 2025-02-03 21:28 1863
    float               OffMinX, OffMaxX;       // Offsets from HostWorkRect.Min.x
1193b4be Poul Sander 2025-02-03 21:28 1864
    float               LineMinY, LineMaxY;
1193b4be Poul Sander 2025-02-03 21:28 1865
    float               HostCursorPosY;         // Backup of CursorPos at the time of BeginColumns()
1193b4be Poul Sander 2025-02-03 21:28 1866
    float               HostCursorMaxPosX;      // Backup of CursorMaxPos at the time of BeginColumns()
1193b4be Poul Sander 2025-02-03 21:28 1867
    ImRect              HostInitialClipRect;    // Backup of ClipRect at the time of BeginColumns()
1193b4be Poul Sander 2025-02-03 21:28 1868
    ImRect              HostBackupClipRect;     // Backup of ClipRect during PushColumnsBackground()/PopColumnsBackground()
1193b4be Poul Sander 2025-02-03 21:28 1869
    ImRect              HostBackupParentWorkRect;//Backup of WorkRect at the time of BeginColumns()
1193b4be Poul Sander 2025-02-03 21:28 1870
    ImVector<ImGuiOldColumnData> Columns;
1193b4be Poul Sander 2025-02-03 21:28 1871
    ImDrawListSplitter  Splitter;
1193b4be Poul Sander 2025-02-03 21:28 1872
1193b4be Poul Sander 2025-02-03 21:28 1873
    ImGuiOldColumns()   { memset(this, 0, sizeof(*this)); }
1193b4be Poul Sander 2025-02-03 21:28 1874
};
1193b4be Poul Sander 2025-02-03 21:28 1875
1193b4be Poul Sander 2025-02-03 21:28 1876
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 1877
// [SECTION] Box-select support
1193b4be Poul Sander 2025-02-03 21:28 1878
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 1879
1193b4be Poul Sander 2025-02-03 21:28 1880
struct ImGuiBoxSelectState
1193b4be Poul Sander 2025-02-03 21:28 1881
{
1193b4be Poul Sander 2025-02-03 21:28 1882
    // Active box-selection data (persistent, 1 active at a time)
1193b4be Poul Sander 2025-02-03 21:28 1883
    ImGuiID                 ID;
1193b4be Poul Sander 2025-02-03 21:28 1884
    bool                    IsActive;
1193b4be Poul Sander 2025-02-03 21:28 1885
    bool                    IsStarting;
1193b4be Poul Sander 2025-02-03 21:28 1886
    bool                    IsStartedFromVoid;  // Starting click was not from an item.
1193b4be Poul Sander 2025-02-03 21:28 1887
    bool                    IsStartedSetNavIdOnce;
1193b4be Poul Sander 2025-02-03 21:28 1888
    bool                    RequestClear;
1193b4be Poul Sander 2025-02-03 21:28 1889
    ImGuiKeyChord           KeyMods : 16;       // Latched key-mods for box-select logic.
1193b4be Poul Sander 2025-02-03 21:28 1890
    ImVec2                  StartPosRel;        // Start position in window-contents relative space (to support scrolling)
1193b4be Poul Sander 2025-02-03 21:28 1891
    ImVec2                  EndPosRel;          // End position in window-contents relative space
1193b4be Poul Sander 2025-02-03 21:28 1892
    ImVec2                  ScrollAccum;        // Scrolling accumulator (to behave at high-frame spaces)
1193b4be Poul Sander 2025-02-03 21:28 1893
    ImGuiWindow*            Window;
1193b4be Poul Sander 2025-02-03 21:28 1894
1193b4be Poul Sander 2025-02-03 21:28 1895
    // Temporary/Transient data
1193b4be Poul Sander 2025-02-03 21:28 1896
    bool                    UnclipMode;         // (Temp/Transient, here in hot area). Set/cleared by the BeginMultiSelect()/EndMultiSelect() owning active box-select.
1193b4be Poul Sander 2025-02-03 21:28 1897
    ImRect                  UnclipRect;         // Rectangle where ItemAdd() clipping may be temporarily disabled. Need support by multi-select supporting widgets.
1193b4be Poul Sander 2025-02-03 21:28 1898
    ImRect                  BoxSelectRectPrev;  // Selection rectangle in absolute coordinates (derived every frame from BoxSelectStartPosRel and MousePos)
1193b4be Poul Sander 2025-02-03 21:28 1899
    ImRect                  BoxSelectRectCurr;
1193b4be Poul Sander 2025-02-03 21:28 1900
1193b4be Poul Sander 2025-02-03 21:28 1901
    ImGuiBoxSelectState()   { memset(this, 0, sizeof(*this)); }
1193b4be Poul Sander 2025-02-03 21:28 1902
};
1193b4be Poul Sander 2025-02-03 21:28 1903
1193b4be Poul Sander 2025-02-03 21:28 1904
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 1905
// [SECTION] Multi-select support
1193b4be Poul Sander 2025-02-03 21:28 1906
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 1907
1193b4be Poul Sander 2025-02-03 21:28 1908
// We always assume that -1 is an invalid value (which works for indices and pointers)
1193b4be Poul Sander 2025-02-03 21:28 1909
#define ImGuiSelectionUserData_Invalid        ((ImGuiSelectionUserData)-1)
1193b4be Poul Sander 2025-02-03 21:28 1910
1193b4be Poul Sander 2025-02-03 21:28 1911
// Temporary storage for multi-select
1193b4be Poul Sander 2025-02-03 21:28 1912
struct IMGUI_API ImGuiMultiSelectTempData
1193b4be Poul Sander 2025-02-03 21:28 1913
{
1193b4be Poul Sander 2025-02-03 21:28 1914
    ImGuiMultiSelectIO      IO;                 // MUST BE FIRST FIELD. Requests are set and returned by BeginMultiSelect()/EndMultiSelect() + written to by user during the loop.
1193b4be Poul Sander 2025-02-03 21:28 1915
    ImGuiMultiSelectState*  Storage;
1193b4be Poul Sander 2025-02-03 21:28 1916
    ImGuiID                 FocusScopeId;       // Copied from g.CurrentFocusScopeId (unless another selection scope was pushed manually)
1193b4be Poul Sander 2025-02-03 21:28 1917
    ImGuiMultiSelectFlags   Flags;
1193b4be Poul Sander 2025-02-03 21:28 1918
    ImVec2                  ScopeRectMin;
1193b4be Poul Sander 2025-02-03 21:28 1919
    ImVec2                  BackupCursorMaxPos;
1193b4be Poul Sander 2025-02-03 21:28 1920
    ImGuiSelectionUserData  LastSubmittedItem;  // Copy of last submitted item data, used to merge output ranges.
1193b4be Poul Sander 2025-02-03 21:28 1921
    ImGuiID                 BoxSelectId;
1193b4be Poul Sander 2025-02-03 21:28 1922
    ImGuiKeyChord           KeyMods;
1193b4be Poul Sander 2025-02-03 21:28 1923
    ImS8                    LoopRequestSetAll;  // -1: no operation, 0: clear all, 1: select all.
1193b4be Poul Sander 2025-02-03 21:28 1924
    bool                    IsEndIO;            // Set when switching IO from BeginMultiSelect() to EndMultiSelect() state.
1193b4be Poul Sander 2025-02-03 21:28 1925
    bool                    IsFocused;          // Set if currently focusing the selection scope (any item of the selection). May be used if you have custom shortcut associated to selection.
1193b4be Poul Sander 2025-02-03 21:28 1926
    bool                    IsKeyboardSetRange; // Set by BeginMultiSelect() when using Shift+Navigation. Because scrolling may be affected we can't afford a frame of lag with Shift+Navigation.
1193b4be Poul Sander 2025-02-03 21:28 1927
    bool                    NavIdPassedBy;
1193b4be Poul Sander 2025-02-03 21:28 1928
    bool                    RangeSrcPassedBy;   // Set by the item that matches RangeSrcItem.
1193b4be Poul Sander 2025-02-03 21:28 1929
    bool                    RangeDstPassedBy;   // Set by the item that matches NavJustMovedToId when IsSetRange is set.
1193b4be Poul Sander 2025-02-03 21:28 1930
1193b4be Poul Sander 2025-02-03 21:28 1931
    ImGuiMultiSelectTempData()  { Clear(); }
1193b4be Poul Sander 2025-02-03 21:28 1932
    void Clear()            { size_t io_sz = sizeof(IO); ClearIO(); memset((void*)(&IO + 1), 0, sizeof(*this) - io_sz); } // Zero-clear except IO as we preserve IO.Requests[] buffer allocation.
1193b4be Poul Sander 2025-02-03 21:28 1933
    void ClearIO()          { IO.Requests.resize(0); IO.RangeSrcItem = IO.NavIdItem = ImGuiSelectionUserData_Invalid; IO.NavIdSelected = IO.RangeSrcReset = false; }
1193b4be Poul Sander 2025-02-03 21:28 1934
};
1193b4be Poul Sander 2025-02-03 21:28 1935
1193b4be Poul Sander 2025-02-03 21:28 1936
// Persistent storage for multi-select (as long as selection is alive)
1193b4be Poul Sander 2025-02-03 21:28 1937
struct IMGUI_API ImGuiMultiSelectState
1193b4be Poul Sander 2025-02-03 21:28 1938
{
1193b4be Poul Sander 2025-02-03 21:28 1939
    ImGuiWindow*            Window;
1193b4be Poul Sander 2025-02-03 21:28 1940
    ImGuiID                 ID;
1193b4be Poul Sander 2025-02-03 21:28 1941
    int                     LastFrameActive;    // Last used frame-count, for GC.
1193b4be Poul Sander 2025-02-03 21:28 1942
    int                     LastSelectionSize;  // Set by BeginMultiSelect() based on optional info provided by user. May be -1 if unknown.
1193b4be Poul Sander 2025-02-03 21:28 1943
    ImS8                    RangeSelected;      // -1 (don't have) or true/false
1193b4be Poul Sander 2025-02-03 21:28 1944
    ImS8                    NavIdSelected;      // -1 (don't have) or true/false
1193b4be Poul Sander 2025-02-03 21:28 1945
    ImGuiSelectionUserData  RangeSrcItem;       //
1193b4be Poul Sander 2025-02-03 21:28 1946
    ImGuiSelectionUserData  NavIdItem;          // SetNextItemSelectionUserData() value for NavId (if part of submitted items)
1193b4be Poul Sander 2025-02-03 21:28 1947
1193b4be Poul Sander 2025-02-03 21:28 1948
    ImGuiMultiSelectState() { Window = NULL; ID = 0; LastFrameActive = LastSelectionSize = 0; RangeSelected = NavIdSelected = -1; RangeSrcItem = NavIdItem = ImGuiSelectionUserData_Invalid; }
1193b4be Poul Sander 2025-02-03 21:28 1949
};
1193b4be Poul Sander 2025-02-03 21:28 1950
1193b4be Poul Sander 2025-02-03 21:28 1951
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 1952
// [SECTION] Docking support
1193b4be Poul Sander 2025-02-03 21:28 1953
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 1954
1193b4be Poul Sander 2025-02-03 21:28 1955
#define DOCKING_HOST_DRAW_CHANNEL_BG 0  // Dock host: background fill
1193b4be Poul Sander 2025-02-03 21:28 1956
#define DOCKING_HOST_DRAW_CHANNEL_FG 1  // Dock host: decorations and contents
1193b4be Poul Sander 2025-02-03 21:28 1957
1193b4be Poul Sander 2025-02-03 21:28 1958
#ifdef IMGUI_HAS_DOCK
1193b4be Poul Sander 2025-02-03 21:28 1959
1193b4be Poul Sander 2025-02-03 21:28 1960
// Extend ImGuiDockNodeFlags_
1193b4be Poul Sander 2025-02-03 21:28 1961
enum ImGuiDockNodeFlagsPrivate_
1193b4be Poul Sander 2025-02-03 21:28 1962
{
1193b4be Poul Sander 2025-02-03 21:28 1963
    // [Internal]
1193b4be Poul Sander 2025-02-03 21:28 1964
    ImGuiDockNodeFlags_DockSpace                = 1 << 10,  // Saved // A dockspace is a node that occupy space within an existing user window. Otherwise the node is floating and create its own window.
1193b4be Poul Sander 2025-02-03 21:28 1965
    ImGuiDockNodeFlags_CentralNode              = 1 << 11,  // Saved // The central node has 2 main properties: stay visible when empty, only use "remaining" spaces from its neighbor.
1193b4be Poul Sander 2025-02-03 21:28 1966
    ImGuiDockNodeFlags_NoTabBar                 = 1 << 12,  // Saved // Tab bar is completely unavailable. No triangle in the corner to enable it back.
1193b4be Poul Sander 2025-02-03 21:28 1967
    ImGuiDockNodeFlags_HiddenTabBar             = 1 << 13,  // Saved // Tab bar is hidden, with a triangle in the corner to show it again (NB: actual tab-bar instance may be destroyed as this is only used for single-window tab bar)
1193b4be Poul Sander 2025-02-03 21:28 1968
    ImGuiDockNodeFlags_NoWindowMenuButton       = 1 << 14,  // Saved // Disable window/docking menu (that one that appears instead of the collapse button)
1193b4be Poul Sander 2025-02-03 21:28 1969
    ImGuiDockNodeFlags_NoCloseButton            = 1 << 15,  // Saved // Disable close button
1193b4be Poul Sander 2025-02-03 21:28 1970
    ImGuiDockNodeFlags_NoResizeX                = 1 << 16,  //       //
1193b4be Poul Sander 2025-02-03 21:28 1971
    ImGuiDockNodeFlags_NoResizeY                = 1 << 17,  //       //
1193b4be Poul Sander 2025-02-03 21:28 1972
    ImGuiDockNodeFlags_DockedWindowsInFocusRoute= 1 << 18,  //       // Any docked window will be automatically be focus-route chained (window->ParentWindowForFocusRoute set to this) so Shortcut() in this window can run when any docked window is focused.
4e9e2555 Poul Sander 2025-10-05 10:15 1973
1193b4be Poul Sander 2025-02-03 21:28 1974
    // Disable docking/undocking actions in this dockspace or individual node (existing docked nodes will be preserved)
1193b4be Poul Sander 2025-02-03 21:28 1975
    // Those are not exposed in public because the desirable sharing/inheriting/copy-flag-on-split behaviors are quite difficult to design and understand.
1193b4be Poul Sander 2025-02-03 21:28 1976
    // The two public flags ImGuiDockNodeFlags_NoDockingOverCentralNode/ImGuiDockNodeFlags_NoDockingSplit don't have those issues.
1193b4be Poul Sander 2025-02-03 21:28 1977
    ImGuiDockNodeFlags_NoDockingSplitOther      = 1 << 19,  //       // Disable this node from splitting other windows/nodes.
1193b4be Poul Sander 2025-02-03 21:28 1978
    ImGuiDockNodeFlags_NoDockingOverMe          = 1 << 20,  //       // Disable other windows/nodes from being docked over this node.
1193b4be Poul Sander 2025-02-03 21:28 1979
    ImGuiDockNodeFlags_NoDockingOverOther       = 1 << 21,  //       // Disable this node from being docked over another window or non-empty node.
1193b4be Poul Sander 2025-02-03 21:28 1980
    ImGuiDockNodeFlags_NoDockingOverEmpty       = 1 << 22,  //       // Disable this node from being docked over an empty node (e.g. DockSpace with no other windows)
1193b4be Poul Sander 2025-02-03 21:28 1981
    ImGuiDockNodeFlags_NoDocking                = ImGuiDockNodeFlags_NoDockingOverMe | ImGuiDockNodeFlags_NoDockingOverOther | ImGuiDockNodeFlags_NoDockingOverEmpty | ImGuiDockNodeFlags_NoDockingSplit | ImGuiDockNodeFlags_NoDockingSplitOther,
4e9e2555 Poul Sander 2025-10-05 10:15 1982
1193b4be Poul Sander 2025-02-03 21:28 1983
    // Masks
1193b4be Poul Sander 2025-02-03 21:28 1984
    ImGuiDockNodeFlags_SharedFlagsInheritMask_  = ~0,
1193b4be Poul Sander 2025-02-03 21:28 1985
    ImGuiDockNodeFlags_NoResizeFlagsMask_       = (int)ImGuiDockNodeFlags_NoResize | ImGuiDockNodeFlags_NoResizeX | ImGuiDockNodeFlags_NoResizeY,
1193b4be Poul Sander 2025-02-03 21:28 1986
1193b4be Poul Sander 2025-02-03 21:28 1987
    // When splitting, those local flags are moved to the inheriting child, never duplicated
1193b4be Poul Sander 2025-02-03 21:28 1988
    ImGuiDockNodeFlags_LocalFlagsTransferMask_  = (int)ImGuiDockNodeFlags_NoDockingSplit | ImGuiDockNodeFlags_NoResizeFlagsMask_ | (int)ImGuiDockNodeFlags_AutoHideTabBar | ImGuiDockNodeFlags_CentralNode | ImGuiDockNodeFlags_NoTabBar | ImGuiDockNodeFlags_HiddenTabBar | ImGuiDockNodeFlags_NoWindowMenuButton | ImGuiDockNodeFlags_NoCloseButton,
1193b4be Poul Sander 2025-02-03 21:28 1989
    ImGuiDockNodeFlags_SavedFlagsMask_          = ImGuiDockNodeFlags_NoResizeFlagsMask_ | ImGuiDockNodeFlags_DockSpace | ImGuiDockNodeFlags_CentralNode | ImGuiDockNodeFlags_NoTabBar | ImGuiDockNodeFlags_HiddenTabBar | ImGuiDockNodeFlags_NoWindowMenuButton | ImGuiDockNodeFlags_NoCloseButton,
1193b4be Poul Sander 2025-02-03 21:28 1990
};
1193b4be Poul Sander 2025-02-03 21:28 1991
1193b4be Poul Sander 2025-02-03 21:28 1992
// Store the source authority (dock node vs window) of a field
1193b4be Poul Sander 2025-02-03 21:28 1993
enum ImGuiDataAuthority_
1193b4be Poul Sander 2025-02-03 21:28 1994
{
1193b4be Poul Sander 2025-02-03 21:28 1995
    ImGuiDataAuthority_Auto,
1193b4be Poul Sander 2025-02-03 21:28 1996
    ImGuiDataAuthority_DockNode,
1193b4be Poul Sander 2025-02-03 21:28 1997
    ImGuiDataAuthority_Window,
1193b4be Poul Sander 2025-02-03 21:28 1998
};
1193b4be Poul Sander 2025-02-03 21:28 1999
1193b4be Poul Sander 2025-02-03 21:28 2000
enum ImGuiDockNodeState
1193b4be Poul Sander 2025-02-03 21:28 2001
{
1193b4be Poul Sander 2025-02-03 21:28 2002
    ImGuiDockNodeState_Unknown,
1193b4be Poul Sander 2025-02-03 21:28 2003
    ImGuiDockNodeState_HostWindowHiddenBecauseSingleWindow,
1193b4be Poul Sander 2025-02-03 21:28 2004
    ImGuiDockNodeState_HostWindowHiddenBecauseWindowsAreResizing,
1193b4be Poul Sander 2025-02-03 21:28 2005
    ImGuiDockNodeState_HostWindowVisible,
1193b4be Poul Sander 2025-02-03 21:28 2006
};
1193b4be Poul Sander 2025-02-03 21:28 2007
1193b4be Poul Sander 2025-02-03 21:28 2008
// sizeof() 156~192
1193b4be Poul Sander 2025-02-03 21:28 2009
struct IMGUI_API ImGuiDockNode
1193b4be Poul Sander 2025-02-03 21:28 2010
{
1193b4be Poul Sander 2025-02-03 21:28 2011
    ImGuiID                 ID;
1193b4be Poul Sander 2025-02-03 21:28 2012
    ImGuiDockNodeFlags      SharedFlags;                // (Write) Flags shared by all nodes of a same dockspace hierarchy (inherited from the root node)
1193b4be Poul Sander 2025-02-03 21:28 2013
    ImGuiDockNodeFlags      LocalFlags;                 // (Write) Flags specific to this node
1193b4be Poul Sander 2025-02-03 21:28 2014
    ImGuiDockNodeFlags      LocalFlagsInWindows;        // (Write) Flags specific to this node, applied from windows
1193b4be Poul Sander 2025-02-03 21:28 2015
    ImGuiDockNodeFlags      MergedFlags;                // (Read)  Effective flags (== SharedFlags | LocalFlagsInNode | LocalFlagsInWindows)
1193b4be Poul Sander 2025-02-03 21:28 2016
    ImGuiDockNodeState      State;
1193b4be Poul Sander 2025-02-03 21:28 2017
    ImGuiDockNode*          ParentNode;
1193b4be Poul Sander 2025-02-03 21:28 2018
    ImGuiDockNode*          ChildNodes[2];              // [Split node only] Child nodes (left/right or top/bottom). Consider switching to an array.
1193b4be Poul Sander 2025-02-03 21:28 2019
    ImVector<ImGuiWindow*>  Windows;                    // Note: unordered list! Iterate TabBar->Tabs for user-order.
1193b4be Poul Sander 2025-02-03 21:28 2020
    ImGuiTabBar*            TabBar;
1193b4be Poul Sander 2025-02-03 21:28 2021
    ImVec2                  Pos;                        // Current position
1193b4be Poul Sander 2025-02-03 21:28 2022
    ImVec2                  Size;                       // Current size
1193b4be Poul Sander 2025-02-03 21:28 2023
    ImVec2                  SizeRef;                    // [Split node only] Last explicitly written-to size (overridden when using a splitter affecting the node), used to calculate Size.
1193b4be Poul Sander 2025-02-03 21:28 2024
    ImGuiAxis               SplitAxis;                  // [Split node only] Split axis (X or Y)
1193b4be Poul Sander 2025-02-03 21:28 2025
    ImGuiWindowClass        WindowClass;                // [Root node only]
1193b4be Poul Sander 2025-02-03 21:28 2026
    ImU32                   LastBgColor;
1193b4be Poul Sander 2025-02-03 21:28 2027
1193b4be Poul Sander 2025-02-03 21:28 2028
    ImGuiWindow*            HostWindow;
1193b4be Poul Sander 2025-02-03 21:28 2029
    ImGuiWindow*            VisibleWindow;              // Generally point to window which is ID is == SelectedTabID, but when CTRL+Tabbing this can be a different window.
1193b4be Poul Sander 2025-02-03 21:28 2030
    ImGuiDockNode*          CentralNode;                // [Root node only] Pointer to central node.
1193b4be Poul Sander 2025-02-03 21:28 2031
    ImGuiDockNode*          OnlyNodeWithWindows;        // [Root node only] Set when there is a single visible node within the hierarchy.
1193b4be Poul Sander 2025-02-03 21:28 2032
    int                     CountNodeWithWindows;       // [Root node only]
1193b4be Poul Sander 2025-02-03 21:28 2033
    int                     LastFrameAlive;             // Last frame number the node was updated or kept alive explicitly with DockSpace() + ImGuiDockNodeFlags_KeepAliveOnly
1193b4be Poul Sander 2025-02-03 21:28 2034
    int                     LastFrameActive;            // Last frame number the node was updated.
1193b4be Poul Sander 2025-02-03 21:28 2035
    int                     LastFrameFocused;           // Last frame number the node was focused.
1193b4be Poul Sander 2025-02-03 21:28 2036
    ImGuiID                 LastFocusedNodeId;          // [Root node only] Which of our child docking node (any ancestor in the hierarchy) was last focused.
1193b4be Poul Sander 2025-02-03 21:28 2037
    ImGuiID                 SelectedTabId;              // [Leaf node only] Which of our tab/window is selected.
1193b4be Poul Sander 2025-02-03 21:28 2038
    ImGuiID                 WantCloseTabId;             // [Leaf node only] Set when closing a specific tab/window.
1193b4be Poul Sander 2025-02-03 21:28 2039
    ImGuiID                 RefViewportId;              // Reference viewport ID from visible window when HostWindow == NULL.
1193b4be Poul Sander 2025-02-03 21:28 2040
    ImGuiDataAuthority      AuthorityForPos         :3;
1193b4be Poul Sander 2025-02-03 21:28 2041
    ImGuiDataAuthority      AuthorityForSize        :3;
1193b4be Poul Sander 2025-02-03 21:28 2042
    ImGuiDataAuthority      AuthorityForViewport    :3;
1193b4be Poul Sander 2025-02-03 21:28 2043
    bool                    IsVisible               :1; // Set to false when the node is hidden (usually disabled as it has no active window)
1193b4be Poul Sander 2025-02-03 21:28 2044
    bool                    IsFocused               :1;
1193b4be Poul Sander 2025-02-03 21:28 2045
    bool                    IsBgDrawnThisFrame      :1;
1193b4be Poul Sander 2025-02-03 21:28 2046
    bool                    HasCloseButton          :1; // Provide space for a close button (if any of the docked window has one). Note that button may be hidden on window without one.
1193b4be Poul Sander 2025-02-03 21:28 2047
    bool                    HasWindowMenuButton     :1;
1193b4be Poul Sander 2025-02-03 21:28 2048
    bool                    HasCentralNodeChild     :1;
1193b4be Poul Sander 2025-02-03 21:28 2049
    bool                    WantCloseAll            :1; // Set when closing all tabs at once.
1193b4be Poul Sander 2025-02-03 21:28 2050
    bool                    WantLockSizeOnce        :1;
1193b4be Poul Sander 2025-02-03 21:28 2051
    bool                    WantMouseMove           :1; // After a node extraction we need to transition toward moving the newly created host window
1193b4be Poul Sander 2025-02-03 21:28 2052
    bool                    WantHiddenTabBarUpdate  :1;
1193b4be Poul Sander 2025-02-03 21:28 2053
    bool                    WantHiddenTabBarToggle  :1;
1193b4be Poul Sander 2025-02-03 21:28 2054
1193b4be Poul Sander 2025-02-03 21:28 2055
    ImGuiDockNode(ImGuiID id);
1193b4be Poul Sander 2025-02-03 21:28 2056
    ~ImGuiDockNode();
1193b4be Poul Sander 2025-02-03 21:28 2057
    bool                    IsRootNode() const      { return ParentNode == NULL; }
1193b4be Poul Sander 2025-02-03 21:28 2058
    bool                    IsDockSpace() const     { return (MergedFlags & ImGuiDockNodeFlags_DockSpace) != 0; }
1193b4be Poul Sander 2025-02-03 21:28 2059
    bool                    IsFloatingNode() const  { return ParentNode == NULL && (MergedFlags & ImGuiDockNodeFlags_DockSpace) == 0; }
1193b4be Poul Sander 2025-02-03 21:28 2060
    bool                    IsCentralNode() const   { return (MergedFlags & ImGuiDockNodeFlags_CentralNode) != 0; }
1193b4be Poul Sander 2025-02-03 21:28 2061
    bool                    IsHiddenTabBar() const  { return (MergedFlags & ImGuiDockNodeFlags_HiddenTabBar) != 0; } // Hidden tab bar can be shown back by clicking the small triangle
1193b4be Poul Sander 2025-02-03 21:28 2062
    bool                    IsNoTabBar() const      { return (MergedFlags & ImGuiDockNodeFlags_NoTabBar) != 0; }     // Never show a tab bar
1193b4be Poul Sander 2025-02-03 21:28 2063
    bool                    IsSplitNode() const     { return ChildNodes[0] != NULL; }
1193b4be Poul Sander 2025-02-03 21:28 2064
    bool                    IsLeafNode() const      { return ChildNodes[0] == NULL; }
1193b4be Poul Sander 2025-02-03 21:28 2065
    bool                    IsEmpty() const         { return ChildNodes[0] == NULL && Windows.Size == 0; }
1193b4be Poul Sander 2025-02-03 21:28 2066
    ImRect                  Rect() const            { return ImRect(Pos.x, Pos.y, Pos.x + Size.x, Pos.y + Size.y); }
1193b4be Poul Sander 2025-02-03 21:28 2067
1193b4be Poul Sander 2025-02-03 21:28 2068
    void                    SetLocalFlags(ImGuiDockNodeFlags flags) { LocalFlags = flags; UpdateMergedFlags(); }
1193b4be Poul Sander 2025-02-03 21:28 2069
    void                    UpdateMergedFlags()     { MergedFlags = SharedFlags | LocalFlags | LocalFlagsInWindows; }
1193b4be Poul Sander 2025-02-03 21:28 2070
};
1193b4be Poul Sander 2025-02-03 21:28 2071
1193b4be Poul Sander 2025-02-03 21:28 2072
// List of colors that are stored at the time of Begin() into Docked Windows.
1193b4be Poul Sander 2025-02-03 21:28 2073
// We currently store the packed colors in a simple array window->DockStyle.Colors[].
1193b4be Poul Sander 2025-02-03 21:28 2074
// A better solution may involve appending into a log of colors in ImGuiContext + store offsets into those arrays in ImGuiWindow,
1193b4be Poul Sander 2025-02-03 21:28 2075
// but it would be more complex as we'd need to double-buffer both as e.g. drop target may refer to window from last frame.
1193b4be Poul Sander 2025-02-03 21:28 2076
enum ImGuiWindowDockStyleCol
1193b4be Poul Sander 2025-02-03 21:28 2077
{
1193b4be Poul Sander 2025-02-03 21:28 2078
    ImGuiWindowDockStyleCol_Text,
1193b4be Poul Sander 2025-02-03 21:28 2079
    ImGuiWindowDockStyleCol_TabHovered,
1193b4be Poul Sander 2025-02-03 21:28 2080
    ImGuiWindowDockStyleCol_TabFocused,
1193b4be Poul Sander 2025-02-03 21:28 2081
    ImGuiWindowDockStyleCol_TabSelected,
1193b4be Poul Sander 2025-02-03 21:28 2082
    ImGuiWindowDockStyleCol_TabSelectedOverline,
1193b4be Poul Sander 2025-02-03 21:28 2083
    ImGuiWindowDockStyleCol_TabDimmed,
1193b4be Poul Sander 2025-02-03 21:28 2084
    ImGuiWindowDockStyleCol_TabDimmedSelected,
1193b4be Poul Sander 2025-02-03 21:28 2085
    ImGuiWindowDockStyleCol_TabDimmedSelectedOverline,
1193b4be Poul Sander 2025-02-03 21:28 2086
    ImGuiWindowDockStyleCol_COUNT
1193b4be Poul Sander 2025-02-03 21:28 2087
};
1193b4be Poul Sander 2025-02-03 21:28 2088
1193b4be Poul Sander 2025-02-03 21:28 2089
// We don't store style.Alpha: dock_node->LastBgColor embeds it and otherwise it would only affect the docking tab, which intuitively I would say we don't want to.
1193b4be Poul Sander 2025-02-03 21:28 2090
struct ImGuiWindowDockStyle
1193b4be Poul Sander 2025-02-03 21:28 2091
{
1193b4be Poul Sander 2025-02-03 21:28 2092
    ImU32 Colors[ImGuiWindowDockStyleCol_COUNT];
1193b4be Poul Sander 2025-02-03 21:28 2093
};
1193b4be Poul Sander 2025-02-03 21:28 2094
1193b4be Poul Sander 2025-02-03 21:28 2095
struct ImGuiDockContext
1193b4be Poul Sander 2025-02-03 21:28 2096
{
1193b4be Poul Sander 2025-02-03 21:28 2097
    ImGuiStorage                    Nodes;          // Map ID -> ImGuiDockNode*: Active nodes
1193b4be Poul Sander 2025-02-03 21:28 2098
    ImVector<ImGuiDockRequest>      Requests;
1193b4be Poul Sander 2025-02-03 21:28 2099
    ImVector<ImGuiDockNodeSettings> NodesSettings;
1193b4be Poul Sander 2025-02-03 21:28 2100
    bool                            WantFullRebuild;
1193b4be Poul Sander 2025-02-03 21:28 2101
    ImGuiDockContext()              { memset(this, 0, sizeof(*this)); }
1193b4be Poul Sander 2025-02-03 21:28 2102
};
1193b4be Poul Sander 2025-02-03 21:28 2103
1193b4be Poul Sander 2025-02-03 21:28 2104
#endif // #ifdef IMGUI_HAS_DOCK
1193b4be Poul Sander 2025-02-03 21:28 2105
1193b4be Poul Sander 2025-02-03 21:28 2106
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 2107
// [SECTION] Viewport support
1193b4be Poul Sander 2025-02-03 21:28 2108
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 2109
1193b4be Poul Sander 2025-02-03 21:28 2110
// ImGuiViewport Private/Internals fields (cardinal sin: we are using inheritance!)
1193b4be Poul Sander 2025-02-03 21:28 2111
// Every instance of ImGuiViewport is in fact a ImGuiViewportP.
1193b4be Poul Sander 2025-02-03 21:28 2112
struct ImGuiViewportP : public ImGuiViewport
1193b4be Poul Sander 2025-02-03 21:28 2113
{
1193b4be Poul Sander 2025-02-03 21:28 2114
    ImGuiWindow*        Window;                 // Set when the viewport is owned by a window (and ImGuiViewportFlags_CanHostOtherWindows is NOT set)
1193b4be Poul Sander 2025-02-03 21:28 2115
    int                 Idx;
1193b4be Poul Sander 2025-02-03 21:28 2116
    int                 LastFrameActive;        // Last frame number this viewport was activated by a window
1193b4be Poul Sander 2025-02-03 21:28 2117
    int                 LastFocusedStampCount;  // Last stamp number from when a window hosted by this viewport was focused (by comparing this value between two viewport we have an implicit viewport z-order we use as fallback)
1193b4be Poul Sander 2025-02-03 21:28 2118
    ImGuiID             LastNameHash;
1193b4be Poul Sander 2025-02-03 21:28 2119
    ImVec2              LastPos;
1193b4be Poul Sander 2025-02-03 21:28 2120
    ImVec2              LastSize;
1193b4be Poul Sander 2025-02-03 21:28 2121
    float               Alpha;                  // Window opacity (when dragging dockable windows/viewports we make them transparent)
1193b4be Poul Sander 2025-02-03 21:28 2122
    float               LastAlpha;
1193b4be Poul Sander 2025-02-03 21:28 2123
    bool                LastFocusedHadNavWindow;// Instead of maintaining a LastFocusedWindow (which may harder to correctly maintain), we merely store weither NavWindow != NULL last time the viewport was focused.
1193b4be Poul Sander 2025-02-03 21:28 2124
    short               PlatformMonitor;
1193b4be Poul Sander 2025-02-03 21:28 2125
    int                 BgFgDrawListsLastFrame[2]; // Last frame number the background (0) and foreground (1) draw lists were used
1193b4be Poul Sander 2025-02-03 21:28 2126
    ImDrawList*         BgFgDrawLists[2];       // Convenience background (0) and foreground (1) draw lists. We use them to draw software mouser cursor when io.MouseDrawCursor is set and to draw most debug overlays.
1193b4be Poul Sander 2025-02-03 21:28 2127
    ImDrawData          DrawDataP;
1193b4be Poul Sander 2025-02-03 21:28 2128
    ImDrawDataBuilder   DrawDataBuilder;        // Temporary data while building final ImDrawData
1193b4be Poul Sander 2025-02-03 21:28 2129
    ImVec2              LastPlatformPos;
1193b4be Poul Sander 2025-02-03 21:28 2130
    ImVec2              LastPlatformSize;
1193b4be Poul Sander 2025-02-03 21:28 2131
    ImVec2              LastRendererSize;
1193b4be Poul Sander 2025-02-03 21:28 2132
1193b4be Poul Sander 2025-02-03 21:28 2133
    // Per-viewport work area
1193b4be Poul Sander 2025-02-03 21:28 2134
    // - Insets are >= 0.0f values, distance from viewport corners to work area.
1193b4be Poul Sander 2025-02-03 21:28 2135
    // - BeginMainMenuBar() and DockspaceOverViewport() tend to use work area to avoid stepping over existing contents.
1193b4be Poul Sander 2025-02-03 21:28 2136
    // - Generally 'safeAreaInsets' in iOS land, 'DisplayCutout' in Android land.
1193b4be Poul Sander 2025-02-03 21:28 2137
    ImVec2              WorkInsetMin;           // Work Area inset locked for the frame. GetWorkRect() always fits within GetMainRect().
1193b4be Poul Sander 2025-02-03 21:28 2138
    ImVec2              WorkInsetMax;           // "
1193b4be Poul Sander 2025-02-03 21:28 2139
    ImVec2              BuildWorkInsetMin;      // Work Area inset accumulator for current frame, to become next frame's WorkInset
1193b4be Poul Sander 2025-02-03 21:28 2140
    ImVec2              BuildWorkInsetMax;      // "
1193b4be Poul Sander 2025-02-03 21:28 2141
1193b4be Poul Sander 2025-02-03 21:28 2142
    ImGuiViewportP()                    { Window = NULL; Idx = -1; LastFrameActive = BgFgDrawListsLastFrame[0] = BgFgDrawListsLastFrame[1] = LastFocusedStampCount = -1; LastNameHash = 0; Alpha = LastAlpha = 1.0f; LastFocusedHadNavWindow = false; PlatformMonitor = -1; BgFgDrawLists[0] = BgFgDrawLists[1] = NULL; LastPlatformPos = LastPlatformSize = LastRendererSize = ImVec2(FLT_MAX, FLT_MAX); }
1193b4be Poul Sander 2025-02-03 21:28 2143
    ~ImGuiViewportP()                   { if (BgFgDrawLists[0]) IM_DELETE(BgFgDrawLists[0]); if (BgFgDrawLists[1]) IM_DELETE(BgFgDrawLists[1]); }
1193b4be Poul Sander 2025-02-03 21:28 2144
    void    ClearRequestFlags()         { PlatformRequestClose = PlatformRequestMove = PlatformRequestResize = false; }
1193b4be Poul Sander 2025-02-03 21:28 2145
1193b4be Poul Sander 2025-02-03 21:28 2146
    // Calculate work rect pos/size given a set of offset (we have 1 pair of offset for rect locked from last frame data, and 1 pair for currently building rect)
1193b4be Poul Sander 2025-02-03 21:28 2147
    ImVec2  CalcWorkRectPos(const ImVec2& inset_min) const                           { return ImVec2(Pos.x + inset_min.x, Pos.y + inset_min.y); }
1193b4be Poul Sander 2025-02-03 21:28 2148
    ImVec2  CalcWorkRectSize(const ImVec2& inset_min, const ImVec2& inset_max) const { return ImVec2(ImMax(0.0f, Size.x - inset_min.x - inset_max.x), ImMax(0.0f, Size.y - inset_min.y - inset_max.y)); }
1193b4be Poul Sander 2025-02-03 21:28 2149
    void    UpdateWorkRect()            { WorkPos = CalcWorkRectPos(WorkInsetMin); WorkSize = CalcWorkRectSize(WorkInsetMin, WorkInsetMax); } // Update public fields
1193b4be Poul Sander 2025-02-03 21:28 2150
1193b4be Poul Sander 2025-02-03 21:28 2151
    // Helpers to retrieve ImRect (we don't need to store BuildWorkRect as every access tend to change it, hence the code asymmetry)
1193b4be Poul Sander 2025-02-03 21:28 2152
    ImRect  GetMainRect() const         { return ImRect(Pos.x, Pos.y, Pos.x + Size.x, Pos.y + Size.y); }
1193b4be Poul Sander 2025-02-03 21:28 2153
    ImRect  GetWorkRect() const         { return ImRect(WorkPos.x, WorkPos.y, WorkPos.x + WorkSize.x, WorkPos.y + WorkSize.y); }
1193b4be Poul Sander 2025-02-03 21:28 2154
    ImRect  GetBuildWorkRect() const    { ImVec2 pos = CalcWorkRectPos(BuildWorkInsetMin); ImVec2 size = CalcWorkRectSize(BuildWorkInsetMin, BuildWorkInsetMax); return ImRect(pos.x, pos.y, pos.x + size.x, pos.y + size.y); }
1193b4be Poul Sander 2025-02-03 21:28 2155
};
1193b4be Poul Sander 2025-02-03 21:28 2156
1193b4be Poul Sander 2025-02-03 21:28 2157
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 2158
// [SECTION] Settings support
1193b4be Poul Sander 2025-02-03 21:28 2159
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 2160
1193b4be Poul Sander 2025-02-03 21:28 2161
// Windows data saved in imgui.ini file
1193b4be Poul Sander 2025-02-03 21:28 2162
// Because we never destroy or rename ImGuiWindowSettings, we can store the names in a separate buffer easily.
1193b4be Poul Sander 2025-02-03 21:28 2163
// (this is designed to be stored in a ImChunkStream buffer, with the variable-length Name following our structure)
1193b4be Poul Sander 2025-02-03 21:28 2164
struct ImGuiWindowSettings
1193b4be Poul Sander 2025-02-03 21:28 2165
{
1193b4be Poul Sander 2025-02-03 21:28 2166
    ImGuiID     ID;
1193b4be Poul Sander 2025-02-03 21:28 2167
    ImVec2ih    Pos;            // NB: Settings position are stored RELATIVE to the viewport! Whereas runtime ones are absolute positions.
1193b4be Poul Sander 2025-02-03 21:28 2168
    ImVec2ih    Size;
1193b4be Poul Sander 2025-02-03 21:28 2169
    ImVec2ih    ViewportPos;
1193b4be Poul Sander 2025-02-03 21:28 2170
    ImGuiID     ViewportId;
1193b4be Poul Sander 2025-02-03 21:28 2171
    ImGuiID     DockId;         // ID of last known DockNode (even if the DockNode is invisible because it has only 1 active window), or 0 if none.
1193b4be Poul Sander 2025-02-03 21:28 2172
    ImGuiID     ClassId;        // ID of window class if specified
1193b4be Poul Sander 2025-02-03 21:28 2173
    short       DockOrder;      // Order of the last time the window was visible within its DockNode. This is used to reorder windows that are reappearing on the same frame. Same value between windows that were active and windows that were none are possible.
1193b4be Poul Sander 2025-02-03 21:28 2174
    bool        Collapsed;
1193b4be Poul Sander 2025-02-03 21:28 2175
    bool        IsChild;
1193b4be Poul Sander 2025-02-03 21:28 2176
    bool        WantApply;      // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context)
1193b4be Poul Sander 2025-02-03 21:28 2177
    bool        WantDelete;     // Set to invalidate/delete the settings entry
1193b4be Poul Sander 2025-02-03 21:28 2178
1193b4be Poul Sander 2025-02-03 21:28 2179
    ImGuiWindowSettings()       { memset(this, 0, sizeof(*this)); DockOrder = -1; }
1193b4be Poul Sander 2025-02-03 21:28 2180
    char* GetName()             { return (char*)(this + 1); }
1193b4be Poul Sander 2025-02-03 21:28 2181
};
1193b4be Poul Sander 2025-02-03 21:28 2182
1193b4be Poul Sander 2025-02-03 21:28 2183
struct ImGuiSettingsHandler
1193b4be Poul Sander 2025-02-03 21:28 2184
{
1193b4be Poul Sander 2025-02-03 21:28 2185
    const char* TypeName;       // Short description stored in .ini file. Disallowed characters: '[' ']'
1193b4be Poul Sander 2025-02-03 21:28 2186
    ImGuiID     TypeHash;       // == ImHashStr(TypeName)
1193b4be Poul Sander 2025-02-03 21:28 2187
    void        (*ClearAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler);                                // Clear all settings data
1193b4be Poul Sander 2025-02-03 21:28 2188
    void        (*ReadInitFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler);                                // Read: Called before reading (in registration order)
1193b4be Poul Sander 2025-02-03 21:28 2189
    void*       (*ReadOpenFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, const char* name);              // Read: Called when entering into a new ini entry e.g. "[Window][Name]"
1193b4be Poul Sander 2025-02-03 21:28 2190
    void        (*ReadLineFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, void* entry, const char* line); // Read: Called for every line of text within an ini entry
1193b4be Poul Sander 2025-02-03 21:28 2191
    void        (*ApplyAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler);                                // Read: Called after reading (in registration order)
1193b4be Poul Sander 2025-02-03 21:28 2192
    void        (*WriteAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* out_buf);      // Write: Output every entries into 'out_buf'
1193b4be Poul Sander 2025-02-03 21:28 2193
    void*       UserData;
1193b4be Poul Sander 2025-02-03 21:28 2194
1193b4be Poul Sander 2025-02-03 21:28 2195
    ImGuiSettingsHandler() { memset(this, 0, sizeof(*this)); }
1193b4be Poul Sander 2025-02-03 21:28 2196
};
1193b4be Poul Sander 2025-02-03 21:28 2197
1193b4be Poul Sander 2025-02-03 21:28 2198
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 2199
// [SECTION] Localization support
1193b4be Poul Sander 2025-02-03 21:28 2200
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 2201
1193b4be Poul Sander 2025-02-03 21:28 2202
// This is experimental and not officially supported, it'll probably fall short of features, if/when it does we may backtrack.
1193b4be Poul Sander 2025-02-03 21:28 2203
enum ImGuiLocKey : int
1193b4be Poul Sander 2025-02-03 21:28 2204
{
1193b4be Poul Sander 2025-02-03 21:28 2205
    ImGuiLocKey_VersionStr,
1193b4be Poul Sander 2025-02-03 21:28 2206
    ImGuiLocKey_TableSizeOne,
1193b4be Poul Sander 2025-02-03 21:28 2207
    ImGuiLocKey_TableSizeAllFit,
1193b4be Poul Sander 2025-02-03 21:28 2208
    ImGuiLocKey_TableSizeAllDefault,
1193b4be Poul Sander 2025-02-03 21:28 2209
    ImGuiLocKey_TableResetOrder,
1193b4be Poul Sander 2025-02-03 21:28 2210
    ImGuiLocKey_WindowingMainMenuBar,
1193b4be Poul Sander 2025-02-03 21:28 2211
    ImGuiLocKey_WindowingPopup,
1193b4be Poul Sander 2025-02-03 21:28 2212
    ImGuiLocKey_WindowingUntitled,
1193b4be Poul Sander 2025-02-03 21:28 2213
    ImGuiLocKey_OpenLink_s,
1193b4be Poul Sander 2025-02-03 21:28 2214
    ImGuiLocKey_CopyLink,
1193b4be Poul Sander 2025-02-03 21:28 2215
    ImGuiLocKey_DockingHideTabBar,
1193b4be Poul Sander 2025-02-03 21:28 2216
    ImGuiLocKey_DockingHoldShiftToDock,
1193b4be Poul Sander 2025-02-03 21:28 2217
    ImGuiLocKey_DockingDragToUndockOrMoveNode,
1193b4be Poul Sander 2025-02-03 21:28 2218
    ImGuiLocKey_COUNT
1193b4be Poul Sander 2025-02-03 21:28 2219
};
1193b4be Poul Sander 2025-02-03 21:28 2220
1193b4be Poul Sander 2025-02-03 21:28 2221
struct ImGuiLocEntry
1193b4be Poul Sander 2025-02-03 21:28 2222
{
1193b4be Poul Sander 2025-02-03 21:28 2223
    ImGuiLocKey     Key;
1193b4be Poul Sander 2025-02-03 21:28 2224
    const char*     Text;
1193b4be Poul Sander 2025-02-03 21:28 2225
};
1193b4be Poul Sander 2025-02-03 21:28 2226
1193b4be Poul Sander 2025-02-03 21:28 2227
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 2228
// [SECTION] Error handling, State recovery support
1193b4be Poul Sander 2025-02-03 21:28 2229
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 2230
1193b4be Poul Sander 2025-02-03 21:28 2231
// Macros used by Recoverable Error handling
1193b4be Poul Sander 2025-02-03 21:28 2232
// - Only dispatch error if _EXPR: evaluate as assert (similar to an assert macro).
1193b4be Poul Sander 2025-02-03 21:28 2233
// - The message will always be a string literal, in order to increase likelihood of being display by an assert handler.
1193b4be Poul Sander 2025-02-03 21:28 2234
// - See 'Demo->Configuration->Error Handling' and ImGuiIO definitions for details on error handling.
1193b4be Poul Sander 2025-02-03 21:28 2235
// - Read https://github.com/ocornut/imgui/wiki/Error-Handling for details on error handling.
1193b4be Poul Sander 2025-02-03 21:28 2236
#ifndef IM_ASSERT_USER_ERROR
1193b4be Poul Sander 2025-02-03 21:28 2237
#define IM_ASSERT_USER_ERROR(_EXPR,_MSG)    do { if (!(_EXPR) && ImGui::ErrorLog(_MSG)) { IM_ASSERT((_EXPR) && _MSG); } } while (0)    // Recoverable User Error
1193b4be Poul Sander 2025-02-03 21:28 2238
#endif
1193b4be Poul Sander 2025-02-03 21:28 2239
1193b4be Poul Sander 2025-02-03 21:28 2240
// The error callback is currently not public, as it is expected that only advanced users will rely on it.
1193b4be Poul Sander 2025-02-03 21:28 2241
typedef void (*ImGuiErrorCallback)(ImGuiContext* ctx, void* user_data, const char* msg); // Function signature for g.ErrorCallback
1193b4be Poul Sander 2025-02-03 21:28 2242
1193b4be Poul Sander 2025-02-03 21:28 2243
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 2244
// [SECTION] Metrics, Debug Tools
1193b4be Poul Sander 2025-02-03 21:28 2245
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 2246
4e9e2555 Poul Sander 2025-10-05 10:15 2247
// See IMGUI_DEBUG_LOG() and IMGUI_DEBUG_LOG_XXX() macros.
1193b4be Poul Sander 2025-02-03 21:28 2248
enum ImGuiDebugLogFlags_
1193b4be Poul Sander 2025-02-03 21:28 2249
{
1193b4be Poul Sander 2025-02-03 21:28 2250
    // Event types
1193b4be Poul Sander 2025-02-03 21:28 2251
    ImGuiDebugLogFlags_None                 = 0,
1193b4be Poul Sander 2025-02-03 21:28 2252
    ImGuiDebugLogFlags_EventError           = 1 << 0,   // Error submitted by IM_ASSERT_USER_ERROR()
1193b4be Poul Sander 2025-02-03 21:28 2253
    ImGuiDebugLogFlags_EventActiveId        = 1 << 1,
1193b4be Poul Sander 2025-02-03 21:28 2254
    ImGuiDebugLogFlags_EventFocus           = 1 << 2,
1193b4be Poul Sander 2025-02-03 21:28 2255
    ImGuiDebugLogFlags_EventPopup           = 1 << 3,
1193b4be Poul Sander 2025-02-03 21:28 2256
    ImGuiDebugLogFlags_EventNav             = 1 << 4,
1193b4be Poul Sander 2025-02-03 21:28 2257
    ImGuiDebugLogFlags_EventClipper         = 1 << 5,
1193b4be Poul Sander 2025-02-03 21:28 2258
    ImGuiDebugLogFlags_EventSelection       = 1 << 6,
1193b4be Poul Sander 2025-02-03 21:28 2259
    ImGuiDebugLogFlags_EventIO              = 1 << 7,
4e9e2555 Poul Sander 2025-10-05 10:15 2260
    ImGuiDebugLogFlags_EventFont            = 1 << 8,
4e9e2555 Poul Sander 2025-10-05 10:15 2261
    ImGuiDebugLogFlags_EventInputRouting    = 1 << 9,
4e9e2555 Poul Sander 2025-10-05 10:15 2262
    ImGuiDebugLogFlags_EventDocking         = 1 << 10,
4e9e2555 Poul Sander 2025-10-05 10:15 2263
    ImGuiDebugLogFlags_EventViewport        = 1 << 11,
1193b4be Poul Sander 2025-02-03 21:28 2264
4e9e2555 Poul Sander 2025-10-05 10:15 2265
    ImGuiDebugLogFlags_EventMask_           = ImGuiDebugLogFlags_EventError | ImGuiDebugLogFlags_EventActiveId | ImGuiDebugLogFlags_EventFocus | ImGuiDebugLogFlags_EventPopup | ImGuiDebugLogFlags_EventNav | ImGuiDebugLogFlags_EventClipper | ImGuiDebugLogFlags_EventSelection | ImGuiDebugLogFlags_EventIO | ImGuiDebugLogFlags_EventFont | ImGuiDebugLogFlags_EventInputRouting | ImGuiDebugLogFlags_EventDocking | ImGuiDebugLogFlags_EventViewport,
1193b4be Poul Sander 2025-02-03 21:28 2266
    ImGuiDebugLogFlags_OutputToTTY          = 1 << 20,  // Also send output to TTY
1193b4be Poul Sander 2025-02-03 21:28 2267
    ImGuiDebugLogFlags_OutputToTestEngine   = 1 << 21,  // Also send output to Test Engine
1193b4be Poul Sander 2025-02-03 21:28 2268
};
1193b4be Poul Sander 2025-02-03 21:28 2269
1193b4be Poul Sander 2025-02-03 21:28 2270
struct ImGuiDebugAllocEntry
1193b4be Poul Sander 2025-02-03 21:28 2271
{
1193b4be Poul Sander 2025-02-03 21:28 2272
    int         FrameCount;
1193b4be Poul Sander 2025-02-03 21:28 2273
    ImS16       AllocCount;
1193b4be Poul Sander 2025-02-03 21:28 2274
    ImS16       FreeCount;
1193b4be Poul Sander 2025-02-03 21:28 2275
};
1193b4be Poul Sander 2025-02-03 21:28 2276
1193b4be Poul Sander 2025-02-03 21:28 2277
struct ImGuiDebugAllocInfo
1193b4be Poul Sander 2025-02-03 21:28 2278
{
1193b4be Poul Sander 2025-02-03 21:28 2279
    int         TotalAllocCount;            // Number of call to MemAlloc().
1193b4be Poul Sander 2025-02-03 21:28 2280
    int         TotalFreeCount;
1193b4be Poul Sander 2025-02-03 21:28 2281
    ImS16       LastEntriesIdx;             // Current index in buffer
1193b4be Poul Sander 2025-02-03 21:28 2282
    ImGuiDebugAllocEntry LastEntriesBuf[6]; // Track last 6 frames that had allocations
1193b4be Poul Sander 2025-02-03 21:28 2283
1193b4be Poul Sander 2025-02-03 21:28 2284
    ImGuiDebugAllocInfo() { memset(this, 0, sizeof(*this)); }
1193b4be Poul Sander 2025-02-03 21:28 2285
};
1193b4be Poul Sander 2025-02-03 21:28 2286
1193b4be Poul Sander 2025-02-03 21:28 2287
struct ImGuiMetricsConfig
1193b4be Poul Sander 2025-02-03 21:28 2288
{
1193b4be Poul Sander 2025-02-03 21:28 2289
    bool        ShowDebugLog = false;
1193b4be Poul Sander 2025-02-03 21:28 2290
    bool        ShowIDStackTool = false;
1193b4be Poul Sander 2025-02-03 21:28 2291
    bool        ShowWindowsRects = false;
1193b4be Poul Sander 2025-02-03 21:28 2292
    bool        ShowWindowsBeginOrder = false;
1193b4be Poul Sander 2025-02-03 21:28 2293
    bool        ShowTablesRects = false;
1193b4be Poul Sander 2025-02-03 21:28 2294
    bool        ShowDrawCmdMesh = true;
1193b4be Poul Sander 2025-02-03 21:28 2295
    bool        ShowDrawCmdBoundingBoxes = true;
1193b4be Poul Sander 2025-02-03 21:28 2296
    bool        ShowTextEncodingViewer = false;
4e9e2555 Poul Sander 2025-10-05 10:15 2297
    bool        ShowTextureUsedRect = false;
1193b4be Poul Sander 2025-02-03 21:28 2298
    bool        ShowDockingNodes = false;
1193b4be Poul Sander 2025-02-03 21:28 2299
    int         ShowWindowsRectsType = -1;
1193b4be Poul Sander 2025-02-03 21:28 2300
    int         ShowTablesRectsType = -1;
1193b4be Poul Sander 2025-02-03 21:28 2301
    int         HighlightMonitorIdx = -1;
1193b4be Poul Sander 2025-02-03 21:28 2302
    ImGuiID     HighlightViewportID = 0;
4e9e2555 Poul Sander 2025-10-05 10:15 2303
    bool        ShowFontPreview = true;
1193b4be Poul Sander 2025-02-03 21:28 2304
};
1193b4be Poul Sander 2025-02-03 21:28 2305
1193b4be Poul Sander 2025-02-03 21:28 2306
struct ImGuiStackLevelInfo
1193b4be Poul Sander 2025-02-03 21:28 2307
{
1193b4be Poul Sander 2025-02-03 21:28 2308
    ImGuiID                 ID;
1193b4be Poul Sander 2025-02-03 21:28 2309
    ImS8                    QueryFrameCount;            // >= 1: Query in progress
1193b4be Poul Sander 2025-02-03 21:28 2310
    bool                    QuerySuccess;               // Obtained result from DebugHookIdInfo()
4e9e2555 Poul Sander 2025-10-05 10:15 2311
    ImS8                    DataType;                   // ImGuiDataType
4e9e2555 Poul Sander 2025-10-05 10:15 2312
    int                     DescOffset;                 // -1 or offset into parent's ResultPathsBuf
1193b4be Poul Sander 2025-02-03 21:28 2313
4e9e2555 Poul Sander 2025-10-05 10:15 2314
    ImGuiStackLevelInfo()   { memset(this, 0, sizeof(*this)); DescOffset = -1; }
1193b4be Poul Sander 2025-02-03 21:28 2315
};
1193b4be Poul Sander 2025-02-03 21:28 2316
1193b4be Poul Sander 2025-02-03 21:28 2317
// State for ID Stack tool queries
1193b4be Poul Sander 2025-02-03 21:28 2318
struct ImGuiIDStackTool
1193b4be Poul Sander 2025-02-03 21:28 2319
{
1193b4be Poul Sander 2025-02-03 21:28 2320
    int                     LastActiveFrame;
1193b4be Poul Sander 2025-02-03 21:28 2321
    int                     StackLevel;                 // -1: query stack and resize Results, >= 0: individual stack level
4e9e2555 Poul Sander 2025-10-05 10:15 2322
    ImGuiID                 QueryMainId;                // ID to query details for
1193b4be Poul Sander 2025-02-03 21:28 2323
    ImVector<ImGuiStackLevelInfo> Results;
4e9e2555 Poul Sander 2025-10-05 10:15 2324
    bool                    QueryHookActive;            // Used to disambiguate the case where DebugHookIdInfoId == 0 which is valid.
4e9e2555 Poul Sander 2025-10-05 10:15 2325
    bool                    OptHexEncodeNonAsciiChars;
4e9e2555 Poul Sander 2025-10-05 10:15 2326
    bool                    OptCopyToClipboardOnCtrlC;
1193b4be Poul Sander 2025-02-03 21:28 2327
    float                   CopyToClipboardLastTime;
4e9e2555 Poul Sander 2025-10-05 10:15 2328
    ImGuiTextBuffer         ResultPathsBuf;
4e9e2555 Poul Sander 2025-10-05 10:15 2329
    ImGuiTextBuffer         ResultTempBuf;
1193b4be Poul Sander 2025-02-03 21:28 2330
4e9e2555 Poul Sander 2025-10-05 10:15 2331
    ImGuiIDStackTool()      { memset(this, 0, sizeof(*this)); LastActiveFrame = -1; OptHexEncodeNonAsciiChars = true; CopyToClipboardLastTime = -FLT_MAX; }
1193b4be Poul Sander 2025-02-03 21:28 2332
};
1193b4be Poul Sander 2025-02-03 21:28 2333
1193b4be Poul Sander 2025-02-03 21:28 2334
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 2335
// [SECTION] Generic context hooks
1193b4be Poul Sander 2025-02-03 21:28 2336
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 2337
1193b4be Poul Sander 2025-02-03 21:28 2338
typedef void (*ImGuiContextHookCallback)(ImGuiContext* ctx, ImGuiContextHook* hook);
1193b4be Poul Sander 2025-02-03 21:28 2339
enum ImGuiContextHookType { ImGuiContextHookType_NewFramePre, ImGuiContextHookType_NewFramePost, ImGuiContextHookType_EndFramePre, ImGuiContextHookType_EndFramePost, ImGuiContextHookType_RenderPre, ImGuiContextHookType_RenderPost, ImGuiContextHookType_Shutdown, ImGuiContextHookType_PendingRemoval_ };
1193b4be Poul Sander 2025-02-03 21:28 2340
1193b4be Poul Sander 2025-02-03 21:28 2341
struct ImGuiContextHook
1193b4be Poul Sander 2025-02-03 21:28 2342
{
1193b4be Poul Sander 2025-02-03 21:28 2343
    ImGuiID                     HookId;     // A unique ID assigned by AddContextHook()
1193b4be Poul Sander 2025-02-03 21:28 2344
    ImGuiContextHookType        Type;
1193b4be Poul Sander 2025-02-03 21:28 2345
    ImGuiID                     Owner;
1193b4be Poul Sander 2025-02-03 21:28 2346
    ImGuiContextHookCallback    Callback;
1193b4be Poul Sander 2025-02-03 21:28 2347
    void*                       UserData;
1193b4be Poul Sander 2025-02-03 21:28 2348
1193b4be Poul Sander 2025-02-03 21:28 2349
    ImGuiContextHook()          { memset(this, 0, sizeof(*this)); }
1193b4be Poul Sander 2025-02-03 21:28 2350
};
1193b4be Poul Sander 2025-02-03 21:28 2351
1193b4be Poul Sander 2025-02-03 21:28 2352
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 2353
// [SECTION] ImGuiContext (main Dear ImGui context)
1193b4be Poul Sander 2025-02-03 21:28 2354
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 2355
1193b4be Poul Sander 2025-02-03 21:28 2356
struct ImGuiContext
1193b4be Poul Sander 2025-02-03 21:28 2357
{
1193b4be Poul Sander 2025-02-03 21:28 2358
    bool                    Initialized;
1193b4be Poul Sander 2025-02-03 21:28 2359
    ImGuiIO                 IO;
1193b4be Poul Sander 2025-02-03 21:28 2360
    ImGuiPlatformIO         PlatformIO;
1193b4be Poul Sander 2025-02-03 21:28 2361
    ImGuiStyle              Style;
1193b4be Poul Sander 2025-02-03 21:28 2362
    ImGuiConfigFlags        ConfigFlagsCurrFrame;               // = g.IO.ConfigFlags at the time of NewFrame()
1193b4be Poul Sander 2025-02-03 21:28 2363
    ImGuiConfigFlags        ConfigFlagsLastFrame;
4e9e2555 Poul Sander 2025-10-05 10:15 2364
    ImVector<ImFontAtlas*>  FontAtlases;                        // List of font atlases used by the context (generally only contains g.IO.Fonts aka the main font atlas)
4e9e2555 Poul Sander 2025-10-05 10:15 2365
    ImFont*                 Font;                               // Currently bound font. (== FontStack.back().Font)
4e9e2555 Poul Sander 2025-10-05 10:15 2366
    ImFontBaked*            FontBaked;                          // Currently bound font at currently bound size. (== Font->GetFontBaked(FontSize))
4e9e2555 Poul Sander 2025-10-05 10:15 2367
    float                   FontSize;                           // Currently bound font size == line height (== FontSizeBase + externals scales applied in the UpdateCurrentFontSize() function).
4e9e2555 Poul Sander 2025-10-05 10:15 2368
    float                   FontSizeBase;                       // Font size before scaling == style.FontSizeBase == value passed to PushFont() when specified.
4e9e2555 Poul Sander 2025-10-05 10:15 2369
    float                   FontBakedScale;                     // == FontBaked->Size / FontSize. Scale factor over baked size. Rarely used nowadays, very often == 1.0f.
4e9e2555 Poul Sander 2025-10-05 10:15 2370
    float                   FontRasterizerDensity;              // Current font density. Used by all calls to GetFontBaked().
1193b4be Poul Sander 2025-02-03 21:28 2371
    float                   CurrentDpiScale;                    // Current window/viewport DpiScale == CurrentViewport->DpiScale
1193b4be Poul Sander 2025-02-03 21:28 2372
    ImDrawListSharedData    DrawListSharedData;
1193b4be Poul Sander 2025-02-03 21:28 2373
    double                  Time;
1193b4be Poul Sander 2025-02-03 21:28 2374
    int                     FrameCount;
1193b4be Poul Sander 2025-02-03 21:28 2375
    int                     FrameCountEnded;
1193b4be Poul Sander 2025-02-03 21:28 2376
    int                     FrameCountPlatformEnded;
1193b4be Poul Sander 2025-02-03 21:28 2377
    int                     FrameCountRendered;
4e9e2555 Poul Sander 2025-10-05 10:15 2378
    ImGuiID                 WithinEndChildID;                   // Set within EndChild()
1193b4be Poul Sander 2025-02-03 21:28 2379
    bool                    WithinFrameScope;                   // Set by NewFrame(), cleared by EndFrame()
1193b4be Poul Sander 2025-02-03 21:28 2380
    bool                    WithinFrameScopeWithImplicitWindow; // Set by NewFrame(), cleared by EndFrame() when the implicit debug window has been pushed
1193b4be Poul Sander 2025-02-03 21:28 2381
    bool                    GcCompactAll;                       // Request full GC
1193b4be Poul Sander 2025-02-03 21:28 2382
    bool                    TestEngineHookItems;                // Will call test engine hooks: ImGuiTestEngineHook_ItemAdd(), ImGuiTestEngineHook_ItemInfo(), ImGuiTestEngineHook_Log()
1193b4be Poul Sander 2025-02-03 21:28 2383
    void*                   TestEngine;                         // Test engine user data
1193b4be Poul Sander 2025-02-03 21:28 2384
    char                    ContextName[16];                    // Storage for a context name (to facilitate debugging multi-context setups)
1193b4be Poul Sander 2025-02-03 21:28 2385
1193b4be Poul Sander 2025-02-03 21:28 2386
    // Inputs
1193b4be Poul Sander 2025-02-03 21:28 2387
    ImVector<ImGuiInputEvent> InputEventsQueue;                 // Input events which will be trickled/written into IO structure.
1193b4be Poul Sander 2025-02-03 21:28 2388
    ImVector<ImGuiInputEvent> InputEventsTrail;                 // Past input events processed in NewFrame(). This is to allow domain-specific application to access e.g mouse/pen trail.
1193b4be Poul Sander 2025-02-03 21:28 2389
    ImGuiMouseSource        InputEventsNextMouseSource;
1193b4be Poul Sander 2025-02-03 21:28 2390
    ImU32                   InputEventsNextEventId;
1193b4be Poul Sander 2025-02-03 21:28 2391
1193b4be Poul Sander 2025-02-03 21:28 2392
    // Windows state
1193b4be Poul Sander 2025-02-03 21:28 2393
    ImVector<ImGuiWindow*>  Windows;                            // Windows, sorted in display order, back to front
1193b4be Poul Sander 2025-02-03 21:28 2394
    ImVector<ImGuiWindow*>  WindowsFocusOrder;                  // Root windows, sorted in focus order, back to front.
1193b4be Poul Sander 2025-02-03 21:28 2395
    ImVector<ImGuiWindow*>  WindowsTempSortBuffer;              // Temporary buffer used in EndFrame() to reorder windows so parents are kept before their child
1193b4be Poul Sander 2025-02-03 21:28 2396
    ImVector<ImGuiWindowStackData> CurrentWindowStack;
1193b4be Poul Sander 2025-02-03 21:28 2397
    ImGuiStorage            WindowsById;                        // Map window's ImGuiID to ImGuiWindow*
1193b4be Poul Sander 2025-02-03 21:28 2398
    int                     WindowsActiveCount;                 // Number of unique windows submitted by frame
4e9e2555 Poul Sander 2025-10-05 10:15 2399
    float                   WindowsBorderHoverPadding;          // Padding around resizable windows for which hovering on counts as hovering the window == ImMax(style.TouchExtraPadding, style.WindowBorderHoverPadding). This isn't so multi-dpi friendly.
1193b4be Poul Sander 2025-02-03 21:28 2400
    ImGuiID                 DebugBreakInWindow;                 // Set to break in Begin() call.
1193b4be Poul Sander 2025-02-03 21:28 2401
    ImGuiWindow*            CurrentWindow;                      // Window being drawn into
1193b4be Poul Sander 2025-02-03 21:28 2402
    ImGuiWindow*            HoveredWindow;                      // Window the mouse is hovering. Will typically catch mouse inputs.
1193b4be Poul Sander 2025-02-03 21:28 2403
    ImGuiWindow*            HoveredWindowUnderMovingWindow;     // Hovered window ignoring MovingWindow. Only set if MovingWindow is set.
1193b4be Poul Sander 2025-02-03 21:28 2404
    ImGuiWindow*            HoveredWindowBeforeClear;           // Window the mouse is hovering. Filled even with _NoMouse. This is currently useful for multi-context compositors.
1193b4be Poul Sander 2025-02-03 21:28 2405
    ImGuiWindow*            MovingWindow;                       // Track the window we clicked on (in order to preserve focus). The actual window that is moved is generally MovingWindow->RootWindowDockTree.
1193b4be Poul Sander 2025-02-03 21:28 2406
    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.
1193b4be Poul Sander 2025-02-03 21:28 2407
    ImVec2                  WheelingWindowRefMousePos;
1193b4be Poul Sander 2025-02-03 21:28 2408
    int                     WheelingWindowStartFrame;           // This may be set one frame before WheelingWindow is != NULL
1193b4be Poul Sander 2025-02-03 21:28 2409
    int                     WheelingWindowScrolledFrame;
1193b4be Poul Sander 2025-02-03 21:28 2410
    float                   WheelingWindowReleaseTimer;
1193b4be Poul Sander 2025-02-03 21:28 2411
    ImVec2                  WheelingWindowWheelRemainder;
1193b4be Poul Sander 2025-02-03 21:28 2412
    ImVec2                  WheelingAxisAvg;
1193b4be Poul Sander 2025-02-03 21:28 2413
1193b4be Poul Sander 2025-02-03 21:28 2414
    // Item/widgets state and tracking information
4e9e2555 Poul Sander 2025-10-05 10:15 2415
    ImGuiID                 DebugDrawIdConflictsId;             // Set when we detect multiple items with the same identifier
4e9e2555 Poul Sander 2025-10-05 10:15 2416
    ImGuiID                 DebugHookIdInfoId;                  // Will call core hooks: DebugHookIdInfo() from GetID functions, used by ID Stack Tool [next HoveredId/ActiveId to not pull in an extra cache-line]
1193b4be Poul Sander 2025-02-03 21:28 2417
    ImGuiID                 HoveredId;                          // Hovered widget, filled during the frame
1193b4be Poul Sander 2025-02-03 21:28 2418
    ImGuiID                 HoveredIdPreviousFrame;
1193b4be Poul Sander 2025-02-03 21:28 2419
    int                     HoveredIdPreviousFrameItemCount;    // Count numbers of items using the same ID as last frame's hovered id
1193b4be Poul Sander 2025-02-03 21:28 2420
    float                   HoveredIdTimer;                     // Measure contiguous hovering time
1193b4be Poul Sander 2025-02-03 21:28 2421
    float                   HoveredIdNotActiveTimer;            // Measure contiguous hovering time where the item has not been active
1193b4be Poul Sander 2025-02-03 21:28 2422
    bool                    HoveredIdAllowOverlap;
1193b4be Poul Sander 2025-02-03 21:28 2423
    bool                    HoveredIdIsDisabled;                // At least one widget passed the rect test, but has been discarded by disabled flag or popup inhibit. May be true even if HoveredId == 0.
1193b4be Poul Sander 2025-02-03 21:28 2424
    bool                    ItemUnclipByLog;                    // Disable ItemAdd() clipping, essentially a memory-locality friendly copy of LogEnabled
1193b4be Poul Sander 2025-02-03 21:28 2425
    ImGuiID                 ActiveId;                           // Active widget
1193b4be Poul Sander 2025-02-03 21:28 2426
    ImGuiID                 ActiveIdIsAlive;                    // Active widget has been seen this frame (we can't use a bool as the ActiveId may change within the frame)
1193b4be Poul Sander 2025-02-03 21:28 2427
    float                   ActiveIdTimer;
1193b4be Poul Sander 2025-02-03 21:28 2428
    bool                    ActiveIdIsJustActivated;            // Set at the time of activation for one frame
1193b4be Poul Sander 2025-02-03 21:28 2429
    bool                    ActiveIdAllowOverlap;               // Active widget allows another widget to steal active id (generally for overlapping widgets, but not always)
1193b4be Poul Sander 2025-02-03 21:28 2430
    bool                    ActiveIdNoClearOnFocusLoss;         // Disable losing active id if the active id window gets unfocused.
1193b4be Poul Sander 2025-02-03 21:28 2431
    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.
1193b4be Poul Sander 2025-02-03 21:28 2432
    bool                    ActiveIdHasBeenEditedBefore;        // Was the value associated to the widget Edited over the course of the Active state.
1193b4be Poul Sander 2025-02-03 21:28 2433
    bool                    ActiveIdHasBeenEditedThisFrame;
1193b4be Poul Sander 2025-02-03 21:28 2434
    bool                    ActiveIdFromShortcut;
4e9e2555 Poul Sander 2025-10-05 10:15 2435
    ImGuiID                 ActiveIdDisabledId;                 // When clicking a disabled item we set ActiveId=window->MoveId to avoid interference with widget code. Actual item ID is stored here.
1193b4be Poul Sander 2025-02-03 21:28 2436
    int                     ActiveIdMouseButton : 8;
1193b4be Poul Sander 2025-02-03 21:28 2437
    ImVec2                  ActiveIdClickOffset;                // Clicked offset from upper-left corner, if applicable (currently only set by ButtonBehavior)
1193b4be Poul Sander 2025-02-03 21:28 2438
    ImGuiWindow*            ActiveIdWindow;
1193b4be Poul Sander 2025-02-03 21:28 2439
    ImGuiInputSource        ActiveIdSource;                     // Activating source: ImGuiInputSource_Mouse OR ImGuiInputSource_Keyboard OR ImGuiInputSource_Gamepad
1193b4be Poul Sander 2025-02-03 21:28 2440
    ImGuiID                 ActiveIdPreviousFrame;
4e9e2555 Poul Sander 2025-10-05 10:15 2441
    ImGuiDeactivatedItemData DeactivatedItemData;
4e9e2555 Poul Sander 2025-10-05 10:15 2442
    ImGuiDataTypeStorage    ActiveIdValueOnActivation;          // Backup of initial value at the time of activation. ONLY SET BY SPECIFIC WIDGETS: DragXXX and SliderXXX.
1193b4be Poul Sander 2025-02-03 21:28 2443
    ImGuiID                 LastActiveId;                       // Store the last non-zero ActiveId, useful for animation.
1193b4be Poul Sander 2025-02-03 21:28 2444
    float                   LastActiveIdTimer;                  // Store the last non-zero ActiveId timer since the beginning of activation, useful for animation.
1193b4be Poul Sander 2025-02-03 21:28 2445
1193b4be Poul Sander 2025-02-03 21:28 2446
    // Key/Input Ownership + Shortcut Routing system
1193b4be Poul Sander 2025-02-03 21:28 2447
    // - The idea is that instead of "eating" a given key, we can link to an owner.
1193b4be Poul Sander 2025-02-03 21:28 2448
    // - Input query can then read input by specifying ImGuiKeyOwner_Any (== 0), ImGuiKeyOwner_NoOwner (== -1) or a custom ID.
1193b4be Poul Sander 2025-02-03 21:28 2449
    // - Routing is requested ahead of time for a given chord (Key + Mods) and granted in NewFrame().
1193b4be Poul Sander 2025-02-03 21:28 2450
    double                  LastKeyModsChangeTime;              // Record the last time key mods changed (affect repeat delay when using shortcut logic)
1193b4be Poul Sander 2025-02-03 21:28 2451
    double                  LastKeyModsChangeFromNoneTime;      // Record the last time key mods changed away from being 0 (affect repeat delay when using shortcut logic)
1193b4be Poul Sander 2025-02-03 21:28 2452
    double                  LastKeyboardKeyPressTime;           // Record the last time a keyboard key (ignore mouse/gamepad ones) was pressed.
1193b4be Poul Sander 2025-02-03 21:28 2453
    ImBitArrayForNamedKeys  KeysMayBeCharInput;                 // Lookup to tell if a key can emit char input, see IsKeyChordPotentiallyCharInput(). sizeof() = 20 bytes
1193b4be Poul Sander 2025-02-03 21:28 2454
    ImGuiKeyOwnerData       KeysOwnerData[ImGuiKey_NamedKey_COUNT];
1193b4be Poul Sander 2025-02-03 21:28 2455
    ImGuiKeyRoutingTable    KeysRoutingTable;
1193b4be Poul Sander 2025-02-03 21:28 2456
    ImU32                   ActiveIdUsingNavDirMask;            // Active widget will want to read those nav move requests (e.g. can activate a button and move away from it)
1193b4be Poul Sander 2025-02-03 21:28 2457
    bool                    ActiveIdUsingAllKeyboardKeys;       // Active widget will want to read all keyboard keys inputs. (this is a shortcut for not taking ownership of 100+ keys, frequently used by drag operations)
1193b4be Poul Sander 2025-02-03 21:28 2458
    ImGuiKeyChord           DebugBreakInShortcutRouting;        // Set to break in SetShortcutRouting()/Shortcut() calls.
1193b4be Poul Sander 2025-02-03 21:28 2459
    //ImU32                 ActiveIdUsingNavInputMask;          // [OBSOLETE] Since (IMGUI_VERSION_NUM >= 18804) : 'g.ActiveIdUsingNavInputMask |= (1 << ImGuiNavInput_Cancel);' becomes --> 'SetKeyOwner(ImGuiKey_Escape, g.ActiveId) and/or SetKeyOwner(ImGuiKey_NavGamepadCancel, g.ActiveId);'
1193b4be Poul Sander 2025-02-03 21:28 2460
1193b4be Poul Sander 2025-02-03 21:28 2461
    // Next window/item data
1193b4be Poul Sander 2025-02-03 21:28 2462
    ImGuiID                 CurrentFocusScopeId;                // Value for currently appending items == g.FocusScopeStack.back(). Not to be mistaken with g.NavFocusScopeId.
1193b4be Poul Sander 2025-02-03 21:28 2463
    ImGuiItemFlags          CurrentItemFlags;                   // Value for currently appending items == g.ItemFlagsStack.back()
1193b4be Poul Sander 2025-02-03 21:28 2464
    ImGuiID                 DebugLocateId;                      // Storage for DebugLocateItemOnHover() feature: this is read by ItemAdd() so we keep it in a hot/cached location
1193b4be Poul Sander 2025-02-03 21:28 2465
    ImGuiNextItemData       NextItemData;                       // Storage for SetNextItem** functions
1193b4be Poul Sander 2025-02-03 21:28 2466
    ImGuiLastItemData       LastItemData;                       // Storage for last submitted item (setup by ItemAdd)
1193b4be Poul Sander 2025-02-03 21:28 2467
    ImGuiNextWindowData     NextWindowData;                     // Storage for SetNextWindow** functions
1193b4be Poul Sander 2025-02-03 21:28 2468
    bool                    DebugShowGroupRects;
1193b4be Poul Sander 2025-02-03 21:28 2469
1193b4be Poul Sander 2025-02-03 21:28 2470
    // Shared stacks
1193b4be Poul Sander 2025-02-03 21:28 2471
    ImGuiCol                        DebugFlashStyleColorIdx;    // (Keep close to ColorStack to share cache line)
1193b4be Poul Sander 2025-02-03 21:28 2472
    ImVector<ImGuiColorMod>         ColorStack;                 // Stack for PushStyleColor()/PopStyleColor() - inherited by Begin()
1193b4be Poul Sander 2025-02-03 21:28 2473
    ImVector<ImGuiStyleMod>         StyleVarStack;              // Stack for PushStyleVar()/PopStyleVar() - inherited by Begin()
4e9e2555 Poul Sander 2025-10-05 10:15 2474
    ImVector<ImFontStackData>       FontStack;                  // Stack for PushFont()/PopFont() - inherited by Begin()
1193b4be Poul Sander 2025-02-03 21:28 2475
    ImVector<ImGuiFocusScopeData>   FocusScopeStack;            // Stack for PushFocusScope()/PopFocusScope() - inherited by BeginChild(), pushed into by Begin()
1193b4be Poul Sander 2025-02-03 21:28 2476
    ImVector<ImGuiItemFlags>        ItemFlagsStack;             // Stack for PushItemFlag()/PopItemFlag() - inherited by Begin()
1193b4be Poul Sander 2025-02-03 21:28 2477
    ImVector<ImGuiGroupData>        GroupStack;                 // Stack for BeginGroup()/EndGroup() - not inherited by Begin()
1193b4be Poul Sander 2025-02-03 21:28 2478
    ImVector<ImGuiPopupData>        OpenPopupStack;             // Which popups are open (persistent)
1193b4be Poul Sander 2025-02-03 21:28 2479
    ImVector<ImGuiPopupData>        BeginPopupStack;            // Which level of BeginPopup() we are in (reset every frame)
1193b4be Poul Sander 2025-02-03 21:28 2480
    ImVector<ImGuiTreeNodeStackData>TreeNodeStack;              // Stack for TreeNode()
1193b4be Poul Sander 2025-02-03 21:28 2481
1193b4be Poul Sander 2025-02-03 21:28 2482
    // Viewports
1193b4be Poul Sander 2025-02-03 21:28 2483
    ImVector<ImGuiViewportP*> Viewports;                        // Active viewports (always 1+, and generally 1 unless multi-viewports are enabled). Each viewports hold their copy of ImDrawData.
1193b4be Poul Sander 2025-02-03 21:28 2484
    ImGuiViewportP*         CurrentViewport;                    // We track changes of viewport (happening in Begin) so we can call Platform_OnChangedViewport()
1193b4be Poul Sander 2025-02-03 21:28 2485
    ImGuiViewportP*         MouseViewport;
1193b4be Poul Sander 2025-02-03 21:28 2486
    ImGuiViewportP*         MouseLastHoveredViewport;           // Last known viewport that was hovered by mouse (even if we are not hovering any viewport any more) + honoring the _NoInputs flag.
1193b4be Poul Sander 2025-02-03 21:28 2487
    ImGuiID                 PlatformLastFocusedViewportId;
1193b4be Poul Sander 2025-02-03 21:28 2488
    ImGuiPlatformMonitor    FallbackMonitor;                    // Virtual monitor used as fallback if backend doesn't provide monitor information.
1193b4be Poul Sander 2025-02-03 21:28 2489
    ImRect                  PlatformMonitorsFullWorkRect;       // Bounding box of all platform monitors
1193b4be Poul Sander 2025-02-03 21:28 2490
    int                     ViewportCreatedCount;               // Unique sequential creation counter (mostly for testing/debugging)
1193b4be Poul Sander 2025-02-03 21:28 2491
    int                     PlatformWindowsCreatedCount;        // Unique sequential creation counter (mostly for testing/debugging)
1193b4be Poul Sander 2025-02-03 21:28 2492
    int                     ViewportFocusedStampCount;          // Every time the front-most window changes, we stamp its viewport with an incrementing counter
1193b4be Poul Sander 2025-02-03 21:28 2493
1193b4be Poul Sander 2025-02-03 21:28 2494
    // Keyboard/Gamepad Navigation
1193b4be Poul Sander 2025-02-03 21:28 2495
    bool                    NavCursorVisible;                   // Nav focus cursor/rectangle is visible? We hide it after a mouse click. We show it after a nav move.
1193b4be Poul Sander 2025-02-03 21:28 2496
    bool                    NavHighlightItemUnderNav;           // Disable mouse hovering highlight. Highlight navigation focused item instead of mouse hovered item.
1193b4be Poul Sander 2025-02-03 21:28 2497
    //bool                  NavDisableHighlight;                // Old name for !g.NavCursorVisible before 1.91.4 (2024/10/18). OPPOSITE VALUE (g.NavDisableHighlight == !g.NavCursorVisible)
1193b4be Poul Sander 2025-02-03 21:28 2498
    //bool                  NavDisableMouseHover;               // Old name for g.NavHighlightItemUnderNav before 1.91.1 (2024/10/18) this was called When user starts using keyboard/gamepad, we hide mouse hovering highlight until mouse is touched again.
1193b4be Poul Sander 2025-02-03 21:28 2499
    bool                    NavMousePosDirty;                   // When set we will update mouse position if io.ConfigNavMoveSetMousePos is set (not enabled by default)
1193b4be Poul Sander 2025-02-03 21:28 2500
    bool                    NavIdIsAlive;                       // Nav widget has been seen this frame ~~ NavRectRel is valid
1193b4be Poul Sander 2025-02-03 21:28 2501
    ImGuiID                 NavId;                              // Focused item for navigation
1193b4be Poul Sander 2025-02-03 21:28 2502
    ImGuiWindow*            NavWindow;                          // Focused window for navigation. Could be called 'FocusedWindow'
1193b4be Poul Sander 2025-02-03 21:28 2503
    ImGuiID                 NavFocusScopeId;                    // Focused focus scope (e.g. selection code often wants to "clear other items" when landing on an item of the same scope)
1193b4be Poul Sander 2025-02-03 21:28 2504
    ImGuiNavLayer           NavLayer;                           // Focused layer (main scrolling layer, or menu/title bar layer)
4e9e2555 Poul Sander 2025-10-05 10:15 2505
    ImGuiID                 NavActivateId;                      // ~~ (g.ActiveId == 0) && (IsKeyPressed(ImGuiKey_Space) || IsKeyDown(ImGuiKey_Enter) || IsKeyPressed(ImGuiKey_NavGamepadActivate)) ? NavId : 0, also set when calling ActivateItemByID()
1193b4be Poul Sander 2025-02-03 21:28 2506
    ImGuiID                 NavActivateDownId;                  // ~~ IsKeyDown(ImGuiKey_Space) || IsKeyDown(ImGuiKey_Enter) || IsKeyDown(ImGuiKey_NavGamepadActivate) ? NavId : 0
1193b4be Poul Sander 2025-02-03 21:28 2507
    ImGuiID                 NavActivatePressedId;               // ~~ IsKeyPressed(ImGuiKey_Space) || IsKeyPressed(ImGuiKey_Enter) || IsKeyPressed(ImGuiKey_NavGamepadActivate) ? NavId : 0 (no repeat)
1193b4be Poul Sander 2025-02-03 21:28 2508
    ImGuiActivateFlags      NavActivateFlags;
1193b4be Poul Sander 2025-02-03 21:28 2509
    ImVector<ImGuiFocusScopeData> NavFocusRoute;                // Reversed copy focus scope stack for NavId (should contains NavFocusScopeId). This essentially follow the window->ParentWindowForFocusRoute chain.
1193b4be Poul Sander 2025-02-03 21:28 2510
    ImGuiID                 NavHighlightActivatedId;
1193b4be Poul Sander 2025-02-03 21:28 2511
    float                   NavHighlightActivatedTimer;
4e9e2555 Poul Sander 2025-10-05 10:15 2512
    ImGuiID                 NavNextActivateId;                  // Set by ActivateItemByID(), queued until next frame.
1193b4be Poul Sander 2025-02-03 21:28 2513
    ImGuiActivateFlags      NavNextActivateFlags;
1193b4be Poul Sander 2025-02-03 21:28 2514
    ImGuiInputSource        NavInputSource;                     // Keyboard or Gamepad mode? THIS CAN ONLY BE ImGuiInputSource_Keyboard or ImGuiInputSource_Mouse
1193b4be Poul Sander 2025-02-03 21:28 2515
    ImGuiSelectionUserData  NavLastValidSelectionUserData;      // Last valid data passed to SetNextItemSelectionUser(), or -1. For current window. Not reset when focusing an item that doesn't have selection data.
1193b4be Poul Sander 2025-02-03 21:28 2516
    ImS8                    NavCursorHideFrames;
4e9e2555 Poul Sander 2025-10-05 10:15 2517
    //ImGuiID               NavActivateInputId;                 // Removed in 1.89.4 (July 2023). This is now part of g.NavActivateId and sets g.NavActivateFlags |= ImGuiActivateFlags_PreferInput. See commit c9a53aa74, issue #5606.
1193b4be Poul Sander 2025-02-03 21:28 2518
1193b4be Poul Sander 2025-02-03 21:28 2519
    // Navigation: Init & Move Requests
1193b4be Poul Sander 2025-02-03 21:28 2520
    bool                    NavAnyRequest;                      // ~~ NavMoveRequest || NavInitRequest this is to perform early out in ItemAdd()
1193b4be Poul Sander 2025-02-03 21:28 2521
    bool                    NavInitRequest;                     // Init request for appearing window to select first item
1193b4be Poul Sander 2025-02-03 21:28 2522
    bool                    NavInitRequestFromMove;
1193b4be Poul Sander 2025-02-03 21:28 2523
    ImGuiNavItemData        NavInitResult;                      // Init request result (first item of the window, or one for which SetItemDefaultFocus() was called)
1193b4be Poul Sander 2025-02-03 21:28 2524
    bool                    NavMoveSubmitted;                   // Move request submitted, will process result on next NewFrame()
1193b4be Poul Sander 2025-02-03 21:28 2525
    bool                    NavMoveScoringItems;                // Move request submitted, still scoring incoming items
1193b4be Poul Sander 2025-02-03 21:28 2526
    bool                    NavMoveForwardToNextFrame;
1193b4be Poul Sander 2025-02-03 21:28 2527
    ImGuiNavMoveFlags       NavMoveFlags;
1193b4be Poul Sander 2025-02-03 21:28 2528
    ImGuiScrollFlags        NavMoveScrollFlags;
1193b4be Poul Sander 2025-02-03 21:28 2529
    ImGuiKeyChord           NavMoveKeyMods;
1193b4be Poul Sander 2025-02-03 21:28 2530
    ImGuiDir                NavMoveDir;                         // Direction of the move request (left/right/up/down)
1193b4be Poul Sander 2025-02-03 21:28 2531
    ImGuiDir                NavMoveDirForDebug;
1193b4be Poul Sander 2025-02-03 21:28 2532
    ImGuiDir                NavMoveClipDir;                     // FIXME-NAV: Describe the purpose of this better. Might want to rename?
1193b4be Poul Sander 2025-02-03 21:28 2533
    ImRect                  NavScoringRect;                     // Rectangle used for scoring, in screen space. Based of window->NavRectRel[], modified for directional navigation scoring.
1193b4be Poul Sander 2025-02-03 21:28 2534
    ImRect                  NavScoringNoClipRect;               // Some nav operations (such as PageUp/PageDown) enforce a region which clipper will attempt to always keep submitted
1193b4be Poul Sander 2025-02-03 21:28 2535
    int                     NavScoringDebugCount;               // Metrics for debugging
1193b4be Poul Sander 2025-02-03 21:28 2536
    int                     NavTabbingDir;                      // Generally -1 or +1, 0 when tabbing without a nav id
1193b4be Poul Sander 2025-02-03 21:28 2537
    int                     NavTabbingCounter;                  // >0 when counting items for tabbing
1193b4be Poul Sander 2025-02-03 21:28 2538
    ImGuiNavItemData        NavMoveResultLocal;                 // Best move request candidate within NavWindow
1193b4be Poul Sander 2025-02-03 21:28 2539
    ImGuiNavItemData        NavMoveResultLocalVisible;          // Best move request candidate within NavWindow that are mostly visible (when using ImGuiNavMoveFlags_AlsoScoreVisibleSet flag)
1193b4be Poul Sander 2025-02-03 21:28 2540
    ImGuiNavItemData        NavMoveResultOther;                 // Best move request candidate within NavWindow's flattened hierarchy (when using ImGuiWindowFlags_NavFlattened flag)
1193b4be Poul Sander 2025-02-03 21:28 2541
    ImGuiNavItemData        NavTabbingResultFirst;              // First tabbing request candidate within NavWindow and flattened hierarchy
1193b4be Poul Sander 2025-02-03 21:28 2542
1193b4be Poul Sander 2025-02-03 21:28 2543
    // Navigation: record of last move request
1193b4be Poul Sander 2025-02-03 21:28 2544
    ImGuiID                 NavJustMovedFromFocusScopeId;       // Just navigated from this focus scope id (result of a successfully MoveRequest).
1193b4be Poul Sander 2025-02-03 21:28 2545
    ImGuiID                 NavJustMovedToId;                   // Just navigated to this id (result of a successfully MoveRequest).
1193b4be Poul Sander 2025-02-03 21:28 2546
    ImGuiID                 NavJustMovedToFocusScopeId;         // Just navigated to this focus scope id (result of a successfully MoveRequest).
1193b4be Poul Sander 2025-02-03 21:28 2547
    ImGuiKeyChord           NavJustMovedToKeyMods;
1193b4be Poul Sander 2025-02-03 21:28 2548
    bool                    NavJustMovedToIsTabbing;            // Copy of ImGuiNavMoveFlags_IsTabbing. Maybe we should store whole flags.
1193b4be Poul Sander 2025-02-03 21:28 2549
    bool                    NavJustMovedToHasSelectionData;     // Copy of move result's ItemFlags & ImGuiItemFlags_HasSelectionUserData). Maybe we should just store ImGuiNavItemData.
1193b4be Poul Sander 2025-02-03 21:28 2550
1193b4be Poul Sander 2025-02-03 21:28 2551
    // Navigation: Windowing (CTRL+TAB for list, or Menu button + keys or directional pads to move/resize)
4e9e2555 Poul Sander 2025-10-05 10:15 2552
    bool                    ConfigNavWindowingWithGamepad;      // = true. Enable CTRL+TAB by holding ImGuiKey_GamepadFaceLeft (== ImGuiKey_NavGamepadMenu). When false, the button may still be used to toggle Menu layer.
1193b4be Poul Sander 2025-02-03 21:28 2553
    ImGuiKeyChord           ConfigNavWindowingKeyNext;          // = ImGuiMod_Ctrl | ImGuiKey_Tab (or ImGuiMod_Super | ImGuiKey_Tab on OS X). For reconfiguration (see #4828)
1193b4be Poul Sander 2025-02-03 21:28 2554
    ImGuiKeyChord           ConfigNavWindowingKeyPrev;          // = ImGuiMod_Ctrl | ImGuiMod_Shift | ImGuiKey_Tab (or ImGuiMod_Super | ImGuiMod_Shift | ImGuiKey_Tab on OS X)
1193b4be Poul Sander 2025-02-03 21:28 2555
    ImGuiWindow*            NavWindowingTarget;                 // Target window when doing CTRL+Tab (or Pad Menu + FocusPrev/Next), this window is temporarily displayed top-most!
1193b4be Poul Sander 2025-02-03 21:28 2556
    ImGuiWindow*            NavWindowingTargetAnim;             // Record of last valid NavWindowingTarget until DimBgRatio and NavWindowingHighlightAlpha becomes 0.0f, so the fade-out can stay on it.
1193b4be Poul Sander 2025-02-03 21:28 2557
    ImGuiWindow*            NavWindowingListWindow;             // Internal window actually listing the CTRL+Tab contents
1193b4be Poul Sander 2025-02-03 21:28 2558
    float                   NavWindowingTimer;
1193b4be Poul Sander 2025-02-03 21:28 2559
    float                   NavWindowingHighlightAlpha;
4e9e2555 Poul Sander 2025-10-05 10:15 2560
    ImGuiInputSource        NavWindowingInputSource;
4e9e2555 Poul Sander 2025-10-05 10:15 2561
    bool                    NavWindowingToggleLayer;            // Set while Alt or GamepadMenu is held, may be cleared by other operations, and processed when releasing the key.
4e9e2555 Poul Sander 2025-10-05 10:15 2562
    ImGuiKey                NavWindowingToggleKey;              // Keyboard/gamepad key used when toggling to menu layer.
1193b4be Poul Sander 2025-02-03 21:28 2563
    ImVec2                  NavWindowingAccumDeltaPos;
1193b4be Poul Sander 2025-02-03 21:28 2564
    ImVec2                  NavWindowingAccumDeltaSize;
1193b4be Poul Sander 2025-02-03 21:28 2565
1193b4be Poul Sander 2025-02-03 21:28 2566
    // Render
1193b4be Poul Sander 2025-02-03 21:28 2567
    float                   DimBgRatio;                         // 0.0..1.0 animation when fading in a dimming background (for modal window and CTRL+TAB list)
1193b4be Poul Sander 2025-02-03 21:28 2568
1193b4be Poul Sander 2025-02-03 21:28 2569
    // Drag and Drop
1193b4be Poul Sander 2025-02-03 21:28 2570
    bool                    DragDropActive;
1193b4be Poul Sander 2025-02-03 21:28 2571
    bool                    DragDropWithinSource;               // Set when within a BeginDragDropXXX/EndDragDropXXX block for a drag source.
1193b4be Poul Sander 2025-02-03 21:28 2572
    bool                    DragDropWithinTarget;               // Set when within a BeginDragDropXXX/EndDragDropXXX block for a drag target.
1193b4be Poul Sander 2025-02-03 21:28 2573
    ImGuiDragDropFlags      DragDropSourceFlags;
1193b4be Poul Sander 2025-02-03 21:28 2574
    int                     DragDropSourceFrameCount;
1193b4be Poul Sander 2025-02-03 21:28 2575
    int                     DragDropMouseButton;
1193b4be Poul Sander 2025-02-03 21:28 2576
    ImGuiPayload            DragDropPayload;
1193b4be Poul Sander 2025-02-03 21:28 2577
    ImRect                  DragDropTargetRect;                 // Store rectangle of current target candidate (we favor small targets when overlapping)
1193b4be Poul Sander 2025-02-03 21:28 2578
    ImRect                  DragDropTargetClipRect;             // Store ClipRect at the time of item's drawing
1193b4be Poul Sander 2025-02-03 21:28 2579
    ImGuiID                 DragDropTargetId;
1193b4be Poul Sander 2025-02-03 21:28 2580
    ImGuiDragDropFlags      DragDropAcceptFlags;
1193b4be Poul Sander 2025-02-03 21:28 2581
    float                   DragDropAcceptIdCurrRectSurface;    // Target item surface (we resolve overlapping targets by prioritizing the smaller surface)
1193b4be Poul Sander 2025-02-03 21:28 2582
    ImGuiID                 DragDropAcceptIdCurr;               // Target item id (set at the time of accepting the payload)
1193b4be Poul Sander 2025-02-03 21:28 2583
    ImGuiID                 DragDropAcceptIdPrev;               // Target item id from previous frame (we need to store this to allow for overlapping drag and drop targets)
1193b4be Poul Sander 2025-02-03 21:28 2584
    int                     DragDropAcceptFrameCount;           // Last time a target expressed a desire to accept the source
1193b4be Poul Sander 2025-02-03 21:28 2585
    ImGuiID                 DragDropHoldJustPressedId;          // Set when holding a payload just made ButtonBehavior() return a press.
1193b4be Poul Sander 2025-02-03 21:28 2586
    ImVector<unsigned char> DragDropPayloadBufHeap;             // We don't expose the ImVector<> directly, ImGuiPayload only holds pointer+size
1193b4be Poul Sander 2025-02-03 21:28 2587
    unsigned char           DragDropPayloadBufLocal[16];        // Local buffer for small payloads
1193b4be Poul Sander 2025-02-03 21:28 2588
1193b4be Poul Sander 2025-02-03 21:28 2589
    // Clipper
1193b4be Poul Sander 2025-02-03 21:28 2590
    int                             ClipperTempDataStacked;
1193b4be Poul Sander 2025-02-03 21:28 2591
    ImVector<ImGuiListClipperData>  ClipperTempData;
1193b4be Poul Sander 2025-02-03 21:28 2592
1193b4be Poul Sander 2025-02-03 21:28 2593
    // Tables
1193b4be Poul Sander 2025-02-03 21:28 2594
    ImGuiTable*                     CurrentTable;
1193b4be Poul Sander 2025-02-03 21:28 2595
    ImGuiID                         DebugBreakInTable;          // Set to break in BeginTable() call.
1193b4be Poul Sander 2025-02-03 21:28 2596
    int                             TablesTempDataStacked;      // Temporary table data size (because we leave previous instances undestructed, we generally don't use TablesTempData.Size)
1193b4be Poul Sander 2025-02-03 21:28 2597
    ImVector<ImGuiTableTempData>    TablesTempData;             // Temporary table data (buffers reused/shared across instances, support nesting)
1193b4be Poul Sander 2025-02-03 21:28 2598
    ImPool<ImGuiTable>              Tables;                     // Persistent table data
1193b4be Poul Sander 2025-02-03 21:28 2599
    ImVector<float>                 TablesLastTimeActive;       // Last used timestamp of each tables (SOA, for efficient GC)
1193b4be Poul Sander 2025-02-03 21:28 2600
    ImVector<ImDrawChannel>         DrawChannelsTempMergeBuffer;
1193b4be Poul Sander 2025-02-03 21:28 2601
1193b4be Poul Sander 2025-02-03 21:28 2602
    // Tab bars
1193b4be Poul Sander 2025-02-03 21:28 2603
    ImGuiTabBar*                    CurrentTabBar;
1193b4be Poul Sander 2025-02-03 21:28 2604
    ImPool<ImGuiTabBar>             TabBars;
1193b4be Poul Sander 2025-02-03 21:28 2605
    ImVector<ImGuiPtrOrIndex>       CurrentTabBarStack;
1193b4be Poul Sander 2025-02-03 21:28 2606
    ImVector<ImGuiShrinkWidthItem>  ShrinkWidthBuffer;
1193b4be Poul Sander 2025-02-03 21:28 2607
1193b4be Poul Sander 2025-02-03 21:28 2608
    // Multi-Select state
1193b4be Poul Sander 2025-02-03 21:28 2609
    ImGuiBoxSelectState             BoxSelectState;
1193b4be Poul Sander 2025-02-03 21:28 2610
    ImGuiMultiSelectTempData*       CurrentMultiSelect;
1193b4be Poul Sander 2025-02-03 21:28 2611
    int                             MultiSelectTempDataStacked; // Temporary multi-select data size (because we leave previous instances undestructed, we generally don't use MultiSelectTempData.Size)
1193b4be Poul Sander 2025-02-03 21:28 2612
    ImVector<ImGuiMultiSelectTempData> MultiSelectTempData;
1193b4be Poul Sander 2025-02-03 21:28 2613
    ImPool<ImGuiMultiSelectState>   MultiSelectStorage;
1193b4be Poul Sander 2025-02-03 21:28 2614
1193b4be Poul Sander 2025-02-03 21:28 2615
    // Hover Delay system
1193b4be Poul Sander 2025-02-03 21:28 2616
    ImGuiID                 HoverItemDelayId;
1193b4be Poul Sander 2025-02-03 21:28 2617
    ImGuiID                 HoverItemDelayIdPreviousFrame;
1193b4be Poul Sander 2025-02-03 21:28 2618
    float                   HoverItemDelayTimer;                // Currently used by IsItemHovered()
1193b4be Poul Sander 2025-02-03 21:28 2619
    float                   HoverItemDelayClearTimer;           // Currently used by IsItemHovered(): grace time before g.TooltipHoverTimer gets cleared.
1193b4be Poul Sander 2025-02-03 21:28 2620
    ImGuiID                 HoverItemUnlockedStationaryId;      // Mouse has once been stationary on this item. Only reset after departing the item.
1193b4be Poul Sander 2025-02-03 21:28 2621
    ImGuiID                 HoverWindowUnlockedStationaryId;    // Mouse has once been stationary on this window. Only reset after departing the window.
1193b4be Poul Sander 2025-02-03 21:28 2622
1193b4be Poul Sander 2025-02-03 21:28 2623
    // Mouse state
1193b4be Poul Sander 2025-02-03 21:28 2624
    ImGuiMouseCursor        MouseCursor;
1193b4be Poul Sander 2025-02-03 21:28 2625
    float                   MouseStationaryTimer;               // Time the mouse has been stationary (with some loose heuristic)
1193b4be Poul Sander 2025-02-03 21:28 2626
    ImVec2                  MouseLastValidPos;
1193b4be Poul Sander 2025-02-03 21:28 2627
1193b4be Poul Sander 2025-02-03 21:28 2628
    // Widget state
1193b4be Poul Sander 2025-02-03 21:28 2629
    ImGuiInputTextState     InputTextState;
4e9e2555 Poul Sander 2025-10-05 10:15 2630
    ImGuiTextIndex          InputTextLineIndex;                 // Temporary storage
1193b4be Poul Sander 2025-02-03 21:28 2631
    ImGuiInputTextDeactivatedState InputTextDeactivatedState;
4e9e2555 Poul Sander 2025-10-05 10:15 2632
    ImFontBaked             InputTextPasswordFontBackupBaked;
4e9e2555 Poul Sander 2025-10-05 10:15 2633
    ImFontFlags             InputTextPasswordFontBackupFlags;
1193b4be Poul Sander 2025-02-03 21:28 2634
    ImGuiID                 TempInputId;                        // Temporary text input when CTRL+clicking on a slider, etc.
1193b4be Poul Sander 2025-02-03 21:28 2635
    ImGuiDataTypeStorage    DataTypeZeroValue;                  // 0 for all data types
1193b4be Poul Sander 2025-02-03 21:28 2636
    int                     BeginMenuDepth;
1193b4be Poul Sander 2025-02-03 21:28 2637
    int                     BeginComboDepth;
1193b4be Poul Sander 2025-02-03 21:28 2638
    ImGuiColorEditFlags     ColorEditOptions;                   // Store user options for color edit widgets
1193b4be Poul Sander 2025-02-03 21:28 2639
    ImGuiID                 ColorEditCurrentID;                 // Set temporarily while inside of the parent-most ColorEdit4/ColorPicker4 (because they call each others).
1193b4be Poul Sander 2025-02-03 21:28 2640
    ImGuiID                 ColorEditSavedID;                   // ID we are saving/restoring HS for
1193b4be Poul Sander 2025-02-03 21:28 2641
    float                   ColorEditSavedHue;                  // Backup of last Hue associated to LastColor, so we can restore Hue in lossy RGB<>HSV round trips
1193b4be Poul Sander 2025-02-03 21:28 2642
    float                   ColorEditSavedSat;                  // Backup of last Saturation associated to LastColor, so we can restore Saturation in lossy RGB<>HSV round trips
1193b4be Poul Sander 2025-02-03 21:28 2643
    ImU32                   ColorEditSavedColor;                // RGB value with alpha set to 0.
1193b4be Poul Sander 2025-02-03 21:28 2644
    ImVec4                  ColorPickerRef;                     // Initial/reference color at the time of opening the color picker.
1193b4be Poul Sander 2025-02-03 21:28 2645
    ImGuiComboPreviewData   ComboPreviewData;
1193b4be Poul Sander 2025-02-03 21:28 2646
    ImRect                  WindowResizeBorderExpectedRect;     // Expected border rect, switch to relative edit if moving
1193b4be Poul Sander 2025-02-03 21:28 2647
    bool                    WindowResizeRelativeMode;
1193b4be Poul Sander 2025-02-03 21:28 2648
    short                   ScrollbarSeekMode;                  // 0: scroll to clicked location, -1/+1: prev/next page.
1193b4be Poul Sander 2025-02-03 21:28 2649
    float                   ScrollbarClickDeltaToGrabCenter;    // When scrolling to mouse location: distance between mouse and center of grab box, normalized in parent space.
1193b4be Poul Sander 2025-02-03 21:28 2650
    float                   SliderGrabClickOffset;
1193b4be Poul Sander 2025-02-03 21:28 2651
    float                   SliderCurrentAccum;                 // Accumulated slider delta when using navigation controls.
1193b4be Poul Sander 2025-02-03 21:28 2652
    bool                    SliderCurrentAccumDirty;            // Has the accumulated slider delta changed since last time we tried to apply it?
1193b4be Poul Sander 2025-02-03 21:28 2653
    bool                    DragCurrentAccumDirty;
1193b4be Poul Sander 2025-02-03 21:28 2654
    float                   DragCurrentAccum;                   // Accumulator for dragging modification. Always high-precision, not rounded by end-user precision settings
1193b4be Poul Sander 2025-02-03 21:28 2655
    float                   DragSpeedDefaultRatio;              // If speed == 0.0f, uses (max-min) * DragSpeedDefaultRatio
1193b4be Poul Sander 2025-02-03 21:28 2656
    float                   DisabledAlphaBackup;                // Backup for style.Alpha for BeginDisabled()
1193b4be Poul Sander 2025-02-03 21:28 2657
    short                   DisabledStackSize;
1193b4be Poul Sander 2025-02-03 21:28 2658
    short                   TooltipOverrideCount;
1193b4be Poul Sander 2025-02-03 21:28 2659
    ImGuiWindow*            TooltipPreviousWindow;              // Window of last tooltip submitted during the frame
1193b4be Poul Sander 2025-02-03 21:28 2660
    ImVector<char>          ClipboardHandlerData;               // If no custom clipboard handler is defined
1193b4be Poul Sander 2025-02-03 21:28 2661
    ImVector<ImGuiID>       MenusIdSubmittedThisFrame;          // A list of menu IDs that were rendered at least once
1193b4be Poul Sander 2025-02-03 21:28 2662
    ImGuiTypingSelectState  TypingSelectState;                  // State for GetTypingSelectRequest()
1193b4be Poul Sander 2025-02-03 21:28 2663
1193b4be Poul Sander 2025-02-03 21:28 2664
    // Platform support
4e9e2555 Poul Sander 2025-10-05 10:15 2665
    ImGuiPlatformImeData    PlatformImeData;                    // Data updated by current frame. Will be applied at end of the frame. For some backends, this is required to have WantVisible=true in order to receive text message.
1193b4be Poul Sander 2025-02-03 21:28 2666
    ImGuiPlatformImeData    PlatformImeDataPrev;                // Previous frame data. When changed we call the platform_io.Platform_SetImeDataFn() handler.
1193b4be Poul Sander 2025-02-03 21:28 2667
1193b4be Poul Sander 2025-02-03 21:28 2668
    // Extensions
1193b4be Poul Sander 2025-02-03 21:28 2669
    // FIXME: We could provide an API to register one slot in an array held in ImGuiContext?
4e9e2555 Poul Sander 2025-10-05 10:15 2670
    ImVector<ImTextureData*> UserTextures;                      // List of textures created/managed by user or third-party extension. Automatically appended into platform_io.Textures[].
1193b4be Poul Sander 2025-02-03 21:28 2671
    ImGuiDockContext        DockContext;
1193b4be Poul Sander 2025-02-03 21:28 2672
    void                    (*DockNodeWindowMenuHandler)(ImGuiContext* ctx, ImGuiDockNode* node, ImGuiTabBar* tab_bar);
1193b4be Poul Sander 2025-02-03 21:28 2673
1193b4be Poul Sander 2025-02-03 21:28 2674
    // Settings
1193b4be Poul Sander 2025-02-03 21:28 2675
    bool                    SettingsLoaded;
1193b4be Poul Sander 2025-02-03 21:28 2676
    float                   SettingsDirtyTimer;                 // Save .ini Settings to memory when time reaches zero
1193b4be Poul Sander 2025-02-03 21:28 2677
    ImGuiTextBuffer         SettingsIniData;                    // In memory .ini settings
1193b4be Poul Sander 2025-02-03 21:28 2678
    ImVector<ImGuiSettingsHandler>      SettingsHandlers;       // List of .ini settings handlers
1193b4be Poul Sander 2025-02-03 21:28 2679
    ImChunkStream<ImGuiWindowSettings>  SettingsWindows;        // ImGuiWindow .ini settings entries
1193b4be Poul Sander 2025-02-03 21:28 2680
    ImChunkStream<ImGuiTableSettings>   SettingsTables;         // ImGuiTable .ini settings entries
1193b4be Poul Sander 2025-02-03 21:28 2681
    ImVector<ImGuiContextHook>          Hooks;                  // Hooks for extensions (e.g. test engine)
1193b4be Poul Sander 2025-02-03 21:28 2682
    ImGuiID                             HookIdNext;             // Next available HookId
1193b4be Poul Sander 2025-02-03 21:28 2683
1193b4be Poul Sander 2025-02-03 21:28 2684
    // Localization
1193b4be Poul Sander 2025-02-03 21:28 2685
    const char*             LocalizationTable[ImGuiLocKey_COUNT];
1193b4be Poul Sander 2025-02-03 21:28 2686
1193b4be Poul Sander 2025-02-03 21:28 2687
    // Capture/Logging
1193b4be Poul Sander 2025-02-03 21:28 2688
    bool                    LogEnabled;                         // Currently capturing
4e9e2555 Poul Sander 2025-10-05 10:15 2689
    ImGuiLogFlags           LogFlags;                           // Capture flags/type
4e9e2555 Poul Sander 2025-10-05 10:15 2690
    ImGuiWindow*            LogWindow;
1193b4be Poul Sander 2025-02-03 21:28 2691
    ImFileHandle            LogFile;                            // If != NULL log to stdout/ file
1193b4be Poul Sander 2025-02-03 21:28 2692
    ImGuiTextBuffer         LogBuffer;                          // Accumulation buffer when log to clipboard. This is pointer so our GImGui static constructor doesn't call heap allocators.
1193b4be Poul Sander 2025-02-03 21:28 2693
    const char*             LogNextPrefix;
1193b4be Poul Sander 2025-02-03 21:28 2694
    const char*             LogNextSuffix;
1193b4be Poul Sander 2025-02-03 21:28 2695
    float                   LogLinePosY;
1193b4be Poul Sander 2025-02-03 21:28 2696
    bool                    LogLineFirstItem;
1193b4be Poul Sander 2025-02-03 21:28 2697
    int                     LogDepthRef;
1193b4be Poul Sander 2025-02-03 21:28 2698
    int                     LogDepthToExpand;
1193b4be Poul Sander 2025-02-03 21:28 2699
    int                     LogDepthToExpandDefault;            // Default/stored value for LogDepthMaxExpand if not specified in the LogXXX function call.
1193b4be Poul Sander 2025-02-03 21:28 2700
1193b4be Poul Sander 2025-02-03 21:28 2701
    // Error Handling
1193b4be Poul Sander 2025-02-03 21:28 2702
    ImGuiErrorCallback      ErrorCallback;                      // = NULL. May be exposed in public API eventually.
1193b4be Poul Sander 2025-02-03 21:28 2703
    void*                   ErrorCallbackUserData;              // = NULL
1193b4be Poul Sander 2025-02-03 21:28 2704
    ImVec2                  ErrorTooltipLockedPos;
1193b4be Poul Sander 2025-02-03 21:28 2705
    bool                    ErrorFirst;
1193b4be Poul Sander 2025-02-03 21:28 2706
    int                     ErrorCountCurrentFrame;             // [Internal] Number of errors submitted this frame.
1193b4be Poul Sander 2025-02-03 21:28 2707
    ImGuiErrorRecoveryState StackSizesInNewFrame;               // [Internal]
1193b4be Poul Sander 2025-02-03 21:28 2708
    ImGuiErrorRecoveryState*StackSizesInBeginForCurrentWindow;  // [Internal]
1193b4be Poul Sander 2025-02-03 21:28 2709
1193b4be Poul Sander 2025-02-03 21:28 2710
    // Debug Tools
1193b4be Poul Sander 2025-02-03 21:28 2711
    // (some of the highly frequently used data are interleaved in other structures above: DebugBreakXXX fields, DebugHookIdInfo, DebugLocateId etc.)
1193b4be Poul Sander 2025-02-03 21:28 2712
    int                     DebugDrawIdConflictsCount;          // Locked count (preserved when holding CTRL)
1193b4be Poul Sander 2025-02-03 21:28 2713
    ImGuiDebugLogFlags      DebugLogFlags;
1193b4be Poul Sander 2025-02-03 21:28 2714
    ImGuiTextBuffer         DebugLogBuf;
1193b4be Poul Sander 2025-02-03 21:28 2715
    ImGuiTextIndex          DebugLogIndex;
1193b4be Poul Sander 2025-02-03 21:28 2716
    int                     DebugLogSkippedErrors;
1193b4be Poul Sander 2025-02-03 21:28 2717
    ImGuiDebugLogFlags      DebugLogAutoDisableFlags;
1193b4be Poul Sander 2025-02-03 21:28 2718
    ImU8                    DebugLogAutoDisableFrames;
1193b4be Poul Sander 2025-02-03 21:28 2719
    ImU8                    DebugLocateFrames;                  // For DebugLocateItemOnHover(). This is used together with DebugLocateId which is in a hot/cached spot above.
1193b4be Poul Sander 2025-02-03 21:28 2720
    bool                    DebugBreakInLocateId;               // Debug break in ItemAdd() call for g.DebugLocateId.
1193b4be Poul Sander 2025-02-03 21:28 2721
    ImGuiKeyChord           DebugBreakKeyChord;                 // = ImGuiKey_Pause
1193b4be Poul Sander 2025-02-03 21:28 2722
    ImS8                    DebugBeginReturnValueCullDepth;     // Cycle between 0..9 then wrap around.
1193b4be Poul Sander 2025-02-03 21:28 2723
    bool                    DebugItemPickerActive;              // Item picker is active (started with DebugStartItemPicker())
1193b4be Poul Sander 2025-02-03 21:28 2724
    ImU8                    DebugItemPickerMouseButton;
1193b4be Poul Sander 2025-02-03 21:28 2725
    ImGuiID                 DebugItemPickerBreakId;             // Will call IM_DEBUG_BREAK() when encountering this ID
1193b4be Poul Sander 2025-02-03 21:28 2726
    float                   DebugFlashStyleColorTime;
1193b4be Poul Sander 2025-02-03 21:28 2727
    ImVec4                  DebugFlashStyleColorBackup;
1193b4be Poul Sander 2025-02-03 21:28 2728
    ImGuiMetricsConfig      DebugMetricsConfig;
1193b4be Poul Sander 2025-02-03 21:28 2729
    ImGuiIDStackTool        DebugIDStackTool;
1193b4be Poul Sander 2025-02-03 21:28 2730
    ImGuiDebugAllocInfo     DebugAllocInfo;
1193b4be Poul Sander 2025-02-03 21:28 2731
    ImGuiDockNode*          DebugHoveredDockNode;               // Hovered dock node.
4e9e2555 Poul Sander 2025-10-05 10:15 2732
#if defined(IMGUI_DEBUG_HIGHLIGHT_ALL_ID_CONFLICTS) && !defined(IMGUI_DISABLE_DEBUG_TOOLS)
4e9e2555 Poul Sander 2025-10-05 10:15 2733
    ImGuiStorage            DebugDrawIdConflictsAliveCount;
4e9e2555 Poul Sander 2025-10-05 10:15 2734
    ImGuiStorage            DebugDrawIdConflictsHighlightSet;
4e9e2555 Poul Sander 2025-10-05 10:15 2735
#endif
1193b4be Poul Sander 2025-02-03 21:28 2736
1193b4be Poul Sander 2025-02-03 21:28 2737
    // Misc
1193b4be Poul Sander 2025-02-03 21:28 2738
    float                   FramerateSecPerFrame[60];           // Calculate estimate of framerate for user over the last 60 frames..
1193b4be Poul Sander 2025-02-03 21:28 2739
    int                     FramerateSecPerFrameIdx;
1193b4be Poul Sander 2025-02-03 21:28 2740
    int                     FramerateSecPerFrameCount;
1193b4be Poul Sander 2025-02-03 21:28 2741
    float                   FramerateSecPerFrameAccum;
1193b4be Poul Sander 2025-02-03 21:28 2742
    int                     WantCaptureMouseNextFrame;          // Explicit capture override via SetNextFrameWantCaptureMouse()/SetNextFrameWantCaptureKeyboard(). Default to -1.
1193b4be Poul Sander 2025-02-03 21:28 2743
    int                     WantCaptureKeyboardNextFrame;       // "
4e9e2555 Poul Sander 2025-10-05 10:15 2744
    int                     WantTextInputNextFrame;             // Copied in EndFrame() from g.PlatformImeData.WantTextInput. Needs to be set for some backends (SDL3) to emit character inputs.
1193b4be Poul Sander 2025-02-03 21:28 2745
    ImVector<char>          TempBuffer;                         // Temporary text buffer
1193b4be Poul Sander 2025-02-03 21:28 2746
    char                    TempKeychordName[64];
1193b4be Poul Sander 2025-02-03 21:28 2747
1193b4be Poul Sander 2025-02-03 21:28 2748
    ImGuiContext(ImFontAtlas* shared_font_atlas);
1193b4be Poul Sander 2025-02-03 21:28 2749
};
1193b4be Poul Sander 2025-02-03 21:28 2750
1193b4be Poul Sander 2025-02-03 21:28 2751
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 2752
// [SECTION] ImGuiWindowTempData, ImGuiWindow
1193b4be Poul Sander 2025-02-03 21:28 2753
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 2754
1193b4be Poul Sander 2025-02-03 21:28 2755
// Transient per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the DC variable name in ImGuiWindow.
1193b4be Poul Sander 2025-02-03 21:28 2756
// (That's theory, in practice the delimitation between ImGuiWindow and ImGuiWindowTempData is quite tenuous and could be reconsidered..)
1193b4be Poul Sander 2025-02-03 21:28 2757
// (This doesn't need a constructor because we zero-clear it as part of ImGuiWindow and all frame-temporary data are setup on Begin)
1193b4be Poul Sander 2025-02-03 21:28 2758
struct IMGUI_API ImGuiWindowTempData
1193b4be Poul Sander 2025-02-03 21:28 2759
{
1193b4be Poul Sander 2025-02-03 21:28 2760
    // Layout
1193b4be Poul Sander 2025-02-03 21:28 2761
    ImVec2                  CursorPos;              // Current emitting position, in absolute coordinates.
1193b4be Poul Sander 2025-02-03 21:28 2762
    ImVec2                  CursorPosPrevLine;
1193b4be Poul Sander 2025-02-03 21:28 2763
    ImVec2                  CursorStartPos;         // Initial position after Begin(), generally ~ window position + WindowPadding.
1193b4be Poul Sander 2025-02-03 21:28 2764
    ImVec2                  CursorMaxPos;           // Used to implicitly calculate ContentSize at the beginning of next frame, for scrolling range and auto-resize. Always growing during the frame.
1193b4be Poul Sander 2025-02-03 21:28 2765
    ImVec2                  IdealMaxPos;            // Used to implicitly calculate ContentSizeIdeal at the beginning of next frame, for auto-resize only. Always growing during the frame.
1193b4be Poul Sander 2025-02-03 21:28 2766
    ImVec2                  CurrLineSize;
1193b4be Poul Sander 2025-02-03 21:28 2767
    ImVec2                  PrevLineSize;
1193b4be Poul Sander 2025-02-03 21:28 2768
    float                   CurrLineTextBaseOffset; // Baseline offset (0.0f by default on a new line, generally == style.FramePadding.y when a framed item has been added).
1193b4be Poul Sander 2025-02-03 21:28 2769
    float                   PrevLineTextBaseOffset;
1193b4be Poul Sander 2025-02-03 21:28 2770
    bool                    IsSameLine;
1193b4be Poul Sander 2025-02-03 21:28 2771
    bool                    IsSetPos;
1193b4be Poul Sander 2025-02-03 21:28 2772
    ImVec1                  Indent;                 // Indentation / start position from left of window (increased by TreePush/TreePop, etc.)
1193b4be Poul Sander 2025-02-03 21:28 2773
    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.
1193b4be Poul Sander 2025-02-03 21:28 2774
    ImVec1                  GroupOffset;
1193b4be Poul Sander 2025-02-03 21:28 2775
    ImVec2                  CursorStartPosLossyness;// Record the loss of precision of CursorStartPos due to really large scrolling amount. This is used by clipper to compensate and fix the most common use case of large scroll area.
1193b4be Poul Sander 2025-02-03 21:28 2776
1193b4be Poul Sander 2025-02-03 21:28 2777
    // Keyboard/Gamepad navigation
1193b4be Poul Sander 2025-02-03 21:28 2778
    ImGuiNavLayer           NavLayerCurrent;        // Current layer, 0..31 (we currently only use 0..1)
1193b4be Poul Sander 2025-02-03 21:28 2779
    short                   NavLayersActiveMask;    // Which layers have been written to (result from previous frame)
1193b4be Poul Sander 2025-02-03 21:28 2780
    short                   NavLayersActiveMaskNext;// Which layers have been written to (accumulator for current frame)
1193b4be Poul Sander 2025-02-03 21:28 2781
    bool                    NavIsScrollPushableX;   // Set when current work location may be scrolled horizontally when moving left / right. This is generally always true UNLESS within a column.
1193b4be Poul Sander 2025-02-03 21:28 2782
    bool                    NavHideHighlightOneFrame;
1193b4be Poul Sander 2025-02-03 21:28 2783
    bool                    NavWindowHasScrollY;    // Set per window when scrolling can be used (== ScrollMax.y > 0.0f)
1193b4be Poul Sander 2025-02-03 21:28 2784
1193b4be Poul Sander 2025-02-03 21:28 2785
    // Miscellaneous
1193b4be Poul Sander 2025-02-03 21:28 2786
    bool                    MenuBarAppending;       // FIXME: Remove this
1193b4be Poul Sander 2025-02-03 21:28 2787
    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.
1193b4be Poul Sander 2025-02-03 21:28 2788
    ImGuiMenuColumns        MenuColumns;            // Simplified columns storage for menu items measurement
1193b4be Poul Sander 2025-02-03 21:28 2789
    int                     TreeDepth;              // Current tree depth.
4e9e2555 Poul Sander 2025-10-05 10:15 2790
    ImU32                   TreeHasStackDataDepthMask;      // Store whether given depth has ImGuiTreeNodeStackData data. Could be turned into a ImU64 if necessary.
4e9e2555 Poul Sander 2025-10-05 10:15 2791
    ImU32                   TreeRecordsClippedNodesY2Mask;  // Store whether we should keep recording Y2. Cleared when passing clip max. Equivalent TreeHasStackDataDepthMask value should always be set.
1193b4be Poul Sander 2025-02-03 21:28 2792
    ImVector<ImGuiWindow*>  ChildWindows;
1193b4be Poul Sander 2025-02-03 21:28 2793
    ImGuiStorage*           StateStorage;           // Current persistent per-window storage (store e.g. tree node open/close state)
1193b4be Poul Sander 2025-02-03 21:28 2794
    ImGuiOldColumns*        CurrentColumns;         // Current columns set
1193b4be Poul Sander 2025-02-03 21:28 2795
    int                     CurrentTableIdx;        // Current table index (into g.Tables)
1193b4be Poul Sander 2025-02-03 21:28 2796
    ImGuiLayoutType         LayoutType;
1193b4be Poul Sander 2025-02-03 21:28 2797
    ImGuiLayoutType         ParentLayoutType;       // Layout type of parent window at the time of Begin()
1193b4be Poul Sander 2025-02-03 21:28 2798
    ImU32                   ModalDimBgColor;
1193b4be Poul Sander 2025-02-03 21:28 2799
4e9e2555 Poul Sander 2025-10-05 10:15 2800
    // Status flags
4e9e2555 Poul Sander 2025-10-05 10:15 2801
    ImGuiItemStatusFlags    WindowItemStatusFlags;
4e9e2555 Poul Sander 2025-10-05 10:15 2802
    ImGuiItemStatusFlags    ChildItemStatusFlags;
4e9e2555 Poul Sander 2025-10-05 10:15 2803
    ImGuiItemStatusFlags    DockTabItemStatusFlags;
4e9e2555 Poul Sander 2025-10-05 10:15 2804
    ImRect                  DockTabItemRect;
4e9e2555 Poul Sander 2025-10-05 10:15 2805
1193b4be Poul Sander 2025-02-03 21:28 2806
    // Local parameters stacks
1193b4be Poul Sander 2025-02-03 21:28 2807
    // 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.
1193b4be Poul Sander 2025-02-03 21:28 2808
    float                   ItemWidth;              // Current item width (>0.0: width in pixels, <0.0: align xx pixels to the right of window).
1193b4be Poul Sander 2025-02-03 21:28 2809
    float                   TextWrapPos;            // Current text wrap pos.
1193b4be Poul Sander 2025-02-03 21:28 2810
    ImVector<float>         ItemWidthStack;         // Store item widths to restore (attention: .back() is not == ItemWidth)
1193b4be Poul Sander 2025-02-03 21:28 2811
    ImVector<float>         TextWrapPosStack;       // Store text wrap pos to restore (attention: .back() is not == TextWrapPos)
1193b4be Poul Sander 2025-02-03 21:28 2812
};
1193b4be Poul Sander 2025-02-03 21:28 2813
1193b4be Poul Sander 2025-02-03 21:28 2814
// Storage for one window
1193b4be Poul Sander 2025-02-03 21:28 2815
struct IMGUI_API ImGuiWindow
1193b4be Poul Sander 2025-02-03 21:28 2816
{
1193b4be Poul Sander 2025-02-03 21:28 2817
    ImGuiContext*           Ctx;                                // Parent UI context (needs to be set explicitly by parent).
1193b4be Poul Sander 2025-02-03 21:28 2818
    char*                   Name;                               // Window name, owned by the window.
1193b4be Poul Sander 2025-02-03 21:28 2819
    ImGuiID                 ID;                                 // == ImHashStr(Name)
1193b4be Poul Sander 2025-02-03 21:28 2820
    ImGuiWindowFlags        Flags, FlagsPreviousFrame;          // See enum ImGuiWindowFlags_
1193b4be Poul Sander 2025-02-03 21:28 2821
    ImGuiChildFlags         ChildFlags;                         // Set when window is a child window. See enum ImGuiChildFlags_
1193b4be Poul Sander 2025-02-03 21:28 2822
    ImGuiWindowClass        WindowClass;                        // Advanced users only. Set with SetNextWindowClass()
1193b4be Poul Sander 2025-02-03 21:28 2823
    ImGuiViewportP*         Viewport;                           // Always set in Begin(). Inactive windows may have a NULL value here if their viewport was discarded.
1193b4be Poul Sander 2025-02-03 21:28 2824
    ImGuiID                 ViewportId;                         // We backup the viewport id (since the viewport may disappear or never be created if the window is inactive)
1193b4be Poul Sander 2025-02-03 21:28 2825
    ImVec2                  ViewportPos;                        // We backup the viewport position (since the viewport may disappear or never be created if the window is inactive)
1193b4be Poul Sander 2025-02-03 21:28 2826
    int                     ViewportAllowPlatformMonitorExtend; // Reset to -1 every frame (index is guaranteed to be valid between NewFrame..EndFrame), only used in the Appearing frame of a tooltip/popup to enforce clamping to a given monitor
1193b4be Poul Sander 2025-02-03 21:28 2827
    ImVec2                  Pos;                                // Position (always rounded-up to nearest pixel)
1193b4be Poul Sander 2025-02-03 21:28 2828
    ImVec2                  Size;                               // Current size (==SizeFull or collapsed title bar size)
1193b4be Poul Sander 2025-02-03 21:28 2829
    ImVec2                  SizeFull;                           // Size when non collapsed
1193b4be Poul Sander 2025-02-03 21:28 2830
    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.
1193b4be Poul Sander 2025-02-03 21:28 2831
    ImVec2                  ContentSizeIdeal;
1193b4be Poul Sander 2025-02-03 21:28 2832
    ImVec2                  ContentSizeExplicit;                // Size of contents/scrollable client area explicitly request by the user via SetNextWindowContentSize().
1193b4be Poul Sander 2025-02-03 21:28 2833
    ImVec2                  WindowPadding;                      // Window padding at the time of Begin().
1193b4be Poul Sander 2025-02-03 21:28 2834
    float                   WindowRounding;                     // Window rounding at the time of Begin(). May be clamped lower to avoid rendering artifacts with title bar, menu bar etc.
1193b4be Poul Sander 2025-02-03 21:28 2835
    float                   WindowBorderSize;                   // Window border size at the time of Begin().
1193b4be Poul Sander 2025-02-03 21:28 2836
    float                   TitleBarHeight, MenuBarHeight;      // Note that those used to be function before 2024/05/28. If you have old code calling TitleBarHeight() you can change it to TitleBarHeight.
1193b4be Poul Sander 2025-02-03 21:28 2837
    float                   DecoOuterSizeX1, DecoOuterSizeY1;   // Left/Up offsets. Sum of non-scrolling outer decorations (X1 generally == 0.0f. Y1 generally = TitleBarHeight + MenuBarHeight). Locked during Begin().
1193b4be Poul Sander 2025-02-03 21:28 2838
    float                   DecoOuterSizeX2, DecoOuterSizeY2;   // Right/Down offsets (X2 generally == ScrollbarSize.x, Y2 == ScrollbarSizes.y).
1193b4be Poul Sander 2025-02-03 21:28 2839
    float                   DecoInnerSizeX1, DecoInnerSizeY1;   // Applied AFTER/OVER InnerRect. Specialized for Tables as they use specialized form of clipping and frozen rows/columns are inside InnerRect (and not part of regular decoration sizes).
1193b4be Poul Sander 2025-02-03 21:28 2840
    int                     NameBufLen;                         // Size of buffer storing Name. May be larger than strlen(Name)!
1193b4be Poul Sander 2025-02-03 21:28 2841
    ImGuiID                 MoveId;                             // == window->GetID("#MOVE")
1193b4be Poul Sander 2025-02-03 21:28 2842
    ImGuiID                 TabId;                              // == window->GetID("#TAB")
1193b4be Poul Sander 2025-02-03 21:28 2843
    ImGuiID                 ChildId;                            // ID of corresponding item in parent window (for navigation to return from child window to parent window)
1193b4be Poul Sander 2025-02-03 21:28 2844
    ImGuiID                 PopupId;                            // ID in the popup stack when this window is used as a popup/menu (because we use generic Name/ID for recycling)
1193b4be Poul Sander 2025-02-03 21:28 2845
    ImVec2                  Scroll;
1193b4be Poul Sander 2025-02-03 21:28 2846
    ImVec2                  ScrollMax;
1193b4be Poul Sander 2025-02-03 21:28 2847
    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)
1193b4be Poul Sander 2025-02-03 21:28 2848
    ImVec2                  ScrollTargetCenterRatio;            // 0.0f = scroll so that target position is at top, 0.5f = scroll so that target position is centered
1193b4be Poul Sander 2025-02-03 21:28 2849
    ImVec2                  ScrollTargetEdgeSnapDist;           // 0.0f = no snapping, >0.0f snapping threshold
1193b4be Poul Sander 2025-02-03 21:28 2850
    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.
1193b4be Poul Sander 2025-02-03 21:28 2851
    bool                    ScrollbarX, ScrollbarY;             // Are scrollbars visible?
4e9e2555 Poul Sander 2025-10-05 10:15 2852
    bool                    ScrollbarXStabilizeEnabled;         // Was ScrollbarX previously auto-stabilized?
4e9e2555 Poul Sander 2025-10-05 10:15 2853
    ImU8                    ScrollbarXStabilizeToggledHistory;  // Used to stabilize scrollbar visibility in case of feedback loops
1193b4be Poul Sander 2025-02-03 21:28 2854
    bool                    ViewportOwned;
1193b4be Poul Sander 2025-02-03 21:28 2855
    bool                    Active;                             // Set to true on Begin(), unless Collapsed
1193b4be Poul Sander 2025-02-03 21:28 2856
    bool                    WasActive;
1193b4be Poul Sander 2025-02-03 21:28 2857
    bool                    WriteAccessed;                      // Set to true when any widget access the current window
1193b4be Poul Sander 2025-02-03 21:28 2858
    bool                    Collapsed;                          // Set when collapsing window to become only title-bar
1193b4be Poul Sander 2025-02-03 21:28 2859
    bool                    WantCollapseToggle;
1193b4be Poul Sander 2025-02-03 21:28 2860
    bool                    SkipItems;                          // Set when items can safely be all clipped (e.g. window not visible or collapsed)
1193b4be Poul Sander 2025-02-03 21:28 2861
    bool                    SkipRefresh;                        // [EXPERIMENTAL] Reuse previous frame drawn contents, Begin() returns false.
1193b4be Poul Sander 2025-02-03 21:28 2862
    bool                    Appearing;                          // Set during the frame where the window is appearing (or re-appearing)
1193b4be Poul Sander 2025-02-03 21:28 2863
    bool                    Hidden;                             // Do not display (== HiddenFrames*** > 0)
1193b4be Poul Sander 2025-02-03 21:28 2864
    bool                    IsFallbackWindow;                   // Set on the "Debug##Default" window.
1193b4be Poul Sander 2025-02-03 21:28 2865
    bool                    IsExplicitChild;                    // Set when passed _ChildWindow, left to false by BeginDocked()
1193b4be Poul Sander 2025-02-03 21:28 2866
    bool                    HasCloseButton;                     // Set when the window has a close button (p_open != NULL)
1193b4be Poul Sander 2025-02-03 21:28 2867
    signed char             ResizeBorderHovered;                // Current border being hovered for resize (-1: none, otherwise 0-3)
1193b4be Poul Sander 2025-02-03 21:28 2868
    signed char             ResizeBorderHeld;                   // Current border being held for resize (-1: none, otherwise 0-3)
1193b4be Poul Sander 2025-02-03 21:28 2869
    short                   BeginCount;                         // Number of Begin() during the current frame (generally 0 or 1, 1+ if appending via multiple Begin/End pairs)
1193b4be Poul Sander 2025-02-03 21:28 2870
    short                   BeginCountPreviousFrame;            // Number of Begin() during the previous frame
1193b4be Poul Sander 2025-02-03 21:28 2871
    short                   BeginOrderWithinParent;             // Begin() order within immediate parent window, if we are a child window. Otherwise 0.
1193b4be Poul Sander 2025-02-03 21:28 2872
    short                   BeginOrderWithinContext;            // Begin() order within entire imgui context. This is mostly used for debugging submission order related issues.
1193b4be Poul Sander 2025-02-03 21:28 2873
    short                   FocusOrder;                         // Order within WindowsFocusOrder[], altered when windows are focused.
1193b4be Poul Sander 2025-02-03 21:28 2874
    ImS8                    AutoFitFramesX, AutoFitFramesY;
1193b4be Poul Sander 2025-02-03 21:28 2875
    bool                    AutoFitOnlyGrows;
1193b4be Poul Sander 2025-02-03 21:28 2876
    ImGuiDir                AutoPosLastDirection;
1193b4be Poul Sander 2025-02-03 21:28 2877
    ImS8                    HiddenFramesCanSkipItems;           // Hide the window for N frames
1193b4be Poul Sander 2025-02-03 21:28 2878
    ImS8                    HiddenFramesCannotSkipItems;        // Hide the window for N frames while allowing items to be submitted so we can measure their size
1193b4be Poul Sander 2025-02-03 21:28 2879
    ImS8                    HiddenFramesForRenderOnly;          // Hide the window until frame N at Render() time only
1193b4be Poul Sander 2025-02-03 21:28 2880
    ImS8                    DisableInputsFrames;                // Disable window interactions for N frames
1193b4be Poul Sander 2025-02-03 21:28 2881
    ImGuiCond               SetWindowPosAllowFlags : 8;         // store acceptable condition flags for SetNextWindowPos() use.
1193b4be Poul Sander 2025-02-03 21:28 2882
    ImGuiCond               SetWindowSizeAllowFlags : 8;        // store acceptable condition flags for SetNextWindowSize() use.
1193b4be Poul Sander 2025-02-03 21:28 2883
    ImGuiCond               SetWindowCollapsedAllowFlags : 8;   // store acceptable condition flags for SetNextWindowCollapsed() use.
1193b4be Poul Sander 2025-02-03 21:28 2884
    ImGuiCond               SetWindowDockAllowFlags : 8;        // store acceptable condition flags for SetNextWindowDock() use.
1193b4be Poul Sander 2025-02-03 21:28 2885
    ImVec2                  SetWindowPosVal;                    // store window position when using a non-zero Pivot (position set needs to be processed when we know the window size)
1193b4be Poul Sander 2025-02-03 21:28 2886
    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.
1193b4be Poul Sander 2025-02-03 21:28 2887
1193b4be Poul Sander 2025-02-03 21:28 2888
    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)
1193b4be Poul Sander 2025-02-03 21:28 2889
    ImGuiWindowTempData     DC;                                 // Temporary per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the "DC" variable name.
1193b4be Poul Sander 2025-02-03 21:28 2890
1193b4be Poul Sander 2025-02-03 21:28 2891
    // The best way to understand what those rectangles are is to use the 'Metrics->Tools->Show Windows Rectangles' viewer.
1193b4be Poul Sander 2025-02-03 21:28 2892
    // The main 'OuterRect', omitted as a field, is window->Rect().
1193b4be Poul Sander 2025-02-03 21:28 2893
    ImRect                  OuterRectClipped;                   // == Window->Rect() just after setup in Begin(). == window->Rect() for root window.
1193b4be Poul Sander 2025-02-03 21:28 2894
    ImRect                  InnerRect;                          // Inner rectangle (omit title bar, menu bar, scroll bar)
1193b4be Poul Sander 2025-02-03 21:28 2895
    ImRect                  InnerClipRect;                      // == InnerRect shrunk by WindowPadding*0.5f on each side, clipped within viewport or parent clip rect.
1193b4be Poul Sander 2025-02-03 21:28 2896
    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).
1193b4be Poul Sander 2025-02-03 21:28 2897
    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?
1193b4be Poul Sander 2025-02-03 21:28 2898
    ImRect                  ClipRect;                           // Current clipping/scissoring rectangle, evolve as we are using PushClipRect(), etc. == DrawList->clip_rect_stack.back().
1193b4be Poul Sander 2025-02-03 21:28 2899
    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.
1193b4be Poul Sander 2025-02-03 21:28 2900
    ImVec2ih                HitTestHoleSize;                    // Define an optional rectangular hole where mouse will pass-through the window.
1193b4be Poul Sander 2025-02-03 21:28 2901
    ImVec2ih                HitTestHoleOffset;
1193b4be Poul Sander 2025-02-03 21:28 2902
1193b4be Poul Sander 2025-02-03 21:28 2903
    int                     LastFrameActive;                    // Last frame number the window was Active.
1193b4be Poul Sander 2025-02-03 21:28 2904
    int                     LastFrameJustFocused;               // Last frame number the window was made Focused.
1193b4be Poul Sander 2025-02-03 21:28 2905
    float                   LastTimeActive;                     // Last timestamp the window was Active (using float as we don't need high precision there)
1193b4be Poul Sander 2025-02-03 21:28 2906
    float                   ItemWidthDefault;
1193b4be Poul Sander 2025-02-03 21:28 2907
    ImGuiStorage            StateStorage;
1193b4be Poul Sander 2025-02-03 21:28 2908
    ImVector<ImGuiOldColumns> ColumnsStorage;
1193b4be Poul Sander 2025-02-03 21:28 2909
    float                   FontWindowScale;                    // User scale multiplier per-window, via SetWindowFontScale()
4e9e2555 Poul Sander 2025-10-05 10:15 2910
    float                   FontWindowScaleParents;
4e9e2555 Poul Sander 2025-10-05 10:15 2911
    float                   FontRefSize;                        // This is a copy of window->CalcFontSize() at the time of Begin(), trying to phase out CalcFontSize() especially as it may be called on non-current window.
1193b4be Poul Sander 2025-02-03 21:28 2912
    int                     SettingsOffset;                     // Offset into SettingsWindows[] (offsets are always valid as we only grow the array from the back)
1193b4be Poul Sander 2025-02-03 21:28 2913
1193b4be Poul Sander 2025-02-03 21:28 2914
    ImDrawList*             DrawList;                           // == &DrawListInst (for backward compatibility reason with code using imgui_internal.h we keep this a pointer)
1193b4be Poul Sander 2025-02-03 21:28 2915
    ImDrawList              DrawListInst;
1193b4be Poul Sander 2025-02-03 21:28 2916
    ImGuiWindow*            ParentWindow;                       // If we are a child _or_ popup _or_ docked window, this is pointing to our parent. Otherwise NULL.
1193b4be Poul Sander 2025-02-03 21:28 2917
    ImGuiWindow*            ParentWindowInBeginStack;
1193b4be Poul Sander 2025-02-03 21:28 2918
    ImGuiWindow*            RootWindow;                         // Point to ourself or first ancestor that is not a child window. Doesn't cross through popups/dock nodes.
1193b4be Poul Sander 2025-02-03 21:28 2919
    ImGuiWindow*            RootWindowPopupTree;                // Point to ourself or first ancestor that is not a child window. Cross through popups parent<>child.
1193b4be Poul Sander 2025-02-03 21:28 2920
    ImGuiWindow*            RootWindowDockTree;                 // Point to ourself or first ancestor that is not a child window. Cross through dock nodes.
1193b4be Poul Sander 2025-02-03 21:28 2921
    ImGuiWindow*            RootWindowForTitleBarHighlight;     // Point to ourself or first ancestor which will display TitleBgActive color when this window is active.
1193b4be Poul Sander 2025-02-03 21:28 2922
    ImGuiWindow*            RootWindowForNav;                   // Point to ourself or first ancestor which doesn't have the NavFlattened flag.
1193b4be Poul Sander 2025-02-03 21:28 2923
    ImGuiWindow*            ParentWindowForFocusRoute;          // Set to manual link a window to its logical parent so that Shortcut() chain are honoerd (e.g. Tool linked to Document)
1193b4be Poul Sander 2025-02-03 21:28 2924
1193b4be Poul Sander 2025-02-03 21:28 2925
    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.)
1193b4be Poul Sander 2025-02-03 21:28 2926
    ImGuiID                 NavLastIds[ImGuiNavLayer_COUNT];    // Last known NavId for this window, per layer (0/1)
1193b4be Poul Sander 2025-02-03 21:28 2927
    ImRect                  NavRectRel[ImGuiNavLayer_COUNT];    // Reference rectangle, in window relative space
1193b4be Poul Sander 2025-02-03 21:28 2928
    ImVec2                  NavPreferredScoringPosRel[ImGuiNavLayer_COUNT]; // Preferred X/Y position updated when moving on a given axis, reset to FLT_MAX.
1193b4be Poul Sander 2025-02-03 21:28 2929
    ImGuiID                 NavRootFocusScopeId;                // Focus Scope ID at the time of Begin()
1193b4be Poul Sander 2025-02-03 21:28 2930
1193b4be Poul Sander 2025-02-03 21:28 2931
    int                     MemoryDrawListIdxCapacity;          // Backup of last idx/vtx count, so when waking up the window we can preallocate and avoid iterative alloc/copy
1193b4be Poul Sander 2025-02-03 21:28 2932
    int                     MemoryDrawListVtxCapacity;
1193b4be Poul Sander 2025-02-03 21:28 2933
    bool                    MemoryCompacted;                    // Set when window extraneous data have been garbage collected
1193b4be Poul Sander 2025-02-03 21:28 2934
1193b4be Poul Sander 2025-02-03 21:28 2935
    // Docking
1193b4be Poul Sander 2025-02-03 21:28 2936
    bool                    DockIsActive        :1;             // When docking artifacts are actually visible. When this is set, DockNode is guaranteed to be != NULL. ~~ (DockNode != NULL) && (DockNode->Windows.Size > 1).
1193b4be Poul Sander 2025-02-03 21:28 2937
    bool                    DockNodeIsVisible   :1;
1193b4be Poul Sander 2025-02-03 21:28 2938
    bool                    DockTabIsVisible    :1;             // Is our window visible this frame? ~~ is the corresponding tab selected?
1193b4be Poul Sander 2025-02-03 21:28 2939
    bool                    DockTabWantClose    :1;
1193b4be Poul Sander 2025-02-03 21:28 2940
    short                   DockOrder;                          // Order of the last time the window was visible within its DockNode. This is used to reorder windows that are reappearing on the same frame. Same value between windows that were active and windows that were none are possible.
1193b4be Poul Sander 2025-02-03 21:28 2941
    ImGuiWindowDockStyle    DockStyle;
1193b4be Poul Sander 2025-02-03 21:28 2942
    ImGuiDockNode*          DockNode;                           // Which node are we docked into. Important: Prefer testing DockIsActive in many cases as this will still be set when the dock node is hidden.
1193b4be Poul Sander 2025-02-03 21:28 2943
    ImGuiDockNode*          DockNodeAsHost;                     // Which node are we owning (for parent windows)
1193b4be Poul Sander 2025-02-03 21:28 2944
    ImGuiID                 DockId;                             // Backup of last valid DockNode->ID, so single window remember their dock node id even when they are not bound any more
1193b4be Poul Sander 2025-02-03 21:28 2945
1193b4be Poul Sander 2025-02-03 21:28 2946
public:
1193b4be Poul Sander 2025-02-03 21:28 2947
    ImGuiWindow(ImGuiContext* context, const char* name);
1193b4be Poul Sander 2025-02-03 21:28 2948
    ~ImGuiWindow();
1193b4be Poul Sander 2025-02-03 21:28 2949
1193b4be Poul Sander 2025-02-03 21:28 2950
    ImGuiID     GetID(const char* str, const char* str_end = NULL);
1193b4be Poul Sander 2025-02-03 21:28 2951
    ImGuiID     GetID(const void* ptr);
1193b4be Poul Sander 2025-02-03 21:28 2952
    ImGuiID     GetID(int n);
1193b4be Poul Sander 2025-02-03 21:28 2953
    ImGuiID     GetIDFromPos(const ImVec2& p_abs);
1193b4be Poul Sander 2025-02-03 21:28 2954
    ImGuiID     GetIDFromRectangle(const ImRect& r_abs);
1193b4be Poul Sander 2025-02-03 21:28 2955
1193b4be Poul Sander 2025-02-03 21:28 2956
    // We don't use g.FontSize because the window may be != g.CurrentWindow.
1193b4be Poul Sander 2025-02-03 21:28 2957
    ImRect      Rect() const            { return ImRect(Pos.x, Pos.y, Pos.x + Size.x, Pos.y + Size.y); }
1193b4be Poul Sander 2025-02-03 21:28 2958
    ImRect      TitleBarRect() const    { return ImRect(Pos, ImVec2(Pos.x + SizeFull.x, Pos.y + TitleBarHeight)); }
1193b4be Poul Sander 2025-02-03 21:28 2959
    ImRect      MenuBarRect() const     { float y1 = Pos.y + TitleBarHeight; return ImRect(Pos.x, y1, Pos.x + SizeFull.x, y1 + MenuBarHeight); }
4e9e2555 Poul Sander 2025-10-05 10:15 2960
4e9e2555 Poul Sander 2025-10-05 10:15 2961
    // [Obsolete] ImGuiWindow::CalcFontSize() was removed in 1.92.x because error-prone/misleading. You can use window->FontRefSize for a copy of g.FontSize at the time of the last Begin() call for this window.
4e9e2555 Poul Sander 2025-10-05 10:15 2962
    //float     CalcFontSize() const    { ImGuiContext& g = *Ctx; return g.FontSizeBase * FontWindowScale * FontDpiScale * FontWindowScaleParents;
1193b4be Poul Sander 2025-02-03 21:28 2963
};
1193b4be Poul Sander 2025-02-03 21:28 2964
1193b4be Poul Sander 2025-02-03 21:28 2965
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 2966
// [SECTION] Tab bar, Tab item support
1193b4be Poul Sander 2025-02-03 21:28 2967
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 2968
1193b4be Poul Sander 2025-02-03 21:28 2969
// Extend ImGuiTabBarFlags_
1193b4be Poul Sander 2025-02-03 21:28 2970
enum ImGuiTabBarFlagsPrivate_
1193b4be Poul Sander 2025-02-03 21:28 2971
{
1193b4be Poul Sander 2025-02-03 21:28 2972
    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]
1193b4be Poul Sander 2025-02-03 21:28 2973
    ImGuiTabBarFlags_IsFocused                  = 1 << 21,
1193b4be Poul Sander 2025-02-03 21:28 2974
    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
1193b4be Poul Sander 2025-02-03 21:28 2975
};
1193b4be Poul Sander 2025-02-03 21:28 2976
1193b4be Poul Sander 2025-02-03 21:28 2977
// Extend ImGuiTabItemFlags_
1193b4be Poul Sander 2025-02-03 21:28 2978
enum ImGuiTabItemFlagsPrivate_
1193b4be Poul Sander 2025-02-03 21:28 2979
{
1193b4be Poul Sander 2025-02-03 21:28 2980
    ImGuiTabItemFlags_SectionMask_              = ImGuiTabItemFlags_Leading | ImGuiTabItemFlags_Trailing,
1193b4be Poul Sander 2025-02-03 21:28 2981
    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)
1193b4be Poul Sander 2025-02-03 21:28 2982
    ImGuiTabItemFlags_Button                    = 1 << 21,  // Used by TabItemButton, change the tab item behavior to mimic a button
4e9e2555 Poul Sander 2025-10-05 10:15 2983
    ImGuiTabItemFlags_Invisible                 = 1 << 22,  // To reserve space e.g. with ImGuiTabItemFlags_Leading
4e9e2555 Poul Sander 2025-10-05 10:15 2984
    ImGuiTabItemFlags_Unsorted                  = 1 << 23,  // [Docking] Trailing tabs with the _Unsorted flag will be sorted based on the DockOrder of their Window.
1193b4be Poul Sander 2025-02-03 21:28 2985
};
1193b4be Poul Sander 2025-02-03 21:28 2986
1193b4be Poul Sander 2025-02-03 21:28 2987
// Storage for one active tab item (sizeof() 48 bytes)
1193b4be Poul Sander 2025-02-03 21:28 2988
struct ImGuiTabItem
1193b4be Poul Sander 2025-02-03 21:28 2989
{
1193b4be Poul Sander 2025-02-03 21:28 2990
    ImGuiID             ID;
1193b4be Poul Sander 2025-02-03 21:28 2991
    ImGuiTabItemFlags   Flags;
1193b4be Poul Sander 2025-02-03 21:28 2992
    ImGuiWindow*        Window;                 // When TabItem is part of a DockNode's TabBar, we hold on to a window.
1193b4be Poul Sander 2025-02-03 21:28 2993
    int                 LastFrameVisible;
1193b4be Poul Sander 2025-02-03 21:28 2994
    int                 LastFrameSelected;      // This allows us to infer an ordered list of the last activated tabs with little maintenance
1193b4be Poul Sander 2025-02-03 21:28 2995
    float               Offset;                 // Position relative to beginning of tab
1193b4be Poul Sander 2025-02-03 21:28 2996
    float               Width;                  // Width currently displayed
4e9e2555 Poul Sander 2025-10-05 10:15 2997
    float               ContentWidth;           // Width of label + padding, stored during BeginTabItem() call (misnamed as "Content" would normally imply width of label only)
1193b4be Poul Sander 2025-02-03 21:28 2998
    float               RequestedWidth;         // Width optionally requested by caller, -1.0f is unused
1193b4be Poul Sander 2025-02-03 21:28 2999
    ImS32               NameOffset;             // When Window==NULL, offset to name within parent ImGuiTabBar::TabsNames
1193b4be Poul Sander 2025-02-03 21:28 3000
    ImS16               BeginOrder;             // BeginTabItem() order, used to re-order tabs after toggling ImGuiTabBarFlags_Reorderable
1193b4be Poul Sander 2025-02-03 21:28 3001
    ImS16               IndexDuringLayout;      // Index only used during TabBarLayout(). Tabs gets reordered so 'Tabs[n].IndexDuringLayout == n' but may mismatch during additions.
1193b4be Poul Sander 2025-02-03 21:28 3002
    bool                WantClose;              // Marked as closed by SetTabItemClosed()
1193b4be Poul Sander 2025-02-03 21:28 3003
1193b4be Poul Sander 2025-02-03 21:28 3004
    ImGuiTabItem()      { memset(this, 0, sizeof(*this)); LastFrameVisible = LastFrameSelected = -1; RequestedWidth = -1.0f; NameOffset = -1; BeginOrder = IndexDuringLayout = -1; }
1193b4be Poul Sander 2025-02-03 21:28 3005
};
1193b4be Poul Sander 2025-02-03 21:28 3006
1193b4be Poul Sander 2025-02-03 21:28 3007
// Storage for a tab bar (sizeof() 160 bytes)
1193b4be Poul Sander 2025-02-03 21:28 3008
struct IMGUI_API ImGuiTabBar
1193b4be Poul Sander 2025-02-03 21:28 3009
{
1193b4be Poul Sander 2025-02-03 21:28 3010
    ImGuiWindow*        Window;
1193b4be Poul Sander 2025-02-03 21:28 3011
    ImVector<ImGuiTabItem> Tabs;
1193b4be Poul Sander 2025-02-03 21:28 3012
    ImGuiTabBarFlags    Flags;
1193b4be Poul Sander 2025-02-03 21:28 3013
    ImGuiID             ID;                     // Zero for tab-bars used by docking
1193b4be Poul Sander 2025-02-03 21:28 3014
    ImGuiID             SelectedTabId;          // Selected tab/window
1193b4be Poul Sander 2025-02-03 21:28 3015
    ImGuiID             NextSelectedTabId;      // Next selected tab/window. Will also trigger a scrolling animation
1193b4be Poul Sander 2025-02-03 21:28 3016
    ImGuiID             VisibleTabId;           // Can occasionally be != SelectedTabId (e.g. when previewing contents for CTRL+TAB preview)
1193b4be Poul Sander 2025-02-03 21:28 3017
    int                 CurrFrameVisible;
1193b4be Poul Sander 2025-02-03 21:28 3018
    int                 PrevFrameVisible;
1193b4be Poul Sander 2025-02-03 21:28 3019
    ImRect              BarRect;
4e9e2555 Poul Sander 2025-10-05 10:15 3020
    float               BarRectPrevWidth;       // Backup of previous width. When width change we enforce keep horizontal scroll on focused tab.
1193b4be Poul Sander 2025-02-03 21:28 3021
    float               CurrTabsContentsHeight;
1193b4be Poul Sander 2025-02-03 21:28 3022
    float               PrevTabsContentsHeight; // Record the height of contents submitted below the tab bar
1193b4be Poul Sander 2025-02-03 21:28 3023
    float               WidthAllTabs;           // Actual width of all tabs (locked during layout)
1193b4be Poul Sander 2025-02-03 21:28 3024
    float               WidthAllTabsIdeal;      // Ideal width if all tabs were visible and not clipped
1193b4be Poul Sander 2025-02-03 21:28 3025
    float               ScrollingAnim;
1193b4be Poul Sander 2025-02-03 21:28 3026
    float               ScrollingTarget;
1193b4be Poul Sander 2025-02-03 21:28 3027
    float               ScrollingTargetDistToVisibility;
1193b4be Poul Sander 2025-02-03 21:28 3028
    float               ScrollingSpeed;
1193b4be Poul Sander 2025-02-03 21:28 3029
    float               ScrollingRectMinX;
1193b4be Poul Sander 2025-02-03 21:28 3030
    float               ScrollingRectMaxX;
1193b4be Poul Sander 2025-02-03 21:28 3031
    float               SeparatorMinX;
1193b4be Poul Sander 2025-02-03 21:28 3032
    float               SeparatorMaxX;
1193b4be Poul Sander 2025-02-03 21:28 3033
    ImGuiID             ReorderRequestTabId;
1193b4be Poul Sander 2025-02-03 21:28 3034
    ImS16               ReorderRequestOffset;
1193b4be Poul Sander 2025-02-03 21:28 3035
    ImS8                BeginCount;
1193b4be Poul Sander 2025-02-03 21:28 3036
    bool                WantLayout;
1193b4be Poul Sander 2025-02-03 21:28 3037
    bool                VisibleTabWasSubmitted;
1193b4be Poul Sander 2025-02-03 21:28 3038
    bool                TabsAddedNew;           // Set to true when a new tab item or button has been added to the tab bar during last frame
4e9e2555 Poul Sander 2025-10-05 10:15 3039
    bool                ScrollButtonEnabled;
1193b4be Poul Sander 2025-02-03 21:28 3040
    ImS16               TabsActiveCount;        // Number of tabs submitted this frame.
1193b4be Poul Sander 2025-02-03 21:28 3041
    ImS16               LastTabItemIdx;         // Index of last BeginTabItem() tab for use by EndTabItem()
1193b4be Poul Sander 2025-02-03 21:28 3042
    float               ItemSpacingY;
1193b4be Poul Sander 2025-02-03 21:28 3043
    ImVec2              FramePadding;           // style.FramePadding locked at the time of BeginTabBar()
1193b4be Poul Sander 2025-02-03 21:28 3044
    ImVec2              BackupCursorPos;
1193b4be Poul Sander 2025-02-03 21:28 3045
    ImGuiTextBuffer     TabsNames;              // For non-docking tab bar we re-append names in a contiguous buffer.
1193b4be Poul Sander 2025-02-03 21:28 3046
1193b4be Poul Sander 2025-02-03 21:28 3047
    ImGuiTabBar();
1193b4be Poul Sander 2025-02-03 21:28 3048
};
1193b4be Poul Sander 2025-02-03 21:28 3049
1193b4be Poul Sander 2025-02-03 21:28 3050
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 3051
// [SECTION] Table support
1193b4be Poul Sander 2025-02-03 21:28 3052
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 3053
1193b4be Poul Sander 2025-02-03 21:28 3054
#define IM_COL32_DISABLE                IM_COL32(0,0,0,1)   // Special sentinel code which cannot be used as a regular color.
4e9e2555 Poul Sander 2025-10-05 10:15 3055
#define IMGUI_TABLE_MAX_COLUMNS         512                 // Arbitrary "safety" maximum, may be lifted in the future if needed. Must fit in ImGuiTableColumnIdx/ImGuiTableDrawChannelIdx.
1193b4be Poul Sander 2025-02-03 21:28 3056
1193b4be Poul Sander 2025-02-03 21:28 3057
// [Internal] sizeof() ~ 112
1193b4be Poul Sander 2025-02-03 21:28 3058
// We use the terminology "Enabled" to refer to a column that is not Hidden by user/api.
1193b4be Poul Sander 2025-02-03 21:28 3059
// We use the terminology "Clipped" to refer to a column that is out of sight because of scrolling/clipping.
1193b4be Poul Sander 2025-02-03 21:28 3060
// This is in contrast with some user-facing api such as IsItemVisible() / IsRectVisible() which use "Visible" to mean "not clipped".
1193b4be Poul Sander 2025-02-03 21:28 3061
struct ImGuiTableColumn
1193b4be Poul Sander 2025-02-03 21:28 3062
{
1193b4be Poul Sander 2025-02-03 21:28 3063
    ImGuiTableColumnFlags   Flags;                          // Flags after some patching (not directly same as provided by user). See ImGuiTableColumnFlags_
1193b4be Poul Sander 2025-02-03 21:28 3064
    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.
1193b4be Poul Sander 2025-02-03 21:28 3065
    float                   MinX;                           // Absolute positions
1193b4be Poul Sander 2025-02-03 21:28 3066
    float                   MaxX;
1193b4be Poul Sander 2025-02-03 21:28 3067
    float                   WidthRequest;                   // Master width absolute value when !(Flags & _WidthStretch). When Stretch this is derived every frame from StretchWeight in TableUpdateLayout()
1193b4be Poul Sander 2025-02-03 21:28 3068
    float                   WidthAuto;                      // Automatic width
1193b4be Poul Sander 2025-02-03 21:28 3069
    float                   WidthMax;                       // Maximum width (FIXME: overwritten by each instance)
1193b4be Poul Sander 2025-02-03 21:28 3070
    float                   StretchWeight;                  // Master width weight when (Flags & _WidthStretch). Often around ~1.0f initially.
1193b4be Poul Sander 2025-02-03 21:28 3071
    float                   InitStretchWeightOrWidth;       // Value passed to TableSetupColumn(). For Width it is a content width (_without padding_).
1193b4be Poul Sander 2025-02-03 21:28 3072
    ImRect                  ClipRect;                       // Clipping rectangle for the column
1193b4be Poul Sander 2025-02-03 21:28 3073
    ImGuiID                 UserID;                         // Optional, value passed to TableSetupColumn()
1193b4be Poul Sander 2025-02-03 21:28 3074
    float                   WorkMinX;                       // Contents region min ~(MinX + CellPaddingX + CellSpacingX1) == cursor start position when entering column
1193b4be Poul Sander 2025-02-03 21:28 3075
    float                   WorkMaxX;                       // Contents region max ~(MaxX - CellPaddingX - CellSpacingX2)
1193b4be Poul Sander 2025-02-03 21:28 3076
    float                   ItemWidth;                      // Current item width for the column, preserved across rows
1193b4be Poul Sander 2025-02-03 21:28 3077
    float                   ContentMaxXFrozen;              // Contents maximum position for frozen rows (apart from headers), from which we can infer content width.
1193b4be Poul Sander 2025-02-03 21:28 3078
    float                   ContentMaxXUnfrozen;
1193b4be Poul Sander 2025-02-03 21:28 3079
    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
1193b4be Poul Sander 2025-02-03 21:28 3080
    float                   ContentMaxXHeadersIdeal;
1193b4be Poul Sander 2025-02-03 21:28 3081
    ImS16                   NameOffset;                     // Offset into parent ColumnsNames[]
1193b4be Poul Sander 2025-02-03 21:28 3082
    ImGuiTableColumnIdx     DisplayOrder;                   // Index within Table's IndexToDisplayOrder[] (column may be reordered by users)
1193b4be Poul Sander 2025-02-03 21:28 3083
    ImGuiTableColumnIdx     IndexWithinEnabledSet;          // Index within enabled/visible set (<= IndexToDisplayOrder)
1193b4be Poul Sander 2025-02-03 21:28 3084
    ImGuiTableColumnIdx     PrevEnabledColumn;              // Index of prev enabled/visible column within Columns[], -1 if first enabled/visible column
1193b4be Poul Sander 2025-02-03 21:28 3085
    ImGuiTableColumnIdx     NextEnabledColumn;              // Index of next enabled/visible column within Columns[], -1 if last enabled/visible column
1193b4be Poul Sander 2025-02-03 21:28 3086
    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
1193b4be Poul Sander 2025-02-03 21:28 3087
    ImGuiTableDrawChannelIdx DrawChannelCurrent;            // Index within DrawSplitter.Channels[]
1193b4be Poul Sander 2025-02-03 21:28 3088
    ImGuiTableDrawChannelIdx DrawChannelFrozen;             // Draw channels for frozen rows (often headers)
1193b4be Poul Sander 2025-02-03 21:28 3089
    ImGuiTableDrawChannelIdx DrawChannelUnfrozen;           // Draw channels for unfrozen rows
1193b4be Poul Sander 2025-02-03 21:28 3090
    bool                    IsEnabled;                      // IsUserEnabled && (Flags & ImGuiTableColumnFlags_Disabled) == 0
1193b4be Poul Sander 2025-02-03 21:28 3091
    bool                    IsUserEnabled;                  // Is the column not marked Hidden by the user? (unrelated to being off view, e.g. clipped by scrolling).
1193b4be Poul Sander 2025-02-03 21:28 3092
    bool                    IsUserEnabledNextFrame;
1193b4be Poul Sander 2025-02-03 21:28 3093
    bool                    IsVisibleX;                     // Is actually in view (e.g. overlapping the host window clipping rectangle, not scrolled).
1193b4be Poul Sander 2025-02-03 21:28 3094
    bool                    IsVisibleY;
1193b4be Poul Sander 2025-02-03 21:28 3095
    bool                    IsRequestOutput;                // Return value for TableSetColumnIndex() / TableNextColumn(): whether we request user to output contents or not.
1193b4be Poul Sander 2025-02-03 21:28 3096
    bool                    IsSkipItems;                    // Do we want item submissions to this column to be completely ignored (no layout will happen).
1193b4be Poul Sander 2025-02-03 21:28 3097
    bool                    IsPreserveWidthAuto;
1193b4be Poul Sander 2025-02-03 21:28 3098
    ImS8                    NavLayerCurrent;                // ImGuiNavLayer in 1 byte
1193b4be Poul Sander 2025-02-03 21:28 3099
    ImU8                    AutoFitQueue;                   // Queue of 8 values for the next 8 frames to request auto-fit
1193b4be Poul Sander 2025-02-03 21:28 3100
    ImU8                    CannotSkipItemsQueue;           // Queue of 8 values for the next 8 frames to disable Clipped/SkipItem
1193b4be Poul Sander 2025-02-03 21:28 3101
    ImU8                    SortDirection : 2;              // ImGuiSortDirection_Ascending or ImGuiSortDirection_Descending
1193b4be Poul Sander 2025-02-03 21:28 3102
    ImU8                    SortDirectionsAvailCount : 2;   // Number of available sort directions (0 to 3)
1193b4be Poul Sander 2025-02-03 21:28 3103
    ImU8                    SortDirectionsAvailMask : 4;    // Mask of available sort directions (1-bit each)
1193b4be Poul Sander 2025-02-03 21:28 3104
    ImU8                    SortDirectionsAvailList;        // Ordered list of available sort directions (2-bits each, total 8-bits)
1193b4be Poul Sander 2025-02-03 21:28 3105
1193b4be Poul Sander 2025-02-03 21:28 3106
    ImGuiTableColumn()
1193b4be Poul Sander 2025-02-03 21:28 3107
    {
1193b4be Poul Sander 2025-02-03 21:28 3108
        memset(this, 0, sizeof(*this));
1193b4be Poul Sander 2025-02-03 21:28 3109
        StretchWeight = WidthRequest = -1.0f;
1193b4be Poul Sander 2025-02-03 21:28 3110
        NameOffset = -1;
1193b4be Poul Sander 2025-02-03 21:28 3111
        DisplayOrder = IndexWithinEnabledSet = -1;
1193b4be Poul Sander 2025-02-03 21:28 3112
        PrevEnabledColumn = NextEnabledColumn = -1;
1193b4be Poul Sander 2025-02-03 21:28 3113
        SortOrder = -1;
1193b4be Poul Sander 2025-02-03 21:28 3114
        SortDirection = ImGuiSortDirection_None;
1193b4be Poul Sander 2025-02-03 21:28 3115
        DrawChannelCurrent = DrawChannelFrozen = DrawChannelUnfrozen = (ImU8)-1;
1193b4be Poul Sander 2025-02-03 21:28 3116
    }
1193b4be Poul Sander 2025-02-03 21:28 3117
};
1193b4be Poul Sander 2025-02-03 21:28 3118
1193b4be Poul Sander 2025-02-03 21:28 3119
// Transient cell data stored per row.
1193b4be Poul Sander 2025-02-03 21:28 3120
// sizeof() ~ 6 bytes
1193b4be Poul Sander 2025-02-03 21:28 3121
struct ImGuiTableCellData
1193b4be Poul Sander 2025-02-03 21:28 3122
{
1193b4be Poul Sander 2025-02-03 21:28 3123
    ImU32                       BgColor;    // Actual color
1193b4be Poul Sander 2025-02-03 21:28 3124
    ImGuiTableColumnIdx         Column;     // Column number
1193b4be Poul Sander 2025-02-03 21:28 3125
};
1193b4be Poul Sander 2025-02-03 21:28 3126
1193b4be Poul Sander 2025-02-03 21:28 3127
// Parameters for TableAngledHeadersRowEx()
1193b4be Poul Sander 2025-02-03 21:28 3128
// This may end up being refactored for more general purpose.
1193b4be Poul Sander 2025-02-03 21:28 3129
// sizeof() ~ 12 bytes
1193b4be Poul Sander 2025-02-03 21:28 3130
struct ImGuiTableHeaderData
1193b4be Poul Sander 2025-02-03 21:28 3131
{
1193b4be Poul Sander 2025-02-03 21:28 3132
    ImGuiTableColumnIdx         Index;      // Column index
1193b4be Poul Sander 2025-02-03 21:28 3133
    ImU32                       TextColor;
1193b4be Poul Sander 2025-02-03 21:28 3134
    ImU32                       BgColor0;
1193b4be Poul Sander 2025-02-03 21:28 3135
    ImU32                       BgColor1;
1193b4be Poul Sander 2025-02-03 21:28 3136
};
1193b4be Poul Sander 2025-02-03 21:28 3137
1193b4be Poul Sander 2025-02-03 21:28 3138
// Per-instance data that needs preserving across frames (seemingly most others do not need to be preserved aside from debug needs. Does that means they could be moved to ImGuiTableTempData?)
1193b4be Poul Sander 2025-02-03 21:28 3139
// sizeof() ~ 24 bytes
1193b4be Poul Sander 2025-02-03 21:28 3140
struct ImGuiTableInstanceData
1193b4be Poul Sander 2025-02-03 21:28 3141
{
1193b4be Poul Sander 2025-02-03 21:28 3142
    ImGuiID                     TableInstanceID;
1193b4be Poul Sander 2025-02-03 21:28 3143
    float                       LastOuterHeight;            // Outer height from last frame
1193b4be Poul Sander 2025-02-03 21:28 3144
    float                       LastTopHeadersRowHeight;    // Height of first consecutive header rows from last frame (FIXME: this is used assuming consecutive headers are in same frozen set)
1193b4be Poul Sander 2025-02-03 21:28 3145
    float                       LastFrozenHeight;           // Height of frozen section from last frame
1193b4be Poul Sander 2025-02-03 21:28 3146
    int                         HoveredRowLast;             // Index of row which was hovered last frame.
1193b4be Poul Sander 2025-02-03 21:28 3147
    int                         HoveredRowNext;             // Index of row hovered this frame, set after encountering it.
1193b4be Poul Sander 2025-02-03 21:28 3148
1193b4be Poul Sander 2025-02-03 21:28 3149
    ImGuiTableInstanceData()    { TableInstanceID = 0; LastOuterHeight = LastTopHeadersRowHeight = LastFrozenHeight = 0.0f; HoveredRowLast = HoveredRowNext = -1; }
1193b4be Poul Sander 2025-02-03 21:28 3150
};
1193b4be Poul Sander 2025-02-03 21:28 3151
1193b4be Poul Sander 2025-02-03 21:28 3152
// sizeof() ~ 592 bytes + heap allocs described in TableBeginInitMemory()
1193b4be Poul Sander 2025-02-03 21:28 3153
struct IMGUI_API ImGuiTable
1193b4be Poul Sander 2025-02-03 21:28 3154
{
1193b4be Poul Sander 2025-02-03 21:28 3155
    ImGuiID                     ID;
1193b4be Poul Sander 2025-02-03 21:28 3156
    ImGuiTableFlags             Flags;
4e9e2555 Poul Sander 2025-10-05 10:15 3157
    void*                       RawData;                    // Single allocation to hold Columns[], DisplayOrderToIndex[], and RowCellData[]
1193b4be Poul Sander 2025-02-03 21:28 3158
    ImGuiTableTempData*         TempData;                   // Transient data while table is active. Point within g.CurrentTableStack[]
1193b4be Poul Sander 2025-02-03 21:28 3159
    ImSpan<ImGuiTableColumn>    Columns;                    // Point within RawData[]
1193b4be Poul Sander 2025-02-03 21:28 3160
    ImSpan<ImGuiTableColumnIdx> DisplayOrderToIndex;        // Point within RawData[]. Store display order of columns (when not reordered, the values are 0...Count-1)
1193b4be Poul Sander 2025-02-03 21:28 3161
    ImSpan<ImGuiTableCellData>  RowCellData;                // Point within RawData[]. Store cells background requests for current row.
1193b4be Poul Sander 2025-02-03 21:28 3162
    ImBitArrayPtr               EnabledMaskByDisplayOrder;  // Column DisplayOrder -> IsEnabled map
1193b4be Poul Sander 2025-02-03 21:28 3163
    ImBitArrayPtr               EnabledMaskByIndex;         // Column Index -> IsEnabled map (== not hidden by user/api) in a format adequate for iterating column without touching cold data
1193b4be Poul Sander 2025-02-03 21:28 3164
    ImBitArrayPtr               VisibleMaskByIndex;         // Column Index -> IsVisibleX|IsVisibleY map (== not hidden by user/api && not hidden by scrolling/cliprect)
1193b4be Poul Sander 2025-02-03 21:28 3165
    ImGuiTableFlags             SettingsLoadedFlags;        // Which data were loaded from the .ini file (e.g. when order is not altered we won't save order)
1193b4be Poul Sander 2025-02-03 21:28 3166
    int                         SettingsOffset;             // Offset in g.SettingsTables
1193b4be Poul Sander 2025-02-03 21:28 3167
    int                         LastFrameActive;
1193b4be Poul Sander 2025-02-03 21:28 3168
    int                         ColumnsCount;               // Number of columns declared in BeginTable()
1193b4be Poul Sander 2025-02-03 21:28 3169
    int                         CurrentRow;
1193b4be Poul Sander 2025-02-03 21:28 3170
    int                         CurrentColumn;
4e9e2555 Poul Sander 2025-10-05 10:15 3171
    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 tables with the same ID are multiple tables, they are just synced.
1193b4be Poul Sander 2025-02-03 21:28 3172
    ImS16                       InstanceInteracted;         // Mark which instance (generally 0) of the same ID is being interacted with
1193b4be Poul Sander 2025-02-03 21:28 3173
    float                       RowPosY1;
1193b4be Poul Sander 2025-02-03 21:28 3174
    float                       RowPosY2;
1193b4be Poul Sander 2025-02-03 21:28 3175
    float                       RowMinHeight;               // Height submitted to TableNextRow()
1193b4be Poul Sander 2025-02-03 21:28 3176
    float                       RowCellPaddingY;            // Top and bottom padding. Reloaded during row change.
1193b4be Poul Sander 2025-02-03 21:28 3177
    float                       RowTextBaseline;
1193b4be Poul Sander 2025-02-03 21:28 3178
    float                       RowIndentOffsetX;
1193b4be Poul Sander 2025-02-03 21:28 3179
    ImGuiTableRowFlags          RowFlags : 16;              // Current row flags, see ImGuiTableRowFlags_
1193b4be Poul Sander 2025-02-03 21:28 3180
    ImGuiTableRowFlags          LastRowFlags : 16;
1193b4be Poul Sander 2025-02-03 21:28 3181
    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.
1193b4be Poul Sander 2025-02-03 21:28 3182
    ImU32                       RowBgColor[2];              // Background color override for current row.
1193b4be Poul Sander 2025-02-03 21:28 3183
    ImU32                       BorderColorStrong;
1193b4be Poul Sander 2025-02-03 21:28 3184
    ImU32                       BorderColorLight;
1193b4be Poul Sander 2025-02-03 21:28 3185
    float                       BorderX1;
1193b4be Poul Sander 2025-02-03 21:28 3186
    float                       BorderX2;
1193b4be Poul Sander 2025-02-03 21:28 3187
    float                       HostIndentX;
1193b4be Poul Sander 2025-02-03 21:28 3188
    float                       MinColumnWidth;
1193b4be Poul Sander 2025-02-03 21:28 3189
    float                       OuterPaddingX;
1193b4be Poul Sander 2025-02-03 21:28 3190
    float                       CellPaddingX;               // Padding from each borders. Locked in BeginTable()/Layout.
1193b4be Poul Sander 2025-02-03 21:28 3191
    float                       CellSpacingX1;              // Spacing between non-bordered cells. Locked in BeginTable()/Layout.
1193b4be Poul Sander 2025-02-03 21:28 3192
    float                       CellSpacingX2;
1193b4be Poul Sander 2025-02-03 21:28 3193
    float                       InnerWidth;                 // User value passed to BeginTable(), see comments at the top of BeginTable() for details.
1193b4be Poul Sander 2025-02-03 21:28 3194
    float                       ColumnsGivenWidth;          // Sum of current column width
1193b4be Poul Sander 2025-02-03 21:28 3195
    float                       ColumnsAutoFitWidth;        // Sum of ideal column width in order nothing to be clipped, used for auto-fitting and content width submission in outer window
1193b4be Poul Sander 2025-02-03 21:28 3196
    float                       ColumnsStretchSumWeights;   // Sum of weight of all enabled stretching columns
1193b4be Poul Sander 2025-02-03 21:28 3197
    float                       ResizedColumnNextWidth;
1193b4be Poul Sander 2025-02-03 21:28 3198
    float                       ResizeLockMinContentsX2;    // Lock minimum contents width while resizing down in order to not create feedback loops. But we allow growing the table.
1193b4be Poul Sander 2025-02-03 21:28 3199
    float                       RefScale;                   // Reference scale to be able to rescale columns on font/dpi changes.
1193b4be Poul Sander 2025-02-03 21:28 3200
    float                       AngledHeadersHeight;        // Set by TableAngledHeadersRow(), used in TableUpdateLayout()
1193b4be Poul Sander 2025-02-03 21:28 3201
    float                       AngledHeadersSlope;         // Set by TableAngledHeadersRow(), used in TableUpdateLayout()
1193b4be Poul Sander 2025-02-03 21:28 3202
    ImRect                      OuterRect;                  // Note: for non-scrolling table, OuterRect.Max.y is often FLT_MAX until EndTable(), unless a height has been specified in BeginTable().
4e9e2555 Poul Sander 2025-10-05 10:15 3203
    ImRect                      InnerRect;                  // InnerRect but without decoration. As with OuterRect, for non-scrolling tables, InnerRect.Max.y is "
1193b4be Poul Sander 2025-02-03 21:28 3204
    ImRect                      WorkRect;
1193b4be Poul Sander 2025-02-03 21:28 3205
    ImRect                      InnerClipRect;
1193b4be Poul Sander 2025-02-03 21:28 3206
    ImRect                      BgClipRect;                 // We use this to cpu-clip cell background color fill, evolve during the frame as we cross frozen rows boundaries
1193b4be Poul Sander 2025-02-03 21:28 3207
    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
1193b4be Poul Sander 2025-02-03 21:28 3208
    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.
1193b4be Poul Sander 2025-02-03 21:28 3209
    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.
1193b4be Poul Sander 2025-02-03 21:28 3210
    ImRect                      HostBackupInnerClipRect;    // Backup of InnerWindow->ClipRect during PushTableBackground()/PopTableBackground()
1193b4be Poul Sander 2025-02-03 21:28 3211
    ImGuiWindow*                OuterWindow;                // Parent window for the table
1193b4be Poul Sander 2025-02-03 21:28 3212
    ImGuiWindow*                InnerWindow;                // Window holding the table data (== OuterWindow or a child window)
1193b4be Poul Sander 2025-02-03 21:28 3213
    ImGuiTextBuffer             ColumnsNames;               // Contiguous buffer holding columns names
1193b4be Poul Sander 2025-02-03 21:28 3214
    ImDrawListSplitter*         DrawSplitter;               // Shortcut to TempData->DrawSplitter while in table. Isolate draw commands per columns to avoid switching clip rect constantly
1193b4be Poul Sander 2025-02-03 21:28 3215
    ImGuiTableInstanceData      InstanceDataFirst;
1193b4be Poul Sander 2025-02-03 21:28 3216
    ImVector<ImGuiTableInstanceData>    InstanceDataExtra;  // FIXME-OPT: Using a small-vector pattern would be good.
1193b4be Poul Sander 2025-02-03 21:28 3217
    ImGuiTableColumnSortSpecs   SortSpecsSingle;
1193b4be Poul Sander 2025-02-03 21:28 3218
    ImVector<ImGuiTableColumnSortSpecs> SortSpecsMulti;     // FIXME-OPT: Using a small-vector pattern would be good.
1193b4be Poul Sander 2025-02-03 21:28 3219
    ImGuiTableSortSpecs         SortSpecs;                  // Public facing sorts specs, this is what we return in TableGetSortSpecs()
1193b4be Poul Sander 2025-02-03 21:28 3220
    ImGuiTableColumnIdx         SortSpecsCount;
1193b4be Poul Sander 2025-02-03 21:28 3221
    ImGuiTableColumnIdx         ColumnsEnabledCount;        // Number of enabled columns (<= ColumnsCount)
1193b4be Poul Sander 2025-02-03 21:28 3222
    ImGuiTableColumnIdx         ColumnsEnabledFixedCount;   // Number of enabled columns using fixed width (<= ColumnsCount)
1193b4be Poul Sander 2025-02-03 21:28 3223
    ImGuiTableColumnIdx         DeclColumnsCount;           // Count calls to TableSetupColumn()
1193b4be Poul Sander 2025-02-03 21:28 3224
    ImGuiTableColumnIdx         AngledHeadersCount;         // Count columns with angled headers
1193b4be Poul Sander 2025-02-03 21:28 3225
    ImGuiTableColumnIdx         HoveredColumnBody;          // Index of column whose visible region is being hovered. Important: == ColumnsCount when hovering empty region after the right-most column!
1193b4be Poul Sander 2025-02-03 21:28 3226
    ImGuiTableColumnIdx         HoveredColumnBorder;        // Index of column whose right-border is being hovered (for resizing).
1193b4be Poul Sander 2025-02-03 21:28 3227
    ImGuiTableColumnIdx         HighlightColumnHeader;      // Index of column which should be highlighted.
1193b4be Poul Sander 2025-02-03 21:28 3228
    ImGuiTableColumnIdx         AutoFitSingleColumn;        // Index of single column requesting auto-fit.
1193b4be Poul Sander 2025-02-03 21:28 3229
    ImGuiTableColumnIdx         ResizedColumn;              // Index of column being resized. Reset when InstanceCurrent==0.
1193b4be Poul Sander 2025-02-03 21:28 3230
    ImGuiTableColumnIdx         LastResizedColumn;          // Index of column being resized from previous frame.
1193b4be Poul Sander 2025-02-03 21:28 3231
    ImGuiTableColumnIdx         HeldHeaderColumn;           // Index of column header being held.
1193b4be Poul Sander 2025-02-03 21:28 3232
    ImGuiTableColumnIdx         ReorderColumn;              // Index of column being reordered. (not cleared)
1193b4be Poul Sander 2025-02-03 21:28 3233
    ImGuiTableColumnIdx         ReorderColumnDir;           // -1 or +1
1193b4be Poul Sander 2025-02-03 21:28 3234
    ImGuiTableColumnIdx         LeftMostEnabledColumn;      // Index of left-most non-hidden column.
1193b4be Poul Sander 2025-02-03 21:28 3235
    ImGuiTableColumnIdx         RightMostEnabledColumn;     // Index of right-most non-hidden column.
1193b4be Poul Sander 2025-02-03 21:28 3236
    ImGuiTableColumnIdx         LeftMostStretchedColumn;    // Index of left-most stretched column.
1193b4be Poul Sander 2025-02-03 21:28 3237
    ImGuiTableColumnIdx         RightMostStretchedColumn;   // Index of right-most stretched column.
1193b4be Poul Sander 2025-02-03 21:28 3238
    ImGuiTableColumnIdx         ContextPopupColumn;         // Column right-clicked on, of -1 if opening context menu from a neutral/empty spot
1193b4be Poul Sander 2025-02-03 21:28 3239
    ImGuiTableColumnIdx         FreezeRowsRequest;          // Requested frozen rows count
1193b4be Poul Sander 2025-02-03 21:28 3240
    ImGuiTableColumnIdx         FreezeRowsCount;            // Actual frozen row count (== FreezeRowsRequest, or == 0 when no scrolling offset)
1193b4be Poul Sander 2025-02-03 21:28 3241
    ImGuiTableColumnIdx         FreezeColumnsRequest;       // Requested frozen columns count
1193b4be Poul Sander 2025-02-03 21:28 3242
    ImGuiTableColumnIdx         FreezeColumnsCount;         // Actual frozen columns count (== FreezeColumnsRequest, or == 0 when no scrolling offset)
1193b4be Poul Sander 2025-02-03 21:28 3243
    ImGuiTableColumnIdx         RowCellDataCurrent;         // Index of current RowCellData[] entry in current row
1193b4be Poul Sander 2025-02-03 21:28 3244
    ImGuiTableDrawChannelIdx    DummyDrawChannel;           // Redirect non-visible columns here.
1193b4be Poul Sander 2025-02-03 21:28 3245
    ImGuiTableDrawChannelIdx    Bg2DrawChannelCurrent;      // For Selectable() and other widgets drawing across columns after the freezing line. Index within DrawSplitter.Channels[]
1193b4be Poul Sander 2025-02-03 21:28 3246
    ImGuiTableDrawChannelIdx    Bg2DrawChannelUnfrozen;
4e9e2555 Poul Sander 2025-10-05 10:15 3247
    ImS8                        NavLayer;                   // ImGuiNavLayer at the time of BeginTable().
1193b4be Poul Sander 2025-02-03 21:28 3248
    bool                        IsLayoutLocked;             // Set by TableUpdateLayout() which is called when beginning the first row.
1193b4be Poul Sander 2025-02-03 21:28 3249
    bool                        IsInsideRow;                // Set when inside TableBeginRow()/TableEndRow().
1193b4be Poul Sander 2025-02-03 21:28 3250
    bool                        IsInitializing;
1193b4be Poul Sander 2025-02-03 21:28 3251
    bool                        IsSortSpecsDirty;
1193b4be Poul Sander 2025-02-03 21:28 3252
    bool                        IsUsingHeaders;             // Set when the first row had the ImGuiTableRowFlags_Headers flag.
1193b4be Poul Sander 2025-02-03 21:28 3253
    bool                        IsContextPopupOpen;         // Set when default context menu is open (also see: ContextPopupColumn, InstanceInteracted).
4e9e2555 Poul Sander 2025-10-05 10:15 3254
    bool                        DisableDefaultContextMenu;  // Disable default context menu. You may submit your own using TableBeginContextMenuPopup()/EndPopup()
1193b4be Poul Sander 2025-02-03 21:28 3255
    bool                        IsSettingsRequestLoad;
1193b4be Poul Sander 2025-02-03 21:28 3256
    bool                        IsSettingsDirty;            // Set when table settings have changed and needs to be reported into ImGuiTableSetttings data.
1193b4be Poul Sander 2025-02-03 21:28 3257
    bool                        IsDefaultDisplayOrder;      // Set when display order is unchanged from default (DisplayOrder contains 0...Count-1)
1193b4be Poul Sander 2025-02-03 21:28 3258
    bool                        IsResetAllRequest;
1193b4be Poul Sander 2025-02-03 21:28 3259
    bool                        IsResetDisplayOrderRequest;
1193b4be Poul Sander 2025-02-03 21:28 3260
    bool                        IsUnfrozenRows;             // Set when we got past the frozen row.
1193b4be Poul Sander 2025-02-03 21:28 3261
    bool                        IsDefaultSizingPolicy;      // Set if user didn't explicitly set a sizing policy in BeginTable()
1193b4be Poul Sander 2025-02-03 21:28 3262
    bool                        IsActiveIdAliveBeforeTable;
1193b4be Poul Sander 2025-02-03 21:28 3263
    bool                        IsActiveIdInTable;
1193b4be Poul Sander 2025-02-03 21:28 3264
    bool                        HasScrollbarYCurr;          // Whether ANY instance of this table had a vertical scrollbar during the current frame.
1193b4be Poul Sander 2025-02-03 21:28 3265
    bool                        HasScrollbarYPrev;          // Whether ANY instance of this table had a vertical scrollbar during the previous.
1193b4be Poul Sander 2025-02-03 21:28 3266
    bool                        MemoryCompacted;
1193b4be Poul Sander 2025-02-03 21:28 3267
    bool                        HostSkipItems;              // Backup of InnerWindow->SkipItem at the end of BeginTable(), because we will overwrite InnerWindow->SkipItem on a per-column basis
1193b4be Poul Sander 2025-02-03 21:28 3268
1193b4be Poul Sander 2025-02-03 21:28 3269
    ImGuiTable()                { memset(this, 0, sizeof(*this)); LastFrameActive = -1; }
1193b4be Poul Sander 2025-02-03 21:28 3270
    ~ImGuiTable()               { IM_FREE(RawData); }
1193b4be Poul Sander 2025-02-03 21:28 3271
};
1193b4be Poul Sander 2025-02-03 21:28 3272
1193b4be Poul Sander 2025-02-03 21:28 3273
// Transient data that are only needed between BeginTable() and EndTable(), those buffers are shared (1 per level of stacked table).
1193b4be Poul Sander 2025-02-03 21:28 3274
// - Accessing those requires chasing an extra pointer so for very frequently used data we leave them in the main table structure.
1193b4be Poul Sander 2025-02-03 21:28 3275
// - We also leave out of this structure data that tend to be particularly useful for debugging/metrics.
1193b4be Poul Sander 2025-02-03 21:28 3276
// FIXME-TABLE: more transient data could be stored in a stacked ImGuiTableTempData: e.g. SortSpecs.
1193b4be Poul Sander 2025-02-03 21:28 3277
// sizeof() ~ 136 bytes.
1193b4be Poul Sander 2025-02-03 21:28 3278
struct IMGUI_API ImGuiTableTempData
1193b4be Poul Sander 2025-02-03 21:28 3279
{
1193b4be Poul Sander 2025-02-03 21:28 3280
    int                         TableIndex;                 // Index in g.Tables.Buf[] pool
1193b4be Poul Sander 2025-02-03 21:28 3281
    float                       LastTimeActive;             // Last timestamp this structure was used
1193b4be Poul Sander 2025-02-03 21:28 3282
    float                       AngledHeadersExtraWidth;    // Used in EndTable()
1193b4be Poul Sander 2025-02-03 21:28 3283
    ImVector<ImGuiTableHeaderData> AngledHeadersRequests;   // Used in TableAngledHeadersRow()
1193b4be Poul Sander 2025-02-03 21:28 3284
1193b4be Poul Sander 2025-02-03 21:28 3285
    ImVec2                      UserOuterSize;              // outer_size.x passed to BeginTable()
1193b4be Poul Sander 2025-02-03 21:28 3286
    ImDrawListSplitter          DrawSplitter;
1193b4be Poul Sander 2025-02-03 21:28 3287
1193b4be Poul Sander 2025-02-03 21:28 3288
    ImRect                      HostBackupWorkRect;         // Backup of InnerWindow->WorkRect at the end of BeginTable()
1193b4be Poul Sander 2025-02-03 21:28 3289
    ImRect                      HostBackupParentWorkRect;   // Backup of InnerWindow->ParentWorkRect at the end of BeginTable()
1193b4be Poul Sander 2025-02-03 21:28 3290
    ImVec2                      HostBackupPrevLineSize;     // Backup of InnerWindow->DC.PrevLineSize at the end of BeginTable()
1193b4be Poul Sander 2025-02-03 21:28 3291
    ImVec2                      HostBackupCurrLineSize;     // Backup of InnerWindow->DC.CurrLineSize at the end of BeginTable()
1193b4be Poul Sander 2025-02-03 21:28 3292
    ImVec2                      HostBackupCursorMaxPos;     // Backup of InnerWindow->DC.CursorMaxPos at the end of BeginTable()
1193b4be Poul Sander 2025-02-03 21:28 3293
    ImVec1                      HostBackupColumnsOffset;    // Backup of OuterWindow->DC.ColumnsOffset at the end of BeginTable()
1193b4be Poul Sander 2025-02-03 21:28 3294
    float                       HostBackupItemWidth;        // Backup of OuterWindow->DC.ItemWidth at the end of BeginTable()
1193b4be Poul Sander 2025-02-03 21:28 3295
    int                         HostBackupItemWidthStackSize;//Backup of OuterWindow->DC.ItemWidthStack.Size at the end of BeginTable()
1193b4be Poul Sander 2025-02-03 21:28 3296
1193b4be Poul Sander 2025-02-03 21:28 3297
    ImGuiTableTempData()        { memset(this, 0, sizeof(*this)); LastTimeActive = -1.0f; }
1193b4be Poul Sander 2025-02-03 21:28 3298
};
1193b4be Poul Sander 2025-02-03 21:28 3299
4e9e2555 Poul Sander 2025-10-05 10:15 3300
// sizeof() ~ 16
1193b4be Poul Sander 2025-02-03 21:28 3301
struct ImGuiTableColumnSettings
1193b4be Poul Sander 2025-02-03 21:28 3302
{
1193b4be Poul Sander 2025-02-03 21:28 3303
    float                   WidthOrWeight;
1193b4be Poul Sander 2025-02-03 21:28 3304
    ImGuiID                 UserID;
1193b4be Poul Sander 2025-02-03 21:28 3305
    ImGuiTableColumnIdx     Index;
1193b4be Poul Sander 2025-02-03 21:28 3306
    ImGuiTableColumnIdx     DisplayOrder;
1193b4be Poul Sander 2025-02-03 21:28 3307
    ImGuiTableColumnIdx     SortOrder;
1193b4be Poul Sander 2025-02-03 21:28 3308
    ImU8                    SortDirection : 2;
4e9e2555 Poul Sander 2025-10-05 10:15 3309
    ImS8                    IsEnabled : 2; // "Visible" in ini file
1193b4be Poul Sander 2025-02-03 21:28 3310
    ImU8                    IsStretch : 1;
1193b4be Poul Sander 2025-02-03 21:28 3311
1193b4be Poul Sander 2025-02-03 21:28 3312
    ImGuiTableColumnSettings()
1193b4be Poul Sander 2025-02-03 21:28 3313
    {
1193b4be Poul Sander 2025-02-03 21:28 3314
        WidthOrWeight = 0.0f;
1193b4be Poul Sander 2025-02-03 21:28 3315
        UserID = 0;
1193b4be Poul Sander 2025-02-03 21:28 3316
        Index = -1;
1193b4be Poul Sander 2025-02-03 21:28 3317
        DisplayOrder = SortOrder = -1;
1193b4be Poul Sander 2025-02-03 21:28 3318
        SortDirection = ImGuiSortDirection_None;
4e9e2555 Poul Sander 2025-10-05 10:15 3319
        IsEnabled = -1;
1193b4be Poul Sander 2025-02-03 21:28 3320
        IsStretch = 0;
1193b4be Poul Sander 2025-02-03 21:28 3321
    }
1193b4be Poul Sander 2025-02-03 21:28 3322
};
1193b4be Poul Sander 2025-02-03 21:28 3323
1193b4be Poul Sander 2025-02-03 21:28 3324
// This is designed to be stored in a single ImChunkStream (1 header followed by N ImGuiTableColumnSettings, etc.)
1193b4be Poul Sander 2025-02-03 21:28 3325
struct ImGuiTableSettings
1193b4be Poul Sander 2025-02-03 21:28 3326
{
1193b4be Poul Sander 2025-02-03 21:28 3327
    ImGuiID                     ID;                     // Set to 0 to invalidate/delete the setting
1193b4be Poul Sander 2025-02-03 21:28 3328
    ImGuiTableFlags             SaveFlags;              // Indicate data we want to save using the Resizable/Reorderable/Sortable/Hideable flags (could be using its own flags..)
1193b4be Poul Sander 2025-02-03 21:28 3329
    float                       RefScale;               // Reference scale to be able to rescale columns on font/dpi changes.
1193b4be Poul Sander 2025-02-03 21:28 3330
    ImGuiTableColumnIdx         ColumnsCount;
1193b4be Poul Sander 2025-02-03 21:28 3331
    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
1193b4be Poul Sander 2025-02-03 21:28 3332
    bool                        WantApply;              // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context)
1193b4be Poul Sander 2025-02-03 21:28 3333
1193b4be Poul Sander 2025-02-03 21:28 3334
    ImGuiTableSettings()        { memset(this, 0, sizeof(*this)); }
1193b4be Poul Sander 2025-02-03 21:28 3335
    ImGuiTableColumnSettings*   GetColumnSettings()     { return (ImGuiTableColumnSettings*)(this + 1); }
1193b4be Poul Sander 2025-02-03 21:28 3336
};
1193b4be Poul Sander 2025-02-03 21:28 3337
1193b4be Poul Sander 2025-02-03 21:28 3338
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 3339
// [SECTION] ImGui internal API
1193b4be Poul Sander 2025-02-03 21:28 3340
// No guarantee of forward compatibility here!
1193b4be Poul Sander 2025-02-03 21:28 3341
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 3342
1193b4be Poul Sander 2025-02-03 21:28 3343
namespace ImGui
1193b4be Poul Sander 2025-02-03 21:28 3344
{
1193b4be Poul Sander 2025-02-03 21:28 3345
    // Windows
1193b4be Poul Sander 2025-02-03 21:28 3346
    // We should always have a CurrentWindow in the stack (there is an implicit "Debug" window)
1193b4be Poul Sander 2025-02-03 21:28 3347
    // If this ever crashes because g.CurrentWindow is NULL, it means that either:
1193b4be Poul Sander 2025-02-03 21:28 3348
    // - ImGui::NewFrame() has never been called, which is illegal.
1193b4be Poul Sander 2025-02-03 21:28 3349
    // - You are calling ImGui functions after ImGui::EndFrame()/ImGui::Render() and before the next ImGui::NewFrame(), which is also illegal.
4e9e2555 Poul Sander 2025-10-05 10:15 3350
    IMGUI_API ImGuiIO&         GetIO(ImGuiContext* ctx);
4e9e2555 Poul Sander 2025-10-05 10:15 3351
    IMGUI_API ImGuiPlatformIO& GetPlatformIO(ImGuiContext* ctx);
1193b4be Poul Sander 2025-02-03 21:28 3352
    inline    ImGuiWindow*  GetCurrentWindowRead()      { ImGuiContext& g = *GImGui; return g.CurrentWindow; }
1193b4be Poul Sander 2025-02-03 21:28 3353
    inline    ImGuiWindow*  GetCurrentWindow()          { ImGuiContext& g = *GImGui; g.CurrentWindow->WriteAccessed = true; return g.CurrentWindow; }
1193b4be Poul Sander 2025-02-03 21:28 3354
    IMGUI_API ImGuiWindow*  FindWindowByID(ImGuiID id);
1193b4be Poul Sander 2025-02-03 21:28 3355
    IMGUI_API ImGuiWindow*  FindWindowByName(const char* name);
1193b4be Poul Sander 2025-02-03 21:28 3356
    IMGUI_API void          UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags flags, ImGuiWindow* parent_window);
1193b4be Poul Sander 2025-02-03 21:28 3357
    IMGUI_API void          UpdateWindowSkipRefresh(ImGuiWindow* window);
1193b4be Poul Sander 2025-02-03 21:28 3358
    IMGUI_API ImVec2        CalcWindowNextAutoFitSize(ImGuiWindow* window);
1193b4be Poul Sander 2025-02-03 21:28 3359
    IMGUI_API bool          IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent, bool popup_hierarchy, bool dock_hierarchy);
1193b4be Poul Sander 2025-02-03 21:28 3360
    IMGUI_API bool          IsWindowWithinBeginStackOf(ImGuiWindow* window, ImGuiWindow* potential_parent);
1193b4be Poul Sander 2025-02-03 21:28 3361
    IMGUI_API bool          IsWindowAbove(ImGuiWindow* potential_above, ImGuiWindow* potential_below);
1193b4be Poul Sander 2025-02-03 21:28 3362
    IMGUI_API bool          IsWindowNavFocusable(ImGuiWindow* window);
1193b4be Poul Sander 2025-02-03 21:28 3363
    IMGUI_API void          SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond = 0);
1193b4be Poul Sander 2025-02-03 21:28 3364
    IMGUI_API void          SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond cond = 0);
1193b4be Poul Sander 2025-02-03 21:28 3365
    IMGUI_API void          SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiCond cond = 0);
1193b4be Poul Sander 2025-02-03 21:28 3366
    IMGUI_API void          SetWindowHitTestHole(ImGuiWindow* window, const ImVec2& pos, const ImVec2& size);
1193b4be Poul Sander 2025-02-03 21:28 3367
    IMGUI_API void          SetWindowHiddenAndSkipItemsForCurrentFrame(ImGuiWindow* window);
1193b4be Poul Sander 2025-02-03 21:28 3368
    inline void             SetWindowParentWindowForFocusRoute(ImGuiWindow* window, ImGuiWindow* parent_window) { window->ParentWindowForFocusRoute = parent_window; } // You may also use SetNextWindowClass()'s FocusRouteParentWindowId field.
1193b4be Poul Sander 2025-02-03 21:28 3369
    inline ImRect           WindowRectAbsToRel(ImGuiWindow* window, const ImRect& r) { ImVec2 off = window->DC.CursorStartPos; return ImRect(r.Min.x - off.x, r.Min.y - off.y, r.Max.x - off.x, r.Max.y - off.y); }
1193b4be Poul Sander 2025-02-03 21:28 3370
    inline ImRect           WindowRectRelToAbs(ImGuiWindow* window, const ImRect& r) { ImVec2 off = window->DC.CursorStartPos; return ImRect(r.Min.x + off.x, r.Min.y + off.y, r.Max.x + off.x, r.Max.y + off.y); }
1193b4be Poul Sander 2025-02-03 21:28 3371
    inline ImVec2           WindowPosAbsToRel(ImGuiWindow* window, const ImVec2& p)  { ImVec2 off = window->DC.CursorStartPos; return ImVec2(p.x - off.x, p.y - off.y); }
1193b4be Poul Sander 2025-02-03 21:28 3372
    inline ImVec2           WindowPosRelToAbs(ImGuiWindow* window, const ImVec2& p)  { ImVec2 off = window->DC.CursorStartPos; return ImVec2(p.x + off.x, p.y + off.y); }
1193b4be Poul Sander 2025-02-03 21:28 3373
1193b4be Poul Sander 2025-02-03 21:28 3374
    // Windows: Display Order and Focus Order
1193b4be Poul Sander 2025-02-03 21:28 3375
    IMGUI_API void          FocusWindow(ImGuiWindow* window, ImGuiFocusRequestFlags flags = 0);
1193b4be Poul Sander 2025-02-03 21:28 3376
    IMGUI_API void          FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWindow* ignore_window, ImGuiViewport* filter_viewport, ImGuiFocusRequestFlags flags);
1193b4be Poul Sander 2025-02-03 21:28 3377
    IMGUI_API void          BringWindowToFocusFront(ImGuiWindow* window);
1193b4be Poul Sander 2025-02-03 21:28 3378
    IMGUI_API void          BringWindowToDisplayFront(ImGuiWindow* window);
1193b4be Poul Sander 2025-02-03 21:28 3379
    IMGUI_API void          BringWindowToDisplayBack(ImGuiWindow* window);
1193b4be Poul Sander 2025-02-03 21:28 3380
    IMGUI_API void          BringWindowToDisplayBehind(ImGuiWindow* window, ImGuiWindow* above_window);
1193b4be Poul Sander 2025-02-03 21:28 3381
    IMGUI_API int           FindWindowDisplayIndex(ImGuiWindow* window);
1193b4be Poul Sander 2025-02-03 21:28 3382
    IMGUI_API ImGuiWindow*  FindBottomMostVisibleWindowWithinBeginStack(ImGuiWindow* window);
1193b4be Poul Sander 2025-02-03 21:28 3383
1193b4be Poul Sander 2025-02-03 21:28 3384
    // Windows: Idle, Refresh Policies [EXPERIMENTAL]
1193b4be Poul Sander 2025-02-03 21:28 3385
    IMGUI_API void          SetNextWindowRefreshPolicy(ImGuiWindowRefreshFlags flags);
1193b4be Poul Sander 2025-02-03 21:28 3386
1193b4be Poul Sander 2025-02-03 21:28 3387
    // Fonts, drawing
4e9e2555 Poul Sander 2025-10-05 10:15 3388
    IMGUI_API void          RegisterUserTexture(ImTextureData* tex); // Register external texture. EXPERIMENTAL: DO NOT USE YET.
4e9e2555 Poul Sander 2025-10-05 10:15 3389
    IMGUI_API void          UnregisterUserTexture(ImTextureData* tex);
4e9e2555 Poul Sander 2025-10-05 10:15 3390
    IMGUI_API void          RegisterFontAtlas(ImFontAtlas* atlas);
4e9e2555 Poul Sander 2025-10-05 10:15 3391
    IMGUI_API void          UnregisterFontAtlas(ImFontAtlas* atlas);
4e9e2555 Poul Sander 2025-10-05 10:15 3392
    IMGUI_API void          SetCurrentFont(ImFont* font, float font_size_before_scaling, float font_size_after_scaling);
4e9e2555 Poul Sander 2025-10-05 10:15 3393
    IMGUI_API void          UpdateCurrentFontSize(float restore_font_size_after_scaling);
4e9e2555 Poul Sander 2025-10-05 10:15 3394
    IMGUI_API void          SetFontRasterizerDensity(float rasterizer_density);
4e9e2555 Poul Sander 2025-10-05 10:15 3395
    inline float            GetFontRasterizerDensity() { return GImGui->FontRasterizerDensity; }
4e9e2555 Poul Sander 2025-10-05 10:15 3396
    inline float            GetRoundedFontSize(float size) { return IM_ROUND(size); }
4e9e2555 Poul Sander 2025-10-05 10:15 3397
    IMGUI_API ImFont*       GetDefaultFont();
4e9e2555 Poul Sander 2025-10-05 10:15 3398
    IMGUI_API void          PushPasswordFont();
4e9e2555 Poul Sander 2025-10-05 10:15 3399
    IMGUI_API void          PopPasswordFont();
1193b4be Poul Sander 2025-02-03 21:28 3400
    inline ImDrawList*      GetForegroundDrawList(ImGuiWindow* window) { return GetForegroundDrawList(window->Viewport); }
1193b4be Poul Sander 2025-02-03 21:28 3401
    IMGUI_API void          AddDrawListToDrawDataEx(ImDrawData* draw_data, ImVector<ImDrawList*>* out_list, ImDrawList* draw_list);
1193b4be Poul Sander 2025-02-03 21:28 3402
1193b4be Poul Sander 2025-02-03 21:28 3403
    // Init
1193b4be Poul Sander 2025-02-03 21:28 3404
    IMGUI_API void          Initialize();
1193b4be Poul Sander 2025-02-03 21:28 3405
    IMGUI_API void          Shutdown();    // Since 1.60 this is a _private_ function. You can call DestroyContext() to destroy the context created by CreateContext().
1193b4be Poul Sander 2025-02-03 21:28 3406
1193b4be Poul Sander 2025-02-03 21:28 3407
    // NewFrame
1193b4be Poul Sander 2025-02-03 21:28 3408
    IMGUI_API void          UpdateInputEvents(bool trickle_fast_inputs);
4e9e2555 Poul Sander 2025-10-05 10:15 3409
    IMGUI_API void          UpdateHoveredWindowAndCaptureFlags(const ImVec2& mouse_pos);
1193b4be Poul Sander 2025-02-03 21:28 3410
    IMGUI_API void          FindHoveredWindowEx(const ImVec2& pos, bool find_first_and_in_any_viewport, ImGuiWindow** out_hovered_window, ImGuiWindow** out_hovered_window_under_moving_window);
1193b4be Poul Sander 2025-02-03 21:28 3411
    IMGUI_API void          StartMouseMovingWindow(ImGuiWindow* window);
1193b4be Poul Sander 2025-02-03 21:28 3412
    IMGUI_API void          StartMouseMovingWindowOrNode(ImGuiWindow* window, ImGuiDockNode* node, bool undock);
4e9e2555 Poul Sander 2025-10-05 10:15 3413
    IMGUI_API void          StopMouseMovingWindow();
1193b4be Poul Sander 2025-02-03 21:28 3414
    IMGUI_API void          UpdateMouseMovingWindowNewFrame();
1193b4be Poul Sander 2025-02-03 21:28 3415
    IMGUI_API void          UpdateMouseMovingWindowEndFrame();
1193b4be Poul Sander 2025-02-03 21:28 3416
1193b4be Poul Sander 2025-02-03 21:28 3417
    // Generic context hooks
1193b4be Poul Sander 2025-02-03 21:28 3418
    IMGUI_API ImGuiID       AddContextHook(ImGuiContext* context, const ImGuiContextHook* hook);
1193b4be Poul Sander 2025-02-03 21:28 3419
    IMGUI_API void          RemoveContextHook(ImGuiContext* context, ImGuiID hook_to_remove);
1193b4be Poul Sander 2025-02-03 21:28 3420
    IMGUI_API void          CallContextHooks(ImGuiContext* context, ImGuiContextHookType type);
1193b4be Poul Sander 2025-02-03 21:28 3421
1193b4be Poul Sander 2025-02-03 21:28 3422
    // Viewports
1193b4be Poul Sander 2025-02-03 21:28 3423
    IMGUI_API void          TranslateWindowsInViewport(ImGuiViewportP* viewport, const ImVec2& old_pos, const ImVec2& new_pos, const ImVec2& old_size, const ImVec2& new_size);
1193b4be Poul Sander 2025-02-03 21:28 3424
    IMGUI_API void          ScaleWindowsInViewport(ImGuiViewportP* viewport, float scale);
1193b4be Poul Sander 2025-02-03 21:28 3425
    IMGUI_API void          DestroyPlatformWindow(ImGuiViewportP* viewport);
1193b4be Poul Sander 2025-02-03 21:28 3426
    IMGUI_API void          SetWindowViewport(ImGuiWindow* window, ImGuiViewportP* viewport);
1193b4be Poul Sander 2025-02-03 21:28 3427
    IMGUI_API void          SetCurrentViewport(ImGuiWindow* window, ImGuiViewportP* viewport);
1193b4be Poul Sander 2025-02-03 21:28 3428
    IMGUI_API const ImGuiPlatformMonitor*   GetViewportPlatformMonitor(ImGuiViewport* viewport);
1193b4be Poul Sander 2025-02-03 21:28 3429
    IMGUI_API ImGuiViewportP*               FindHoveredViewportFromPlatformWindowStack(const ImVec2& mouse_platform_pos);
1193b4be Poul Sander 2025-02-03 21:28 3430
1193b4be Poul Sander 2025-02-03 21:28 3431
    // Settings
1193b4be Poul Sander 2025-02-03 21:28 3432
    IMGUI_API void                  MarkIniSettingsDirty();
1193b4be Poul Sander 2025-02-03 21:28 3433
    IMGUI_API void                  MarkIniSettingsDirty(ImGuiWindow* window);
1193b4be Poul Sander 2025-02-03 21:28 3434
    IMGUI_API void                  ClearIniSettings();
1193b4be Poul Sander 2025-02-03 21:28 3435
    IMGUI_API void                  AddSettingsHandler(const ImGuiSettingsHandler* handler);
1193b4be Poul Sander 2025-02-03 21:28 3436
    IMGUI_API void                  RemoveSettingsHandler(const char* type_name);
1193b4be Poul Sander 2025-02-03 21:28 3437
    IMGUI_API ImGuiSettingsHandler* FindSettingsHandler(const char* type_name);
1193b4be Poul Sander 2025-02-03 21:28 3438
1193b4be Poul Sander 2025-02-03 21:28 3439
    // Settings - Windows
1193b4be Poul Sander 2025-02-03 21:28 3440
    IMGUI_API ImGuiWindowSettings*  CreateNewWindowSettings(const char* name);
1193b4be Poul Sander 2025-02-03 21:28 3441
    IMGUI_API ImGuiWindowSettings*  FindWindowSettingsByID(ImGuiID id);
1193b4be Poul Sander 2025-02-03 21:28 3442
    IMGUI_API ImGuiWindowSettings*  FindWindowSettingsByWindow(ImGuiWindow* window);
1193b4be Poul Sander 2025-02-03 21:28 3443
    IMGUI_API void                  ClearWindowSettings(const char* name);
1193b4be Poul Sander 2025-02-03 21:28 3444
1193b4be Poul Sander 2025-02-03 21:28 3445
    // Localization
1193b4be Poul Sander 2025-02-03 21:28 3446
    IMGUI_API void          LocalizeRegisterEntries(const ImGuiLocEntry* entries, int count);
1193b4be Poul Sander 2025-02-03 21:28 3447
    inline const char*      LocalizeGetMsg(ImGuiLocKey key) { ImGuiContext& g = *GImGui; const char* msg = g.LocalizationTable[key]; return msg ? msg : "*Missing Text*"; }
1193b4be Poul Sander 2025-02-03 21:28 3448
1193b4be Poul Sander 2025-02-03 21:28 3449
    // Scrolling
1193b4be Poul Sander 2025-02-03 21:28 3450
    IMGUI_API void          SetScrollX(ImGuiWindow* window, float scroll_x);
1193b4be Poul Sander 2025-02-03 21:28 3451
    IMGUI_API void          SetScrollY(ImGuiWindow* window, float scroll_y);
1193b4be Poul Sander 2025-02-03 21:28 3452
    IMGUI_API void          SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x_ratio);
1193b4be Poul Sander 2025-02-03 21:28 3453
    IMGUI_API void          SetScrollFromPosY(ImGuiWindow* window, float local_y, float center_y_ratio);
1193b4be Poul Sander 2025-02-03 21:28 3454
1193b4be Poul Sander 2025-02-03 21:28 3455
    // Early work-in-progress API (ScrollToItem() will become public)
1193b4be Poul Sander 2025-02-03 21:28 3456
    IMGUI_API void          ScrollToItem(ImGuiScrollFlags flags = 0);
1193b4be Poul Sander 2025-02-03 21:28 3457
    IMGUI_API void          ScrollToRect(ImGuiWindow* window, const ImRect& rect, ImGuiScrollFlags flags = 0);
1193b4be Poul Sander 2025-02-03 21:28 3458
    IMGUI_API ImVec2        ScrollToRectEx(ImGuiWindow* window, const ImRect& rect, ImGuiScrollFlags flags = 0);
1193b4be Poul Sander 2025-02-03 21:28 3459
//#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
1193b4be Poul Sander 2025-02-03 21:28 3460
    inline void             ScrollToBringRectIntoView(ImGuiWindow* window, const ImRect& rect) { ScrollToRect(window, rect, ImGuiScrollFlags_KeepVisibleEdgeY); }
1193b4be Poul Sander 2025-02-03 21:28 3461
//#endif
1193b4be Poul Sander 2025-02-03 21:28 3462
1193b4be Poul Sander 2025-02-03 21:28 3463
    // Basic Accessors
1193b4be Poul Sander 2025-02-03 21:28 3464
    inline ImGuiItemStatusFlags GetItemStatusFlags() { ImGuiContext& g = *GImGui; return g.LastItemData.StatusFlags; }
1193b4be Poul Sander 2025-02-03 21:28 3465
    inline ImGuiItemFlags   GetItemFlags()  { ImGuiContext& g = *GImGui; return g.LastItemData.ItemFlags; }
1193b4be Poul Sander 2025-02-03 21:28 3466
    inline ImGuiID          GetActiveID()   { ImGuiContext& g = *GImGui; return g.ActiveId; }
1193b4be Poul Sander 2025-02-03 21:28 3467
    inline ImGuiID          GetFocusID()    { ImGuiContext& g = *GImGui; return g.NavId; }
1193b4be Poul Sander 2025-02-03 21:28 3468
    IMGUI_API void          SetActiveID(ImGuiID id, ImGuiWindow* window);
1193b4be Poul Sander 2025-02-03 21:28 3469
    IMGUI_API void          SetFocusID(ImGuiID id, ImGuiWindow* window);
1193b4be Poul Sander 2025-02-03 21:28 3470
    IMGUI_API void          ClearActiveID();
1193b4be Poul Sander 2025-02-03 21:28 3471
    IMGUI_API ImGuiID       GetHoveredID();
1193b4be Poul Sander 2025-02-03 21:28 3472
    IMGUI_API void          SetHoveredID(ImGuiID id);
1193b4be Poul Sander 2025-02-03 21:28 3473
    IMGUI_API void          KeepAliveID(ImGuiID id);
1193b4be Poul Sander 2025-02-03 21:28 3474
    IMGUI_API void          MarkItemEdited(ImGuiID id);     // Mark data associated to given item as "edited", used by IsItemDeactivatedAfterEdit() function.
1193b4be Poul Sander 2025-02-03 21:28 3475
    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)
1193b4be Poul Sander 2025-02-03 21:28 3476
    IMGUI_API ImGuiID       GetIDWithSeed(const char* str_id_begin, const char* str_id_end, ImGuiID seed);
1193b4be Poul Sander 2025-02-03 21:28 3477
    IMGUI_API ImGuiID       GetIDWithSeed(int n, ImGuiID seed);
1193b4be Poul Sander 2025-02-03 21:28 3478
1193b4be Poul Sander 2025-02-03 21:28 3479
    // Basic Helpers for widget code
1193b4be Poul Sander 2025-02-03 21:28 3480
    IMGUI_API void          ItemSize(const ImVec2& size, float text_baseline_y = -1.0f);
1193b4be Poul Sander 2025-02-03 21:28 3481
    inline void             ItemSize(const ImRect& bb, float text_baseline_y = -1.0f) { ItemSize(bb.GetSize(), text_baseline_y); } // FIXME: This is a misleading API since we expect CursorPos to be bb.Min.
1193b4be Poul Sander 2025-02-03 21:28 3482
    IMGUI_API bool          ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb = NULL, ImGuiItemFlags extra_flags = 0);
1193b4be Poul Sander 2025-02-03 21:28 3483
    IMGUI_API bool          ItemHoverable(const ImRect& bb, ImGuiID id, ImGuiItemFlags item_flags);
1193b4be Poul Sander 2025-02-03 21:28 3484
    IMGUI_API bool          IsWindowContentHoverable(ImGuiWindow* window, ImGuiHoveredFlags flags = 0);
1193b4be Poul Sander 2025-02-03 21:28 3485
    IMGUI_API bool          IsClippedEx(const ImRect& bb, ImGuiID id);
4e9e2555 Poul Sander 2025-10-05 10:15 3486
    IMGUI_API void          SetLastItemData(ImGuiID item_id, ImGuiItemFlags item_flags, ImGuiItemStatusFlags status_flags, const ImRect& item_rect);
1193b4be Poul Sander 2025-02-03 21:28 3487
    IMGUI_API ImVec2        CalcItemSize(ImVec2 size, float default_w, float default_h);
1193b4be Poul Sander 2025-02-03 21:28 3488
    IMGUI_API float         CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x);
1193b4be Poul Sander 2025-02-03 21:28 3489
    IMGUI_API void          PushMultiItemsWidths(int components, float width_full);
4e9e2555 Poul Sander 2025-10-05 10:15 3490
    IMGUI_API void          ShrinkWidths(ImGuiShrinkWidthItem* items, int count, float width_excess, float width_min);
4e9e2555 Poul Sander 2025-10-05 10:15 3491
    IMGUI_API void          CalcClipRectVisibleItemsY(const ImRect& clip_rect, const ImVec2& pos, float items_height, int* out_visible_start, int* out_visible_end);
1193b4be Poul Sander 2025-02-03 21:28 3492
1193b4be Poul Sander 2025-02-03 21:28 3493
    // Parameter stacks (shared)
4e9e2555 Poul Sander 2025-10-05 10:15 3494
    IMGUI_API const ImGuiStyleVarInfo* GetStyleVarInfo(ImGuiStyleVar idx);
1193b4be Poul Sander 2025-02-03 21:28 3495
    IMGUI_API void          BeginDisabledOverrideReenable();
1193b4be Poul Sander 2025-02-03 21:28 3496
    IMGUI_API void          EndDisabledOverrideReenable();
1193b4be Poul Sander 2025-02-03 21:28 3497
1193b4be Poul Sander 2025-02-03 21:28 3498
    // Logging/Capture
4e9e2555 Poul Sander 2025-10-05 10:15 3499
    IMGUI_API void          LogBegin(ImGuiLogFlags flags, int auto_open_depth);         // -> BeginCapture() when we design v2 api, for now stay under the radar by using the old name.
1193b4be Poul Sander 2025-02-03 21:28 3500
    IMGUI_API void          LogToBuffer(int auto_open_depth = -1);                      // Start logging/capturing to internal buffer
1193b4be Poul Sander 2025-02-03 21:28 3501
    IMGUI_API void          LogRenderedText(const ImVec2* ref_pos, const char* text, const char* text_end = NULL);
1193b4be Poul Sander 2025-02-03 21:28 3502
    IMGUI_API void          LogSetNextTextDecoration(const char* prefix, const char* suffix);
1193b4be Poul Sander 2025-02-03 21:28 3503
1193b4be Poul Sander 2025-02-03 21:28 3504
    // Childs
1193b4be Poul Sander 2025-02-03 21:28 3505
    IMGUI_API bool          BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, ImGuiChildFlags child_flags, ImGuiWindowFlags window_flags);
1193b4be Poul Sander 2025-02-03 21:28 3506
1193b4be Poul Sander 2025-02-03 21:28 3507
    // Popups, Modals
1193b4be Poul Sander 2025-02-03 21:28 3508
    IMGUI_API bool          BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_window_flags);
4e9e2555 Poul Sander 2025-10-05 10:15 3509
    IMGUI_API bool          BeginPopupMenuEx(ImGuiID id, const char* label, ImGuiWindowFlags extra_window_flags);
1193b4be Poul Sander 2025-02-03 21:28 3510
    IMGUI_API void          OpenPopupEx(ImGuiID id, ImGuiPopupFlags popup_flags = ImGuiPopupFlags_None);
1193b4be Poul Sander 2025-02-03 21:28 3511
    IMGUI_API void          ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_popup);
1193b4be Poul Sander 2025-02-03 21:28 3512
    IMGUI_API void          ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to_window_under_popup);
1193b4be Poul Sander 2025-02-03 21:28 3513
    IMGUI_API void          ClosePopupsExceptModals();
1193b4be Poul Sander 2025-02-03 21:28 3514
    IMGUI_API bool          IsPopupOpen(ImGuiID id, ImGuiPopupFlags popup_flags);
1193b4be Poul Sander 2025-02-03 21:28 3515
    IMGUI_API ImRect        GetPopupAllowedExtentRect(ImGuiWindow* window);
1193b4be Poul Sander 2025-02-03 21:28 3516
    IMGUI_API ImGuiWindow*  GetTopMostPopupModal();
1193b4be Poul Sander 2025-02-03 21:28 3517
    IMGUI_API ImGuiWindow*  GetTopMostAndVisiblePopupModal();
1193b4be Poul Sander 2025-02-03 21:28 3518
    IMGUI_API ImGuiWindow*  FindBlockingModal(ImGuiWindow* window);
1193b4be Poul Sander 2025-02-03 21:28 3519
    IMGUI_API ImVec2        FindBestWindowPosForPopup(ImGuiWindow* window);
1193b4be Poul Sander 2025-02-03 21:28 3520
    IMGUI_API ImVec2        FindBestWindowPosForPopupEx(const ImVec2& ref_pos, const ImVec2& size, ImGuiDir* last_dir, const ImRect& r_outer, const ImRect& r_avoid, ImGuiPopupPositionPolicy policy);
1193b4be Poul Sander 2025-02-03 21:28 3521
1193b4be Poul Sander 2025-02-03 21:28 3522
    // Tooltips
1193b4be Poul Sander 2025-02-03 21:28 3523
    IMGUI_API bool          BeginTooltipEx(ImGuiTooltipFlags tooltip_flags, ImGuiWindowFlags extra_window_flags);
1193b4be Poul Sander 2025-02-03 21:28 3524
    IMGUI_API bool          BeginTooltipHidden();
1193b4be Poul Sander 2025-02-03 21:28 3525
1193b4be Poul Sander 2025-02-03 21:28 3526
    // Menus
1193b4be Poul Sander 2025-02-03 21:28 3527
    IMGUI_API bool          BeginViewportSideBar(const char* name, ImGuiViewport* viewport, ImGuiDir dir, float size, ImGuiWindowFlags window_flags);
1193b4be Poul Sander 2025-02-03 21:28 3528
    IMGUI_API bool          BeginMenuEx(const char* label, const char* icon, bool enabled = true);
1193b4be Poul Sander 2025-02-03 21:28 3529
    IMGUI_API bool          MenuItemEx(const char* label, const char* icon, const char* shortcut = NULL, bool selected = false, bool enabled = true);
1193b4be Poul Sander 2025-02-03 21:28 3530
1193b4be Poul Sander 2025-02-03 21:28 3531
    // Combos
1193b4be Poul Sander 2025-02-03 21:28 3532
    IMGUI_API bool          BeginComboPopup(ImGuiID popup_id, const ImRect& bb, ImGuiComboFlags flags);
1193b4be Poul Sander 2025-02-03 21:28 3533
    IMGUI_API bool          BeginComboPreview();
1193b4be Poul Sander 2025-02-03 21:28 3534
    IMGUI_API void          EndComboPreview();
1193b4be Poul Sander 2025-02-03 21:28 3535
1193b4be Poul Sander 2025-02-03 21:28 3536
    // Keyboard/Gamepad Navigation
1193b4be Poul Sander 2025-02-03 21:28 3537
    IMGUI_API void          NavInitWindow(ImGuiWindow* window, bool force_reinit);
1193b4be Poul Sander 2025-02-03 21:28 3538
    IMGUI_API void          NavInitRequestApplyResult();
1193b4be Poul Sander 2025-02-03 21:28 3539
    IMGUI_API bool          NavMoveRequestButNoResultYet();
1193b4be Poul Sander 2025-02-03 21:28 3540
    IMGUI_API void          NavMoveRequestSubmit(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags);
1193b4be Poul Sander 2025-02-03 21:28 3541
    IMGUI_API void          NavMoveRequestForward(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags);
1193b4be Poul Sander 2025-02-03 21:28 3542
    IMGUI_API void          NavMoveRequestResolveWithLastItem(ImGuiNavItemData* result);
4e9e2555 Poul Sander 2025-10-05 10:15 3543
    IMGUI_API void          NavMoveRequestResolveWithPastTreeNode(ImGuiNavItemData* result, const ImGuiTreeNodeStackData* tree_node_data);
1193b4be Poul Sander 2025-02-03 21:28 3544
    IMGUI_API void          NavMoveRequestCancel();
1193b4be Poul Sander 2025-02-03 21:28 3545
    IMGUI_API void          NavMoveRequestApplyResult();
1193b4be Poul Sander 2025-02-03 21:28 3546
    IMGUI_API void          NavMoveRequestTryWrapping(ImGuiWindow* window, ImGuiNavMoveFlags move_flags);
1193b4be Poul Sander 2025-02-03 21:28 3547
    IMGUI_API void          NavHighlightActivated(ImGuiID id);
1193b4be Poul Sander 2025-02-03 21:28 3548
    IMGUI_API void          NavClearPreferredPosForAxis(ImGuiAxis axis);
1193b4be Poul Sander 2025-02-03 21:28 3549
    IMGUI_API void          SetNavCursorVisibleAfterMove();
1193b4be Poul Sander 2025-02-03 21:28 3550
    IMGUI_API void          NavUpdateCurrentWindowIsScrollPushableX();
1193b4be Poul Sander 2025-02-03 21:28 3551
    IMGUI_API void          SetNavWindow(ImGuiWindow* window);
1193b4be Poul Sander 2025-02-03 21:28 3552
    IMGUI_API void          SetNavID(ImGuiID id, ImGuiNavLayer nav_layer, ImGuiID focus_scope_id, const ImRect& rect_rel);
1193b4be Poul Sander 2025-02-03 21:28 3553
    IMGUI_API void          SetNavFocusScope(ImGuiID focus_scope_id);
1193b4be Poul Sander 2025-02-03 21:28 3554
1193b4be Poul Sander 2025-02-03 21:28 3555
    // Focus/Activation
1193b4be Poul Sander 2025-02-03 21:28 3556
    // This should be part of a larger set of API: FocusItem(offset = -1), FocusItemByID(id), ActivateItem(offset = -1), ActivateItemByID(id) etc. which are
1193b4be Poul Sander 2025-02-03 21:28 3557
    // much harder to design and implement than expected. I have a couple of private branches on this matter but it's not simple. For now implementing the easy ones.
1193b4be Poul Sander 2025-02-03 21:28 3558
    IMGUI_API void          FocusItem();                    // Focus last item (no selection/activation).
4e9e2555 Poul Sander 2025-10-05 10:15 3559
    IMGUI_API void          ActivateItemByID(ImGuiID id);   // Activate an item by ID (button, checkbox, tree node etc.). Activation is queued and processed on the next frame when the item is encountered again. Was called 'ActivateItem()' before 1.89.7.
1193b4be Poul Sander 2025-02-03 21:28 3560
1193b4be Poul Sander 2025-02-03 21:28 3561
    // Inputs
1193b4be Poul Sander 2025-02-03 21:28 3562
    // FIXME: Eventually we should aim to move e.g. IsActiveIdUsingKey() into IsKeyXXX functions.
1193b4be Poul Sander 2025-02-03 21:28 3563
    inline bool             IsNamedKey(ImGuiKey key)                    { return key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END; }
1193b4be Poul Sander 2025-02-03 21:28 3564
    inline bool             IsNamedKeyOrMod(ImGuiKey key)               { return (key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END) || key == ImGuiMod_Ctrl || key == ImGuiMod_Shift || key == ImGuiMod_Alt || key == ImGuiMod_Super; }
1193b4be Poul Sander 2025-02-03 21:28 3565
    inline bool             IsLegacyKey(ImGuiKey key)                   { return key >= ImGuiKey_LegacyNativeKey_BEGIN && key < ImGuiKey_LegacyNativeKey_END; }
1193b4be Poul Sander 2025-02-03 21:28 3566
    inline bool             IsKeyboardKey(ImGuiKey key)                 { return key >= ImGuiKey_Keyboard_BEGIN && key < ImGuiKey_Keyboard_END; }
1193b4be Poul Sander 2025-02-03 21:28 3567
    inline bool             IsGamepadKey(ImGuiKey key)                  { return key >= ImGuiKey_Gamepad_BEGIN && key < ImGuiKey_Gamepad_END; }
1193b4be Poul Sander 2025-02-03 21:28 3568
    inline bool             IsMouseKey(ImGuiKey key)                    { return key >= ImGuiKey_Mouse_BEGIN && key < ImGuiKey_Mouse_END; }
1193b4be Poul Sander 2025-02-03 21:28 3569
    inline bool             IsAliasKey(ImGuiKey key)                    { return key >= ImGuiKey_Aliases_BEGIN && key < ImGuiKey_Aliases_END; }
1193b4be Poul Sander 2025-02-03 21:28 3570
    inline bool             IsLRModKey(ImGuiKey key)                    { return key >= ImGuiKey_LeftCtrl && key <= ImGuiKey_RightSuper; }
1193b4be Poul Sander 2025-02-03 21:28 3571
    ImGuiKeyChord           FixupKeyChord(ImGuiKeyChord key_chord);
1193b4be Poul Sander 2025-02-03 21:28 3572
    inline ImGuiKey         ConvertSingleModFlagToKey(ImGuiKey key)
1193b4be Poul Sander 2025-02-03 21:28 3573
    {
1193b4be Poul Sander 2025-02-03 21:28 3574
        if (key == ImGuiMod_Ctrl) return ImGuiKey_ReservedForModCtrl;
1193b4be Poul Sander 2025-02-03 21:28 3575
        if (key == ImGuiMod_Shift) return ImGuiKey_ReservedForModShift;
1193b4be Poul Sander 2025-02-03 21:28 3576
        if (key == ImGuiMod_Alt) return ImGuiKey_ReservedForModAlt;
1193b4be Poul Sander 2025-02-03 21:28 3577
        if (key == ImGuiMod_Super) return ImGuiKey_ReservedForModSuper;
1193b4be Poul Sander 2025-02-03 21:28 3578
        return key;
1193b4be Poul Sander 2025-02-03 21:28 3579
    }
1193b4be Poul Sander 2025-02-03 21:28 3580
1193b4be Poul Sander 2025-02-03 21:28 3581
    IMGUI_API ImGuiKeyData* GetKeyData(ImGuiContext* ctx, ImGuiKey key);
1193b4be Poul Sander 2025-02-03 21:28 3582
    inline ImGuiKeyData*    GetKeyData(ImGuiKey key)                                    { ImGuiContext& g = *GImGui; return GetKeyData(&g, key); }
1193b4be Poul Sander 2025-02-03 21:28 3583
    IMGUI_API const char*   GetKeyChordName(ImGuiKeyChord key_chord);
1193b4be Poul Sander 2025-02-03 21:28 3584
    inline ImGuiKey         MouseButtonToKey(ImGuiMouseButton button)                   { IM_ASSERT(button >= 0 && button < ImGuiMouseButton_COUNT); return (ImGuiKey)(ImGuiKey_MouseLeft + button); }
1193b4be Poul Sander 2025-02-03 21:28 3585
    IMGUI_API bool          IsMouseDragPastThreshold(ImGuiMouseButton button, float lock_threshold = -1.0f);
1193b4be Poul Sander 2025-02-03 21:28 3586
    IMGUI_API ImVec2        GetKeyMagnitude2d(ImGuiKey key_left, ImGuiKey key_right, ImGuiKey key_up, ImGuiKey key_down);
1193b4be Poul Sander 2025-02-03 21:28 3587
    IMGUI_API float         GetNavTweakPressedAmount(ImGuiAxis axis);
1193b4be Poul Sander 2025-02-03 21:28 3588
    IMGUI_API int           CalcTypematicRepeatAmount(float t0, float t1, float repeat_delay, float repeat_rate);
1193b4be Poul Sander 2025-02-03 21:28 3589
    IMGUI_API void          GetTypematicRepeatRate(ImGuiInputFlags flags, float* repeat_delay, float* repeat_rate);
1193b4be Poul Sander 2025-02-03 21:28 3590
    IMGUI_API void          TeleportMousePos(const ImVec2& pos);
1193b4be Poul Sander 2025-02-03 21:28 3591
    IMGUI_API void          SetActiveIdUsingAllKeyboardKeys();
1193b4be Poul Sander 2025-02-03 21:28 3592
    inline bool             IsActiveIdUsingNavDir(ImGuiDir dir)                         { ImGuiContext& g = *GImGui; return (g.ActiveIdUsingNavDirMask & (1 << dir)) != 0; }
1193b4be Poul Sander 2025-02-03 21:28 3593
1193b4be Poul Sander 2025-02-03 21:28 3594
    // [EXPERIMENTAL] Low-Level: Key/Input Ownership
1193b4be Poul Sander 2025-02-03 21:28 3595
    // - The idea is that instead of "eating" a given input, we can link to an owner id.
1193b4be Poul Sander 2025-02-03 21:28 3596
    // - Ownership is most often claimed as a result of reacting to a press/down event (but occasionally may be claimed ahead).
1193b4be Poul Sander 2025-02-03 21:28 3597
    // - Input queries can then read input by specifying ImGuiKeyOwner_Any (== 0), ImGuiKeyOwner_NoOwner (== -1) or a custom ID.
1193b4be Poul Sander 2025-02-03 21:28 3598
    // - Legacy input queries (without specifying an owner or _Any or _None) are equivalent to using ImGuiKeyOwner_Any (== 0).
1193b4be Poul Sander 2025-02-03 21:28 3599
    // - Input ownership is automatically released on the frame after a key is released. Therefore:
1193b4be Poul Sander 2025-02-03 21:28 3600
    //   - for ownership registration happening as a result of a down/press event, the SetKeyOwner() call may be done once (common case).
1193b4be Poul Sander 2025-02-03 21:28 3601
    //   - for ownership registration happening ahead of a down/press event, the SetKeyOwner() call needs to be made every frame (happens if e.g. claiming ownership on hover).
1193b4be Poul Sander 2025-02-03 21:28 3602
    // - SetItemKeyOwner() is a shortcut for common simple case. A custom widget will probably want to call SetKeyOwner() multiple times directly based on its interaction state.
1193b4be Poul Sander 2025-02-03 21:28 3603
    // - This is marked experimental because not all widgets are fully honoring the Set/Test idioms. We will need to move forward step by step.
1193b4be Poul Sander 2025-02-03 21:28 3604
    //   Please open a GitHub Issue to submit your usage scenario or if there's a use case you need solved.
1193b4be Poul Sander 2025-02-03 21:28 3605
    IMGUI_API ImGuiID       GetKeyOwner(ImGuiKey key);
1193b4be Poul Sander 2025-02-03 21:28 3606
    IMGUI_API void          SetKeyOwner(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags = 0);
1193b4be Poul Sander 2025-02-03 21:28 3607
    IMGUI_API void          SetKeyOwnersForKeyChord(ImGuiKeyChord key, ImGuiID owner_id, ImGuiInputFlags flags = 0);
1193b4be Poul Sander 2025-02-03 21:28 3608
    IMGUI_API void          SetItemKeyOwner(ImGuiKey key, ImGuiInputFlags flags);       // Set key owner to last item if it is hovered or active. Equivalent to 'if (IsItemHovered() || IsItemActive()) { SetKeyOwner(key, GetItemID());'.
1193b4be Poul Sander 2025-02-03 21:28 3609
    IMGUI_API bool          TestKeyOwner(ImGuiKey key, ImGuiID owner_id);               // Test that key is either not owned, either owned by 'owner_id'
1193b4be Poul Sander 2025-02-03 21:28 3610
    inline ImGuiKeyOwnerData* GetKeyOwnerData(ImGuiContext* ctx, ImGuiKey key)          { if (key & ImGuiMod_Mask_) key = ConvertSingleModFlagToKey(key); IM_ASSERT(IsNamedKey(key)); return &ctx->KeysOwnerData[key - ImGuiKey_NamedKey_BEGIN]; }
1193b4be Poul Sander 2025-02-03 21:28 3611
1193b4be Poul Sander 2025-02-03 21:28 3612
    // [EXPERIMENTAL] High-Level: Input Access functions w/ support for Key/Input Ownership
1193b4be Poul Sander 2025-02-03 21:28 3613
    // - Important: legacy IsKeyPressed(ImGuiKey, bool repeat=true) _DEFAULTS_ to repeat, new IsKeyPressed() requires _EXPLICIT_ ImGuiInputFlags_Repeat flag.
1193b4be Poul Sander 2025-02-03 21:28 3614
    // - Expected to be later promoted to public API, the prototypes are designed to replace existing ones (since owner_id can default to Any == 0)
1193b4be Poul Sander 2025-02-03 21:28 3615
    // - Specifying a value for 'ImGuiID owner' will test that EITHER the key is NOT owned (UNLESS locked), EITHER the key is owned by 'owner'.
1193b4be Poul Sander 2025-02-03 21:28 3616
    //   Legacy functions use ImGuiKeyOwner_Any meaning that they typically ignore ownership, unless a call to SetKeyOwner() explicitly used ImGuiInputFlags_LockThisFrame or ImGuiInputFlags_LockUntilRelease.
1193b4be Poul Sander 2025-02-03 21:28 3617
    // - Binding generators may want to ignore those for now, or suffix them with Ex() until we decide if this gets moved into public API.
1193b4be Poul Sander 2025-02-03 21:28 3618
    IMGUI_API bool          IsKeyDown(ImGuiKey key, ImGuiID owner_id);
1193b4be Poul Sander 2025-02-03 21:28 3619
    IMGUI_API bool          IsKeyPressed(ImGuiKey key, ImGuiInputFlags flags, ImGuiID owner_id = 0);    // Important: when transitioning from old to new IsKeyPressed(): old API has "bool repeat = true", so would default to repeat. New API requiress explicit ImGuiInputFlags_Repeat.
1193b4be Poul Sander 2025-02-03 21:28 3620
    IMGUI_API bool          IsKeyReleased(ImGuiKey key, ImGuiID owner_id);
1193b4be Poul Sander 2025-02-03 21:28 3621
    IMGUI_API bool          IsKeyChordPressed(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID owner_id = 0);
1193b4be Poul Sander 2025-02-03 21:28 3622
    IMGUI_API bool          IsMouseDown(ImGuiMouseButton button, ImGuiID owner_id);
1193b4be Poul Sander 2025-02-03 21:28 3623
    IMGUI_API bool          IsMouseClicked(ImGuiMouseButton button, ImGuiInputFlags flags, ImGuiID owner_id = 0);
1193b4be Poul Sander 2025-02-03 21:28 3624
    IMGUI_API bool          IsMouseReleased(ImGuiMouseButton button, ImGuiID owner_id);
1193b4be Poul Sander 2025-02-03 21:28 3625
    IMGUI_API bool          IsMouseDoubleClicked(ImGuiMouseButton button, ImGuiID owner_id);
1193b4be Poul Sander 2025-02-03 21:28 3626
1193b4be Poul Sander 2025-02-03 21:28 3627
    // Shortcut Testing & Routing
1193b4be Poul Sander 2025-02-03 21:28 3628
    // - Set Shortcut() and SetNextItemShortcut() in imgui.h
1193b4be Poul Sander 2025-02-03 21:28 3629
    // - When a policy (except for ImGuiInputFlags_RouteAlways *) is set, Shortcut() will register itself with SetShortcutRouting(),
1193b4be Poul Sander 2025-02-03 21:28 3630
    //   allowing the system to decide where to route the input among other route-aware calls.
1193b4be Poul Sander 2025-02-03 21:28 3631
    //   (* using ImGuiInputFlags_RouteAlways is roughly equivalent to calling IsKeyChordPressed(key) and bypassing route registration and check)
1193b4be Poul Sander 2025-02-03 21:28 3632
    // - When using one of the routing option:
1193b4be Poul Sander 2025-02-03 21:28 3633
    //   - The default route is ImGuiInputFlags_RouteFocused (accept inputs if window is in focus stack. Deep-most focused window takes inputs. ActiveId takes inputs over deep-most focused window.)
1193b4be Poul Sander 2025-02-03 21:28 3634
    //   - Routes are requested given a chord (key + modifiers) and a routing policy.
1193b4be Poul Sander 2025-02-03 21:28 3635
    //   - Routes are resolved during NewFrame(): if keyboard modifiers are matching current ones: SetKeyOwner() is called + route is granted for the frame.
1193b4be Poul Sander 2025-02-03 21:28 3636
    //   - Each route may be granted to a single owner. When multiple requests are made we have policies to select the winning route (e.g. deep most window).
1193b4be Poul Sander 2025-02-03 21:28 3637
    //   - Multiple read sites may use the same owner id can all access the granted route.
1193b4be Poul Sander 2025-02-03 21:28 3638
    //   - When owner_id is 0 we use the current Focus Scope ID as a owner ID in order to identify our location.
1193b4be Poul Sander 2025-02-03 21:28 3639
    // - You can chain two unrelated windows in the focus stack using SetWindowParentWindowForFocusRoute()
1193b4be Poul Sander 2025-02-03 21:28 3640
    //   e.g. if you have a tool window associated to a document, and you want document shortcuts to run when the tool is focused.
1193b4be Poul Sander 2025-02-03 21:28 3641
    IMGUI_API bool          Shortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID owner_id);
1193b4be Poul Sander 2025-02-03 21:28 3642
    IMGUI_API bool          SetShortcutRouting(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID owner_id); // owner_id needs to be explicit and cannot be 0
1193b4be Poul Sander 2025-02-03 21:28 3643
    IMGUI_API bool          TestShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id);
1193b4be Poul Sander 2025-02-03 21:28 3644
    IMGUI_API ImGuiKeyRoutingData* GetShortcutRoutingData(ImGuiKeyChord key_chord);
1193b4be Poul Sander 2025-02-03 21:28 3645
1193b4be Poul Sander 2025-02-03 21:28 3646
    // Docking
1193b4be Poul Sander 2025-02-03 21:28 3647
    // (some functions are only declared in imgui.cpp, see Docking section)
1193b4be Poul Sander 2025-02-03 21:28 3648
    IMGUI_API void          DockContextInitialize(ImGuiContext* ctx);
1193b4be Poul Sander 2025-02-03 21:28 3649
    IMGUI_API void          DockContextShutdown(ImGuiContext* ctx);
1193b4be Poul Sander 2025-02-03 21:28 3650
    IMGUI_API void          DockContextClearNodes(ImGuiContext* ctx, ImGuiID root_id, bool clear_settings_refs); // Use root_id==0 to clear all
1193b4be Poul Sander 2025-02-03 21:28 3651
    IMGUI_API void          DockContextRebuildNodes(ImGuiContext* ctx);
1193b4be Poul Sander 2025-02-03 21:28 3652
    IMGUI_API void          DockContextNewFrameUpdateUndocking(ImGuiContext* ctx);
1193b4be Poul Sander 2025-02-03 21:28 3653
    IMGUI_API void          DockContextNewFrameUpdateDocking(ImGuiContext* ctx);
1193b4be Poul Sander 2025-02-03 21:28 3654
    IMGUI_API void          DockContextEndFrame(ImGuiContext* ctx);
1193b4be Poul Sander 2025-02-03 21:28 3655
    IMGUI_API ImGuiID       DockContextGenNodeID(ImGuiContext* ctx);
1193b4be Poul Sander 2025-02-03 21:28 3656
    IMGUI_API void          DockContextQueueDock(ImGuiContext* ctx, ImGuiWindow* target, ImGuiDockNode* target_node, ImGuiWindow* payload, ImGuiDir split_dir, float split_ratio, bool split_outer);
1193b4be Poul Sander 2025-02-03 21:28 3657
    IMGUI_API void          DockContextQueueUndockWindow(ImGuiContext* ctx, ImGuiWindow* window);
1193b4be Poul Sander 2025-02-03 21:28 3658
    IMGUI_API void          DockContextQueueUndockNode(ImGuiContext* ctx, ImGuiDockNode* node);
1193b4be Poul Sander 2025-02-03 21:28 3659
    IMGUI_API void          DockContextProcessUndockWindow(ImGuiContext* ctx, ImGuiWindow* window, bool clear_persistent_docking_ref = true);
1193b4be Poul Sander 2025-02-03 21:28 3660
    IMGUI_API void          DockContextProcessUndockNode(ImGuiContext* ctx, ImGuiDockNode* node);
1193b4be Poul Sander 2025-02-03 21:28 3661
    IMGUI_API bool          DockContextCalcDropPosForDocking(ImGuiWindow* target, ImGuiDockNode* target_node, ImGuiWindow* payload_window, ImGuiDockNode* payload_node, ImGuiDir split_dir, bool split_outer, ImVec2* out_pos);
1193b4be Poul Sander 2025-02-03 21:28 3662
    IMGUI_API ImGuiDockNode*DockContextFindNodeByID(ImGuiContext* ctx, ImGuiID id);
1193b4be Poul Sander 2025-02-03 21:28 3663
    IMGUI_API void          DockNodeWindowMenuHandler_Default(ImGuiContext* ctx, ImGuiDockNode* node, ImGuiTabBar* tab_bar);
1193b4be Poul Sander 2025-02-03 21:28 3664
    IMGUI_API bool          DockNodeBeginAmendTabBar(ImGuiDockNode* node);
1193b4be Poul Sander 2025-02-03 21:28 3665
    IMGUI_API void          DockNodeEndAmendTabBar();
1193b4be Poul Sander 2025-02-03 21:28 3666
    inline ImGuiDockNode*   DockNodeGetRootNode(ImGuiDockNode* node)                 { while (node->ParentNode) node = node->ParentNode; return node; }
1193b4be Poul Sander 2025-02-03 21:28 3667
    inline bool             DockNodeIsInHierarchyOf(ImGuiDockNode* node, ImGuiDockNode* parent) { while (node) { if (node == parent) return true; node = node->ParentNode; } return false; }
1193b4be Poul Sander 2025-02-03 21:28 3668
    inline int              DockNodeGetDepth(const ImGuiDockNode* node)              { int depth = 0; while (node->ParentNode) { node = node->ParentNode; depth++; } return depth; }
1193b4be Poul Sander 2025-02-03 21:28 3669
    inline ImGuiID          DockNodeGetWindowMenuButtonId(const ImGuiDockNode* node) { return ImHashStr("#COLLAPSE", 0, node->ID); }
1193b4be Poul Sander 2025-02-03 21:28 3670
    inline ImGuiDockNode*   GetWindowDockNode()                                      { ImGuiContext& g = *GImGui; return g.CurrentWindow->DockNode; }
1193b4be Poul Sander 2025-02-03 21:28 3671
    IMGUI_API bool          GetWindowAlwaysWantOwnTabBar(ImGuiWindow* window);
1193b4be Poul Sander 2025-02-03 21:28 3672
    IMGUI_API void          BeginDocked(ImGuiWindow* window, bool* p_open);
1193b4be Poul Sander 2025-02-03 21:28 3673
    IMGUI_API void          BeginDockableDragDropSource(ImGuiWindow* window);
1193b4be Poul Sander 2025-02-03 21:28 3674
    IMGUI_API void          BeginDockableDragDropTarget(ImGuiWindow* window);
1193b4be Poul Sander 2025-02-03 21:28 3675
    IMGUI_API void          SetWindowDock(ImGuiWindow* window, ImGuiID dock_id, ImGuiCond cond);
1193b4be Poul Sander 2025-02-03 21:28 3676
1193b4be Poul Sander 2025-02-03 21:28 3677
    // Docking - Builder function needs to be generally called before the node is used/submitted.
1193b4be Poul Sander 2025-02-03 21:28 3678
    // - The DockBuilderXXX functions are designed to _eventually_ become a public API, but it is too early to expose it and guarantee stability.
1193b4be Poul Sander 2025-02-03 21:28 3679
    // - Do not hold on ImGuiDockNode* pointers! They may be invalidated by any split/merge/remove operation and every frame.
1193b4be Poul Sander 2025-02-03 21:28 3680
    // - To create a DockSpace() node, make sure to set the ImGuiDockNodeFlags_DockSpace flag when calling DockBuilderAddNode().
1193b4be Poul Sander 2025-02-03 21:28 3681
    //   You can create dockspace nodes (attached to a window) _or_ floating nodes (carry its own window) with this API.
1193b4be Poul Sander 2025-02-03 21:28 3682
    // - DockBuilderSplitNode() create 2 child nodes within 1 node. The initial node becomes a parent node.
1193b4be Poul Sander 2025-02-03 21:28 3683
    // - If you intend to split the node immediately after creation using DockBuilderSplitNode(), make sure
1193b4be Poul Sander 2025-02-03 21:28 3684
    //   to call DockBuilderSetNodeSize() beforehand. If you don't, the resulting split sizes may not be reliable.
1193b4be Poul Sander 2025-02-03 21:28 3685
    // - Call DockBuilderFinish() after you are done.
1193b4be Poul Sander 2025-02-03 21:28 3686
    IMGUI_API void          DockBuilderDockWindow(const char* window_name, ImGuiID node_id);
1193b4be Poul Sander 2025-02-03 21:28 3687
    IMGUI_API ImGuiDockNode*DockBuilderGetNode(ImGuiID node_id);
1193b4be Poul Sander 2025-02-03 21:28 3688
    inline ImGuiDockNode*   DockBuilderGetCentralNode(ImGuiID node_id)              { ImGuiDockNode* node = DockBuilderGetNode(node_id); if (!node) return NULL; return DockNodeGetRootNode(node)->CentralNode; }
1193b4be Poul Sander 2025-02-03 21:28 3689
    IMGUI_API ImGuiID       DockBuilderAddNode(ImGuiID node_id = 0, ImGuiDockNodeFlags flags = 0);
1193b4be Poul Sander 2025-02-03 21:28 3690
    IMGUI_API void          DockBuilderRemoveNode(ImGuiID node_id);                 // Remove node and all its child, undock all windows
1193b4be Poul Sander 2025-02-03 21:28 3691
    IMGUI_API void          DockBuilderRemoveNodeDockedWindows(ImGuiID node_id, bool clear_settings_refs = true);
1193b4be Poul Sander 2025-02-03 21:28 3692
    IMGUI_API void          DockBuilderRemoveNodeChildNodes(ImGuiID node_id);       // Remove all split/hierarchy. All remaining docked windows will be re-docked to the remaining root node (node_id).
1193b4be Poul Sander 2025-02-03 21:28 3693
    IMGUI_API void          DockBuilderSetNodePos(ImGuiID node_id, ImVec2 pos);
1193b4be Poul Sander 2025-02-03 21:28 3694
    IMGUI_API void          DockBuilderSetNodeSize(ImGuiID node_id, ImVec2 size);
1193b4be Poul Sander 2025-02-03 21:28 3695
    IMGUI_API ImGuiID       DockBuilderSplitNode(ImGuiID node_id, ImGuiDir split_dir, float size_ratio_for_node_at_dir, ImGuiID* out_id_at_dir, ImGuiID* out_id_at_opposite_dir); // Create 2 child nodes in this parent node.
1193b4be Poul Sander 2025-02-03 21:28 3696
    IMGUI_API void          DockBuilderCopyDockSpace(ImGuiID src_dockspace_id, ImGuiID dst_dockspace_id, ImVector<const char*>* in_window_remap_pairs);
1193b4be Poul Sander 2025-02-03 21:28 3697
    IMGUI_API void          DockBuilderCopyNode(ImGuiID src_node_id, ImGuiID dst_node_id, ImVector<ImGuiID>* out_node_remap_pairs);
1193b4be Poul Sander 2025-02-03 21:28 3698
    IMGUI_API void          DockBuilderCopyWindowSettings(const char* src_name, const char* dst_name);
1193b4be Poul Sander 2025-02-03 21:28 3699
    IMGUI_API void          DockBuilderFinish(ImGuiID node_id);
1193b4be Poul Sander 2025-02-03 21:28 3700
1193b4be Poul Sander 2025-02-03 21:28 3701
    // [EXPERIMENTAL] Focus Scope
1193b4be Poul Sander 2025-02-03 21:28 3702
    // This is generally used to identify a unique input location (for e.g. a selection set)
1193b4be Poul Sander 2025-02-03 21:28 3703
    // There is one per window (automatically set in Begin), but:
1193b4be Poul Sander 2025-02-03 21:28 3704
    // - Selection patterns generally need to react (e.g. clear a selection) when landing on one item of the set.
1193b4be Poul Sander 2025-02-03 21:28 3705
    //   So in order to identify a set multiple lists in same window may each need a focus scope.
1193b4be Poul Sander 2025-02-03 21:28 3706
    //   If you imagine an hypothetical BeginSelectionGroup()/EndSelectionGroup() api, it would likely call PushFocusScope()/EndFocusScope()
1193b4be Poul Sander 2025-02-03 21:28 3707
    // - Shortcut routing also use focus scope as a default location identifier if an owner is not provided.
1193b4be Poul Sander 2025-02-03 21:28 3708
    // We don't use the ID Stack for this as it is common to want them separate.
1193b4be Poul Sander 2025-02-03 21:28 3709
    IMGUI_API void          PushFocusScope(ImGuiID id);
1193b4be Poul Sander 2025-02-03 21:28 3710
    IMGUI_API void          PopFocusScope();
1193b4be Poul Sander 2025-02-03 21:28 3711
    inline ImGuiID          GetCurrentFocusScope() { ImGuiContext& g = *GImGui; return g.CurrentFocusScopeId; }   // Focus scope we are outputting into, set by PushFocusScope()
1193b4be Poul Sander 2025-02-03 21:28 3712
1193b4be Poul Sander 2025-02-03 21:28 3713
    // Drag and Drop
1193b4be Poul Sander 2025-02-03 21:28 3714
    IMGUI_API bool          IsDragDropActive();
1193b4be Poul Sander 2025-02-03 21:28 3715
    IMGUI_API bool          BeginDragDropTargetCustom(const ImRect& bb, ImGuiID id);
1193b4be Poul Sander 2025-02-03 21:28 3716
    IMGUI_API void          ClearDragDrop();
1193b4be Poul Sander 2025-02-03 21:28 3717
    IMGUI_API bool          IsDragDropPayloadBeingAccepted();
1193b4be Poul Sander 2025-02-03 21:28 3718
    IMGUI_API void          RenderDragDropTargetRect(const ImRect& bb, const ImRect& item_clip_rect);
1193b4be Poul Sander 2025-02-03 21:28 3719
1193b4be Poul Sander 2025-02-03 21:28 3720
    // Typing-Select API
1193b4be Poul Sander 2025-02-03 21:28 3721
    // (provide Windows Explorer style "select items by typing partial name" + "cycle through items by typing same letter" feature)
1193b4be Poul Sander 2025-02-03 21:28 3722
    // (this is currently not documented nor used by main library, but should work. See "widgets_typingselect" in imgui_test_suite for usage code. Please let us know if you use this!)
1193b4be Poul Sander 2025-02-03 21:28 3723
    IMGUI_API ImGuiTypingSelectRequest* GetTypingSelectRequest(ImGuiTypingSelectFlags flags = ImGuiTypingSelectFlags_None);
1193b4be Poul Sander 2025-02-03 21:28 3724
    IMGUI_API int           TypingSelectFindMatch(ImGuiTypingSelectRequest* req, int items_count, const char* (*get_item_name_func)(void*, int), void* user_data, int nav_item_idx);
1193b4be Poul Sander 2025-02-03 21:28 3725
    IMGUI_API int           TypingSelectFindNextSingleCharMatch(ImGuiTypingSelectRequest* req, int items_count, const char* (*get_item_name_func)(void*, int), void* user_data, int nav_item_idx);
1193b4be Poul Sander 2025-02-03 21:28 3726
    IMGUI_API int           TypingSelectFindBestLeadingMatch(ImGuiTypingSelectRequest* req, int items_count, const char* (*get_item_name_func)(void*, int), void* user_data);
1193b4be Poul Sander 2025-02-03 21:28 3727
1193b4be Poul Sander 2025-02-03 21:28 3728
    // Box-Select API
1193b4be Poul Sander 2025-02-03 21:28 3729
    IMGUI_API bool          BeginBoxSelect(const ImRect& scope_rect, ImGuiWindow* window, ImGuiID box_select_id, ImGuiMultiSelectFlags ms_flags);
1193b4be Poul Sander 2025-02-03 21:28 3730
    IMGUI_API void          EndBoxSelect(const ImRect& scope_rect, ImGuiMultiSelectFlags ms_flags);
1193b4be Poul Sander 2025-02-03 21:28 3731
1193b4be Poul Sander 2025-02-03 21:28 3732
    // Multi-Select API
1193b4be Poul Sander 2025-02-03 21:28 3733
    IMGUI_API void          MultiSelectItemHeader(ImGuiID id, bool* p_selected, ImGuiButtonFlags* p_button_flags);
1193b4be Poul Sander 2025-02-03 21:28 3734
    IMGUI_API void          MultiSelectItemFooter(ImGuiID id, bool* p_selected, bool* p_pressed);
1193b4be Poul Sander 2025-02-03 21:28 3735
    IMGUI_API void          MultiSelectAddSetAll(ImGuiMultiSelectTempData* ms, bool selected);
1193b4be Poul Sander 2025-02-03 21:28 3736
    IMGUI_API void          MultiSelectAddSetRange(ImGuiMultiSelectTempData* ms, bool selected, int range_dir, ImGuiSelectionUserData first_item, ImGuiSelectionUserData last_item);
1193b4be Poul Sander 2025-02-03 21:28 3737
    inline ImGuiBoxSelectState*     GetBoxSelectState(ImGuiID id)   { ImGuiContext& g = *GImGui; return (id != 0 && g.BoxSelectState.ID == id && g.BoxSelectState.IsActive) ? &g.BoxSelectState : NULL; }
1193b4be Poul Sander 2025-02-03 21:28 3738
    inline ImGuiMultiSelectState*   GetMultiSelectState(ImGuiID id) { ImGuiContext& g = *GImGui; return g.MultiSelectStorage.GetByKey(id); }
1193b4be Poul Sander 2025-02-03 21:28 3739
1193b4be Poul Sander 2025-02-03 21:28 3740
    // Internal Columns API (this is not exposed because we will encourage transitioning to the Tables API)
1193b4be Poul Sander 2025-02-03 21:28 3741
    IMGUI_API void          SetWindowClipRectBeforeSetChannel(ImGuiWindow* window, const ImRect& clip_rect);
1193b4be Poul Sander 2025-02-03 21:28 3742
    IMGUI_API void          BeginColumns(const char* str_id, int count, ImGuiOldColumnFlags flags = 0); // setup number of columns. use an identifier to distinguish multiple column sets. close with EndColumns().
1193b4be Poul Sander 2025-02-03 21:28 3743
    IMGUI_API void          EndColumns();                                                               // close columns
1193b4be Poul Sander 2025-02-03 21:28 3744
    IMGUI_API void          PushColumnClipRect(int column_index);
1193b4be Poul Sander 2025-02-03 21:28 3745
    IMGUI_API void          PushColumnsBackground();
1193b4be Poul Sander 2025-02-03 21:28 3746
    IMGUI_API void          PopColumnsBackground();
1193b4be Poul Sander 2025-02-03 21:28 3747
    IMGUI_API ImGuiID       GetColumnsID(const char* str_id, int count);
1193b4be Poul Sander 2025-02-03 21:28 3748
    IMGUI_API ImGuiOldColumns* FindOrCreateColumns(ImGuiWindow* window, ImGuiID id);
1193b4be Poul Sander 2025-02-03 21:28 3749
    IMGUI_API float         GetColumnOffsetFromNorm(const ImGuiOldColumns* columns, float offset_norm);
1193b4be Poul Sander 2025-02-03 21:28 3750
    IMGUI_API float         GetColumnNormFromOffset(const ImGuiOldColumns* columns, float offset);
1193b4be Poul Sander 2025-02-03 21:28 3751
1193b4be Poul Sander 2025-02-03 21:28 3752
    // Tables: Candidates for public API
1193b4be Poul Sander 2025-02-03 21:28 3753
    IMGUI_API void          TableOpenContextMenu(int column_n = -1);
1193b4be Poul Sander 2025-02-03 21:28 3754
    IMGUI_API void          TableSetColumnWidth(int column_n, float width);
1193b4be Poul Sander 2025-02-03 21:28 3755
    IMGUI_API void          TableSetColumnSortDirection(int column_n, ImGuiSortDirection sort_direction, bool append_to_sort_specs);
1193b4be Poul Sander 2025-02-03 21:28 3756
    IMGUI_API int           TableGetHoveredRow();       // Retrieve *PREVIOUS FRAME* hovered row. This difference with TableGetHoveredColumn() is the reason why this is not public yet.
1193b4be Poul Sander 2025-02-03 21:28 3757
    IMGUI_API float         TableGetHeaderRowHeight();
1193b4be Poul Sander 2025-02-03 21:28 3758
    IMGUI_API float         TableGetHeaderAngledMaxLabelWidth();
1193b4be Poul Sander 2025-02-03 21:28 3759
    IMGUI_API void          TablePushBackgroundChannel();
1193b4be Poul Sander 2025-02-03 21:28 3760
    IMGUI_API void          TablePopBackgroundChannel();
4e9e2555 Poul Sander 2025-10-05 10:15 3761
    IMGUI_API void          TablePushColumnChannel(int column_n);
4e9e2555 Poul Sander 2025-10-05 10:15 3762
    IMGUI_API void          TablePopColumnChannel();
1193b4be Poul Sander 2025-02-03 21:28 3763
    IMGUI_API void          TableAngledHeadersRowEx(ImGuiID row_id, float angle, float max_label_width, const ImGuiTableHeaderData* data, int data_count);
1193b4be Poul Sander 2025-02-03 21:28 3764
1193b4be Poul Sander 2025-02-03 21:28 3765
    // Tables: Internals
1193b4be Poul Sander 2025-02-03 21:28 3766
    inline    ImGuiTable*   GetCurrentTable() { ImGuiContext& g = *GImGui; return g.CurrentTable; }
1193b4be Poul Sander 2025-02-03 21:28 3767
    IMGUI_API ImGuiTable*   TableFindByID(ImGuiID id);
1193b4be Poul Sander 2025-02-03 21:28 3768
    IMGUI_API bool          BeginTableEx(const char* name, ImGuiID id, int columns_count, ImGuiTableFlags flags = 0, const ImVec2& outer_size = ImVec2(0, 0), float inner_width = 0.0f);
1193b4be Poul Sander 2025-02-03 21:28 3769
    IMGUI_API void          TableBeginInitMemory(ImGuiTable* table, int columns_count);
1193b4be Poul Sander 2025-02-03 21:28 3770
    IMGUI_API void          TableBeginApplyRequests(ImGuiTable* table);
1193b4be Poul Sander 2025-02-03 21:28 3771
    IMGUI_API void          TableSetupDrawChannels(ImGuiTable* table);
1193b4be Poul Sander 2025-02-03 21:28 3772
    IMGUI_API void          TableUpdateLayout(ImGuiTable* table);
1193b4be Poul Sander 2025-02-03 21:28 3773
    IMGUI_API void          TableUpdateBorders(ImGuiTable* table);
1193b4be Poul Sander 2025-02-03 21:28 3774
    IMGUI_API void          TableUpdateColumnsWeightFromWidth(ImGuiTable* table);
1193b4be Poul Sander 2025-02-03 21:28 3775
    IMGUI_API void          TableDrawBorders(ImGuiTable* table);
1193b4be Poul Sander 2025-02-03 21:28 3776
    IMGUI_API void          TableDrawDefaultContextMenu(ImGuiTable* table, ImGuiTableFlags flags_for_section_to_display);
1193b4be Poul Sander 2025-02-03 21:28 3777
    IMGUI_API bool          TableBeginContextMenuPopup(ImGuiTable* table);
1193b4be Poul Sander 2025-02-03 21:28 3778
    IMGUI_API void          TableMergeDrawChannels(ImGuiTable* table);
1193b4be Poul Sander 2025-02-03 21:28 3779
    inline ImGuiTableInstanceData*  TableGetInstanceData(ImGuiTable* table, int instance_no) { if (instance_no == 0) return &table->InstanceDataFirst; return &table->InstanceDataExtra[instance_no - 1]; }
1193b4be Poul Sander 2025-02-03 21:28 3780
    inline ImGuiID                  TableGetInstanceID(ImGuiTable* table, int instance_no)   { return TableGetInstanceData(table, instance_no)->TableInstanceID; }
1193b4be Poul Sander 2025-02-03 21:28 3781
    IMGUI_API void          TableSortSpecsSanitize(ImGuiTable* table);
1193b4be Poul Sander 2025-02-03 21:28 3782
    IMGUI_API void          TableSortSpecsBuild(ImGuiTable* table);
1193b4be Poul Sander 2025-02-03 21:28 3783
    IMGUI_API ImGuiSortDirection TableGetColumnNextSortDirection(ImGuiTableColumn* column);
1193b4be Poul Sander 2025-02-03 21:28 3784
    IMGUI_API void          TableFixColumnSortDirection(ImGuiTable* table, ImGuiTableColumn* column);
1193b4be Poul Sander 2025-02-03 21:28 3785
    IMGUI_API float         TableGetColumnWidthAuto(ImGuiTable* table, ImGuiTableColumn* column);
1193b4be Poul Sander 2025-02-03 21:28 3786
    IMGUI_API void          TableBeginRow(ImGuiTable* table);
1193b4be Poul Sander 2025-02-03 21:28 3787
    IMGUI_API void          TableEndRow(ImGuiTable* table);
1193b4be Poul Sander 2025-02-03 21:28 3788
    IMGUI_API void          TableBeginCell(ImGuiTable* table, int column_n);
1193b4be Poul Sander 2025-02-03 21:28 3789
    IMGUI_API void          TableEndCell(ImGuiTable* table);
1193b4be Poul Sander 2025-02-03 21:28 3790
    IMGUI_API ImRect        TableGetCellBgRect(const ImGuiTable* table, int column_n);
1193b4be Poul Sander 2025-02-03 21:28 3791
    IMGUI_API const char*   TableGetColumnName(const ImGuiTable* table, int column_n);
1193b4be Poul Sander 2025-02-03 21:28 3792
    IMGUI_API ImGuiID       TableGetColumnResizeID(ImGuiTable* table, int column_n, int instance_no = 0);
1193b4be Poul Sander 2025-02-03 21:28 3793
    IMGUI_API float         TableCalcMaxColumnWidth(const ImGuiTable* table, int column_n);
1193b4be Poul Sander 2025-02-03 21:28 3794
    IMGUI_API void          TableSetColumnWidthAutoSingle(ImGuiTable* table, int column_n);
1193b4be Poul Sander 2025-02-03 21:28 3795
    IMGUI_API void          TableSetColumnWidthAutoAll(ImGuiTable* table);
1193b4be Poul Sander 2025-02-03 21:28 3796
    IMGUI_API void          TableRemove(ImGuiTable* table);
1193b4be Poul Sander 2025-02-03 21:28 3797
    IMGUI_API void          TableGcCompactTransientBuffers(ImGuiTable* table);
1193b4be Poul Sander 2025-02-03 21:28 3798
    IMGUI_API void          TableGcCompactTransientBuffers(ImGuiTableTempData* table);
1193b4be Poul Sander 2025-02-03 21:28 3799
    IMGUI_API void          TableGcCompactSettings();
1193b4be Poul Sander 2025-02-03 21:28 3800
1193b4be Poul Sander 2025-02-03 21:28 3801
    // Tables: Settings
1193b4be Poul Sander 2025-02-03 21:28 3802
    IMGUI_API void                  TableLoadSettings(ImGuiTable* table);
1193b4be Poul Sander 2025-02-03 21:28 3803
    IMGUI_API void                  TableSaveSettings(ImGuiTable* table);
1193b4be Poul Sander 2025-02-03 21:28 3804
    IMGUI_API void                  TableResetSettings(ImGuiTable* table);
1193b4be Poul Sander 2025-02-03 21:28 3805
    IMGUI_API ImGuiTableSettings*   TableGetBoundSettings(ImGuiTable* table);
1193b4be Poul Sander 2025-02-03 21:28 3806
    IMGUI_API void                  TableSettingsAddSettingsHandler();
1193b4be Poul Sander 2025-02-03 21:28 3807
    IMGUI_API ImGuiTableSettings*   TableSettingsCreate(ImGuiID id, int columns_count);
1193b4be Poul Sander 2025-02-03 21:28 3808
    IMGUI_API ImGuiTableSettings*   TableSettingsFindByID(ImGuiID id);
1193b4be Poul Sander 2025-02-03 21:28 3809
1193b4be Poul Sander 2025-02-03 21:28 3810
    // Tab Bars
1193b4be Poul Sander 2025-02-03 21:28 3811
    inline    ImGuiTabBar*  GetCurrentTabBar() { ImGuiContext& g = *GImGui; return g.CurrentTabBar; }
4e9e2555 Poul Sander 2025-10-05 10:15 3812
    IMGUI_API ImGuiTabBar*  TabBarFindByID(ImGuiID id);
4e9e2555 Poul Sander 2025-10-05 10:15 3813
    IMGUI_API void          TabBarRemove(ImGuiTabBar* tab_bar);
1193b4be Poul Sander 2025-02-03 21:28 3814
    IMGUI_API bool          BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& bb, ImGuiTabBarFlags flags);
1193b4be Poul Sander 2025-02-03 21:28 3815
    IMGUI_API ImGuiTabItem* TabBarFindTabByID(ImGuiTabBar* tab_bar, ImGuiID tab_id);
1193b4be Poul Sander 2025-02-03 21:28 3816
    IMGUI_API ImGuiTabItem* TabBarFindTabByOrder(ImGuiTabBar* tab_bar, int order);
1193b4be Poul Sander 2025-02-03 21:28 3817
    IMGUI_API ImGuiTabItem* TabBarFindMostRecentlySelectedTabForActiveWindow(ImGuiTabBar* tab_bar);
1193b4be Poul Sander 2025-02-03 21:28 3818
    IMGUI_API ImGuiTabItem* TabBarGetCurrentTab(ImGuiTabBar* tab_bar);
1193b4be Poul Sander 2025-02-03 21:28 3819
    inline int              TabBarGetTabOrder(ImGuiTabBar* tab_bar, ImGuiTabItem* tab) { return tab_bar->Tabs.index_from_ptr(tab); }
1193b4be Poul Sander 2025-02-03 21:28 3820
    IMGUI_API const char*   TabBarGetTabName(ImGuiTabBar* tab_bar, ImGuiTabItem* tab);
1193b4be Poul Sander 2025-02-03 21:28 3821
    IMGUI_API void          TabBarAddTab(ImGuiTabBar* tab_bar, ImGuiTabItemFlags tab_flags, ImGuiWindow* window);
1193b4be Poul Sander 2025-02-03 21:28 3822
    IMGUI_API void          TabBarRemoveTab(ImGuiTabBar* tab_bar, ImGuiID tab_id);
1193b4be Poul Sander 2025-02-03 21:28 3823
    IMGUI_API void          TabBarCloseTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab);
1193b4be Poul Sander 2025-02-03 21:28 3824
    IMGUI_API void          TabBarQueueFocus(ImGuiTabBar* tab_bar, ImGuiTabItem* tab);
1193b4be Poul Sander 2025-02-03 21:28 3825
    IMGUI_API void          TabBarQueueFocus(ImGuiTabBar* tab_bar, const char* tab_name);
1193b4be Poul Sander 2025-02-03 21:28 3826
    IMGUI_API void          TabBarQueueReorder(ImGuiTabBar* tab_bar, ImGuiTabItem* tab, int offset);
1193b4be Poul Sander 2025-02-03 21:28 3827
    IMGUI_API void          TabBarQueueReorderFromMousePos(ImGuiTabBar* tab_bar, ImGuiTabItem* tab, ImVec2 mouse_pos);
1193b4be Poul Sander 2025-02-03 21:28 3828
    IMGUI_API bool          TabBarProcessReorder(ImGuiTabBar* tab_bar);
1193b4be Poul Sander 2025-02-03 21:28 3829
    IMGUI_API bool          TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, ImGuiTabItemFlags flags, ImGuiWindow* docked_window);
4e9e2555 Poul Sander 2025-10-05 10:15 3830
    IMGUI_API void          TabItemSpacing(const char* str_id, ImGuiTabItemFlags flags, float width);
1193b4be Poul Sander 2025-02-03 21:28 3831
    IMGUI_API ImVec2        TabItemCalcSize(const char* label, bool has_close_button_or_unsaved_marker);
1193b4be Poul Sander 2025-02-03 21:28 3832
    IMGUI_API ImVec2        TabItemCalcSize(ImGuiWindow* window);
1193b4be Poul Sander 2025-02-03 21:28 3833
    IMGUI_API void          TabItemBackground(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImU32 col);
1193b4be Poul Sander 2025-02-03 21:28 3834
    IMGUI_API void          TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImVec2 frame_padding, const char* label, ImGuiID tab_id, ImGuiID close_button_id, bool is_contents_visible, bool* out_just_closed, bool* out_text_clipped);
1193b4be Poul Sander 2025-02-03 21:28 3835
1193b4be Poul Sander 2025-02-03 21:28 3836
    // Render helpers
1193b4be Poul Sander 2025-02-03 21:28 3837
    // AVOID USING OUTSIDE OF IMGUI.CPP! NOT FOR PUBLIC CONSUMPTION. THOSE FUNCTIONS ARE A MESS. THEIR SIGNATURE AND BEHAVIOR WILL CHANGE, THEY NEED TO BE REFACTORED INTO SOMETHING DECENT.
1193b4be Poul Sander 2025-02-03 21:28 3838
    // NB: All position are in absolute pixels coordinates (we are never using window coordinates internally)
1193b4be Poul Sander 2025-02-03 21:28 3839
    IMGUI_API void          RenderText(ImVec2 pos, const char* text, const char* text_end = NULL, bool hide_text_after_hash = true);
1193b4be Poul Sander 2025-02-03 21:28 3840
    IMGUI_API void          RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end, float wrap_width);
1193b4be Poul Sander 2025-02-03 21:28 3841
    IMGUI_API void          RenderTextClipped(const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align = ImVec2(0, 0), const ImRect* clip_rect = NULL);
1193b4be Poul Sander 2025-02-03 21:28 3842
    IMGUI_API void          RenderTextClippedEx(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align = ImVec2(0, 0), const ImRect* clip_rect = NULL);
4e9e2555 Poul Sander 2025-10-05 10:15 3843
    IMGUI_API void          RenderTextEllipsis(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, float ellipsis_max_x, const char* text, const char* text_end, const ImVec2* text_size_if_known);
1193b4be Poul Sander 2025-02-03 21:28 3844
    IMGUI_API void          RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool borders = true, float rounding = 0.0f);
1193b4be Poul Sander 2025-02-03 21:28 3845
    IMGUI_API void          RenderFrameBorder(ImVec2 p_min, ImVec2 p_max, float rounding = 0.0f);
1193b4be Poul Sander 2025-02-03 21:28 3846
    IMGUI_API void          RenderColorRectWithAlphaCheckerboard(ImDrawList* draw_list, ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, float grid_step, ImVec2 grid_off, float rounding = 0.0f, ImDrawFlags flags = 0);
1193b4be Poul Sander 2025-02-03 21:28 3847
    IMGUI_API void          RenderNavCursor(const ImRect& bb, ImGuiID id, ImGuiNavRenderCursorFlags flags = ImGuiNavRenderCursorFlags_None); // Navigation highlight
1193b4be Poul Sander 2025-02-03 21:28 3848
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
1193b4be Poul Sander 2025-02-03 21:28 3849
    inline    void          RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavRenderCursorFlags flags = ImGuiNavRenderCursorFlags_None) { RenderNavCursor(bb, id, flags); } // Renamed in 1.91.4
1193b4be Poul Sander 2025-02-03 21:28 3850
#endif
1193b4be Poul Sander 2025-02-03 21:28 3851
    IMGUI_API const char*   FindRenderedTextEnd(const char* text, const char* text_end = NULL); // Find the optional ## from which we stop displaying text.
1193b4be Poul Sander 2025-02-03 21:28 3852
    IMGUI_API void          RenderMouseCursor(ImVec2 pos, float scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow);
1193b4be Poul Sander 2025-02-03 21:28 3853
1193b4be Poul Sander 2025-02-03 21:28 3854
    // Render helpers (those functions don't access any ImGui state!)
1193b4be Poul Sander 2025-02-03 21:28 3855
    IMGUI_API void          RenderArrow(ImDrawList* draw_list, ImVec2 pos, ImU32 col, ImGuiDir dir, float scale = 1.0f);
1193b4be Poul Sander 2025-02-03 21:28 3856
    IMGUI_API void          RenderBullet(ImDrawList* draw_list, ImVec2 pos, ImU32 col);
1193b4be Poul Sander 2025-02-03 21:28 3857
    IMGUI_API void          RenderCheckMark(ImDrawList* draw_list, ImVec2 pos, ImU32 col, float sz);
1193b4be Poul Sander 2025-02-03 21:28 3858
    IMGUI_API void          RenderArrowPointingAt(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, ImGuiDir direction, ImU32 col);
1193b4be Poul Sander 2025-02-03 21:28 3859
    IMGUI_API void          RenderArrowDockMenu(ImDrawList* draw_list, ImVec2 p_min, float sz, ImU32 col);
1193b4be Poul Sander 2025-02-03 21:28 3860
    IMGUI_API void          RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, ImU32 col, float x_start_norm, float x_end_norm, float rounding);
1193b4be Poul Sander 2025-02-03 21:28 3861
    IMGUI_API void          RenderRectFilledWithHole(ImDrawList* draw_list, const ImRect& outer, const ImRect& inner, ImU32 col, float rounding);
1193b4be Poul Sander 2025-02-03 21:28 3862
    IMGUI_API ImDrawFlags   CalcRoundingFlagsForRectInRect(const ImRect& r_in, const ImRect& r_outer, float threshold);
1193b4be Poul Sander 2025-02-03 21:28 3863
4e9e2555 Poul Sander 2025-10-05 10:15 3864
    // Widgets: Text
1193b4be Poul Sander 2025-02-03 21:28 3865
    IMGUI_API void          TextEx(const char* text, const char* text_end = NULL, ImGuiTextFlags flags = 0);
4e9e2555 Poul Sander 2025-10-05 10:15 3866
    IMGUI_API void          TextAligned(float align_x, float size_x, const char* fmt, ...);               // FIXME-WIP: Works but API is likely to be reworked. This is designed for 1 item on the line. (#7024)
4e9e2555 Poul Sander 2025-10-05 10:15 3867
    IMGUI_API void          TextAlignedV(float align_x, float size_x, const char* fmt, va_list args);
4e9e2555 Poul Sander 2025-10-05 10:15 3868
4e9e2555 Poul Sander 2025-10-05 10:15 3869
    // Widgets
1193b4be Poul Sander 2025-02-03 21:28 3870
    IMGUI_API bool          ButtonEx(const char* label, const ImVec2& size_arg = ImVec2(0, 0), ImGuiButtonFlags flags = 0);
1193b4be Poul Sander 2025-02-03 21:28 3871
    IMGUI_API bool          ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size_arg, ImGuiButtonFlags flags = 0);
4e9e2555 Poul Sander 2025-10-05 10:15 3872
    IMGUI_API bool          ImageButtonEx(ImGuiID id, ImTextureRef tex_ref, const ImVec2& image_size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& bg_col, const ImVec4& tint_col, ImGuiButtonFlags flags = 0);
1193b4be Poul Sander 2025-02-03 21:28 3873
    IMGUI_API void          SeparatorEx(ImGuiSeparatorFlags flags, float thickness = 1.0f);
1193b4be Poul Sander 2025-02-03 21:28 3874
    IMGUI_API void          SeparatorTextEx(ImGuiID id, const char* label, const char* label_end, float extra_width);
1193b4be Poul Sander 2025-02-03 21:28 3875
    IMGUI_API bool          CheckboxFlags(const char* label, ImS64* flags, ImS64 flags_value);
1193b4be Poul Sander 2025-02-03 21:28 3876
    IMGUI_API bool          CheckboxFlags(const char* label, ImU64* flags, ImU64 flags_value);
1193b4be Poul Sander 2025-02-03 21:28 3877
1193b4be Poul Sander 2025-02-03 21:28 3878
    // Widgets: Window Decorations
1193b4be Poul Sander 2025-02-03 21:28 3879
    IMGUI_API bool          CloseButton(ImGuiID id, const ImVec2& pos);
1193b4be Poul Sander 2025-02-03 21:28 3880
    IMGUI_API bool          CollapseButton(ImGuiID id, const ImVec2& pos, ImGuiDockNode* dock_node);
1193b4be Poul Sander 2025-02-03 21:28 3881
    IMGUI_API void          Scrollbar(ImGuiAxis axis);
4e9e2555 Poul Sander 2025-10-05 10:15 3882
    IMGUI_API bool          ScrollbarEx(const ImRect& bb, ImGuiID id, ImGuiAxis axis, ImS64* p_scroll_v, ImS64 avail_v, ImS64 contents_v, ImDrawFlags draw_rounding_flags = 0);
1193b4be Poul Sander 2025-02-03 21:28 3883
    IMGUI_API ImRect        GetWindowScrollbarRect(ImGuiWindow* window, ImGuiAxis axis);
1193b4be Poul Sander 2025-02-03 21:28 3884
    IMGUI_API ImGuiID       GetWindowScrollbarID(ImGuiWindow* window, ImGuiAxis axis);
1193b4be Poul Sander 2025-02-03 21:28 3885
    IMGUI_API ImGuiID       GetWindowResizeCornerID(ImGuiWindow* window, int n); // 0..3: corners
1193b4be Poul Sander 2025-02-03 21:28 3886
    IMGUI_API ImGuiID       GetWindowResizeBorderID(ImGuiWindow* window, ImGuiDir dir);
1193b4be Poul Sander 2025-02-03 21:28 3887
1193b4be Poul Sander 2025-02-03 21:28 3888
    // Widgets low-level behaviors
1193b4be Poul Sander 2025-02-03 21:28 3889
    IMGUI_API bool          ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags = 0);
1193b4be Poul Sander 2025-02-03 21:28 3890
    IMGUI_API bool          DragBehavior(ImGuiID id, ImGuiDataType data_type, void* p_v, float v_speed, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags);
1193b4be Poul Sander 2025-02-03 21:28 3891
    IMGUI_API bool          SliderBehavior(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, void* p_v, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags, ImRect* out_grab_bb);
1193b4be Poul Sander 2025-02-03 21:28 3892
    IMGUI_API bool          SplitterBehavior(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float* size1, float* size2, float min_size1, float min_size2, float hover_extend = 0.0f, float hover_visibility_delay = 0.0f, ImU32 bg_col = 0);
1193b4be Poul Sander 2025-02-03 21:28 3893
1193b4be Poul Sander 2025-02-03 21:28 3894
    // Widgets: Tree Nodes
1193b4be Poul Sander 2025-02-03 21:28 3895
    IMGUI_API bool          TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* label, const char* label_end = NULL);
4e9e2555 Poul Sander 2025-10-05 10:15 3896
    IMGUI_API void          TreeNodeDrawLineToChildNode(const ImVec2& target_pos);
4e9e2555 Poul Sander 2025-10-05 10:15 3897
    IMGUI_API void          TreeNodeDrawLineToTreePop(const ImGuiTreeNodeStackData* data);
1193b4be Poul Sander 2025-02-03 21:28 3898
    IMGUI_API void          TreePushOverrideID(ImGuiID id);
1193b4be Poul Sander 2025-02-03 21:28 3899
    IMGUI_API bool          TreeNodeGetOpen(ImGuiID storage_id);
1193b4be Poul Sander 2025-02-03 21:28 3900
    IMGUI_API void          TreeNodeSetOpen(ImGuiID storage_id, bool open);
1193b4be Poul Sander 2025-02-03 21:28 3901
    IMGUI_API bool          TreeNodeUpdateNextOpen(ImGuiID storage_id, ImGuiTreeNodeFlags flags);   // Return open state. Consume previous SetNextItemOpen() data, if any. May return true when logging.
1193b4be Poul Sander 2025-02-03 21:28 3902
1193b4be Poul Sander 2025-02-03 21:28 3903
    // Template functions are instantiated in imgui_widgets.cpp for a finite number of types.
1193b4be Poul Sander 2025-02-03 21:28 3904
    // To use them externally (for custom widget) you may need an "extern template" statement in your code in order to link to existing instances and silence Clang warnings (see #2036).
1193b4be Poul Sander 2025-02-03 21:28 3905
    // e.g. " extern template IMGUI_API float RoundScalarWithFormatT<float, float>(const char* format, ImGuiDataType data_type, float v); "
1193b4be Poul Sander 2025-02-03 21:28 3906
    template<typename T, typename SIGNED_T, typename FLOAT_T>   IMGUI_API float ScaleRatioFromValueT(ImGuiDataType data_type, T v, T v_min, T v_max, bool is_logarithmic, float logarithmic_zero_epsilon, float zero_deadzone_size);
1193b4be Poul Sander 2025-02-03 21:28 3907
    template<typename T, typename SIGNED_T, typename FLOAT_T>   IMGUI_API T     ScaleValueFromRatioT(ImGuiDataType data_type, float t, T v_min, T v_max, bool is_logarithmic, float logarithmic_zero_epsilon, float zero_deadzone_size);
1193b4be Poul Sander 2025-02-03 21:28 3908
    template<typename T, typename SIGNED_T, typename FLOAT_T>   IMGUI_API bool  DragBehaviorT(ImGuiDataType data_type, T* v, float v_speed, T v_min, T v_max, const char* format, ImGuiSliderFlags flags);
1193b4be Poul Sander 2025-02-03 21:28 3909
    template<typename T, typename SIGNED_T, typename FLOAT_T>   IMGUI_API bool  SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, T* v, T v_min, T v_max, const char* format, ImGuiSliderFlags flags, ImRect* out_grab_bb);
1193b4be Poul Sander 2025-02-03 21:28 3910
    template<typename T>                                        IMGUI_API T     RoundScalarWithFormatT(const char* format, ImGuiDataType data_type, T v);
1193b4be Poul Sander 2025-02-03 21:28 3911
    template<typename T>                                        IMGUI_API bool  CheckboxFlagsT(const char* label, T* flags, T flags_value);
1193b4be Poul Sander 2025-02-03 21:28 3912
1193b4be Poul Sander 2025-02-03 21:28 3913
    // Data type helpers
1193b4be Poul Sander 2025-02-03 21:28 3914
    IMGUI_API const ImGuiDataTypeInfo*  DataTypeGetInfo(ImGuiDataType data_type);
1193b4be Poul Sander 2025-02-03 21:28 3915
    IMGUI_API int           DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* p_data, const char* format);
1193b4be Poul Sander 2025-02-03 21:28 3916
    IMGUI_API void          DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, const void* arg_1, const void* arg_2);
1193b4be Poul Sander 2025-02-03 21:28 3917
    IMGUI_API bool          DataTypeApplyFromText(const char* buf, ImGuiDataType data_type, void* p_data, const char* format, void* p_data_when_empty = NULL);
1193b4be Poul Sander 2025-02-03 21:28 3918
    IMGUI_API int           DataTypeCompare(ImGuiDataType data_type, const void* arg_1, const void* arg_2);
1193b4be Poul Sander 2025-02-03 21:28 3919
    IMGUI_API bool          DataTypeClamp(ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max);
1193b4be Poul Sander 2025-02-03 21:28 3920
    IMGUI_API bool          DataTypeIsZero(ImGuiDataType data_type, const void* p_data);
1193b4be Poul Sander 2025-02-03 21:28 3921
1193b4be Poul Sander 2025-02-03 21:28 3922
    // InputText
1193b4be Poul Sander 2025-02-03 21:28 3923
    IMGUI_API bool          InputTextEx(const char* label, const char* hint, char* buf, int buf_size, const ImVec2& size_arg, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback = NULL, void* user_data = NULL);
1193b4be Poul Sander 2025-02-03 21:28 3924
    IMGUI_API void          InputTextDeactivateHook(ImGuiID id);
1193b4be Poul Sander 2025-02-03 21:28 3925
    IMGUI_API bool          TempInputText(const ImRect& bb, ImGuiID id, const char* label, char* buf, int buf_size, ImGuiInputTextFlags flags);
1193b4be Poul Sander 2025-02-03 21:28 3926
    IMGUI_API bool          TempInputScalar(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* p_data, const char* format, const void* p_clamp_min = NULL, const void* p_clamp_max = NULL);
1193b4be Poul Sander 2025-02-03 21:28 3927
    inline bool             TempInputIsActive(ImGuiID id)       { ImGuiContext& g = *GImGui; return (g.ActiveId == id && g.TempInputId == id); }
1193b4be Poul Sander 2025-02-03 21:28 3928
    inline ImGuiInputTextState* GetInputTextState(ImGuiID id)   { ImGuiContext& g = *GImGui; return (id != 0 && g.InputTextState.ID == id) ? &g.InputTextState : NULL; } // Get input text state if active
1193b4be Poul Sander 2025-02-03 21:28 3929
    IMGUI_API void          SetNextItemRefVal(ImGuiDataType data_type, void* p_data);
4e9e2555 Poul Sander 2025-10-05 10:15 3930
    inline bool             IsItemActiveAsInputText() { ImGuiContext& g = *GImGui; return g.ActiveId != 0 && g.ActiveId == g.LastItemData.ID && g.InputTextState.ID == g.LastItemData.ID; } // This may be useful to apply workaround that a based on distinguish whenever an item is active as a text input field.
1193b4be Poul Sander 2025-02-03 21:28 3931
1193b4be Poul Sander 2025-02-03 21:28 3932
    // Color
1193b4be Poul Sander 2025-02-03 21:28 3933
    IMGUI_API void          ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags flags);
1193b4be Poul Sander 2025-02-03 21:28 3934
    IMGUI_API void          ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags);
1193b4be Poul Sander 2025-02-03 21:28 3935
    IMGUI_API void          ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags flags);
1193b4be Poul Sander 2025-02-03 21:28 3936
1193b4be Poul Sander 2025-02-03 21:28 3937
    // Plot
1193b4be Poul Sander 2025-02-03 21:28 3938
    IMGUI_API int           PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, const ImVec2& size_arg);
1193b4be Poul Sander 2025-02-03 21:28 3939
1193b4be Poul Sander 2025-02-03 21:28 3940
    // Shade functions (write over already created vertices)
1193b4be Poul Sander 2025-02-03 21:28 3941
    IMGUI_API void          ShadeVertsLinearColorGradientKeepAlpha(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, ImVec2 gradient_p0, ImVec2 gradient_p1, ImU32 col0, ImU32 col1);
1193b4be Poul Sander 2025-02-03 21:28 3942
    IMGUI_API void          ShadeVertsLinearUV(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, bool clamp);
1193b4be Poul Sander 2025-02-03 21:28 3943
    IMGUI_API void          ShadeVertsTransformPos(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, const ImVec2& pivot_in, float cos_a, float sin_a, const ImVec2& pivot_out);
1193b4be Poul Sander 2025-02-03 21:28 3944
1193b4be Poul Sander 2025-02-03 21:28 3945
    // Garbage collection
1193b4be Poul Sander 2025-02-03 21:28 3946
    IMGUI_API void          GcCompactTransientMiscBuffers();
1193b4be Poul Sander 2025-02-03 21:28 3947
    IMGUI_API void          GcCompactTransientWindowBuffers(ImGuiWindow* window);
1193b4be Poul Sander 2025-02-03 21:28 3948
    IMGUI_API void          GcAwakeTransientWindowBuffers(ImGuiWindow* window);
1193b4be Poul Sander 2025-02-03 21:28 3949
1193b4be Poul Sander 2025-02-03 21:28 3950
    // Error handling, State Recovery
1193b4be Poul Sander 2025-02-03 21:28 3951
    IMGUI_API bool          ErrorLog(const char* msg);
1193b4be Poul Sander 2025-02-03 21:28 3952
    IMGUI_API void          ErrorRecoveryStoreState(ImGuiErrorRecoveryState* state_out);
1193b4be Poul Sander 2025-02-03 21:28 3953
    IMGUI_API void          ErrorRecoveryTryToRecoverState(const ImGuiErrorRecoveryState* state_in);
1193b4be Poul Sander 2025-02-03 21:28 3954
    IMGUI_API void          ErrorRecoveryTryToRecoverWindowState(const ImGuiErrorRecoveryState* state_in);
1193b4be Poul Sander 2025-02-03 21:28 3955
    IMGUI_API void          ErrorCheckUsingSetCursorPosToExtendParentBoundaries();
1193b4be Poul Sander 2025-02-03 21:28 3956
    IMGUI_API void          ErrorCheckEndFrameFinalizeErrorTooltip();
1193b4be Poul Sander 2025-02-03 21:28 3957
    IMGUI_API bool          BeginErrorTooltip();
1193b4be Poul Sander 2025-02-03 21:28 3958
    IMGUI_API void          EndErrorTooltip();
1193b4be Poul Sander 2025-02-03 21:28 3959
1193b4be Poul Sander 2025-02-03 21:28 3960
    // Debug Tools
1193b4be Poul Sander 2025-02-03 21:28 3961
    IMGUI_API void          DebugAllocHook(ImGuiDebugAllocInfo* info, int frame_count, void* ptr, size_t size); // size >= 0 : alloc, size = -1 : free
1193b4be Poul Sander 2025-02-03 21:28 3962
    IMGUI_API void          DebugDrawCursorPos(ImU32 col = IM_COL32(255, 0, 0, 255));
1193b4be Poul Sander 2025-02-03 21:28 3963
    IMGUI_API void          DebugDrawLineExtents(ImU32 col = IM_COL32(255, 0, 0, 255));
1193b4be Poul Sander 2025-02-03 21:28 3964
    IMGUI_API void          DebugDrawItemRect(ImU32 col = IM_COL32(255, 0, 0, 255));
1193b4be Poul Sander 2025-02-03 21:28 3965
    IMGUI_API void          DebugTextUnformattedWithLocateItem(const char* line_begin, const char* line_end);
1193b4be Poul Sander 2025-02-03 21:28 3966
    IMGUI_API void          DebugLocateItem(ImGuiID target_id);                     // Call sparingly: only 1 at the same time!
1193b4be Poul Sander 2025-02-03 21:28 3967
    IMGUI_API void          DebugLocateItemOnHover(ImGuiID target_id);              // Only call on reaction to a mouse Hover: because only 1 at the same time!
1193b4be Poul Sander 2025-02-03 21:28 3968
    IMGUI_API void          DebugLocateItemResolveWithLastItem();
1193b4be Poul Sander 2025-02-03 21:28 3969
    IMGUI_API void          DebugBreakClearData();
1193b4be Poul Sander 2025-02-03 21:28 3970
    IMGUI_API bool          DebugBreakButton(const char* label, const char* description_of_location);
1193b4be Poul Sander 2025-02-03 21:28 3971
    IMGUI_API void          DebugBreakButtonTooltip(bool keyboard_only, const char* description_of_location);
1193b4be Poul Sander 2025-02-03 21:28 3972
    IMGUI_API void          ShowFontAtlas(ImFontAtlas* atlas);
1193b4be Poul Sander 2025-02-03 21:28 3973
    IMGUI_API void          DebugHookIdInfo(ImGuiID id, ImGuiDataType data_type, const void* data_id, const void* data_id_end);
1193b4be Poul Sander 2025-02-03 21:28 3974
    IMGUI_API void          DebugNodeColumns(ImGuiOldColumns* columns);
1193b4be Poul Sander 2025-02-03 21:28 3975
    IMGUI_API void          DebugNodeDockNode(ImGuiDockNode* node, const char* label);
1193b4be Poul Sander 2025-02-03 21:28 3976
    IMGUI_API void          DebugNodeDrawList(ImGuiWindow* window, ImGuiViewportP* viewport, const ImDrawList* draw_list, const char* label);
1193b4be Poul Sander 2025-02-03 21:28 3977
    IMGUI_API void          DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList* out_draw_list, const ImDrawList* draw_list, const ImDrawCmd* draw_cmd, bool show_mesh, bool show_aabb);
1193b4be Poul Sander 2025-02-03 21:28 3978
    IMGUI_API void          DebugNodeFont(ImFont* font);
4e9e2555 Poul Sander 2025-10-05 10:15 3979
    IMGUI_API void          DebugNodeFontGlyphesForSrcMask(ImFont* font, ImFontBaked* baked, int src_mask);
1193b4be Poul Sander 2025-02-03 21:28 3980
    IMGUI_API void          DebugNodeFontGlyph(ImFont* font, const ImFontGlyph* glyph);
4e9e2555 Poul Sander 2025-10-05 10:15 3981
    IMGUI_API void          DebugNodeTexture(ImTextureData* tex, int int_id, const ImFontAtlasRect* highlight_rect = NULL); // ID used to facilitate persisting the "current" texture.
1193b4be Poul Sander 2025-02-03 21:28 3982
    IMGUI_API void          DebugNodeStorage(ImGuiStorage* storage, const char* label);
1193b4be Poul Sander 2025-02-03 21:28 3983
    IMGUI_API void          DebugNodeTabBar(ImGuiTabBar* tab_bar, const char* label);
1193b4be Poul Sander 2025-02-03 21:28 3984
    IMGUI_API void          DebugNodeTable(ImGuiTable* table);
1193b4be Poul Sander 2025-02-03 21:28 3985
    IMGUI_API void          DebugNodeTableSettings(ImGuiTableSettings* settings);
1193b4be Poul Sander 2025-02-03 21:28 3986
    IMGUI_API void          DebugNodeInputTextState(ImGuiInputTextState* state);
1193b4be Poul Sander 2025-02-03 21:28 3987
    IMGUI_API void          DebugNodeTypingSelectState(ImGuiTypingSelectState* state);
1193b4be Poul Sander 2025-02-03 21:28 3988
    IMGUI_API void          DebugNodeMultiSelectState(ImGuiMultiSelectState* state);
1193b4be Poul Sander 2025-02-03 21:28 3989
    IMGUI_API void          DebugNodeWindow(ImGuiWindow* window, const char* label);
1193b4be Poul Sander 2025-02-03 21:28 3990
    IMGUI_API void          DebugNodeWindowSettings(ImGuiWindowSettings* settings);
1193b4be Poul Sander 2025-02-03 21:28 3991
    IMGUI_API void          DebugNodeWindowsList(ImVector<ImGuiWindow*>* windows, const char* label);
1193b4be Poul Sander 2025-02-03 21:28 3992
    IMGUI_API void          DebugNodeWindowsListByBeginStackParent(ImGuiWindow** windows, int windows_size, ImGuiWindow* parent_in_begin_stack);
1193b4be Poul Sander 2025-02-03 21:28 3993
    IMGUI_API void          DebugNodeViewport(ImGuiViewportP* viewport);
1193b4be Poul Sander 2025-02-03 21:28 3994
    IMGUI_API void          DebugNodePlatformMonitor(ImGuiPlatformMonitor* monitor, const char* label, int idx);
1193b4be Poul Sander 2025-02-03 21:28 3995
    IMGUI_API void          DebugRenderKeyboardPreview(ImDrawList* draw_list);
1193b4be Poul Sander 2025-02-03 21:28 3996
    IMGUI_API void          DebugRenderViewportThumbnail(ImDrawList* draw_list, ImGuiViewportP* viewport, const ImRect& bb);
1193b4be Poul Sander 2025-02-03 21:28 3997
1193b4be Poul Sander 2025-02-03 21:28 3998
    // Obsolete functions
1193b4be Poul Sander 2025-02-03 21:28 3999
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
1193b4be Poul Sander 2025-02-03 21:28 4000
    //inline void   SetItemUsingMouseWheel()                                            { SetItemKeyOwner(ImGuiKey_MouseWheelY); }      // Changed in 1.89
1193b4be Poul Sander 2025-02-03 21:28 4001
    //inline bool   TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags = 0)    { return TreeNodeUpdateNextOpen(id, flags); }   // Renamed in 1.89
1193b4be Poul Sander 2025-02-03 21:28 4002
    //inline bool   IsKeyPressedMap(ImGuiKey key, bool repeat = true)                   { IM_ASSERT(IsNamedKey(key)); return IsKeyPressed(key, repeat); } // Removed in 1.87: Mapping from named key is always identity!
1193b4be Poul Sander 2025-02-03 21:28 4003
1193b4be Poul Sander 2025-02-03 21:28 4004
    // Refactored focus/nav/tabbing system in 1.82 and 1.84. If you have old/custom copy-and-pasted widgets which used FocusableItemRegister():
1193b4be Poul Sander 2025-02-03 21:28 4005
    //  (Old) IMGUI_VERSION_NUM  < 18209: using 'ItemAdd(....)'                              and 'bool tab_focused = FocusableItemRegister(...)'
1193b4be Poul Sander 2025-02-03 21:28 4006
    //  (Old) IMGUI_VERSION_NUM >= 18209: using 'ItemAdd(..., ImGuiItemAddFlags_Focusable)'  and 'bool tab_focused = (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_Focused) != 0'
1193b4be Poul Sander 2025-02-03 21:28 4007
    //  (New) IMGUI_VERSION_NUM >= 18413: using 'ItemAdd(..., ImGuiItemFlags_Inputable)'     and 'bool tab_focused = (g.NavActivateId == id && (g.NavActivateFlags & ImGuiActivateFlags_PreferInput))'
1193b4be Poul Sander 2025-02-03 21:28 4008
    //inline bool   FocusableItemRegister(ImGuiWindow* window, ImGuiID id)              // -> pass ImGuiItemAddFlags_Inputable flag to ItemAdd()
1193b4be Poul Sander 2025-02-03 21:28 4009
    //inline void   FocusableItemUnregister(ImGuiWindow* window)                        // -> unnecessary: TempInputText() uses ImGuiInputTextFlags_MergedItem
1193b4be Poul Sander 2025-02-03 21:28 4010
#endif
1193b4be Poul Sander 2025-02-03 21:28 4011
1193b4be Poul Sander 2025-02-03 21:28 4012
} // namespace ImGui
1193b4be Poul Sander 2025-02-03 21:28 4013
1193b4be Poul Sander 2025-02-03 21:28 4014
1193b4be Poul Sander 2025-02-03 21:28 4015
//-----------------------------------------------------------------------------
4e9e2555 Poul Sander 2025-10-05 10:15 4016
// [SECTION] ImFontLoader
1193b4be Poul Sander 2025-02-03 21:28 4017
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 4018
4e9e2555 Poul Sander 2025-10-05 10:15 4019
// Hooks and storage for a given font backend.
4e9e2555 Poul Sander 2025-10-05 10:15 4020
// This structure is likely to evolve as we add support for incremental atlas updates.
4e9e2555 Poul Sander 2025-10-05 10:15 4021
// Conceptually this could be public, but API is still going to be evolve.
4e9e2555 Poul Sander 2025-10-05 10:15 4022
struct ImFontLoader
1193b4be Poul Sander 2025-02-03 21:28 4023
{
4e9e2555 Poul Sander 2025-10-05 10:15 4024
    const char*     Name;
4e9e2555 Poul Sander 2025-10-05 10:15 4025
    bool            (*LoaderInit)(ImFontAtlas* atlas);
4e9e2555 Poul Sander 2025-10-05 10:15 4026
    void            (*LoaderShutdown)(ImFontAtlas* atlas);
4e9e2555 Poul Sander 2025-10-05 10:15 4027
    bool            (*FontSrcInit)(ImFontAtlas* atlas, ImFontConfig* src);
4e9e2555 Poul Sander 2025-10-05 10:15 4028
    void            (*FontSrcDestroy)(ImFontAtlas* atlas, ImFontConfig* src);
4e9e2555 Poul Sander 2025-10-05 10:15 4029
    bool            (*FontSrcContainsGlyph)(ImFontAtlas* atlas, ImFontConfig* src, ImWchar codepoint);
4e9e2555 Poul Sander 2025-10-05 10:15 4030
    bool            (*FontBakedInit)(ImFontAtlas* atlas, ImFontConfig* src, ImFontBaked* baked, void* loader_data_for_baked_src);
4e9e2555 Poul Sander 2025-10-05 10:15 4031
    void            (*FontBakedDestroy)(ImFontAtlas* atlas, ImFontConfig* src, ImFontBaked* baked, void* loader_data_for_baked_src);
4e9e2555 Poul Sander 2025-10-05 10:15 4032
    bool            (*FontBakedLoadGlyph)(ImFontAtlas* atlas, ImFontConfig* src, ImFontBaked* baked, void* loader_data_for_baked_src, ImWchar codepoint, ImFontGlyph* out_glyph, float* out_advance_x);
4e9e2555 Poul Sander 2025-10-05 10:15 4033
4e9e2555 Poul Sander 2025-10-05 10:15 4034
    // Size of backend data, Per Baked * Per Source. Buffers are managed by core to avoid excessive allocations.
4e9e2555 Poul Sander 2025-10-05 10:15 4035
    // FIXME: At this point the two other types of buffers may be managed by core to be consistent?
4e9e2555 Poul Sander 2025-10-05 10:15 4036
    size_t          FontBakedSrcLoaderDataSize;
4e9e2555 Poul Sander 2025-10-05 10:15 4037
4e9e2555 Poul Sander 2025-10-05 10:15 4038
    ImFontLoader()  { memset(this, 0, sizeof(*this)); }
1193b4be Poul Sander 2025-02-03 21:28 4039
};
1193b4be Poul Sander 2025-02-03 21:28 4040
1193b4be Poul Sander 2025-02-03 21:28 4041
#ifdef IMGUI_ENABLE_STB_TRUETYPE
4e9e2555 Poul Sander 2025-10-05 10:15 4042
IMGUI_API const ImFontLoader* ImFontAtlasGetFontLoaderForStbTruetype();
4e9e2555 Poul Sander 2025-10-05 10:15 4043
#endif
4e9e2555 Poul Sander 2025-10-05 10:15 4044
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
4e9e2555 Poul Sander 2025-10-05 10:15 4045
typedef ImFontLoader ImFontBuilderIO; // [renamed/changed in 1.92] The types are not actually compatible but we provide this as a compile-time error report helper.
4e9e2555 Poul Sander 2025-10-05 10:15 4046
#endif
4e9e2555 Poul Sander 2025-10-05 10:15 4047
4e9e2555 Poul Sander 2025-10-05 10:15 4048
//-----------------------------------------------------------------------------
4e9e2555 Poul Sander 2025-10-05 10:15 4049
// [SECTION] ImFontAtlas internal API
4e9e2555 Poul Sander 2025-10-05 10:15 4050
//-----------------------------------------------------------------------------
4e9e2555 Poul Sander 2025-10-05 10:15 4051
4e9e2555 Poul Sander 2025-10-05 10:15 4052
#define IMGUI_FONT_SIZE_MAX                                     (512.0f)
4e9e2555 Poul Sander 2025-10-05 10:15 4053
#define IMGUI_FONT_SIZE_THRESHOLD_FOR_LOADADVANCEXONLYMODE      (128.0f)
4e9e2555 Poul Sander 2025-10-05 10:15 4054
4e9e2555 Poul Sander 2025-10-05 10:15 4055
// Helpers: ImTextureRef ==/!= operators provided as convenience
4e9e2555 Poul Sander 2025-10-05 10:15 4056
// (note that _TexID and _TexData are never set simultaneously)
4e9e2555 Poul Sander 2025-10-05 10:15 4057
inline bool operator==(const ImTextureRef& lhs, const ImTextureRef& rhs)    { return lhs._TexID == rhs._TexID && lhs._TexData == rhs._TexData; }
4e9e2555 Poul Sander 2025-10-05 10:15 4058
inline bool operator!=(const ImTextureRef& lhs, const ImTextureRef& rhs)    { return lhs._TexID != rhs._TexID || lhs._TexData != rhs._TexData; }
4e9e2555 Poul Sander 2025-10-05 10:15 4059
4e9e2555 Poul Sander 2025-10-05 10:15 4060
// Refer to ImFontAtlasPackGetRect() to better understand how this works.
4e9e2555 Poul Sander 2025-10-05 10:15 4061
#define ImFontAtlasRectId_IndexMask_        (0x0007FFFF)    // 20-bits signed: index to access builder->RectsIndex[].
4e9e2555 Poul Sander 2025-10-05 10:15 4062
#define ImFontAtlasRectId_GenerationMask_   (0x3FF00000)    // 10-bits: entry generation, so each ID is unique and get can safely detected old identifiers.
4e9e2555 Poul Sander 2025-10-05 10:15 4063
#define ImFontAtlasRectId_GenerationShift_  (20)
4e9e2555 Poul Sander 2025-10-05 10:15 4064
inline int               ImFontAtlasRectId_GetIndex(ImFontAtlasRectId id)       { return (id & ImFontAtlasRectId_IndexMask_); }
4e9e2555 Poul Sander 2025-10-05 10:15 4065
inline unsigned int      ImFontAtlasRectId_GetGeneration(ImFontAtlasRectId id)  { return (unsigned int)(id & ImFontAtlasRectId_GenerationMask_) >> ImFontAtlasRectId_GenerationShift_; }
4e9e2555 Poul Sander 2025-10-05 10:15 4066
inline ImFontAtlasRectId ImFontAtlasRectId_Make(int index_idx, int gen_idx)     { IM_ASSERT(index_idx >= 0 && index_idx <= ImFontAtlasRectId_IndexMask_ && gen_idx <= (ImFontAtlasRectId_GenerationMask_ >> ImFontAtlasRectId_GenerationShift_)); return (ImFontAtlasRectId)(index_idx | (gen_idx << ImFontAtlasRectId_GenerationShift_)); }
4e9e2555 Poul Sander 2025-10-05 10:15 4067
4e9e2555 Poul Sander 2025-10-05 10:15 4068
// Packed rectangle lookup entry (we need an indirection to allow removing/reordering rectangles)
4e9e2555 Poul Sander 2025-10-05 10:15 4069
// User are returned ImFontAtlasRectId values which are meant to be persistent.
4e9e2555 Poul Sander 2025-10-05 10:15 4070
// We handle this with an indirection. While Rects[] may be in theory shuffled, compacted etc., RectsIndex[] cannot it is keyed by ImFontAtlasRectId.
4e9e2555 Poul Sander 2025-10-05 10:15 4071
// RectsIndex[] is used both as an index into Rects[] and an index into itself. This is basically a free-list. See ImFontAtlasBuildAllocRectIndexEntry() code.
4e9e2555 Poul Sander 2025-10-05 10:15 4072
// Having this also makes it easier to e.g. sort rectangles during repack.
4e9e2555 Poul Sander 2025-10-05 10:15 4073
struct ImFontAtlasRectEntry
4e9e2555 Poul Sander 2025-10-05 10:15 4074
{
4e9e2555 Poul Sander 2025-10-05 10:15 4075
    int                 TargetIndex : 20;   // When Used: ImFontAtlasRectId -> into Rects[]. When unused: index to next unused RectsIndex[] slot to consume free-list.
4e9e2555 Poul Sander 2025-10-05 10:15 4076
    unsigned int        Generation : 10;    // Increased each time the entry is reused for a new rectangle.
4e9e2555 Poul Sander 2025-10-05 10:15 4077
    unsigned int        IsUsed : 1;
4e9e2555 Poul Sander 2025-10-05 10:15 4078
};
4e9e2555 Poul Sander 2025-10-05 10:15 4079
4e9e2555 Poul Sander 2025-10-05 10:15 4080
// Data available to potential texture post-processing functions
4e9e2555 Poul Sander 2025-10-05 10:15 4081
struct ImFontAtlasPostProcessData
4e9e2555 Poul Sander 2025-10-05 10:15 4082
{
4e9e2555 Poul Sander 2025-10-05 10:15 4083
    ImFontAtlas*        FontAtlas;
4e9e2555 Poul Sander 2025-10-05 10:15 4084
    ImFont*             Font;
4e9e2555 Poul Sander 2025-10-05 10:15 4085
    ImFontConfig*       FontSrc;
4e9e2555 Poul Sander 2025-10-05 10:15 4086
    ImFontBaked*        FontBaked;
4e9e2555 Poul Sander 2025-10-05 10:15 4087
    ImFontGlyph*        Glyph;
4e9e2555 Poul Sander 2025-10-05 10:15 4088
4e9e2555 Poul Sander 2025-10-05 10:15 4089
    // Pixel data
4e9e2555 Poul Sander 2025-10-05 10:15 4090
    void*               Pixels;
4e9e2555 Poul Sander 2025-10-05 10:15 4091
    ImTextureFormat     Format;
4e9e2555 Poul Sander 2025-10-05 10:15 4092
    int                 Pitch;
4e9e2555 Poul Sander 2025-10-05 10:15 4093
    int                 Width;
4e9e2555 Poul Sander 2025-10-05 10:15 4094
    int                 Height;
4e9e2555 Poul Sander 2025-10-05 10:15 4095
};
4e9e2555 Poul Sander 2025-10-05 10:15 4096
4e9e2555 Poul Sander 2025-10-05 10:15 4097
// We avoid dragging imstb_rectpack.h into public header (partly because binding generators are having issues with it)
4e9e2555 Poul Sander 2025-10-05 10:15 4098
#ifdef IMGUI_STB_NAMESPACE
4e9e2555 Poul Sander 2025-10-05 10:15 4099
namespace IMGUI_STB_NAMESPACE { struct stbrp_node; }
4e9e2555 Poul Sander 2025-10-05 10:15 4100
typedef IMGUI_STB_NAMESPACE::stbrp_node stbrp_node_im;
4e9e2555 Poul Sander 2025-10-05 10:15 4101
#else
4e9e2555 Poul Sander 2025-10-05 10:15 4102
struct stbrp_node;
4e9e2555 Poul Sander 2025-10-05 10:15 4103
typedef stbrp_node stbrp_node_im;
1193b4be Poul Sander 2025-02-03 21:28 4104
#endif
4e9e2555 Poul Sander 2025-10-05 10:15 4105
struct stbrp_context_opaque { char data[80]; };
4e9e2555 Poul Sander 2025-10-05 10:15 4106
4e9e2555 Poul Sander 2025-10-05 10:15 4107
// Internal storage for incrementally packing and building a ImFontAtlas
4e9e2555 Poul Sander 2025-10-05 10:15 4108
struct ImFontAtlasBuilder
4e9e2555 Poul Sander 2025-10-05 10:15 4109
{
4e9e2555 Poul Sander 2025-10-05 10:15 4110
    stbrp_context_opaque        PackContext;            // Actually 'stbrp_context' but we don't want to define this in the header file.
4e9e2555 Poul Sander 2025-10-05 10:15 4111
    ImVector<stbrp_node_im>     PackNodes;
4e9e2555 Poul Sander 2025-10-05 10:15 4112
    ImVector<ImTextureRect>     Rects;
4e9e2555 Poul Sander 2025-10-05 10:15 4113
    ImVector<ImFontAtlasRectEntry> RectsIndex;          // ImFontAtlasRectId -> index into Rects[]
4e9e2555 Poul Sander 2025-10-05 10:15 4114
    ImVector<unsigned char>     TempBuffer;             // Misc scratch buffer
4e9e2555 Poul Sander 2025-10-05 10:15 4115
    int                         RectsIndexFreeListStart;// First unused entry
4e9e2555 Poul Sander 2025-10-05 10:15 4116
    int                         RectsPackedCount;       // Number of packed rectangles.
4e9e2555 Poul Sander 2025-10-05 10:15 4117
    int                         RectsPackedSurface;     // Number of packed pixels. Used when compacting to heuristically find the ideal texture size.
4e9e2555 Poul Sander 2025-10-05 10:15 4118
    int                         RectsDiscardedCount;
4e9e2555 Poul Sander 2025-10-05 10:15 4119
    int                         RectsDiscardedSurface;
4e9e2555 Poul Sander 2025-10-05 10:15 4120
    int                         FrameCount;             // Current frame count
4e9e2555 Poul Sander 2025-10-05 10:15 4121
    ImVec2i                     MaxRectSize;            // Largest rectangle to pack (de-facto used as a "minimum texture size")
4e9e2555 Poul Sander 2025-10-05 10:15 4122
    ImVec2i                     MaxRectBounds;          // Bottom-right most used pixels
4e9e2555 Poul Sander 2025-10-05 10:15 4123
    bool                        LockDisableResize;      // Disable resizing texture
4e9e2555 Poul Sander 2025-10-05 10:15 4124
    bool                        PreloadedAllGlyphsRanges; // Set when missing ImGuiBackendFlags_RendererHasTextures features forces atlas to preload everything.
4e9e2555 Poul Sander 2025-10-05 10:15 4125
4e9e2555 Poul Sander 2025-10-05 10:15 4126
    // Cache of all ImFontBaked
4e9e2555 Poul Sander 2025-10-05 10:15 4127
    ImStableVector<ImFontBaked,32> BakedPool;
4e9e2555 Poul Sander 2025-10-05 10:15 4128
    ImGuiStorage                BakedMap;               // BakedId --> ImFontBaked*
4e9e2555 Poul Sander 2025-10-05 10:15 4129
    int                         BakedDiscardedCount;
4e9e2555 Poul Sander 2025-10-05 10:15 4130
4e9e2555 Poul Sander 2025-10-05 10:15 4131
    // Custom rectangle identifiers
4e9e2555 Poul Sander 2025-10-05 10:15 4132
    ImFontAtlasRectId           PackIdMouseCursors;     // White pixel + mouse cursors. Also happen to be fallback in case of packing failure.
4e9e2555 Poul Sander 2025-10-05 10:15 4133
    ImFontAtlasRectId           PackIdLinesTexData;
4e9e2555 Poul Sander 2025-10-05 10:15 4134
4e9e2555 Poul Sander 2025-10-05 10:15 4135
    ImFontAtlasBuilder()        { memset(this, 0, sizeof(*this)); FrameCount = -1; RectsIndexFreeListStart = -1; PackIdMouseCursors = PackIdLinesTexData = -1; }
4e9e2555 Poul Sander 2025-10-05 10:15 4136
};
4e9e2555 Poul Sander 2025-10-05 10:15 4137
4e9e2555 Poul Sander 2025-10-05 10:15 4138
IMGUI_API void              ImFontAtlasBuildInit(ImFontAtlas* atlas);
4e9e2555 Poul Sander 2025-10-05 10:15 4139
IMGUI_API void              ImFontAtlasBuildDestroy(ImFontAtlas* atlas);
4e9e2555 Poul Sander 2025-10-05 10:15 4140
IMGUI_API void              ImFontAtlasBuildMain(ImFontAtlas* atlas);
4e9e2555 Poul Sander 2025-10-05 10:15 4141
IMGUI_API void              ImFontAtlasBuildSetupFontLoader(ImFontAtlas* atlas, const ImFontLoader* font_loader);
4e9e2555 Poul Sander 2025-10-05 10:15 4142
IMGUI_API void              ImFontAtlasBuildUpdatePointers(ImFontAtlas* atlas);
4e9e2555 Poul Sander 2025-10-05 10:15 4143
IMGUI_API void              ImFontAtlasBuildRenderBitmapFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char);
4e9e2555 Poul Sander 2025-10-05 10:15 4144
IMGUI_API void              ImFontAtlasBuildClear(ImFontAtlas* atlas); // Clear output and custom rects
4e9e2555 Poul Sander 2025-10-05 10:15 4145
4e9e2555 Poul Sander 2025-10-05 10:15 4146
IMGUI_API ImTextureData*    ImFontAtlasTextureAdd(ImFontAtlas* atlas, int w, int h);
4e9e2555 Poul Sander 2025-10-05 10:15 4147
IMGUI_API void              ImFontAtlasTextureMakeSpace(ImFontAtlas* atlas);
4e9e2555 Poul Sander 2025-10-05 10:15 4148
IMGUI_API void              ImFontAtlasTextureRepack(ImFontAtlas* atlas, int w, int h);
4e9e2555 Poul Sander 2025-10-05 10:15 4149
IMGUI_API void              ImFontAtlasTextureGrow(ImFontAtlas* atlas, int old_w = -1, int old_h = -1);
4e9e2555 Poul Sander 2025-10-05 10:15 4150
IMGUI_API void              ImFontAtlasTextureCompact(ImFontAtlas* atlas);
4e9e2555 Poul Sander 2025-10-05 10:15 4151
IMGUI_API ImVec2i           ImFontAtlasTextureGetSizeEstimate(ImFontAtlas* atlas);
4e9e2555 Poul Sander 2025-10-05 10:15 4152
4e9e2555 Poul Sander 2025-10-05 10:15 4153
IMGUI_API void              ImFontAtlasBuildSetupFontSpecialGlyphs(ImFontAtlas* atlas, ImFont* font, ImFontConfig* src);
4e9e2555 Poul Sander 2025-10-05 10:15 4154
IMGUI_API void              ImFontAtlasBuildLegacyPreloadAllGlyphRanges(ImFontAtlas* atlas); // Legacy
4e9e2555 Poul Sander 2025-10-05 10:15 4155
IMGUI_API void              ImFontAtlasBuildGetOversampleFactors(ImFontConfig* src, ImFontBaked* baked, int* out_oversample_h, int* out_oversample_v);
4e9e2555 Poul Sander 2025-10-05 10:15 4156
IMGUI_API void              ImFontAtlasBuildDiscardBakes(ImFontAtlas* atlas, int unused_frames);
4e9e2555 Poul Sander 2025-10-05 10:15 4157
4e9e2555 Poul Sander 2025-10-05 10:15 4158
IMGUI_API bool              ImFontAtlasFontSourceInit(ImFontAtlas* atlas, ImFontConfig* src);
4e9e2555 Poul Sander 2025-10-05 10:15 4159
IMGUI_API void              ImFontAtlasFontSourceAddToFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* src);
4e9e2555 Poul Sander 2025-10-05 10:15 4160
IMGUI_API void              ImFontAtlasFontDestroySourceData(ImFontAtlas* atlas, ImFontConfig* src);
4e9e2555 Poul Sander 2025-10-05 10:15 4161
IMGUI_API bool              ImFontAtlasFontInitOutput(ImFontAtlas* atlas, ImFont* font); // Using FontDestroyOutput/FontInitOutput sequence useful notably if font loader params have changed
4e9e2555 Poul Sander 2025-10-05 10:15 4162
IMGUI_API void              ImFontAtlasFontDestroyOutput(ImFontAtlas* atlas, ImFont* font);
4e9e2555 Poul Sander 2025-10-05 10:15 4163
IMGUI_API void              ImFontAtlasFontDiscardBakes(ImFontAtlas* atlas, ImFont* font, int unused_frames);
4e9e2555 Poul Sander 2025-10-05 10:15 4164
4e9e2555 Poul Sander 2025-10-05 10:15 4165
IMGUI_API ImGuiID           ImFontAtlasBakedGetId(ImGuiID font_id, float baked_size, float rasterizer_density);
4e9e2555 Poul Sander 2025-10-05 10:15 4166
IMGUI_API ImFontBaked*      ImFontAtlasBakedGetOrAdd(ImFontAtlas* atlas, ImFont* font, float font_size, float font_rasterizer_density);
4e9e2555 Poul Sander 2025-10-05 10:15 4167
IMGUI_API ImFontBaked*      ImFontAtlasBakedGetClosestMatch(ImFontAtlas* atlas, ImFont* font, float font_size, float font_rasterizer_density);
4e9e2555 Poul Sander 2025-10-05 10:15 4168
IMGUI_API ImFontBaked*      ImFontAtlasBakedAdd(ImFontAtlas* atlas, ImFont* font, float font_size, float font_rasterizer_density, ImGuiID baked_id);
4e9e2555 Poul Sander 2025-10-05 10:15 4169
IMGUI_API void              ImFontAtlasBakedDiscard(ImFontAtlas* atlas, ImFont* font, ImFontBaked* baked);
4e9e2555 Poul Sander 2025-10-05 10:15 4170
IMGUI_API ImFontGlyph*      ImFontAtlasBakedAddFontGlyph(ImFontAtlas* atlas, ImFontBaked* baked, ImFontConfig* src, const ImFontGlyph* in_glyph);
4e9e2555 Poul Sander 2025-10-05 10:15 4171
IMGUI_API void              ImFontAtlasBakedAddFontGlyphAdvancedX(ImFontAtlas* atlas, ImFontBaked* baked, ImFontConfig* src, ImWchar codepoint, float advance_x);
4e9e2555 Poul Sander 2025-10-05 10:15 4172
IMGUI_API void              ImFontAtlasBakedDiscardFontGlyph(ImFontAtlas* atlas, ImFont* font, ImFontBaked* baked, ImFontGlyph* glyph);
4e9e2555 Poul Sander 2025-10-05 10:15 4173
IMGUI_API void              ImFontAtlasBakedSetFontGlyphBitmap(ImFontAtlas* atlas, ImFontBaked* baked, ImFontConfig* src, ImFontGlyph* glyph, ImTextureRect* r, const unsigned char* src_pixels, ImTextureFormat src_fmt, int src_pitch);
4e9e2555 Poul Sander 2025-10-05 10:15 4174
4e9e2555 Poul Sander 2025-10-05 10:15 4175
IMGUI_API void              ImFontAtlasPackInit(ImFontAtlas* atlas);
4e9e2555 Poul Sander 2025-10-05 10:15 4176
IMGUI_API ImFontAtlasRectId ImFontAtlasPackAddRect(ImFontAtlas* atlas, int w, int h, ImFontAtlasRectEntry* overwrite_entry = NULL);
4e9e2555 Poul Sander 2025-10-05 10:15 4177
IMGUI_API ImTextureRect*    ImFontAtlasPackGetRect(ImFontAtlas* atlas, ImFontAtlasRectId id);
4e9e2555 Poul Sander 2025-10-05 10:15 4178
IMGUI_API ImTextureRect*    ImFontAtlasPackGetRectSafe(ImFontAtlas* atlas, ImFontAtlasRectId id);
4e9e2555 Poul Sander 2025-10-05 10:15 4179
IMGUI_API void              ImFontAtlasPackDiscardRect(ImFontAtlas* atlas, ImFontAtlasRectId id);
4e9e2555 Poul Sander 2025-10-05 10:15 4180
4e9e2555 Poul Sander 2025-10-05 10:15 4181
IMGUI_API void              ImFontAtlasUpdateNewFrame(ImFontAtlas* atlas, int frame_count, bool renderer_has_textures);
4e9e2555 Poul Sander 2025-10-05 10:15 4182
IMGUI_API void              ImFontAtlasAddDrawListSharedData(ImFontAtlas* atlas, ImDrawListSharedData* data);
4e9e2555 Poul Sander 2025-10-05 10:15 4183
IMGUI_API void              ImFontAtlasRemoveDrawListSharedData(ImFontAtlas* atlas, ImDrawListSharedData* data);
4e9e2555 Poul Sander 2025-10-05 10:15 4184
IMGUI_API void              ImFontAtlasUpdateDrawListsTextures(ImFontAtlas* atlas, ImTextureRef old_tex, ImTextureRef new_tex);
4e9e2555 Poul Sander 2025-10-05 10:15 4185
IMGUI_API void              ImFontAtlasUpdateDrawListsSharedData(ImFontAtlas* atlas);
4e9e2555 Poul Sander 2025-10-05 10:15 4186
4e9e2555 Poul Sander 2025-10-05 10:15 4187
IMGUI_API void              ImFontAtlasTextureBlockConvert(const unsigned char* src_pixels, ImTextureFormat src_fmt, int src_pitch, unsigned char* dst_pixels, ImTextureFormat dst_fmt, int dst_pitch, int w, int h);
4e9e2555 Poul Sander 2025-10-05 10:15 4188
IMGUI_API void              ImFontAtlasTextureBlockPostProcess(ImFontAtlasPostProcessData* data);
4e9e2555 Poul Sander 2025-10-05 10:15 4189
IMGUI_API void              ImFontAtlasTextureBlockPostProcessMultiply(ImFontAtlasPostProcessData* data, float multiply_factor);
4e9e2555 Poul Sander 2025-10-05 10:15 4190
IMGUI_API void              ImFontAtlasTextureBlockFill(ImTextureData* dst_tex, int dst_x, int dst_y, int w, int h, ImU32 col);
4e9e2555 Poul Sander 2025-10-05 10:15 4191
IMGUI_API void              ImFontAtlasTextureBlockCopy(ImTextureData* src_tex, int src_x, int src_y, ImTextureData* dst_tex, int dst_x, int dst_y, int w, int h);
4e9e2555 Poul Sander 2025-10-05 10:15 4192
IMGUI_API void              ImFontAtlasTextureBlockQueueUpload(ImFontAtlas* atlas, ImTextureData* tex, int x, int y, int w, int h);
4e9e2555 Poul Sander 2025-10-05 10:15 4193
4e9e2555 Poul Sander 2025-10-05 10:15 4194
IMGUI_API int               ImTextureDataGetFormatBytesPerPixel(ImTextureFormat format);
4e9e2555 Poul Sander 2025-10-05 10:15 4195
IMGUI_API const char*       ImTextureDataGetStatusName(ImTextureStatus status);
4e9e2555 Poul Sander 2025-10-05 10:15 4196
IMGUI_API const char*       ImTextureDataGetFormatName(ImTextureFormat format);
4e9e2555 Poul Sander 2025-10-05 10:15 4197
4e9e2555 Poul Sander 2025-10-05 10:15 4198
#ifndef IMGUI_DISABLE_DEBUG_TOOLS
4e9e2555 Poul Sander 2025-10-05 10:15 4199
IMGUI_API void              ImFontAtlasDebugLogTextureRequests(ImFontAtlas* atlas);
4e9e2555 Poul Sander 2025-10-05 10:15 4200
#endif
4e9e2555 Poul Sander 2025-10-05 10:15 4201
4e9e2555 Poul Sander 2025-10-05 10:15 4202
IMGUI_API bool      ImFontAtlasGetMouseCursorTexData(ImFontAtlas* atlas, ImGuiMouseCursor cursor_type, ImVec2* out_offset, ImVec2* out_size, ImVec2 out_uv_border[2], ImVec2 out_uv_fill[2]);
1193b4be Poul Sander 2025-02-03 21:28 4203
1193b4be Poul Sander 2025-02-03 21:28 4204
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 4205
// [SECTION] Test Engine specific hooks (imgui_test_engine)
1193b4be Poul Sander 2025-02-03 21:28 4206
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 4207
1193b4be Poul Sander 2025-02-03 21:28 4208
#ifdef IMGUI_ENABLE_TEST_ENGINE
1193b4be Poul Sander 2025-02-03 21:28 4209
extern void         ImGuiTestEngineHook_ItemAdd(ImGuiContext* ctx, ImGuiID id, const ImRect& bb, const ImGuiLastItemData* item_data);           // item_data may be NULL
1193b4be Poul Sander 2025-02-03 21:28 4210
extern void         ImGuiTestEngineHook_ItemInfo(ImGuiContext* ctx, ImGuiID id, const char* label, ImGuiItemStatusFlags flags);
1193b4be Poul Sander 2025-02-03 21:28 4211
extern void         ImGuiTestEngineHook_Log(ImGuiContext* ctx, const char* fmt, ...);
1193b4be Poul Sander 2025-02-03 21:28 4212
extern const char*  ImGuiTestEngine_FindItemDebugLabel(ImGuiContext* ctx, ImGuiID id);
1193b4be Poul Sander 2025-02-03 21:28 4213
1193b4be Poul Sander 2025-02-03 21:28 4214
// In IMGUI_VERSION_NUM >= 18934: changed IMGUI_TEST_ENGINE_ITEM_ADD(bb,id) to IMGUI_TEST_ENGINE_ITEM_ADD(id,bb,item_data);
1193b4be Poul Sander 2025-02-03 21:28 4215
#define IMGUI_TEST_ENGINE_ITEM_ADD(_ID,_BB,_ITEM_DATA)      if (g.TestEngineHookItems) ImGuiTestEngineHook_ItemAdd(&g, _ID, _BB, _ITEM_DATA)    // Register item bounding box
1193b4be Poul Sander 2025-02-03 21:28 4216
#define IMGUI_TEST_ENGINE_ITEM_INFO(_ID,_LABEL,_FLAGS)      if (g.TestEngineHookItems) ImGuiTestEngineHook_ItemInfo(&g, _ID, _LABEL, _FLAGS)    // Register item label and status flags (optional)
1193b4be Poul Sander 2025-02-03 21:28 4217
#define IMGUI_TEST_ENGINE_LOG(_FMT,...)                     ImGuiTestEngineHook_Log(&g, _FMT, __VA_ARGS__)                                      // Custom log entry from user land into test log
1193b4be Poul Sander 2025-02-03 21:28 4218
#else
1193b4be Poul Sander 2025-02-03 21:28 4219
#define IMGUI_TEST_ENGINE_ITEM_ADD(_BB,_ID)                 ((void)0)
1193b4be Poul Sander 2025-02-03 21:28 4220
#define IMGUI_TEST_ENGINE_ITEM_INFO(_ID,_LABEL,_FLAGS)      ((void)g)
1193b4be Poul Sander 2025-02-03 21:28 4221
#endif
1193b4be Poul Sander 2025-02-03 21:28 4222
1193b4be Poul Sander 2025-02-03 21:28 4223
//-----------------------------------------------------------------------------
1193b4be Poul Sander 2025-02-03 21:28 4224
1193b4be Poul Sander 2025-02-03 21:28 4225
#if defined(__clang__)
1193b4be Poul Sander 2025-02-03 21:28 4226
#pragma clang diagnostic pop
1193b4be Poul Sander 2025-02-03 21:28 4227
#elif defined(__GNUC__)
1193b4be Poul Sander 2025-02-03 21:28 4228
#pragma GCC diagnostic pop
1193b4be Poul Sander 2025-02-03 21:28 4229
#endif
1193b4be Poul Sander 2025-02-03 21:28 4230
1193b4be Poul Sander 2025-02-03 21:28 4231
#ifdef _MSC_VER
1193b4be Poul Sander 2025-02-03 21:28 4232
#pragma warning (pop)
1193b4be Poul Sander 2025-02-03 21:28 4233
#endif
1193b4be Poul Sander 2025-02-03 21:28 4234
1193b4be Poul Sander 2025-02-03 21:28 4235
#endif // #ifndef IMGUI_DISABLE
1970-01-01 00:00 4236