1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-13 05:48:35 +00:00
Artemis/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginFeatureViewModel.cs
SpoinkyNL 883fccef7b Updating - Added UI for updating (actual update not yet implemented)
Shared UI - Added message service for easy access to the snackbar 🍟
2021-01-10 00:20:01 +01:00

159 lines
4.9 KiB
C#

using System;
using System.Diagnostics;
using System.IO;
using System.Threading.Tasks;
using Artemis.Core;
using Artemis.Core.DataModelExpansions;
using Artemis.Core.DeviceProviders;
using Artemis.Core.LayerBrushes;
using Artemis.Core.LayerEffects;
using Artemis.Core.Modules;
using Artemis.Core.Services;
using Artemis.UI.Shared.Services;
using Humanizer;
using MaterialDesignThemes.Wpf;
using Stylet;
namespace Artemis.UI.Screens.Settings.Tabs.Plugins
{
public class PluginFeatureViewModel : Screen
{
private readonly IDialogService _dialogService;
private readonly IPluginManagementService _pluginManagementService;
private IMessageService _messageService;
private bool _enabling;
public PluginFeatureViewModel(PluginFeature feature,
IDialogService dialogService,
IPluginManagementService pluginManagementService,
IMessageService messageService)
{
_dialogService = dialogService;
_pluginManagementService = pluginManagementService;
_messageService = messageService;
Feature = feature;
Icon = GetIconKind();
}
public PluginFeature Feature { get; }
public PackIconKind Icon { get; }
public string Name => Feature.GetType().Name.Humanize();
public Exception LoadException => Feature.LoadException;
public bool Enabling
{
get => _enabling;
set => SetAndNotify(ref _enabling, value);
}
public bool IsEnabled
{
get => Feature.IsEnabled;
set => Task.Run(() => UpdateEnabled(value));
}
public void ShowLogsFolder()
{
try
{
Process.Start(Environment.GetEnvironmentVariable("WINDIR") + @"\explorer.exe", Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Logs"));
}
catch (Exception e)
{
_dialogService.ShowExceptionDialog("Welp, we couldn\'t open the logs folder for you", e);
}
}
public void ViewLoadException()
{
if (LoadException == null)
return;
_dialogService.ShowExceptionDialog("Feature failed to enable", Feature.LoadException);
}
protected override void OnInitialActivate()
{
base.OnInitialActivate();
_pluginManagementService.PluginFeatureEnabling += OnFeatureEnabling;
_pluginManagementService.PluginFeatureEnabled += OnFeatureEnableStopped;
_pluginManagementService.PluginFeatureEnableFailed += OnFeatureEnableStopped;
}
protected override void OnClose()
{
base.OnClose();
_pluginManagementService.PluginFeatureEnabling -= OnFeatureEnabling;
_pluginManagementService.PluginFeatureEnabled -= OnFeatureEnableStopped;
_pluginManagementService.PluginFeatureEnableFailed -= OnFeatureEnableStopped;
}
private async Task UpdateEnabled(bool enable)
{
if (IsEnabled == enable)
{
NotifyOfPropertyChange(nameof(IsEnabled));
return;
}
if (enable)
{
Enabling = true;
try
{
await Task.Run(() => _pluginManagementService.EnablePluginFeature(Feature, true));
}
catch (Exception e)
{
_messageService.ShowMessage($"Failed to enable {Name}\r\n{e.Message}", "VIEW LOGS", ShowLogsFolder);
}
finally
{
Enabling = false;
}
}
else
{
_pluginManagementService.DisablePluginFeature(Feature, true);
NotifyOfPropertyChange(nameof(IsEnabled));
}
}
private PackIconKind GetIconKind()
{
return Feature switch
{
BaseDataModelExpansion => PackIconKind.TableAdd,
DeviceProvider => PackIconKind.Devices,
ProfileModule => PackIconKind.VectorRectangle,
Module => PackIconKind.GearBox,
LayerBrushProvider => PackIconKind.Brush,
LayerEffectProvider => PackIconKind.AutoAwesome,
_ => PackIconKind.Plugin
};
}
#region Event handlers
private void OnFeatureEnabling(object sender, PluginFeatureEventArgs e)
{
if (e.PluginFeature != Feature) return;
Enabling = true;
}
private void OnFeatureEnableStopped(object sender, PluginFeatureEventArgs e)
{
if (e.PluginFeature != Feature) return;
Enabling = false;
NotifyOfPropertyChange(nameof(IsEnabled));
NotifyOfPropertyChange(nameof(LoadException));
}
#endregion
}
}