From 3060a9a63d84773395059bf55d9f3ab9bf00dc92 Mon Sep 17 00:00:00 2001 From: Salvador Cipolla Date: Sun, 14 Dec 2025 23:41:23 -0300 Subject: [PATCH] Allow to hide installed mods --- Knossos.NET/Classes/ModTags.cs | 26 +++++++++++++ Knossos.NET/Models/GlobalSettings.cs | 14 ++++++- Knossos.NET/ViewModels/ModListViewModel.cs | 37 ++++++++++++++++--- .../Windows/ModSettingsViewModel.cs | 21 +++++++++++ .../Views/Windows/ModSettingsView.axaml | 5 +++ 5 files changed, 97 insertions(+), 6 deletions(-) diff --git a/Knossos.NET/Classes/ModTags.cs b/Knossos.NET/Classes/ModTags.cs index 2a7ef542..2c3537b1 100644 --- a/Knossos.NET/Classes/ModTags.cs +++ b/Knossos.NET/Classes/ModTags.cs @@ -27,6 +27,11 @@ public void AddFilter(string filter) Filters.Add(filter); } + public void RemoveFilter(string filter) + { + Filters.Remove(filter); + } + /// /// Check if a filter exist in this modid filterlist /// Case insensitive @@ -95,6 +100,7 @@ public static class ModTags /// public enum Filters { + Hidden, Total_Conversion, Retail_FS2, FS2_MOD, @@ -199,6 +205,26 @@ public static void AddModFilter(string id, string filter) } } + /// + /// Removes a mod filter + /// + /// + /// + public static void RemoveModFilter(string id, string filter) + { + for (int i = 0; i < modTags.Count(); i++) + { + if (modTags[i].ModID == id) + { + if (modTags[i].FilterExist(filter)) + { + modTags[i].RemoveFilter(filter); + break; + } + } + } + } + /// /// Adds a mod tag to the list /// If the id and tag dosent exist already diff --git a/Knossos.NET/Models/GlobalSettings.cs b/Knossos.NET/Models/GlobalSettings.cs index 23604de3..45129d52 100644 --- a/Knossos.NET/Models/GlobalSettings.cs +++ b/Knossos.NET/Models/GlobalSettings.cs @@ -11,6 +11,8 @@ using Knossos.NET.ViewModels; using System.Threading.Tasks; using System.Collections.Generic; +using System.Linq; +using Knossos.NET.Views; namespace Knossos.NET.Models { @@ -121,6 +123,8 @@ public AutoUpdateFsoBuilds(bool stable = false, bool rc = false, bool nightly = public AutoUpdateFsoBuilds autoUpdateBuilds { get; set; } = new AutoUpdateFsoBuilds(); [JsonPropertyName("warn_new_settings_system")] public bool warnNewSettingsSystem { get; set; } = true; + [JsonPropertyName("hidden_mod_ids")] + public List hiddenModIds { get; set; } = new List(); [JsonIgnore] private bool _closeToTray { get; set; } = false; [JsonPropertyName("close_to_tray")] @@ -686,7 +690,15 @@ public void Load() portableFsoPreferences = tempSettings.portableFsoPreferences; closeToTray = tempSettings.closeToTray; ignoredLauncherUpdates = tempSettings.ignoredLauncherUpdates; - + hiddenModIds = tempSettings.hiddenModIds; + if (hiddenModIds.Any()) + { + foreach (var hiddenMod in hiddenModIds) + { + ModTags.AddModFilter(hiddenMod, "Hidden"); + } + MainWindowViewModel.Instance?.InstalledModsView?.ResetFilters(); + } ReadFS2IniValues(); Log.Add(Log.LogSeverity.Information, "GlobalSettings.Load()", "Global settings have been loaded"); diff --git a/Knossos.NET/ViewModels/ModListViewModel.cs b/Knossos.NET/ViewModels/ModListViewModel.cs index 5c54f4ea..7bb349b9 100644 --- a/Knossos.NET/ViewModels/ModListViewModel.cs +++ b/Knossos.NET/ViewModels/ModListViewModel.cs @@ -108,15 +108,32 @@ private void ApplyFilters() } } //Filters - if (visibility && MainWindowViewModel.Instance != null && MainWindowViewModel.Instance.tagFilter.Any()) + if (ModTags.IsFilterPresentInModID(card.ID, "Hidden")) { visibility = false; - foreach (var filter in MainWindowViewModel.Instance.tagFilter) + if (MainWindowViewModel.Instance != null && MainWindowViewModel.Instance.tagFilter.FirstOrDefault(f => f == "Hidden") != null) { - if (card.ID != null && ModTags.IsFilterPresentInModID(card.ID, filter)) + visibility = true; + } + } + else + { + if (MainWindowViewModel.Instance != null && MainWindowViewModel.Instance.tagFilter.Any()) + { + visibility = false; + foreach (var filter in MainWindowViewModel.Instance.tagFilter) { - visibility = true; - break; + if(filter == "Hidden") + { + if(MainWindowViewModel.Instance.tagFilter.Count == 1) + visibility = true; + continue; + } + if (card.ID != null && ModTags.IsFilterPresentInModID(card.ID, filter)) + { + visibility = true; + break; + } } } } @@ -203,6 +220,16 @@ public void OpenTab() BuildFilterString(); } + /// + /// Reset currently selected filters + /// + public void ResetFilters() + { + ModListView.Instance?.GenerateFilterButtons(); + MainWindowViewModel.Instance?.tagFilter.Clear(); + ApplyFilters(); + } + public void CloseTab() { if (MainWindowViewModel.Instance != null) diff --git a/Knossos.NET/ViewModels/Windows/ModSettingsViewModel.cs b/Knossos.NET/ViewModels/Windows/ModSettingsViewModel.cs index d6570302..b9e00cc9 100644 --- a/Knossos.NET/ViewModels/Windows/ModSettingsViewModel.cs +++ b/Knossos.NET/ViewModels/Windows/ModSettingsViewModel.cs @@ -57,6 +57,8 @@ public partial class ModSettingsViewModel : ViewModelBase internal bool noIngameOptions = false; [ObservableProperty] internal bool ingameOptionsFileExist = false; + [ObservableProperty] + internal bool userHidden = false; public ModSettingsViewModel() { @@ -95,6 +97,8 @@ public ModSettingsViewModel(Mod modJson, ModCardViewModel? modCard=null) compressed = modJson.modSettings.isCompressed; ignoreGlobalCmd = modJson.modSettings.ignoreGlobalCmd; noIngameOptions = modJson.modSettings.noIngameOptions; + if (ModTags.IsFilterPresentInModID(modJson.id, "Hidden")) + UserHidden = true; if (Knossos.globalSettings.modCompression != CompressionSettings.Disabled && !modJson.modSettings.isCompressed) { compressionAvailable = true; @@ -346,7 +350,24 @@ internal void SaveSettingsCommand() modJson.modSettings.ignoreGlobalCmd = IgnoreGlobalCmd; modJson.modSettings.noIngameOptions = NoIngameOptions; + var oldUserHidden = ModTags.IsFilterPresentInModID(modJson.id, "Hidden"); + if (UserHidden) + { + ModTags.AddModFilter(modJson.id, "Hidden"); + if(!Knossos.globalSettings.hiddenModIds.Contains(modJson.id)) + Knossos.globalSettings.hiddenModIds.Add(modJson.id); + } + else + { + ModTags.RemoveModFilter(modJson.id, "Hidden"); + Knossos.globalSettings.hiddenModIds.Remove(modJson.id); + } + if (oldUserHidden != UserHidden) + { + MainWindowViewModel.Instance?.InstalledModsView?.ResetFilters(); + Knossos.globalSettings.Save(); + } modJson.modSettings.Save(); if(modCardViewModel != null) { diff --git a/Knossos.NET/Views/Windows/ModSettingsView.axaml b/Knossos.NET/Views/Windows/ModSettingsView.axaml index b072766c..d5efa073 100644 --- a/Knossos.NET/Views/Windows/ModSettingsView.axaml +++ b/Knossos.NET/Views/Windows/ModSettingsView.axaml @@ -34,6 +34,11 @@ + + + + Hidden by default +