using System.Windows.Media; using ytLive.Helpers; namespace ytLive.Models; /// /// The source catalog (see TASKS.md). Chatbox / Alerts / Socials are inert /// values until their features ship — the access-policy rows are live from /// today, the menu items arrive with the features. Countdown and Credits are /// NOT types: they're Text modes, gated by the same policy when Text ships. /// public enum SourceType { DisplayCapture, WindowCapture, Background, Image, TextOverlay, Chatbox, Alerts, Socials } public enum ClipShape { Traditional, Round } /// /// A multi-instance scene object: image/background/text (screen/window later). /// The webcam is NOT a Source — it's a singleton resource whose per-scene usage /// is a . See the singleton-vs-multi-instance /// discriminator in ai.md. /// public class Source : SceneElement { private SourceType _type; public SourceType Type { get => _type; set { if (Set(ref _type, value)) { Raise(nameof(IsLiveCapture)); Raise(nameof(DisplaySource)); } } } /// The permanent scene backdrop (live desktop/game capture). Never removable/reorderable. private bool _isBackdrop; public bool IsBackdrop { get => _isBackdrop; set => Set(ref _isBackdrop, value); } private bool _isEnabled = true; public bool IsEnabled { get => _isEnabled; set => Set(ref _isEnabled, value); } // Display/Window capture private int? _monitorIndex; public int? MonitorIndex { get => _monitorIndex; set => Set(ref _monitorIndex, value); } private IntPtr? _windowHandle; public IntPtr? WindowHandle { get => _windowHandle; set => Set(ref _windowHandle, value); } /// /// Identifies what this live-capture source points at: "monitor:<index>" or /// "window:<hwnd>". Persisted so a re-designated backdrop survives a reload. /// private string? _captureKey; public string? CaptureKey { get => _captureKey; set => Set(ref _captureKey, value); } public bool IsLiveCapture => Type is SourceType.DisplayCapture or SourceType.WindowCapture; // Image (asset stored in the layout database) private string? _assetId; private ImageSource? _imageSource; public string? AssetId { get => _assetId; set { if (Set(ref _assetId, value)) { _imageSource = ImageCache.Get(value ?? string.Empty); Raise(nameof(ImageSource)); Raise(nameof(DisplaySource)); } } } public ImageSource? ImageSource => _imageSource; public override ImageSource? DisplaySource => IsLiveCapture ? VideoImageSource : _imageSource; public override bool IsImageSource => Type == SourceType.Image; }