diff --git a/Dalamud/Interface/Components/ComponentDemoWindow.cs b/Dalamud/Interface/Components/ComponentDemoWindow.cs index 6d5618bbd..e0d465c80 100644 --- a/Dalamud/Interface/Components/ComponentDemoWindow.cs +++ b/Dalamud/Interface/Components/ComponentDemoWindow.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Numerics; +using Dalamud.Interface.Colors; using Dalamud.Interface.Windowing; using ImGuiNET; @@ -13,6 +14,7 @@ namespace Dalamud.Interface.Components internal class ComponentDemoWindow : Window { private readonly List> componentDemos; + private Vector4 defaultColor = ImGuiColors.DalamudOrange; /// /// Initializes a new instance of the class. @@ -28,6 +30,7 @@ namespace Dalamud.Interface.Components Demo("HelpMarker", HelpMarkerDemo), Demo("IconButton", IconButtonDemo), Demo("TextWithLabel", TextWithLabelDemo), + Demo("ColorPickerWithPalette", this.ColorPickerWithPaletteDemo), }; } @@ -82,5 +85,12 @@ namespace Dalamud.Interface.Components { return new KeyValuePair(name, func); } + + private void ColorPickerWithPaletteDemo() + { + ImGui.Text("Click on the color button to use the picker."); + ImGui.SameLine(); + this.defaultColor = ImGuiComponents.ColorPickerWithPalette(1, "ColorPickerWithPalette Demo", this.defaultColor); + } } } diff --git a/Dalamud/Interface/Components/ImGuiComponents.ColorPickerWithPalette.cs b/Dalamud/Interface/Components/ImGuiComponents.ColorPickerWithPalette.cs new file mode 100644 index 000000000..447d0cf03 --- /dev/null +++ b/Dalamud/Interface/Components/ImGuiComponents.ColorPickerWithPalette.cs @@ -0,0 +1,70 @@ +using System.Numerics; + +using ImGuiNET; + +namespace Dalamud.Interface.Components +{ + /// + /// Class containing various methods providing ImGui components. + /// + public static partial class ImGuiComponents + { + /// + /// ColorPicker with palette. + /// + /// Id for the color picker. + /// The description of the color picker. + /// The current color. + /// Selected color. + public static Vector4 ColorPickerWithPalette(int id, string description, Vector4 originalColor) + { + const ImGuiColorEditFlags flags = ImGuiColorEditFlags.NoSidePreview | ImGuiColorEditFlags.NoSmallPreview; + return ColorPickerWithPalette(id, description, originalColor, flags); + } + + /// + /// ColorPicker with palette with color picker options. + /// + /// Id for the color picker. + /// The description of the color picker. + /// The current color. + /// Flags to customize color picker. + /// Selected color. + public static Vector4 ColorPickerWithPalette(int id, string description, Vector4 originalColor, ImGuiColorEditFlags flags) + { + var existingColor = originalColor; + var selectedColor = originalColor; + var colorPalette = ImGuiHelpers.DefaultColorPalette(36); + if (ImGui.ColorButton($"{description}###ColorPickerButton{id}", originalColor)) + { + ImGui.OpenPopup($"###ColorPickerPopup{id}"); + } + + if (ImGui.BeginPopup($"###ColorPickerPopup{id}")) + { + if (ImGui.ColorPicker4($"###ColorPicker{id}", ref existingColor, flags)) + { + selectedColor = existingColor; + } + + for (var i = 0; i < 4; i++) + { + ImGui.Spacing(); + for (var j = i * 9; j < (i * 9) + 9; j++) + { + if (ImGui.ColorButton($"###ColorPickerSwatch{id}{i}{j}", colorPalette[j])) + { + selectedColor = colorPalette[j]; + } + + ImGui.SameLine(); + } + } + + ImGui.EndPopup(); + } + + return selectedColor; + } + } +} diff --git a/Dalamud/Interface/ImGuiHelpers.cs b/Dalamud/Interface/ImGuiHelpers.cs index 03f5eabc8..022663074 100644 --- a/Dalamud/Interface/ImGuiHelpers.cs +++ b/Dalamud/Interface/ImGuiHelpers.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using System.Numerics; using ImGuiNET; @@ -57,6 +58,23 @@ namespace Dalamud.Interface string name, Vector2 position, ImGuiCond condition = ImGuiCond.None) => ImGui.SetWindowPos(position + MainViewport.Pos, condition); + /// + /// Creates default color palette for use with color pickers. + /// + /// The total number of swatches to use. + /// Default color palette. + public static List DefaultColorPalette(int swatchCount = 32) + { + var colorPalette = new List(); + for (var i = 0; i < swatchCount; i++) + { + ImGui.ColorConvertHSVtoRGB(i / 31.0f, 0.7f, 0.8f, out var r, out var g, out var b); + colorPalette.Add(new Vector4(r, g, b, 1.0f)); + } + + return colorPalette; + } + /// /// Get data needed for each new frame. ///