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;
}