feat: move plugin update into separate function, add update button to applicable available plugin

This commit is contained in:
goat 2021-07-15 03:42:10 +02:00
parent 83edcc583f
commit 12adc4099f
No known key found for this signature in database
GPG key ID: F18F057873895461
2 changed files with 92 additions and 66 deletions

View file

@ -591,8 +591,9 @@ namespace Dalamud.Interface.Internal.Windows
label += Locs.PluginTitleMod_UnloadError; label += Locs.PluginTitleMod_UnloadError;
} }
var availablePluginUpdate = this.pluginListUpdatable.FirstOrDefault(up => up.InstalledPlugin == plugin);
// Update available // Update available
if (this.pluginListUpdatable.FirstOrDefault(up => up.InstalledPlugin == plugin) != default) if (availablePluginUpdate != default)
{ {
label += Locs.PluginTitleMod_HasUpdate; label += Locs.PluginTitleMod_HasUpdate;
} }
@ -676,6 +677,9 @@ namespace Dalamud.Interface.Internal.Windows
this.DrawDevPluginButtons(plugin); this.DrawDevPluginButtons(plugin);
this.DrawVisitRepoUrlButton(plugin.Manifest.RepoUrl); this.DrawVisitRepoUrlButton(plugin.Manifest.RepoUrl);
if (availablePluginUpdate != default)
this.DrawUpdateSinglePluginButton(plugin, availablePluginUpdate);
ImGui.SameLine(); ImGui.SameLine();
ImGui.TextColored(ImGuiColors.DalamudGrey3, $" v{plugin.Manifest.AssemblyVersion}"); ImGui.TextColored(ImGuiColors.DalamudGrey3, $" v{plugin.Manifest.AssemblyVersion}");
@ -776,6 +780,19 @@ namespace Dalamud.Interface.Internal.Windows
} }
} }
private void DrawUpdateSinglePluginButton(LocalPlugin plugin, AvailablePluginUpdate update)
{
ImGui.SameLine();
if (ImGuiComponents.IconButton(FontAwesomeIcon.Download))
{
this.dalamud.PluginManager.UpdateSinglePlugin(update, false);
}
if (ImGui.IsItemHovered())
ImGui.SetTooltip(Locs.PluginButtonToolTip_UpdateSingle(update.UpdateManifest.AssemblyVersion.ToString()));
}
private void DrawOpenPluginSettingsButton(LocalPlugin plugin) private void DrawOpenPluginSettingsButton(LocalPlugin plugin)
{ {
if (plugin.DalamudInterface?.UiBuilder?.HasConfigUi ?? false) if (plugin.DalamudInterface?.UiBuilder?.HasConfigUi ?? false)
@ -1130,6 +1147,8 @@ namespace Dalamud.Interface.Internal.Windows
public static string PluginButtonToolTip_VisitPluginUrl => Loc.Localize("InstallerVisitPluginUrl", "Visit plugin URL"); public static string PluginButtonToolTip_VisitPluginUrl => Loc.Localize("InstallerVisitPluginUrl", "Visit plugin URL");
public static string PluginButtonToolTip_UpdateSingle(string version) => Loc.Localize("InstallerUpdateSingle", "Update to {0}").Format(version);
#endregion #endregion
#region Footer #region Footer

View file

@ -17,6 +17,7 @@ using Dalamud.Game.Text;
using Dalamud.Plugin.Internal.Exceptions; using Dalamud.Plugin.Internal.Exceptions;
using Dalamud.Plugin.Internal.Types; using Dalamud.Plugin.Internal.Types;
using HarmonyLib; using HarmonyLib;
using JetBrains.Annotations;
using Newtonsoft.Json; using Newtonsoft.Json;
namespace Dalamud.Plugin.Internal namespace Dalamud.Plugin.Internal
@ -599,37 +600,51 @@ namespace Dalamud.Plugin.Internal
{ {
Log.Information("Starting plugin update"); Log.Information("Starting plugin update");
var listChanged = false;
var updatedList = new List<PluginUpdateStatus>(); var updatedList = new List<PluginUpdateStatus>();
// Prevent collection was modified errors // Prevent collection was modified errors
for (var i = 0; i < this.updatablePlugins.Count; i++) for (var i = 0; i < this.updatablePlugins.Count; i++)
{ {
var metadata = this.updatablePlugins[i]; updatedList.Add(this.UpdateSinglePlugin(this.updatablePlugins[i], dryRun));
}
this.NotifyInstalledPluginsChanged();
Log.Information("Plugin update OK.");
return updatedList;
}
/// <summary>
/// Update a single plugin, provided a valid <see cref="AvailablePluginUpdate"/>.
/// </summary>
/// <param name="metadata">The available plugin update.</param>
/// <param name="dryRun">Whether or not to actually perform the update, or just indicate success.</param>
/// <returns>The status of the update.</returns>
[CanBeNull]
public PluginUpdateStatus UpdateSinglePlugin(AvailablePluginUpdate metadata, bool dryRun)
{
var plugin = metadata.InstalledPlugin; var plugin = metadata.InstalledPlugin;
// Can't update that! // Can't update that!
if (plugin is LocalDevPlugin) if (plugin is LocalDevPlugin)
continue; return null;
var updateStatus = new PluginUpdateStatus() var updateStatus = new PluginUpdateStatus
{ {
InternalName = plugin.Manifest.InternalName, InternalName = plugin.Manifest.InternalName,
Name = plugin.Manifest.Name, Name = plugin.Manifest.Name,
Version = metadata.UseTesting Version = metadata.UseTesting ? metadata.UpdateManifest.TestingAssemblyVersion : metadata.UpdateManifest.AssemblyVersion
? metadata.UpdateManifest.TestingAssemblyVersion
: metadata.UpdateManifest.AssemblyVersion,
}; };
if (dryRun) if (dryRun)
{ {
updateStatus.WasUpdated = true; updateStatus.WasUpdated = true;
updatedList.Add(updateStatus);
} }
else else
{ {
updateStatus.WasUpdated = true;
// Unload if loaded // Unload if loaded
if (plugin.State == PluginState.Loaded || plugin.State == PluginState.LoadError) if (plugin.State == PluginState.Loaded || plugin.State == PluginState.LoadError)
{ {
@ -640,7 +655,7 @@ namespace Dalamud.Plugin.Internal
catch (Exception ex) catch (Exception ex)
{ {
Log.Error(ex, "Error during unload (update)"); Log.Error(ex, "Error during unload (update)");
continue; updateStatus.WasUpdated = false;
} }
} }
@ -648,33 +663,25 @@ namespace Dalamud.Plugin.Internal
{ {
plugin.Disable(); plugin.Disable();
this.installedPlugins.Remove(plugin); this.installedPlugins.Remove(plugin);
listChanged = true;
} }
catch (Exception ex) catch (Exception ex)
{ {
Log.Error(ex, "Error during disable (update)"); Log.Error(ex, "Error during disable (update)");
continue; updateStatus.WasUpdated = false;
} }
try try
{ {
this.InstallPlugin(metadata.UpdateManifest, metadata.UseTesting, PluginLoadReason.Update); this.InstallPlugin(metadata.UpdateManifest, metadata.UseTesting, PluginLoadReason.Update);
listChanged = true;
} }
catch (Exception ex) catch (Exception ex)
{ {
Log.Error(ex, "Error during install (update)"); Log.Error(ex, "Error during install (update)");
continue; updateStatus.WasUpdated = false;
}
} }
} }
if (listChanged) return updateStatus;
this.NotifyInstalledPluginsChanged();
Log.Information("Plugin update OK.");
return updatedList;
} }
/// <summary> /// <summary>