diff --git a/src/Exo/Ui/Exo.Settings.Ui/EmbeddedMonitorImageSettingsControl.xaml b/src/Exo/Ui/Exo.Settings.Ui/EmbeddedMonitorImageSettingsControl.xaml index f26cdc2..218a881 100644 --- a/src/Exo/Ui/Exo.Settings.Ui/EmbeddedMonitorImageSettingsControl.xaml +++ b/src/Exo/Ui/Exo.Settings.Ui/EmbeddedMonitorImageSettingsControl.xaml @@ -45,7 +45,7 @@ - diff --git a/src/Exo/Ui/Exo.Settings.Ui/ViewModels/EmbeddedMonitorFeaturesViewModel.cs b/src/Exo/Ui/Exo.Settings.Ui/ViewModels/EmbeddedMonitorFeaturesViewModel.cs index 2adff1a..15d8eb4 100644 --- a/src/Exo/Ui/Exo.Settings.Ui/ViewModels/EmbeddedMonitorFeaturesViewModel.cs +++ b/src/Exo/Ui/Exo.Settings.Ui/ViewModels/EmbeddedMonitorFeaturesViewModel.cs @@ -286,7 +286,7 @@ protected override void Reset() break; } } - _currentGraphics?.Reset(); + (_currentGraphics as IResettable)?.Reset(); } internal void UpdateConfiguration(EmbeddedMonitorConfigurationUpdate configuration) @@ -330,7 +330,7 @@ internal void UpdateConfiguration(EmbeddedMonitorConfigurationUpdate configurati } } -internal abstract class EmbeddedMonitorGraphicsViewModel : ChangeableBindableObject +internal abstract class EmbeddedMonitorGraphicsViewModel : ResettableBindableObject { private readonly EmbeddedMonitorViewModel _monitor; private readonly Guid _id; @@ -367,7 +367,7 @@ protected override void OnChanged(bool isChanged) internal abstract ValueTask ApplyAsync(CancellationToken cancellationToken); - internal virtual void Reset() { } + protected override void Reset() { } } internal sealed class EmbeddedMonitorBuiltInGraphicsViewModel : EmbeddedMonitorGraphicsViewModel @@ -440,24 +440,26 @@ public ImageViewModel? Image if (SetChangeableValue(ref _image, value, ChangedProperty.Image)) { // TODO: Improve this to initialize the crop rectangle to a better value automatically. - if (value is not null && !IsRegionValid(_cropRectangle)) + if (value is not null) { var imageSize = Monitor.ImageSize; if (imageSize.Width == imageSize.Height) { - var s = Math.Min(value.Width, value.Height); - CropRectangle = new() { Left = (value.Width - s) >>> 1, Top = (value.Height - s) >>> 1, Width = s, Height = s }; + var minDimension = Math.Min(value.Width, value.Height); + CropRectangle = new() { Left = (value.Width - minDimension) >>> 1, Top = (value.Height - minDimension) >>> 1, Width = minDimension, Height = minDimension }; + // Just to avoid the applicable change below that would be duplicated. This needs to go away. + return; } } - else - { - // Not ideal but good enough for now. - IApplicable.NotifyCanExecuteChanged(); - } + + // Not ideal but good enough for now. (Basically can fire if the applicable state stays false. We can do a check on IsValid later on.) + IApplicable.NotifyCanExecuteChanged(); } } } + private bool IsImageChanged => (_image?.Id).GetValueOrDefault() != _initialImageId; + public MonitorShape Shape => Monitor.Shape; public Size ImageSize => Monitor.ImageSize; @@ -549,7 +551,7 @@ internal void UpdateConfiguration(EmbeddedMonitorImageConfiguration configuratio OnChangeStateChange(wasChanged); } - internal override void Reset() + protected override void Reset() { if (!IsChanged) return; bool imageChanged = false;