65 lines
1.8 KiB
Plaintext
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;
|
|
}
|
|
}
|