refactor(settings): a pull-out drawer, with Zoom as a category — and the menu moves to the wordmark
Creator directive, 2026-11-01. Settings stopped being a centred modal. - **Drawer** (Controls/SettingsDrawer): hosted in PreviewPane's pull-out stack, 320px, the same animated-width pattern as Stream Settings / YPP / Socials / TEST, opened by the gear rail tab on a single left click. SettingsDrawerOpen is exclusive with the other four, both directions. This also removes the modal's MaxHeight-700 scroll problem for good: the drawer is the height of the preview. - **Categories**: headings with controls indented beneath them. Zoom now owns *Zoom view shape* (Circle / Phone / Tablet) and *Zoom box follows*; Recordings, Brand logo and Scene transition are their own categories. - **The app menu moved to the LlamaCasty wordmark** (right-click → Report Bug / Feature Request / About). Left-click still opens About. The gear tab no longer carries a menu at all, so clicking it does exactly one thing. OverlayHost keeps only the Bug / Feature / About panels; its brand-logo handlers and the dev-panel injection moved with the settings block. BrandLogoPreviewTests follows the control (same assertions, new path). Release 0 warnings; 15 tests pass across brand logo, zoom, entitlement and preview history.
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
namespace ytLive.ViewModels;
|
||||
|
||||
/// <summary>
|
||||
/// App Settings as a right-edge drawer (creator ruling 2026-11-01): the gear rail tab opens it
|
||||
/// immediately, in the same exclusive-slide pattern as Stream Settings / YPP / Socials / TEST.
|
||||
///
|
||||
/// <para>It is a separate flag from <see cref="IsSettingsOpen"/> because the overlay shell now
|
||||
/// only carries Report Bug / Feature Request / About — settings stopped being a modal.</para>
|
||||
/// </summary>
|
||||
public partial class MainViewModel
|
||||
{
|
||||
private bool _settingsDrawerOpen;
|
||||
|
||||
public bool SettingsDrawerOpen
|
||||
{
|
||||
get => _settingsDrawerOpen;
|
||||
private set => SetProperty(ref _settingsDrawerOpen, value);
|
||||
}
|
||||
|
||||
internal void ToggleSettingsDrawer()
|
||||
{
|
||||
if (_settingsDrawerOpen)
|
||||
{
|
||||
SettingsDrawerOpen = false;
|
||||
return;
|
||||
}
|
||||
|
||||
// One drawer at a time, like the rail's other tabs.
|
||||
BroadcastForm.IsDrawerOpen = false;
|
||||
Ypp.IsDrawerOpen = false;
|
||||
TestSession.IsDrawerOpen = false;
|
||||
if (SocialsDrawerOpen) CloseSocialsDrawer();
|
||||
|
||||
SettingsDrawerOpen = true;
|
||||
}
|
||||
|
||||
/// <summary>Called by the other drawers when they open, so settings yields to them.</summary>
|
||||
private void CloseSettingsDrawerIfOpen()
|
||||
{
|
||||
if (_settingsDrawerOpen) SettingsDrawerOpen = false;
|
||||
}
|
||||
}
|
||||
@@ -185,6 +185,7 @@ public partial class MainViewModel
|
||||
BroadcastForm.IsDrawerOpen = false;
|
||||
Ypp.IsDrawerOpen = false;
|
||||
TestSession.IsDrawerOpen = false;
|
||||
CloseSettingsDrawerIfOpen();
|
||||
SocialsDrawerOpen = true;
|
||||
OnPropertyChanged(nameof(SocialsDrawer));
|
||||
OnPropertyChanged(nameof(SocialsDrawerOpen));
|
||||
|
||||
@@ -39,6 +39,7 @@ public partial class MainViewModel
|
||||
Ypp.IsDrawerOpen = false;
|
||||
TestSession.IsDrawerOpen = false;
|
||||
CloseSocialsDrawer();
|
||||
CloseSettingsDrawerIfOpen();
|
||||
}
|
||||
};
|
||||
Ypp.PropertyChanged += (_, e) =>
|
||||
@@ -48,6 +49,7 @@ public partial class MainViewModel
|
||||
BroadcastForm.IsDrawerOpen = false;
|
||||
TestSession.IsDrawerOpen = false;
|
||||
CloseSocialsDrawer();
|
||||
CloseSettingsDrawerIfOpen();
|
||||
}
|
||||
};
|
||||
TestSession.PropertyChanged += (_, e) =>
|
||||
@@ -57,6 +59,7 @@ public partial class MainViewModel
|
||||
BroadcastForm.IsDrawerOpen = false;
|
||||
Ypp.IsDrawerOpen = false;
|
||||
CloseSocialsDrawer();
|
||||
CloseSettingsDrawerIfOpen();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -232,7 +232,7 @@ public partial class MainViewModel : ViewModelBase
|
||||
ToggleMicMuteCommand = new RelayCommand(_ => ToggleMicMute());
|
||||
ToggleGameMuteCommand = new RelayCommand(_ => ToggleGameMute());
|
||||
OpenMicPickerCommand = new RelayCommand(_ => PickMicrophone());
|
||||
OpenSettingsCommand = new RelayCommand(_ => ShowOverlay(nameof(IsSettingsOpen), "App Settings"));
|
||||
OpenSettingsCommand = new RelayCommand(_ => ToggleSettingsDrawer());
|
||||
InitPreviewHistory();
|
||||
OpenBugCommand = new RelayCommand(_ => ShowOverlay(nameof(IsBugOpen), "Report Bug"));
|
||||
OpenFeatureCommand = new RelayCommand(_ => ShowOverlay(nameof(IsFeatureOpen), "Feature Request"));
|
||||
|
||||
Reference in New Issue
Block a user