UI/TerraformPanel.razor
@using HC3.Terraforming
@using HC3.Terrain
@using Sandbox;
@using Sandbox.UI;
@inherits BaseCanvas
@namespace HC3

<root class="slim">
	<div class="canvas">
		<row>
			@foreach ( var mode in Terraformer?.AllModes ?? Enumerable.Empty<TerraformMode>() )
			{
				<button
					onclick=@( () => SelectMode( mode ) )
					class="@(Terraformer?.CurrentMode == mode ? "selected" : "")"
					tooltip="@mode.Description">
					<icon>
						@mode.Icon
					</icon>

					@mode.Title
				</button>
			}
		</row>
		<row>
			@if ( Palette?.Materials is { } materials )
			{
				for ( var index = 0; index < materials.Count; ++index )
				{
					var indexCopy = index;
					var material = materials[index];

					<button onclick=@( () => SelectMaterial( indexCopy ) )
						class="material @(Terraformer?.MaterialIndex == indexCopy ? "selected" : "")"
						tooltip="@material.Name"
						style="background-color: @( material.Color.Hex )">

					</button>
				}
			}
		</row>
	</div>
</root>

@code
{
	public Terraformer Terraformer => Terraformer.Instance;
	public TerrainPalette Palette => Scene.Get<TerrainMesh>()?.Palette;

	void SelectMode(TerraformMode mode)
	{
		if (Terraformer is not { IsValid: true } terraformer) return;

		if (terraformer.CurrentMode == mode)
		{
			terraformer.CurrentMode = null;
			CloseCanvas( "TerraformCanvas" );
			return;
		}

		terraformer.CurrentMode = mode;
	}

	void SelectMaterial( int index )
	{
		if (Terraformer is not { IsValid: true } terraformer) return;

		if ( terraformer.MaterialIndex == index )
		{
			terraformer.MaterialIndex = null;
		}
		else
		{
			terraformer.MaterialIndex = index;
		}
	}

	protected override int BuildHash() => System.HashCode.Combine(base.BuildHash(), Terraformer?.CurrentMode, Terraformer?.MaterialIndex);

	protected override void OnTreeFirstBuilt()
	{
		base.OnTreeFirstBuilt();

		RegisterAs( "TerraformCanvas" );
	}

	protected override void OnOpen()
	{
		Terraformer.Activate();
	}

	protected override void OnClose()
	{
		Terraformer.Deactivate();
	}
}