diff --git a/src/Artemis.Core/Exceptions/ArtemisPluginException.cs b/src/Artemis.Core/Exceptions/ArtemisPluginException.cs index 53f9fd30f..6473f0293 100644 --- a/src/Artemis.Core/Exceptions/ArtemisPluginException.cs +++ b/src/Artemis.Core/Exceptions/ArtemisPluginException.cs @@ -48,17 +48,17 @@ public class ArtemisPluginException : Exception /// /// Creates a new instance of the class /// - public ArtemisPluginException(string message, string helpDocument) : base(message) + public ArtemisPluginException(string message, string helpPageId) : base(message) { - HelpDocument = helpDocument; + HelpPageId = helpPageId; } /// /// Creates a new instance of the class /// - public ArtemisPluginException(string message, Exception inner, string helpDocument) : base(message, inner) + public ArtemisPluginException(string message, Exception inner, string helpPageId) : base(message, inner) { - HelpDocument = helpDocument; + HelpPageId = helpPageId; } /// @@ -67,8 +67,8 @@ public class ArtemisPluginException : Exception public Plugin? Plugin { get; } /// - /// Gets or sets the help document related to this exception. + /// Gets the ID of the help page to display for this exception. /// - public string? HelpDocument { get; } + public string? HelpPageId { get; } } \ No newline at end of file diff --git a/src/Artemis.Core/Plugins/IPluginHelpPage.cs b/src/Artemis.Core/Plugins/IPluginHelpPage.cs new file mode 100644 index 000000000..1375d6716 --- /dev/null +++ b/src/Artemis.Core/Plugins/IPluginHelpPage.cs @@ -0,0 +1,22 @@ +namespace Artemis.Core; + +/// +/// Represents a plugin related help page +/// +public interface IPluginHelpPage +{ + /// + /// Gets the plugin the help page belongs to. + /// + Plugin Plugin { get; } + + /// + /// Gets the title of the help page. + /// + public string Title { get; } + + /// + /// An ID used to quickly lead users to the help page in case of an error. + /// + public string Id { get; } +} \ No newline at end of file diff --git a/src/Artemis.Core/Plugins/MarkdownPluginHelpPage.cs b/src/Artemis.Core/Plugins/MarkdownPluginHelpPage.cs new file mode 100644 index 000000000..09554fa29 --- /dev/null +++ b/src/Artemis.Core/Plugins/MarkdownPluginHelpPage.cs @@ -0,0 +1,41 @@ +using System.IO; + +namespace Artemis.Core; + +/// +/// Represents a plugin related help page +/// +public class MarkdownPluginHelpPage : IPluginHelpPage +{ + /// + /// Creates a new instance of the class. + /// + /// The plugin to display the markdown for. + /// A file path relative to the plugin or absolute, pointing to the markdown to display + /// The ID of the help page, used to quickly lead users to it in case of errors. + /// + public MarkdownPluginHelpPage(Plugin plugin, string title, string id, string markdownFile) + { + Plugin = plugin; + Title = title; + Id = id; + MarkdownFile = Path.IsPathRooted(markdownFile) ? markdownFile : Plugin.ResolveRelativePath(markdownFile); + + if (!File.Exists(MarkdownFile)) + throw new FileNotFoundException($"Could not find markdown file at \"{MarkdownFile}\""); + } + + /// + public Plugin Plugin { get; } + + /// + public string Title { get; } + + /// + public string Id { get; } + + /// + /// Gets the absolute path to the markdown that is to be displayed. + /// + public string MarkdownFile { get; } +} \ No newline at end of file diff --git a/src/Artemis.Core/Plugins/Plugin.cs b/src/Artemis.Core/Plugins/Plugin.cs index 45b469146..290db1224 100644 --- a/src/Artemis.Core/Plugins/Plugin.cs +++ b/src/Artemis.Core/Plugins/Plugin.cs @@ -36,6 +36,7 @@ public class Plugin : CorePropertyChanged, IDisposable Features = new ReadOnlyCollection(_features); Profilers = new ReadOnlyCollection(_profilers); + HelpPages = new List(); } /// @@ -58,6 +59,8 @@ public class Plugin : CorePropertyChanged, IDisposable /// public IPluginConfigurationDialog? ConfigurationDialog { get; set; } + public List HelpPages { get; } + /// /// Indicates whether the user enabled the plugin or not /// diff --git a/src/Artemis.UI/Artemis.UI.csproj b/src/Artemis.UI/Artemis.UI.csproj index 4e6b4e383..ea9845315 100644 --- a/src/Artemis.UI/Artemis.UI.csproj +++ b/src/Artemis.UI/Artemis.UI.csproj @@ -52,5 +52,25 @@ UpdatingTabView.axaml Code + + MarkdownPluginHelpPageView.axaml + Code + + + PluginHelpWindowView.axaml + Code + + + PluginFeatureView.axaml + Code + + + PluginPrerequisiteActionView.axaml + Code + + + PluginPrerequisiteView.axaml + Code + \ No newline at end of file diff --git a/src/Artemis.UI/DryIoc/Factories/IVMFactory.cs b/src/Artemis.UI/DryIoc/Factories/IVMFactory.cs index 7d3e344aa..d410e3cfc 100644 --- a/src/Artemis.UI/DryIoc/Factories/IVMFactory.cs +++ b/src/Artemis.UI/DryIoc/Factories/IVMFactory.cs @@ -7,6 +7,8 @@ using Artemis.Core.LayerEffects; using Artemis.Core.ScriptingProviders; using Artemis.UI.Screens.Device; using Artemis.UI.Screens.Plugins; +using Artemis.UI.Screens.Plugins.Features; +using Artemis.UI.Screens.Plugins.Prerequisites; using Artemis.UI.Screens.ProfileEditor; using Artemis.UI.Screens.ProfileEditor.DisplayCondition.ConditionTypes; using Artemis.UI.Screens.ProfileEditor.ProfileTree; diff --git a/src/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesInstallDialogView.axaml b/src/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesInstallDialogView.axaml index 305c68324..9ac570871 100644 --- a/src/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesInstallDialogView.axaml +++ b/src/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesInstallDialogView.axaml @@ -4,6 +4,7 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:plugins="clr-namespace:Artemis.UI.Screens.Plugins" xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia" + xmlns:prerequisites="clr-namespace:Artemis.UI.Screens.Plugins.Prerequisites" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="Artemis.UI.Screens.Plugins.PluginPrerequisitesInstallDialogView" x:DataType="plugins:PluginPrerequisitesInstallDialogViewModel"> @@ -34,7 +35,7 @@ SelectedItem="{CompiledBinding ActivePrerequisite, Mode=OneWay}" IsHitTestVisible="False"> - + diff --git a/src/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesInstallDialogViewModel.cs b/src/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesInstallDialogViewModel.cs index a8de70fbd..649698e0d 100644 --- a/src/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesInstallDialogViewModel.cs +++ b/src/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesInstallDialogViewModel.cs @@ -8,6 +8,7 @@ using System.Threading; using System.Threading.Tasks; using Artemis.Core; using Artemis.UI.DryIoc.Factories; +using Artemis.UI.Screens.Plugins.Prerequisites; using Artemis.UI.Shared; using Artemis.UI.Shared.Services; using Avalonia.Threading; diff --git a/src/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesUninstallDialogView.axaml b/src/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesUninstallDialogView.axaml index d2c15c7fd..0acb85de7 100644 --- a/src/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesUninstallDialogView.axaml +++ b/src/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesUninstallDialogView.axaml @@ -4,6 +4,7 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:plugins="clr-namespace:Artemis.UI.Screens.Plugins" xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia" + xmlns:prerequisites="clr-namespace:Artemis.UI.Screens.Plugins.Prerequisites" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="Artemis.UI.Screens.Plugins.PluginPrerequisitesUninstallDialogView" x:DataType="plugins:PluginPrerequisitesUninstallDialogViewModel"> @@ -34,7 +35,7 @@ SelectedItem="{CompiledBinding ActivePrerequisite, Mode=OneWay}" IsHitTestVisible="False"> - + diff --git a/src/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesUninstallDialogViewModel.cs b/src/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesUninstallDialogViewModel.cs index b65e72d23..b443de9b1 100644 --- a/src/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesUninstallDialogViewModel.cs +++ b/src/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesUninstallDialogViewModel.cs @@ -9,6 +9,7 @@ using System.Threading.Tasks; using Artemis.Core; using Artemis.Core.Services; using Artemis.UI.DryIoc.Factories; +using Artemis.UI.Screens.Plugins.Prerequisites; using Artemis.UI.Shared; using Artemis.UI.Shared.Services; using Avalonia.Threading; diff --git a/src/Artemis.UI/Screens/Plugins/PluginFeatureView.axaml b/src/Artemis.UI/Screens/Plugins/Features/PluginFeatureView.axaml similarity index 95% rename from src/Artemis.UI/Screens/Plugins/PluginFeatureView.axaml rename to src/Artemis.UI/Screens/Plugins/Features/PluginFeatureView.axaml index 790c38f82..0b8bd3873 100644 --- a/src/Artemis.UI/Screens/Plugins/PluginFeatureView.axaml +++ b/src/Artemis.UI/Screens/Plugins/Features/PluginFeatureView.axaml @@ -5,9 +5,10 @@ xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia" xmlns:shared="clr-namespace:Artemis.UI.Shared;assembly=Artemis.UI.Shared" xmlns:plugins="clr-namespace:Artemis.UI.Screens.Plugins" + xmlns:features="clr-namespace:Artemis.UI.Screens.Plugins.Features" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" - x:Class="Artemis.UI.Screens.Plugins.PluginFeatureView" - x:DataType="plugins:PluginFeatureViewModel"> + x:Class="Artemis.UI.Screens.Plugins.Features.PluginFeatureView" + x:DataType="features:PluginFeatureViewModel"> diff --git a/src/Artemis.UI/Screens/Plugins/PluginFeatureView.axaml.cs b/src/Artemis.UI/Screens/Plugins/Features/PluginFeatureView.axaml.cs similarity index 74% rename from src/Artemis.UI/Screens/Plugins/PluginFeatureView.axaml.cs rename to src/Artemis.UI/Screens/Plugins/Features/PluginFeatureView.axaml.cs index 7f21c9ce0..1beddfbbf 100644 --- a/src/Artemis.UI/Screens/Plugins/PluginFeatureView.axaml.cs +++ b/src/Artemis.UI/Screens/Plugins/Features/PluginFeatureView.axaml.cs @@ -1,7 +1,6 @@ -using Avalonia.Markup.Xaml; using Avalonia.ReactiveUI; -namespace Artemis.UI.Screens.Plugins; +namespace Artemis.UI.Screens.Plugins.Features; public partial class PluginFeatureView : ReactiveUserControl { diff --git a/src/Artemis.UI/Screens/Plugins/PluginFeatureViewModel.cs b/src/Artemis.UI/Screens/Plugins/Features/PluginFeatureViewModel.cs similarity index 99% rename from src/Artemis.UI/Screens/Plugins/PluginFeatureViewModel.cs rename to src/Artemis.UI/Screens/Plugins/Features/PluginFeatureViewModel.cs index 5c2abaea2..2df1c64a9 100644 --- a/src/Artemis.UI/Screens/Plugins/PluginFeatureViewModel.cs +++ b/src/Artemis.UI/Screens/Plugins/Features/PluginFeatureViewModel.cs @@ -18,7 +18,7 @@ using Avalonia.Threading; using Material.Icons; using ReactiveUI; -namespace Artemis.UI.Screens.Plugins; +namespace Artemis.UI.Screens.Plugins.Features; public class PluginFeatureViewModel : ActivatableViewModelBase { diff --git a/src/Artemis.UI/Screens/Plugins/Help/MarkdownPluginHelpPageView.axaml b/src/Artemis.UI/Screens/Plugins/Help/MarkdownPluginHelpPageView.axaml new file mode 100644 index 000000000..f090b7f6f --- /dev/null +++ b/src/Artemis.UI/Screens/Plugins/Help/MarkdownPluginHelpPageView.axaml @@ -0,0 +1,27 @@ + + + + + + + + + diff --git a/src/Artemis.UI/Screens/Plugins/Help/MarkdownPluginHelpPageView.axaml.cs b/src/Artemis.UI/Screens/Plugins/Help/MarkdownPluginHelpPageView.axaml.cs new file mode 100644 index 000000000..dde34b97d --- /dev/null +++ b/src/Artemis.UI/Screens/Plugins/Help/MarkdownPluginHelpPageView.axaml.cs @@ -0,0 +1,17 @@ +using Avalonia.Controls; +using Avalonia.Markup.Xaml; + +namespace Artemis.UI.Screens.Plugins.Help; + +public partial class MarkdownPluginHelpPageView : UserControl +{ + public MarkdownPluginHelpPageView() + { + InitializeComponent(); + } + + private void InitializeComponent() + { + AvaloniaXamlLoader.Load(this); + } +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Plugins/Help/MarkdownPluginHelpPageViewModel.cs b/src/Artemis.UI/Screens/Plugins/Help/MarkdownPluginHelpPageViewModel.cs new file mode 100644 index 000000000..9f647b405 --- /dev/null +++ b/src/Artemis.UI/Screens/Plugins/Help/MarkdownPluginHelpPageViewModel.cs @@ -0,0 +1,40 @@ +using System.IO; +using System.Reactive.Disposables; +using System.Threading.Tasks; +using Artemis.Core; +using Artemis.UI.Shared; +using ReactiveUI; + +namespace Artemis.UI.Screens.Plugins.Help; + +public class MarkdownPluginHelpPageViewModel : ActivatableViewModelBase, IPluginHelpPage +{ + private string? _markdownText; + private readonly MarkdownPluginHelpPage _helpPage; + + public MarkdownPluginHelpPageViewModel(MarkdownPluginHelpPage helpPage) + { + _helpPage = helpPage; + this.WhenActivated(d => Load().DisposeWith(d)); + } + + public string? MarkdownText + { + get => _markdownText; + set => RaiseAndSetIfChanged(ref _markdownText, value); + } + + /// + public Plugin Plugin => _helpPage.Plugin; + + /// + public string Title => _helpPage.Title; + + /// + public string Id => _helpPage.Id; + + private async Task Load() + { + MarkdownText ??= await File.ReadAllTextAsync(_helpPage.MarkdownFile); + } +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Plugins/Help/PluginHelpWindowView.axaml b/src/Artemis.UI/Screens/Plugins/Help/PluginHelpWindowView.axaml new file mode 100644 index 000000000..49b9551ac --- /dev/null +++ b/src/Artemis.UI/Screens/Plugins/Help/PluginHelpWindowView.axaml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + diff --git a/src/Artemis.UI/Screens/Plugins/Help/PluginHelpWindowView.axaml.cs b/src/Artemis.UI/Screens/Plugins/Help/PluginHelpWindowView.axaml.cs new file mode 100644 index 000000000..0ccc2a611 --- /dev/null +++ b/src/Artemis.UI/Screens/Plugins/Help/PluginHelpWindowView.axaml.cs @@ -0,0 +1,21 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Markup.Xaml; + +namespace Artemis.UI.Screens.Plugins.Help; + +public partial class PluginHelpWindowView : Window +{ + public PluginHelpWindowView() + { + InitializeComponent(); +#if DEBUG + this.AttachDevTools(); +#endif + } + + private void InitializeComponent() + { + AvaloniaXamlLoader.Load(this); + } +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Plugins/Help/PluginHelpWindowViewModel.cs b/src/Artemis.UI/Screens/Plugins/Help/PluginHelpWindowViewModel.cs new file mode 100644 index 000000000..b9ad2b37c --- /dev/null +++ b/src/Artemis.UI/Screens/Plugins/Help/PluginHelpWindowViewModel.cs @@ -0,0 +1,32 @@ +using System.Collections.ObjectModel; +using System.Linq; +using Artemis.Core; +using Artemis.UI.Shared; + +namespace Artemis.UI.Screens.Plugins.Help; + +public class PluginHelpWindowViewModel : ActivatableViewModelBase +{ + private IPluginHelpPage? _selectedHelpPage; + + public PluginHelpWindowViewModel(Plugin plugin, string? preselectId) + { + Plugin = plugin; + DisplayName = $"{Plugin.Info.Name} | Help"; + + // Populate help pages by wrapping MarkdownHelpPages into a MarkdownHelpPageViewModel + // other types are used directly, up to them to implement a VM directly as well + HelpPages = new ReadOnlyCollection(plugin.HelpPages.Select(p => p is MarkdownPluginHelpPage m ? new MarkdownPluginHelpPageViewModel(m) : p).ToList()); + + _selectedHelpPage = preselectId != null ? HelpPages.FirstOrDefault(p => p.Id == preselectId) : HelpPages.FirstOrDefault(); + } + + public Plugin Plugin { get; } + public ReadOnlyCollection HelpPages { get; } + + public IPluginHelpPage? SelectedHelpPage + { + get => _selectedHelpPage; + set => RaiseAndSetIfChanged(ref _selectedHelpPage, value); + } +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Plugins/PluginSettingsViewModel.cs b/src/Artemis.UI/Screens/Plugins/PluginSettingsViewModel.cs index 9d3e64329..81d287b42 100644 --- a/src/Artemis.UI/Screens/Plugins/PluginSettingsViewModel.cs +++ b/src/Artemis.UI/Screens/Plugins/PluginSettingsViewModel.cs @@ -5,6 +5,7 @@ using System.Threading.Tasks; using Artemis.Core; using Artemis.Core.Services; using Artemis.UI.DryIoc.Factories; +using Artemis.UI.Screens.Plugins.Features; using Artemis.UI.Shared; using Artemis.UI.Shared.Services; using ReactiveUI; diff --git a/src/Artemis.UI/Screens/Plugins/PluginSettingsWindowView.axaml b/src/Artemis.UI/Screens/Plugins/PluginSettingsWindowView.axaml index 12dd5b763..a38d666b6 100644 --- a/src/Artemis.UI/Screens/Plugins/PluginSettingsWindowView.axaml +++ b/src/Artemis.UI/Screens/Plugins/PluginSettingsWindowView.axaml @@ -3,10 +3,12 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:windowing="clr-namespace:FluentAvalonia.UI.Windowing;assembly=FluentAvalonia" + xmlns:plugins="clr-namespace:Artemis.UI.Screens.Plugins" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="Artemis.UI.Screens.Plugins.PluginSettingsWindowView" + x:DataType="plugins:PluginSettingsWindowViewModel" Icon="/Assets/Images/Logo/application.ico" - Title="{Binding DisplayName}" + Title="{CompiledBinding DisplayName}" Width="800" Height="800" WindowStartupLocation="CenterOwner"> diff --git a/src/Artemis.UI/Screens/Plugins/PluginView.axaml b/src/Artemis.UI/Screens/Plugins/PluginView.axaml index 27c47a631..cae9c18ff 100644 --- a/src/Artemis.UI/Screens/Plugins/PluginView.axaml +++ b/src/Artemis.UI/Screens/Plugins/PluginView.axaml @@ -46,9 +46,9 @@ - - - + + + @@ -70,6 +70,7 @@ + @@ -81,19 +82,31 @@ - - - + + + + + + + + + + NavigateUri="{CompiledBinding Plugin.Info.Website}" + ToolTip.Tip="{CompiledBinding Plugin.Info.Website}"> + NavigateUri="{CompiledBinding Plugin.Info.Repository}" + ToolTip.Tip="{CompiledBinding Plugin.Info.Repository}"> diff --git a/src/Artemis.UI/Screens/Plugins/PluginViewModel.cs b/src/Artemis.UI/Screens/Plugins/PluginViewModel.cs index 35d37aa0e..7a52e391c 100644 --- a/src/Artemis.UI/Screens/Plugins/PluginViewModel.cs +++ b/src/Artemis.UI/Screens/Plugins/PluginViewModel.cs @@ -4,10 +4,12 @@ using System.Collections.ObjectModel; using System.Linq; using System.Reactive; using System.Reactive.Disposables; +using System.Reactive.Linq; using System.Threading.Tasks; using Artemis.Core; using Artemis.Core.Services; using Artemis.UI.Exceptions; +using Artemis.UI.Screens.Plugins.Help; using Artemis.UI.Shared; using Artemis.UI.Shared.Services; using Artemis.UI.Shared.Services.Builders; @@ -28,7 +30,8 @@ public class PluginViewModel : ActivatableViewModelBase private bool _canRemovePrerequisites; private bool _enabling; private Plugin _plugin; - private Window? _window; + private Window? _settingsWindow; + private Window? _helpWindow; public PluginViewModel(Plugin plugin, ReactiveCommand? reload, @@ -56,6 +59,7 @@ public class PluginViewModel : ActivatableViewModelBase Reload = reload; OpenSettings = ReactiveCommand.Create(ExecuteOpenSettings, this.WhenAnyValue(vm => vm.IsEnabled, e => e && Plugin.ConfigurationDialog != null)); + OpenHelp = ReactiveCommand.Create(ExecuteOpenHelp, this.WhenAnyValue(vm => vm.HasHelpPages)); RemoveSettings = ReactiveCommand.CreateFromTask(ExecuteRemoveSettings); Remove = ReactiveCommand.CreateFromTask(ExecuteRemove); InstallPrerequisites = ReactiveCommand.CreateFromTask(ExecuteInstallPrerequisites, this.WhenAnyValue(x => x.CanInstallPrerequisites)); @@ -72,13 +76,15 @@ public class PluginViewModel : ActivatableViewModelBase { Plugin.Enabled -= OnPluginToggled; Plugin.Disabled -= OnPluginToggled; - _window?.Close(); + _settingsWindow?.Close(); + _helpWindow?.Close(); }).DisposeWith(d); }); } public ReactiveCommand? Reload { get; } public ReactiveCommand OpenSettings { get; } + public ReactiveCommand OpenHelp { get; } public ReactiveCommand RemoveSettings { get; } public ReactiveCommand Remove { get; } public ReactiveCommand InstallPrerequisites { get; } @@ -102,6 +108,7 @@ public class PluginViewModel : ActivatableViewModelBase public string Type => Plugin.GetType().BaseType?.Name ?? Plugin.GetType().Name; public bool IsEnabled => Plugin.IsEnabled; + public bool HasHelpPages => Plugin.HelpPages.Any(); public bool CanInstallPrerequisites { @@ -199,10 +206,10 @@ public class PluginViewModel : ActivatableViewModelBase if (Plugin.ConfigurationDialog == null) return; - if (_window != null) + if (_settingsWindow != null) { - _window.WindowState = WindowState.Normal; - _window.Activate(); + _settingsWindow.WindowState = WindowState.Normal; + _settingsWindow.Activate(); return; } @@ -211,8 +218,8 @@ public class PluginViewModel : ActivatableViewModelBase if (Plugin.Resolve(Plugin.ConfigurationDialog.Type) is not PluginConfigurationViewModel viewModel) throw new ArtemisUIException($"The type of a plugin configuration dialog must inherit {nameof(PluginConfigurationViewModel)}"); - _window = _windowService.ShowWindow(new PluginSettingsWindowViewModel(viewModel)); - _window.Closed += (_, _) => _window = null; + _settingsWindow = _windowService.ShowWindow(new PluginSettingsWindowViewModel(viewModel)); + _settingsWindow.Closed += (_, _) => _settingsWindow = null; } catch (Exception e) { @@ -221,6 +228,30 @@ public class PluginViewModel : ActivatableViewModelBase } } + private void ExecuteOpenHelp() + { + if (Plugin.ConfigurationDialog == null) + return; + + if (_helpWindow != null) + { + _helpWindow.WindowState = WindowState.Normal; + _helpWindow.Activate(); + return; + } + + try + { + _helpWindow = _windowService.ShowWindow(new PluginHelpWindowViewModel(Plugin, null)); + _helpWindow.Closed += (_, _) => _helpWindow = null; + } + catch (Exception e) + { + _windowService.ShowExceptionDialog("An exception occured while trying to show the plugin's help window", e); + throw; + } + } + private void ExecuteOpenPluginDirectory() { try @@ -313,7 +344,7 @@ public class PluginViewModel : ActivatableViewModelBase { this.RaisePropertyChanged(nameof(IsEnabled)); if (!IsEnabled) - _window?.Close(); + _settingsWindow?.Close(); }); } } \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Plugins/PluginPrerequisiteActionView.axaml b/src/Artemis.UI/Screens/Plugins/Prerequisites/PluginPrerequisiteActionView.axaml similarity index 82% rename from src/Artemis.UI/Screens/Plugins/PluginPrerequisiteActionView.axaml rename to src/Artemis.UI/Screens/Plugins/Prerequisites/PluginPrerequisiteActionView.axaml index 0cc1745d7..d7a09a975 100644 --- a/src/Artemis.UI/Screens/Plugins/PluginPrerequisiteActionView.axaml +++ b/src/Artemis.UI/Screens/Plugins/Prerequisites/PluginPrerequisiteActionView.axaml @@ -3,9 +3,10 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:plugins="clr-namespace:Artemis.UI.Screens.Plugins" + xmlns:prerequisites="clr-namespace:Artemis.UI.Screens.Plugins.Prerequisites" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" - x:Class="Artemis.UI.Screens.Plugins.PluginPrerequisiteActionView" - x:DataType="plugins:PluginPrerequisiteActionViewModel"> + x:Class="Artemis.UI.Screens.Plugins.Prerequisites.PluginPrerequisiteActionView" + x:DataType="prerequisites:PluginPrerequisiteActionViewModel"> + x:Class="Artemis.UI.Screens.Plugins.Prerequisites.PluginPrerequisiteView" + x:DataType="prerequisites:PluginPrerequisiteViewModel"> diff --git a/src/Artemis.UI/Screens/Plugins/PluginPrerequisiteView.axaml.cs b/src/Artemis.UI/Screens/Plugins/Prerequisites/PluginPrerequisiteView.axaml.cs similarity index 65% rename from src/Artemis.UI/Screens/Plugins/PluginPrerequisiteView.axaml.cs rename to src/Artemis.UI/Screens/Plugins/Prerequisites/PluginPrerequisiteView.axaml.cs index 50cbd2c39..043fbce7b 100644 --- a/src/Artemis.UI/Screens/Plugins/PluginPrerequisiteView.axaml.cs +++ b/src/Artemis.UI/Screens/Plugins/Prerequisites/PluginPrerequisiteView.axaml.cs @@ -1,7 +1,6 @@ -using Avalonia.Markup.Xaml; -using Avalonia.ReactiveUI; +using Avalonia.ReactiveUI; -namespace Artemis.UI.Screens.Plugins; +namespace Artemis.UI.Screens.Plugins.Prerequisites; public partial class PluginPrerequisiteView : ReactiveUserControl { diff --git a/src/Artemis.UI/Screens/Plugins/PluginPrerequisiteViewModel.cs b/src/Artemis.UI/Screens/Plugins/Prerequisites/PluginPrerequisiteViewModel.cs similarity index 98% rename from src/Artemis.UI/Screens/Plugins/PluginPrerequisiteViewModel.cs rename to src/Artemis.UI/Screens/Plugins/Prerequisites/PluginPrerequisiteViewModel.cs index a9ed4a8b4..58cce5d2e 100644 --- a/src/Artemis.UI/Screens/Plugins/PluginPrerequisiteViewModel.cs +++ b/src/Artemis.UI/Screens/Plugins/Prerequisites/PluginPrerequisiteViewModel.cs @@ -8,7 +8,7 @@ using Artemis.Core; using Artemis.UI.Shared; using ReactiveUI; -namespace Artemis.UI.Screens.Plugins; +namespace Artemis.UI.Screens.Plugins.Prerequisites; public class PluginPrerequisiteViewModel : ActivatableViewModelBase {