UI/MainMenu.razor
@using System;
@using Sandbox;
@using Sandbox.UI;
@using System.Runtime.CompilerServices
@inherits PanelComponent
@namespace Sandbox

<root>
	<div class="header">
		<div class="title">Hit the Ball</div>
	</div>

	<div class="body">

		<div class="buttons">
			<div class="button play" onclick="@(() => OnPlay(true))">#menu.play</div>
			<div class="button settings" onclick="@(() => OnSettings(true))">#menu.settings</div>
			<div class="button quit" onclick="@(() => OnQuit())">#menu.quit</div>
		</div>

		<div class="panel_background @(playVisible ? "" : "hidden")">

			<div class="panel">
				<div class="games">
					<div class="button" onclick="@(() => Scene.LoadFromFile("scenes/Lobby.scene"))">
						<img class="icon" src="" alt="p42"/>
						<label class="name">#mode.twoplayers</label>
					</div>

					@* <div class="button">
						<img class="icon" src="" alt="p44"/>
						<label class="name">Pong for Four</label>
					</div> *@
				</div>
				

				<div class="button back" onclick="@(() => OnPlay(false))">#menu.back</div>
			</div>

		</div>
		
		<div class="panel_background @(settingsVisible ? "" : "hidden")">

			<div class="panel">
				<div class="option color">
					<label class="option name">#settings.color</label>
					<div class="button" onclick="@(() => TogglePalette())">
						<div class="color @GameSettings.Color"></div>
					</div>					
				</div>

				<div class="option sens">
					@* <div class="button reset" onclick="@(() => { ResetSens(1.0f); })">R</div> *@
					<label class="option name">#settings.sensitivity</label>
					<div class="adjuster">
						<div class="option adjust" onclick=@(() => SetSens("decrement", 0.1f, 0.1f))>&#60;</div>
						<div class="option value">@Sensitivity</div>
						<div class="option adjust" onclick=@(() => SetSens("increment", 0.1f, 0.1f))>&#62;</div>
					</div>
				</div>
				
				<div class="button back" onclick="@(() => OnSettings(false))">#menu.back</div>
			</div>

			<div class="palette @(paletteVisible ? "" : "hidden")">
				<div class="colors">
					<div class="color blue" onclick="@(() => PickColor("blue"))"></div>
					<div class="color green" onclick="@(() => PickColor("green"))"></div>
					<div class="color darkcyan" onclick="@(() => PickColor("darkcyan"))"></div>
					<div class="color red" onclick="@(() => PickColor("red"))"></div>
					<div class="color purple" onclick="@(() => PickColor("purple"))"></div>
					<div class="color saddlebrown" onclick="@(() => PickColor("saddlebrown"))"></div>
					<div class="color gray" onclick="@(() => PickColor("gray"))"></div>
					<div class="color lightblue" onclick="@(() => PickColor("lightblue"))"></div>
					<div class="color lightgreen" onclick="@(() => PickColor("lightgreen"))"></div>
					<div class="color cyan" onclick="@(() => PickColor("cyan"))"></div>
					<div class="color lightcoral" onclick="@(() => PickColor("lightcoral"))"></div>
					<div class="color violet" onclick="@(() => PickColor("violet"))"></div>
					<div class="color yellow" onclick="@(() => PickColor("yellow"))"></div>
					<div class="color white" onclick="@(() => PickColor("white"))"></div>
				</div>

				<div class="button back" onclick="@(() => TogglePalette())">#menu.back</div>
			</div>

		</div>

	</div>
</root>

@code
{
	float Sensitivity = GameSettings.Sensitivity;
	bool playVisible = false;
	bool settingsVisible = false;
	bool paletteVisible = false;

	void OnPlay(bool setVisible)
	{
		if (settingsVisible) return;
		playVisible = setVisible;
	}

	void OnSettings(bool setVisible)
	{
		if (playVisible) return;
		settingsVisible = setVisible;
	}

	void TogglePalette()
	{
		if (paletteVisible)
			paletteVisible = false;
		else 
			paletteVisible = true;
	}

	void SetSens(string operation, float min, float step)
	{
		if (operation == "increment")
		{
			Sensitivity = MathF.Round(Math.Max(min, Sensitivity + step), 3);
			GameSettings.Sensitivity = Sensitivity;
		}
		else if (operation == "decrement")
		{
			Sensitivity = MathF.Round(Math.Max(min, Sensitivity - step), 3);
			GameSettings.Sensitivity = Sensitivity;
		}
	}

	void ResetSens(float value)
	{
		Sensitivity = value;
		GameSettings.Sensitivity = value;
	}

	void PickColor(string color)
	{
		GameSettings.Color = color;
		paletteVisible = false;
		Log.Info(GameSettings.Color);
	}

	void OnQuit()
	{
		Game.Close();
	}

	/// <summary>
	/// the hash determines if the system should be rebuilt. If it changes, it will be rebuilt
	/// </summary>
	protected override int BuildHash() => System.HashCode.Combine( settingsVisible, playVisible, paletteVisible );
}