From c8d38995677eba17b437fd4adbdc8b09131b00ed Mon Sep 17 00:00:00 2001 From: Ezio Date: Thu, 10 Jul 2025 19:20:14 -0600 Subject: [PATCH 1/5] add export to uninstall plugin --- info.toml | 1 + src/Export.as | 4 ++++ src/Update.as | 25 +++++++++++++++++++++++++ 3 files changed, 30 insertions(+) create mode 100644 src/Export.as diff --git a/info.toml b/info.toml index a0d63e7..8cc2acc 100644 --- a/info.toml +++ b/info.toml @@ -6,4 +6,5 @@ essential = true [script] dependencies = [ "Controls" ] +exports = [ "src/Export.as" ] timeout = 0 diff --git a/src/Export.as b/src/Export.as new file mode 100644 index 0000000..4497e6e --- /dev/null +++ b/src/Export.as @@ -0,0 +1,4 @@ +namespace PluginManager +{ + import void PluginUninstallAsync(ref@ metaPlugin) from "PluginManager"; +} diff --git a/src/Update.as b/src/Update.as index ccb59f7..e37da0c 100644 --- a/src/Update.as +++ b/src/Update.as @@ -1,3 +1,28 @@ +namespace PluginManager +{ + void PluginUninstallAsync(ref@ metaPlugin) { + auto plugin = cast(metaPlugin); + if (plugin is null) { + error("tried to uninstall a plugin but it was null!"); + return; + } + + // Grab ID now since handle will be invalid after uninstalling + const string id = plugin.ID; + + ::PluginUninstallAsync(metaPlugin); + + // Make sure plugin tab (if open) updates correctly + for (int i = g_window.m_tabs.Length - 1; i >= 0; i--) { + auto tab = cast(g_window.m_tabs[i]); + if (tab !is null && tab.m_plugin !is null && tab.m_plugin.m_id == id) { + tab.m_plugin.CheckIfInstalled(); + break; + } + } + } +} + void PluginUninstallAsync(ref@ metaPlugin) { auto plugin = cast(metaPlugin); From 94da3e9bb827ff2862f9e8bae54b3304a701511d Mon Sep 17 00:00:00 2001 From: Ezio Date: Thu, 10 Jul 2025 19:26:57 -0600 Subject: [PATCH 2/5] clean up a little --- src/Update.as | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Update.as b/src/Update.as index e37da0c..18ea26b 100644 --- a/src/Update.as +++ b/src/Update.as @@ -1,6 +1,7 @@ namespace PluginManager { - void PluginUninstallAsync(ref@ metaPlugin) { + void PluginUninstallAsync(ref@ metaPlugin) + { auto plugin = cast(metaPlugin); if (plugin is null) { error("tried to uninstall a plugin but it was null!"); @@ -11,6 +12,8 @@ namespace PluginManager const string id = plugin.ID; ::PluginUninstallAsync(metaPlugin); + @metaPlugin = null; + @plugin = null; // Make sure plugin tab (if open) updates correctly for (int i = g_window.m_tabs.Length - 1; i >= 0; i--) { From 364dcb4977125a98aa0c1090d8de3c17a169e125 Mon Sep 17 00:00:00 2001 From: Ezio Date: Thu, 10 Jul 2025 19:30:53 -0600 Subject: [PATCH 3/5] add synchronous uninstall function --- src/Export.as | 1 + src/Update.as | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/src/Export.as b/src/Export.as index 4497e6e..2a3a3d4 100644 --- a/src/Export.as +++ b/src/Export.as @@ -1,4 +1,5 @@ namespace PluginManager { + import void PluginUninstall(Meta::Plugin@ plugin) from "PluginManager"; import void PluginUninstallAsync(ref@ metaPlugin) from "PluginManager"; } diff --git a/src/Update.as b/src/Update.as index 18ea26b..9327fb0 100644 --- a/src/Update.as +++ b/src/Update.as @@ -1,5 +1,10 @@ namespace PluginManager { + void PluginUninstall(Meta::Plugin@ plugin) + { + startnew(PluginUninstallAsync, plugin); + } + void PluginUninstallAsync(ref@ metaPlugin) { auto plugin = cast(metaPlugin); From f7f9a2357e4b97c8041ddc2e3545e3fed4703d7b Mon Sep 17 00:00:00 2001 From: Ezio Date: Fri, 11 Jul 2025 13:50:47 -0600 Subject: [PATCH 4/5] remove async export, add comment, use tabs --- src/Export.as | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Export.as b/src/Export.as index 2a3a3d4..37a5b27 100644 --- a/src/Export.as +++ b/src/Export.as @@ -1,5 +1,8 @@ namespace PluginManager { - import void PluginUninstall(Meta::Plugin@ plugin) from "PluginManager"; - import void PluginUninstallAsync(ref@ metaPlugin) from "PluginManager"; + /* + Queues a plugin for deletion. Note that this will invalidate the plugin object + passed in on the next frame! Do not use the Plugin handle after calling this! + */ + import void PluginUninstall(Meta::Plugin@ plugin) from "PluginManager"; } From 7558b32534a816c29399df8a5095e0d5d3490fd1 Mon Sep 17 00:00:00 2001 From: Ezio Date: Fri, 11 Jul 2025 13:51:04 -0600 Subject: [PATCH 5/5] move export code to new file --- src/ExportImpl.as | 32 ++++++++++++++++++++++++++++++++ src/Update.as | 33 --------------------------------- 2 files changed, 32 insertions(+), 33 deletions(-) create mode 100644 src/ExportImpl.as diff --git a/src/ExportImpl.as b/src/ExportImpl.as new file mode 100644 index 0000000..d7230b0 --- /dev/null +++ b/src/ExportImpl.as @@ -0,0 +1,32 @@ +namespace PluginManager +{ + void PluginUninstall(Meta::Plugin@ plugin) + { + startnew(PluginUninstallAsync, plugin); + } + + void PluginUninstallAsync(ref@ metaPlugin) + { + auto plugin = cast(metaPlugin); + if (plugin is null) { + error("tried to uninstall a plugin but it was null!"); + return; + } + + // Grab ID now since handle will be invalid after uninstalling + const string id = plugin.ID; + + ::PluginUninstallAsync(metaPlugin); + @metaPlugin = null; + @plugin = null; + + // Make sure plugin tab (if open) updates correctly + for (int i = g_window.m_tabs.Length - 1; i >= 0; i--) { + auto tab = cast(g_window.m_tabs[i]); + if (tab !is null && tab.m_plugin !is null && tab.m_plugin.m_id == id) { + tab.m_plugin.CheckIfInstalled(); + break; + } + } + } +} diff --git a/src/Update.as b/src/Update.as index 9327fb0..ccb59f7 100644 --- a/src/Update.as +++ b/src/Update.as @@ -1,36 +1,3 @@ -namespace PluginManager -{ - void PluginUninstall(Meta::Plugin@ plugin) - { - startnew(PluginUninstallAsync, plugin); - } - - void PluginUninstallAsync(ref@ metaPlugin) - { - auto plugin = cast(metaPlugin); - if (plugin is null) { - error("tried to uninstall a plugin but it was null!"); - return; - } - - // Grab ID now since handle will be invalid after uninstalling - const string id = plugin.ID; - - ::PluginUninstallAsync(metaPlugin); - @metaPlugin = null; - @plugin = null; - - // Make sure plugin tab (if open) updates correctly - for (int i = g_window.m_tabs.Length - 1; i >= 0; i--) { - auto tab = cast(g_window.m_tabs[i]); - if (tab !is null && tab.m_plugin !is null && tab.m_plugin.m_id == id) { - tab.m_plugin.CheckIfInstalled(); - break; - } - } - } -} - void PluginUninstallAsync(ref@ metaPlugin) { auto plugin = cast(metaPlugin);