diff --git a/Dalamud/Interface/Internal/PluginCategoryManager.cs b/Dalamud/Interface/Internal/PluginCategoryManager.cs index 2b7f0f354..9fdcfe4c1 100644 --- a/Dalamud/Interface/Internal/PluginCategoryManager.cs +++ b/Dalamud/Interface/Internal/PluginCategoryManager.cs @@ -31,6 +31,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), @@ -48,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), + 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) @@ -143,6 +146,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 d132f0d8d..dd11dd8b5 100644 --- a/Dalamud/Interface/Internal/Windows/PluginInstaller/PluginInstallerWindow.cs +++ b/Dalamud/Interface/Internal/Windows/PluginInstaller/PluginInstallerWindow.cs @@ -236,6 +236,9 @@ internal class PluginInstallerWindow : Window, IDisposable Testing, Updateable, Dev, + Enabled, + Disabled, + Incompatible, } private bool AnyOperationInProgress => this.installStatus == OperationStatus.InProgress || @@ -1454,6 +1457,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; @@ -1486,6 +1498,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)), }; @@ -1726,6 +1741,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; @@ -4098,6 +4125,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