using System; using System.Collections.ObjectModel; using System.Linq; using System.Reactive; using System.Reactive.Disposables; using System.Threading.Tasks; using Artemis.Core; using Artemis.Core.DeviceProviders; using Artemis.Core.Services; using Artemis.UI.DryIoc.Factories; using Artemis.UI.Screens.Plugins; using Artemis.UI.Screens.Workshop.LayoutFinder; using Artemis.UI.Shared; using Artemis.UI.Shared.Providers; using Artemis.UI.Shared.Services; using DryIoc; using PropertyChanged.SourceGenerator; using ReactiveUI; namespace Artemis.UI.Screens.StartupWizard.Steps; public class SettingsStepViewModel : WizardStepViewModel { private readonly ISettingsService _settingsService; private readonly IWindowService _windowService; private readonly IAutoRunProvider? _autoRunProvider; private readonly IProtocolProvider? _protocolProvider; public SettingsStepViewModel(IContainer container, ISettingsService settingsService, IDeviceService deviceService, IWindowService windowService) { _settingsService = settingsService; _windowService = windowService; _autoRunProvider = container.Resolve(IfUnresolved.ReturnDefault); _protocolProvider = container.Resolve(IfUnresolved.ReturnDefault); Continue = ReactiveCommand.Create(() => Wizard.ChangeScreen()); GoBack = ReactiveCommand.Create(() => { if (deviceService.EnabledDevices.Count == 0) Wizard.ChangeScreen(); else Wizard.ChangeScreen(); }); this.WhenActivated(d => { UIAutoRun.SettingChanged += UIAutoRunOnSettingChanged; UIUseProtocol.SettingChanged += UIUseProtocolOnSettingChanged; UIAutoRunDelay.SettingChanged += UIAutoRunDelayOnSettingChanged; Disposable.Create(() => { UIAutoRun.SettingChanged -= UIAutoRunOnSettingChanged; UIUseProtocol.SettingChanged -= UIUseProtocolOnSettingChanged; UIAutoRunDelay.SettingChanged -= UIAutoRunDelayOnSettingChanged; _settingsService.SaveAllSettings(); }).DisposeWith(d); }); } public PluginSetting UIAutoRun => _settingsService.GetSetting("UI.AutoRun", false); public PluginSetting UIUseProtocol => _settingsService.GetSetting("UI.UseProtocol", true); public PluginSetting UIAutoRunDelay => _settingsService.GetSetting("UI.AutoRunDelay", 15); public PluginSetting UIShowOnStartup => _settingsService.GetSetting("UI.ShowOnStartup", true); public PluginSetting UICheckForUpdates => _settingsService.GetSetting("UI.Updating.AutoCheck", true); public PluginSetting UIAutoUpdate => _settingsService.GetSetting("UI.Updating.AutoInstall", true); public bool IsAutoRunSupported => _autoRunProvider != null; private async Task ApplyAutoRun() { if (_autoRunProvider == null) return; try { if (UIAutoRun.Value) await _autoRunProvider.EnableAutoRun(false, UIAutoRunDelay.Value); else await _autoRunProvider.DisableAutoRun(); } catch (Exception exception) { _windowService.ShowExceptionDialog("Failed to apply auto-run", exception); } } private void ApplyProtocolAssociation() { if (_protocolProvider == null) return; try { if (UIUseProtocol.Value) _protocolProvider.AssociateWithProtocol("artemis"); else _protocolProvider.DisassociateWithProtocol("artemis"); } catch (Exception exception) { _windowService.ShowExceptionDialog("Failed to apply protocol association", exception); } } private async void UIAutoRunOnSettingChanged(object? sender, EventArgs e) { await ApplyAutoRun(); } private void UIUseProtocolOnSettingChanged(object? sender, EventArgs e) { ApplyProtocolAssociation(); } private async void UIAutoRunDelayOnSettingChanged(object? sender, EventArgs e) { if (_autoRunProvider == null || !UIAutoRun.Value) return; try { await _autoRunProvider.EnableAutoRun(true, UIAutoRunDelay.Value); } catch (Exception exception) { _windowService.ShowExceptionDialog("Failed to apply auto-run", exception); } } }