using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Windows.Data; using ytLive.Services; namespace ytLive.Models; /// /// The app's five canonical scenes. Scenes are worked on by name; you can delete /// them ("work with less"), but the app only ever adds back one of these five — /// anything beyond them is OBS territory. The live desktop/game background exists /// only in the Live scene. /// public static class SceneCatalog { public const string Starting = "Starting"; public const string Live = "Live"; public const string Brb = "BRB"; public const string Chat = "Chat"; public const string Ending = "Ending"; public static readonly string[] All = { Starting, Live, Brb, Chat, Ending }; /// Maps each canonical scene name to its hotkey action. public static readonly IReadOnlyDictionary SceneHotkeys = new Dictionary(StringComparer.OrdinalIgnoreCase) { [Starting] = HotkeyId.SceneStarting, [Live] = HotkeyId.SceneLive, [Brb] = HotkeyId.SceneBrb, [Chat] = HotkeyId.SceneChat, [Ending] = HotkeyId.SceneEnding, }; private static readonly Dictionary DisplayNames = new(StringComparer.OrdinalIgnoreCase) { }; public static string DisplayName(string? name) => name != null && DisplayNames.TryGetValue(name.Trim(), out var display) ? display : name ?? string.Empty; public static readonly IValueConverter DisplayNameConverter = new SceneDisplayNameConverter(); private sealed class SceneDisplayNameConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) => DisplayName(value as string); public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => value ?? string.Empty; } public static bool IsCanonical(string? name) => name != null && All.Contains(name.Trim(), StringComparer.OrdinalIgnoreCase); public static bool Is(string? name, string canonical) => name != null && string.Equals(name.Trim(), canonical, StringComparison.OrdinalIgnoreCase); public static bool IsChat(string? name) => Is(name, Chat); /// Every scene has a background layer. public static bool HasBackground(string? name) => IsCanonical(name); }