diff --git a/src/DesktopMagic/DataContexts/PluginEntryDataContext.cs b/src/DesktopMagic/DataContexts/PluginEntryDataContext.cs index 66401c7..51edbbb 100644 --- a/src/DesktopMagic/DataContexts/PluginEntryDataContext.cs +++ b/src/DesktopMagic/DataContexts/PluginEntryDataContext.cs @@ -1,14 +1,18 @@ -using DesktopMagic.Plugins; +using DesktopMagic.Helpers; +using DesktopMagic.Plugins; + +using MaterialDesignThemes.Wpf; using System; using System.ComponentModel; +using System.Diagnostics; using System.Runtime.CompilerServices; using System.Windows; using System.Windows.Input; namespace DesktopMagic.DataContexts; -internal class PluginEntryDataContext(PluginMetadata pluginMetadata, ICommand command, bool installed = false) : INotifyPropertyChanged +internal class PluginEntryDataContext(PluginMetadata pluginMetadata, ICommand command, string? buttonText = "") : INotifyPropertyChanged { public event PropertyChangedEventHandler? PropertyChanged; @@ -18,18 +22,26 @@ internal class PluginEntryDataContext(PluginMetadata pluginMetadata, ICommand co public string? Description => pluginMetadata.Description; + public string Author => pluginMetadata.Author ?? "Unknown"; + + public string? Version => pluginMetadata.Version ?? "Unknown"; + public string? Logo => pluginMetadata.IconUri?.ToString(); - public DateTime? FormattedDateAdded => pluginMetadata.Added; - public DateTime? FormattedDateUpdated => pluginMetadata.Updated; + public DateTime? DateAdded => pluginMetadata.Added; + public DateTime? DateUpdated => pluginMetadata.Updated; public uint Id => pluginMetadata.Id; + public string? ButtonText => buttonText; + public ICommand Command => command; - public Visibility InstallButtonVisibility => installed ? Visibility.Collapsed : Visibility.Visible; + public ButtonData InstallUninstallButtonData => new(ButtonText ?? "Install", true, Command); + public ButtonData OpenModioButtonData => new("modio", true, new CommandHandler(OpenModioPage)); - public Visibility RemoveButtonVisibility => installed ? Visibility.Visible : Visibility.Collapsed; + + public Visibility ButtonVisibility => string.IsNullOrWhiteSpace(buttonText) ? Visibility.Collapsed : Visibility.Visible; public bool IsVisible { @@ -41,11 +53,25 @@ internal class PluginEntryDataContext(PluginMetadata pluginMetadata, ICommand co OnPropertyChanged(nameof(Visibility)); } } + public MaterialDesignThemes.Wpf.PackIconKind IconKind => MaterialDesignThemes.Wpf.PackIconKind.Information; public Visibility Visibility => IsVisible ? Visibility.Visible : Visibility.Collapsed; + private void OpenModioPage() + { + ProcessStartInfo psi = new ProcessStartInfo + { + UseShellExecute = true, + FileName = pluginMetadata.ProfileUri?.ToString() + }; + + _ = Process.Start(psi); + } + private void OnPropertyChanged([CallerMemberName] string? propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } + + public record ButtonData(PackIconKind IconKind, string Text, bool IsEnabled, ICommand Command); } \ No newline at end of file diff --git a/src/DesktopMagic/Plugins/ModEntry.xaml b/src/DesktopMagic/Plugins/ModEntry.xaml index 820c8b9..bb4f653 100644 --- a/src/DesktopMagic/Plugins/ModEntry.xaml +++ b/src/DesktopMagic/Plugins/ModEntry.xaml @@ -14,8 +14,9 @@ Visibility="{Binding Visibility}"> - - + + + @@ -23,20 +24,39 @@ - + - - + + + diff --git a/src/DesktopMagic/Plugins/PluginManager.xaml.cs b/src/DesktopMagic/Plugins/PluginManager.xaml.cs index e13ee50..64cf929 100644 --- a/src/DesktopMagic/Plugins/PluginManager.xaml.cs +++ b/src/DesktopMagic/Plugins/PluginManager.xaml.cs @@ -97,7 +97,7 @@ public partial class PluginManager : Window if (pluginMetadata is not null) { - pluginManagerDataContext.InstalledPlugins.Add(new PluginEntryDataContext(pluginMetadata, new CommandHandler(() => Remove(pluginPath, pluginMetadata.Id)), true)); + pluginManagerDataContext.InstalledPlugins.Add(new PluginEntryDataContext(pluginMetadata, new CommandHandler(() => Remove(pluginPath, pluginMetadata.Id)), "Uninstall")); _ = pluginIds.Add(pluginMetadata.Id); } } @@ -112,7 +112,7 @@ public partial class PluginManager : Window continue; } - pluginManagerDataContext.AllPlugins.Add(new PluginEntryDataContext(new(mod), new CommandHandler(async () => await Install(mod)))); + pluginManagerDataContext.AllPlugins.Add(new PluginEntryDataContext(new(mod), new CommandHandler(async () => await Install(mod)), "Install")); } pluginManagerDataContext.IsLoading = false; @@ -168,7 +168,7 @@ public partial class PluginManager : Window _ = pluginManagerDataContext.AllPlugins.Remove(pluginEntryDataContext); } - pluginManagerDataContext.InstalledPlugins.Add(new PluginEntryDataContext(new PluginMetadata(mod), new CommandHandler(() => Remove(pluginPath, mod.Id)), true)); + pluginManagerDataContext.InstalledPlugins.Add(new PluginEntryDataContext(new PluginMetadata(mod), new CommandHandler(() => Remove(pluginPath, mod.Id)), "Uninstall")); pluginManagerDataContext.IsLoading = false; } @@ -228,7 +228,7 @@ public partial class PluginManager : Window continue; } - pluginManagerDataContext.AllPlugins.Add(new PluginEntryDataContext(new(mod), new CommandHandler(async () => await Install(mod)))); + pluginManagerDataContext.AllPlugins.Add(new PluginEntryDataContext(new(mod), new CommandHandler(async () => await Install(mod)), "Install")); } pluginManagerDataContext.IsSearching = false; diff --git a/src/DesktopMagic/Plugins/PluginMetadata.cs b/src/DesktopMagic/Plugins/PluginMetadata.cs index b4c9b3e..00d64c4 100644 --- a/src/DesktopMagic/Plugins/PluginMetadata.cs +++ b/src/DesktopMagic/Plugins/PluginMetadata.cs @@ -15,12 +15,16 @@ public class PluginMetadata public Uri? IconUri { get; set; } + public Uri? ProfileUri { get; set; } + public DateTime? Added { get; set; } public DateTime? Updated { get; set; } public string? Description { get; set; } + public string? Summary { get; set; } + public string? Version { get; set; } public PluginMetadata(Mod mod) @@ -29,9 +33,11 @@ public class PluginMetadata Id = mod.Id; Author = mod.SubmittedBy?.Username; IconUri = mod.Logo?.Thumb320x180; + ProfileUri = mod.ProfileUrl; Added = DateTimeOffset.FromUnixTimeSeconds(mod.DateAdded).DateTime; Updated = DateTimeOffset.FromUnixTimeSeconds(mod.DateUpdated).DateTime; Description = mod.DescriptionPlaintext; + Summary = mod.Summary; Version = mod.Modfile?.Version; }