feat(settings): wire ColorPicker sections for all 21 slots

This commit is contained in:
2026-05-26 17:33:11 +02:00
parent 21689655da
commit eed919e961
@@ -88,13 +88,167 @@ internal sealed class ColorPicker
ImGui.TextUnformatted($"Editing: {buffer.Name}"); ImGui.TextUnformatted($"Editing: {buffer.Name}");
ImGui.Separator(); ImGui.Separator();
// Sections land in Step 2; placeholder keeps the skeleton compiling. DrawSection(
ImGui.TextDisabled("(sections land in next sub-step)"); "Surfaces",
buffer,
c =>
new[]
{
("WindowBg", c.WindowBg),
("ChildBg", c.ChildBg),
("FrameBg", c.FrameBg),
("Surface", c.Surface),
("SurfaceHover", c.SurfaceHover),
},
(c, edits) =>
c with
{
WindowBg = edits[0].color,
ChildBg = edits[1].color,
FrameBg = edits[2].color,
Surface = edits[3].color,
SurfaceHover = edits[4].color,
}
);
DrawSection(
"Borders",
buffer,
c => new[] { ("Border", c.Border) },
(c, edits) => c with { Border = edits[0].color }
);
DrawSection(
"Text",
buffer,
c =>
new[]
{
("TextPrimary", c.TextPrimary),
("TextMuted", c.TextMuted),
("TextDim", c.TextDim),
},
(c, edits) =>
c with
{
TextPrimary = edits[0].color,
TextMuted = edits[1].color,
TextDim = edits[2].color,
}
);
DrawSection(
"Brand — Primary",
buffer,
c =>
new[]
{
("PrimaryDark", c.PrimaryDark),
("Primary", c.Primary),
("PrimaryLight", c.PrimaryLight),
("PrimaryGlow", c.PrimaryGlow),
},
(c, edits) =>
c with
{
PrimaryDark = edits[0].color,
Primary = edits[1].color,
PrimaryLight = edits[2].color,
PrimaryGlow = edits[3].color,
}
);
DrawSection(
"Brand — Accent",
buffer,
c =>
new[]
{
("AccentDark", c.AccentDark),
("Accent", c.Accent),
("AccentLight", c.AccentLight),
},
(c, edits) =>
c with
{
AccentDark = edits[0].color,
Accent = edits[1].color,
AccentLight = edits[2].color,
}
);
DrawSection(
"Identity",
buffer,
c => new[] { ("Identity", c.Identity) },
(c, edits) => c with { Identity = edits[0].color }
);
DrawSection(
"Status",
buffer,
c =>
new[]
{
("StatusSuccess", c.StatusSuccess),
("StatusDanger", c.StatusDanger),
("StatusWarning", c.StatusWarning),
("StatusInfo", c.StatusInfo),
},
(c, edits) =>
c with
{
StatusSuccess = edits[0].color,
StatusDanger = edits[1].color,
StatusWarning = edits[2].color,
StatusInfo = edits[3].color,
}
);
ImGui.Separator(); ImGui.Separator();
DrawActionButtons(buffer); DrawActionButtons(buffer);
} }
private void DrawSection(
string title,
Theme buffer,
Func<ThemeColors, (string label, uint color)[]> slots,
Func<ThemeColors, (string label, uint color)[], ThemeColors> writeBack
)
{
if (!ImGui.CollapsingHeader(title, ImGuiTreeNodeFlags.DefaultOpen))
{
return;
}
var current = slots(buffer.Colors);
var changed = false;
var working = current.ToArray();
for (var i = 0; i < working.Length; i++)
{
var (label, color) = working[i];
var rgba = ColourUtil.RgbaToVector4(color);
if (
ImGui.ColorEdit4(
$"{label}##slot-{title}-{i}",
ref rgba,
ImGuiColorEditFlags.AlphaBar | ImGuiColorEditFlags.AlphaPreviewHalf
)
)
{
working[i] = (label, ColourUtil.Vector4ToRgba(rgba));
changed = true;
}
}
if (changed)
{
var mutated = writeBack(buffer.Colors, working);
_themes.UpdateEditingBuffer(mutated);
}
}
private void DrawActionButtons(Theme buffer) private void DrawActionButtons(Theme buffer)
{ {
if (ImGui.Button("Save")) if (ImGui.Button("Save"))