UI/Inspector/ColorPicker.razor
@using Sandbox
@using Sandbox.UI
@using System
@namespace HC3.UI
@inherits Window

<root class="color-picker-ui">
	<div class="color-picker-type">
		<button class="@(CustomPicker? "" : "selected" )" onclick=@(() => CustomPicker = false)><i>palette</i></button>
		<button class="@(CustomPicker? "selected" : "" )" onclick=@(() => CustomPicker = true)><i>gradient</i></button>
	</div>
	@if (!CustomPicker)
	{
		<div class="color-palette">
			<div class="palette-container">
				@foreach (var color in TycoonColor.PaletteColors)
				{
					<div class="color-swatch @(SelectedColor.Hex == color.Hex ? "selected" : "")" style=@($"background-color: {color.Hex}") onclick=@(() => SetColor(color))></div>
				}
			</div>
		</div>
	}
	else
	{
	<div class="slider-row">
		<label>R</label>
		<SliderControl Min=@(0) Max=@(255) Step=@(1) Value:bind="@Red" />
		<span>@((int)Red)</span>
	</div>
	<div class="slider-row">
		<label>G</label>
		<SliderControl Min=@(0) Max=@(255) Step=@(1) Value:bind="@Green" />
		<span>@((int)Green)</span>
	</div>
	<div class="slider-row">
		<label>B</label>
		<SliderControl Min=@(0) Max=@(255) Step=@(1) Value:bind="@Blue" />
		<span>@((int)Blue)</span>
	</div>
	<div class="preview">
		<div class="preview-box" style=@($"background-color: {SelectedColor.Hex}")></div>
		<TextEntry @ref=field Value=@("#" + SelectedColor.Hex.ToString()) onsubmit="@HexToSelectedColor"/>
	</div>
	}
</root>

@code {
	bool CustomPicker = false;

	public Action<Color> OnSubmit;
	public override string Icon => "palette";

	private float Red = 255f;
	private float Green = 255f;
	private float Blue = 255f;

	public Color SelectedColor => new Color(Red / 255f, Green / 255f, Blue / 255f);

	private TextEntry field;

	public ColorPicker(Color initial, Action<Color> onSubmit)
	{
		SetTitle( "Color Picker" );
		OnSubmit = onSubmit;

		Red = initial.r * 255f;
		Green = initial.g * 255f;
		Blue = initial.b * 255f;
	}

	public void SetColor(Color color)
	{
		Red = color.r * 255f;
		Green = color.g * 255f;
		Blue = color.b * 255f;
	}

	void HexToSelectedColor()
	{
		if (field.IsValid())
		{
			try
			{
				var parsed = Color.Parse("#"+field.Text);
				SetColor(parsed.Value);
			}
			catch (Exception ex)
			{
				Log.Warning($"Invalid hex: {field.Text} - {ex.Message}");
			}
		}
	}

	public override void Tick()
	{
		base.Tick();
		var color = SelectedColor;
		OnSubmit?.Invoke( color );
	}

	protected override int BuildHash() => System.HashCode.Combine(Red, Green, Blue);
}