Revision 932a86a1
Added by david.sorber over 1 year ago
| src/imgui/imgui_internal.h | ||
|---|---|---|
|
// dear imgui, v1.90.2 WIP
|
||
|
// dear imgui, v1.91.5
|
||
|
// (internal structures/api)
|
||
|
|
||
|
// You may use this file to debug, understand or extend Dear ImGui features but we don't provide any guarantee of forward compatibility.
|
||
| ... | ... | |
|
// [SECTION] Macros
|
||
|
// [SECTION] Generic helpers
|
||
|
// [SECTION] ImDrawList support
|
||
|
// [SECTION] Widgets support: flags, enums, data structures
|
||
|
// [SECTION] Data types support
|
||
|
// [SECTION] Widgets support: flags, enums, data structures
|
||
|
// [SECTION] Popup support
|
||
|
// [SECTION] Inputs support
|
||
|
// [SECTION] Clipper support
|
||
|
// [SECTION] Navigation support
|
||
|
// [SECTION] Typing-select support
|
||
|
// [SECTION] Columns support
|
||
|
// [SECTION] Box-select support
|
||
|
// [SECTION] Multi-select support
|
||
|
// [SECTION] Docking support
|
||
|
// [SECTION] Viewport support
|
||
|
// [SECTION] Settings support
|
||
|
// [SECTION] Localization support
|
||
|
// [SECTION] Error handling, State recovery support
|
||
|
// [SECTION] Metrics, Debug tools
|
||
|
// [SECTION] Generic context hooks
|
||
|
// [SECTION] ImGuiContext (main imgui context)
|
||
| ... | ... | |
|
#endif
|
||
|
#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx'
|
||
|
#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants ok, for ImFloor()
|
||
|
#pragma clang diagnostic ignored "-Wunused-function" // for stb_textedit.h
|
||
|
#pragma clang diagnostic ignored "-Wmissing-prototypes" // for stb_textedit.h
|
||
|
#pragma clang diagnostic ignored "-Wold-style-cast"
|
||
|
#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
|
||
|
#pragma clang diagnostic ignored "-Wdouble-promotion"
|
||
|
#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast
|
||
|
#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning: zero as null pointer constant
|
||
|
#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function
|
||
|
#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision
|
||
|
#pragma clang diagnostic ignored "-Wmissing-noreturn" // warning: function 'xxx' could be declared with attribute 'noreturn'
|
||
|
#pragma clang diagnostic ignored "-Wdeprecated-enum-enum-conversion"// warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated
|
||
|
#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" // warning: 'xxx' is an unsafe pointer used for buffer access
|
||
|
#pragma clang diagnostic ignored "-Wnontrivial-memaccess" // warning: first argument in call to 'memset' is a pointer to non-trivially copyable type
|
||
|
#elif defined(__GNUC__)
|
||
|
#pragma GCC diagnostic push
|
||
|
#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind
|
||
|
#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead
|
||
|
#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind
|
||
|
#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead
|
||
|
#pragma GCC diagnostic ignored "-Wdeprecated-enum-enum-conversion" // warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated
|
||
|
#endif
|
||
|
|
||
|
// In 1.89.4, we moved the implementation of "courtesy maths operators" from imgui_internal.h in imgui.h
|
||
| ... | ... | |
|
struct ImRect; // An axis-aligned rectangle (2 points)
|
||
|
struct ImDrawDataBuilder; // Helper to build a ImDrawData instance
|
||
|
struct ImDrawListSharedData; // Data shared between all ImDrawList instances
|
||
|
struct ImGuiBoxSelectState; // Box-selection state (currently used by multi-selection, could potentially be used by others)
|
||
|
struct ImGuiColorMod; // Stacked color modifier, backup of modified data so we can restore it
|
||
|
struct ImGuiContext; // Main Dear ImGui context
|
||
|
struct ImGuiContextHook; // Hook for extensions like ImGuiTestEngine
|
||
|
struct ImGuiDataVarInfo; // Variable information (e.g. to avoid style variables from an enum)
|
||
|
struct ImGuiDataVarInfo; // Variable information (e.g. to access style variables from an enum)
|
||
|
struct ImGuiDataTypeInfo; // Type information associated to a ImGuiDataType enum
|
||
|
struct ImGuiErrorRecoveryState; // Storage of stack sizes for error handling and recovery
|
||
|
struct ImGuiGroupData; // Stacked storage data for BeginGroup()/EndGroup()
|
||
|
struct ImGuiInputTextState; // Internal state of the currently focused/edited text input box
|
||
|
struct ImGuiInputTextDeactivateData;// Short term storage to backup text of a deactivating InputText() while another is stealing active id
|
||
|
struct ImGuiLastItemData; // Status storage for last submitted items
|
||
|
struct ImGuiLocEntry; // A localization entry.
|
||
|
struct ImGuiMenuColumns; // Simple column measurement, currently used for MenuItem() only
|
||
|
struct ImGuiNavItemData; // Result of a gamepad/keyboard directional navigation move query result
|
||
|
struct ImGuiNavTreeNodeData; // Temporary storage for last TreeNode() being a Left arrow landing candidate.
|
||
|
struct ImGuiMultiSelectState; // Multi-selection persistent state (for focused selection).
|
||
|
struct ImGuiMultiSelectTempData; // Multi-selection temporary state (while traversing).
|
||
|
struct ImGuiNavItemData; // Result of a keyboard/gamepad directional navigation move query result
|
||
|
struct ImGuiMetricsConfig; // Storage for ShowMetricsWindow() and DebugNodeXXX() functions
|
||
|
struct ImGuiNextWindowData; // Storage for SetNextWindow** functions
|
||
|
struct ImGuiNextItemData; // Storage for SetNextItem** functions
|
||
| ... | ... | |
|
struct ImGuiOldColumns; // Storage data for a columns set for legacy Columns() api
|
||
|
struct ImGuiPopupData; // Storage for current popup stack
|
||
|
struct ImGuiSettingsHandler; // Storage for one type registered in the .ini file
|
||
|
struct ImGuiStackSizes; // Storage of stack sizes for debugging/asserting
|
||
|
struct ImGuiStyleMod; // Stacked style modifier, backup of modified data so we can restore it
|
||
|
struct ImGuiTabBar; // Storage for a tab bar
|
||
|
struct ImGuiTabItem; // Storage for a tab item (within a tab bar)
|
||
|
struct ImGuiTable; // Storage for a table
|
||
|
struct ImGuiTableHeaderData; // Storage for TableAngledHeadersRow()
|
||
|
struct ImGuiTableColumn; // Storage for one column of a table
|
||
|
struct ImGuiTableInstanceData; // Storage for one instance of a same table
|
||
|
struct ImGuiTableTempData; // Temporary storage for one table (one per table in the stack), shared between tables.
|
||
|
struct ImGuiTableSettings; // Storage for a table .ini settings
|
||
|
struct ImGuiTableColumnsSettings; // Storage for a column .ini settings
|
||
|
struct ImGuiTreeNodeStackData; // Temporary storage for TreeNode().
|
||
|
struct ImGuiTypingSelectState; // Storage for GetTypingSelectRequest()
|
||
|
struct ImGuiTypingSelectRequest; // Storage for GetTypingSelectRequest() (aimed to be public)
|
||
|
struct ImGuiWindow; // Storage for one window
|
||
| ... | ... | |
|
// Flags
|
||
|
typedef int ImGuiActivateFlags; // -> enum ImGuiActivateFlags_ // Flags: for navigation/focus function (will be for ActivateItem() later)
|
||
|
typedef int ImGuiDebugLogFlags; // -> enum ImGuiDebugLogFlags_ // Flags: for ShowDebugLogWindow(), g.DebugLogFlags
|
||
|
typedef int ImGuiFocusRequestFlags; // -> enum ImGuiFocusRequestFlags_ // Flags: for FocusWindow();
|
||
|
typedef int ImGuiInputFlags; // -> enum ImGuiInputFlags_ // Flags: for IsKeyPressed(), IsMouseClicked(), SetKeyOwner(), SetItemKeyOwner() etc.
|
||
|
typedef int ImGuiItemFlags; // -> enum ImGuiItemFlags_ // Flags: for PushItemFlag(), g.LastItemData.InFlags
|
||
|
typedef int ImGuiFocusRequestFlags; // -> enum ImGuiFocusRequestFlags_ // Flags: for FocusWindow()
|
||
|
typedef int ImGuiItemStatusFlags; // -> enum ImGuiItemStatusFlags_ // Flags: for g.LastItemData.StatusFlags
|
||
|
typedef int ImGuiOldColumnFlags; // -> enum ImGuiOldColumnFlags_ // Flags: for BeginColumns()
|
||
|
typedef int ImGuiNavHighlightFlags; // -> enum ImGuiNavHighlightFlags_ // Flags: for RenderNavHighlight()
|
||
|
typedef int ImGuiLogFlags; // -> enum ImGuiLogFlags_ // Flags: for LogBegin() text capturing function
|
||
|
typedef int ImGuiNavRenderCursorFlags; // -> enum ImGuiNavRenderCursorFlags_//Flags: for RenderNavCursor()
|
||
|
typedef int ImGuiNavMoveFlags; // -> enum ImGuiNavMoveFlags_ // Flags: for navigation requests
|
||
|
typedef int ImGuiNextItemDataFlags; // -> enum ImGuiNextItemDataFlags_ // Flags: for SetNextItemXXX() functions
|
||
|
typedef int ImGuiNextWindowDataFlags; // -> enum ImGuiNextWindowDataFlags_// Flags: for SetNextWindowXXX() functions
|
||
| ... | ... | |
|
typedef int ImGuiTextFlags; // -> enum ImGuiTextFlags_ // Flags: for TextEx()
|
||
|
typedef int ImGuiTooltipFlags; // -> enum ImGuiTooltipFlags_ // Flags: for BeginTooltipEx()
|
||
|
typedef int ImGuiTypingSelectFlags; // -> enum ImGuiTypingSelectFlags_ // Flags: for GetTypingSelectRequest()
|
||
|
|
||
|
typedef void (*ImGuiErrorLogCallback)(void* user_data, const char* fmt, ...);
|
||
|
typedef int ImGuiWindowRefreshFlags; // -> enum ImGuiWindowRefreshFlags_ // Flags: for SetNextWindowRefreshPolicy()
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// [SECTION] Context pointer
|
||
| ... | ... | |
|
extern IMGUI_API ImGuiContext* GImGui; // Current implicit context pointer
|
||
|
#endif
|
||
|
|
||
|
//-------------------------------------------------------------------------
|
||
|
// [SECTION] STB libraries includes
|
||
|
//-------------------------------------------------------------------------
|
||
|
|
||
|
namespace ImStb
|
||
|
{
|
||
|
|
||
|
#undef IMSTB_TEXTEDIT_STRING
|
||
|
#undef IMSTB_TEXTEDIT_CHARTYPE
|
||
|
#define IMSTB_TEXTEDIT_STRING ImGuiInputTextState
|
||
|
#define IMSTB_TEXTEDIT_CHARTYPE ImWchar
|
||
|
#define IMSTB_TEXTEDIT_GETWIDTH_NEWLINE (-1.0f)
|
||
|
#define IMSTB_TEXTEDIT_UNDOSTATECOUNT 99
|
||
|
#define IMSTB_TEXTEDIT_UNDOCHARCOUNT 999
|
||
|
#include "imstb_textedit.h"
|
||
|
|
||
|
} // namespace ImStb
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// [SECTION] Macros
|
||
|
//-----------------------------------------------------------------------------
|
||
| ... | ... | |
|
#else
|
||
|
#define IMGUI_DEBUG_LOG(...) ((void)0)
|
||
|
#endif
|
||
|
#define IMGUI_DEBUG_LOG_ERROR(...) do { ImGuiContext& g2 = *GImGui; if (g2.DebugLogFlags & ImGuiDebugLogFlags_EventError) IMGUI_DEBUG_LOG(__VA_ARGS__); else g2.DebugLogSkippedErrors++; } while (0)
|
||
|
#define IMGUI_DEBUG_LOG_ACTIVEID(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventActiveId) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
|
||
|
#define IMGUI_DEBUG_LOG_FOCUS(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventFocus) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
|
||
|
#define IMGUI_DEBUG_LOG_POPUP(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventPopup) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
|
||
| ... | ... | |
|
#define IM_ASSERT_PARANOID(_EXPR)
|
||
|
#endif
|
||
|
|
||
|
// Error handling
|
||
|
// Down the line in some frameworks/languages we would like to have a way to redirect those to the programmer and recover from more faults.
|
||
|
#ifndef IM_ASSERT_USER_ERROR
|
||
|
#define IM_ASSERT_USER_ERROR(_EXP,_MSG) IM_ASSERT((_EXP) && _MSG) // Recoverable User Error
|
||
|
#endif
|
||
|
|
||
|
// Misc Macros
|
||
|
#define IM_PI 3.14159265358979323846f
|
||
|
#ifdef _WIN32
|
||
| ... | ... | |
|
#define IM_FLOOR IM_TRUNC
|
||
|
#endif
|
||
|
|
||
|
// Hint for branch prediction
|
||
|
#if (defined(__cplusplus) && (__cplusplus >= 202002L)) || (defined(_MSVC_LANG) && (_MSVC_LANG >= 202002L))
|
||
|
#define IM_LIKELY [[likely]]
|
||
|
#define IM_UNLIKELY [[unlikely]]
|
||
|
#else
|
||
|
#define IM_LIKELY
|
||
|
#define IM_UNLIKELY
|
||
|
#endif
|
||
|
|
||
|
// Enforce cdecl calling convention for functions called by the standard library, in case compilation settings changed the default to e.g. __vectorcall
|
||
|
#ifdef _MSC_VER
|
||
|
#define IMGUI_CDECL __cdecl
|
||
| ... | ... | |
|
// - Helper: ImPool<>
|
||
|
// - Helper: ImChunkStream<>
|
||
|
// - Helper: ImGuiTextIndex
|
||
|
// - Helper: ImGuiStorage
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
// Helpers: Hashing
|
||
| ... | ... | |
|
IMGUI_API void ImStrTrimBlanks(char* str); // Remove leading and trailing blanks from a buffer.
|
||
|
IMGUI_API const char* ImStrSkipBlank(const char* str); // Find first non-blank character.
|
||
|
IMGUI_API int ImStrlenW(const ImWchar* str); // Computer string length (ImWchar string)
|
||
|
IMGUI_API const ImWchar*ImStrbolW(const ImWchar* buf_mid_line, const ImWchar* buf_begin); // Find beginning-of-line (ImWchar string)
|
||
|
IMGUI_API const char* ImStrbol(const char* buf_mid_line, const char* buf_begin); // Find beginning-of-line
|
||
|
IM_MSVC_RUNTIME_CHECKS_OFF
|
||
|
static inline char ImToUpper(char c) { return (c >= 'a' && c <= 'z') ? c &= ~32 : c; }
|
||
|
static inline bool ImCharIsBlankA(char c) { return c == ' ' || c == '\t'; }
|
||
|
static inline bool ImCharIsBlankW(unsigned int c) { return c == ' ' || c == '\t' || c == 0x3000; }
|
||
|
static inline bool ImCharIsXdigitA(char c) { return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f'); }
|
||
|
IM_MSVC_RUNTIME_CHECKS_RESTORE
|
||
|
|
||
|
// Helpers: Formatting
|
||
| ... | ... | |
|
IMGUI_API int ImTextCountUtf8BytesFromChar(const char* in_text, const char* in_text_end); // return number of bytes to express one char in UTF-8
|
||
|
IMGUI_API int ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_end); // return number of bytes to express string in UTF-8
|
||
|
IMGUI_API const char* ImTextFindPreviousUtf8Codepoint(const char* in_text_start, const char* in_text_curr); // return previous UTF-8 code-point.
|
||
|
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.
|
||
|
|
||
|
// Helpers: File System
|
||
|
#ifdef IMGUI_DISABLE_FILE_FUNCTIONS
|
||
| ... | ... | |
|
// - Misc maths helpers
|
||
|
static inline ImVec2 ImMin(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x < rhs.x ? lhs.x : rhs.x, lhs.y < rhs.y ? lhs.y : rhs.y); }
|
||
|
static inline ImVec2 ImMax(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x >= rhs.x ? lhs.x : rhs.x, lhs.y >= rhs.y ? lhs.y : rhs.y); }
|
||
|
static inline ImVec2 ImClamp(const ImVec2& v, const ImVec2& mn, ImVec2 mx) { return ImVec2((v.x < mn.x) ? mn.x : (v.x > mx.x) ? mx.x : v.x, (v.y < mn.y) ? mn.y : (v.y > mx.y) ? mx.y : v.y); }
|
||
|
static inline ImVec2 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); }
|
||
|
static inline ImVec2 ImLerp(const ImVec2& a, const ImVec2& b, float t) { return ImVec2(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t); }
|
||
|
static inline ImVec2 ImLerp(const ImVec2& a, const ImVec2& b, const ImVec2& t) { return ImVec2(a.x + (b.x - a.x) * t.x, a.y + (b.y - a.y) * t.y); }
|
||
|
static inline ImVec4 ImLerp(const ImVec4& a, const ImVec4& b, float t) { return ImVec4(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t, a.z + (b.z - a.z) * t, a.w + (b.w - a.w) * t); }
|
||
| ... | ... | |
|
static inline float ImDot(const ImVec2& a, const ImVec2& b) { return a.x * b.x + a.y * b.y; }
|
||
|
static inline ImVec2 ImRotate(const ImVec2& v, float cos_a, float sin_a) { return ImVec2(v.x * cos_a - v.y * sin_a, v.x * sin_a + v.y * cos_a); }
|
||
|
static inline float ImLinearSweep(float current, float target, float speed) { if (current < target) return ImMin(current + speed, target); if (current > target) return ImMax(current - speed, target); return current; }
|
||
|
static inline float ImLinearRemapClamp(float s0, float s1, float d0, float d1, float x) { return ImSaturate((x - s0) / (s1 - s0)) * (d1 - d0) + d0; }
|
||
|
static inline ImVec2 ImMul(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x * rhs.x, lhs.y * rhs.y); }
|
||
|
static inline bool ImIsFloatAboveGuaranteedIntegerPrecision(float f) { return f <= -16777216 || f >= 16777216; }
|
||
|
static inline float ImExponentialMovingAverage(float avg, float sample, int n) { avg -= avg / n; avg += sample / n; return avg; }
|
||
| ... | ... | |
|
IMGUI_API bool ImTriangleContainsPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);
|
||
|
IMGUI_API ImVec2 ImTriangleClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);
|
||
|
IMGUI_API void ImTriangleBarycentricCoords(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p, float& out_u, float& out_v, float& out_w);
|
||
|
inline float ImTriangleArea(const ImVec2& a, const ImVec2& b, const ImVec2& c) { return ImFabs((a.x * (b.y - c.y)) + (b.x * (c.y - a.y)) + (c.x * (a.y - b.y))) * 0.5f; }
|
||
|
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; }
|
||
|
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; }
|
||
|
|
||
|
// Helper: ImVec1 (1D vector)
|
||
|
// (this odd construct is used to facilitate the transition between 1D and 2D, and the maintenance of some branches/patches)
|
||
| ... | ... | |
|
void swap(ImChunkStream<T>& rhs) { rhs.Buf.swap(Buf); }
|
||
|
};
|
||
|
|
||
|
// Helper: ImGuiTextIndex<>
|
||
|
// Helper: ImGuiTextIndex
|
||
|
// Maintain a line index for a text buffer. This is a strong candidate to be moved into the public API.
|
||
|
struct ImGuiTextIndex
|
||
|
{
|
||
| ... | ... | |
|
void append(const char* base, int old_size, int new_size);
|
||
|
};
|
||
|
|
||
|
// Helper: ImGuiStorage
|
||
|
IMGUI_API ImGuiStoragePair* ImLowerBound(ImGuiStoragePair* in_begin, ImGuiStoragePair* in_end, ImGuiID key);
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// [SECTION] ImDrawList support
|
||
|
//-----------------------------------------------------------------------------
|
||
| ... | ... | |
|
ImVec2 TexUvWhitePixel; // UV of white pixel in the atlas
|
||
|
ImFont* Font; // Current/default font (optional, for simplified AddText overload)
|
||
|
float FontSize; // Current/default font size (optional, for simplified AddText overload)
|
||
|
float FontScale; // Current/default font scale (== FontSize / Font->FontSize)
|
||
|
float CurveTessellationTol; // Tessellation tolerance when using PathBezierCurveTo()
|
||
|
float CircleSegmentMaxError; // Number of circle segments to use per pixel of radius for AddCircle() etc
|
||
|
ImVec4 ClipRectFullscreen; // Value for PushClipRectFullscreen()
|
||
| ... | ... | |
|
ImDrawDataBuilder() { memset(this, 0, sizeof(*this)); }
|
||
|
};
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// [SECTION] Data types support
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
struct ImGuiDataVarInfo
|
||
|
{
|
||
|
ImGuiDataType Type;
|
||
|
ImU32 Count; // 1+
|
||
|
ImU32 Offset; // Offset in parent structure
|
||
|
void* GetVarPtr(void* parent) const { return (void*)((unsigned char*)parent + Offset); }
|
||
|
};
|
||
|
|
||
|
struct ImGuiDataTypeStorage
|
||
|
{
|
||
|
ImU8 Data[8]; // Opaque storage to fit any data up to ImGuiDataType_COUNT
|
||
|
};
|
||
|
|
||
|
// Type information associated to one ImGuiDataType. Retrieve with DataTypeGetInfo().
|
||
|
struct ImGuiDataTypeInfo
|
||
|
{
|
||
|
size_t Size; // Size in bytes
|
||
|
const char* Name; // Short descriptive name for the type, for debugging
|
||
|
const char* PrintFmt; // Default printf format for the type
|
||
|
const char* ScanFmt; // Default scanf format for the type
|
||
|
};
|
||
|
|
||
|
// Extend ImGuiDataType_
|
||
|
enum ImGuiDataTypePrivate_
|
||
|
{
|
||
|
ImGuiDataType_String = ImGuiDataType_COUNT + 1,
|
||
|
ImGuiDataType_Pointer,
|
||
|
ImGuiDataType_ID,
|
||
|
};
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// [SECTION] Widgets support: flags, enums, data structures
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
// Flags used by upcoming items
|
||
|
// - input: PushItemFlag() manipulates g.CurrentItemFlags, ItemAdd() calls may add extra flags.
|
||
|
// - output: stored in g.LastItemData.InFlags
|
||
|
// Current window shared by all windows.
|
||
|
// This is going to be exposed in imgui.h when stabilized enough.
|
||
|
enum ImGuiItemFlags_
|
||
|
// Extend ImGuiItemFlags
|
||
|
// - input: PushItemFlag() manipulates g.CurrentItemFlags, g.NextItemData.ItemFlags, ItemAdd() calls may add extra flags too.
|
||
|
// - output: stored in g.LastItemData.ItemFlags
|
||
|
enum ImGuiItemFlagsPrivate_
|
||
|
{
|
||
|
// Controlled by user
|
||
|
ImGuiItemFlags_None = 0,
|
||
|
ImGuiItemFlags_NoTabStop = 1 << 0, // false // Disable keyboard tabbing. This is a "lighter" version of ImGuiItemFlags_NoNav.
|
||
|
ImGuiItemFlags_ButtonRepeat = 1 << 1, // false // Button() will return true multiple times based on io.KeyRepeatDelay and io.KeyRepeatRate settings.
|
||
|
ImGuiItemFlags_Disabled = 1 << 2, // false // Disable interactions but doesn't affect visuals. See BeginDisabled()/EndDisabled(). See github.com/ocornut/imgui/issues/211
|
||
|
ImGuiItemFlags_NoNav = 1 << 3, // false // Disable any form of focusing (keyboard/gamepad directional navigation and SetKeyboardFocusHere() calls)
|
||
|
ImGuiItemFlags_NoNavDefaultFocus = 1 << 4, // false // Disable item being a candidate for default focus (e.g. used by title bar items)
|
||
|
ImGuiItemFlags_SelectableDontClosePopup = 1 << 5, // false // Disable MenuItem/Selectable() automatically closing their popup window
|
||
|
ImGuiItemFlags_MixedValue = 1 << 6, // false // [BETA] Represent a mixed/indeterminate value, generally multi-selection where values differ. Currently only supported by Checkbox() (later should support all sorts of widgets)
|
||
|
ImGuiItemFlags_ReadOnly = 1 << 7, // false // [ALPHA] Allow hovering interactions but underlying value is not changed.
|
||
|
ImGuiItemFlags_NoWindowHoverableCheck = 1 << 8, // false // Disable hoverable check in ItemHoverable()
|
||
|
ImGuiItemFlags_AllowOverlap = 1 << 9, // false // Allow being overlapped by another widget. Not-hovered to Hovered transition deferred by a frame.
|
||
|
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).
|
||
|
ImGuiItemFlags_ReadOnly = 1 << 11, // false // [ALPHA] Allow hovering interactions but underlying value is not changed.
|
||
|
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)
|
||
|
ImGuiItemFlags_NoWindowHoverableCheck = 1 << 13, // false // Disable hoverable check in ItemHoverable()
|
||
|
ImGuiItemFlags_AllowOverlap = 1 << 14, // false // Allow being overlapped by another widget. Not-hovered to Hovered transition deferred by a frame.
|
||
|
ImGuiItemFlags_NoNavDisableMouseHover = 1 << 15, // false // Nav keyboard/gamepad mode doesn't disable hover highlight (behave as if NavHighlightItemUnderNav==false).
|
||
|
ImGuiItemFlags_NoMarkEdited = 1 << 16, // false // Skip calling MarkItemEdited()
|
||
|
|
||
|
// Controlled by widget code
|
||
|
ImGuiItemFlags_Inputable = 1 << 10, // false // [WIP] Auto-activate input mode when tab focused. Currently only used and supported by a few items before it becomes a generic feature.
|
||
|
ImGuiItemFlags_HasSelectionUserData = 1 << 11, // false // Set by SetNextItemSelectionUserData()
|
||
|
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.
|
||
|
ImGuiItemFlags_HasSelectionUserData = 1 << 21, // false // Set by SetNextItemSelectionUserData()
|
||
|
ImGuiItemFlags_IsMultiSelect = 1 << 22, // false // Set by SetNextItemSelectionUserData()
|
||
|
|
||
|
ImGuiItemFlags_Default_ = ImGuiItemFlags_AutoClosePopups, // Please don't change, use PushItemFlag() instead.
|
||
|
|
||
|
// Obsolete
|
||
|
//ImGuiItemFlags_SelectableDontClosePopup = !ImGuiItemFlags_AutoClosePopups, // Can't have a redirect as we inverted the behavior
|
||
|
};
|
||
|
|
||
|
// Status flags for an already submitted item
|
||
| ... | ... | |
|
ImGuiItemStatusFlags_Deactivated = 1 << 6, // Only valid if ImGuiItemStatusFlags_HasDeactivated is set.
|
||
|
ImGuiItemStatusFlags_HoveredWindow = 1 << 7, // Override the HoveredWindow test to allow cross-window hover testing.
|
||
|
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()).
|
||
|
ImGuiItemStatusFlags_HasClipRect = 1 << 9, // g.LastItemData.ClipRect is valid
|
||
|
ImGuiItemStatusFlags_HasClipRect = 1 << 9, // g.LastItemData.ClipRect is valid.
|
||
|
ImGuiItemStatusFlags_HasShortcut = 1 << 10, // g.LastItemData.Shortcut valid. Set by SetNextItemShortcut() -> ItemAdd().
|
||
|
|
||
|
// Additional status + semantic for ImGuiTestEngine
|
||
|
#ifdef IMGUI_ENABLE_TEST_ENGINE
|
||
| ... | ... | |
|
{
|
||
|
// [Internal]
|
||
|
ImGuiInputTextFlags_Multiline = 1 << 26, // For internal use by InputTextMultiline()
|
||
|
ImGuiInputTextFlags_NoMarkEdited = 1 << 27, // For internal use by functions using InputText() before reformatting data
|
||
|
ImGuiInputTextFlags_MergedItem = 1 << 28, // For internal use by TempInputText(), will skip calling ItemAdd(). Require bounding-box to strictly match.
|
||
|
ImGuiInputTextFlags_MergedItem = 1 << 27, // For internal use by TempInputText(), will skip calling ItemAdd(). Require bounding-box to strictly match.
|
||
|
ImGuiInputTextFlags_LocalizeDecimalPoint= 1 << 28, // For internal use by InputScalar() and TempInputScalar()
|
||
|
};
|
||
|
|
||
|
// Extend ImGuiButtonFlags_
|
||
| ... | ... | |
|
ImGuiButtonFlags_PressedOnRelease = 1 << 7, // return true on release (default requires click+release)
|
||
|
ImGuiButtonFlags_PressedOnDoubleClick = 1 << 8, // return true on double-click (default requires click+release)
|
||
|
ImGuiButtonFlags_PressedOnDragDropHold = 1 << 9, // return true when held into while we are drag and dropping another item (used by e.g. tree nodes, collapsing headers)
|
||
|
ImGuiButtonFlags_Repeat = 1 << 10, // hold to repeat
|
||
|
//ImGuiButtonFlags_Repeat = 1 << 10, // hold to repeat
|
||
|
ImGuiButtonFlags_FlattenChildren = 1 << 11, // allow interactions even if a child window is overlapping
|
||
|
ImGuiButtonFlags_AllowOverlap = 1 << 12, // require previous frame HoveredId to either match id or be null before being usable.
|
||
|
ImGuiButtonFlags_DontClosePopups = 1 << 13, // disable automatically closing parent popup on press // [UNUSED]
|
||
|
//ImGuiButtonFlags_DontClosePopups = 1 << 13, // disable automatically closing parent popup on press
|
||
|
//ImGuiButtonFlags_Disabled = 1 << 14, // disable interactions -> use BeginDisabled() or ImGuiItemFlags_Disabled
|
||
|
ImGuiButtonFlags_AlignTextBaseLine = 1 << 15, // vertically align button to match text baseline - ButtonEx() only // FIXME: Should be removed and handled by SmallButton(), not possible currently because of DC.CursorPosPrevLine
|
||
|
ImGuiButtonFlags_NoKeyModifiers = 1 << 16, // disable mouse interaction if a key modifier is held
|
||
|
ImGuiButtonFlags_NoKeyModsAllowed = 1 << 16, // disable mouse interaction if a key modifier is held
|
||
|
ImGuiButtonFlags_NoHoldingActiveId = 1 << 17, // don't set ActiveId while holding the mouse (ImGuiButtonFlags_PressedOnClick only)
|
||
|
ImGuiButtonFlags_NoNavFocus = 1 << 18, // don't override navigation focus when activated (FIXME: this is essentially used everytime an item uses ImGuiItemFlags_NoNav, but because legacy specs don't requires LastItemData to be set ButtonBehavior(), we can't poll g.LastItemData.InFlags)
|
||
|
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)
|
||
|
ImGuiButtonFlags_NoHoveredOnFocus = 1 << 19, // don't report as hovered when nav focus is on this item
|
||
|
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!)
|
||
|
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!)
|
||
| ... | ... | |
|
// Extend ImGuiTreeNodeFlags_
|
||
|
enum ImGuiTreeNodeFlagsPrivate_
|
||
|
{
|
||
|
ImGuiTreeNodeFlags_ClipLabelForTrailingButton = 1 << 20,
|
||
|
ImGuiTreeNodeFlags_UpsideDownArrow = 1 << 21,// (FIXME-WIP) Turn Down arrow into an Up arrow, but reversed trees (#6517)
|
||
|
ImGuiTreeNodeFlags_ClipLabelForTrailingButton = 1 << 28,// FIXME-WIP: Hard-coded for CollapsingHeader()
|
||
|
ImGuiTreeNodeFlags_UpsideDownArrow = 1 << 29,// FIXME-WIP: Turn Down arrow into an Up arrow, for reversed trees (#6517)
|
||
|
ImGuiTreeNodeFlags_OpenOnMask_ = ImGuiTreeNodeFlags_OpenOnDoubleClick | ImGuiTreeNodeFlags_OpenOnArrow,
|
||
|
};
|
||
|
|
||
|
enum ImGuiSeparatorFlags_
|
||
| ... | ... | |
|
ImGuiLayoutType_Vertical = 1
|
||
|
};
|
||
|
|
||
|
enum ImGuiLogType
|
||
|
// Flags for LogBegin() text capturing function
|
||
|
enum ImGuiLogFlags_
|
||
|
{
|
||
|
ImGuiLogType_None = 0,
|
||
|
ImGuiLogType_TTY,
|
||
|
ImGuiLogType_File,
|
||
|
ImGuiLogType_Buffer,
|
||
|
ImGuiLogType_Clipboard,
|
||
|
ImGuiLogFlags_None = 0,
|
||
|
|
||
|
ImGuiLogFlags_OutputTTY = 1 << 0,
|
||
|
ImGuiLogFlags_OutputFile = 1 << 1,
|
||
|
ImGuiLogFlags_OutputBuffer = 1 << 2,
|
||
|
ImGuiLogFlags_OutputClipboard = 1 << 3,
|
||
|
ImGuiLogFlags_OutputMask_ = ImGuiLogFlags_OutputTTY | ImGuiLogFlags_OutputFile | ImGuiLogFlags_OutputBuffer | ImGuiLogFlags_OutputClipboard,
|
||
|
};
|
||
|
|
||
|
// X/Y enums are fixed to 0/1 so they may be used to index ImVec2
|
||
| ... | ... | |
|
ImGuiInputTextDeactivatedState() { memset(this, 0, sizeof(*this)); }
|
||
|
void ClearFreeMemory() { ID = 0; TextA.clear(); }
|
||
|
};
|
||
|
|
||
|
// Forward declare imstb_textedit.h structure + make its main configuration define accessible
|
||
|
#undef IMSTB_TEXTEDIT_STRING
|
||
|
#undef IMSTB_TEXTEDIT_CHARTYPE
|
||
|
#define IMSTB_TEXTEDIT_STRING ImGuiInputTextState
|
||
|
#define IMSTB_TEXTEDIT_CHARTYPE char
|
||
|
#define IMSTB_TEXTEDIT_GETWIDTH_NEWLINE (-1.0f)
|
||
|
#define IMSTB_TEXTEDIT_UNDOSTATECOUNT 99
|
||
|
#define IMSTB_TEXTEDIT_UNDOCHARCOUNT 999
|
||
|
namespace ImStb { struct STB_TexteditState; }
|
||
|
typedef ImStb::STB_TexteditState ImStbTexteditState;
|
||
|
|
||
|
// Internal state of the currently focused/edited text input box
|
||
|
// For a given item ID, access with ImGui::GetInputTextState()
|
||
|
struct IMGUI_API ImGuiInputTextState
|
||
|
{
|
||
|
ImGuiContext* Ctx; // parent UI context (needs to be set explicitly by parent).
|
||
|
ImStbTexteditState* Stb; // State for stb_textedit.h
|
||
|
ImGuiID ID; // widget id owning the text state
|
||
|
int CurLenW, CurLenA; // we need to maintain our buffer length in both UTF-8 and wchar format. UTF-8 length is valid even if TextA is not.
|
||
|
ImVector<ImWchar> TextW; // edit buffer, we need to persist but can't guarantee the persistence of the user-provided buffer. so we copy into own buffer.
|
||
|
ImVector<char> TextA; // temporary UTF8 buffer for callbacks and other operations. this is not updated in every code-path! size=capacity.
|
||
|
ImVector<char> InitialTextA; // value to revert to when pressing Escape = backup of end-user buffer at the time of focus (in UTF-8, unaltered)
|
||
|
bool TextAIsValid; // temporary UTF8 buffer is not initially valid before we make the widget active (until then we pull the data from user argument)
|
||
|
int BufCapacityA; // end-user buffer capacity
|
||
|
float ScrollX; // horizontal scrolling/offset
|
||
|
ImStb::STB_TexteditState Stb; // state for stb_textedit.h
|
||
|
int TextLen; // UTF-8 length of the string in TextA (in bytes)
|
||
|
ImVector<char> TextA; // main UTF8 buffer. TextA.Size is a buffer size! Should always be >= buf_size passed by user (and of course >= CurLenA + 1).
|
||
|
ImVector<char> TextToRevertTo; // value to revert to when pressing Escape = backup of end-user buffer at the time of focus (in UTF-8, unaltered)
|
||
|
ImVector<char> CallbackTextBackup; // temporary storage for callback to support automatic reconcile of undo-stack
|
||
|
int BufCapacity; // end-user buffer capacity (include zero terminator)
|
||
|
ImVec2 Scroll; // horizontal offset (managed manually) + vertical scrolling (pulled from child window's own Scroll.y)
|
||
|
float CursorAnim; // timer for cursor blink, reset on every user action so the cursor reappears immediately
|
||
|
bool CursorFollow; // set when we want scrolling to follow the current cursor position (not always!)
|
||
|
bool SelectedAllMouseLock; // after a double-click to select all, we ignore further mouse drags to update selection
|
||
| ... | ... | |
|
int ReloadSelectionStart; // POSITIONS ARE IN IMWCHAR units *NOT* UTF-8 this is why this is not exposed yet.
|
||
|
int ReloadSelectionEnd;
|
||
|
|
||
|
ImGuiInputTextState() { memset(this, 0, sizeof(*this)); }
|
||
|
void ClearText() { CurLenW = CurLenA = 0; TextW[0] = 0; TextA[0] = 0; CursorClamp(); }
|
||
|
void ClearFreeMemory() { TextW.clear(); TextA.clear(); InitialTextA.clear(); }
|
||
|
int GetUndoAvailCount() const { return Stb.undostate.undo_point; }
|
||
|
int GetRedoAvailCount() const { return IMSTB_TEXTEDIT_UNDOSTATECOUNT - Stb.undostate.redo_point; }
|
||
|
ImGuiInputTextState();
|
||
|
~ImGuiInputTextState();
|
||
|
void ClearText() { TextLen = 0; TextA[0] = 0; CursorClamp(); }
|
||
|
void ClearFreeMemory() { TextA.clear(); TextToRevertTo.clear(); }
|
||
|
void OnKeyPressed(int key); // Cannot be inline because we call in code in stb_textedit.h implementation
|
||
|
void OnCharPressed(unsigned int c);
|
||
|
|
||
|
// Cursor & Selection
|
||
|
void CursorAnimReset() { CursorAnim = -0.30f; } // After a user-input the cursor stays on for a while without blinking
|
||
|
void CursorClamp() { Stb.cursor = ImMin(Stb.cursor, CurLenW); Stb.select_start = ImMin(Stb.select_start, CurLenW); Stb.select_end = ImMin(Stb.select_end, CurLenW); }
|
||
|
bool HasSelection() const { return Stb.select_start != Stb.select_end; }
|
||
|
void ClearSelection() { Stb.select_start = Stb.select_end = Stb.cursor; }
|
||
|
int GetCursorPos() const { return Stb.cursor; }
|
||
|
int GetSelectionStart() const { return Stb.select_start; }
|
||
|
int GetSelectionEnd() const { return Stb.select_end; }
|
||
|
void SelectAll() { Stb.select_start = 0; Stb.cursor = Stb.select_end = CurLenW; Stb.has_preferred_x = 0; }
|
||
|
void CursorAnimReset();
|
||
|
void CursorClamp();
|
||
|
bool HasSelection() const;
|
||
|
void ClearSelection();
|
||
|
int GetCursorPos() const;
|
||
|
int GetSelectionStart() const;
|
||
|
int GetSelectionEnd() const;
|
||
|
void SelectAll();
|
||
|
|
||
|
// Reload user buf (WIP #2890)
|
||
|
// If you modify underlying user-passed const char* while active you need to call this (InputText V2 may lift this)
|
||
|
// strcpy(my_buf, "hello");
|
||
|
// if (ImGuiInputTextState* state = ImGui::GetInputTextState(id)) // id may be ImGui::GetItemID() is last item
|
||
|
// state->ReloadUserBufAndSelectAll();
|
||
|
void ReloadUserBufAndSelectAll() { ReloadUserBuf = true; ReloadSelectionStart = 0; ReloadSelectionEnd = INT_MAX; }
|
||
|
void ReloadUserBufAndKeepSelection() { ReloadUserBuf = true; ReloadSelectionStart = Stb.select_start; ReloadSelectionEnd = Stb.select_end; }
|
||
|
void ReloadUserBufAndMoveToEnd() { ReloadUserBuf = true; ReloadSelectionStart = ReloadSelectionEnd = INT_MAX; }
|
||
|
void ReloadUserBufAndSelectAll();
|
||
|
void ReloadUserBufAndKeepSelection();
|
||
|
void ReloadUserBufAndMoveToEnd();
|
||
|
};
|
||
|
|
||
|
enum ImGuiWindowRefreshFlags_
|
||
|
{
|
||
|
ImGuiWindowRefreshFlags_None = 0,
|
||
|
ImGuiWindowRefreshFlags_TryToAvoidRefresh = 1 << 0, // [EXPERIMENTAL] Try to keep existing contents, USER MUST NOT HONOR BEGIN() RETURNING FALSE AND NOT APPEND.
|
||
|
ImGuiWindowRefreshFlags_RefreshOnHover = 1 << 1, // [EXPERIMENTAL] Always refresh on hover
|
||
|
ImGuiWindowRefreshFlags_RefreshOnFocus = 1 << 2, // [EXPERIMENTAL] Always refresh on focus
|
||
|
// Refresh policy/frequency, Load Balancing etc.
|
||
|
};
|
||
|
|
||
|
enum ImGuiNextWindowDataFlags_
|
||
| ... | ... | |
|
ImGuiNextWindowDataFlags_HasBgAlpha = 1 << 6,
|
||
|
ImGuiNextWindowDataFlags_HasScroll = 1 << 7,
|
||
|
ImGuiNextWindowDataFlags_HasChildFlags = 1 << 8,
|
||
|
ImGuiNextWindowDataFlags_HasRefreshPolicy = 1 << 9,
|
||
|
};
|
||
|
|
||
|
// Storage for SetNexWindow** functions
|
||
| ... | ... | |
|
void* SizeCallbackUserData;
|
||
|
float BgAlphaVal; // Override background alpha
|
||
|
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?)
|
||
|
ImGuiWindowRefreshFlags RefreshFlagsVal;
|
||
|
|
||
|
ImGuiNextWindowData() { memset(this, 0, sizeof(*this)); }
|
||
|
inline void ClearFlags() { Flags = ImGuiNextWindowDataFlags_None; }
|
||
|
};
|
||
|
|
||
|
// Multi-Selection item index or identifier when using SetNextItemSelectionUserData()/BeginMultiSelect()
|
||
|
// (Most users are likely to use this store an item INDEX but this may be used to store a POINTER as well.)
|
||
|
typedef ImS64 ImGuiSelectionUserData;
|
||
|
|
||
|
enum ImGuiNextItemDataFlags_
|
||
|
{
|
||
|
ImGuiNextItemDataFlags_None = 0,
|
||
|
ImGuiNextItemDataFlags_HasWidth = 1 << 0,
|
||
|
ImGuiNextItemDataFlags_HasOpen = 1 << 1,
|
||
|
ImGuiNextItemDataFlags_HasShortcut = 1 << 2,
|
||
|
ImGuiNextItemDataFlags_HasRefVal = 1 << 3,
|
||
|
ImGuiNextItemDataFlags_HasStorageID = 1 << 4,
|
||
|
};
|
||
|
|
||
|
struct ImGuiNextItemData
|
||
|
{
|
||
|
ImGuiNextItemDataFlags Flags;
|
||
|
ImGuiItemFlags ItemFlags; // Currently only tested/used for ImGuiItemFlags_AllowOverlap.
|
||
|
ImGuiNextItemDataFlags HasFlags; // Called HasFlags instead of Flags to avoid mistaking this
|
||
|
ImGuiItemFlags ItemFlags; // Currently only tested/used for ImGuiItemFlags_AllowOverlap and ImGuiItemFlags_HasSelectionUserData.
|
||
|
// Non-flags members are NOT cleared by ItemAdd() meaning they are still valid during NavProcessItem()
|
||
|
ImGuiID FocusScopeId; // Set by SetNextItemSelectionUserData()
|
||
|
ImGuiSelectionUserData SelectionUserData; // Set by SetNextItemSelectionUserData() (note that NULL/0 is a valid value, we use -1 == ImGuiSelectionUserData_Invalid to mark invalid values)
|
||
|
float Width; // Set by SetNextItemWidth()
|
||
|
ImGuiKeyChord Shortcut; // Set by SetNextItemShortcut()
|
||
|
ImGuiInputFlags ShortcutFlags; // Set by SetNextItemShortcut()
|
||
|
bool OpenVal; // Set by SetNextItemOpen()
|
||
|
ImGuiCond OpenCond : 8;
|
||
|
ImU8 OpenCond; // Set by SetNextItemOpen()
|
||
|
ImGuiDataTypeStorage RefVal; // Not exposed yet, for ImGuiInputTextFlags_ParseEmptyAsRefVal
|
||
|
ImGuiID StorageId; // Set by SetNextItemStorageID()
|
||
|
|
||
|
ImGuiNextItemData() { memset(this, 0, sizeof(*this)); SelectionUserData = -1; }
|
||
|
inline void ClearFlags() { Flags = ImGuiNextItemDataFlags_None; ItemFlags = ImGuiItemFlags_None; } // Also cleared manually by ItemAdd()!
|
||
|
inline void ClearFlags() { HasFlags = ImGuiNextItemDataFlags_None; ItemFlags = ImGuiItemFlags_None; } // Also cleared manually by ItemAdd()!
|
||
|
};
|
||
|
|
||
|
// Status storage for the last submitted item
|
||
|
struct ImGuiLastItemData
|
||
|
{
|
||
|
ImGuiID ID;
|
||
|
ImGuiItemFlags InFlags; // See ImGuiItemFlags_
|
||
|
ImGuiItemFlags ItemFlags; // See ImGuiItemFlags_
|
||
|
ImGuiItemStatusFlags StatusFlags; // See ImGuiItemStatusFlags_
|
||
|
ImRect Rect; // Full rectangle
|
||
|
ImRect NavRect; // Navigation scoring rectangle (not displayed)
|
||
|
// Rarely used fields are not explicitly cleared, only valid when the corresponding ImGuiItemStatusFlags is set.
|
||
|
ImRect DisplayRect; // Display rectangle (ONLY VALID IF ImGuiItemStatusFlags_HasDisplayRect is set)
|
||
|
ImRect ClipRect; // Clip rectangle at the time of submitting item (ONLY VALID IF ImGuiItemStatusFlags_HasClipRect is set)
|
||
|
// Rarely used fields are not explicitly cleared, only valid when the corresponding ImGuiItemStatusFlags ar set.
|
||
|
ImRect DisplayRect; // Display rectangle. ONLY VALID IF (StatusFlags & ImGuiItemStatusFlags_HasDisplayRect) is set.
|
||
|
ImRect ClipRect; // Clip rectangle at the time of submitting item. ONLY VALID IF (StatusFlags & ImGuiItemStatusFlags_HasClipRect) is set..
|
||
|
ImGuiKeyChord Shortcut; // Shortcut at the time of submitting item. ONLY VALID IF (StatusFlags & ImGuiItemStatusFlags_HasShortcut) is set..
|
||
|
|
||
|
ImGuiLastItemData() { memset(this, 0, sizeof(*this)); }
|
||
|
};
|
||
|
|
||
|
// Store data emitted by TreeNode() for usage by TreePop() to implement ImGuiTreeNodeFlags_NavLeftJumpsBackHere.
|
||
|
// This is the minimum amount of data that we need to perform the equivalent of NavApplyItemToResult() and which we can't infer in TreePop()
|
||
|
// Only stored when the node is a potential candidate for landing on a Left arrow jump.
|
||
|
struct ImGuiNavTreeNodeData
|
||
|
// Store data emitted by TreeNode() for usage by TreePop()
|
||
|
// - To implement ImGuiTreeNodeFlags_NavLeftJumpsBackHere: store the minimum amount of data
|
||
|
// which we can't infer in TreePop(), to perform the equivalent of NavApplyItemToResult().
|
||
|
// Only stored when the node is a potential candidate for landing on a Left arrow jump.
|
||
|
struct ImGuiTreeNodeStackData
|
||
|
{
|
||
|
ImGuiID ID;
|
||
|
ImGuiItemFlags InFlags;
|
||
|
ImRect NavRect;
|
||
|
ImGuiTreeNodeFlags TreeFlags;
|
||
|
ImGuiItemFlags ItemFlags; // Used for nav landing
|
||
|
ImRect NavRect; // Used for nav landing
|
||
|
};
|
||
|
|
||
|
struct IMGUI_API ImGuiStackSizes
|
||
|
// sizeof() = 20
|
||
|
struct IMGUI_API ImGuiErrorRecoveryState
|
||
|
{
|
||
|
short SizeOfWindowStack;
|
||
|
short SizeOfIDStack;
|
||
|
short SizeOfTreeStack;
|
||
|
short SizeOfColorStack;
|
||
|
short SizeOfStyleVarStack;
|
||
|
short SizeOfFontStack;
|
||
| ... | ... | |
|
short SizeOfBeginPopupStack;
|
||
|
short SizeOfDisabledStack;
|
||
|
|
||
|
ImGuiStackSizes() { memset(this, 0, sizeof(*this)); }
|
||
|
void SetToContextState(ImGuiContext* ctx);
|
||
|
void CompareWithContextState(ImGuiContext* ctx);
|
||
|
ImGuiErrorRecoveryState() { memset(this, 0, sizeof(*this)); }
|
||
|
};
|
||
|
|
||
|
// Data saved for each window pushed into the stack
|
||
|
struct ImGuiWindowStackData
|
||
|
{
|
||
|
ImGuiWindow* Window;
|
||
|
ImGuiLastItemData ParentLastItemDataBackup;
|
||
|
ImGuiStackSizes StackSizesOnBegin; // Store size of various stacks for asserting
|
||
|
ImGuiWindow* Window;
|
||
|
ImGuiLastItemData ParentLastItemDataBackup;
|
||
|
ImGuiErrorRecoveryState StackSizesInBegin; // Store size of various stacks for asserting
|
||
|
bool DisabledOverrideReenable; // Non-child window override disabled flag
|
||
|
};
|
||
|
|
||
|
struct ImGuiShrinkWidthItem
|
||
| ... | ... | |
|
ImGuiPtrOrIndex(int index) { Ptr = NULL; Index = index; }
|
||
|
};
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// [SECTION] Data types support
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
struct ImGuiDataVarInfo
|
||
|
{
|
||
|
ImGuiDataType Type;
|
||
|
ImU32 Count; // 1+
|
||
|
ImU32 Offset; // Offset in parent structure
|
||
|
void* GetVarPtr(void* parent) const { return (void*)((unsigned char*)parent + Offset); }
|
||
|
};
|
||
|
|
||
|
struct ImGuiDataTypeTempStorage
|
||
|
{
|
||
|
ImU8 Data[8]; // Can fit any data up to ImGuiDataType_COUNT
|
||
|
};
|
||
|
|
||
|
// Type information associated to one ImGuiDataType. Retrieve with DataTypeGetInfo().
|
||
|
struct ImGuiDataTypeInfo
|
||
|
{
|
||
|
size_t Size; // Size in bytes
|
||
|
const char* Name; // Short descriptive name for the type, for debugging
|
||
|
const char* PrintFmt; // Default printf format for the type
|
||
|
const char* ScanFmt; // Default scanf format for the type
|
||
|
};
|
||
|
|
||
|
// Extend ImGuiDataType_
|
||
|
enum ImGuiDataTypePrivate_
|
||
|
{
|
||
|
ImGuiDataType_String = ImGuiDataType_COUNT + 1,
|
||
|
ImGuiDataType_Pointer,
|
||
|
ImGuiDataType_ID,
|
||
|
};
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// [SECTION] Popup support
|
||
|
//-----------------------------------------------------------------------------
|
||
| ... | ... | |
|
{
|
||
|
ImGuiID PopupId; // Set on OpenPopup()
|
||
|
ImGuiWindow* Window; // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup()
|
||
|
ImGuiWindow* BackupNavWindow;// Set on OpenPopup(), a NavWindow that will be restored on popup close
|
||
|
ImGuiWindow* RestoreNavWindow;// Set on OpenPopup(), a NavWindow that will be restored on popup close
|
||
|
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
|
||
|
int OpenFrameCount; // Set on OpenPopup()
|
||
|
ImGuiID OpenParentId; // Set on OpenPopup(), we need this to differentiate multiple menu sets from each others (e.g. inside menu bar vs loose menu items)
|
||
| ... | ... | |
|
#define ImGuiKey_NavKeyboardTweakFast ImGuiMod_Shift
|
||
|
#define ImGuiKey_NavGamepadTweakSlow ImGuiKey_GamepadL1
|
||
|
#define ImGuiKey_NavGamepadTweakFast ImGuiKey_GamepadR1
|
||
|
#define ImGuiKey_NavGamepadActivate ImGuiKey_GamepadFaceDown
|
||
|
#define ImGuiKey_NavGamepadCancel ImGuiKey_GamepadFaceRight
|
||
|
#define ImGuiKey_NavGamepadActivate (g.IO.ConfigNavSwapGamepadButtons ? ImGuiKey_GamepadFaceRight : ImGuiKey_GamepadFaceDown)
|
||
|
#define ImGuiKey_NavGamepadCancel (g.IO.ConfigNavSwapGamepadButtons ? ImGuiKey_GamepadFaceDown : ImGuiKey_GamepadFaceRight)
|
||
|
#define ImGuiKey_NavGamepadMenu ImGuiKey_GamepadFaceLeft
|
||
|
#define ImGuiKey_NavGamepadInput ImGuiKey_GamepadFaceUp
|
||
|
|
||
| ... | ... | |
|
ImGuiInputSource_Mouse, // Note: may be Mouse or TouchScreen or Pen. See io.MouseSource to distinguish them.
|
||
|
ImGuiInputSource_Keyboard,
|
||
|
ImGuiInputSource_Gamepad,
|
||
|
ImGuiInputSource_Clipboard, // Currently only used by InputText()
|
||
|
ImGuiInputSource_COUNT
|
||
|
};
|
||
|
|
||
| ... | ... | |
|
|
||
|
// Input function taking an 'ImGuiID owner_id' argument defaults to (ImGuiKeyOwner_Any == 0) aka don't test ownership, which matches legacy behavior.
|
||
|
#define ImGuiKeyOwner_Any ((ImGuiID)0) // Accept key that have an owner, UNLESS a call to SetKeyOwner() explicitly used ImGuiInputFlags_LockThisFrame or ImGuiInputFlags_LockUntilRelease.
|
||
|
#define ImGuiKeyOwner_None ((ImGuiID)-1) // Require key to have no owner.
|
||
|
#define ImGuiKeyOwner_NoOwner ((ImGuiID)-1) // Require key to have no owner.
|
||
|
//#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.
|
||
|
|
||
|
typedef ImS16 ImGuiKeyRoutingIndex;
|
||
|
|
||
| ... | ... | |
|
struct ImGuiKeyRoutingData
|
||
|
{
|
||
|
ImGuiKeyRoutingIndex NextEntryIndex;
|
||
|
ImU16 Mods; // Technically we'd only need 4-bits but for simplify we store ImGuiMod_ values which need 16-bits. ImGuiMod_Shortcut is already translated to Ctrl/Super.
|
||
|
ImU16 Mods; // Technically we'd only need 4-bits but for simplify we store ImGuiMod_ values which need 16-bits.
|
||
|
ImU8 RoutingCurrScore; // [DEBUG] For debug display
|
||
|
ImU8 RoutingNextScore; // Lower is better (0: perfect score)
|
||
|
ImGuiID RoutingCurr;
|
||
|
ImGuiID RoutingNext;
|
||
|
|
||
|
ImGuiKeyRoutingData() { NextEntryIndex = -1; Mods = 0; RoutingCurrScore = RoutingNextScore = 255; RoutingCurr = RoutingNext = ImGuiKeyOwner_None; }
|
||
|
ImGuiKeyRoutingData() { NextEntryIndex = -1; Mods = 0; RoutingCurrScore = RoutingNextScore = 255; RoutingCurr = RoutingNext = ImGuiKeyOwner_NoOwner; }
|
||
|
};
|
||
|
|
||
|
// Routing table: maintain a desired owner for each possible key-chord (key + mods), and setup owner in NewFrame() when mods are matching.
|
||
| ... | ... | |
|
bool LockThisFrame; // Reading this key requires explicit owner id (until end of frame). Set by ImGuiInputFlags_LockThisFrame.
|
||
|
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.
|
||
|
|
||
|
ImGuiKeyOwnerData() { OwnerCurr = OwnerNext = ImGuiKeyOwner_None; LockThisFrame = LockUntilRelease = false; }
|
||
|
ImGuiKeyOwnerData() { OwnerCurr = OwnerNext = ImGuiKeyOwner_NoOwner; LockThisFrame = LockUntilRelease = false; }
|
||
|
};
|
||
|
|
||
|
// Extend ImGuiInputFlags_
|
||
|
// Flags for extended versions of IsKeyPressed(), IsMouseClicked(), Shortcut(), SetKeyOwner(), SetItemKeyOwner()
|
||
|
// Don't mistake with ImGuiInputTextFlags! (which is for ImGui::InputText() function)
|
||
|
enum ImGuiInputFlags_
|
||
|
enum ImGuiInputFlagsPrivate_
|
||
|
{
|
||
|
// Flags for IsKeyPressed(), IsKeyChordPressed(), IsMouseClicked(), Shortcut()
|
||
|
ImGuiInputFlags_None = 0,
|
||
|
|
||
|
// Repeat mode
|
||
|
ImGuiInputFlags_Repeat = 1 << 0, // Enable repeat. Return true on successive repeats. Default for legacy IsKeyPressed(). NOT Default for legacy IsMouseClicked(). MUST BE == 1.
|
||
|
ImGuiInputFlags_RepeatRateDefault = 1 << 1, // Repeat rate: Regular (default)
|
||
|
ImGuiInputFlags_RepeatRateNavMove = 1 << 2, // Repeat rate: Fast
|
||
|
ImGuiInputFlags_RepeatRateNavTweak = 1 << 3, // Repeat rate: Faster
|
||
|
|
||
|
// Repeat mode: Specify when repeating key pressed can be interrupted.
|
||
|
// In theory ImGuiInputFlags_RepeatUntilOtherKeyPress may be a desirable default, but it would break too many behavior so everything is opt-in.
|
||
|
ImGuiInputFlags_RepeatUntilRelease = 1 << 4, // Stop repeating when released (default for all functions except Shortcut). This only exists to allow overriding Shortcut() default behavior.
|
||
|
ImGuiInputFlags_RepeatUntilKeyModsChange = 1 << 5, // Stop repeating when released OR if keyboard mods are changed (default for Shortcut)
|
||
|
// - Repeat mode: Repeat rate selection
|
||
|
ImGuiInputFlags_RepeatRateDefault = 1 << 1, // Repeat rate: Regular (default)
|
||
|
ImGuiInputFlags_RepeatRateNavMove = 1 << 2, // Repeat rate: Fast
|
||
|
ImGuiInputFlags_RepeatRateNavTweak = 1 << 3, // Repeat rate: Faster
|
||
|
// - Repeat mode: Specify when repeating key pressed can be interrupted.
|
||
|
// - In theory ImGuiInputFlags_RepeatUntilOtherKeyPress may be a desirable default, but it would break too many behavior so everything is opt-in.
|
||
|
ImGuiInputFlags_RepeatUntilRelease = 1 << 4, // Stop repeating when released (default for all functions except Shortcut). This only exists to allow overriding Shortcut() default behavior.
|
||
|
ImGuiInputFlags_RepeatUntilKeyModsChange = 1 << 5, // Stop repeating when released OR if keyboard mods are changed (default for Shortcut)
|
||
|
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.
|
||
|
ImGuiInputFlags_RepeatUntilOtherKeyPress = 1 << 7, // Stop repeating when released OR if any other keyboard key is pressed during the repeat
|
||
|
|
||
|
// Flags for SetItemKeyOwner()
|
||
|
ImGuiInputFlags_CondHovered = 1 << 8, // Only set if item is hovered (default to both)
|
||
|
ImGuiInputFlags_CondActive = 1 << 9, // Only set if item is active (default to both)
|
||
|
ImGuiInputFlags_CondDefault_ = ImGuiInputFlags_CondHovered | ImGuiInputFlags_CondActive,
|
||
|
ImGuiInputFlags_RepeatUntilOtherKeyPress = 1 << 7, // Stop repeating when released OR if any other keyboard key is pressed during the repeat
|
||
|
|
||
|
// Flags for SetKeyOwner(), SetItemKeyOwner()
|
||
|
// 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.
|
||
|
ImGuiInputFlags_LockThisFrame = 1 << 10, // Further accesses to key data will require EXPLICIT owner ID (ImGuiKeyOwner_Any/0 will NOT accepted for polling). Cleared at end of frame.
|
||
|
ImGuiInputFlags_LockUntilRelease = 1 << 11, // 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.
|
||
|
|
||
|
// Routing policies for Shortcut() + low-level SetShortcutRouting()
|
||
|
// - The general idea is that several callers register interest in a shortcut, and only one owner gets it.
|
||
|
// Parent -> call Shortcut(Ctrl+S) // When Parent is focused, Parent gets the shortcut.
|
||
|
// Child1 -> call Shortcut(Ctrl+S) // When Child1 is focused, Child1 gets the shortcut (Child1 overrides Parent shortcuts)
|
||
|
// Child2 -> no call // When Child2 is focused, Parent gets the shortcut.
|
||
|
// The whole system is order independent, so if Child1 does it calls before Parent results will be identical.
|
||
|
// This is an important property as it facilitate working with foreign code or larger codebase.
|
||
|
// - Visualize registered routes in 'Metrics->Inputs' and submitted routes in 'Debug Log->InputRouting'.
|
||
|
// - When a policy (except for _RouteAlways *) is set, Shortcut() will register itself with SetShortcutRouting(),
|
||
|
// allowing the system to decide where to route the input among other route-aware calls.
|
||
|
// (* Using ImGuiInputFlags_RouteAlways is roughly equivalent to calling IsKeyChordPressed(key)).
|
||
|
// - Shortcut() uses ImGuiInputFlags_RouteFocused by default. Meaning that a Shortcut() call will register
|
||
|
// a route and only succeed when parent window is in the focus-stack and if no-one with a higher priority
|
||
|
// is claiming the same shortcut.
|
||
|
// - You can chain two unrelated windows in the focus stack using SetWindowParentWindowForFocusRoute().
|
||
|
// - Priorities: GlobalHigh > Focused (when owner is active item) > Global > Focused (when focused window) > GlobalLow.
|
||
|
// - Can select only 1 policy among all available.
|
||
|
ImGuiInputFlags_RouteFocused = 1 << 12, // (Default) Honor focus route: Accept inputs if window is in focus stack. Deep-most focused window takes inputs. ActiveId takes inputs over deep-most focused window.
|
||
|
ImGuiInputFlags_RouteGlobalLow = 1 << 13, // Register route globally (lowest priority: unless a focused window or active item registered the route) -> recommended Global priority IF you need a Global priority.
|
||
|
ImGuiInputFlags_RouteGlobal = 1 << 14, // Register route globally (medium priority: unless an active item registered the route, e.g. CTRL+A registered by InputText will take priority over this).
|
||
|
ImGuiInputFlags_RouteGlobalHigh = 1 << 15, // Register route globally (higher priority: unlikely you need to use that: will interfere with every active items, e.g. CTRL+A registered by InputText will be overriden by this)
|
||
|
ImGuiInputFlags_RouteAlways = 1 << 16, // Do not register route, poll keys directly.
|
||
|
// Routing polices: extra options
|
||
|
ImGuiInputFlags_RouteUnlessBgFocused= 1 << 17, // Global routes will not be applied if underlying background/void is focused (== no Dear ImGui windows are focused). Useful for overlay applications.
|
||
|
// - 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.
|
||
|
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.
|
||
|
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.
|
||
|
|
||
|
// - Condition for SetItemKeyOwner()
|
||
|
ImGuiInputFlags_CondHovered = 1 << 22, // Only set if item is hovered (default to both)
|
||
|
ImGuiInputFlags_CondActive = 1 << 23, // Only set if item is active (default to both)
|
||
|
ImGuiInputFlags_CondDefault_ = ImGuiInputFlags_CondHovered | ImGuiInputFlags_CondActive,
|
||
|
|
||
|
// [Internal] Mask of which function support which flags
|
||
|
ImGuiInputFlags_RepeatRateMask_ = ImGuiInputFlags_RepeatRateDefault | ImGuiInputFlags_RepeatRateNavMove | ImGuiInputFlags_RepeatRateNavTweak,
|
||
|
ImGuiInputFlags_RepeatUntilMask_ = ImGuiInputFlags_RepeatUntilRelease | ImGuiInputFlags_RepeatUntilKeyModsChange | ImGuiInputFlags_RepeatUntilKeyModsChangeFromNone | ImGuiInputFlags_RepeatUntilOtherKeyPress,
|
||
|
ImGuiInputFlags_RepeatMask_ = ImGuiInputFlags_Repeat | ImGuiInputFlags_RepeatRateMask_ | ImGuiInputFlags_RepeatUntilMask_,
|
||
|
ImGuiInputFlags_CondMask_ = ImGuiInputFlags_CondHovered | ImGuiInputFlags_CondActive,
|
||
|
ImGuiInputFlags_RouteMask_ = ImGuiInputFlags_RouteFocused | ImGuiInputFlags_RouteGlobal | ImGuiInputFlags_RouteGlobalLow | ImGuiInputFlags_RouteGlobalHigh, // _Always not part of this!
|
||
|
ImGuiInputFlags_RouteTypeMask_ = ImGuiInputFlags_RouteActive | ImGuiInputFlags_RouteFocused | ImGuiInputFlags_RouteGlobal | ImGuiInputFlags_RouteAlways,
|
||
|
ImGuiInputFlags_RouteOptionsMask_ = ImGuiInputFlags_RouteOverFocused | ImGuiInputFlags_RouteOverActive | ImGuiInputFlags_RouteUnlessBgFocused | ImGuiInputFlags_RouteFromRootWindow,
|
||
|
ImGuiInputFlags_SupportedByIsKeyPressed = ImGuiInputFlags_RepeatMask_,
|
||
|
ImGuiInputFlags_SupportedByIsMouseClicked = ImGuiInputFlags_Repeat,
|
||
|
ImGuiInputFlags_SupportedByShortcut = ImGuiInputFlags_RepeatMask_ | ImGuiInputFlags_RouteMask_ | ImGuiInputFlags_RouteAlways | ImGuiInputFlags_RouteUnlessBgFocused,
|
||
|
ImGuiInputFlags_SupportedByShortcut = ImGuiInputFlags_RepeatMask_ | ImGuiInputFlags_RouteTypeMask_ | ImGuiInputFlags_RouteOptionsMask_,
|
||
|
ImGuiInputFlags_SupportedBySetNextItemShortcut = ImGuiInputFlags_RepeatMask_ | ImGuiInputFlags_RouteTypeMask_ | ImGuiInputFlags_RouteOptionsMask_ | ImGuiInputFlags_Tooltip,
|
||
|
ImGuiInputFlags_SupportedBySetKeyOwner = ImGuiInputFlags_LockThisFrame | ImGuiInputFlags_LockUntilRelease,
|
||
|
ImGuiInputFlags_SupportedBySetItemKeyOwner = ImGuiInputFlags_SupportedBySetKeyOwner | ImGuiInputFlags_CondMask_,
|
||
|
};
|
||
| ... | ... | |
|
ImGuiScrollFlags_MaskY_ = ImGuiScrollFlags_KeepVisibleEdgeY | ImGuiScrollFlags_KeepVisibleCenterY | ImGuiScrollFlags_AlwaysCenterY,
|
||
|
};
|
||
|
|
||
|
enum ImGuiNavHighlightFlags_
|
||
|
enum ImGuiNavRenderCursorFlags_
|
||
|
{
|
||
|
ImGuiNavHighlightFlags_None = 0,
|
||
|
ImGuiNavHighlightFlags_Compact = 1 << 1, // Compact highlight, no padding
|
||
|
ImGuiNavHighlightFlags_AlwaysDraw = 1 << 2, // Draw rectangular highlight if (g.NavId == id) _even_ when using the mouse.
|
||
|
ImGuiNavHighlightFlags_NoRounding = 1 << 3,
|
||
|
ImGuiNavRenderCursorFlags_None = 0,
|
||
|
ImGuiNavRenderCursorFlags_Compact = 1 << 1, // Compact highlight, no padding/distance from focused item
|
||
|
ImGuiNavRenderCursorFlags_AlwaysDraw = 1 << 2, // Draw rectangular highlight if (g.NavId == id) even when g.NavCursorVisible == false, aka even when using the mouse.
|
||
|
ImGuiNavRenderCursorFlags_NoRounding = 1 << 3,
|
||
|
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
|
||
|
ImGuiNavHighlightFlags_None = ImGuiNavRenderCursorFlags_None, // Renamed in 1.91.4
|
||
|
ImGuiNavHighlightFlags_Compact = ImGuiNavRenderCursorFlags_Compact, // Renamed in 1.91.4
|
||
|
ImGuiNavHighlightFlags_AlwaysDraw = ImGuiNavRenderCursorFlags_AlwaysDraw, // Renamed in 1.91.4
|
||
|
ImGuiNavHighlightFlags_NoRounding = ImGuiNavRenderCursorFlags_NoRounding, // Renamed in 1.91.4
|
||
|
#endif
|
||
|
};
|
||
|
|
||
|
enum ImGuiNavMoveFlags_
|
||
| ... | ... | |
|
ImGuiNavMoveFlags_IsPageMove = 1 << 11, // Identify a PageDown/PageUp request.
|
||
|
ImGuiNavMoveFlags_Activate = 1 << 12, // Activate/select target item.
|
||
|
ImGuiNavMoveFlags_NoSelect = 1 << 13, // Don't trigger selection by not setting g.NavJustMovedTo
|
||
|
ImGuiNavMoveFlags_NoSetNavHighlight = 1 << 14, // Do not alter the visible state of keyboard vs mouse nav highlight
|
||
|
ImGuiNavMoveFlags_NoSetNavCursorVisible = 1 << 14, // Do not alter the nav cursor visible state
|
||
|
ImGuiNavMoveFlags_NoClearActiveId = 1 << 15, // (Experimental) Do not clear active id when applying move result
|
||
|
};
|
||
|
|
||
|
enum ImGuiNavLayer
|
||
| ... | ... | |
|
ImGuiNavLayer_COUNT
|
||
|
};
|
||
|
|
||
|
// Storage for navigation query/results
|
||
|
struct ImGuiNavItemData
|
||
|
{
|
||
|
ImGuiWindow* Window; // Init,Move // Best candidate window (result->ItemWindow->RootWindowForNav == request->Window)
|
||
|
ImGuiID ID; // Init,Move // Best candidate item ID
|
||
|
ImGuiID FocusScopeId; // Init,Move // Best candidate focus scope ID
|
||
|
ImRect RectRel; // Init,Move // Best candidate bounding box in window relative space
|
||
|
ImGuiItemFlags InFlags; // ????,Move // Best candidate item flags
|
||
|
ImGuiSelectionUserData SelectionUserData;//I+Mov // Best candidate SetNextItemSelectionData() value.
|
||
|
ImGuiItemFlags ItemFlags; // ????,Move // Best candidate item flags
|
||
|
float DistBox; // Move // Best candidate box distance to current NavId
|
||
|
float DistCenter; // Move // Best candidate center distance to current NavId
|
||
|
float DistAxial; // Move // Best candidate axial distance to current NavId
|
||
|
ImGuiSelectionUserData SelectionUserData;//I+Mov // Best candidate SetNextItemSelectionUserData() value. Valid if (ItemFlags & ImGuiItemFlags_HasSelectionUserData)
|
||
|
|
||
|
ImGuiNavItemData() { Clear(); }
|
||
|
void Clear() { Window = NULL; ID = FocusScopeId = 0; InFlags = 0; SelectionUserData = -1; DistBox = DistCenter = DistAxial = FLT_MAX; }
|
||
|
void Clear() { Window = NULL; ID = FocusScopeId = 0; ItemFlags = 0; SelectionUserData = -1; DistBox = DistCenter = DistAxial = FLT_MAX; }
|
||
|
};
|
||
|
|
||
|
// Storage for PushFocusScope(), g.FocusScopeStack[], g.NavFocusRoute[]
|
||
|
struct ImGuiFocusScopeData
|
||
|
{
|
||
|
ImGuiID ID;
|
||
| ... | ... | |
|
ImGuiOldColumns() { memset(this, 0, sizeof(*this)); }
|
||
|
};
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// [SECTION] Box-select support
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
struct ImGuiBoxSelectState
|
||
|
{
|
||
|
// Active box-selection data (persistent, 1 active at a time)
|
||
|
ImGuiID ID;
|
||
|
bool IsActive;
|
||
|
bool IsStarting;
|
||
|
bool IsStartedFromVoid; // Starting click was not from an item.
|
||
|
bool IsStartedSetNavIdOnce;
|
||
|
bool RequestClear;
|
||
|
ImGuiKeyChord KeyMods : 16; // Latched key-mods for box-select logic.
|
||
|
ImVec2 StartPosRel; // Start position in window-contents relative space (to support scrolling)
|
||
|
ImVec2 EndPosRel; // End position in window-contents relative space
|
||
|
ImVec2 ScrollAccum; // Scrolling accumulator (to behave at high-frame spaces)
|
||
|
ImGuiWindow* Window;
|
||
|
|
||
|
// Temporary/Transient data
|
||
|
bool UnclipMode; // (Temp/Transient, here in hot area). Set/cleared by the BeginMultiSelect()/EndMultiSelect() owning active box-select.
|
||
|
ImRect UnclipRect; // Rectangle where ItemAdd() clipping may be temporarily disabled. Need support by multi-select supporting widgets.
|
||
|
ImRect BoxSelectRectPrev; // Selection rectangle in absolute coordinates (derived every frame from BoxSelectStartPosRel and MousePos)
|
||
|
ImRect BoxSelectRectCurr;
|
||
|
|
||
|
ImGuiBoxSelectState() { memset(this, 0, sizeof(*this)); }
|
||
|
};
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// [SECTION] Multi-select support
|
||
|
//-----------------------------------------------------------------------------
|
||
| ... | ... | |
|
// We always assume that -1 is an invalid value (which works for indices and pointers)
|
||
|
#define ImGuiSelectionUserData_Invalid ((ImGuiSelectionUserData)-1)
|
||
|
|
||
|
#ifdef IMGUI_HAS_MULTI_SELECT
|
||
|
// <this is filled in 'range_select' branch>
|
||
|
#endif // #ifdef IMGUI_HAS_MULTI_SELECT
|
||
|
// Temporary storage for multi-select
|
||
|
struct IMGUI_API ImGuiMultiSelectTempData
|
||
|
{
|
||
|
ImGuiMultiSelectIO IO; // MUST BE FIRST FIELD. Requests are set and returned by BeginMultiSelect()/EndMultiSelect() + written to by user during the loop.
|
||
|
ImGuiMultiSelectState* Storage;
|
||
|
ImGuiID FocusScopeId; // Copied from g.CurrentFocusScopeId (unless another selection scope was pushed manually)
|
||
|
ImGuiMultiSelectFlags Flags;
|
||
|
ImVec2 ScopeRectMin;
|
||
|
ImVec2 BackupCursorMaxPos;
|
||
|
ImGuiSelectionUserData LastSubmittedItem; // Copy of last submitted item data, used to merge output ranges.
|
||
|
ImGuiID BoxSelectId;
|
||
|
ImGuiKeyChord KeyMods;
|
||
|
ImS8 LoopRequestSetAll; // -1: no operation, 0: clear all, 1: select all.
|
||
|
bool IsEndIO; // Set when switching IO from BeginMultiSelect() to EndMultiSelect() state.
|
||
|
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.
|
||
|
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.
|
||
|
bool NavIdPassedBy;
|
||
|
bool RangeSrcPassedBy; // Set by the item that matches RangeSrcItem.
|
||
|
bool RangeDstPassedBy; // Set by the item that matches NavJustMovedToId when IsSetRange is set.
|
||
|
|
||
|
ImGuiMultiSelectTempData() { Clear(); }
|
||
|
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.
|
||
|
void ClearIO() { IO.Requests.resize(0); IO.RangeSrcItem = IO.NavIdItem = ImGuiSelectionUserData_Invalid; IO.NavIdSelected = IO.RangeSrcReset = false; }
|
||
|
};
|
||
|
|
||
|
// Persistent storage for multi-select (as long as selection is alive)
|
||
|
struct IMGUI_API ImGuiMultiSelectState
|
||
|
{
|
||
|
ImGuiWindow* Window;
|
||
|
ImGuiID ID;
|
||
|
int LastFrameActive; // Last used frame-count, for GC.
|
||
|
int LastSelectionSize; // Set by BeginMultiSelect() based on optional info provided by user. May be -1 if unknown.
|
||
|
ImS8 RangeSelected; // -1 (don't have) or true/false
|
||
|
ImS8 NavIdSelected; // -1 (don't have) or true/false
|
||
|
ImGuiSelectionUserData RangeSrcItem; //
|
||
|
ImGuiSelectionUserData NavIdItem; // SetNextItemSelectionUserData() value for NavId (if part of submitted items)
|
||
|
|
||
|
ImGuiMultiSelectState() { Window = NULL; ID = 0; LastFrameActive = LastSelectionSize = 0; RangeSelected = NavIdSelected = -1; RangeSrcItem = NavIdItem = ImGuiSelectionUserData_Invalid; }
|
||
|
};
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// [SECTION] Docking support
|
||
| ... | ... | |
|
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.
|
||
|
ImDrawData DrawDataP;
|
||
|
ImDrawDataBuilder DrawDataBuilder; // Temporary data while building final ImDrawData
|
||
|
ImVec2 WorkOffsetMin; // Work Area: Offset from Pos to top-left corner of Work Area. Generally (0,0) or (0,+main_menu_bar_height). Work Area is Full Area but without menu-bars/status-bars (so WorkArea always fit inside Pos/Size!)
|
||
|
ImVec2 WorkOffsetMax; // Work Area: Offset from Pos+Size to bottom-right corner of Work Area. Generally (0,0) or (0,-status_bar_height).
|
||
|
ImVec2 BuildWorkOffsetMin; // Work Area: Offset being built during current frame. Generally >= 0.0f.
|
||
|
ImVec2 BuildWorkOffsetMax; // Work Area: Offset being built during current frame. Generally <= 0.0f.
|
||
|
|
||
|
// Per-viewport work area
|
||
|
// - Insets are >= 0.0f values, distance from viewport corners to work area.
|
||
|
// - BeginMainMenuBar() and DockspaceOverViewport() tend to use work area to avoid stepping over existing contents.
|
||
|
// - Generally 'safeAreaInsets' in iOS land, 'DisplayCutout' in Android land.
|
||
|
ImVec2 WorkInsetMin; // Work Area inset locked for the frame. GetWorkRect() always fits within GetMainRect().
|
||
|
ImVec2 WorkInsetMax; // "
|
||
|
ImVec2 BuildWorkInsetMin; // Work Area inset accumulator for current frame, to become next frame's WorkInset
|
||
|
ImVec2 BuildWorkInsetMax; // "
|
||
|
|
||
|
ImGuiViewportP() { BgFgDrawListsLastFrame[0] = BgFgDrawListsLastFrame[1] = -1; BgFgDrawLists[0] = BgFgDrawLists[1] = NULL; }
|
||
|
~ImGuiViewportP() { if (BgFgDrawLists[0]) IM_DELETE(BgFgDrawLists[0]); if (BgFgDrawLists[1]) IM_DELETE(BgFgDrawLists[1]); }
|
||
|
|
||
|
// 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)
|
||
|
ImVec2 CalcWorkRectPos(const ImVec2& off_min) const { return ImVec2(Pos.x + off_min.x, Pos.y + off_min.y); }
|
||
|
ImVec2 CalcWorkRectSize(const ImVec2& off_min, const ImVec2& off_max) const { return ImVec2(ImMax(0.0f, Size.x - off_min.x + off_max.x), ImMax(0.0f, Size.y - off_min.y + off_max.y)); }
|
||
|
void UpdateWorkRect() { WorkPos = CalcWorkRectPos(WorkOffsetMin); WorkSize = CalcWorkRectSize(WorkOffsetMin, WorkOffsetMax); } // Update public fields
|
||
|
ImVec2 CalcWorkRectPos(const ImVec2& inset_min) const { return ImVec2(Pos.x + inset_min.x, Pos.y + inset_min.y); }
|
||
|
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)); }
|
||
|
void UpdateWorkRect() { WorkPos = CalcWorkRectPos(WorkInsetMin); WorkSize = CalcWorkRectSize(WorkInsetMin, WorkInsetMax); } // Update public fields
|
||
|
|
||
|
// Helpers to retrieve ImRect (we don't need to store BuildWorkRect as every access tend to change it, hence the code asymmetry)
|
||
|
ImRect GetMainRect() const { return ImRect(Pos.x, Pos.y, Pos.x + Size.x, Pos.y + Size.y); }
|
||
|
ImRect GetWorkRect() const { return ImRect(WorkPos.x, WorkPos.y, WorkPos.x + WorkSize.x, WorkPos.y + WorkSize.y); }
|
||
|
ImRect GetBuildWorkRect() const { ImVec2 pos = CalcWorkRectPos(BuildWorkOffsetMin); ImVec2 size = CalcWorkRectSize(BuildWorkOffsetMin, BuildWorkOffsetMax); return ImRect(pos.x, pos.y, pos.x + size.x, pos.y + size.y); }
|
||
|
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); }
|
||
|
};
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
| ... | ... | |
|
ImGuiLocKey_WindowingMainMenuBar,
|
||
|
ImGuiLocKey_WindowingPopup,
|
||
|
ImGuiLocKey_WindowingUntitled,
|
||
|
ImGuiLocKey_OpenLink_s,
|
||
|
ImGuiLocKey_CopyLink,
|
||
|
ImGuiLocKey_COUNT
|
||
|
};
|
||
|
|
||
| ... | ... | |
|
const char* Text;
|
||
|
};
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// [SECTION] Error handling, State recovery support
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
// Macros used by Recoverable Error handling
|
||
|
// - Only dispatch error if _EXPR: evaluate as assert (similar to an assert macro).
|
||
|
// - The message will always be a string literal, in order to increase likelihood of being display by an assert handler.
|
||
|
// - See 'Demo->Configuration->Error Handling' and ImGuiIO definitions for details on error handling.
|
||
|
// - Read https://github.com/ocornut/imgui/wiki/Error-Handling for details on error handling.
|
||
|
#ifndef IM_ASSERT_USER_ERROR
|
||
|
#define IM_ASSERT_USER_ERROR(_EXPR,_MSG) do { if (!(_EXPR) && ImGui::ErrorLog(_MSG)) { IM_ASSERT((_EXPR) && _MSG); } } while (0) // Recoverable User Error
|
||
|
#endif
|
||
|
|
||
|
// The error callback is currently not public, as it is expected that only advanced users will rely on it.
|
||
|
typedef void (*ImGuiErrorCallback)(ImGuiContext* ctx, void* user_data, const char* msg); // Function signature for g.ErrorCallback
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// [SECTION] Metrics, Debug Tools
|
||
| ... | ... | |
|
{
|
||
|
// Event types
|
||
|
ImGuiDebugLogFlags_None = 0,
|
||
|
ImGuiDebugLogFlags_EventActiveId = 1 << 0,
|
||
|
ImGuiDebugLogFlags_EventFocus = 1 << 1,
|
||
|
ImGuiDebugLogFlags_EventPopup = 1 << 2,
|
||
|
ImGuiDebugLogFlags_EventNav = 1 << 3,
|
||
|
ImGuiDebugLogFlags_EventClipper = 1 << 4,
|
||
|
ImGuiDebugLogFlags_EventSelection = 1 << 5,
|
||
|
ImGuiDebugLogFlags_EventIO = 1 << 6,
|
||
|
ImGuiDebugLogFlags_EventInputRouting = 1 << 7,
|
||
|
|
||
|
ImGuiDebugLogFlags_EventMask_ = ImGuiDebugLogFlags_EventActiveId | ImGuiDebugLogFlags_EventFocus | ImGuiDebugLogFlags_EventPopup | ImGuiDebugLogFlags_EventNav | ImGuiDebugLogFlags_EventClipper | ImGuiDebugLogFlags_EventSelection | ImGuiDebugLogFlags_EventIO | ImGuiDebugLogFlags_EventInputRouting,
|
||
|
ImGuiDebugLogFlags_EventError = 1 << 0, // Error submitted by IM_ASSERT_USER_ERROR()
|
||
|
ImGuiDebugLogFlags_EventActiveId = 1 << 1,
|
||
|
ImGuiDebugLogFlags_EventFocus = 1 << 2,
|
||
|
ImGuiDebugLogFlags_EventPopup = 1 << 3,
|
||
|
ImGuiDebugLogFlags_EventNav = 1 << 4,
|
||
|
ImGuiDebugLogFlags_EventClipper = 1 << 5,
|
||
|
ImGuiDebugLogFlags_EventSelection = 1 << 6,
|
||
|
ImGuiDebugLogFlags_EventIO = 1 << 7,
|
||
|
ImGuiDebugLogFlags_EventInputRouting = 1 << 8,
|
||
|
ImGuiDebugLogFlags_EventDocking = 1 << 9, // Unused in this branch
|
||
|
ImGuiDebugLogFlags_EventViewport = 1 << 10, // Unused in this branch
|
||
|
|
||
|
ImGuiDebugLogFlags_EventMask_ = ImGuiDebugLogFlags_EventError | ImGuiDebugLogFlags_EventActiveId | ImGuiDebugLogFlags_EventFocus | ImGuiDebugLogFlags_EventPopup | ImGuiDebugLogFlags_EventNav | ImGuiDebugLogFlags_EventClipper | ImGuiDebugLogFlags_EventSelection | ImGuiDebugLogFlags_EventIO | ImGuiDebugLogFlags_EventInputRouting | ImGuiDebugLogFlags_EventDocking | ImGuiDebugLogFlags_EventViewport,
|
||
|
ImGuiDebugLogFlags_OutputToTTY = 1 << 20, // Also send output to TTY
|
||
|
ImGuiDebugLogFlags_OutputToTestEngine = 1 << 21, // Also send output to Test Engine
|
||
|
};
|
||
| ... | ... | |
|
bool ShowAtlasTintedWithTextColor = false;
|
||
|
int ShowWindowsRectsType = -1;
|
||
|
int ShowTablesRectsType = -1;
|
||
|
int HighlightMonitorIdx = -1;
|
||
|
ImGuiID HighlightViewportID = 0;
|
||
|
};
|
||
|
|
||
|
struct ImGuiStackLevelInfo
|
||
| ... | ... | |
|
bool Initialized;
|
||
|
bool FontAtlasOwnedByContext; // IO.Fonts-> is owned by the ImGuiContext and will be destructed along with it.
|
||
|
ImGuiIO IO;
|
||
|
ImGuiPlatformIO PlatformIO;
|
||
|
ImGuiStyle Style;
|
||
|
ImFont* Font; // (Shortcut) == FontStack.empty() ? IO.Font : FontStack.back()
|
||
|
float FontSize; // (Shortcut) == FontBaseSize * g.CurrentWindow->FontWindowScale == window->FontSize(). Text height for current window.
|
||
|
float FontBaseSize; // (Shortcut) == IO.FontGlobalScale * Font->Scale * Font->FontSize. Base text height.
|
||
|
float FontScale; // == FontSize / Font->FontSize
|
||
|
float CurrentDpiScale; // Current window/viewport DpiScale
|
||
|
ImDrawListSharedData DrawListSharedData;
|
||
|
double Time;
|
||
|
int FrameCount;
|
||
| ... | ... | |
|
bool GcCompactAll; // Request full GC
|
||
|
bool TestEngineHookItems; // Will call test engine hooks: ImGuiTestEngineHook_ItemAdd(), ImGuiTestEngineHook_ItemInfo(), ImGuiTestEngineHook_Log()
|
||
|
void* TestEngine; // Test engine user data
|
||
|
char ContextName[16]; // Storage for a context name (to facilitate debugging multi-context setups)
|
||
|
|
||
|
// Inputs
|
||
|
ImVector<ImGuiInputEvent> InputEventsQueue; // Input events which will be trickled/written into IO structure.
|
||
| ... | ... | |
|
ImVector<ImGuiWindowStackData> CurrentWindowStack;
|
||
|
ImGuiStorage WindowsById; // Map window's ImGuiID to ImGuiWindow*
|
||
|
int WindowsActiveCount; // Number of unique windows submitted by frame
|
||
|
ImVec2 WindowsHoverPadding; // Padding around resizable windows for which hovering on counts as hovering the window == ImMax(style.TouchExtraPadding, WINDOWS_HOVER_PADDING)
|
||
|
ImVec2 WindowsHoverPadding; // Padding around resizable windows for which hovering on counts as hovering the window == ImMax(style.TouchExtraPadding, WINDOWS_HOVER_PADDING).
|
||
|
ImGuiID DebugBreakInWindow; // Set to break in Begin() call.
|
||
|
ImGuiWindow* CurrentWindow; // Window being drawn into
|
||
|
ImGuiWindow* HoveredWindow; // Window the mouse is hovering. Will typically catch mouse inputs.
|
||
|
ImGuiWindow* HoveredWindowUnderMovingWindow; // Hovered window ignoring MovingWindow. Only set if MovingWindow is set.
|
||
|
ImGuiWindow* HoveredWindowBeforeClear; // Window the mouse is hovering. Filled even with _NoMouse. This is currently useful for multi-context compositors.
|
||
|
ImGuiWindow* MovingWindow; // Track the window we clicked on (in order to preserve focus). The actual window that is moved is generally MovingWindow->RootWindow.
|
||
|
ImGuiWindow* WheelingWindow; // Track the window we started mouse-wheeling on. Until a timer elapse or mouse has moved, generally keep scrolling the same window even if during the course of scrolling the mouse ends up hovering a child window.
|
||
|
ImVec2 WheelingWindowRefMousePos;
|
||
| ... | ... | |
|
ImVec2 WheelingAxisAvg;
|
||
|
|
||
|
// Item/widgets state and tracking information
|
||
|
ImGuiID DebugDrawIdConflicts; // Set when we detect multiple items with the same identifier
|
||
|
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]
|
||
|
ImGuiID HoveredId; // Hovered widget, filled during the frame
|
||
|
ImGuiID HoveredIdPreviousFrame;
|
||
|
bool HoveredIdAllowOverlap;
|
||
|
bool HoveredIdDisabled; // At least one widget passed the rect test, but has been discarded by disabled flag or popup inhibit. May be true even if HoveredId == 0.
|
||
|
int HoveredIdPreviousFrameItemCount; // Count numbers of items using the same ID as last frame's hovered id
|
||
|
float HoveredIdTimer; // Measure contiguous hovering time
|
||
|
float HoveredIdNotActiveTimer; // Measure contiguous hovering time where the item has not been active
|
||
|
bool HoveredIdAllowOverlap;
|
||
|
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.
|
||
|
bool ItemUnclipByLog; // Disable ItemAdd() clipping, essentially a memory-locality friendly copy of LogEnabled
|
||
|
ImGuiID ActiveId; // Active widget
|
||
|
ImGuiID ActiveIdIsAlive; // Active widget has been seen this frame (we can't use a bool as the ActiveId may change within the frame)
|
||
|
float ActiveIdTimer;
|
||
| ... | ... | |
|
ImGuiID LastActiveId; // Store the last non-zero ActiveId, useful for animation.
|
||
|
float LastActiveIdTimer; // Store the last non-zero ActiveId timer since the beginning of activation, useful for animation.
|
||
|
|
||
|
// [EXPERIMENTAL] Key/Input Ownership + Shortcut Routing system
|
||
|
// Key/Input Ownership + Shortcut Routing system
|
||
|
// - The idea is that instead of "eating" a given key, we can link to an owner.
|
||
|
// - Input query can then read input by specifying ImGuiKeyOwner_Any (== 0), ImGuiKeyOwner_None (== -1) or a custom ID.
|
||
|
// - Input query can then read input by specifying ImGuiKeyOwner_Any (== 0), ImGuiKeyOwner_NoOwner (== -1) or a custom ID.
|
||
|
// - Routing is requested ahead of time for a given chord (Key + Mods) and granted in NewFrame().
|
||
|
double LastKeyModsChangeTime; // Record the last time key mods changed (affect repeat delay when using shortcut logic)
|
||
|
double LastKeyModsChangeFromNoneTime; // Record the last time key mods changed away from being 0 (affect repeat delay when using shortcut logic)
|
||
| ... | ... | |
|
ImGuiKeyOwnerData KeysOwnerData[ImGuiKey_NamedKey_COUNT];
|
||
|
ImGuiKeyRoutingTable KeysRoutingTable;
|
||
|
ImU32 ActiveIdUsingNavDirMask; // Active widget will want to read those nav move requests (e.g. can activate a button and move away from it)
|
||
|
bool ActiveIdUsingAllKeyboardKeys; // Active widget will want to read all keyboard keys inputs. (FIXME: This is a shortcut for not taking ownership of 100+ keys but perhaps best to not have the inconsistency)
|
||
|
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)
|
||
|
ImGuiKeyChord DebugBreakInShortcutRouting; // Set to break in SetShortcutRouting()/Shortcut() calls.
|
||
|
#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
|
||
|
ImU32 ActiveIdUsingNavInputMask; // If you used this. Since (IMGUI_VERSION_NUM >= 18804) : 'g.ActiveIdUsingNavInputMask |= (1 << ImGuiNavInput_Cancel);' becomes 'SetKeyOwner(ImGuiKey_Escape, g.ActiveId) and/or SetKeyOwner(ImGuiKey_NavGamepadCancel, g.ActiveId);'
|
||
|
#endif
|
||
|
//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);'
|
||
|
|
||
|
// Next window/item data
|
||
|
ImGuiID CurrentFocusScopeId; // Value for currently appending items == g.FocusScopeStack.back(). Not to be mistaken with g.NavFocusScopeId.
|
||
| ... | ... | |
|
ImVector<ImGuiGroupData> GroupStack; // Stack for BeginGroup()/EndGroup() - not inherited by Begin()
|
||
|
ImVector<ImGuiPopupData> OpenPopupStack; // Which popups are open (persistent)
|
||
|
ImVector<ImGuiPopupData> BeginPopupStack; // Which level of BeginPopup() we are in (reset every frame)
|
||
|
ImVector<ImGuiNavTreeNodeData> NavTreeNodeStack; // Stack for TreeNode() when a NavLeft requested is emitted.
|
||
|
|
||
|
int BeginMenuCount;
|
||
|
ImVector<ImGuiTreeNodeStackData>TreeNodeStack; // Stack for TreeNode()
|
||
|
|
||
|
// Viewports
|
||
|
ImVector<ImGuiViewportP*> Viewports; // Active viewports (Size==1 in 'master' branch). Each viewports hold their copy of ImDrawData.
|
||
|
|
||
|
// Gamepad/keyboard Navigation
|
||
|
ImGuiWindow* NavWindow; // Focused window for navigation. Could be called 'FocusedWindow'
|
||
|
// Keyboard/Gamepad Navigation
|
||
|
bool NavCursorVisible; // Nav focus cursor/rectangle is visible? We hide it after a mouse click. We show it after a nav move.
|
||
|
bool NavHighlightItemUnderNav; // Disable mouse hovering highlight. Highlight navigation focused item instead of mouse hovered item.
|
||
|
//bool NavDisableHighlight; // Old name for !g.NavCursorVisible before 1.91.4 (2024/10/18). OPPOSITE VALUE (g.NavDisableHighlight == !g.NavCursorVisible)
|
||
|
//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.
|
||
|
bool NavMousePosDirty; // When set we will update mouse position if io.ConfigNavMoveSetMousePos is set (not enabled by default)
|
||
|
bool NavIdIsAlive; // Nav widget has been seen this frame ~~ NavRectRel is valid
|
||
|
ImGuiID NavId; // Focused item for navigation
|
||
|
ImGuiWindow* NavWindow; // Focused window for navigation. Could be called 'FocusedWindow'
|
||
|
ImGuiID NavFocusScopeId; // Focused focus scope (e.g. selection code often wants to "clear other items" when landing on an item of the same scope)
|
||
|
ImVector<ImGuiFocusScopeData> NavFocusRoute; // Reversed copy focus scope stack for NavId (should contains NavFocusScopeId). This essentially follow the window->ParentWindowForFocusRoute chain.
|
||
|
ImGuiNavLayer NavLayer; // Focused layer (main scrolling layer, or menu/title bar layer)
|
||
|
ImGuiID NavActivateId; // ~~ (g.ActiveId == 0) && (IsKeyPressed(ImGuiKey_Space) || IsKeyDown(ImGuiKey_Enter) || IsKeyPressed(ImGuiKey_NavGamepadActivate)) ? NavId : 0, also set when calling ActivateItem()
|
||
|
ImGuiID NavActivateDownId; // ~~ IsKeyDown(ImGuiKey_Space) || IsKeyDown(ImGuiKey_Enter) || IsKeyDown(ImGuiKey_NavGamepadActivate) ? NavId : 0
|
||
|
ImGuiID NavActivatePressedId; // ~~ IsKeyPressed(ImGuiKey_Space) || IsKeyPressed(ImGuiKey_Enter) || IsKeyPressed(ImGuiKey_NavGamepadActivate) ? NavId : 0 (no repeat)
|
||
|
ImGuiActivateFlags NavActivateFlags;
|
||
|
ImVector<ImGuiFocusScopeData> NavFocusRoute; // Reversed copy focus scope stack for NavId (should contains NavFocusScopeId). This essentially follow the window->ParentWindowForFocusRoute chain.
|
||
|
ImGuiID NavHighlightActivatedId;
|
||
|
float NavHighlightActivatedTimer;
|
||
|
ImGuiID NavJustMovedToId; // Just navigated to this id (result of a successfully MoveRequest).
|
||
|
ImGuiID NavJustMovedToFocusScopeId; // Just navigated to this focus scope id (result of a successfully MoveRequest).
|
||
|
ImGuiKeyChord NavJustMovedToKeyMods;
|
||
|
ImGuiID NavNextActivateId; // Set by ActivateItem(), queued until next frame.
|
||
|
ImGuiActivateFlags NavNextActivateFlags;
|
||
|
ImGuiInputSource NavInputSource; // Keyboard or Gamepad mode? THIS CAN ONLY BE ImGuiInputSource_Keyboard or ImGuiInputSource_Mouse
|
||
|
ImGuiNavLayer NavLayer; // Layer we are navigating on. For now the system is hard-coded for 0=main contents and 1=menu/title bar, may expose layers later.
|
||
|
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.
|
||
|
bool NavIdIsAlive; // Nav widget has been seen this frame ~~ NavRectRel is valid
|
||
|
bool NavMousePosDirty; // When set we will update mouse position if (io.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos) if set (NB: this not enabled by default)
|
||
|
bool NavDisableHighlight; // When user starts using mouse, we hide gamepad/keyboard highlight (NB: but they are still available, which is why NavDisableHighlight isn't always != NavDisableMouseHover)
|
||
|
bool NavDisableMouseHover; // When user starts using gamepad/keyboard, we hide mouse hovering highlight until mouse is touched again.
|
||
|
ImS8 NavCursorHideFrames;
|
||
|
|
||
|
// Navigation: Init & Move Requests
|
||
|
bool NavAnyRequest; // ~~ NavMoveRequest || NavInitRequest this is to perform early out in ItemAdd()
|
||
| ... | ... | |
|
ImGuiNavItemData NavMoveResultOther; // Best move request candidate within NavWindow's flattened hierarchy (when using ImGuiWindowFlags_NavFlattened flag)
|
||
|
ImGuiNavItemData NavTabbingResultFirst; // First tabbing request candidate within NavWindow and flattened hierarchy
|
||
|
|
||
|
// Navigation: record of last move request
|
||
|
ImGuiID NavJustMovedFromFocusScopeId; // Just navigated from this focus scope id (result of a successfully MoveRequest).
|
||
|
ImGuiID NavJustMovedToId; // Just navigated to this id (result of a successfully MoveRequest).
|
||
|
ImGuiID NavJustMovedToFocusScopeId; // Just navigated to this focus scope id (result of a successfully MoveRequest).
|
||
|
ImGuiKeyChord NavJustMovedToKeyMods;
|
||
|
bool NavJustMovedToIsTabbing; // Copy of ImGuiNavMoveFlags_IsTabbing. Maybe we should store whole flags.
|
||
|
bool NavJustMovedToHasSelectionData; // Copy of move result's ItemFlags & ImGuiItemFlags_HasSelectionUserData). Maybe we should just store ImGuiNavItemData.
|
||
|
|
||
|
// Navigation: Windowing (CTRL+TAB for list, or Menu button + keys or directional pads to move/resize)
|
||
|
ImGuiKeyChord ConfigNavWindowingKeyNext; // = ImGuiMod_Ctrl | ImGuiKey_Tab, for reconfiguration (see #4828)
|
||
|
ImGuiKeyChord ConfigNavWindowingKeyPrev; // = ImGuiMod_Ctrl | ImGuiMod_Shift | ImGuiKey_Tab
|
||
|
ImGuiKeyChord ConfigNavWindowingKeyNext; // = ImGuiMod_Ctrl | ImGuiKey_Tab (or ImGuiMod_Super | ImGuiKey_Tab on OS X). For reconfiguration (see #4828)
|
||
|
ImGuiKeyChord ConfigNavWindowingKeyPrev; // = ImGuiMod_Ctrl | ImGuiMod_Shift | ImGuiKey_Tab (or ImGuiMod_Super | ImGuiMod_Shift | ImGuiKey_Tab on OS X)
|
||
|
ImGuiWindow* NavWindowingTarget; // Target window when doing CTRL+Tab (or Pad Menu + FocusPrev/Next), this window is temporarily displayed top-most!
|
||
|
ImGuiWindow* NavWindowingTargetAnim; // Record of last valid NavWindowingTarget until DimBgRatio and NavWindowingHighlightAlpha becomes 0.0f, so the fade-out can stay on it.
|
||
|
ImGuiWindow* NavWindowingListWindow; // Internal window actually listing the CTRL+Tab contents
|
||
| ... | ... | |
|
ImVector<ImGuiPtrOrIndex> CurrentTabBarStack;
|
||
|
ImVector<ImGuiShrinkWidthItem> ShrinkWidthBuffer;
|
||
|
|
||
|
// Multi-Select state
|
||
|
ImGuiBoxSelectState BoxSelectState;
|
||
|
ImGuiMultiSelectTempData* CurrentMultiSelect;
|
||
|
int MultiSelectTempDataStacked; // Temporary multi-select data size (because we leave previous instances undestructed, we generally don't use MultiSelectTempData.Size)
|
||
|
ImVector<ImGuiMultiSelectTempData> MultiSelectTempData;
|
||
|
ImPool<ImGuiMultiSelectState> MultiSelectStorage;
|
||
|
|
||
|
// Hover Delay system
|
||
|
ImGuiID HoverItemDelayId;
|
||
|
ImGuiID HoverItemDelayIdPreviousFrame;
|
||
| ... | ... | |
|
ImGuiInputTextDeactivatedState InputTextDeactivatedState;
|
||
|
ImFont InputTextPasswordFont;
|
||
|
ImGuiID TempInputId; // Temporary text input when CTRL+clicking on a slider, etc.
|
||
|
ImGuiDataTypeStorage DataTypeZeroValue; // 0 for all data types
|
||
|
int BeginMenuDepth;
|
||
|
int BeginComboDepth;
|
||
|
ImGuiColorEditFlags ColorEditOptions; // Store user options for color edit widgets
|
||
|
ImGuiID ColorEditCurrentID; // Set temporarily while inside of the parent-most ColorEdit4/ColorPicker4 (because they call each others).
|
||
|
ImGuiID ColorEditSavedID; // ID we are saving/restoring HS for
|
||
| ... | ... | |
|
ImGuiComboPreviewData ComboPreviewData;
|
||
|
ImRect WindowResizeBorderExpectedRect; // Expected border rect, switch to relative edit if moving
|
||
|
bool WindowResizeRelativeMode;
|
||
|
short ScrollbarSeekMode; // 0: scroll to clicked location, -1/+1: prev/next page.
|
||
|
float ScrollbarClickDeltaToGrabCenter; // When scrolling to mouse location: distance between mouse and center of grab box, normalized in parent space.
|
||
|
float SliderGrabClickOffset;
|
||
|
float SliderCurrentAccum; // Accumulated slider delta when using navigation controls.
|
||
|
bool SliderCurrentAccumDirty; // Has the accumulated slider delta changed since last time we tried to apply it?
|
||
|
bool DragCurrentAccumDirty;
|
||
|
float DragCurrentAccum; // Accumulator for dragging modification. Always high-precision, not rounded by end-user precision settings
|
||
|
float DragSpeedDefaultRatio; // If speed == 0.0f, uses (max-min) * DragSpeedDefaultRatio
|
||
|
float ScrollbarClickDeltaToGrabCenter; // Distance between mouse and center of grab box, normalized in parent space. Use storage?
|
||
|
float DisabledAlphaBackup; // Backup for style.Alpha for BeginDisabled()
|
||
|
short DisabledStackSize;
|
||
|
short LockMarkEdited;
|
||
|
short TooltipOverrideCount;
|
||
|
ImGuiWindow* TooltipPreviousWindow; // Window of last tooltip submitted during the frame
|
||
|
ImVector<char> ClipboardHandlerData; // If no custom clipboard handler is defined
|
||
|
ImVector<ImGuiID> MenusIdSubmittedThisFrame; // A list of menu IDs that were rendered at least once
|
||
|
ImGuiTypingSelectState TypingSelectState; // State for GetTypingSelectRequest()
|
||
|
|
||
|
// Platform support
|
||
|
ImGuiPlatformImeData PlatformImeData; // Data updated by current frame
|
||
|
ImGuiPlatformImeData PlatformImeDataPrev; // Previous frame data (when changing we will call io.SetPlatformImeDataFn
|
||
|
ImGuiPlatformImeData PlatformImeDataPrev; // Previous frame data. When changed we call the platform_io.Platform_SetImeDataFn() handler.
|
||
|
|
||
|
// Settings
|
||
|
bool SettingsLoaded;
|
||
| ... | ... | |
|
|
||
|
// Capture/Logging
|
||
|
bool LogEnabled; // Currently capturing
|
||
|
ImGuiLogType LogType; // Capture target
|
||
|
ImGuiLogFlags LogFlags; // Capture flags/type
|
||
|
ImGuiWindow* LogWindow;
|
||
|
ImFileHandle LogFile; // If != NULL log to stdout/ file
|
||
|
ImGuiTextBuffer LogBuffer; // Accumulation buffer when log to clipboard. This is pointer so our GImGui static constructor doesn't call heap allocators.
|
||
|
const char* LogNextPrefix;
|
||
| ... | ... | |
|
int LogDepthToExpand;
|
||
|
int LogDepthToExpandDefault; // Default/stored value for LogDepthMaxExpand if not specified in the LogXXX function call.
|
||
|
|
||
|
// Error Handling
|
||
|
ImGuiErrorCallback ErrorCallback; // = NULL. May be exposed in public API eventually.
|
||
|
void* ErrorCallbackUserData; // = NULL
|
||
|
ImVec2 ErrorTooltipLockedPos;
|
||
|
bool ErrorFirst;
|
||
|
int ErrorCountCurrentFrame; // [Internal] Number of errors submitted this frame.
|
||
|
ImGuiErrorRecoveryState StackSizesInNewFrame; // [Internal]
|
||
|
ImGuiErrorRecoveryState*StackSizesInBeginForCurrentWindow; // [Internal]
|
||
|
|
||
|
// Debug Tools
|
||
|
// (some of the highly frequently used data are interleaved in other structures above: DebugBreakXXX fields, DebugHookIdInfo, DebugLocateId etc.)
|
||
|
int DebugDrawIdConflictsCount; // Locked count (preserved when holding CTRL)
|
||
|
ImGuiDebugLogFlags DebugLogFlags;
|
||
|
ImGuiTextBuffer DebugLogBuf;
|
||
|
ImGuiTextIndex DebugLogIndex;
|
||
|
int DebugLogSkippedErrors;
|
||
|
ImGuiDebugLogFlags DebugLogAutoDisableFlags;
|
||
|
ImU8 DebugLogAutoDisableFrames;
|
||
|
ImU8 DebugLocateFrames; // For DebugLocateItemOnHover(). This is used together with DebugLocateId which is in a hot/cached spot above.
|
||
| ... | ... | |
|
ImVector<char> TempBuffer; // Temporary text buffer
|
||
|
char TempKeychordName[64];
|
||
|
|
||
|
ImGuiContext(ImFontAtlas* shared_font_atlas)
|
||
|
{
|
||
|
IO.Ctx = this;
|
||
|
InputTextState.Ctx = this;
|
||
|
|
||
|
Initialized = false;
|
||
|
FontAtlasOwnedByContext = shared_font_atlas ? false : true;
|
||
|
Font = NULL;
|
||
|
FontSize = FontBaseSize = 0.0f;
|
||
|
IO.Fonts = shared_font_atlas ? shared_font_atlas : IM_NEW(ImFontAtlas)();
|
||
|
Time = 0.0f;
|
||
|
FrameCount = 0;
|
||
|
FrameCountEnded = FrameCountRendered = -1;
|
||
|
WithinFrameScope = WithinFrameScopeWithImplicitWindow = WithinEndChild = false;
|
||
|
GcCompactAll = false;
|
||
|
TestEngineHookItems = false;
|
||
|
TestEngine = NULL;
|
||
|
|
||
|
InputEventsNextMouseSource = ImGuiMouseSource_Mouse;
|
||
|
InputEventsNextEventId = 1;
|
||
|
|
||
|
WindowsActiveCount = 0;
|
||
|
CurrentWindow = NULL;
|
||
|
HoveredWindow = NULL;
|
||
|
HoveredWindowUnderMovingWindow = NULL;
|
||
|
MovingWindow = NULL;
|
||
|
WheelingWindow = NULL;
|
||
|
WheelingWindowStartFrame = WheelingWindowScrolledFrame = -1;
|
||
|
WheelingWindowReleaseTimer = 0.0f;
|
||
|
|
||
|
DebugHookIdInfo = 0;
|
||
|
HoveredId = HoveredIdPreviousFrame = 0;
|
||
|
HoveredIdAllowOverlap = false;
|
||
|
HoveredIdDisabled = false;
|
||
|
HoveredIdTimer = HoveredIdNotActiveTimer = 0.0f;
|
||
|
ActiveId = 0;
|
||
|
ActiveIdIsAlive = 0;
|
||
|
ActiveIdTimer = 0.0f;
|
||
|
ActiveIdIsJustActivated = false;
|
||
|
ActiveIdAllowOverlap = false;
|
||
|
ActiveIdNoClearOnFocusLoss = false;
|
||
|
ActiveIdHasBeenPressedBefore = false;
|
||
|
ActiveIdHasBeenEditedBefore = false;
|
||
|
ActiveIdHasBeenEditedThisFrame = false;
|
||
|
ActiveIdFromShortcut = false;
|
||
|
ActiveIdClickOffset = ImVec2(-1, -1);
|
||
|
ActiveIdWindow = NULL;
|
||
|
ActiveIdSource = ImGuiInputSource_None;
|
||
|
ActiveIdMouseButton = -1;
|
||
|
ActiveIdPreviousFrame = 0;
|
||
|
ActiveIdPreviousFrameIsAlive = false;
|
||
|
ActiveIdPreviousFrameHasBeenEditedBefore = false;
|
||
|
ActiveIdPreviousFrameWindow = NULL;
|
||
|
LastActiveId = 0;
|
||
|
LastActiveIdTimer = 0.0f;
|
||
|
|
||
|
LastKeyboardKeyPressTime = LastKeyModsChangeTime = LastKeyModsChangeFromNoneTime = -1.0;
|
||
|
|
||
|
ActiveIdUsingNavDirMask = 0x00;
|
||
|
ActiveIdUsingAllKeyboardKeys = false;
|
||
|
#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
|
||
|
ActiveIdUsingNavInputMask = 0x00;
|
||
|
#endif
|
||
|
|
||
|
CurrentFocusScopeId = 0;
|
||
|
CurrentItemFlags = ImGuiItemFlags_None;
|
||
|
DebugShowGroupRects = false;
|
||
|
BeginMenuCount = 0;
|
||
|
|
||
|
NavWindow = NULL;
|
||
|
NavId = NavFocusScopeId = NavActivateId = NavActivateDownId = NavActivatePressedId = 0;
|
||
|
NavJustMovedToId = NavJustMovedToFocusScopeId = NavNextActivateId = 0;
|
||
|
NavActivateFlags = NavNextActivateFlags = ImGuiActivateFlags_None;
|
||
|
NavHighlightActivatedId = 0;
|
||
|
NavHighlightActivatedTimer = 0.0f;
|
||
|
NavJustMovedToKeyMods = ImGuiMod_None;
|
||
|
NavInputSource = ImGuiInputSource_Keyboard;
|
||
|
NavLayer = ImGuiNavLayer_Main;
|
||
|
NavLastValidSelectionUserData = ImGuiSelectionUserData_Invalid;
|
||
|
NavIdIsAlive = false;
|
||
|
NavMousePosDirty = false;
|
||
|
NavDisableHighlight = true;
|
||
|
NavDisableMouseHover = false;
|
||
|
NavAnyRequest = false;
|
||
|
NavInitRequest = false;
|
||
|
NavInitRequestFromMove = false;
|
||
|
NavMoveSubmitted = false;
|
||
|
NavMoveScoringItems = false;
|
||
|
NavMoveForwardToNextFrame = false;
|
||
|
NavMoveFlags = ImGuiNavMoveFlags_None;
|
||
|
NavMoveScrollFlags = ImGuiScrollFlags_None;
|
||
|
NavMoveKeyMods = ImGuiMod_None;
|
||
|
NavMoveDir = NavMoveDirForDebug = NavMoveClipDir = ImGuiDir_None;
|
||
|
NavScoringDebugCount = 0;
|
||
|
NavTabbingDir = 0;
|
||
|
NavTabbingCounter = 0;
|
||
|
|
||
|
ConfigNavWindowingKeyNext = ImGuiMod_Ctrl | ImGuiKey_Tab;
|
||
|
ConfigNavWindowingKeyPrev = ImGuiMod_Ctrl | ImGuiMod_Shift | ImGuiKey_Tab;
|
||
|
NavWindowingTarget = NavWindowingTargetAnim = NavWindowingListWindow = NULL;
|
||
|
NavWindowingTimer = NavWindowingHighlightAlpha = 0.0f;
|
||
|
NavWindowingToggleLayer = false;
|
||
|
NavWindowingToggleKey = ImGuiKey_None;
|
||
|
|
||
|
DimBgRatio = 0.0f;
|
||
|
|
||
|
DragDropActive = DragDropWithinSource = DragDropWithinTarget = false;
|
||
|
DragDropSourceFlags = ImGuiDragDropFlags_None;
|
||
|
DragDropSourceFrameCount = -1;
|
||
|
DragDropMouseButton = -1;
|
||
|
DragDropTargetId = 0;
|
||
|
DragDropAcceptFlags = ImGuiDragDropFlags_None;
|
||
|
DragDropAcceptIdCurrRectSurface = 0.0f;
|
||
|
DragDropAcceptIdPrev = DragDropAcceptIdCurr = 0;
|
||
|
DragDropAcceptFrameCount = -1;
|
||
|
DragDropHoldJustPressedId = 0;
|
||
|
memset(DragDropPayloadBufLocal, 0, sizeof(DragDropPayloadBufLocal));
|
||
|
|
||
|
ClipperTempDataStacked = 0;
|
||
|
|
||
|
CurrentTable = NULL;
|
||
|
TablesTempDataStacked = 0;
|
||
|
CurrentTabBar = NULL;
|
||
|
|
||
|
HoverItemDelayId = HoverItemDelayIdPreviousFrame = HoverItemUnlockedStationaryId = HoverWindowUnlockedStationaryId = 0;
|
||
|
HoverItemDelayTimer = HoverItemDelayClearTimer = 0.0f;
|
||
|
|
||
|
MouseCursor = ImGuiMouseCursor_Arrow;
|
||
|
MouseStationaryTimer = 0.0f;
|
||
|
|
||
|
TempInputId = 0;
|
||
|
ColorEditOptions = ImGuiColorEditFlags_DefaultOptions_;
|
||
|
ColorEditCurrentID = ColorEditSavedID = 0;
|
||
|
ColorEditSavedHue = ColorEditSavedSat = 0.0f;
|
||
|
ColorEditSavedColor = 0;
|
||
|
WindowResizeRelativeMode = false;
|
||
|
SliderGrabClickOffset = 0.0f;
|
||
|
SliderCurrentAccum = 0.0f;
|
||
|
SliderCurrentAccumDirty = false;
|
||
|
DragCurrentAccumDirty = false;
|
||
|
DragCurrentAccum = 0.0f;
|
||
|
DragSpeedDefaultRatio = 1.0f / 100.0f;
|
||
|
ScrollbarClickDeltaToGrabCenter = 0.0f;
|
||
|
DisabledAlphaBackup = 0.0f;
|
||
|
DisabledStackSize = 0;
|
||
|
LockMarkEdited = 0;
|
||
|
TooltipOverrideCount = 0;
|
||
Update Dear ImGui to v1.91.5.