Scene/source builder with image overlays, reuse dialog, and SQLite layout persistence

This commit is contained in:
2026-08-04 17:12:32 -07:00
parent d6ae048583
commit 7dc8490d96
24 changed files with 2375 additions and 170 deletions
+52
View File
@@ -0,0 +1,52 @@
using System.Collections.ObjectModel;
using System.Windows.Input;
using System.Windows.Media;
using ytLive.Helpers;
namespace ytLive.ViewModels;
public class ReuseImageCandidate
{
public string SceneName { get; set; } = string.Empty;
public string SourceName { get; set; } = string.Empty;
public string AssetId { get; set; } = string.Empty;
public ImageSource? Thumbnail => ImageCache.Get(AssetId);
public string Header => $"{SourceName} · in {SceneName}";
}
public class ReuseImageViewModel : ViewModelBase
{
private ReuseImageCandidate? _selectedCandidate;
public ObservableCollection<ReuseImageCandidate> Candidates { get; }
public ReuseImageCandidate? SelectedCandidate
{
get => _selectedCandidate;
set
{
if (SetProperty(ref _selectedCandidate, value))
CommandManager.InvalidateRequerySuggested();
}
}
public ICommand UseSelectedCommand { get; }
public ICommand NewImageCommand { get; }
public ICommand CancelCommand { get; }
public event Action? ReuseRequested;
public event Action? NewImageRequested;
public event Action? CancelRequested;
public ReuseImageViewModel(IEnumerable<ReuseImageCandidate> candidates)
{
Candidates = new ObservableCollection<ReuseImageCandidate>(candidates);
if (Candidates.Count > 0)
_selectedCandidate = Candidates[0];
UseSelectedCommand = new RelayCommand(_ => ReuseRequested?.Invoke(), _ => SelectedCandidate != null);
NewImageCommand = new RelayCommand(_ => NewImageRequested?.Invoke());
CancelCommand = new RelayCommand(_ => CancelRequested?.Invoke());
}
}