using Avalonia.Platform; using DesertPaintCodex.Models; using DesertPaintCodex.Services; using ReactiveUI; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Reactive; using Avalonia; using Avalonia.Controls.ApplicationLifetimes; using DesertPaintCodex.Util; namespace DesertPaintCodex.ViewModels { public class ScreenSettingsViewModel : ViewModelBase { public ObservableCollection Screens { get; } = new(); private int _pixeMultiplier; public int PixelMultiplier { get => _pixeMultiplier; private set => this.RaiseAndSetIfChanged(ref _pixeMultiplier, value); } private int _screenIndex; public int ScreenIndex { get => _screenIndex; private set => this.RaiseAndSetIfChanged(ref _screenIndex, value); } public ScreenSettingsViewModel() { if (Application.Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) { IScreenImpl screen = desktop.MainWindow.PlatformImpl.Screen; IReadOnlyList screens = screen.AllScreens; for (int i = 0; i < screens.Count; i++) { Screens.Add(new ScreenMetrics(screens[i].Bounds, screens[i].Primary)); } SettingsService.Get(SettingKey.PixelMultiplier, out _pixeMultiplier, Constants.DefaultPixelMultiplier); SettingsService.Get(SettingKey.ScreenIndex, out _screenIndex, 0); _screenIndex = System.Math.Min(_screenIndex, screens.Count - 1); // In case the user has fewer screens than last time. Save = ReactiveCommand.Create(() => { SettingsService.Set(SettingKey.PixelMultiplier, _pixeMultiplier); SettingsService.Set(SettingKey.ScreenIndex, _screenIndex); SettingsService.Set(SettingKey.ScreenX, screens[_screenIndex].Bounds.X); SettingsService.Set(SettingKey.ScreenY, screens[_screenIndex].Bounds.Y); SettingsService.Set(SettingKey.ScreenWidth, screens[_screenIndex].Bounds.Width); SettingsService.Set(SettingKey.ScreenHeight, screens[_screenIndex].Bounds.Height); SettingsService.Save(); ReactionScannerService.Instance.RefreshFromSettings(); }); } else { // Placeholder stuff. Screens.Add(new ScreenMetrics(new Avalonia.PixelRect(0, 0, 1920, 1080), true)); Screens.Add(new ScreenMetrics(new Avalonia.PixelRect(1920, 0, 1920, 1080), false)); PixelMultiplier = 1; ScreenIndex = 0; Save = ReactiveCommand.Create(() => { }); } } public ReactiveCommand Save { get; } } }