feat(scoreboard): scroll speed is a property (20-400 px/s, persisted)
The marquee now has the dial it needs. `ScoreboardPresenter.PixelsPerSecond` is the single owner of the range (20-400, default 120), the layer's properties expose it with a live px/s readout, and the value is persisted as Scoreboard.ScrollSpeed because it is a READABILITY choice — re-dialling it every launch would be a tax on the creator who needs the strip to be readable. Advance() still takes an optional override so tests can drive exact distances. Guard: the presenter test proves speed is real (same elapsed time, twice the speed, different window) — not a value that is stored and ignored — and the panel test pins the control, its range and the persistence key.
This commit is contained in:
@@ -43,6 +43,20 @@ public partial class MainViewModel
|
||||
}
|
||||
|
||||
public IReadOnlyList<BarEdge> ScoreboardEdgeOptions { get; } = new[] { BarEdge.Top, BarEdge.Bottom };
|
||||
|
||||
/// <summary>How fast the ticker travels, in pixels per second. Persisted like the rest of the
|
||||
/// strip's look: it is a readability choice, and re-dialling it every launch would be a tax.</summary>
|
||||
public double ScoreboardScrollSpeed
|
||||
{
|
||||
get => _scoreboardPresenter?.PixelsPerSecond ?? ScoreboardPresenter.DefaultPixelsPerSecond;
|
||||
set
|
||||
{
|
||||
var clamped = Math.Clamp(value, ScoreboardPresenter.MinPixelsPerSecond, ScoreboardPresenter.MaxPixelsPerSecond);
|
||||
if (_scoreboardPresenter != null) _scoreboardPresenter.PixelsPerSecond = clamped;
|
||||
_layoutStore.SaveScoreboardScrollSpeed((int)Math.Round(clamped));
|
||||
OnPropertyChanged(nameof(ScoreboardScrollSpeed));
|
||||
}
|
||||
}
|
||||
private Source? _scoreboardPreviewSource;
|
||||
|
||||
internal ScoreboardRecorder ScoreboardRecorder => _scoreboard;
|
||||
|
||||
Reference in New Issue
Block a user