| 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 |
|