99 lines
2.9 KiB
C#
99 lines
2.9 KiB
C#
using System.Windows.Media;
|
|
using ytLive.Helpers;
|
|
|
|
namespace ytLive.Models;
|
|
|
|
/// <summary>
|
|
/// 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.
|
|
/// </summary>
|
|
public enum SourceType
|
|
{
|
|
DisplayCapture,
|
|
WindowCapture,
|
|
Background,
|
|
Image,
|
|
TextOverlay,
|
|
Chatbox,
|
|
Alerts,
|
|
Socials
|
|
}
|
|
|
|
public enum ClipShape
|
|
{
|
|
Traditional,
|
|
Round
|
|
}
|
|
|
|
/// <summary>
|
|
/// 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 cref="WebcamSceneConfig"/>. See the singleton-vs-multi-instance
|
|
/// discriminator in ai.md.
|
|
/// </summary>
|
|
public class Source : SceneElement
|
|
{
|
|
private SourceType _type;
|
|
public SourceType Type
|
|
{
|
|
get => _type;
|
|
set
|
|
{
|
|
if (Set(ref _type, value))
|
|
{
|
|
Raise(nameof(IsLiveCapture));
|
|
Raise(nameof(DisplaySource));
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>The permanent scene backdrop (live desktop/game capture). Never removable/reorderable.</summary>
|
|
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); }
|
|
|
|
/// <summary>
|
|
/// Identifies what this live-capture source points at: "monitor:<index>" or
|
|
/// "window:<hwnd>". Persisted so a re-designated backdrop survives a reload.
|
|
/// </summary>
|
|
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;
|
|
}
|