diff --git a/docs/CHANGELOG.txt b/docs/CHANGELOG.txt index 80df2c16..b5d0c254 100644 --- a/docs/CHANGELOG.txt +++ b/docs/CHANGELOG.txt @@ -35,10 +35,12 @@ HOW TO UPDATE? Other Changes: - Nav, Scrolling: Added support for Home/End key. (#787) +- ColorEdit: Disable Hue edit when Saturation==0 instead of letting Hue values jump around. +- ColorEdit, ColorPicker: In HSV display of a RGB stored value, attempt to locally preserve Hue + when Saturation==0, which reduces accidentally lossy interactions. (#2722, 2770) [@rokups] - ColorPicker: Made rendering aware of global style alpha of the picker can be faded out. (#2711) Note that some elements won't accurately fade down with the same intensity, and the color wheel when enabled will have small overlap glitches with (style.Alpha < 1.0). -- ColorEdit: Disable Hue edit when Saturation==0 instead of letting Hue values jump around. - TabBar: fixed ScrollToBar request creating bouncing loop when tab is larger than available space. - TabBar: fixed single-tab not shrinking their width down. - TabBar: feed desired width (sum of unclipped tabs width) into layout system to allow for auto-resize. (#2768) diff --git a/imgui_internal.h b/imgui_internal.h index 8fc03a03..6dd68b56 100644 --- a/imgui_internal.h +++ b/imgui_internal.h @@ -1013,7 +1013,7 @@ struct ImGuiContext ImGuiID TempInputTextId; // Temporary text input when CTRL+clicking on a slider, etc. ImGuiColorEditFlags ColorEditOptions; // Store user options for color edit widgets float ColorEditLastHue; - float ColorEditLastActiveColor[3]; + float ColorEditLastColor[3]; ImVec4 ColorPickerRef; bool DragCurrentAccumDirty; float DragCurrentAccum; // Accumulator for dragging modification. Always high-precision, not rounded by end-user precision settings @@ -1158,6 +1158,8 @@ struct ImGuiContext LastValidMousePos = ImVec2(0.0f, 0.0f); TempInputTextId = 0; ColorEditOptions = ImGuiColorEditFlags__OptionsDefault; + ColorEditLastHue = 0.0f; + ColorEditLastColor[0] = ColorEditLastColor[1] = ColorEditLastColor[2] = FLT_MAX; DragCurrentAccumDirty = false; DragCurrentAccum = 0.0f; DragSpeedDefaultRatio = 1.0f / 100.0f; diff --git a/imgui_widgets.cpp b/imgui_widgets.cpp index 7466acff..042af866 100644 --- a/imgui_widgets.cpp +++ b/imgui_widgets.cpp @@ -4201,9 +4201,9 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag ColorConvertHSVtoRGB(f[0], f[1], f[2], f[0], f[1], f[2]); else if ((flags & ImGuiColorEditFlags_InputRGB) && (flags & ImGuiColorEditFlags_DisplayHSV)) { - ColorConvertRGBtoHSV(f[0], f[1], f[2], f[0], f[1], f[2]); // Hue is lost when converting from greyscale rgb (saturation=0). Restore it. - if (f[1] == 0 && memcmp(g.ColorEditLastActiveColor, col, sizeof(float) * 3) == 0) + ColorConvertRGBtoHSV(f[0], f[1], f[2], f[0], f[1], f[2]); + if (f[1] == 0 && memcmp(g.ColorEditLastColor, col, sizeof(float) * 3) == 0) f[0] = g.ColorEditLastHue; } int i[4] = { IM_F32_TO_INT8_UNBOUND(f[0]), IM_F32_TO_INT8_UNBOUND(f[1]), IM_F32_TO_INT8_UNBOUND(f[2]), IM_F32_TO_INT8_UNBOUND(f[3]) }; @@ -4335,7 +4335,7 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag { g.ColorEditLastHue = f[0]; ColorConvertHSVtoRGB(f[0], f[1], f[2], f[0], f[1], f[2]); - memcpy(g.ColorEditLastActiveColor, f, sizeof(float) * 3); + memcpy(g.ColorEditLastColor, f, sizeof(float) * 3); } if ((flags & ImGuiColorEditFlags_DisplayRGB) && (flags & ImGuiColorEditFlags_InputHSV)) ColorConvertRGBtoHSV(f[0], f[1], f[2], f[0], f[1], f[2]); @@ -4514,13 +4514,15 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl float R = col[0], G = col[1], B = col[2]; if (flags & ImGuiColorEditFlags_InputRGB) { - ColorConvertRGBtoHSV(R, G, B, H, S, V); // Hue is lost when converting from greyscale rgb (saturation=0). Restore it. - if (S == 0 && memcmp(g.ColorEditLastActiveColor, col, sizeof(float) * 3) == 0) + ColorConvertRGBtoHSV(R, G, B, H, S, V); + if (S == 0 && memcmp(g.ColorEditLastColor, col, sizeof(float) * 3) == 0) H = g.ColorEditLastHue; } else if (flags & ImGuiColorEditFlags_InputHSV) + { ColorConvertHSVtoRGB(H, S, V, R, G, B); + } bool value_changed = false, value_changed_h = false, value_changed_sv = false; @@ -4643,7 +4645,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl { ColorConvertHSVtoRGB(H >= 1.0f ? H - 10 * 1e-6f : H, S > 0.0f ? S : 10*1e-6f, V > 0.0f ? V : 1e-6f, col[0], col[1], col[2]); g.ColorEditLastHue = H; - memcpy(g.ColorEditLastActiveColor, col, sizeof(float) * 3); + memcpy(g.ColorEditLastColor, col, sizeof(float) * 3); } else if (flags & ImGuiColorEditFlags_InputHSV) { @@ -4696,9 +4698,9 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl R = col[0]; G = col[1]; B = col[2]; - float preserve_hue = H; ColorConvertRGBtoHSV(R, G, B, H, S, V); - H = preserve_hue; // Avoids picker losing hue value for 1 frame glitch. + if (S == 0 && memcmp(g.ColorEditLastColor, col, sizeof(float) * 3) == 0) // Fix local Hue as display below will use it immediately. + H = g.ColorEditLastHue; } else if (flags & ImGuiColorEditFlags_InputHSV) {