|
@@ -51,7 +51,7 @@ CODE
|
|
|
|
|
|
// [SECTION] FORWARD DECLARATIONS
|
|
// [SECTION] FORWARD DECLARATIONS
|
|
// [SECTION] CONTEXT AND MEMORY ALLOCATORS
|
|
// [SECTION] CONTEXT AND MEMORY ALLOCATORS
|
|
-// [SECTION] MAIN USER FACING STRUCTURES (ImGuiStyle, ImGuiIO)
|
|
|
|
|
|
+// [SECTION] USER FACING STRUCTURES (ImGuiStyle, ImGuiIO)
|
|
// [SECTION] MISC HELPERS/UTILITIES (Geometry functions)
|
|
// [SECTION] MISC HELPERS/UTILITIES (Geometry functions)
|
|
// [SECTION] MISC HELPERS/UTILITIES (String, Format, Hash functions)
|
|
// [SECTION] MISC HELPERS/UTILITIES (String, Format, Hash functions)
|
|
// [SECTION] MISC HELPERS/UTILITIES (File functions)
|
|
// [SECTION] MISC HELPERS/UTILITIES (File functions)
|
|
@@ -61,6 +61,7 @@ CODE
|
|
// [SECTION] ImGuiTextFilter
|
|
// [SECTION] ImGuiTextFilter
|
|
// [SECTION] ImGuiTextBuffer
|
|
// [SECTION] ImGuiTextBuffer
|
|
// [SECTION] ImGuiListClipper
|
|
// [SECTION] ImGuiListClipper
|
|
|
|
+// [SECTION] STYLING
|
|
// [SECTION] RENDER HELPERS
|
|
// [SECTION] RENDER HELPERS
|
|
// [SECTION] MAIN CODE (most of the code! lots of stuff, needs tidying up!)
|
|
// [SECTION] MAIN CODE (most of the code! lots of stuff, needs tidying up!)
|
|
// [SECTION] ERROR CHECKING
|
|
// [SECTION] ERROR CHECKING
|
|
@@ -916,10 +917,12 @@ static void ErrorCheckEndFrame();
|
|
static void ErrorCheckBeginEndCompareStacksSize(ImGuiWindow* window, bool write);
|
|
static void ErrorCheckBeginEndCompareStacksSize(ImGuiWindow* window, bool write);
|
|
|
|
|
|
// Misc
|
|
// Misc
|
|
|
|
+static void UpdateSettings();
|
|
static void UpdateMouseInputs();
|
|
static void UpdateMouseInputs();
|
|
static void UpdateMouseWheel();
|
|
static void UpdateMouseWheel();
|
|
-static bool UpdateManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4]);
|
|
|
|
|
|
+static void UpdateTabFocus();
|
|
static void UpdateDebugToolItemPicker();
|
|
static void UpdateDebugToolItemPicker();
|
|
|
|
+static bool UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4]);
|
|
static void RenderWindowOuterBorders(ImGuiWindow* window);
|
|
static void RenderWindowOuterBorders(ImGuiWindow* window);
|
|
static void RenderWindowDecorations(ImGuiWindow* window, const ImRect& title_bar_rect, bool title_bar_is_highlight, bool handle_borders_and_resize_grips, int resize_grip_count, const ImU32 resize_grip_col[4], float resize_grip_draw_size);
|
|
static void RenderWindowDecorations(ImGuiWindow* window, const ImRect& title_bar_rect, bool title_bar_is_highlight, bool handle_borders_and_resize_grips, int resize_grip_count, const ImU32 resize_grip_col[4], float resize_grip_draw_size);
|
|
static void RenderWindowTitleBarContents(ImGuiWindow* window, const ImRect& title_bar_rect, const char* name, bool* p_open);
|
|
static void RenderWindowTitleBarContents(ImGuiWindow* window, const ImRect& title_bar_rect, const char* name, bool* p_open);
|
|
@@ -979,7 +982,7 @@ static void (*GImAllocatorFreeFunc)(void* ptr, void* user_data) = FreeWrapper;
|
|
static void* GImAllocatorUserData = NULL;
|
|
static void* GImAllocatorUserData = NULL;
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//-----------------------------------------------------------------------------
|
|
-// [SECTION] MAIN USER FACING STRUCTURES (ImGuiStyle, ImGuiIO)
|
|
|
|
|
|
+// [SECTION] USER FACING STRUCTURES (ImGuiStyle, ImGuiIO)
|
|
//-----------------------------------------------------------------------------
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
ImGuiStyle::ImGuiStyle()
|
|
ImGuiStyle::ImGuiStyle()
|
|
@@ -2296,11 +2299,15 @@ bool ImGuiListClipper::Step()
|
|
}
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//-----------------------------------------------------------------------------
|
|
-// [SECTION] RENDER HELPERS
|
|
|
|
-// Some of those (internal) functions are currently quite a legacy mess - their signature and behavior will change.
|
|
|
|
-// Also see imgui_draw.cpp for some more which have been reworked to not rely on ImGui:: state.
|
|
|
|
|
|
+// [SECTION] STYLING
|
|
//-----------------------------------------------------------------------------
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
+ImGuiStyle& ImGui::GetStyle()
|
|
|
|
+{
|
|
|
|
+ IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() and ImGui::SetCurrentContext() ?");
|
|
|
|
+ return GImGui->Style;
|
|
|
|
+}
|
|
|
|
+
|
|
ImU32 ImGui::GetColorU32(ImGuiCol idx, float alpha_mul)
|
|
ImU32 ImGui::GetColorU32(ImGuiCol idx, float alpha_mul)
|
|
{
|
|
{
|
|
ImGuiStyle& style = GImGui->Style;
|
|
ImGuiStyle& style = GImGui->Style;
|
|
@@ -2333,6 +2340,192 @@ ImU32 ImGui::GetColorU32(ImU32 col)
|
|
return (col & ~IM_COL32_A_MASK) | (a << IM_COL32_A_SHIFT);
|
|
return (col & ~IM_COL32_A_MASK) | (a << IM_COL32_A_SHIFT);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+// FIXME: This may incur a round-trip (if the end user got their data from a float4) but eventually we aim to store the in-flight colors as ImU32
|
|
|
|
+void ImGui::PushStyleColor(ImGuiCol idx, ImU32 col)
|
|
|
|
+{
|
|
|
|
+ ImGuiContext& g = *GImGui;
|
|
|
|
+ ImGuiColorMod backup;
|
|
|
|
+ backup.Col = idx;
|
|
|
|
+ backup.BackupValue = g.Style.Colors[idx];
|
|
|
|
+ g.ColorModifiers.push_back(backup);
|
|
|
|
+ g.Style.Colors[idx] = ColorConvertU32ToFloat4(col);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void ImGui::PushStyleColor(ImGuiCol idx, const ImVec4& col)
|
|
|
|
+{
|
|
|
|
+ ImGuiContext& g = *GImGui;
|
|
|
|
+ ImGuiColorMod backup;
|
|
|
|
+ backup.Col = idx;
|
|
|
|
+ backup.BackupValue = g.Style.Colors[idx];
|
|
|
|
+ g.ColorModifiers.push_back(backup);
|
|
|
|
+ g.Style.Colors[idx] = col;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void ImGui::PopStyleColor(int count)
|
|
|
|
+{
|
|
|
|
+ ImGuiContext& g = *GImGui;
|
|
|
|
+ while (count > 0)
|
|
|
|
+ {
|
|
|
|
+ ImGuiColorMod& backup = g.ColorModifiers.back();
|
|
|
|
+ g.Style.Colors[backup.Col] = backup.BackupValue;
|
|
|
|
+ g.ColorModifiers.pop_back();
|
|
|
|
+ count--;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+struct ImGuiStyleVarInfo
|
|
|
|
+{
|
|
|
|
+ ImGuiDataType Type;
|
|
|
|
+ ImU32 Count;
|
|
|
|
+ ImU32 Offset;
|
|
|
|
+ void* GetVarPtr(ImGuiStyle* style) const { return (void*)((unsigned char*)style + Offset); }
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static const ImGuiStyleVarInfo GStyleVarInfo[] =
|
|
|
|
+{
|
|
|
|
+ { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, Alpha) }, // ImGuiStyleVar_Alpha
|
|
|
|
+ { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowPadding) }, // ImGuiStyleVar_WindowPadding
|
|
|
|
+ { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowRounding) }, // ImGuiStyleVar_WindowRounding
|
|
|
|
+ { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowBorderSize) }, // ImGuiStyleVar_WindowBorderSize
|
|
|
|
+ { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowMinSize) }, // ImGuiStyleVar_WindowMinSize
|
|
|
|
+ { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowTitleAlign) }, // ImGuiStyleVar_WindowTitleAlign
|
|
|
|
+ { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ChildRounding) }, // ImGuiStyleVar_ChildRounding
|
|
|
|
+ { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ChildBorderSize) }, // ImGuiStyleVar_ChildBorderSize
|
|
|
|
+ { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, PopupRounding) }, // ImGuiStyleVar_PopupRounding
|
|
|
|
+ { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, PopupBorderSize) }, // ImGuiStyleVar_PopupBorderSize
|
|
|
|
+ { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, FramePadding) }, // ImGuiStyleVar_FramePadding
|
|
|
|
+ { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, FrameRounding) }, // ImGuiStyleVar_FrameRounding
|
|
|
|
+ { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, FrameBorderSize) }, // ImGuiStyleVar_FrameBorderSize
|
|
|
|
+ { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ItemSpacing) }, // ImGuiStyleVar_ItemSpacing
|
|
|
|
+ { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ItemInnerSpacing) }, // ImGuiStyleVar_ItemInnerSpacing
|
|
|
|
+ { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, IndentSpacing) }, // ImGuiStyleVar_IndentSpacing
|
|
|
|
+ { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ScrollbarSize) }, // ImGuiStyleVar_ScrollbarSize
|
|
|
|
+ { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ScrollbarRounding) }, // ImGuiStyleVar_ScrollbarRounding
|
|
|
|
+ { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, GrabMinSize) }, // ImGuiStyleVar_GrabMinSize
|
|
|
|
+ { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, GrabRounding) }, // ImGuiStyleVar_GrabRounding
|
|
|
|
+ { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, TabRounding) }, // ImGuiStyleVar_TabRounding
|
|
|
|
+ { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ButtonTextAlign) }, // ImGuiStyleVar_ButtonTextAlign
|
|
|
|
+ { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, SelectableTextAlign) }, // ImGuiStyleVar_SelectableTextAlign
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static const ImGuiStyleVarInfo* GetStyleVarInfo(ImGuiStyleVar idx)
|
|
|
|
+{
|
|
|
|
+ IM_ASSERT(idx >= 0 && idx < ImGuiStyleVar_COUNT);
|
|
|
|
+ IM_ASSERT(IM_ARRAYSIZE(GStyleVarInfo) == ImGuiStyleVar_COUNT);
|
|
|
|
+ return &GStyleVarInfo[idx];
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void ImGui::PushStyleVar(ImGuiStyleVar idx, float val)
|
|
|
|
+{
|
|
|
|
+ const ImGuiStyleVarInfo* var_info = GetStyleVarInfo(idx);
|
|
|
|
+ if (var_info->Type == ImGuiDataType_Float && var_info->Count == 1)
|
|
|
|
+ {
|
|
|
|
+ ImGuiContext& g = *GImGui;
|
|
|
|
+ float* pvar = (float*)var_info->GetVarPtr(&g.Style);
|
|
|
|
+ g.StyleModifiers.push_back(ImGuiStyleMod(idx, *pvar));
|
|
|
|
+ *pvar = val;
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ IM_ASSERT(0 && "Called PushStyleVar() float variant but variable is not a float!");
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void ImGui::PushStyleVar(ImGuiStyleVar idx, const ImVec2& val)
|
|
|
|
+{
|
|
|
|
+ const ImGuiStyleVarInfo* var_info = GetStyleVarInfo(idx);
|
|
|
|
+ if (var_info->Type == ImGuiDataType_Float && var_info->Count == 2)
|
|
|
|
+ {
|
|
|
|
+ ImGuiContext& g = *GImGui;
|
|
|
|
+ ImVec2* pvar = (ImVec2*)var_info->GetVarPtr(&g.Style);
|
|
|
|
+ g.StyleModifiers.push_back(ImGuiStyleMod(idx, *pvar));
|
|
|
|
+ *pvar = val;
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ IM_ASSERT(0 && "Called PushStyleVar() ImVec2 variant but variable is not a ImVec2!");
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void ImGui::PopStyleVar(int count)
|
|
|
|
+{
|
|
|
|
+ ImGuiContext& g = *GImGui;
|
|
|
|
+ while (count > 0)
|
|
|
|
+ {
|
|
|
|
+ // We avoid a generic memcpy(data, &backup.Backup.., GDataTypeSize[info->Type] * info->Count), the overhead in Debug is not worth it.
|
|
|
|
+ ImGuiStyleMod& backup = g.StyleModifiers.back();
|
|
|
|
+ const ImGuiStyleVarInfo* info = GetStyleVarInfo(backup.VarIdx);
|
|
|
|
+ void* data = info->GetVarPtr(&g.Style);
|
|
|
|
+ if (info->Type == ImGuiDataType_Float && info->Count == 1) { ((float*)data)[0] = backup.BackupFloat[0]; }
|
|
|
|
+ else if (info->Type == ImGuiDataType_Float && info->Count == 2) { ((float*)data)[0] = backup.BackupFloat[0]; ((float*)data)[1] = backup.BackupFloat[1]; }
|
|
|
|
+ g.StyleModifiers.pop_back();
|
|
|
|
+ count--;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+const char* ImGui::GetStyleColorName(ImGuiCol idx)
|
|
|
|
+{
|
|
|
|
+ // Create switch-case from enum with regexp: ImGuiCol_{.*}, --> case ImGuiCol_\1: return "\1";
|
|
|
|
+ switch (idx)
|
|
|
|
+ {
|
|
|
|
+ case ImGuiCol_Text: return "Text";
|
|
|
|
+ case ImGuiCol_TextDisabled: return "TextDisabled";
|
|
|
|
+ case ImGuiCol_WindowBg: return "WindowBg";
|
|
|
|
+ case ImGuiCol_ChildBg: return "ChildBg";
|
|
|
|
+ case ImGuiCol_PopupBg: return "PopupBg";
|
|
|
|
+ case ImGuiCol_Border: return "Border";
|
|
|
|
+ case ImGuiCol_BorderShadow: return "BorderShadow";
|
|
|
|
+ case ImGuiCol_FrameBg: return "FrameBg";
|
|
|
|
+ case ImGuiCol_FrameBgHovered: return "FrameBgHovered";
|
|
|
|
+ case ImGuiCol_FrameBgActive: return "FrameBgActive";
|
|
|
|
+ case ImGuiCol_TitleBg: return "TitleBg";
|
|
|
|
+ case ImGuiCol_TitleBgActive: return "TitleBgActive";
|
|
|
|
+ case ImGuiCol_TitleBgCollapsed: return "TitleBgCollapsed";
|
|
|
|
+ case ImGuiCol_MenuBarBg: return "MenuBarBg";
|
|
|
|
+ case ImGuiCol_ScrollbarBg: return "ScrollbarBg";
|
|
|
|
+ case ImGuiCol_ScrollbarGrab: return "ScrollbarGrab";
|
|
|
|
+ case ImGuiCol_ScrollbarGrabHovered: return "ScrollbarGrabHovered";
|
|
|
|
+ case ImGuiCol_ScrollbarGrabActive: return "ScrollbarGrabActive";
|
|
|
|
+ case ImGuiCol_CheckMark: return "CheckMark";
|
|
|
|
+ case ImGuiCol_SliderGrab: return "SliderGrab";
|
|
|
|
+ case ImGuiCol_SliderGrabActive: return "SliderGrabActive";
|
|
|
|
+ case ImGuiCol_Button: return "Button";
|
|
|
|
+ case ImGuiCol_ButtonHovered: return "ButtonHovered";
|
|
|
|
+ case ImGuiCol_ButtonActive: return "ButtonActive";
|
|
|
|
+ case ImGuiCol_Header: return "Header";
|
|
|
|
+ case ImGuiCol_HeaderHovered: return "HeaderHovered";
|
|
|
|
+ case ImGuiCol_HeaderActive: return "HeaderActive";
|
|
|
|
+ case ImGuiCol_Separator: return "Separator";
|
|
|
|
+ case ImGuiCol_SeparatorHovered: return "SeparatorHovered";
|
|
|
|
+ case ImGuiCol_SeparatorActive: return "SeparatorActive";
|
|
|
|
+ case ImGuiCol_ResizeGrip: return "ResizeGrip";
|
|
|
|
+ case ImGuiCol_ResizeGripHovered: return "ResizeGripHovered";
|
|
|
|
+ case ImGuiCol_ResizeGripActive: return "ResizeGripActive";
|
|
|
|
+ case ImGuiCol_Tab: return "Tab";
|
|
|
|
+ case ImGuiCol_TabHovered: return "TabHovered";
|
|
|
|
+ case ImGuiCol_TabActive: return "TabActive";
|
|
|
|
+ case ImGuiCol_TabUnfocused: return "TabUnfocused";
|
|
|
|
+ case ImGuiCol_TabUnfocusedActive: return "TabUnfocusedActive";
|
|
|
|
+ case ImGuiCol_DockingPreview: return "DockingPreview";
|
|
|
|
+ case ImGuiCol_DockingEmptyBg: return "DockingEmptyBg";
|
|
|
|
+ case ImGuiCol_PlotLines: return "PlotLines";
|
|
|
|
+ case ImGuiCol_PlotLinesHovered: return "PlotLinesHovered";
|
|
|
|
+ case ImGuiCol_PlotHistogram: return "PlotHistogram";
|
|
|
|
+ case ImGuiCol_PlotHistogramHovered: return "PlotHistogramHovered";
|
|
|
|
+ case ImGuiCol_TextSelectedBg: return "TextSelectedBg";
|
|
|
|
+ case ImGuiCol_DragDropTarget: return "DragDropTarget";
|
|
|
|
+ case ImGuiCol_NavHighlight: return "NavHighlight";
|
|
|
|
+ case ImGuiCol_NavWindowingHighlight: return "NavWindowingHighlight";
|
|
|
|
+ case ImGuiCol_NavWindowingDimBg: return "NavWindowingDimBg";
|
|
|
|
+ case ImGuiCol_ModalWindowDimBg: return "ModalWindowDimBg";
|
|
|
|
+ }
|
|
|
|
+ IM_ASSERT(0);
|
|
|
|
+ return "Unknown";
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+//-----------------------------------------------------------------------------
|
|
|
|
+// [SECTION] RENDER HELPERS
|
|
|
|
+// Some of those (internal) functions are currently quite a legacy mess - their signature and behavior will change.
|
|
|
|
+// Also see imgui_draw.cpp for some more which have been reworked to not rely on ImGui:: state.
|
|
|
|
+//-----------------------------------------------------------------------------
|
|
|
|
+
|
|
const char* ImGui::FindRenderedTextEnd(const char* text, const char* text_end)
|
|
const char* ImGui::FindRenderedTextEnd(const char* text, const char* text_end)
|
|
{
|
|
{
|
|
const char* text_display_end = text;
|
|
const char* text_display_end = text;
|
|
@@ -3202,24 +3395,6 @@ void ImGui::SetCurrentContext(ImGuiContext* ctx)
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|
|
|
|
|
|
-// Helper function to verify ABI compatibility between caller code and compiled version of Dear ImGui.
|
|
|
|
-// Verify that the type sizes are matching between the calling file's compilation unit and imgui.cpp's compilation unit
|
|
|
|
-// If the user has inconsistent compilation settings, imgui configuration #define, packing pragma, etc. your user code
|
|
|
|
-// may see different structures than what imgui.cpp sees, which is problematic.
|
|
|
|
-// We usually require settings to be in imconfig.h to make sure that they are accessible to all compilation units involved with Dear ImGui.
|
|
|
|
-bool ImGui::DebugCheckVersionAndDataLayout(const char* version, size_t sz_io, size_t sz_style, size_t sz_vec2, size_t sz_vec4, size_t sz_vert, size_t sz_idx)
|
|
|
|
-{
|
|
|
|
- bool error = false;
|
|
|
|
- if (strcmp(version, IMGUI_VERSION)!=0) { error = true; IM_ASSERT(strcmp(version,IMGUI_VERSION)==0 && "Mismatched version string!"); }
|
|
|
|
- if (sz_io != sizeof(ImGuiIO)) { error = true; IM_ASSERT(sz_io == sizeof(ImGuiIO) && "Mismatched struct layout!"); }
|
|
|
|
- if (sz_style != sizeof(ImGuiStyle)) { error = true; IM_ASSERT(sz_style == sizeof(ImGuiStyle) && "Mismatched struct layout!"); }
|
|
|
|
- if (sz_vec2 != sizeof(ImVec2)) { error = true; IM_ASSERT(sz_vec2 == sizeof(ImVec2) && "Mismatched struct layout!"); }
|
|
|
|
- if (sz_vec4 != sizeof(ImVec4)) { error = true; IM_ASSERT(sz_vec4 == sizeof(ImVec4) && "Mismatched struct layout!"); }
|
|
|
|
- if (sz_vert != sizeof(ImDrawVert)) { error = true; IM_ASSERT(sz_vert == sizeof(ImDrawVert) && "Mismatched struct layout!"); }
|
|
|
|
- if (sz_idx != sizeof(ImDrawIdx)) { error = true; IM_ASSERT(sz_idx == sizeof(ImDrawIdx) && "Mismatched struct layout!"); }
|
|
|
|
- return !error;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
void ImGui::SetAllocatorFunctions(void* (*alloc_func)(size_t sz, void* user_data), void (*free_func)(void* ptr, void* user_data), void* user_data)
|
|
void ImGui::SetAllocatorFunctions(void* (*alloc_func)(size_t sz, void* user_data), void (*free_func)(void* ptr, void* user_data), void* user_data)
|
|
{
|
|
{
|
|
GImAllocatorAllocFunc = alloc_func;
|
|
GImAllocatorAllocFunc = alloc_func;
|
|
@@ -3258,12 +3433,6 @@ ImGuiPlatformIO& ImGui::GetPlatformIO()
|
|
return GImGui->PlatformIO;
|
|
return GImGui->PlatformIO;
|
|
}
|
|
}
|
|
|
|
|
|
-ImGuiStyle& ImGui::GetStyle()
|
|
|
|
-{
|
|
|
|
- IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() and ImGui::SetCurrentContext() ?");
|
|
|
|
- return GImGui->Style;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
// Same value as passed to the old io.RenderDrawListsFn function. Valid after Render() and until the next call to NewFrame()
|
|
// Same value as passed to the old io.RenderDrawListsFn function. Valid after Render() and until the next call to NewFrame()
|
|
ImDrawData* ImGui::GetDrawData()
|
|
ImDrawData* ImGui::GetDrawData()
|
|
{
|
|
{
|
|
@@ -3555,7 +3724,7 @@ static void ImGui::UpdateMouseInputs()
|
|
ImVec2 delta_from_click_pos = IsMousePosValid(&g.IO.MousePos) ? (g.IO.MousePos - g.IO.MouseClickedPos[i]) : ImVec2(0.0f, 0.0f);
|
|
ImVec2 delta_from_click_pos = IsMousePosValid(&g.IO.MousePos) ? (g.IO.MousePos - g.IO.MouseClickedPos[i]) : ImVec2(0.0f, 0.0f);
|
|
if (ImLengthSqr(delta_from_click_pos) < g.IO.MouseDoubleClickMaxDist * g.IO.MouseDoubleClickMaxDist)
|
|
if (ImLengthSqr(delta_from_click_pos) < g.IO.MouseDoubleClickMaxDist * g.IO.MouseDoubleClickMaxDist)
|
|
g.IO.MouseDoubleClicked[i] = true;
|
|
g.IO.MouseDoubleClicked[i] = true;
|
|
- g.IO.MouseClickedTime[i] = -FLT_MAX; // so the third click isn't turned into a double-click
|
|
|
|
|
|
+ g.IO.MouseClickedTime[i] = -DBL_MAX; // so the third click isn't turned into a double-click
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
@@ -3667,6 +3836,42 @@ void ImGui::UpdateMouseWheel()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void ImGui::UpdateTabFocus()
|
|
|
|
+{
|
|
|
|
+ ImGuiContext& g = *GImGui;
|
|
|
|
+
|
|
|
|
+ // Pressing TAB activate widget focus
|
|
|
|
+ g.FocusTabPressed = (g.NavWindow && g.NavWindow->Active && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs) && !g.IO.KeyCtrl && IsKeyPressedMap(ImGuiKey_Tab));
|
|
|
|
+ if (g.ActiveId == 0 && g.FocusTabPressed)
|
|
|
|
+ {
|
|
|
|
+ // Note that SetKeyboardFocusHere() sets the Next fields mid-frame. To be consistent we also
|
|
|
|
+ // manipulate the Next fields even, even though they will be turned into Curr fields by the code below.
|
|
|
|
+ g.FocusRequestNextWindow = g.NavWindow;
|
|
|
|
+ g.FocusRequestNextCounterRegular = INT_MAX;
|
|
|
|
+ if (g.NavId != 0 && g.NavIdTabCounter != INT_MAX)
|
|
|
|
+ g.FocusRequestNextCounterTabStop = g.NavIdTabCounter + 1 + (g.IO.KeyShift ? -1 : 1);
|
|
|
|
+ else
|
|
|
|
+ g.FocusRequestNextCounterTabStop = g.IO.KeyShift ? -1 : 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Turn queued focus request into current one
|
|
|
|
+ g.FocusRequestCurrWindow = NULL;
|
|
|
|
+ g.FocusRequestCurrCounterRegular = g.FocusRequestCurrCounterTabStop = INT_MAX;
|
|
|
|
+ if (g.FocusRequestNextWindow != NULL)
|
|
|
|
+ {
|
|
|
|
+ ImGuiWindow* window = g.FocusRequestNextWindow;
|
|
|
|
+ g.FocusRequestCurrWindow = window;
|
|
|
|
+ if (g.FocusRequestNextCounterRegular != INT_MAX && window->DC.FocusCounterRegular != -1)
|
|
|
|
+ g.FocusRequestCurrCounterRegular = ImModPositive(g.FocusRequestNextCounterRegular, window->DC.FocusCounterRegular + 1);
|
|
|
|
+ if (g.FocusRequestNextCounterTabStop != INT_MAX && window->DC.FocusCounterTabStop != -1)
|
|
|
|
+ g.FocusRequestCurrCounterTabStop = ImModPositive(g.FocusRequestNextCounterTabStop, window->DC.FocusCounterTabStop + 1);
|
|
|
|
+ g.FocusRequestNextWindow = NULL;
|
|
|
|
+ g.FocusRequestNextCounterRegular = g.FocusRequestNextCounterTabStop = INT_MAX;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ g.NavIdTabCounter = INT_MAX;
|
|
|
|
+}
|
|
|
|
+
|
|
// The reason this is exposed in imgui_internal.h is: on touch-based system that don't have hovering, we want to dispatch inputs to the right target (imgui vs imgui+app)
|
|
// The reason this is exposed in imgui_internal.h is: on touch-based system that don't have hovering, we want to dispatch inputs to the right target (imgui vs imgui+app)
|
|
void ImGui::UpdateHoveredWindowAndCaptureFlags()
|
|
void ImGui::UpdateHoveredWindowAndCaptureFlags()
|
|
{
|
|
{
|
|
@@ -3813,34 +4018,21 @@ void ImGui::NewFrame()
|
|
NewFrameSanityChecks();
|
|
NewFrameSanityChecks();
|
|
g.ConfigFlagsCurrFrame = g.IO.ConfigFlags;
|
|
g.ConfigFlagsCurrFrame = g.IO.ConfigFlags;
|
|
|
|
|
|
- // Load settings on first frame (if not explicitly loaded manually before)
|
|
|
|
- if (!g.SettingsLoaded)
|
|
|
|
- {
|
|
|
|
- IM_ASSERT(g.SettingsWindows.empty());
|
|
|
|
- if (g.IO.IniFilename)
|
|
|
|
- LoadIniSettingsFromDisk(g.IO.IniFilename);
|
|
|
|
- g.SettingsLoaded = true;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- // Save settings (with a delay after the last modification, so we don't spam disk too much)
|
|
|
|
- if (g.SettingsDirtyTimer > 0.0f)
|
|
|
|
- {
|
|
|
|
- g.SettingsDirtyTimer -= g.IO.DeltaTime;
|
|
|
|
- if (g.SettingsDirtyTimer <= 0.0f)
|
|
|
|
- {
|
|
|
|
- if (g.IO.IniFilename != NULL)
|
|
|
|
- SaveIniSettingsToDisk(g.IO.IniFilename);
|
|
|
|
- else
|
|
|
|
- g.IO.WantSaveIniSettings = true; // Let user know they can call SaveIniSettingsToMemory(). user will need to clear io.WantSaveIniSettings themselves.
|
|
|
|
- g.SettingsDirtyTimer = 0.0f;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ // Load settings on first frame, save settings when modified (after a delay)
|
|
|
|
+ UpdateSettings();
|
|
|
|
|
|
g.Time += g.IO.DeltaTime;
|
|
g.Time += g.IO.DeltaTime;
|
|
g.WithinFrameScope = true;
|
|
g.WithinFrameScope = true;
|
|
g.FrameCount += 1;
|
|
g.FrameCount += 1;
|
|
g.TooltipOverrideCount = 0;
|
|
g.TooltipOverrideCount = 0;
|
|
g.WindowsActiveCount = 0;
|
|
g.WindowsActiveCount = 0;
|
|
|
|
+ g.MenusIdSubmittedThisFrame.resize(0);
|
|
|
|
+
|
|
|
|
+ // Calculate frame-rate for the user, as a purely luxurious feature
|
|
|
|
+ g.FramerateSecPerFrameAccum += g.IO.DeltaTime - g.FramerateSecPerFrame[g.FramerateSecPerFrameIdx];
|
|
|
|
+ g.FramerateSecPerFrame[g.FramerateSecPerFrameIdx] = g.IO.DeltaTime;
|
|
|
|
+ g.FramerateSecPerFrameIdx = (g.FramerateSecPerFrameIdx + 1) % IM_ARRAYSIZE(g.FramerateSecPerFrame);
|
|
|
|
+ g.IO.Framerate = (g.FramerateSecPerFrameAccum > 0.0f) ? (1.0f / (g.FramerateSecPerFrameAccum / (float)IM_ARRAYSIZE(g.FramerateSecPerFrame))) : FLT_MAX;
|
|
|
|
|
|
UpdateViewportsNewFrame();
|
|
UpdateViewportsNewFrame();
|
|
|
|
|
|
@@ -3875,7 +4067,7 @@ void ImGui::NewFrame()
|
|
if (g.DragDropActive && g.DragDropPayload.SourceId == g.ActiveId)
|
|
if (g.DragDropActive && g.DragDropPayload.SourceId == g.ActiveId)
|
|
KeepAliveID(g.DragDropPayload.SourceId);
|
|
KeepAliveID(g.DragDropPayload.SourceId);
|
|
|
|
|
|
- // Clear reference to active widget if the widget isn't alive anymore
|
|
|
|
|
|
+ // Update HoveredId data
|
|
if (!g.HoveredIdPreviousFrame)
|
|
if (!g.HoveredIdPreviousFrame)
|
|
g.HoveredIdTimer = 0.0f;
|
|
g.HoveredIdTimer = 0.0f;
|
|
if (!g.HoveredIdPreviousFrame || (g.HoveredId && g.ActiveId == g.HoveredId))
|
|
if (!g.HoveredIdPreviousFrame || (g.HoveredId && g.ActiveId == g.HoveredId))
|
|
@@ -3887,6 +4079,8 @@ void ImGui::NewFrame()
|
|
g.HoveredIdPreviousFrame = g.HoveredId;
|
|
g.HoveredIdPreviousFrame = g.HoveredId;
|
|
g.HoveredId = 0;
|
|
g.HoveredId = 0;
|
|
g.HoveredIdAllowOverlap = false;
|
|
g.HoveredIdAllowOverlap = false;
|
|
|
|
+
|
|
|
|
+ // Update ActiveId data (clear reference to active widget if the widget isn't alive anymore)
|
|
if (g.ActiveIdIsAlive != g.ActiveId && g.ActiveIdPreviousFrame == g.ActiveId && g.ActiveId != 0)
|
|
if (g.ActiveIdIsAlive != g.ActiveId && g.ActiveIdPreviousFrame == g.ActiveId && g.ActiveId != 0)
|
|
ClearActiveID();
|
|
ClearActiveID();
|
|
if (g.ActiveId)
|
|
if (g.ActiveId)
|
|
@@ -3899,12 +4093,13 @@ void ImGui::NewFrame()
|
|
g.ActiveIdHasBeenEditedThisFrame = false;
|
|
g.ActiveIdHasBeenEditedThisFrame = false;
|
|
g.ActiveIdPreviousFrameIsAlive = false;
|
|
g.ActiveIdPreviousFrameIsAlive = false;
|
|
g.ActiveIdIsJustActivated = false;
|
|
g.ActiveIdIsJustActivated = false;
|
|
- if (g.TempInputTextId != 0 && g.ActiveId != g.TempInputTextId)
|
|
|
|
- g.TempInputTextId = 0;
|
|
|
|
|
|
+ if (g.TempInputId != 0 && g.ActiveId != g.TempInputId)
|
|
|
|
+ g.TempInputId = 0;
|
|
if (g.ActiveId == 0)
|
|
if (g.ActiveId == 0)
|
|
{
|
|
{
|
|
- g.ActiveIdUsingNavDirMask = g.ActiveIdUsingNavInputMask = 0;
|
|
|
|
- g.ActiveIdUsingKeyInputMask = 0;
|
|
|
|
|
|
+ g.ActiveIdUsingNavDirMask = 0x00;
|
|
|
|
+ g.ActiveIdUsingNavInputMask = 0x00;
|
|
|
|
+ g.ActiveIdUsingKeyInputMask = 0x00;
|
|
}
|
|
}
|
|
|
|
|
|
// Drag and drop
|
|
// Drag and drop
|
|
@@ -3924,12 +4119,6 @@ void ImGui::NewFrame()
|
|
// Update mouse input state
|
|
// Update mouse input state
|
|
UpdateMouseInputs();
|
|
UpdateMouseInputs();
|
|
|
|
|
|
- // Calculate frame-rate for the user, as a purely luxurious feature
|
|
|
|
- g.FramerateSecPerFrameAccum += g.IO.DeltaTime - g.FramerateSecPerFrame[g.FramerateSecPerFrameIdx];
|
|
|
|
- g.FramerateSecPerFrame[g.FramerateSecPerFrameIdx] = g.IO.DeltaTime;
|
|
|
|
- g.FramerateSecPerFrameIdx = (g.FramerateSecPerFrameIdx + 1) % IM_ARRAYSIZE(g.FramerateSecPerFrame);
|
|
|
|
- g.IO.Framerate = (g.FramerateSecPerFrameAccum > 0.0f) ? (1.0f / (g.FramerateSecPerFrameAccum / (float)IM_ARRAYSIZE(g.FramerateSecPerFrame))) : FLT_MAX;
|
|
|
|
-
|
|
|
|
// Undocking
|
|
// Undocking
|
|
// (needs to be before UpdateMouseMovingWindowNewFrame so the window is already offset and following the mouse on the detaching frame)
|
|
// (needs to be before UpdateMouseMovingWindowNewFrame so the window is already offset and following the mouse on the detaching frame)
|
|
DockContextUpdateUndocking(&g);
|
|
DockContextUpdateUndocking(&g);
|
|
@@ -3945,46 +4134,18 @@ void ImGui::NewFrame()
|
|
if (GetTopMostPopupModal() != NULL || (g.NavWindowingTarget != NULL && g.NavWindowingHighlightAlpha > 0.0f))
|
|
if (GetTopMostPopupModal() != NULL || (g.NavWindowingTarget != NULL && g.NavWindowingHighlightAlpha > 0.0f))
|
|
g.DimBgRatio = ImMin(g.DimBgRatio + g.IO.DeltaTime * 6.0f, 1.0f);
|
|
g.DimBgRatio = ImMin(g.DimBgRatio + g.IO.DeltaTime * 6.0f, 1.0f);
|
|
else
|
|
else
|
|
- g.DimBgRatio = ImMax(g.DimBgRatio - g.IO.DeltaTime * 10.0f, 0.0f);
|
|
|
|
-
|
|
|
|
- g.MouseCursor = ImGuiMouseCursor_Arrow;
|
|
|
|
- g.WantCaptureMouseNextFrame = g.WantCaptureKeyboardNextFrame = g.WantTextInputNextFrame = -1;
|
|
|
|
- g.PlatformImePos = ImVec2(1.0f, 1.0f); // OS Input Method Editor showing on top-left of our window by default
|
|
|
|
- g.PlatformImePosViewport = NULL;
|
|
|
|
-
|
|
|
|
- // Mouse wheel scrolling, scale
|
|
|
|
- UpdateMouseWheel();
|
|
|
|
-
|
|
|
|
- // Pressing TAB activate widget focus
|
|
|
|
- g.FocusTabPressed = (g.NavWindow && g.NavWindow->Active && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs) && !g.IO.KeyCtrl && IsKeyPressedMap(ImGuiKey_Tab));
|
|
|
|
- if (g.ActiveId == 0 && g.FocusTabPressed)
|
|
|
|
- {
|
|
|
|
- // Note that SetKeyboardFocusHere() sets the Next fields mid-frame. To be consistent we also
|
|
|
|
- // manipulate the Next fields even, even though they will be turned into Curr fields by the code below.
|
|
|
|
- g.FocusRequestNextWindow = g.NavWindow;
|
|
|
|
- g.FocusRequestNextCounterRegular = INT_MAX;
|
|
|
|
- if (g.NavId != 0 && g.NavIdTabCounter != INT_MAX)
|
|
|
|
- g.FocusRequestNextCounterTabStop = g.NavIdTabCounter + 1 + (g.IO.KeyShift ? -1 : 1);
|
|
|
|
- else
|
|
|
|
- g.FocusRequestNextCounterTabStop = g.IO.KeyShift ? -1 : 0;
|
|
|
|
- }
|
|
|
|
|
|
+ g.DimBgRatio = ImMax(g.DimBgRatio - g.IO.DeltaTime * 10.0f, 0.0f);
|
|
|
|
|
|
- // Turn queued focus request into current one
|
|
|
|
- g.FocusRequestCurrWindow = NULL;
|
|
|
|
- g.FocusRequestCurrCounterRegular = g.FocusRequestCurrCounterTabStop = INT_MAX;
|
|
|
|
- if (g.FocusRequestNextWindow != NULL)
|
|
|
|
- {
|
|
|
|
- ImGuiWindow* window = g.FocusRequestNextWindow;
|
|
|
|
- g.FocusRequestCurrWindow = window;
|
|
|
|
- if (g.FocusRequestNextCounterRegular != INT_MAX && window->DC.FocusCounterRegular != -1)
|
|
|
|
- g.FocusRequestCurrCounterRegular = ImModPositive(g.FocusRequestNextCounterRegular, window->DC.FocusCounterRegular + 1);
|
|
|
|
- if (g.FocusRequestNextCounterTabStop != INT_MAX && window->DC.FocusCounterTabStop != -1)
|
|
|
|
- g.FocusRequestCurrCounterTabStop = ImModPositive(g.FocusRequestNextCounterTabStop, window->DC.FocusCounterTabStop + 1);
|
|
|
|
- g.FocusRequestNextWindow = NULL;
|
|
|
|
- g.FocusRequestNextCounterRegular = g.FocusRequestNextCounterTabStop = INT_MAX;
|
|
|
|
- }
|
|
|
|
|
|
+ g.MouseCursor = ImGuiMouseCursor_Arrow;
|
|
|
|
+ g.WantCaptureMouseNextFrame = g.WantCaptureKeyboardNextFrame = g.WantTextInputNextFrame = -1;
|
|
|
|
+ g.PlatformImePos = ImVec2(1.0f, 1.0f); // OS Input Method Editor showing on top-left of our window by default
|
|
|
|
+ g.PlatformImePosViewport = NULL;
|
|
|
|
|
|
- g.NavIdTabCounter = INT_MAX;
|
|
|
|
|
|
+ // Mouse wheel scrolling, scale
|
|
|
|
+ UpdateMouseWheel();
|
|
|
|
+
|
|
|
|
+ // Update legacy TAB focus
|
|
|
|
+ UpdateTabFocus();
|
|
|
|
|
|
// Mark all windows as not visible and compact unused memory.
|
|
// Mark all windows as not visible and compact unused memory.
|
|
IM_ASSERT(g.WindowsFocusOrder.Size == g.Windows.Size);
|
|
IM_ASSERT(g.WindowsFocusOrder.Size == g.Windows.Size);
|
|
@@ -4167,6 +4328,7 @@ void ImGui::Shutdown(ImGuiContext* context)
|
|
g.ShrinkWidthBuffer.clear();
|
|
g.ShrinkWidthBuffer.clear();
|
|
|
|
|
|
g.PrivateClipboard.clear();
|
|
g.PrivateClipboard.clear();
|
|
|
|
+ g.MenusIdSubmittedThisFrame.clear();
|
|
g.InputTextState.ClearFreeMemory();
|
|
g.InputTextState.ClearFreeMemory();
|
|
|
|
|
|
g.SettingsWindows.clear();
|
|
g.SettingsWindows.clear();
|
|
@@ -5366,7 +5528,7 @@ ImGuiID ImGui::GetWindowResizeID(ImGuiWindow* window, int n)
|
|
|
|
|
|
// Handle resize for: Resize Grips, Borders, Gamepad
|
|
// Handle resize for: Resize Grips, Borders, Gamepad
|
|
// Return true when using auto-fit (double click on resize grip)
|
|
// Return true when using auto-fit (double click on resize grip)
|
|
-static bool ImGui::UpdateManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4])
|
|
|
|
|
|
+static bool ImGui::UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4])
|
|
{
|
|
{
|
|
ImGuiContext& g = *GImGui;
|
|
ImGuiContext& g = *GImGui;
|
|
ImGuiWindowFlags flags = window->Flags;
|
|
ImGuiWindowFlags flags = window->Flags;
|
|
@@ -6237,7 +6399,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
const int resize_grip_count = g.IO.ConfigWindowsResizeFromEdges ? 2 : 1; // Allow resize from lower-left if we have the mouse cursor feedback for it.
|
|
const int resize_grip_count = g.IO.ConfigWindowsResizeFromEdges ? 2 : 1; // Allow resize from lower-left if we have the mouse cursor feedback for it.
|
|
const float resize_grip_draw_size = IM_FLOOR(ImMax(g.FontSize * 1.35f, window->WindowRounding + 1.0f + g.FontSize * 0.2f));
|
|
const float resize_grip_draw_size = IM_FLOOR(ImMax(g.FontSize * 1.35f, window->WindowRounding + 1.0f + g.FontSize * 0.2f));
|
|
if (handle_borders_and_resize_grips && !window->Collapsed)
|
|
if (handle_borders_and_resize_grips && !window->Collapsed)
|
|
- if (UpdateManualResize(window, size_auto_fit, &border_held, resize_grip_count, &resize_grip_col[0]))
|
|
|
|
|
|
+ if (UpdateWindowManualResize(window, size_auto_fit, &border_held, resize_grip_count, &resize_grip_col[0]))
|
|
use_current_size_for_scrollbar_x = use_current_size_for_scrollbar_y = true;
|
|
use_current_size_for_scrollbar_x = use_current_size_for_scrollbar_y = true;
|
|
window->ResizeBorderHeld = (signed char)border_held;
|
|
window->ResizeBorderHeld = (signed char)border_held;
|
|
|
|
|
|
@@ -6453,19 +6615,15 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
window->DC.ParentLayoutType = parent_window ? parent_window->DC.LayoutType : ImGuiLayoutType_Vertical;
|
|
window->DC.ParentLayoutType = parent_window ? parent_window->DC.LayoutType : ImGuiLayoutType_Vertical;
|
|
window->DC.FocusCounterRegular = window->DC.FocusCounterTabStop = -1;
|
|
window->DC.FocusCounterRegular = window->DC.FocusCounterTabStop = -1;
|
|
|
|
|
|
- window->DC.ItemFlags = parent_window ? parent_window->DC.ItemFlags : ImGuiItemFlags_Default_;
|
|
|
|
window->DC.ItemWidth = window->ItemWidthDefault;
|
|
window->DC.ItemWidth = window->ItemWidthDefault;
|
|
window->DC.TextWrapPos = -1.0f; // disabled
|
|
window->DC.TextWrapPos = -1.0f; // disabled
|
|
window->DC.ItemFlagsStack.resize(0);
|
|
window->DC.ItemFlagsStack.resize(0);
|
|
window->DC.ItemWidthStack.resize(0);
|
|
window->DC.ItemWidthStack.resize(0);
|
|
window->DC.TextWrapPosStack.resize(0);
|
|
window->DC.TextWrapPosStack.resize(0);
|
|
window->DC.GroupStack.resize(0);
|
|
window->DC.GroupStack.resize(0);
|
|
-
|
|
|
|
- if ((flags & ImGuiWindowFlags_ChildWindow) && (window->DC.ItemFlags != parent_window->DC.ItemFlags))
|
|
|
|
- {
|
|
|
|
- window->DC.ItemFlags = parent_window->DC.ItemFlags;
|
|
|
|
|
|
+ window->DC.ItemFlags = parent_window ? parent_window->DC.ItemFlags : ImGuiItemFlags_Default_;
|
|
|
|
+ if (parent_window)
|
|
window->DC.ItemFlagsStack.push_back(window->DC.ItemFlags);
|
|
window->DC.ItemFlagsStack.push_back(window->DC.ItemFlags);
|
|
- }
|
|
|
|
|
|
|
|
if (window->AutoFitFramesX > 0)
|
|
if (window->AutoFitFramesX > 0)
|
|
window->AutoFitFramesX--;
|
|
window->AutoFitFramesX--;
|
|
@@ -6932,185 +7090,6 @@ void ImGui::PopTextWrapPos()
|
|
window->DC.TextWrapPos = window->DC.TextWrapPosStack.empty() ? -1.0f : window->DC.TextWrapPosStack.back();
|
|
window->DC.TextWrapPos = window->DC.TextWrapPosStack.empty() ? -1.0f : window->DC.TextWrapPosStack.back();
|
|
}
|
|
}
|
|
|
|
|
|
-// FIXME: This may incur a round-trip (if the end user got their data from a float4) but eventually we aim to store the in-flight colors as ImU32
|
|
|
|
-void ImGui::PushStyleColor(ImGuiCol idx, ImU32 col)
|
|
|
|
-{
|
|
|
|
- ImGuiContext& g = *GImGui;
|
|
|
|
- ImGuiColorMod backup;
|
|
|
|
- backup.Col = idx;
|
|
|
|
- backup.BackupValue = g.Style.Colors[idx];
|
|
|
|
- g.ColorModifiers.push_back(backup);
|
|
|
|
- g.Style.Colors[idx] = ColorConvertU32ToFloat4(col);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-void ImGui::PushStyleColor(ImGuiCol idx, const ImVec4& col)
|
|
|
|
-{
|
|
|
|
- ImGuiContext& g = *GImGui;
|
|
|
|
- ImGuiColorMod backup;
|
|
|
|
- backup.Col = idx;
|
|
|
|
- backup.BackupValue = g.Style.Colors[idx];
|
|
|
|
- g.ColorModifiers.push_back(backup);
|
|
|
|
- g.Style.Colors[idx] = col;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-void ImGui::PopStyleColor(int count)
|
|
|
|
-{
|
|
|
|
- ImGuiContext& g = *GImGui;
|
|
|
|
- while (count > 0)
|
|
|
|
- {
|
|
|
|
- ImGuiColorMod& backup = g.ColorModifiers.back();
|
|
|
|
- g.Style.Colors[backup.Col] = backup.BackupValue;
|
|
|
|
- g.ColorModifiers.pop_back();
|
|
|
|
- count--;
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-struct ImGuiStyleVarInfo
|
|
|
|
-{
|
|
|
|
- ImGuiDataType Type;
|
|
|
|
- ImU32 Count;
|
|
|
|
- ImU32 Offset;
|
|
|
|
- void* GetVarPtr(ImGuiStyle* style) const { return (void*)((unsigned char*)style + Offset); }
|
|
|
|
-};
|
|
|
|
-
|
|
|
|
-static const ImGuiStyleVarInfo GStyleVarInfo[] =
|
|
|
|
-{
|
|
|
|
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, Alpha) }, // ImGuiStyleVar_Alpha
|
|
|
|
- { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowPadding) }, // ImGuiStyleVar_WindowPadding
|
|
|
|
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowRounding) }, // ImGuiStyleVar_WindowRounding
|
|
|
|
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowBorderSize) }, // ImGuiStyleVar_WindowBorderSize
|
|
|
|
- { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowMinSize) }, // ImGuiStyleVar_WindowMinSize
|
|
|
|
- { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowTitleAlign) }, // ImGuiStyleVar_WindowTitleAlign
|
|
|
|
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ChildRounding) }, // ImGuiStyleVar_ChildRounding
|
|
|
|
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ChildBorderSize) }, // ImGuiStyleVar_ChildBorderSize
|
|
|
|
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, PopupRounding) }, // ImGuiStyleVar_PopupRounding
|
|
|
|
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, PopupBorderSize) }, // ImGuiStyleVar_PopupBorderSize
|
|
|
|
- { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, FramePadding) }, // ImGuiStyleVar_FramePadding
|
|
|
|
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, FrameRounding) }, // ImGuiStyleVar_FrameRounding
|
|
|
|
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, FrameBorderSize) }, // ImGuiStyleVar_FrameBorderSize
|
|
|
|
- { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ItemSpacing) }, // ImGuiStyleVar_ItemSpacing
|
|
|
|
- { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ItemInnerSpacing) }, // ImGuiStyleVar_ItemInnerSpacing
|
|
|
|
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, IndentSpacing) }, // ImGuiStyleVar_IndentSpacing
|
|
|
|
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ScrollbarSize) }, // ImGuiStyleVar_ScrollbarSize
|
|
|
|
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ScrollbarRounding) }, // ImGuiStyleVar_ScrollbarRounding
|
|
|
|
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, GrabMinSize) }, // ImGuiStyleVar_GrabMinSize
|
|
|
|
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, GrabRounding) }, // ImGuiStyleVar_GrabRounding
|
|
|
|
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, TabRounding) }, // ImGuiStyleVar_TabRounding
|
|
|
|
- { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ButtonTextAlign) }, // ImGuiStyleVar_ButtonTextAlign
|
|
|
|
- { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, SelectableTextAlign) }, // ImGuiStyleVar_SelectableTextAlign
|
|
|
|
-};
|
|
|
|
-
|
|
|
|
-static const ImGuiStyleVarInfo* GetStyleVarInfo(ImGuiStyleVar idx)
|
|
|
|
-{
|
|
|
|
- IM_ASSERT(idx >= 0 && idx < ImGuiStyleVar_COUNT);
|
|
|
|
- IM_ASSERT(IM_ARRAYSIZE(GStyleVarInfo) == ImGuiStyleVar_COUNT);
|
|
|
|
- return &GStyleVarInfo[idx];
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-void ImGui::PushStyleVar(ImGuiStyleVar idx, float val)
|
|
|
|
-{
|
|
|
|
- const ImGuiStyleVarInfo* var_info = GetStyleVarInfo(idx);
|
|
|
|
- if (var_info->Type == ImGuiDataType_Float && var_info->Count == 1)
|
|
|
|
- {
|
|
|
|
- ImGuiContext& g = *GImGui;
|
|
|
|
- float* pvar = (float*)var_info->GetVarPtr(&g.Style);
|
|
|
|
- g.StyleModifiers.push_back(ImGuiStyleMod(idx, *pvar));
|
|
|
|
- *pvar = val;
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
- IM_ASSERT(0 && "Called PushStyleVar() float variant but variable is not a float!");
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-void ImGui::PushStyleVar(ImGuiStyleVar idx, const ImVec2& val)
|
|
|
|
-{
|
|
|
|
- const ImGuiStyleVarInfo* var_info = GetStyleVarInfo(idx);
|
|
|
|
- if (var_info->Type == ImGuiDataType_Float && var_info->Count == 2)
|
|
|
|
- {
|
|
|
|
- ImGuiContext& g = *GImGui;
|
|
|
|
- ImVec2* pvar = (ImVec2*)var_info->GetVarPtr(&g.Style);
|
|
|
|
- g.StyleModifiers.push_back(ImGuiStyleMod(idx, *pvar));
|
|
|
|
- *pvar = val;
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
- IM_ASSERT(0 && "Called PushStyleVar() ImVec2 variant but variable is not a ImVec2!");
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-void ImGui::PopStyleVar(int count)
|
|
|
|
-{
|
|
|
|
- ImGuiContext& g = *GImGui;
|
|
|
|
- while (count > 0)
|
|
|
|
- {
|
|
|
|
- // We avoid a generic memcpy(data, &backup.Backup.., GDataTypeSize[info->Type] * info->Count), the overhead in Debug is not worth it.
|
|
|
|
- ImGuiStyleMod& backup = g.StyleModifiers.back();
|
|
|
|
- const ImGuiStyleVarInfo* info = GetStyleVarInfo(backup.VarIdx);
|
|
|
|
- void* data = info->GetVarPtr(&g.Style);
|
|
|
|
- if (info->Type == ImGuiDataType_Float && info->Count == 1) { ((float*)data)[0] = backup.BackupFloat[0]; }
|
|
|
|
- else if (info->Type == ImGuiDataType_Float && info->Count == 2) { ((float*)data)[0] = backup.BackupFloat[0]; ((float*)data)[1] = backup.BackupFloat[1]; }
|
|
|
|
- g.StyleModifiers.pop_back();
|
|
|
|
- count--;
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-const char* ImGui::GetStyleColorName(ImGuiCol idx)
|
|
|
|
-{
|
|
|
|
- // Create switch-case from enum with regexp: ImGuiCol_{.*}, --> case ImGuiCol_\1: return "\1";
|
|
|
|
- switch (idx)
|
|
|
|
- {
|
|
|
|
- case ImGuiCol_Text: return "Text";
|
|
|
|
- case ImGuiCol_TextDisabled: return "TextDisabled";
|
|
|
|
- case ImGuiCol_WindowBg: return "WindowBg";
|
|
|
|
- case ImGuiCol_ChildBg: return "ChildBg";
|
|
|
|
- case ImGuiCol_PopupBg: return "PopupBg";
|
|
|
|
- case ImGuiCol_Border: return "Border";
|
|
|
|
- case ImGuiCol_BorderShadow: return "BorderShadow";
|
|
|
|
- case ImGuiCol_FrameBg: return "FrameBg";
|
|
|
|
- case ImGuiCol_FrameBgHovered: return "FrameBgHovered";
|
|
|
|
- case ImGuiCol_FrameBgActive: return "FrameBgActive";
|
|
|
|
- case ImGuiCol_TitleBg: return "TitleBg";
|
|
|
|
- case ImGuiCol_TitleBgActive: return "TitleBgActive";
|
|
|
|
- case ImGuiCol_TitleBgCollapsed: return "TitleBgCollapsed";
|
|
|
|
- case ImGuiCol_MenuBarBg: return "MenuBarBg";
|
|
|
|
- case ImGuiCol_ScrollbarBg: return "ScrollbarBg";
|
|
|
|
- case ImGuiCol_ScrollbarGrab: return "ScrollbarGrab";
|
|
|
|
- case ImGuiCol_ScrollbarGrabHovered: return "ScrollbarGrabHovered";
|
|
|
|
- case ImGuiCol_ScrollbarGrabActive: return "ScrollbarGrabActive";
|
|
|
|
- case ImGuiCol_CheckMark: return "CheckMark";
|
|
|
|
- case ImGuiCol_SliderGrab: return "SliderGrab";
|
|
|
|
- case ImGuiCol_SliderGrabActive: return "SliderGrabActive";
|
|
|
|
- case ImGuiCol_Button: return "Button";
|
|
|
|
- case ImGuiCol_ButtonHovered: return "ButtonHovered";
|
|
|
|
- case ImGuiCol_ButtonActive: return "ButtonActive";
|
|
|
|
- case ImGuiCol_Header: return "Header";
|
|
|
|
- case ImGuiCol_HeaderHovered: return "HeaderHovered";
|
|
|
|
- case ImGuiCol_HeaderActive: return "HeaderActive";
|
|
|
|
- case ImGuiCol_Separator: return "Separator";
|
|
|
|
- case ImGuiCol_SeparatorHovered: return "SeparatorHovered";
|
|
|
|
- case ImGuiCol_SeparatorActive: return "SeparatorActive";
|
|
|
|
- case ImGuiCol_ResizeGrip: return "ResizeGrip";
|
|
|
|
- case ImGuiCol_ResizeGripHovered: return "ResizeGripHovered";
|
|
|
|
- case ImGuiCol_ResizeGripActive: return "ResizeGripActive";
|
|
|
|
- case ImGuiCol_Tab: return "Tab";
|
|
|
|
- case ImGuiCol_TabHovered: return "TabHovered";
|
|
|
|
- case ImGuiCol_TabActive: return "TabActive";
|
|
|
|
- case ImGuiCol_TabUnfocused: return "TabUnfocused";
|
|
|
|
- case ImGuiCol_TabUnfocusedActive: return "TabUnfocusedActive";
|
|
|
|
- case ImGuiCol_DockingPreview: return "DockingPreview";
|
|
|
|
- case ImGuiCol_DockingEmptyBg: return "DockingEmptyBg";
|
|
|
|
- case ImGuiCol_PlotLines: return "PlotLines";
|
|
|
|
- case ImGuiCol_PlotLinesHovered: return "PlotLinesHovered";
|
|
|
|
- case ImGuiCol_PlotHistogram: return "PlotHistogram";
|
|
|
|
- case ImGuiCol_PlotHistogramHovered: return "PlotHistogramHovered";
|
|
|
|
- case ImGuiCol_TextSelectedBg: return "TextSelectedBg";
|
|
|
|
- case ImGuiCol_DragDropTarget: return "DragDropTarget";
|
|
|
|
- case ImGuiCol_NavHighlight: return "NavHighlight";
|
|
|
|
- case ImGuiCol_NavWindowingHighlight: return "NavWindowingHighlight";
|
|
|
|
- case ImGuiCol_NavWindowingDimBg: return "NavWindowingDimBg";
|
|
|
|
- case ImGuiCol_ModalWindowDimBg: return "ModalWindowDimBg";
|
|
|
|
- }
|
|
|
|
- IM_ASSERT(0);
|
|
|
|
- return "Unknown";
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
bool ImGui::IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent)
|
|
bool ImGui::IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent)
|
|
{
|
|
{
|
|
if (window->RootWindow == potential_parent)
|
|
if (window->RootWindow == potential_parent)
|
|
@@ -7872,11 +7851,28 @@ void ImGui::Unindent(float indent_w)
|
|
window->DC.CursorPos.x = window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x;
|
|
window->DC.CursorPos.x = window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x;
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//-----------------------------------------------------------------------------
|
|
// [SECTION] ERROR CHECKING
|
|
// [SECTION] ERROR CHECKING
|
|
//-----------------------------------------------------------------------------
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
+// Helper function to verify ABI compatibility between caller code and compiled version of Dear ImGui.
|
|
|
|
+// Verify that the type sizes are matching between the calling file's compilation unit and imgui.cpp's compilation unit
|
|
|
|
+// If the user has inconsistent compilation settings, imgui configuration #define, packing pragma, etc. your user code
|
|
|
|
+// may see different structures than what imgui.cpp sees, which is problematic.
|
|
|
|
+// We usually require settings to be in imconfig.h to make sure that they are accessible to all compilation units involved with Dear ImGui.
|
|
|
|
+bool ImGui::DebugCheckVersionAndDataLayout(const char* version, size_t sz_io, size_t sz_style, size_t sz_vec2, size_t sz_vec4, size_t sz_vert, size_t sz_idx)
|
|
|
|
+{
|
|
|
|
+ bool error = false;
|
|
|
|
+ if (strcmp(version, IMGUI_VERSION)!=0) { error = true; IM_ASSERT(strcmp(version,IMGUI_VERSION)==0 && "Mismatched version string!"); }
|
|
|
|
+ if (sz_io != sizeof(ImGuiIO)) { error = true; IM_ASSERT(sz_io == sizeof(ImGuiIO) && "Mismatched struct layout!"); }
|
|
|
|
+ if (sz_style != sizeof(ImGuiStyle)) { error = true; IM_ASSERT(sz_style == sizeof(ImGuiStyle) && "Mismatched struct layout!"); }
|
|
|
|
+ if (sz_vec2 != sizeof(ImVec2)) { error = true; IM_ASSERT(sz_vec2 == sizeof(ImVec2) && "Mismatched struct layout!"); }
|
|
|
|
+ if (sz_vec4 != sizeof(ImVec4)) { error = true; IM_ASSERT(sz_vec4 == sizeof(ImVec4) && "Mismatched struct layout!"); }
|
|
|
|
+ if (sz_vert != sizeof(ImDrawVert)) { error = true; IM_ASSERT(sz_vert == sizeof(ImDrawVert) && "Mismatched struct layout!"); }
|
|
|
|
+ if (sz_idx != sizeof(ImDrawIdx)) { error = true; IM_ASSERT(sz_idx == sizeof(ImDrawIdx) && "Mismatched struct layout!"); }
|
|
|
|
+ return !error;
|
|
|
|
+}
|
|
|
|
+
|
|
static void ImGui::ErrorCheckEndFrame()
|
|
static void ImGui::ErrorCheckEndFrame()
|
|
{
|
|
{
|
|
// Report when there is a mismatch of Begin/BeginChild vs End/EndChild calls. Important: Remember that the Begin/BeginChild API requires you
|
|
// Report when there is a mismatch of Begin/BeginChild vs End/EndChild calls. Important: Remember that the Begin/BeginChild API requires you
|
|
@@ -7920,7 +7916,6 @@ static void ImGui::ErrorCheckBeginEndCompareStacksSize(ImGuiWindow* window, bool
|
|
IM_ASSERT(p == window->DC.StackSizesBackup + IM_ARRAYSIZE(window->DC.StackSizesBackup));
|
|
IM_ASSERT(p == window->DC.StackSizesBackup + IM_ARRAYSIZE(window->DC.StackSizesBackup));
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//-----------------------------------------------------------------------------
|
|
// [SECTION] SCROLLING
|
|
// [SECTION] SCROLLING
|
|
//-----------------------------------------------------------------------------
|
|
//-----------------------------------------------------------------------------
|
|
@@ -8585,7 +8580,6 @@ ImVec2 ImGui::FindBestWindowPosForPopup(ImGuiWindow* window)
|
|
return window->Pos;
|
|
return window->Pos;
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//-----------------------------------------------------------------------------
|
|
// [SECTION] KEYBOARD/GAMEPAD NAVIGATION
|
|
// [SECTION] KEYBOARD/GAMEPAD NAVIGATION
|
|
//-----------------------------------------------------------------------------
|
|
//-----------------------------------------------------------------------------
|
|
@@ -9703,7 +9697,6 @@ void ImGui::NavUpdateWindowingOverlay()
|
|
PopStyleVar();
|
|
PopStyleVar();
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//-----------------------------------------------------------------------------
|
|
// [SECTION] DRAG AND DROP
|
|
// [SECTION] DRAG AND DROP
|
|
//-----------------------------------------------------------------------------
|
|
//-----------------------------------------------------------------------------
|
|
@@ -10002,7 +9995,6 @@ void ImGui::EndDragDropTarget()
|
|
g.DragDropWithinSourceOrTarget = false;
|
|
g.DragDropWithinSourceOrTarget = false;
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//-----------------------------------------------------------------------------
|
|
// [SECTION] LOGGING/CAPTURING
|
|
// [SECTION] LOGGING/CAPTURING
|
|
//-----------------------------------------------------------------------------
|
|
//-----------------------------------------------------------------------------
|
|
@@ -10222,6 +10214,34 @@ void ImGui::LogButtons()
|
|
// [SECTION] SETTINGS
|
|
// [SECTION] SETTINGS
|
|
//-----------------------------------------------------------------------------
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
+// Called by NewFrame()
|
|
|
|
+void ImGui::UpdateSettings()
|
|
|
|
+{
|
|
|
|
+ // Load settings on first frame (if not explicitly loaded manually before)
|
|
|
|
+ ImGuiContext& g = *GImGui;
|
|
|
|
+ if (!g.SettingsLoaded)
|
|
|
|
+ {
|
|
|
|
+ IM_ASSERT(g.SettingsWindows.empty());
|
|
|
|
+ if (g.IO.IniFilename)
|
|
|
|
+ LoadIniSettingsFromDisk(g.IO.IniFilename);
|
|
|
|
+ g.SettingsLoaded = true;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Save settings (with a delay after the last modification, so we don't spam disk too much)
|
|
|
|
+ if (g.SettingsDirtyTimer > 0.0f)
|
|
|
|
+ {
|
|
|
|
+ g.SettingsDirtyTimer -= g.IO.DeltaTime;
|
|
|
|
+ if (g.SettingsDirtyTimer <= 0.0f)
|
|
|
|
+ {
|
|
|
|
+ if (g.IO.IniFilename != NULL)
|
|
|
|
+ SaveIniSettingsToDisk(g.IO.IniFilename);
|
|
|
|
+ else
|
|
|
|
+ g.IO.WantSaveIniSettings = true; // Let user know they can call SaveIniSettingsToMemory(). user will need to clear io.WantSaveIniSettings themselves.
|
|
|
|
+ g.SettingsDirtyTimer = 0.0f;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
void ImGui::MarkIniSettingsDirty()
|
|
void ImGui::MarkIniSettingsDirty()
|
|
{
|
|
{
|
|
ImGuiContext& g = *GImGui;
|
|
ImGuiContext& g = *GImGui;
|