using Avalonia; using Avalonia.Controls; using Avalonia.Layout; using Avalonia.Markup.Xaml; using Mesen.Config; using Mesen.Debugger.ViewModels; using Mesen.Utilities; using ReactiveUI; using System; using System.Reactive.Linq; namespace Mesen.Debugger.Controls { public class SpritePreviewPanel : MesenUserControl { public static readonly StyledProperty InnerHeightProperty = AvaloniaProperty.Register(nameof(InnerHeight), 0); public static readonly StyledProperty InnerWidthProperty = AvaloniaProperty.Register(nameof(InnerWidth), 0); public static readonly StyledProperty FadePreviewProperty = AvaloniaProperty.Register(nameof(FadePreview), false); public static readonly StyledProperty BorderSizeProperty = AvaloniaProperty.Register(nameof(BorderSize), default); public bool FadePreview { get { return GetValue(FadePreviewProperty); } set { SetValue(FadePreviewProperty, value); } } public double InnerHeight { get { return GetValue(InnerHeightProperty); } set { SetValue(InnerHeightProperty, value); } } public double InnerWidth { get { return GetValue(InnerWidthProperty); } set { SetValue(InnerWidthProperty, value); } } public Thickness BorderSize { get { return GetValue(BorderSizeProperty); } set { SetValue(BorderSizeProperty, value); } } public SpritePreviewModel Model { get; private init; } public SpriteViewerConfig Config { get; private init; } [Obsolete("For designer only")] public SpritePreviewPanel() : this(new(), new()) { } public SpritePreviewPanel(SpritePreviewModel model, SpriteViewerConfig config) { InitializeComponent(); Model = model; Config = config; AddDisposable(this.WhenAnyValue(x => x.Model.FadePreview, x => x.Config.DimOffscreenSprites).Subscribe(x => { FadePreview = Model.FadePreview == true && Config.DimOffscreenSprites == true; })); } protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) { base.OnAttachedToVisualTree(e); BorderSize = new Thickness(1 / LayoutHelper.GetLayoutScale(this)); } private void InitializeComponent() { AvaloniaXamlLoader.Load(this); } } }