feat(audio dock): the shell — 168px, auto-collapsing, replacing the empty bottom bar
Unit 4 of the sound-bar refactor. `Controls/AudioDock` takes the bottom row that held the empty `BottomBar` spacer (deleted): four bay containers (MIC / GAME / TRAX / LIP-SYNC) above a 36px master strip, all token-styled. Height comes from `Models/AudioDockLayout`, not from a setting: 168px normally, 36px below a 900px window height. At the 1366×768 minimum a full dock leaves ~398px for the preview, so the collapse is mandatory, not cosmetic. The dock listens to its window's SizeChanged and re-applies. Nothing here pretends to be a meter yet — the bays and the master readouts fill in over the next units, each with its own test. Guard: AudioDockLayoutTests pins both sides of the threshold (768 collapsed, 1040 expanded), the boundary itself, and the two heights as the design's numbers.
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using ytLive.Models;
|
||||
|
||||
namespace ytLive.Controls;
|
||||
|
||||
/// <summary>The sound bars (creator ruling 2026-10-30). This unit owns the SHELL: the piece of the
|
||||
/// window it occupies and the collapse behaviour. The bays and the master readouts fill in over
|
||||
/// the following units, so nothing here pretends to be a working meter.
|
||||
///
|
||||
/// <para>Collapse is driven by the window height, not a user setting: at 1366×768 a full dock
|
||||
/// squeezes the preview, and the creator should not have to manage that.</para></summary>
|
||||
public partial class AudioDock : UserControl
|
||||
{
|
||||
private Window? _window;
|
||||
|
||||
public AudioDock()
|
||||
{
|
||||
InitializeComponent();
|
||||
Loaded += OnLoaded;
|
||||
Unloaded += OnUnloaded;
|
||||
}
|
||||
|
||||
/// <summary>Is the dock showing only the telemetry strip?</summary>
|
||||
internal bool IsCollapsed { get; private set; }
|
||||
|
||||
/// <summary>Test seam: the same code the window's SizeChanged runs, without a window.</summary>
|
||||
internal void ApplyWindowHeight(double windowHeight)
|
||||
{
|
||||
var collapsed = AudioDockLayout.IsCollapsed(windowHeight);
|
||||
IsCollapsed = collapsed;
|
||||
Height = AudioDockLayout.HeightFor(windowHeight);
|
||||
Bays.Visibility = collapsed ? Visibility.Collapsed : Visibility.Visible;
|
||||
}
|
||||
|
||||
private void OnLoaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
_window = Window.GetWindow(this);
|
||||
if (_window == null)
|
||||
{
|
||||
ApplyWindowHeight(AudioDockLayout.CollapseBelowHeight); // no host: show the dock
|
||||
return;
|
||||
}
|
||||
_window.SizeChanged += OnWindowSizeChanged;
|
||||
ApplyWindowHeight(_window.ActualHeight > 0 ? _window.ActualHeight : _window.Height);
|
||||
}
|
||||
|
||||
private void OnUnloaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (_window != null) _window.SizeChanged -= OnWindowSizeChanged;
|
||||
_window = null;
|
||||
}
|
||||
|
||||
private void OnWindowSizeChanged(object sender, SizeChangedEventArgs e) => ApplyWindowHeight(e.NewSize.Height);
|
||||
}
|
||||
Reference in New Issue
Block a user