From 2268b098e031a0a71fede76ed37c67b8185a931f Mon Sep 17 00:00:00 2001 From: ocornut Date: Sun, 4 Jan 2015 18:23:30 +0000 Subject: [PATCH] Avoid marking settings as dirty when window is marked unsaved + minor FocusWindow() optimisation --- imgui.cpp | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/imgui.cpp b/imgui.cpp index 6f5b1cb8b..362cb28ea 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -202,6 +202,7 @@ - widgets: checkbox/radio active on press, is that standard/correct ? - widgets: widget-label types of function calls don't play nicely with SameLine (github issue #100) because of how they intentionally not declare the label extent. separate extent for auto-size vs extent for cursor. - widgets: IsItemHovered() returns true even if mouse is active on another widget (e.g. dragging outside of sliders). Maybe not a sensible default? Add parameter or alternate function? + - widgets: activating widget doesn't move parent to front - main: make IsHovered() more consistent for various type of widgets, widgets with multiple components, etc. also effectively IsHovered() region sometimes differs from hot region, e.g tree nodes - main: make IsHovered() info stored in a stack? so that 'if TreeNode() { Text; TreePop; } if IsHovered' return the hover state of the TreeNode? - scrollbar: use relative mouse movement when first-clicking inside of scroll grab box. @@ -2361,7 +2362,7 @@ bool ImGui::Begin(const char* name, bool* p_opened, ImVec2 size, float fill_alph window->IDStack.resize(0); ImGui::PushID(window); - // Move window (at the beginning of the frame to avoid lag) + // Move window (at the beginning of the frame to avoid input lag or sheering) const ImGuiID move_id = window->GetID("#MOVE"); RegisterAliveId(move_id); if (g.ActiveId == move_id) @@ -2371,7 +2372,8 @@ bool ImGui::Begin(const char* name, bool* p_opened, ImVec2 size, float fill_alph if (!(window->Flags & ImGuiWindowFlags_NoMove)) { window->PosFloat += g.IO.MouseDelta; - MarkSettingsDirty(); + if (!(window->Flags & ImGuiWindowFlags_NoSavedSettings)) + MarkSettingsDirty(); } FocusWindow(window); } @@ -2434,7 +2436,8 @@ bool ImGui::Begin(const char* name, bool* p_opened, ImVec2 size, float fill_alph if (g.HoveredWindow == window && IsMouseHoveringBox(title_bar_aabb) && g.IO.MouseDoubleClicked[0]) { window->Collapsed = !window->Collapsed; - MarkSettingsDirty(); + if (!(window->Flags & ImGuiWindowFlags_NoSavedSettings)) + MarkSettingsDirty(); FocusWindow(window); } } @@ -2482,7 +2485,8 @@ bool ImGui::Begin(const char* name, bool* p_opened, ImVec2 size, float fill_alph window->SizeFull = ImMax(window->SizeFull, size_auto_fit); else window->SizeFull = size_auto_fit; - MarkSettingsDirty(); + if (!(window->Flags & ImGuiWindowFlags_NoSavedSettings)) + MarkSettingsDirty(); } else if (!(window->Flags & ImGuiWindowFlags_NoResize)) { @@ -2498,14 +2502,16 @@ bool ImGui::Begin(const char* name, bool* p_opened, ImVec2 size, float fill_alph // Manual auto-fit window->SizeFull = size_auto_fit; window->Size = window->SizeFull; - MarkSettingsDirty(); + if (!(window->Flags & ImGuiWindowFlags_NoSavedSettings)) + MarkSettingsDirty(); } else if (held) { // Resize window->SizeFull = ImMax(window->SizeFull + g.IO.MouseDelta, style.WindowMinSize); window->Size = window->SizeFull; - MarkSettingsDirty(); + if (!(window->Flags & ImGuiWindowFlags_NoSavedSettings)) + MarkSettingsDirty(); } } @@ -2709,12 +2715,15 @@ void ImGui::End() g.CurrentWindow = g.CurrentWindowStack.empty() ? NULL : g.CurrentWindowStack.back(); } -// Moving window to front +// Moving window to front of display (which happens to be back of our sorted list) static void FocusWindow(ImGuiWindow* window) { ImGuiState& g = GImGui; g.FocusedWindow = window; + if (g.Windows.back() == window) + return; + for (size_t i = 0; i < g.Windows.size(); i++) if (g.Windows[i] == window) {