git repos / blockattack-game

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

normal view · raw

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