mirror of
https://github.com/Artemis-RGB/Artemis
synced 2025-12-13 05:48:35 +00:00
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
This commit is contained in:
parent
20e6aa1135
commit
c98fc51623
@ -281,6 +281,15 @@ namespace Artemis.Core.Services
|
|||||||
{
|
{
|
||||||
try
|
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);
|
plugin.SetEnabled(true, isAutoEnable);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
@ -312,16 +321,13 @@ namespace Artemis.Core.Services
|
|||||||
{
|
{
|
||||||
_logger.Debug("Disabling plugin {pluginInfo}", plugin.PluginInfo);
|
_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)
|
if (plugin is DeviceProvider)
|
||||||
{
|
{
|
||||||
// Don't call SetEnabled(false) but simply update enabled state and save it
|
// Don't call SetEnabled(false) but simply update enabled state and save it
|
||||||
plugin.PluginInfo.Enabled = false;
|
plugin.PluginInfo.Enabled = false;
|
||||||
plugin.PluginInfo.ApplyToEntity();
|
plugin.PluginInfo.ApplyToEntity();
|
||||||
_pluginRepository.SavePlugin(plugin.PluginInfo.PluginEntity);
|
_pluginRepository.SavePlugin(plugin.PluginInfo.PluginEntity);
|
||||||
|
|
||||||
_logger.Debug("Shutting down for device provider disable {pluginInfo}", plugin.PluginInfo);
|
|
||||||
ApplicationUtilities.Shutdown(2, true);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -24,7 +24,7 @@ namespace Artemis.Core.Services
|
|||||||
_rgbService = rgbService;
|
_rgbService = rgbService;
|
||||||
_pluginService = pluginService;
|
_pluginService = pluginService;
|
||||||
_surfaceConfigurations = new List<ArtemisSurface>();
|
_surfaceConfigurations = new List<ArtemisSurface>();
|
||||||
_renderScaleSetting = settingsService.GetSetting("Core.RenderScale", 1.0);
|
_renderScaleSetting = settingsService.GetSetting("Core.RenderScale", 0.5);
|
||||||
|
|
||||||
LoadFromRepository();
|
LoadFromRepository();
|
||||||
|
|
||||||
|
|||||||
@ -142,15 +142,14 @@ namespace Artemis.UI.Shared
|
|||||||
private static Size ResizeKeepAspect(Size src, double maxWidth, double maxHeight)
|
private static Size ResizeKeepAspect(Size src, double maxWidth, double maxHeight)
|
||||||
{
|
{
|
||||||
double scale;
|
double scale;
|
||||||
// ??
|
|
||||||
if (double.IsPositiveInfinity(maxWidth) && !double.IsPositiveInfinity(maxHeight))
|
if (double.IsPositiveInfinity(maxWidth) && !double.IsPositiveInfinity(maxHeight))
|
||||||
scale = maxHeight / src.Height;
|
scale = maxHeight / src.Height;
|
||||||
else if (!double.IsPositiveInfinity(maxWidth) && double.IsPositiveInfinity(maxHeight))
|
else if (!double.IsPositiveInfinity(maxWidth) && double.IsPositiveInfinity(maxHeight))
|
||||||
scale = maxWidth / src.Width;
|
scale = maxWidth / src.Width;
|
||||||
else if (double.IsPositiveInfinity(maxWidth) && double.IsPositiveInfinity(maxHeight))
|
else if (double.IsPositiveInfinity(maxWidth) && double.IsPositiveInfinity(maxHeight))
|
||||||
return src;
|
return src;
|
||||||
|
else
|
||||||
scale = Math.Min(maxWidth / src.Width, maxHeight / src.Height);
|
scale = Math.Min(maxWidth / src.Width, maxHeight / src.Height);
|
||||||
|
|
||||||
return new Size(src.Width * scale, src.Height * scale);
|
return new Size(src.Width * scale, src.Height * scale);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,6 +6,9 @@ using Ninject.Parameters;
|
|||||||
|
|
||||||
namespace Artemis.UI.Shared.Services
|
namespace Artemis.UI.Shared.Services
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Provides different ways of showing confirmation dialogs and custom dialogs
|
||||||
|
/// </summary>
|
||||||
public interface IDialogService : IArtemisSharedUIService
|
public interface IDialogService : IArtemisSharedUIService
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@ -132,11 +132,11 @@ namespace Artemis.UI.Screens.Settings.Tabs.General
|
|||||||
|
|
||||||
public double RenderScale
|
public double RenderScale
|
||||||
{
|
{
|
||||||
get => _settingsService.GetSetting("Core.RenderScale", 1.0).Value;
|
get => _settingsService.GetSetting("Core.RenderScale", 0.5).Value;
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
_settingsService.GetSetting("Core.RenderScale", 1.0).Value = value;
|
_settingsService.GetSetting("Core.RenderScale", 0.5).Value = value;
|
||||||
_settingsService.GetSetting("Core.RenderScale", 1.0).Save();
|
_settingsService.GetSetting("Core.RenderScale", 0.5).Save();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -47,6 +47,16 @@
|
|||||||
Command="{s:Action ShowLoadException}">
|
Command="{s:Action ShowLoadException}">
|
||||||
<TextBlock FontSize="11">LOAD FAILED</TextBlock>
|
<TextBlock FontSize="11">LOAD FAILED</TextBlock>
|
||||||
</Button>
|
</Button>
|
||||||
|
<Button Grid.Column="2" Grid.Row="0"
|
||||||
|
Height="22"
|
||||||
|
Padding="4"
|
||||||
|
Margin="0 -18 0 0"
|
||||||
|
Visibility="{Binding RequiresRestart, Converter={x:Static s:BoolToVisibilityConverter.Instance}, Mode=OneWay}"
|
||||||
|
Style="{StaticResource MaterialDesignRaisedButton}"
|
||||||
|
ToolTip="Click to restart"
|
||||||
|
Command="{s:Action Restart}">
|
||||||
|
<TextBlock FontSize="11">NEEDS RESTART</TextBlock>
|
||||||
|
</Button>
|
||||||
|
|
||||||
<TextBlock Grid.Column="1"
|
<TextBlock Grid.Column="1"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Artemis.Core;
|
using Artemis.Core;
|
||||||
using Artemis.Core.DataModelExpansions;
|
using Artemis.Core.DataModelExpansions;
|
||||||
@ -13,6 +14,7 @@ using Artemis.UI.Shared.Services;
|
|||||||
using MaterialDesignThemes.Wpf;
|
using MaterialDesignThemes.Wpf;
|
||||||
using Ninject;
|
using Ninject;
|
||||||
using Ninject.Parameters;
|
using Ninject.Parameters;
|
||||||
|
using Serilog;
|
||||||
using Stylet;
|
using Stylet;
|
||||||
|
|
||||||
namespace Artemis.UI.Screens.Settings.Tabs.Plugins
|
namespace Artemis.UI.Screens.Settings.Tabs.Plugins
|
||||||
@ -21,6 +23,7 @@ namespace Artemis.UI.Screens.Settings.Tabs.Plugins
|
|||||||
{
|
{
|
||||||
private readonly IDialogService _dialogService;
|
private readonly IDialogService _dialogService;
|
||||||
private readonly IKernel _kernel;
|
private readonly IKernel _kernel;
|
||||||
|
private readonly ILogger _logger;
|
||||||
private readonly IPluginService _pluginService;
|
private readonly IPluginService _pluginService;
|
||||||
private readonly ISnackbarMessageQueue _snackbarMessageQueue;
|
private readonly ISnackbarMessageQueue _snackbarMessageQueue;
|
||||||
private readonly IWindowManager _windowManager;
|
private readonly IWindowManager _windowManager;
|
||||||
@ -30,6 +33,7 @@ namespace Artemis.UI.Screens.Settings.Tabs.Plugins
|
|||||||
|
|
||||||
public PluginSettingsViewModel(Plugin plugin,
|
public PluginSettingsViewModel(Plugin plugin,
|
||||||
IKernel kernel,
|
IKernel kernel,
|
||||||
|
ILogger logger,
|
||||||
IWindowManager windowManager,
|
IWindowManager windowManager,
|
||||||
IDialogService dialogService,
|
IDialogService dialogService,
|
||||||
IPluginService pluginService,
|
IPluginService pluginService,
|
||||||
@ -39,6 +43,7 @@ namespace Artemis.UI.Screens.Settings.Tabs.Plugins
|
|||||||
PluginInfo = plugin.PluginInfo;
|
PluginInfo = plugin.PluginInfo;
|
||||||
|
|
||||||
_kernel = kernel;
|
_kernel = kernel;
|
||||||
|
_logger = logger;
|
||||||
_windowManager = windowManager;
|
_windowManager = windowManager;
|
||||||
_dialogService = dialogService;
|
_dialogService = dialogService;
|
||||||
_pluginService = pluginService;
|
_pluginService = pluginService;
|
||||||
@ -67,10 +72,11 @@ namespace Artemis.UI.Screens.Settings.Tabs.Plugins
|
|||||||
public string Type => Plugin.GetType().BaseType?.Name ?? Plugin.GetType().Name;
|
public string Type => Plugin.GetType().BaseType?.Name ?? Plugin.GetType().Name;
|
||||||
public bool CanOpenSettings => IsEnabled && Plugin.ConfigurationDialog != null;
|
public bool CanOpenSettings => IsEnabled && Plugin.ConfigurationDialog != null;
|
||||||
public bool DisplayLoadFailed => !Enabling && PluginInfo.LoadException != null;
|
public bool DisplayLoadFailed => !Enabling && PluginInfo.LoadException != null;
|
||||||
|
public bool RequiresRestart => Plugin.Enabled && !PluginInfo.Enabled;
|
||||||
|
|
||||||
public bool IsEnabled
|
public bool IsEnabled
|
||||||
{
|
{
|
||||||
get => Plugin.Enabled;
|
get => Plugin.PluginInfo.Enabled;
|
||||||
set => Task.Run(() => UpdateEnabled(value));
|
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);
|
_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()
|
private PackIconKind GetIconKind()
|
||||||
{
|
{
|
||||||
if (PluginInfo.Icon != null)
|
if (PluginInfo.Icon != null)
|
||||||
@ -143,7 +158,7 @@ namespace Artemis.UI.Screens.Settings.Tabs.Plugins
|
|||||||
|
|
||||||
private async Task UpdateEnabled(bool enable)
|
private async Task UpdateEnabled(bool enable)
|
||||||
{
|
{
|
||||||
if (Plugin.Enabled == enable)
|
if (IsEnabled == enable)
|
||||||
{
|
{
|
||||||
NotifyOfPropertyChange(nameof(IsEnabled));
|
NotifyOfPropertyChange(nameof(IsEnabled));
|
||||||
return;
|
return;
|
||||||
@ -151,15 +166,8 @@ namespace Artemis.UI.Screens.Settings.Tabs.Plugins
|
|||||||
|
|
||||||
if (!enable && Plugin is DeviceProvider)
|
if (!enable && Plugin is DeviceProvider)
|
||||||
{
|
{
|
||||||
var confirm = await _dialogService.ShowConfirmDialog(
|
await DisableDeviceProvider();
|
||||||
"Disable device provider",
|
return;
|
||||||
"You are disabling a device provider, this requires that Artemis restarts, please confirm."
|
|
||||||
);
|
|
||||||
if (!confirm)
|
|
||||||
{
|
|
||||||
NotifyOfPropertyChange(nameof(IsEnabled));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (enable)
|
if (enable)
|
||||||
@ -178,14 +186,46 @@ namespace Artemis.UI.Screens.Settings.Tabs.Plugins
|
|||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
Enabling = false;
|
Enabling = false;
|
||||||
NotifyOfPropertyChange(nameof(IsEnabled));
|
|
||||||
NotifyOfPropertyChange(nameof(DisplayLoadFailed));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
_pluginService.DisablePlugin(Plugin);
|
_pluginService.DisablePlugin(Plugin);
|
||||||
|
|
||||||
NotifyOfPropertyChange(nameof(IsEnabled));
|
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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -23,7 +23,7 @@ namespace Artemis.UI.Services
|
|||||||
public Rect GetLayerBounds(Layer layer)
|
public Rect GetLayerBounds(Layer layer)
|
||||||
{
|
{
|
||||||
// Adjust the render rectangle for the difference in render scale
|
// 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(
|
return new Rect(
|
||||||
layer.Bounds.Left / renderScale * 1,
|
layer.Bounds.Left / renderScale * 1,
|
||||||
layer.Bounds.Top / renderScale * 1,
|
layer.Bounds.Top / renderScale * 1,
|
||||||
@ -105,7 +105,7 @@ namespace Artemis.UI.Services
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public SKPoint GetScaledPoint(Layer layer, SKPoint point, bool absolute)
|
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)
|
if (absolute)
|
||||||
{
|
{
|
||||||
return new SKPoint(
|
return new SKPoint(
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user