Files
spotify-honorific/SpotifyHonorific/Utils/ImGuiHelper.cs
2025-06-07 02:03:54 +03:00

99 lines
3.7 KiB
C#

using Dalamud.Interface.Utility;
using ImGuiNET;
using System.Numerics;
namespace SpotifyHonorific.Utils;
public class ImGuiHelper
{
// Source: https://github.com/Caraxi/Honorific/blob/1.4.1.0/ConfigWindow.cs#L826
private Vector3 editingColour = Vector3.One;
public bool DrawColorPicker(string label, ref Vector3? color, Vector2 checkboxSize)
{
var modified = false;
bool comboOpen;
ImGui.SetNextItemWidth(checkboxSize.X * 2);
if (color == null)
{
ImGui.PushStyleColor(ImGuiCol.FrameBg, 0xFFFFFFFF);
ImGui.PushStyleColor(ImGuiCol.FrameBgActive, 0xFFFFFFFF);
ImGui.PushStyleColor(ImGuiCol.FrameBgHovered, 0xFFFFFFFF);
var p = ImGui.GetCursorScreenPos();
var dl = ImGui.GetWindowDrawList();
comboOpen = ImGui.BeginCombo(label, " ", ImGuiComboFlags.HeightLargest);
dl.AddLine(p, p + new Vector2(checkboxSize.X), 0xFF0000FF, 3f * ImGuiHelpers.GlobalScale);
ImGui.PopStyleColor(3);
}
else
{
ImGui.PushStyleColor(ImGuiCol.FrameBg, new Vector4(color.Value, 1));
ImGui.PushStyleColor(ImGuiCol.FrameBgActive, new Vector4(color.Value, 1));
ImGui.PushStyleColor(ImGuiCol.FrameBgHovered, new Vector4(color.Value, 1));
comboOpen = ImGui.BeginCombo(label, " ", ImGuiComboFlags.HeightLargest);
ImGui.PopStyleColor(3);
}
if (comboOpen)
{
if (ImGui.IsWindowAppearing())
{
editingColour = color ?? Vector3.One;
}
if (ImGui.ColorButton($"##ColorPickClear", Vector4.One, ImGuiColorEditFlags.NoTooltip))
{
color = null;
modified = true;
ImGui.CloseCurrentPopup();
}
if (ImGui.IsItemHovered())
{
ImGui.SetTooltip("Clear selected colour");
ImGui.SetMouseCursor(ImGuiMouseCursor.Hand);
}
var dl = ImGui.GetWindowDrawList();
dl.AddLine(ImGui.GetItemRectMin(), ImGui.GetItemRectMax(), 0xFF0000FF, 3f * ImGuiHelpers.GlobalScale);
if (color != null)
{
ImGui.SameLine();
if (ImGui.ColorButton($"##ColorPick_old", new Vector4(color.Value, 1), ImGuiColorEditFlags.NoTooltip))
{
ImGui.CloseCurrentPopup();
}
if (ImGui.IsItemHovered())
{
ImGui.SetTooltip("Revert to previous selection");
ImGui.SetMouseCursor(ImGuiMouseCursor.Hand);
}
}
ImGui.SameLine();
if (ImGui.ColorButton("Confirm", new Vector4(editingColour, 1), ImGuiColorEditFlags.NoTooltip, new Vector2(ImGui.GetContentRegionAvail().X, ImGui.GetItemRectSize().Y)))
{
color = editingColour;
modified = true;
ImGui.CloseCurrentPopup();
}
var size = ImGui.GetItemRectSize();
if (ImGui.IsItemHovered())
{
dl.AddRectFilled(ImGui.GetItemRectMin(), ImGui.GetItemRectMax(), 0x33333333);
ImGui.SetMouseCursor(ImGuiMouseCursor.Hand);
}
var textSize = ImGui.CalcTextSize("Confirm");
dl.AddText(ImGui.GetItemRectMin() + size / 2 - textSize / 2, ImGui.ColorConvertFloat4ToU32(new Vector4(editingColour, 1)) ^ 0x00FFFFFF, "Confirm");
ImGui.ColorPicker3($"##ColorPick", ref editingColour, ImGuiColorEditFlags.NoSidePreview | ImGuiColorEditFlags.NoSmallPreview);
ImGui.EndCombo();
}
return modified;
}
}