From 0959a9ea482a09277958a0485fe9fffbd4360ad2 Mon Sep 17 00:00:00 2001
From: Jerric <58122205+Ivinedra@users.noreply.github.com>
Date: Thu, 25 Dec 2025 01:46:25 -0500
Subject: [PATCH 1/3] Additional installed plugin categories
Introduces new plugin categories for enabled, disabled, and incompatible plugins in PluginCategoryManager and PluginInstallerWindow. Updates filtering logic, UI strings, and groupings to support these new categories, allowing users to view plugins by their enabled/disabled/incompatible status.
---
.../Internal/PluginCategoryManager.cs | 26 ++++++++++++++-
.../PluginInstaller/PluginInstallerWindow.cs | 33 +++++++++++++++++++
2 files changed, 58 insertions(+), 1 deletion(-)
diff --git a/Dalamud/Interface/Internal/PluginCategoryManager.cs b/Dalamud/Interface/Internal/PluginCategoryManager.cs
index d3aea7f57..c25f55634 100644
--- a/Dalamud/Interface/Internal/PluginCategoryManager.cs
+++ b/Dalamud/Interface/Internal/PluginCategoryManager.cs
@@ -30,6 +30,9 @@ internal class PluginCategoryManager
new(CategoryKind.PluginChangelogs, "special.plugins", () => Locs.Category_Plugins),
new(CategoryKind.PluginProfiles, "special.profiles", () => Locs.Category_PluginProfiles),
new(CategoryKind.UpdateablePlugins, "special.updateable", () => Locs.Category_UpdateablePlugins),
+ new(CategoryKind.EnabledPlugins, "special.enabled", () => Locs.Category_EnabledPlugins),
+ new(CategoryKind.DisabledPlugins, "special.disabled", () => Locs.Category_DisabledPlugins),
+ new(CategoryKind.IncompatiblePlugins, "special.incompatible", () => Locs.Category_IncompatiblePlugins),
// Tag-driven categories
new(CategoryKind.Other, "other", () => Locs.Category_Other),
@@ -47,7 +50,7 @@ internal class PluginCategoryManager
private GroupInfo[] groupList =
[
new(GroupKind.DevTools, () => Locs.Group_DevTools, CategoryKind.DevInstalled, CategoryKind.IconTester),
- new(GroupKind.Installed, () => Locs.Group_Installed, CategoryKind.All, CategoryKind.IsTesting, CategoryKind.UpdateablePlugins, CategoryKind.PluginProfiles),
+ new(GroupKind.Installed, () => Locs.Group_Installed, CategoryKind.All, CategoryKind.IsTesting, CategoryKind.UpdateablePlugins, CategoryKind.PluginProfiles, CategoryKind.EnabledPlugins, CategoryKind.DisabledPlugins, CategoryKind.IncompatiblePlugins),
new(GroupKind.Available, () => Locs.Group_Available, CategoryKind.All),
new(GroupKind.Changelog, () => Locs.Group_Changelog, CategoryKind.All, CategoryKind.DalamudChangelogs, CategoryKind.PluginChangelogs)
@@ -142,6 +145,21 @@ internal class PluginCategoryManager
///
UpdateablePlugins = 15,
+ ///
+ /// Enabled plugins.
+ ///
+ EnabledPlugins = 16,
+
+ ///
+ /// Disabled plugins.
+ ///
+ DisabledPlugins = 17,
+
+ ///
+ /// Incompatible plugins.
+ ///
+ IncompatiblePlugins = 18,
+
///
/// Plugins tagged as "other".
///
@@ -555,6 +573,12 @@ internal class PluginCategoryManager
public static string Category_PluginProfiles => Loc.Localize("InstallerCategoryPluginProfiles", "Plugin Collections");
public static string Category_UpdateablePlugins => Loc.Localize("InstallerCategoryCanBeUpdated", "Can be updated");
+
+ public static string Category_EnabledPlugins => Loc.Localize("InstallerCategoryEnabledPlugins", "Enabled");
+
+ public static string Category_DisabledPlugins => Loc.Localize("InstallerCategoryDisabledPlugins", "Disabled");
+
+ public static string Category_IncompatiblePlugins => Loc.Localize("InstallerCategoryIncompatiblePlugins", "Incompatible");
public static string Category_Other => Loc.Localize("InstallerCategoryOther", "Other");
diff --git a/Dalamud/Interface/Internal/Windows/PluginInstaller/PluginInstallerWindow.cs b/Dalamud/Interface/Internal/Windows/PluginInstaller/PluginInstallerWindow.cs
index 3241015fc..72fed787d 100644
--- a/Dalamud/Interface/Internal/Windows/PluginInstaller/PluginInstallerWindow.cs
+++ b/Dalamud/Interface/Internal/Windows/PluginInstaller/PluginInstallerWindow.cs
@@ -235,6 +235,9 @@ internal class PluginInstallerWindow : Window, IDisposable
Testing,
Updateable,
Dev,
+ Enabled,
+ Disabled,
+ Incompatible,
}
private bool AnyOperationInProgress => this.installStatus == OperationStatus.InProgress ||
@@ -1453,6 +1456,15 @@ internal class PluginInstallerWindow : Window, IDisposable
if (filter == InstalledPluginListFilter.Testing && !manager.HasTestingOptIn(plugin.Manifest))
continue;
+ if (filter == InstalledPluginListFilter.Enabled && (!plugin.IsWantedByAnyProfile || plugin.IsOutdated || plugin.IsBanned || plugin.IsOrphaned || plugin.IsDecommissioned))
+ continue;
+
+ if (filter == InstalledPluginListFilter.Disabled && (plugin.IsWantedByAnyProfile || plugin.IsOutdated || plugin.IsBanned || plugin.IsOrphaned || plugin.IsDecommissioned))
+ continue;
+
+ if (filter == InstalledPluginListFilter.Incompatible && !(plugin.IsOutdated || plugin.IsBanned || plugin.IsOrphaned || plugin.IsDecommissioned))
+ continue;
+
// Find applicable update and manifest, if we have them
AvailablePluginUpdate? update = null;
RemotePluginManifest? remoteManifest = null;
@@ -1485,6 +1497,9 @@ internal class PluginInstallerWindow : Window, IDisposable
InstalledPluginListFilter.Testing => Locs.TabBody_NoPluginsTesting,
InstalledPluginListFilter.Updateable => Locs.TabBody_NoPluginsUpdateable,
InstalledPluginListFilter.Dev => Locs.TabBody_NoPluginsDev,
+ InstalledPluginListFilter.Enabled => Locs.TabBody_NoPluginsEnabled,
+ InstalledPluginListFilter.Disabled => Locs.TabBody_NoPluginsDisabled,
+ InstalledPluginListFilter.Incompatible => Locs.TabBody_NoPluginsIncompatible,
_ => throw new ArgumentException(null, nameof(filter)),
};
@@ -1725,6 +1740,18 @@ internal class PluginInstallerWindow : Window, IDisposable
this.DrawInstalledPluginList(InstalledPluginListFilter.Updateable);
break;
+ case PluginCategoryManager.CategoryKind.EnabledPlugins:
+ this.DrawInstalledPluginList(InstalledPluginListFilter.Enabled);
+ break;
+
+ case PluginCategoryManager.CategoryKind.DisabledPlugins:
+ this.DrawInstalledPluginList(InstalledPluginListFilter.Disabled);
+ break;
+
+ case PluginCategoryManager.CategoryKind.IncompatiblePlugins:
+ this.DrawInstalledPluginList(InstalledPluginListFilter.Incompatible);
+ break;
+
case PluginCategoryManager.CategoryKind.PluginProfiles:
this.profileManagerWidget.Draw();
break;
@@ -4097,6 +4124,12 @@ internal class PluginInstallerWindow : Window, IDisposable
public static string TabBody_NoPluginsDev => Loc.Localize("InstallerNoPluginsDev", "You don't have any dev plugins. Add them from the settings.");
+ public static string TabBody_NoPluginsEnabled => Loc.Localize("InstallerNoPluginsEnabled", "You don't have any enabled plugins.");
+
+ public static string TabBody_NoPluginsDisabled => Loc.Localize("InstallerNoPluginsDisabled", "You don't have any disabled plugins.");
+
+ public static string TabBody_NoPluginsIncompatible => Loc.Localize("InstallerNoPluginsIncompatible", "You don't have any incompatible plugins.");
+
#endregion
#region Search text
From 902795d6f963526b2e33fc55c151bb265f37e3da Mon Sep 17 00:00:00 2001
From: Jerric <58122205+Ivinedra@users.noreply.github.com>
Date: Thu, 25 Dec 2025 01:46:25 -0500
Subject: [PATCH 2/3] Additional installed plugin categories
Introduces new plugin categories for enabled, disabled, and incompatible plugins in PluginCategoryManager and PluginInstallerWindow. Updates filtering logic, UI strings, and groupings to support these new categories, allowing users to view plugins by their enabled/disabled/incompatible status.
---
.../Internal/PluginCategoryManager.cs | 26 ++++++++++++++-
.../PluginInstaller/PluginInstallerWindow.cs | 33 +++++++++++++++++++
2 files changed, 58 insertions(+), 1 deletion(-)
diff --git a/Dalamud/Interface/Internal/PluginCategoryManager.cs b/Dalamud/Interface/Internal/PluginCategoryManager.cs
index d3aea7f57..c25f55634 100644
--- a/Dalamud/Interface/Internal/PluginCategoryManager.cs
+++ b/Dalamud/Interface/Internal/PluginCategoryManager.cs
@@ -30,6 +30,9 @@ internal class PluginCategoryManager
new(CategoryKind.PluginChangelogs, "special.plugins", () => Locs.Category_Plugins),
new(CategoryKind.PluginProfiles, "special.profiles", () => Locs.Category_PluginProfiles),
new(CategoryKind.UpdateablePlugins, "special.updateable", () => Locs.Category_UpdateablePlugins),
+ new(CategoryKind.EnabledPlugins, "special.enabled", () => Locs.Category_EnabledPlugins),
+ new(CategoryKind.DisabledPlugins, "special.disabled", () => Locs.Category_DisabledPlugins),
+ new(CategoryKind.IncompatiblePlugins, "special.incompatible", () => Locs.Category_IncompatiblePlugins),
// Tag-driven categories
new(CategoryKind.Other, "other", () => Locs.Category_Other),
@@ -47,7 +50,7 @@ internal class PluginCategoryManager
private GroupInfo[] groupList =
[
new(GroupKind.DevTools, () => Locs.Group_DevTools, CategoryKind.DevInstalled, CategoryKind.IconTester),
- new(GroupKind.Installed, () => Locs.Group_Installed, CategoryKind.All, CategoryKind.IsTesting, CategoryKind.UpdateablePlugins, CategoryKind.PluginProfiles),
+ new(GroupKind.Installed, () => Locs.Group_Installed, CategoryKind.All, CategoryKind.IsTesting, CategoryKind.UpdateablePlugins, CategoryKind.PluginProfiles, CategoryKind.EnabledPlugins, CategoryKind.DisabledPlugins, CategoryKind.IncompatiblePlugins),
new(GroupKind.Available, () => Locs.Group_Available, CategoryKind.All),
new(GroupKind.Changelog, () => Locs.Group_Changelog, CategoryKind.All, CategoryKind.DalamudChangelogs, CategoryKind.PluginChangelogs)
@@ -142,6 +145,21 @@ internal class PluginCategoryManager
///
UpdateablePlugins = 15,
+ ///
+ /// Enabled plugins.
+ ///
+ EnabledPlugins = 16,
+
+ ///
+ /// Disabled plugins.
+ ///
+ DisabledPlugins = 17,
+
+ ///
+ /// Incompatible plugins.
+ ///
+ IncompatiblePlugins = 18,
+
///
/// Plugins tagged as "other".
///
@@ -555,6 +573,12 @@ internal class PluginCategoryManager
public static string Category_PluginProfiles => Loc.Localize("InstallerCategoryPluginProfiles", "Plugin Collections");
public static string Category_UpdateablePlugins => Loc.Localize("InstallerCategoryCanBeUpdated", "Can be updated");
+
+ public static string Category_EnabledPlugins => Loc.Localize("InstallerCategoryEnabledPlugins", "Enabled");
+
+ public static string Category_DisabledPlugins => Loc.Localize("InstallerCategoryDisabledPlugins", "Disabled");
+
+ public static string Category_IncompatiblePlugins => Loc.Localize("InstallerCategoryIncompatiblePlugins", "Incompatible");
public static string Category_Other => Loc.Localize("InstallerCategoryOther", "Other");
diff --git a/Dalamud/Interface/Internal/Windows/PluginInstaller/PluginInstallerWindow.cs b/Dalamud/Interface/Internal/Windows/PluginInstaller/PluginInstallerWindow.cs
index 3241015fc..72fed787d 100644
--- a/Dalamud/Interface/Internal/Windows/PluginInstaller/PluginInstallerWindow.cs
+++ b/Dalamud/Interface/Internal/Windows/PluginInstaller/PluginInstallerWindow.cs
@@ -235,6 +235,9 @@ internal class PluginInstallerWindow : Window, IDisposable
Testing,
Updateable,
Dev,
+ Enabled,
+ Disabled,
+ Incompatible,
}
private bool AnyOperationInProgress => this.installStatus == OperationStatus.InProgress ||
@@ -1453,6 +1456,15 @@ internal class PluginInstallerWindow : Window, IDisposable
if (filter == InstalledPluginListFilter.Testing && !manager.HasTestingOptIn(plugin.Manifest))
continue;
+ if (filter == InstalledPluginListFilter.Enabled && (!plugin.IsWantedByAnyProfile || plugin.IsOutdated || plugin.IsBanned || plugin.IsOrphaned || plugin.IsDecommissioned))
+ continue;
+
+ if (filter == InstalledPluginListFilter.Disabled && (plugin.IsWantedByAnyProfile || plugin.IsOutdated || plugin.IsBanned || plugin.IsOrphaned || plugin.IsDecommissioned))
+ continue;
+
+ if (filter == InstalledPluginListFilter.Incompatible && !(plugin.IsOutdated || plugin.IsBanned || plugin.IsOrphaned || plugin.IsDecommissioned))
+ continue;
+
// Find applicable update and manifest, if we have them
AvailablePluginUpdate? update = null;
RemotePluginManifest? remoteManifest = null;
@@ -1485,6 +1497,9 @@ internal class PluginInstallerWindow : Window, IDisposable
InstalledPluginListFilter.Testing => Locs.TabBody_NoPluginsTesting,
InstalledPluginListFilter.Updateable => Locs.TabBody_NoPluginsUpdateable,
InstalledPluginListFilter.Dev => Locs.TabBody_NoPluginsDev,
+ InstalledPluginListFilter.Enabled => Locs.TabBody_NoPluginsEnabled,
+ InstalledPluginListFilter.Disabled => Locs.TabBody_NoPluginsDisabled,
+ InstalledPluginListFilter.Incompatible => Locs.TabBody_NoPluginsIncompatible,
_ => throw new ArgumentException(null, nameof(filter)),
};
@@ -1725,6 +1740,18 @@ internal class PluginInstallerWindow : Window, IDisposable
this.DrawInstalledPluginList(InstalledPluginListFilter.Updateable);
break;
+ case PluginCategoryManager.CategoryKind.EnabledPlugins:
+ this.DrawInstalledPluginList(InstalledPluginListFilter.Enabled);
+ break;
+
+ case PluginCategoryManager.CategoryKind.DisabledPlugins:
+ this.DrawInstalledPluginList(InstalledPluginListFilter.Disabled);
+ break;
+
+ case PluginCategoryManager.CategoryKind.IncompatiblePlugins:
+ this.DrawInstalledPluginList(InstalledPluginListFilter.Incompatible);
+ break;
+
case PluginCategoryManager.CategoryKind.PluginProfiles:
this.profileManagerWidget.Draw();
break;
@@ -4097,6 +4124,12 @@ internal class PluginInstallerWindow : Window, IDisposable
public static string TabBody_NoPluginsDev => Loc.Localize("InstallerNoPluginsDev", "You don't have any dev plugins. Add them from the settings.");
+ public static string TabBody_NoPluginsEnabled => Loc.Localize("InstallerNoPluginsEnabled", "You don't have any enabled plugins.");
+
+ public static string TabBody_NoPluginsDisabled => Loc.Localize("InstallerNoPluginsDisabled", "You don't have any disabled plugins.");
+
+ public static string TabBody_NoPluginsIncompatible => Loc.Localize("InstallerNoPluginsIncompatible", "You don't have any incompatible plugins.");
+
#endregion
#region Search text
From f95dde1fcbc73f8278e695a8a34d60d3b5ccafaa Mon Sep 17 00:00:00 2001
From: Jerric <58122205+Ivinedra@users.noreply.github.com>
Date: Sat, 10 Jan 2026 07:56:43 -0500
Subject: [PATCH 3/3] Update PluginCategoryManager.cs
---
Dalamud/Interface/Internal/PluginCategoryManager.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Dalamud/Interface/Internal/PluginCategoryManager.cs b/Dalamud/Interface/Internal/PluginCategoryManager.cs
index 8a3db3bcd..9fdcfe4c1 100644
--- a/Dalamud/Interface/Internal/PluginCategoryManager.cs
+++ b/Dalamud/Interface/Internal/PluginCategoryManager.cs
@@ -51,7 +51,7 @@ internal class PluginCategoryManager
private GroupInfo[] groupList =
[
new(GroupKind.DevTools, () => Locs.Group_DevTools, CategoryKind.DevInstalled, CategoryKind.IconTester),
- new(GroupKind.Installed, () => Locs.Group_Installed, CategoryKind.All, CategoryKind.IsTesting, CategoryKind.UpdateablePlugins, CategoryKind.PluginProfiles, CategoryKind.EnabledPlugins, CategoryKind.DisabledPlugins, CategoryKind.IncompatiblePlugins),
+ new(GroupKind.Installed, () => Locs.Group_Installed, CategoryKind.All, CategoryKind.IsTesting, CategoryKind.UpdateablePlugins, CategoryKind.EnabledPlugins, CategoryKind.DisabledPlugins, CategoryKind.IncompatiblePlugins, CategoryKind.PluginProfiles),
new(GroupKind.Available, () => Locs.Group_Available, CategoryKind.All),
new(GroupKind.Changelog, () => Locs.Group_Changelog, CategoryKind.All, CategoryKind.DalamudChangelogs, CategoryKind.PluginChangelogs)