From c98fc51623aae3dac5883765a015926ebe0615d6 Mon Sep 17 00:00:00 2001 From: Robert Date: Thu, 3 Sep 2020 19:49:48 +0200 Subject: [PATCH] Device visualiser - (probably) Fixed a NaN crash General UI - Apply change in default render scale everywhere Plugin settings - Added restart later option when disabling device providers Plugin settings - Added support for disabling plugins that failed to load --- src/Artemis.Core/Services/PluginService.cs | 14 ++-- .../Services/Storage/SurfaceService.cs | 2 +- .../Controls/DeviceVisualizer.cs | 5 +- .../Services/Interfaces/IDialogService.cs | 3 + .../General/GeneralSettingsTabViewModel.cs | 6 +- .../Tabs/Plugins/PluginSettingsView.xaml | 10 +++ .../Tabs/Plugins/PluginSettingsViewModel.cs | 66 +++++++++++++++---- src/Artemis.UI/Services/LayerEditorService.cs | 4 +- 8 files changed, 84 insertions(+), 26 deletions(-) diff --git a/src/Artemis.Core/Services/PluginService.cs b/src/Artemis.Core/Services/PluginService.cs index a593a8fb3..0fd4e3574 100644 --- a/src/Artemis.Core/Services/PluginService.cs +++ b/src/Artemis.Core/Services/PluginService.cs @@ -281,6 +281,15 @@ namespace Artemis.Core.Services { try { + // A device provider may be queued for disable on next restart, this undoes that + if (plugin is DeviceProvider && plugin.Enabled && !plugin.PluginInfo.Enabled) + { + plugin.PluginInfo.Enabled = true; + plugin.PluginInfo.ApplyToEntity(); + _pluginRepository.SavePlugin(plugin.PluginInfo.PluginEntity); + return; + } + plugin.SetEnabled(true, isAutoEnable); } catch (Exception e) @@ -312,16 +321,13 @@ namespace Artemis.Core.Services { _logger.Debug("Disabling plugin {pluginInfo}", plugin.PluginInfo); - // Device providers cannot be disabled at runtime, restart the application + // Device providers cannot be disabled at runtime simply queue a disable for next restart if (plugin is DeviceProvider) { // Don't call SetEnabled(false) but simply update enabled state and save it plugin.PluginInfo.Enabled = false; plugin.PluginInfo.ApplyToEntity(); _pluginRepository.SavePlugin(plugin.PluginInfo.PluginEntity); - - _logger.Debug("Shutting down for device provider disable {pluginInfo}", plugin.PluginInfo); - ApplicationUtilities.Shutdown(2, true); return; } diff --git a/src/Artemis.Core/Services/Storage/SurfaceService.cs b/src/Artemis.Core/Services/Storage/SurfaceService.cs index fabee1a66..37529e595 100644 --- a/src/Artemis.Core/Services/Storage/SurfaceService.cs +++ b/src/Artemis.Core/Services/Storage/SurfaceService.cs @@ -24,7 +24,7 @@ namespace Artemis.Core.Services _rgbService = rgbService; _pluginService = pluginService; _surfaceConfigurations = new List(); - _renderScaleSetting = settingsService.GetSetting("Core.RenderScale", 1.0); + _renderScaleSetting = settingsService.GetSetting("Core.RenderScale", 0.5); LoadFromRepository(); diff --git a/src/Artemis.UI.Shared/Controls/DeviceVisualizer.cs b/src/Artemis.UI.Shared/Controls/DeviceVisualizer.cs index 94ae68216..8327a3007 100644 --- a/src/Artemis.UI.Shared/Controls/DeviceVisualizer.cs +++ b/src/Artemis.UI.Shared/Controls/DeviceVisualizer.cs @@ -142,15 +142,14 @@ namespace Artemis.UI.Shared private static Size ResizeKeepAspect(Size src, double maxWidth, double maxHeight) { double scale; - // ?? if (double.IsPositiveInfinity(maxWidth) && !double.IsPositiveInfinity(maxHeight)) scale = maxHeight / src.Height; else if (!double.IsPositiveInfinity(maxWidth) && double.IsPositiveInfinity(maxHeight)) scale = maxWidth / src.Width; else if (double.IsPositiveInfinity(maxWidth) && double.IsPositiveInfinity(maxHeight)) return src; - - scale = Math.Min(maxWidth / src.Width, maxHeight / src.Height); + else + scale = Math.Min(maxWidth / src.Width, maxHeight / src.Height); return new Size(src.Width * scale, src.Height * scale); } diff --git a/src/Artemis.UI.Shared/Services/Interfaces/IDialogService.cs b/src/Artemis.UI.Shared/Services/Interfaces/IDialogService.cs index 2f24ce7fb..c428d49c4 100644 --- a/src/Artemis.UI.Shared/Services/Interfaces/IDialogService.cs +++ b/src/Artemis.UI.Shared/Services/Interfaces/IDialogService.cs @@ -6,6 +6,9 @@ using Ninject.Parameters; namespace Artemis.UI.Shared.Services { + /// + /// Provides different ways of showing confirmation dialogs and custom dialogs + /// public interface IDialogService : IArtemisSharedUIService { /// diff --git a/src/Artemis.UI/Screens/Settings/Tabs/General/GeneralSettingsTabViewModel.cs b/src/Artemis.UI/Screens/Settings/Tabs/General/GeneralSettingsTabViewModel.cs index 12f8d182c..907f352b2 100644 --- a/src/Artemis.UI/Screens/Settings/Tabs/General/GeneralSettingsTabViewModel.cs +++ b/src/Artemis.UI/Screens/Settings/Tabs/General/GeneralSettingsTabViewModel.cs @@ -132,11 +132,11 @@ namespace Artemis.UI.Screens.Settings.Tabs.General public double RenderScale { - get => _settingsService.GetSetting("Core.RenderScale", 1.0).Value; + get => _settingsService.GetSetting("Core.RenderScale", 0.5).Value; set { - _settingsService.GetSetting("Core.RenderScale", 1.0).Value = value; - _settingsService.GetSetting("Core.RenderScale", 1.0).Save(); + _settingsService.GetSetting("Core.RenderScale", 0.5).Value = value; + _settingsService.GetSetting("Core.RenderScale", 0.5).Save(); } } diff --git a/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsView.xaml b/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsView.xaml index dab5ad27b..0a5b1baf8 100644 --- a/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsView.xaml +++ b/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsView.xaml @@ -47,6 +47,16 @@ Command="{s:Action ShowLoadException}"> LOAD FAILED + Plugin.GetType().BaseType?.Name ?? Plugin.GetType().Name; public bool CanOpenSettings => IsEnabled && Plugin.ConfigurationDialog != null; public bool DisplayLoadFailed => !Enabling && PluginInfo.LoadException != null; + public bool RequiresRestart => Plugin.Enabled && !PluginInfo.Enabled; public bool IsEnabled { - get => Plugin.Enabled; + get => Plugin.PluginInfo.Enabled; set => Task.Run(() => UpdateEnabled(value)); } @@ -113,6 +119,15 @@ namespace Artemis.UI.Screens.Settings.Tabs.Plugins _dialogService.ShowExceptionDialog("The plugin failed to load: " + PluginInfo.LoadException.Message, PluginInfo.LoadException); } + public async Task Restart() + { + _logger.Debug("Restarting for device provider disable {pluginInfo}", Plugin.PluginInfo); + + // Give the logger a chance to write, might not always be enough but oh well + await Task.Delay(500); + ApplicationUtilities.Shutdown(2, true); + } + private PackIconKind GetIconKind() { if (PluginInfo.Icon != null) @@ -143,7 +158,7 @@ namespace Artemis.UI.Screens.Settings.Tabs.Plugins private async Task UpdateEnabled(bool enable) { - if (Plugin.Enabled == enable) + if (IsEnabled == enable) { NotifyOfPropertyChange(nameof(IsEnabled)); return; @@ -151,15 +166,8 @@ namespace Artemis.UI.Screens.Settings.Tabs.Plugins if (!enable && Plugin is DeviceProvider) { - var confirm = await _dialogService.ShowConfirmDialog( - "Disable device provider", - "You are disabling a device provider, this requires that Artemis restarts, please confirm." - ); - if (!confirm) - { - NotifyOfPropertyChange(nameof(IsEnabled)); - return; - } + await DisableDeviceProvider(); + return; } if (enable) @@ -178,14 +186,46 @@ namespace Artemis.UI.Screens.Settings.Tabs.Plugins finally { Enabling = false; - NotifyOfPropertyChange(nameof(IsEnabled)); - NotifyOfPropertyChange(nameof(DisplayLoadFailed)); } } else _pluginService.DisablePlugin(Plugin); NotifyOfPropertyChange(nameof(IsEnabled)); + NotifyOfPropertyChange(nameof(RequiresRestart)); + NotifyOfPropertyChange(nameof(DisplayLoadFailed)); + } + + private async Task DisableDeviceProvider() + { + var restart = false; + + // If any plugin already requires a restart, don't ask the user again + var restartQueued = _pluginService.GetAllPluginInfo().Any(p => p.Instance != null && !p.Enabled && p.Instance.Enabled); + // If the plugin isn't enabled (load failed), it can be disabled without a restart + if (!restartQueued && Plugin.Enabled) + { + restart = await _dialogService.ShowConfirmDialog( + "Disable device provider", + "You are disabling a device provider, Artemis has to restart to \r\nfully disable this type of plugin", + "Restart now", + "Restart later" + ); + } + + _pluginService.DisablePlugin(Plugin); + if (restart) + { + _logger.Debug("Restarting for device provider disable {pluginInfo}", Plugin.PluginInfo); + + // Give the logger a chance to write, might not always be enough but oh well + await Task.Delay(500); + ApplicationUtilities.Shutdown(2, true); + } + + NotifyOfPropertyChange(nameof(IsEnabled)); + NotifyOfPropertyChange(nameof(RequiresRestart)); + NotifyOfPropertyChange(nameof(DisplayLoadFailed)); } } } \ No newline at end of file diff --git a/src/Artemis.UI/Services/LayerEditorService.cs b/src/Artemis.UI/Services/LayerEditorService.cs index d8cfbb937..403a68fe5 100644 --- a/src/Artemis.UI/Services/LayerEditorService.cs +++ b/src/Artemis.UI/Services/LayerEditorService.cs @@ -23,7 +23,7 @@ namespace Artemis.UI.Services public Rect GetLayerBounds(Layer layer) { // Adjust the render rectangle for the difference in render scale - var renderScale = _settingsService.GetSetting("Core.RenderScale", 1.0).Value; + var renderScale = _settingsService.GetSetting("Core.RenderScale", 0.5).Value; return new Rect( layer.Bounds.Left / renderScale * 1, layer.Bounds.Top / renderScale * 1, @@ -105,7 +105,7 @@ namespace Artemis.UI.Services /// public SKPoint GetScaledPoint(Layer layer, SKPoint point, bool absolute) { - var renderScale = _settingsService.GetSetting("Core.RenderScale", 1.0).Value; + var renderScale = _settingsService.GetSetting("Core.RenderScale", 0.5).Value; if (absolute) { return new SKPoint(