turing-machine/Implementation/Client/Components/Controls.razor

65 lines
1.8 KiB
Plaintext

@implements IDisposable
@inject LocalizationService Loc
<div class="controls">
<button class="btn btn-primary" @onclick="OnStep" disabled="@IsRunning">@Loc["control.step"]</button>
<button class="btn btn-success" @onclick="ToggleRun">@(IsRunning ? Loc["control.pause"] : Loc["control.run"])</button>
<button class="btn btn-danger" @onclick="OnReset">@Loc["control.reset"]</button>
<div class="speed-control">
<label>@Loc["control.speed"]: @Speed</label>
<input type="range" min="50" max="1000" step="50" value="@Speed" @oninput="OnSpeedChange" />
</div>
</div>
<style>
.controls {
display: flex;
gap: 10px;
align-items: center;
justify-content: center;
margin: 20px 0;
}
.speed-control {
display: flex;
align-items: center;
gap: 5px;
}
</style>
@code {
[Parameter] public EventCallback OnStep { get; set; }
[Parameter] public EventCallback<bool> OnRunToggle { get; set; } // true = start, false = stop
[Parameter] public EventCallback OnReset { get; set; }
[Parameter] public bool IsRunning { get; set; }
[Parameter] public int Speed { get; set; } = 500;
[Parameter] public EventCallback<int> SpeedChanged { get; set; }
private async Task OnSpeedChange(ChangeEventArgs e)
{
if (int.TryParse(e.Value?.ToString(), out int value))
{
Speed = value;
await SpeedChanged.InvokeAsync(value);
}
}
private async Task ToggleRun()
{
await OnRunToggle.InvokeAsync(!IsRunning);
}
protected override void OnInitialized()
{
Loc.OnLanguageChanged += OnLanguageChanged;
}
private void OnLanguageChanged() => InvokeAsync(StateHasChanged);
public void Dispose()
{
Loc.OnLanguageChanged -= OnLanguageChanged;
}
}