Prerequisites - Finalized UI logic surrounding install/remove

This commit is contained in:
Robert committed 2021-05-02 23:00:48 +02:00
1 parent 21700aaad5
commit 77be79dde5
11 files changed
+260 -191

No files matched your search

@@ -24,7 +24,7 @@
<ColumnDefinition Width="500" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Style="{StaticResource MaterialDesignHeadline6TextBlock}" TextWrapping="Wrap" Margin="0 0 0 20">
Plugin prerequisites
Plugin/feature prerequisites
</TextBlock>
<ListBox Grid.Row="1"
@@ -83,7 +83,7 @@
TextWrapping="Wrap"
Margin="10 0"
Visibility="{Binding ActivePrerequisite, Converter={StaticResource NullToVisibilityConverter}, ConverterParameter=Inverted}">
In order for this plugin to function certain prerequisites must be met. <LineBreak /><LineBreak />
In order for this plugin/feature to function certain prerequisites must be met. <LineBreak /><LineBreak />
On the left side you can see all prerequisites and whether they are currently met or not.
Clicking install prerequisites will automatically set everything up for you.
</TextBlock>
@@ -4,7 +4,6 @@ using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Artemis.Core;
using Artemis.UI.Exceptions;
using Artemis.UI.Ninject.Factories;
using Artemis.UI.Shared.Services;
using MaterialDesignThemes.Wpf;
@@ -15,35 +14,25 @@ namespace Artemis.UI.Screens.Plugins
public class PluginPrerequisitesInstallDialogViewModel : DialogViewModelBase
{
private readonly IDialogService _dialogService;
private readonly List<IPrerequisitesSubject> _subjects;
private PluginPrerequisiteViewModel _activePrerequisite;
private bool _canInstall;
private bool _isFinished;
private CancellationTokenSource _tokenSource;
public PluginPrerequisitesInstallDialogViewModel(IPrerequisitesSubject subject, IPrerequisitesVmFactory prerequisitesVmFactory, IDialogService dialogService)
public PluginPrerequisitesInstallDialogViewModel(List<IPrerequisitesSubject> subjects, IPrerequisitesVmFactory prerequisitesVmFactory, IDialogService dialogService)
{
_subjects = subjects;
_dialogService = dialogService;
// Constructor overloading doesn't work very well with Kernel.Get<T> :(
if (subject is PluginInfo plugin)
{
PluginInfo = plugin;
Prerequisites = new BindableCollection<PluginPrerequisiteViewModel>(plugin.Prerequisites.Select(p => prerequisitesVmFactory.PluginPrerequisiteViewModel(p, false)));
}
else if (subject is PluginFeatureInfo feature)
{
FeatureInfo = feature;
Prerequisites = new BindableCollection<PluginPrerequisiteViewModel>(feature.Prerequisites.Select(p => prerequisitesVmFactory.PluginPrerequisiteViewModel(p, false)));
}
else
throw new ArtemisUIException($"Expected plugin or feature to be passed to {nameof(PluginPrerequisitesInstallDialogViewModel)}");
Prerequisites = new BindableCollection<PluginPrerequisiteViewModel>();
foreach (IPrerequisitesSubject prerequisitesSubject in subjects)
Prerequisites.AddRange(prerequisitesSubject.Prerequisites.Select(p => prerequisitesVmFactory.PluginPrerequisiteViewModel(p, false)));
foreach (PluginPrerequisiteViewModel pluginPrerequisiteViewModel in Prerequisites)
pluginPrerequisiteViewModel.ConductWith(this);
}
public PluginInfo PluginInfo { get; }
public PluginFeatureInfo FeatureInfo { get; }
public BindableCollection<PluginPrerequisiteViewModel> Prerequisites { get; }
public PluginPrerequisiteViewModel ActivePrerequisite
@@ -64,9 +53,6 @@ namespace Artemis.UI.Screens.Plugins
set => SetAndNotify(ref _isFinished, value);
}
public bool IsSubjectPlugin => PluginInfo != null;
public bool IsSubjectFeature => FeatureInfo != null;
#region Overrides of DialogViewModelBase
/// <inheritdoc />
@@ -114,7 +100,7 @@ namespace Artemis.UI.Screens.Plugins
"Confirm",
""
);
await _dialogService.ShowDialog<PluginPrerequisitesInstallDialogViewModel>(new Dictionary<string, object> {{"subject", PluginInfo}});
await Show(_dialogService, _subjects);
}
catch (OperationCanceledException)
{
@@ -133,16 +119,18 @@ namespace Artemis.UI.Screens.Plugins
Session?.Close(true);
}
public static Task<object> Show(IDialogService dialogService, List<IPrerequisitesSubject> subjects)
{
return dialogService.ShowDialog<PluginPrerequisitesInstallDialogViewModel>(new Dictionary<string, object> {{"subjects", subjects}});
}
#region Overrides of Screen
/// <inheritdoc />
protected override void OnInitialActivate()
{
CanInstall = false;
if (PluginInfo != null)
Task.Run(() => CanInstall = !PluginInfo.ArePrerequisitesMet());
else
Task.Run(() => CanInstall = !FeatureInfo.ArePrerequisitesMet());
Task.Run(() => CanInstall = Prerequisites.Any(p => !p.PluginPrerequisite.IsMet()));
base.OnInitialActivate();
}
@@ -24,7 +24,7 @@
<ColumnDefinition Width="500" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Style="{StaticResource MaterialDesignHeadline6TextBlock}" TextWrapping="Wrap" Margin="0 0 0 20">
Plugin prerequisites
Plugin/feature prerequisites
</TextBlock>
<ListBox Grid.Row="1"
@@ -83,8 +83,8 @@
TextWrapping="Wrap"
Margin="10 0"
Visibility="{Binding ActivePrerequisite, Converter={StaticResource NullToVisibilityConverter}, ConverterParameter=Inverted}">
This plugin installed certain prerequisites in order to function. <LineBreak /><LineBreak />
In this screen you can chose to remove these, this will mean the plugin will no longer work until you reinstall the prerequisites.
This plugin/feature installed certain prerequisites in order to function. <LineBreak /><LineBreak />
In this screen you can chose to remove these, this will mean the plugin/feature will no longer work until you reinstall the prerequisites.
</TextBlock>
<StackPanel Grid.Row="2"
@@ -98,7 +98,7 @@
Focusable="False"
IsCancel="True"
Command="{s:Action Cancel}"
Content="CANCEL" />
Content="{Binding CancelLabel}" />
<Button x:Name="ConfirmButton"
Style="{StaticResource MaterialDesignFlatButton}"
IsDefault="True"
@@ -5,7 +5,6 @@ using System.Threading;
using System.Threading.Tasks;
using Artemis.Core;
using Artemis.Core.Services;
using Artemis.UI.Exceptions;
using Artemis.UI.Ninject.Factories;
using Artemis.UI.Shared.Services;
using MaterialDesignThemes.Wpf;
@@ -17,38 +16,29 @@ namespace Artemis.UI.Screens.Plugins
{
private readonly IDialogService _dialogService;
private readonly IPluginManagementService _pluginManagementService;
private readonly List<IPrerequisitesSubject> _subjects;
private PluginPrerequisiteViewModel _activePrerequisite;
private bool _canUninstall;
private bool _isFinished;
private CancellationTokenSource _tokenSource;
public PluginPrerequisitesUninstallDialogViewModel(IPrerequisitesSubject subject, IPrerequisitesVmFactory prerequisitesVmFactory, IDialogService dialogService,
IPluginManagementService pluginManagementService)
public PluginPrerequisitesUninstallDialogViewModel(List<IPrerequisitesSubject> subjects, string cancelLabel, IPrerequisitesVmFactory prerequisitesVmFactory,
IDialogService dialogService, IPluginManagementService pluginManagementService)
{
_subjects = subjects;
_dialogService = dialogService;
_pluginManagementService = pluginManagementService;
// Constructor overloading doesn't work very well with Kernel.Get<T> :(
if (subject is PluginInfo plugin)
{
PluginInfo = plugin;
Prerequisites = new BindableCollection<PluginPrerequisiteViewModel>(plugin.Prerequisites.Select(p => prerequisitesVmFactory.PluginPrerequisiteViewModel(p, true)));
}
else if (subject is PluginFeatureInfo feature)
{
FeatureInfo = feature;
Prerequisites = new BindableCollection<PluginPrerequisiteViewModel>(feature.Prerequisites.Select(p => prerequisitesVmFactory.PluginPrerequisiteViewModel(p, true)));
}
else
throw new ArtemisUIException($"Expected plugin or feature to be passed to {nameof(PluginPrerequisitesInstallDialogViewModel)}");
CancelLabel = cancelLabel;
Prerequisites = new BindableCollection<PluginPrerequisiteViewModel>();
foreach (IPrerequisitesSubject prerequisitesSubject in subjects)
Prerequisites.AddRange(prerequisitesSubject.Prerequisites.Select(p => prerequisitesVmFactory.PluginPrerequisiteViewModel(p, true)));
foreach (PluginPrerequisiteViewModel pluginPrerequisiteViewModel in Prerequisites)
pluginPrerequisiteViewModel.ConductWith(this);
}
public PluginFeatureInfo FeatureInfo { get; }
public PluginInfo PluginInfo { get; }
public string CancelLabel { get; }
public BindableCollection<PluginPrerequisiteViewModel> Prerequisites { get; }
public PluginPrerequisiteViewModel ActivePrerequisite
@@ -69,9 +59,6 @@ namespace Artemis.UI.Screens.Plugins
set => SetAndNotify(ref _isFinished, value);
}
public bool IsSubjectPlugin => PluginInfo != null;
public bool IsSubjectFeature => FeatureInfo != null;
#region Overrides of DialogViewModelBase
/// <inheritdoc />
@@ -87,10 +74,26 @@ namespace Artemis.UI.Screens.Plugins
{
CanUninstall = false;
if (PluginInfo != null)
_pluginManagementService.DisablePlugin(PluginInfo.Plugin, true);
else if (FeatureInfo?.Instance != null)
_pluginManagementService.DisablePluginFeature(FeatureInfo.Instance, true);
// Disable all subjects that are plugins, this will disable their features too
foreach (IPrerequisitesSubject prerequisitesSubject in _subjects)
{
if (prerequisitesSubject is PluginInfo pluginInfo)
_pluginManagementService.DisablePlugin(pluginInfo.Plugin, true);
}
// Disable all subjects that are features if still required
foreach (IPrerequisitesSubject prerequisitesSubject in _subjects)
{
if (prerequisitesSubject is not PluginFeatureInfo featureInfo)
continue;
// Disable the parent plugin if the feature is AlwaysEnabled
if (featureInfo.AlwaysEnabled)
_pluginManagementService.DisablePlugin(featureInfo.Plugin, true);
else if (featureInfo.Instance != null)
_pluginManagementService.DisablePluginFeature(featureInfo.Instance, true);
}
_tokenSource = new CancellationTokenSource();
try
@@ -124,7 +127,7 @@ namespace Artemis.UI.Screens.Plugins
"Confirm",
""
);
await _dialogService.ShowDialog<PluginPrerequisitesUninstallDialogViewModel>(new Dictionary<string, object> {{"subject", PluginInfo}});
await Show(_dialogService, _subjects);
}
catch (OperationCanceledException)
{
@@ -143,6 +146,15 @@ namespace Artemis.UI.Screens.Plugins
Session?.Close(true);
}
public static Task<object> Show(IDialogService dialogService, List<IPrerequisitesSubject> subjects, string cancelLabel = "CANCEL")
{
return dialogService.ShowDialog<PluginPrerequisitesUninstallDialogViewModel>(new Dictionary<string, object>
{
{"subjects", subjects},
{"cancelLabel", cancelLabel},
});
}
#region Overrides of Screen
/// <inheritdoc />
@@ -150,10 +162,7 @@ namespace Artemis.UI.Screens.Plugins
{
CanUninstall = false;
// Could be slow so take it off of the UI thread
if (PluginInfo != null)
Task.Run(() => CanUninstall = PluginInfo.Prerequisites.Any(p => p.IsMet()));
else
Task.Run(() => CanUninstall = FeatureInfo.Prerequisites.Any(p => p.IsMet()));
Task.Run(() => CanUninstall = Prerequisites.Any(p => p.PluginPrerequisite.IsMet()));
base.OnInitialActivate();
}