|
@@ -9,15 +9,21 @@
|
|
|
/*
|
|
|
|
|
|
Index of this file:
|
|
|
-// Header mess
|
|
|
-// Forward declarations
|
|
|
-// STB libraries includes
|
|
|
-// Context pointer
|
|
|
-// Generic helpers
|
|
|
-// Flags, enums and data structures
|
|
|
-// Main imgui context
|
|
|
-// Tab bar, Tab item
|
|
|
-// Internal API
|
|
|
+
|
|
|
+// [SECTION] Header mess
|
|
|
+// [SECTION] Forward declarations
|
|
|
+// [SECTION] Context pointer
|
|
|
+// [SECTION] STB libraries includes
|
|
|
+// [SECTION] Macros
|
|
|
+// [SECTION] Generic helpers
|
|
|
+// [SECTION] ImDrawList support
|
|
|
+// [SECTION] Misc flags, enums and data structures
|
|
|
+// [SECTION] Settings support
|
|
|
+// [SECTION] ImGuiContext (main imgui context)
|
|
|
+// [SECTION] ImGuiWindowTempData, ImGuiWindow
|
|
|
+// [SECTION] Tab bar, Tab item
|
|
|
+// [SECTION] Internal API
|
|
|
+// [SECTION] Test Engine Hooks (imgui_test_engine)
|
|
|
|
|
|
*/
|
|
|
|
|
@@ -25,7 +31,7 @@ Index of this file:
|
|
|
#ifndef IMGUI_DISABLE
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
-// Header mess
|
|
|
+// [SECTION] Header mess
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
#ifndef IMGUI_VERSION
|
|
@@ -46,8 +52,8 @@ Index of this file:
|
|
|
// Clang/GCC warnings with -Weverything
|
|
|
#if defined(__clang__)
|
|
|
#pragma clang diagnostic push
|
|
|
-#pragma clang diagnostic ignored "-Wunused-function" // for stb_textedit.h
|
|
|
-#pragma clang diagnostic ignored "-Wmissing-prototypes" // for stb_textedit.h
|
|
|
+#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"
|
|
|
#if __has_warning("-Wzero-as-null-pointer-constant")
|
|
|
#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
|
|
@@ -57,20 +63,20 @@ Index of this file:
|
|
|
#endif
|
|
|
#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
|
|
|
#endif
|
|
|
|
|
|
// Legacy defines
|
|
|
-#ifdef IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS // Renamed in 1.74
|
|
|
+#ifdef IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS // Renamed in 1.74
|
|
|
#error Use IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS
|
|
|
#endif
|
|
|
-#ifdef IMGUI_DISABLE_MATH_FUNCTIONS // Renamed in 1.74
|
|
|
+#ifdef IMGUI_DISABLE_MATH_FUNCTIONS // Renamed in 1.74
|
|
|
#error Use IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS
|
|
|
#endif
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
-// Forward declarations
|
|
|
+// [SECTION] Forward declarations
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
struct ImBitVector; // Store 1-bit per value
|
|
@@ -115,8 +121,17 @@ typedef int ImGuiSliderFlags; // -> enum ImGuiSliderFlags_ // F
|
|
|
typedef int ImGuiTextFlags; // -> enum ImGuiTextFlags_ // Flags: for TextEx()
|
|
|
typedef int ImGuiTooltipFlags; // -> enum ImGuiTooltipFlags_ // Flags: for BeginTooltipEx()
|
|
|
|
|
|
+//-----------------------------------------------------------------------------
|
|
|
+// [SECTION] Context pointer
|
|
|
+// See implementation of this variable in imgui.cpp for comments and details.
|
|
|
+//-----------------------------------------------------------------------------
|
|
|
+
|
|
|
+#ifndef GImGui
|
|
|
+extern IMGUI_API ImGuiContext* GImGui; // Current implicit context pointer
|
|
|
+#endif
|
|
|
+
|
|
|
//-------------------------------------------------------------------------
|
|
|
-// STB libraries includes
|
|
|
+// [SECTION] STB libraries includes
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
|
|
namespace ImStb
|
|
@@ -134,15 +149,7 @@ namespace ImStb
|
|
|
} // namespace ImStb
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
-// Context pointer
|
|
|
-//-----------------------------------------------------------------------------
|
|
|
-
|
|
|
-#ifndef GImGui
|
|
|
-extern IMGUI_API ImGuiContext* GImGui; // Current implicit context pointer
|
|
|
-#endif
|
|
|
-
|
|
|
-//-----------------------------------------------------------------------------
|
|
|
-// Macros
|
|
|
+// [SECTION] Macros
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
// Debug Logging
|
|
@@ -192,32 +199,50 @@ extern IMGUI_API ImGuiContext* GImGui; // Current implicit context pointer
|
|
|
#define IMGUI_CDECL
|
|
|
#endif
|
|
|
|
|
|
+// Debug Tools
|
|
|
+// Use 'Metrics->Tools->Item Picker' to break into the call-stack of a specific item.
|
|
|
+#ifndef IM_DEBUG_BREAK
|
|
|
+#if defined(__clang__)
|
|
|
+#define IM_DEBUG_BREAK() __builtin_debugtrap()
|
|
|
+#elif defined (_MSC_VER)
|
|
|
+#define IM_DEBUG_BREAK() __debugbreak()
|
|
|
+#else
|
|
|
+#define IM_DEBUG_BREAK() IM_ASSERT(0) // It is expected that you define IM_DEBUG_BREAK() into something that will break nicely in a debugger!
|
|
|
+#endif
|
|
|
+#endif // #ifndef IM_DEBUG_BREAK
|
|
|
+
|
|
|
//-----------------------------------------------------------------------------
|
|
|
-// Generic helpers
|
|
|
+// [SECTION] Generic helpers
|
|
|
// Note that the ImXXX helpers functions are lower-level than ImGui functions.
|
|
|
// ImGui functions or the ImGui context are never called/used from other ImXXX functions.
|
|
|
//-----------------------------------------------------------------------------
|
|
|
-// - Helpers: Misc
|
|
|
+// - Helpers: Hashing
|
|
|
+// - Helpers: Sorting
|
|
|
// - Helpers: Bit manipulation
|
|
|
// - Helpers: String, Formatting
|
|
|
// - Helpers: UTF-8 <> wchar conversions
|
|
|
// - Helpers: ImVec2/ImVec4 operators
|
|
|
// - Helpers: Maths
|
|
|
// - Helpers: Geometry
|
|
|
-// - Helpers: Bit arrays
|
|
|
+// - Helper: ImVec1
|
|
|
+// - Helper: ImVec2ih
|
|
|
+// - Helper: ImRect
|
|
|
+// - Helper: ImBitArray
|
|
|
// - Helper: ImBitVector
|
|
|
// - Helper: ImPool<>
|
|
|
// - Helper: ImChunkStream<>
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
-// Helpers: Misc
|
|
|
-#define ImQsort qsort
|
|
|
+// Helpers: Hashing
|
|
|
IMGUI_API ImU32 ImHashData(const void* data, size_t data_size, ImU32 seed = 0);
|
|
|
IMGUI_API ImU32 ImHashStr(const char* data, size_t data_size = 0, ImU32 seed = 0);
|
|
|
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
|
|
|
static inline ImU32 ImHash(const void* data, int size, ImU32 seed = 0) { return size ? ImHashData(data, (size_t)size, seed) : ImHashStr((const char*)data, 0, seed); } // [moved to ImHashStr/ImHashData in 1.68]
|
|
|
#endif
|
|
|
|
|
|
+// Helpers: Sorting
|
|
|
+#define ImQsort qsort
|
|
|
+
|
|
|
// Helpers: Color Blending
|
|
|
IMGUI_API ImU32 ImAlphaBlendColors(ImU32 col_a, ImU32 col_b);
|
|
|
|
|
@@ -286,7 +311,6 @@ static inline ImU64 ImFileGetSize(ImFileHandle)
|
|
|
static inline ImU64 ImFileRead(void*, ImU64, ImU64, ImFileHandle) { return 0; }
|
|
|
static inline ImU64 ImFileWrite(const void*, ImU64, ImU64, ImFileHandle) { return 0; }
|
|
|
#endif
|
|
|
-
|
|
|
#ifndef IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS
|
|
|
typedef FILE* ImFileHandle;
|
|
|
IMGUI_API ImFileHandle ImFileOpen(const char* filename, const char* mode);
|
|
@@ -354,7 +378,61 @@ IMGUI_API void ImTriangleBarycentricCoords(const ImVec2& a, const ImVec2&
|
|
|
inline float ImTriangleArea(const ImVec2& a, const ImVec2& b, const ImVec2& c) { return ImFabs((a.x * (b.y - c.y)) + (b.x * (c.y - a.y)) + (c.x * (a.y - b.y))) * 0.5f; }
|
|
|
IMGUI_API ImGuiDir ImGetDirQuadrantFromDelta(float dx, float dy);
|
|
|
|
|
|
-// Helpers: Bit arrays
|
|
|
+// Helper: ImVec1 (1D vector)
|
|
|
+// (this odd construct is used to facilitate the transition between 1D and 2D, and the maintenance of some branches/patches)
|
|
|
+struct ImVec1
|
|
|
+{
|
|
|
+ float x;
|
|
|
+ ImVec1() { x = 0.0f; }
|
|
|
+ ImVec1(float _x) { x = _x; }
|
|
|
+};
|
|
|
+
|
|
|
+// Helper: ImVec2ih (2D vector, half-size integer, for long-term packed storage)
|
|
|
+struct ImVec2ih
|
|
|
+{
|
|
|
+ short x, y;
|
|
|
+ ImVec2ih() { x = y = 0; }
|
|
|
+ ImVec2ih(short _x, short _y) { x = _x; y = _y; }
|
|
|
+ explicit ImVec2ih(const ImVec2& rhs) { x = (short)rhs.x; y = (short)rhs.y; }
|
|
|
+};
|
|
|
+
|
|
|
+// Helper: ImRect (2D axis aligned bounding-box)
|
|
|
+// NB: we can't rely on ImVec2 math operators being available here!
|
|
|
+struct IMGUI_API ImRect
|
|
|
+{
|
|
|
+ ImVec2 Min; // Upper-left
|
|
|
+ ImVec2 Max; // Lower-right
|
|
|
+
|
|
|
+ ImRect() : Min(0.0f, 0.0f), Max(0.0f, 0.0f) {}
|
|
|
+ ImRect(const ImVec2& min, const ImVec2& max) : Min(min), Max(max) {}
|
|
|
+ ImRect(const ImVec4& v) : Min(v.x, v.y), Max(v.z, v.w) {}
|
|
|
+ ImRect(float x1, float y1, float x2, float y2) : Min(x1, y1), Max(x2, y2) {}
|
|
|
+
|
|
|
+ ImVec2 GetCenter() const { return ImVec2((Min.x + Max.x) * 0.5f, (Min.y + Max.y) * 0.5f); }
|
|
|
+ ImVec2 GetSize() const { return ImVec2(Max.x - Min.x, Max.y - Min.y); }
|
|
|
+ float GetWidth() const { return Max.x - Min.x; }
|
|
|
+ float GetHeight() const { return Max.y - Min.y; }
|
|
|
+ ImVec2 GetTL() const { return Min; } // Top-left
|
|
|
+ ImVec2 GetTR() const { return ImVec2(Max.x, Min.y); } // Top-right
|
|
|
+ ImVec2 GetBL() const { return ImVec2(Min.x, Max.y); } // Bottom-left
|
|
|
+ ImVec2 GetBR() const { return Max; } // Bottom-right
|
|
|
+ bool Contains(const ImVec2& p) const { return p.x >= Min.x && p.y >= Min.y && p.x < Max.x && p.y < Max.y; }
|
|
|
+ bool Contains(const ImRect& r) const { return r.Min.x >= Min.x && r.Min.y >= Min.y && r.Max.x <= Max.x && r.Max.y <= Max.y; }
|
|
|
+ bool Overlaps(const ImRect& r) const { return r.Min.y < Max.y && r.Max.y > Min.y && r.Min.x < Max.x && r.Max.x > Min.x; }
|
|
|
+ void Add(const ImVec2& p) { if (Min.x > p.x) Min.x = p.x; if (Min.y > p.y) Min.y = p.y; if (Max.x < p.x) Max.x = p.x; if (Max.y < p.y) Max.y = p.y; }
|
|
|
+ void Add(const ImRect& r) { if (Min.x > r.Min.x) Min.x = r.Min.x; if (Min.y > r.Min.y) Min.y = r.Min.y; if (Max.x < r.Max.x) Max.x = r.Max.x; if (Max.y < r.Max.y) Max.y = r.Max.y; }
|
|
|
+ void Expand(const float amount) { Min.x -= amount; Min.y -= amount; Max.x += amount; Max.y += amount; }
|
|
|
+ void Expand(const ImVec2& amount) { Min.x -= amount.x; Min.y -= amount.y; Max.x += amount.x; Max.y += amount.y; }
|
|
|
+ void Translate(const ImVec2& d) { Min.x += d.x; Min.y += d.y; Max.x += d.x; Max.y += d.y; }
|
|
|
+ void TranslateX(float dx) { Min.x += dx; Max.x += dx; }
|
|
|
+ void TranslateY(float dy) { Min.y += dy; Max.y += dy; }
|
|
|
+ void ClipWith(const ImRect& r) { Min = ImMax(Min, r.Min); Max = ImMin(Max, r.Max); } // Simple version, may lead to an inverted rectangle, which is fine for Contains/Overlaps test but not for display.
|
|
|
+ void ClipWithFull(const ImRect& r) { Min = ImClamp(Min, r.Min, r.Max); Max = ImClamp(Max, r.Min, r.Max); } // Full version, ensure both points are fully clipped.
|
|
|
+ void Floor() { Min.x = IM_FLOOR(Min.x); Min.y = IM_FLOOR(Min.y); Max.x = IM_FLOOR(Max.x); Max.y = IM_FLOOR(Max.y); }
|
|
|
+ bool IsInverted() const { return Min.x > Max.x || Min.y > Max.y; }
|
|
|
+};
|
|
|
+
|
|
|
+// Helper: ImBitArray
|
|
|
inline bool ImBitArrayTestBit(const ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); return (arr[n >> 5] & mask) != 0; }
|
|
|
inline void ImBitArrayClearBit(ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); arr[n >> 5] &= ~mask; }
|
|
|
inline void ImBitArraySetBit(ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); arr[n >> 5] |= mask; }
|
|
@@ -431,7 +509,50 @@ struct IMGUI_API ImChunkStream
|
|
|
};
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
-// Flags, enums and data structures
|
|
|
+// [SECTION] ImDrawList support
|
|
|
+//-----------------------------------------------------------------------------
|
|
|
+
|
|
|
+// ImDrawList: Helper function to calculate a circle's segment count given its radius and a "maximum error" value.
|
|
|
+#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MIN 12
|
|
|
+#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX 512
|
|
|
+#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC(_RAD,_MAXERROR) ImClamp((int)((IM_PI * 2.0f) / ImAcos(((_RAD) - (_MAXERROR)) / (_RAD))), IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MIN, IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX)
|
|
|
+
|
|
|
+// ImDrawList: You may set this to higher values (e.g. 2 or 3) to increase tessellation of fast rounded corners path.
|
|
|
+#ifndef IM_DRAWLIST_ARCFAST_TESSELLATION_MULTIPLIER
|
|
|
+#define IM_DRAWLIST_ARCFAST_TESSELLATION_MULTIPLIER 1
|
|
|
+#endif
|
|
|
+
|
|
|
+// Data shared between all ImDrawList instances
|
|
|
+// You may want to create your own instance of this if you want to use ImDrawList completely without ImGui. In that case, watch out for future changes to this structure.
|
|
|
+struct IMGUI_API ImDrawListSharedData
|
|
|
+{
|
|
|
+ ImVec2 TexUvWhitePixel; // UV of white pixel in the atlas
|
|
|
+ ImFont* Font; // Current/default font (optional, for simplified AddText overload)
|
|
|
+ float FontSize; // Current/default font size (optional, for simplified AddText overload)
|
|
|
+ float CurveTessellationTol; // Tessellation tolerance when using PathBezierCurveTo()
|
|
|
+ float CircleSegmentMaxError; // Number of circle segments to use per pixel of radius for AddCircle() etc
|
|
|
+ ImVec4 ClipRectFullscreen; // Value for PushClipRectFullscreen()
|
|
|
+ ImDrawListFlags InitialFlags; // Initial flags at the beginning of the frame (it is possible to alter flags on a per-drawlist basis afterwards)
|
|
|
+
|
|
|
+ // [Internal] Lookup tables
|
|
|
+ ImVec2 ArcFastVtx[12 * IM_DRAWLIST_ARCFAST_TESSELLATION_MULTIPLIER]; // FIXME: Bake rounded corners fill/borders in atlas
|
|
|
+ ImU8 CircleSegmentCounts[64]; // Precomputed segment count for given radius (array index + 1) before we calculate it dynamically (to avoid calculation overhead)
|
|
|
+
|
|
|
+ ImDrawListSharedData();
|
|
|
+ void SetCircleSegmentMaxError(float max_error);
|
|
|
+};
|
|
|
+
|
|
|
+struct ImDrawDataBuilder
|
|
|
+{
|
|
|
+ ImVector<ImDrawList*> Layers[2]; // Global layers for: regular, tooltip
|
|
|
+
|
|
|
+ void Clear() { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].resize(0); }
|
|
|
+ void ClearFreeMemory() { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].clear(); }
|
|
|
+ IMGUI_API void FlattenIntoSingleLayer();
|
|
|
+};
|
|
|
+
|
|
|
+//-----------------------------------------------------------------------------
|
|
|
+// [SECTION] Misc flags, enums and data structures
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
enum ImGuiButtonFlags_
|
|
@@ -662,59 +783,6 @@ enum ImGuiPopupPositionPolicy
|
|
|
ImGuiPopupPositionPolicy_ComboBox
|
|
|
};
|
|
|
|
|
|
-// 1D vector (this odd construct is used to facilitate the transition between 1D and 2D, and the maintenance of some branches/patches)
|
|
|
-struct ImVec1
|
|
|
-{
|
|
|
- float x;
|
|
|
- ImVec1() { x = 0.0f; }
|
|
|
- ImVec1(float _x) { x = _x; }
|
|
|
-};
|
|
|
-
|
|
|
-// 2D vector (half-size integer)
|
|
|
-struct ImVec2ih
|
|
|
-{
|
|
|
- short x, y;
|
|
|
- ImVec2ih() { x = y = 0; }
|
|
|
- ImVec2ih(short _x, short _y) { x = _x; y = _y; }
|
|
|
- explicit ImVec2ih(const ImVec2& rhs) { x = (short)rhs.x; y = (short)rhs.y; }
|
|
|
-};
|
|
|
-
|
|
|
-// 2D axis aligned bounding-box
|
|
|
-// NB: we can't rely on ImVec2 math operators being available here
|
|
|
-struct IMGUI_API ImRect
|
|
|
-{
|
|
|
- ImVec2 Min; // Upper-left
|
|
|
- ImVec2 Max; // Lower-right
|
|
|
-
|
|
|
- ImRect() : Min(0.0f, 0.0f), Max(0.0f, 0.0f) {}
|
|
|
- ImRect(const ImVec2& min, const ImVec2& max) : Min(min), Max(max) {}
|
|
|
- ImRect(const ImVec4& v) : Min(v.x, v.y), Max(v.z, v.w) {}
|
|
|
- ImRect(float x1, float y1, float x2, float y2) : Min(x1, y1), Max(x2, y2) {}
|
|
|
-
|
|
|
- ImVec2 GetCenter() const { return ImVec2((Min.x + Max.x) * 0.5f, (Min.y + Max.y) * 0.5f); }
|
|
|
- ImVec2 GetSize() const { return ImVec2(Max.x - Min.x, Max.y - Min.y); }
|
|
|
- float GetWidth() const { return Max.x - Min.x; }
|
|
|
- float GetHeight() const { return Max.y - Min.y; }
|
|
|
- ImVec2 GetTL() const { return Min; } // Top-left
|
|
|
- ImVec2 GetTR() const { return ImVec2(Max.x, Min.y); } // Top-right
|
|
|
- ImVec2 GetBL() const { return ImVec2(Min.x, Max.y); } // Bottom-left
|
|
|
- ImVec2 GetBR() const { return Max; } // Bottom-right
|
|
|
- bool Contains(const ImVec2& p) const { return p.x >= Min.x && p.y >= Min.y && p.x < Max.x && p.y < Max.y; }
|
|
|
- bool Contains(const ImRect& r) const { return r.Min.x >= Min.x && r.Min.y >= Min.y && r.Max.x <= Max.x && r.Max.y <= Max.y; }
|
|
|
- bool Overlaps(const ImRect& r) const { return r.Min.y < Max.y && r.Max.y > Min.y && r.Min.x < Max.x && r.Max.x > Min.x; }
|
|
|
- void Add(const ImVec2& p) { if (Min.x > p.x) Min.x = p.x; if (Min.y > p.y) Min.y = p.y; if (Max.x < p.x) Max.x = p.x; if (Max.y < p.y) Max.y = p.y; }
|
|
|
- void Add(const ImRect& r) { if (Min.x > r.Min.x) Min.x = r.Min.x; if (Min.y > r.Min.y) Min.y = r.Min.y; if (Max.x < r.Max.x) Max.x = r.Max.x; if (Max.y < r.Max.y) Max.y = r.Max.y; }
|
|
|
- void Expand(const float amount) { Min.x -= amount; Min.y -= amount; Max.x += amount; Max.y += amount; }
|
|
|
- void Expand(const ImVec2& amount) { Min.x -= amount.x; Min.y -= amount.y; Max.x += amount.x; Max.y += amount.y; }
|
|
|
- void Translate(const ImVec2& d) { Min.x += d.x; Min.y += d.y; Max.x += d.x; Max.y += d.y; }
|
|
|
- void TranslateX(float dx) { Min.x += dx; Max.x += dx; }
|
|
|
- void TranslateY(float dy) { Min.y += dy; Max.y += dy; }
|
|
|
- void ClipWith(const ImRect& r) { Min = ImMax(Min, r.Min); Max = ImMin(Max, r.Max); } // Simple version, may lead to an inverted rectangle, which is fine for Contains/Overlaps test but not for display.
|
|
|
- void ClipWithFull(const ImRect& r) { Min = ImClamp(Min, r.Min, r.Max); Max = ImClamp(Max, r.Min, r.Max); } // Full version, ensure both points are fully clipped.
|
|
|
- void Floor() { Min.x = IM_FLOOR(Min.x); Min.y = IM_FLOOR(Min.y); Max.x = IM_FLOOR(Max.x); Max.y = IM_FLOOR(Max.y); }
|
|
|
- bool IsInverted() const { return Min.x > Max.x || Min.y > Max.y; }
|
|
|
-};
|
|
|
-
|
|
|
struct ImGuiDataTypeTempStorage
|
|
|
{
|
|
|
ImU8 Data[8]; // Can fit any data up to ImGuiDataType_COUNT
|
|
@@ -815,35 +883,6 @@ struct IMGUI_API ImGuiInputTextState
|
|
|
void SelectAll() { Stb.select_start = 0; Stb.cursor = Stb.select_end = CurLenW; Stb.has_preferred_x = 0; }
|
|
|
};
|
|
|
|
|
|
-// Windows data saved in imgui.ini file
|
|
|
-// Because we never destroy or rename ImGuiWindowSettings, we can store the names in a separate buffer easily.
|
|
|
-// (this is designed to be stored in a ImChunkStream buffer, with the variable-length Name following our structure)
|
|
|
-struct ImGuiWindowSettings
|
|
|
-{
|
|
|
- ImGuiID ID;
|
|
|
- ImVec2ih Pos;
|
|
|
- ImVec2ih Size;
|
|
|
- bool Collapsed;
|
|
|
- bool WantApply; // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context)
|
|
|
-
|
|
|
- ImGuiWindowSettings() { ID = 0; Pos = Size = ImVec2ih(0, 0); Collapsed = WantApply = false; }
|
|
|
- char* GetName() { return (char*)(this + 1); }
|
|
|
-};
|
|
|
-
|
|
|
-struct ImGuiSettingsHandler
|
|
|
-{
|
|
|
- const char* TypeName; // Short description stored in .ini file. Disallowed characters: '[' ']'
|
|
|
- ImGuiID TypeHash; // == ImHashStr(TypeName)
|
|
|
- void (*ClearAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Clear all settings data
|
|
|
- void (*ApplyAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Read: Called after reading (in registration order)
|
|
|
- void* (*ReadOpenFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, const char* name); // Read: Called when entering into a new ini entry e.g. "[Window][Name]"
|
|
|
- void (*ReadLineFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, void* entry, const char* line); // Read: Called for every line of text within an ini entry
|
|
|
- void (*WriteAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* out_buf); // Write: Output every entries into 'out_buf'
|
|
|
- void* UserData;
|
|
|
-
|
|
|
- ImGuiSettingsHandler() { memset(this, 0, sizeof(*this)); }
|
|
|
-};
|
|
|
-
|
|
|
// Storage for current popup stack
|
|
|
struct ImGuiPopupData
|
|
|
{
|
|
@@ -902,45 +941,6 @@ struct ImGuiColumns
|
|
|
}
|
|
|
};
|
|
|
|
|
|
-// ImDrawList: Helper function to calculate a circle's segment count given its radius and a "maximum error" value.
|
|
|
-#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MIN 12
|
|
|
-#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX 512
|
|
|
-#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC(_RAD,_MAXERROR) ImClamp((int)((IM_PI * 2.0f) / ImAcos(((_RAD) - (_MAXERROR)) / (_RAD))), IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MIN, IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX)
|
|
|
-
|
|
|
-// ImDrawList: You may set this to higher values (e.g. 2 or 3) to increase tessellation of fast rounded corners path.
|
|
|
-#ifndef IM_DRAWLIST_ARCFAST_TESSELLATION_MULTIPLIER
|
|
|
-#define IM_DRAWLIST_ARCFAST_TESSELLATION_MULTIPLIER 1
|
|
|
-#endif
|
|
|
-
|
|
|
-// Data shared between all ImDrawList instances
|
|
|
-// You may want to create your own instance of this if you want to use ImDrawList completely without ImGui. In that case, watch out for future changes to this structure.
|
|
|
-struct IMGUI_API ImDrawListSharedData
|
|
|
-{
|
|
|
- ImVec2 TexUvWhitePixel; // UV of white pixel in the atlas
|
|
|
- ImFont* Font; // Current/default font (optional, for simplified AddText overload)
|
|
|
- float FontSize; // Current/default font size (optional, for simplified AddText overload)
|
|
|
- float CurveTessellationTol; // Tessellation tolerance when using PathBezierCurveTo()
|
|
|
- float CircleSegmentMaxError; // Number of circle segments to use per pixel of radius for AddCircle() etc
|
|
|
- ImVec4 ClipRectFullscreen; // Value for PushClipRectFullscreen()
|
|
|
- ImDrawListFlags InitialFlags; // Initial flags at the beginning of the frame (it is possible to alter flags on a per-drawlist basis afterwards)
|
|
|
-
|
|
|
- // [Internal] Lookup tables
|
|
|
- ImVec2 ArcFastVtx[12 * IM_DRAWLIST_ARCFAST_TESSELLATION_MULTIPLIER]; // FIXME: Bake rounded corners fill/borders in atlas
|
|
|
- ImU8 CircleSegmentCounts[64]; // Precomputed segment count for given radius (array index + 1) before we calculate it dynamically (to avoid calculation overhead)
|
|
|
-
|
|
|
- ImDrawListSharedData();
|
|
|
- void SetCircleSegmentMaxError(float max_error);
|
|
|
-};
|
|
|
-
|
|
|
-struct ImDrawDataBuilder
|
|
|
-{
|
|
|
- ImVector<ImDrawList*> Layers[2]; // Global layers for: regular, tooltip
|
|
|
-
|
|
|
- void Clear() { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].resize(0); }
|
|
|
- void ClearFreeMemory() { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].clear(); }
|
|
|
- IMGUI_API void FlattenIntoSingleLayer();
|
|
|
-};
|
|
|
-
|
|
|
struct ImGuiNavMoveResult
|
|
|
{
|
|
|
ImGuiWindow* Window; // Best candidate window
|
|
@@ -1010,27 +1010,56 @@ struct ImGuiNextItemData
|
|
|
inline void ClearFlags() { Flags = ImGuiNextItemDataFlags_None; } // Also cleared manually by ItemAdd()!
|
|
|
};
|
|
|
|
|
|
+struct ImGuiShrinkWidthItem
|
|
|
+{
|
|
|
+ int Index;
|
|
|
+ float Width;
|
|
|
+};
|
|
|
+
|
|
|
+struct ImGuiPtrOrIndex
|
|
|
+{
|
|
|
+ void* Ptr; // Either field can be set, not both. e.g. Dock node tab bars are loose while BeginTabBar() ones are in a pool.
|
|
|
+ int Index; // Usually index in a main pool.
|
|
|
+
|
|
|
+ ImGuiPtrOrIndex(void* ptr) { Ptr = ptr; Index = -1; }
|
|
|
+ ImGuiPtrOrIndex(int index) { Ptr = NULL; Index = index; }
|
|
|
+};
|
|
|
+
|
|
|
//-----------------------------------------------------------------------------
|
|
|
-// Tab bar, Tab item
|
|
|
+// [SECTION] Settings support
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
-struct ImGuiShrinkWidthItem
|
|
|
+// Windows data saved in imgui.ini file
|
|
|
+// Because we never destroy or rename ImGuiWindowSettings, we can store the names in a separate buffer easily.
|
|
|
+// (this is designed to be stored in a ImChunkStream buffer, with the variable-length Name following our structure)
|
|
|
+struct ImGuiWindowSettings
|
|
|
{
|
|
|
- int Index;
|
|
|
- float Width;
|
|
|
+ ImGuiID ID;
|
|
|
+ ImVec2ih Pos;
|
|
|
+ ImVec2ih Size;
|
|
|
+ bool Collapsed;
|
|
|
+ bool WantApply; // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context)
|
|
|
+
|
|
|
+ ImGuiWindowSettings() { ID = 0; Pos = Size = ImVec2ih(0, 0); Collapsed = WantApply = false; }
|
|
|
+ char* GetName() { return (char*)(this + 1); }
|
|
|
};
|
|
|
|
|
|
-struct ImGuiPtrOrIndex
|
|
|
+struct ImGuiSettingsHandler
|
|
|
{
|
|
|
- void* Ptr; // Either field can be set, not both. e.g. Dock node tab bars are loose while BeginTabBar() ones are in a pool.
|
|
|
- int Index; // Usually index in a main pool.
|
|
|
+ const char* TypeName; // Short description stored in .ini file. Disallowed characters: '[' ']'
|
|
|
+ ImGuiID TypeHash; // == ImHashStr(TypeName)
|
|
|
+ void (*ClearAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Clear all settings data
|
|
|
+ void (*ApplyAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Read: Called after reading (in registration order)
|
|
|
+ void* (*ReadOpenFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, const char* name); // Read: Called when entering into a new ini entry e.g. "[Window][Name]"
|
|
|
+ void (*ReadLineFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, void* entry, const char* line); // Read: Called for every line of text within an ini entry
|
|
|
+ void (*WriteAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* out_buf); // Write: Output every entries into 'out_buf'
|
|
|
+ void* UserData;
|
|
|
|
|
|
- ImGuiPtrOrIndex(void* ptr) { Ptr = ptr; Index = -1; }
|
|
|
- ImGuiPtrOrIndex(int index) { Ptr = NULL; Index = index; }
|
|
|
+ ImGuiSettingsHandler() { memset(this, 0, sizeof(*this)); }
|
|
|
};
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
-// Main Dear ImGui context
|
|
|
+// [SECTION] ImGuiContext (main imgui context)
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
struct ImGuiContext
|
|
@@ -1386,7 +1415,7 @@ struct ImGuiContext
|
|
|
};
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
-// ImGuiWindow
|
|
|
+// [SECTION] ImGuiWindowTempData, ImGuiWindow
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
// Transient per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the DC variable name in ImGuiWindow.
|
|
@@ -1580,12 +1609,12 @@ public:
|
|
|
ImGuiID GetIDFromRectangle(const ImRect& r_abs);
|
|
|
|
|
|
// We don't use g.FontSize because the window may be != g.CurrentWidow.
|
|
|
- ImRect Rect() const { return ImRect(Pos.x, Pos.y, Pos.x+Size.x, Pos.y+Size.y); }
|
|
|
- float CalcFontSize() const { ImGuiContext& g = *GImGui; float scale = g.FontBaseSize * FontWindowScale; if (ParentWindow) scale *= ParentWindow->FontWindowScale; return scale; }
|
|
|
- float TitleBarHeight() const { ImGuiContext& g = *GImGui; return (Flags & ImGuiWindowFlags_NoTitleBar) ? 0.0f : CalcFontSize() + g.Style.FramePadding.y * 2.0f; }
|
|
|
- ImRect TitleBarRect() const { return ImRect(Pos, ImVec2(Pos.x + SizeFull.x, Pos.y + TitleBarHeight())); }
|
|
|
- float MenuBarHeight() const { ImGuiContext& g = *GImGui; return (Flags & ImGuiWindowFlags_MenuBar) ? DC.MenuBarOffset.y + CalcFontSize() + g.Style.FramePadding.y * 2.0f : 0.0f; }
|
|
|
- ImRect MenuBarRect() const { float y1 = Pos.y + TitleBarHeight(); return ImRect(Pos.x, y1, Pos.x + SizeFull.x, y1 + MenuBarHeight()); }
|
|
|
+ ImRect Rect() const { return ImRect(Pos.x, Pos.y, Pos.x+Size.x, Pos.y+Size.y); }
|
|
|
+ float CalcFontSize() const { ImGuiContext& g = *GImGui; float scale = g.FontBaseSize * FontWindowScale; if (ParentWindow) scale *= ParentWindow->FontWindowScale; return scale; }
|
|
|
+ float TitleBarHeight() const { ImGuiContext& g = *GImGui; return (Flags & ImGuiWindowFlags_NoTitleBar) ? 0.0f : CalcFontSize() + g.Style.FramePadding.y * 2.0f; }
|
|
|
+ ImRect TitleBarRect() const { return ImRect(Pos, ImVec2(Pos.x + SizeFull.x, Pos.y + TitleBarHeight())); }
|
|
|
+ float MenuBarHeight() const { ImGuiContext& g = *GImGui; return (Flags & ImGuiWindowFlags_MenuBar) ? DC.MenuBarOffset.y + CalcFontSize() + g.Style.FramePadding.y * 2.0f : 0.0f; }
|
|
|
+ ImRect MenuBarRect() const { float y1 = Pos.y + TitleBarHeight(); return ImRect(Pos.x, y1, Pos.x + SizeFull.x, y1 + MenuBarHeight()); }
|
|
|
};
|
|
|
|
|
|
// Backup and restore just enough data to be able to use IsItemHovered() on item A after another B in the same window has overwritten the data.
|
|
@@ -1602,7 +1631,7 @@ struct ImGuiItemHoveredDataBackup
|
|
|
};
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
-// Tab bar, tab item
|
|
|
+// [SECTION] Tab bar, Tab item
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
// Extend ImGuiTabBarFlags_
|
|
@@ -1672,8 +1701,8 @@ struct ImGuiTabBar
|
|
|
};
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
-// Internal API
|
|
|
-// No guarantee of forward compatibility here.
|
|
|
+// [SECTION] Internal API
|
|
|
+// No guarantee of forward compatibility here!
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
namespace ImGui
|
|
@@ -1944,19 +1973,10 @@ IMGUI_API void ImFontAtlasBuildFinish(ImFontAtlas* atlas);
|
|
|
IMGUI_API void ImFontAtlasBuildMultiplyCalcLookupTable(unsigned char out_table[256], float in_multiply_factor);
|
|
|
IMGUI_API void ImFontAtlasBuildMultiplyRectAlpha8(const unsigned char table[256], unsigned char* pixels, int x, int y, int w, int h, int stride);
|
|
|
|
|
|
-// Debug Tools
|
|
|
-// Use 'Metrics->Tools->Item Picker' to break into the call-stack of a specific item.
|
|
|
-#ifndef IM_DEBUG_BREAK
|
|
|
-#if defined(__clang__)
|
|
|
-#define IM_DEBUG_BREAK() __builtin_debugtrap()
|
|
|
-#elif defined (_MSC_VER)
|
|
|
-#define IM_DEBUG_BREAK() __debugbreak()
|
|
|
-#else
|
|
|
-#define IM_DEBUG_BREAK() IM_ASSERT(0) // It is expected that you define IM_DEBUG_BREAK() into something that will break nicely in a debugger!
|
|
|
-#endif
|
|
|
-#endif // #ifndef IM_DEBUG_BREAK
|
|
|
+//-----------------------------------------------------------------------------
|
|
|
+// [SECTION] Test Engine Hooks (imgui_test_engine)
|
|
|
+//-----------------------------------------------------------------------------
|
|
|
|
|
|
-// Test Engine Hooks (imgui_tests)
|
|
|
//#define IMGUI_ENABLE_TEST_ENGINE
|
|
|
#ifdef IMGUI_ENABLE_TEST_ENGINE
|
|
|
extern void ImGuiTestEngineHook_PreNewFrame(ImGuiContext* ctx);
|