particles/MainMenu/MainMenu.cs

108 lines
3.7 KiB
C#

using System.Globalization;
using Godot;
public class MainMenu : Control
{
// Nodes for menu items
private Main _main;
private Button _simulateButton;
private Button _toggleFullScreenButton;
private TextEdit _seedText;
private TextEdit _particleCountText;
private Button _randomizeButton;
private Label _zoomValue;
private HSlider _zoomSlider;
private Label _invalidLabel;
public override void _Ready()
{
// Init nodes
_main = GetTree().Root.GetNode<Main>("Main");
_simulateButton = GetNode("MenuButtons").GetNode<Button>("SimulateButton");
_toggleFullScreenButton = GetNode("MenuButtons").GetNode<Button>("ToggleFullscreenButton");
_seedText = GetNode("MenuButtons").GetNode("Inputs").GetNode("Seed").GetNode<TextEdit>("SeedText");
_particleCountText = GetNode("MenuButtons").GetNode("Inputs").GetNode("ParticleCount").GetNode<TextEdit>("ParticleCountText");
_randomizeButton = GetNode("MenuButtons").GetNode("Inputs").GetNode("Seed").GetNode<Button>("RandomizeButton");
_zoomValue = GetNode("MenuButtons").GetNode("Inputs").GetNode("Zoom").GetNode<Label>("ZoomValue");
_zoomSlider = GetNode("MenuButtons").GetNode("Inputs").GetNode("Zoom").GetNode<HSlider>("ZoomSlider");
_invalidLabel = GetNode<Label>("InvalidLabel");
// Connect signals
_simulateButton.Connect("pressed", this, nameof(_OnSimulatePressed));
_toggleFullScreenButton.Connect("pressed", this, nameof(_OnToggleFullscreenPressed));
_randomizeButton.Connect("pressed", this, nameof(_OnRandomizePressed));
_zoomSlider.Connect("value_changed", this, nameof(_OnZoomSliderChange));
// Random seed
GD.Randomize();
var randomSeed = Mathf.Abs((int)GD.Randi());
_main.Seed = randomSeed;
RefreshSeedText();
}
public void _OnZoomSliderChange(float value)
{
_zoomValue.Text = value.ToString(CultureInfo.InvariantCulture);
_main.Zoom = value;
}
public void RefreshSeedText()
{
_seedText.Text = _main.Seed.ToString();
}
public void _OnSimulatePressed()
{
// Start simulation with seed and number of particles
var particleCountCheck = int.TryParse(_particleCountText.Text, out var nParticles);
var seedCheck = int.TryParse(_seedText.Text, out var seed);
if (!particleCountCheck || !seedCheck)
{
ShowInvalid();
return;
}
_main.Zoom = (float)_zoomSlider.Value;
_main.Seed = seed;
_main.StartSimulation(nParticles);
}
public void _OnToggleFullscreenPressed()
{
OS.WindowFullscreen = !OS.WindowFullscreen;
}
public void _OnRandomizePressed()
{
var randomSeed = Mathf.Abs((int)GD.Randi());
_main.Seed = randomSeed;
RefreshSeedText();
}
public override void _Input(InputEvent @event)
{
// Quit only if menu is visible
if (Visible && @event.IsActionPressed("quit"))
{
GetTree().Quit();
}
}
private async void ShowInvalid()
{
GetNode<Tween>("InvalidTween").ResetAll();
GetNode<Timer>("InvalidTimer").Stop();
GetNode<Timer>("InvalidTimer").WaitTime = 3.0f;
_invalidLabel.Modulate = new Color(1, 1, 1, 1);
var invalidTimer = GetNode<Timer>("InvalidTimer");
invalidTimer.Start();
await ToSignal(invalidTimer, "timeout");
var invalidTween = GetNode<Tween>("InvalidTween");
invalidTween.InterpolateProperty(_invalidLabel, "modulate:a", 1, 0, 1);
invalidTween.Start();
await ToSignal(invalidTween, "tween_all_completed");
}
}