146 lines
6.5 KiB
Plaintext
146 lines
6.5 KiB
Plaintext
@namespace DeepDrftPublic.Client.Controls
|
|
@using DeepDrftPublic.Client.Services
|
|
@inject MixVisualizerControlState ControlState
|
|
|
|
@* The Mix visualizer controls (lava reframe Wave R4). SEVEN continuous RadialKnobs — scroll speed,
|
|
gradient rotation speed, lava gravity, lava heat, blob density, collision strength, waveform width —
|
|
each its own dedicated control with a Material-icon caption (no more R2 temp-remapping: no knob
|
|
caption misrepresents its function). The bar lives INLINE in the mix-detail controls area and
|
|
ANIMATES open/closed in place via CSS transition off the @Expanded flag — it reads as the controls
|
|
collapsing/expanding, NOT a floating popover/drawer (§7b).
|
|
|
|
It owns NO JS interop: it mutates the shared, session-scoped MixVisualizerControlState and raises its
|
|
Changed event. The backdrop bridge (MixWaveformVisualizer) subscribes to that event and pushes the
|
|
affected dial to the WebGL module. That keeps the JS module handle single-owned by the bridge and
|
|
this component purely presentational. None of these is a seek surface (read-only contract §D).
|
|
|
|
RadialKnob has no icon slot (its Label renders as SVG text) and no aria attribute-capture, so each
|
|
control's Material icon rides beside its knob as an adjacent MudIcon caption and the accessible name
|
|
rides on the wrapping group div (§7d). HoldValue stays false so the knobs are live — ValueChanged
|
|
fires continuously during drag, preserving the Changed/NotifyChanged seam.
|
|
|
|
Aesthetic: the bar matches the session-hero NowPlaying overlay (§7e) — a translucent dark glass
|
|
surface with overlay-label captions and Color.Secondary accents, so it reads as of-a-piece with the
|
|
hero rather than a generic MudBlazor panel. *@
|
|
|
|
<div class="mix-visualizer-controls-bar @(Expanded ? "is-expanded" : "")" aria-hidden="@(!Expanded)">
|
|
|
|
<div class="mix-visualizer-control" role="group" aria-label="Waveform scroll speed">
|
|
<RadialKnob Value="@ControlState.ScrollSpeed"
|
|
ValueChanged="@OnScrollSpeedChanged"
|
|
Min="0" Max="1" Step="0.001"
|
|
Size="64"
|
|
Color="Color.Secondary" />
|
|
<MudIcon Icon="@Icons.Material.Filled.Speed" Size="Size.Small" Class="mix-visualizer-control-icon" />
|
|
</div>
|
|
|
|
<div class="mix-visualizer-control" role="group" aria-label="Color gradient rotation speed">
|
|
<RadialKnob Value="@ControlState.GradientRotationSpeed"
|
|
ValueChanged="@OnGradientRotationSpeedChanged"
|
|
Min="0" Max="1" Step="0.001"
|
|
Size="64"
|
|
Color="Color.Secondary" />
|
|
<MudIcon Icon="@Icons.Material.Filled.Palette" Size="Size.Small" Class="mix-visualizer-control-icon" />
|
|
</div>
|
|
|
|
<div class="mix-visualizer-control" role="group" aria-label="Lava gravity">
|
|
<RadialKnob Value="@ControlState.LavaGravity"
|
|
ValueChanged="@OnLavaGravityChanged"
|
|
Min="0" Max="1" Step="0.001"
|
|
Size="64"
|
|
Color="Color.Secondary" />
|
|
<MudIcon Icon="@Icons.Material.Filled.ArrowDownward" Size="Size.Small" Class="mix-visualizer-control-icon" />
|
|
</div>
|
|
|
|
<div class="mix-visualizer-control" role="group" aria-label="Lava heat">
|
|
<RadialKnob Value="@ControlState.LavaHeat"
|
|
ValueChanged="@OnLavaHeatChanged"
|
|
Min="0" Max="1" Step="0.001"
|
|
Size="64"
|
|
Color="Color.Secondary" />
|
|
<MudIcon Icon="@Icons.Material.Filled.LocalFireDepartment" Size="Size.Small" Class="mix-visualizer-control-icon" />
|
|
</div>
|
|
|
|
<div class="mix-visualizer-control" role="group" aria-label="Blob density and size">
|
|
<RadialKnob Value="@ControlState.BlobDensity"
|
|
ValueChanged="@OnBlobDensityChanged"
|
|
Min="0" Max="1" Step="0.001"
|
|
Size="64"
|
|
Color="Color.Secondary" />
|
|
<MudIcon Icon="@Icons.Material.Filled.BubbleChart" Size="Size.Small" Class="mix-visualizer-control-icon" />
|
|
</div>
|
|
|
|
<div class="mix-visualizer-control" role="group" aria-label="Collision strength">
|
|
<RadialKnob Value="@ControlState.CollisionStrength"
|
|
ValueChanged="@OnCollisionStrengthChanged"
|
|
Min="0" Max="1" Step="0.001"
|
|
Size="64"
|
|
Color="Color.Secondary" />
|
|
<MudIcon Icon="@Icons.Material.Filled.Compress" Size="Size.Small" Class="mix-visualizer-control-icon" />
|
|
</div>
|
|
|
|
<div class="mix-visualizer-control" role="group" aria-label="Waveform width">
|
|
<RadialKnob Value="@ControlState.WaveformWidth"
|
|
ValueChanged="@OnWaveformWidthChanged"
|
|
Min="0" Max="1" Step="0.001"
|
|
Size="64"
|
|
Color="Color.Secondary" />
|
|
<MudIcon Icon="@Icons.Material.Filled.SettingsEthernet" Size="Size.Small" Class="mix-visualizer-control-icon" />
|
|
</div>
|
|
|
|
</div>
|
|
|
|
@code {
|
|
/// <summary>
|
|
/// Whether the knob bar is expanded. Owned by the host page (the lava-lamp toggle button flips it);
|
|
/// drives the CSS open/close transition. When false the bar collapses to zero size in place.
|
|
/// </summary>
|
|
[Parameter] public bool Expanded { get; set; }
|
|
|
|
// Each handler mutates its own dedicated property then raises Changed — the bridge re-reads and
|
|
// pushes the affected dial. All values are already normalized [0,1]; the bridge maps scroll speed
|
|
// to a visible time-span and routes the rest straight to the lava/colour dials.
|
|
|
|
private void OnScrollSpeedChanged(double value)
|
|
{
|
|
ControlState.ScrollSpeed = value;
|
|
ControlState.NotifyChanged();
|
|
}
|
|
|
|
private void OnGradientRotationSpeedChanged(double value)
|
|
{
|
|
ControlState.GradientRotationSpeed = value;
|
|
ControlState.NotifyChanged();
|
|
}
|
|
|
|
private void OnLavaGravityChanged(double value)
|
|
{
|
|
ControlState.LavaGravity = value;
|
|
ControlState.NotifyChanged();
|
|
}
|
|
|
|
private void OnLavaHeatChanged(double value)
|
|
{
|
|
ControlState.LavaHeat = value;
|
|
ControlState.NotifyChanged();
|
|
}
|
|
|
|
private void OnBlobDensityChanged(double value)
|
|
{
|
|
ControlState.BlobDensity = value;
|
|
ControlState.NotifyChanged();
|
|
}
|
|
|
|
private void OnCollisionStrengthChanged(double value)
|
|
{
|
|
ControlState.CollisionStrength = value;
|
|
ControlState.NotifyChanged();
|
|
}
|
|
|
|
private void OnWaveformWidthChanged(double value)
|
|
{
|
|
ControlState.WaveformWidth = value;
|
|
ControlState.NotifyChanged();
|
|
}
|
|
}
|