212 lines
6.5 KiB
C#
212 lines
6.5 KiB
C#
using System;
|
|
using System.Collections.ObjectModel;
|
|
using System.ComponentModel;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using Glitonea.Mvvm;
|
|
using Glitonea.Mvvm.Messaging;
|
|
using Saradomin.Infrastructure;
|
|
using Saradomin.Infrastructure.Services;
|
|
using Saradomin.Model;
|
|
using Saradomin.View.Windows;
|
|
|
|
namespace Saradomin.ViewModel.Controls
|
|
{
|
|
public class PluginManagerViewModel : ViewModelBase
|
|
{
|
|
private readonly IPluginManagementService _pluginManagementService;
|
|
private readonly IPluginDownloadService _pluginDownloadService;
|
|
|
|
public bool IsTransactionInProgress { get; private set; }
|
|
public ObservableCollection<PluginInfo> PluginList { get; private set; } = new();
|
|
public string CurrentStatusMessage { get; set; } = "Idle...";
|
|
|
|
public PluginManagerViewModel(
|
|
IPluginManagementService pluginManagementService,
|
|
IPluginDownloadService pluginDownloadService)
|
|
{
|
|
_pluginManagementService = pluginManagementService;
|
|
_pluginDownloadService = pluginDownloadService;
|
|
|
|
Message.Subscribe<MainViewLoadedMessage>(this, MainViewLoaded);
|
|
|
|
PropertyChanged += ViewModelPropertyChanged;
|
|
}
|
|
|
|
public async Task RefreshPluginCollections()
|
|
{
|
|
PluginList.Clear();
|
|
|
|
var remotePlugins =await _pluginDownloadService.GetAllMetadata(
|
|
_pluginManagementService.PluginRepositoryPath,
|
|
false,
|
|
false
|
|
);
|
|
|
|
PluginList = new ObservableCollection<PluginInfo>(remotePlugins.OrderByDescending(x => x.Installed));
|
|
}
|
|
|
|
public async Task InstallRemotePlugin(object parameter)
|
|
{
|
|
if (parameter is not PluginInfo pluginInfo)
|
|
return;
|
|
|
|
if (IsTransactionInProgress)
|
|
return;
|
|
|
|
try
|
|
{
|
|
IsTransactionInProgress = true;
|
|
|
|
UpdateStatusMessage($"Installing {pluginInfo.Name}...");
|
|
|
|
await _pluginDownloadService.DownloadPluginFiles(
|
|
pluginInfo.Name,
|
|
_pluginManagementService.PluginRepositoryPath
|
|
);
|
|
|
|
await RefreshPluginCollections();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
NotificationBox.DisplayNotification(
|
|
"Error",
|
|
$"Plugin installation failed: {e.Message}"
|
|
);
|
|
}
|
|
finally
|
|
{
|
|
IsTransactionInProgress = false;
|
|
}
|
|
}
|
|
|
|
public async Task UninstallLocalPlugin(object parameter)
|
|
{
|
|
if (parameter is not PluginInfo pluginInfo)
|
|
return;
|
|
|
|
if (IsTransactionInProgress)
|
|
return;
|
|
|
|
try
|
|
{
|
|
IsTransactionInProgress = true;
|
|
|
|
UpdateStatusMessage($"Uninstalling {pluginInfo.Name}...");
|
|
|
|
await _pluginManagementService.UninstallPlugin(pluginInfo.Name);
|
|
pluginInfo.Installed = false;
|
|
|
|
PluginList = new(PluginList.OrderByDescending(x => x.Installed));
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
NotificationBox.DisplayNotification(
|
|
"Error",
|
|
$"Plugin removal failed: {e.Message}"
|
|
);
|
|
}
|
|
finally
|
|
{
|
|
IsTransactionInProgress = false;
|
|
}
|
|
}
|
|
|
|
public async Task CheckForUpdates()
|
|
{
|
|
if (IsTransactionInProgress)
|
|
return;
|
|
|
|
|
|
try
|
|
{
|
|
IsTransactionInProgress = true;
|
|
|
|
UpdateStatusMessage($"Checking for updates...");
|
|
|
|
var updatablePlugins = await _pluginDownloadService.GetAllMetadata(
|
|
_pluginManagementService.PluginRepositoryPath,
|
|
true,
|
|
true
|
|
);
|
|
|
|
foreach (var plugin in updatablePlugins)
|
|
{
|
|
PluginList.Remove(PluginList.First(x => x.Name == plugin.Name));
|
|
PluginList.Add(plugin);
|
|
}
|
|
|
|
PluginList = new(PluginList.OrderByDescending(x => x.Installed));
|
|
}
|
|
finally
|
|
{
|
|
IsTransactionInProgress = false;
|
|
}
|
|
}
|
|
|
|
public async Task UpdateLocalPlugin(object parameter)
|
|
{
|
|
if (parameter is not PluginInfo pluginInfo)
|
|
return;
|
|
|
|
if (IsTransactionInProgress)
|
|
return;
|
|
|
|
try
|
|
{
|
|
IsTransactionInProgress = true;
|
|
|
|
UpdateStatusMessage($"Updating {pluginInfo.Name}...");
|
|
|
|
await _pluginDownloadService.DownloadPluginFiles(pluginInfo.Name, _pluginManagementService.PluginRepositoryPath);
|
|
await RefreshPluginCollections();
|
|
|
|
var newInfo = PluginList.First(x => x.Name == pluginInfo.Name);
|
|
if (newInfo.Version != pluginInfo.Version)
|
|
{
|
|
NotificationBox.DisplayNotification(
|
|
"Success!",
|
|
$"Successfully updated {pluginInfo.Name} to version {newInfo.Version}!"
|
|
);
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
NotificationBox.DisplayNotification(
|
|
"Error",
|
|
$"Plugin update failed: {e.Message}"
|
|
);
|
|
}
|
|
finally
|
|
{
|
|
IsTransactionInProgress = false;
|
|
}
|
|
}
|
|
|
|
private void UpdateStatusMessage(string message)
|
|
{
|
|
CurrentStatusMessage = message;
|
|
}
|
|
|
|
private async void MainViewLoaded(MainViewLoadedMessage _)
|
|
{
|
|
await RefreshPluginCollections();
|
|
}
|
|
|
|
private void ViewModelPropertyChanged(object sender, PropertyChangedEventArgs e)
|
|
{
|
|
switch (e.PropertyName)
|
|
{
|
|
case nameof(IsTransactionInProgress):
|
|
{
|
|
if (!IsTransactionInProgress)
|
|
{
|
|
UpdateStatusMessage("Idle...");
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |