feat(ui): add ColorSchemeRegistry with Classic/Pastel/Dark built-ins
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,165 @@
|
||||
using OpenNest.Properties;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
|
||||
namespace OpenNest
|
||||
{
|
||||
public static class ColorSchemeRegistry
|
||||
{
|
||||
private static readonly Dictionary<string, ColorScheme> builtIns =
|
||||
new(StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
["Classic"] = BuildClassic(),
|
||||
["Pastel"] = BuildPastel(),
|
||||
["Dark"] = BuildDark()
|
||||
};
|
||||
|
||||
public static IEnumerable<ColorScheme> AllSchemes =>
|
||||
builtIns.Values.Concat(LoadDiskSchemes());
|
||||
|
||||
public static ColorScheme Get(string name)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(name))
|
||||
return builtIns["Classic"];
|
||||
|
||||
var hit = AllSchemes.FirstOrDefault(
|
||||
s => string.Equals(s.Name, name, StringComparison.OrdinalIgnoreCase));
|
||||
return hit ?? builtIns["Classic"];
|
||||
}
|
||||
|
||||
public static void ApplyActiveFromSettings()
|
||||
{
|
||||
var name = Settings.Default.ActiveColorScheme;
|
||||
var scheme = Get(name);
|
||||
Apply(scheme);
|
||||
}
|
||||
|
||||
public static void Apply(ColorScheme scheme)
|
||||
{
|
||||
var d = ColorScheme.Default;
|
||||
d.Name = scheme.Name;
|
||||
d.BackgroundColor = scheme.BackgroundColor;
|
||||
d.LayoutOutlineColor = scheme.LayoutOutlineColor;
|
||||
d.LayoutFillColor = scheme.LayoutFillColor;
|
||||
d.BoundingBoxColor = scheme.BoundingBoxColor;
|
||||
d.RapidColor = scheme.RapidColor;
|
||||
d.OriginColor = scheme.OriginColor;
|
||||
d.EdgeSpacingColor = scheme.EdgeSpacingColor;
|
||||
d.PreviewPartColor = scheme.PreviewPartColor;
|
||||
d.PartColors = scheme.PartColors;
|
||||
|
||||
Drawing.PartColors = scheme.PartColors;
|
||||
}
|
||||
|
||||
private static IEnumerable<ColorScheme> LoadDiskSchemes()
|
||||
{
|
||||
var dir = Path.Combine(AppContext.BaseDirectory, "Schemes");
|
||||
if (!Directory.Exists(dir))
|
||||
yield break;
|
||||
|
||||
foreach (var path in Directory.GetFiles(dir, "*.json"))
|
||||
{
|
||||
ColorScheme scheme;
|
||||
try
|
||||
{
|
||||
scheme = ColorSchemeSerializer.Deserialize(File.ReadAllText(path));
|
||||
}
|
||||
catch
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (!builtIns.ContainsKey(scheme.Name))
|
||||
yield return scheme;
|
||||
}
|
||||
}
|
||||
|
||||
private static ColorScheme BuildClassic() => new ColorScheme
|
||||
{
|
||||
Name = "Classic",
|
||||
BackgroundColor = Color.DarkGray,
|
||||
LayoutOutlineColor = Color.Gray,
|
||||
LayoutFillColor = Color.WhiteSmoke,
|
||||
BoundingBoxColor = Color.FromArgb(128, 128, 255),
|
||||
RapidColor = Color.DodgerBlue,
|
||||
OriginColor = Color.Gray,
|
||||
EdgeSpacingColor = Color.FromArgb(180, 180, 180),
|
||||
PreviewPartColor = Color.FromArgb(255, 140, 0),
|
||||
PartColors = new[]
|
||||
{
|
||||
Color.FromArgb(205, 92, 92),
|
||||
Color.FromArgb(148, 103, 189),
|
||||
Color.FromArgb(75, 180, 175),
|
||||
Color.FromArgb(210, 190, 75),
|
||||
Color.FromArgb(190, 85, 175),
|
||||
Color.FromArgb(185, 115, 85),
|
||||
Color.FromArgb(120, 100, 190),
|
||||
Color.FromArgb(200, 100, 140),
|
||||
Color.FromArgb(80, 175, 155),
|
||||
Color.FromArgb(195, 160, 85),
|
||||
Color.FromArgb(175, 95, 160),
|
||||
Color.FromArgb(215, 130, 130),
|
||||
}
|
||||
};
|
||||
|
||||
private static ColorScheme BuildPastel() => new ColorScheme
|
||||
{
|
||||
Name = "Pastel",
|
||||
BackgroundColor = Color.FromArgb(70, 75, 85),
|
||||
LayoutOutlineColor = Color.FromArgb(180, 180, 190),
|
||||
LayoutFillColor = Color.FromArgb(245, 245, 248),
|
||||
BoundingBoxColor = Color.FromArgb(128, 128, 255),
|
||||
RapidColor = Color.DodgerBlue,
|
||||
OriginColor = Color.FromArgb(160, 160, 160),
|
||||
EdgeSpacingColor = Color.FromArgb(200, 200, 210),
|
||||
PreviewPartColor = Color.FromArgb(255, 140, 0),
|
||||
PartColors = new[]
|
||||
{
|
||||
Color.FromArgb(122, 179, 209), Color.FromArgb(254, 229, 174),
|
||||
Color.FromArgb(143, 177, 229), Color.FromArgb(167, 172, 227),
|
||||
Color.FromArgb(216, 249, 195), Color.FromArgb(209, 168, 216),
|
||||
Color.FromArgb(222, 157, 190), Color.FromArgb(176, 255, 240),
|
||||
Color.FromArgb(235, 205, 153), Color.FromArgb(177, 225, 180),
|
||||
Color.FromArgb(125, 202, 241), Color.FromArgb(187, 206, 151),
|
||||
Color.FromArgb(251, 175, 190), Color.FromArgb(129, 226, 227),
|
||||
Color.FromArgb(255, 253, 207), Color.FromArgb(235, 205, 255),
|
||||
Color.FromArgb(255, 197, 168), Color.FromArgb(116, 213, 234),
|
||||
Color.FromArgb(190, 169, 122), Color.FromArgb(213, 159, 135),
|
||||
Color.FromArgb(124, 184, 155), Color.FromArgb(255, 189, 214),
|
||||
Color.FromArgb(146, 222, 255), Color.FromArgb(177, 173, 125),
|
||||
Color.FromArgb(177, 166, 202), Color.FromArgb(197, 208, 255),
|
||||
Color.FromArgb(255, 209, 243), Color.FromArgb(210, 255, 237),
|
||||
Color.FromArgb(255, 237, 204), Color.FromArgb(167, 233, 255),
|
||||
Color.FromArgb(182, 220, 255), Color.FromArgb(159, 177, 142),
|
||||
Color.FromArgb(190, 248, 255), Color.FromArgb(187, 169, 136),
|
||||
Color.FromArgb(199, 162, 168), Color.FromArgb(250, 255, 239),
|
||||
Color.FromArgb(222, 233, 255), Color.FromArgb(255, 234, 225),
|
||||
Color.FromArgb(240, 249, 255), Color.FromArgb(152, 176, 176),
|
||||
}
|
||||
};
|
||||
|
||||
private static ColorScheme BuildDark() => new ColorScheme
|
||||
{
|
||||
Name = "Dark",
|
||||
BackgroundColor = Color.FromArgb(30, 30, 34),
|
||||
LayoutOutlineColor = Color.FromArgb(90, 90, 95),
|
||||
LayoutFillColor = Color.FromArgb(50, 50, 55),
|
||||
BoundingBoxColor = Color.FromArgb(100, 160, 220),
|
||||
RapidColor = Color.FromArgb(255, 200, 50),
|
||||
OriginColor = Color.FromArgb(120, 120, 130),
|
||||
EdgeSpacingColor = Color.FromArgb(90, 90, 100),
|
||||
PreviewPartColor = Color.FromArgb(255, 170, 60),
|
||||
PartColors = new[]
|
||||
{
|
||||
Color.FromArgb(220, 110, 110), Color.FromArgb(170, 130, 215),
|
||||
Color.FromArgb(90, 200, 195), Color.FromArgb(230, 210, 100),
|
||||
Color.FromArgb(215, 110, 200), Color.FromArgb(210, 140, 110),
|
||||
Color.FromArgb(140, 125, 215), Color.FromArgb(225, 125, 165),
|
||||
Color.FromArgb(100, 200, 180), Color.FromArgb(220, 185, 110),
|
||||
Color.FromArgb(200, 120, 185), Color.FromArgb(240, 155, 155),
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user