65 lines
2.5 KiB
C#
65 lines
2.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Globalization;
|
|
using System.Linq;
|
|
using System.Windows.Data;
|
|
using ytLive.Services;
|
|
|
|
namespace ytLive.Models;
|
|
|
|
/// <summary>
|
|
/// 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.
|
|
/// </summary>
|
|
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 };
|
|
|
|
/// <summary>Maps each canonical scene name to its hotkey action.</summary>
|
|
public static readonly IReadOnlyDictionary<string, HotkeyId> SceneHotkeys = new Dictionary<string, HotkeyId>(StringComparer.OrdinalIgnoreCase)
|
|
{
|
|
[Starting] = HotkeyId.SceneStarting,
|
|
[Live] = HotkeyId.SceneLive,
|
|
[Brb] = HotkeyId.SceneBrb,
|
|
[Chat] = HotkeyId.SceneChat,
|
|
[Ending] = HotkeyId.SceneEnding,
|
|
};
|
|
|
|
private static readonly Dictionary<string, string> 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);
|
|
|
|
/// <summary>Every scene has a background layer.</summary>
|
|
public static bool HasBackground(string? name) => IsCanonical(name);
|
|
}
|