From 9b55bf4847cdb94cf2fafb8ea23c952b5f3d7e57 Mon Sep 17 00:00:00 2001 From: Maplewheels Date: Sun, 1 Mar 2026 06:03:31 -0500 Subject: [PATCH] [Save/Sync] Work on the settings menu. --- .../Services/ModsGameplaySettingsMenu.cs | 86 ++++++++++++++++--- .../LuaCsForBarotrauma/Texts/English.xml | 13 ++- 2 files changed, 82 insertions(+), 17 deletions(-) diff --git a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/ModsGameplaySettingsMenu.cs b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/ModsGameplaySettingsMenu.cs index 7db7ae74f..18c209c22 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/ModsGameplaySettingsMenu.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/ModsGameplaySettingsMenu.cs @@ -1,4 +1,5 @@ -using System.Collections.Immutable; +using System; +using System.Collections.Immutable; using Microsoft.Xna.Framework; using System.Linq; using Barotrauma.LuaCs.Data; @@ -8,6 +9,11 @@ namespace Barotrauma.LuaCs; internal sealed class ModsGameplaySettingsMenu : ModsSettingsMenu { private readonly ImmutableArray _settingsInstancesGameplay; + // menu vars + private GUILayoutGroup _modCategoryDisplayGroup, _settingsDisplayGroup; + private string _selectedSearchQuery = string.Empty; + private ContentPackage _selectedContentPackage; + private string _selectedCategory = string.Empty; public ModsGameplaySettingsMenu(GUIFrame contentFrame, IPackageManagementService packageManagementService, @@ -47,30 +53,84 @@ internal sealed class ModsGameplaySettingsMenu : ModsSettingsMenu // main display area var settingsContentAreaGroup = new GUILayoutGroup(new RectTransform(new Vector2(1f, 0.90f), contentAreaLayoutGroup.RectTransform, Anchor.BottomCenter)); GUIUtil.Spacer(settingsContentAreaGroup, Vector2.One); - var (modCategoryDisplayGroup, settingsDisplayGroup) = GUIUtil.CreateSidebars(settingsContentAreaGroup, true); - modCategoryDisplayGroup.RectTransform.RelativeSize = new Vector2(0.3f, 1f); - settingsDisplayGroup.RectTransform.RelativeSize = new Vector2(0.7f, 1f); + (_modCategoryDisplayGroup, _settingsDisplayGroup) = GUIUtil.CreateSidebars(settingsContentAreaGroup, true); + _modCategoryDisplayGroup.RectTransform.RelativeSize = new Vector2(0.3f, 1f); + _settingsDisplayGroup.RectTransform.RelativeSize = new Vector2(0.7f, 1f); - // Mods & Category Selectors - var cpList = packageManagementService.GetAllLoadedPackages().OrderBy(cp => cp.Name == "Vanilla" ? 0 : 1).ThenBy(cp => cp.Name).ToList(); - var modSelectDropDown = GUIUtil.Dropdown(modCategoryDisplayGroup, cp => cp.Name == "Vanilla" ? "All" : cp.Name, null, cpList, cpList[0], cp => - { - // TODO: apply filter text - }, Vector2.One, 2); + GenerateCategoryListDisplay(_modCategoryDisplayGroup, GetDisplayCategoriesList()); + GenerateSettingsListDisplay(_settingsDisplayGroup, GetDisplaySettingsList()); void GenerateDisplayFromFilter(string text) { - + _selectedSearchQuery = text; + GenerateCategoryListDisplay(_modCategoryDisplayGroup, GetDisplayCategoriesList()); + GenerateSettingsListDisplay(_settingsDisplayGroup, GetDisplaySettingsList()); } - void GenerateCategoryListDisplay(GUILayoutGroup layoutGroup, ImmutableArray settings) + ImmutableArray GetDisplayCategoriesList() { + return _settingsInstancesGameplay + .Select(s => s.GetDisplayInfo().DisplayCategory) + .Distinct() + .ToImmutableArray(); + } + ImmutableArray GetDisplaySettingsList() + { + return _settingsInstancesGameplay + .Where(s => _selectedCategory.IsNullOrWhiteSpace() + || s.GetDisplayInfo().DisplayCategory == _selectedCategory) + .Where(s => _selectedContentPackage is null + || s.OwnerPackage == _selectedContentPackage) + .ToImmutableArray(); + } + + void GenerateCategoryListDisplay(GUILayoutGroup layoutGroup, ImmutableArray categoryIdents) + { + layoutGroup.ClearChildren(); + + var packages = _settingsInstancesGameplay.Select(s => s.OwnerPackage) + .Distinct() + .OrderBy(cp => cp.Name) + .ToImmutableArray(); + var packageSelectionList = GUIUtil.Dropdown(layoutGroup, cp => cp.Name, null, + packages, packages[0], cp => + { + _selectedContentPackage = cp; + _selectedCategory = string.Empty; + GenerateCategoryListDisplay(_modCategoryDisplayGroup, GetDisplayCategoriesList()); + GenerateSettingsListDisplay(_settingsDisplayGroup, GetDisplaySettingsList()); + }, new Vector2(1f, 0.07f)); + var containerBox = new GUIListBox(new RectTransform(new Vector2(1f, 0.93f), layoutGroup.RectTransform)); + float size_y = MathF.Max(categoryIdents.Length * 0.122f, 1f); + var displayedCategoriesFrame = new GUIFrame(new RectTransform(new Vector2(1f, size_y), containerBox.Content.RectTransform), style: null, color: Color.Black) + { + CanBeFocused = false + }; + var displayCategoriesLayout = new GUILayoutGroup(new RectTransform(Vector2.One, displayedCategoriesFrame.RectTransform)); + + foreach (var category in categoryIdents) + { + DebugConsole.Log(category); + new GUIButton(new RectTransform(new Vector2(1f, 0.122f), displayCategoriesLayout.RectTransform), text: TextManager.Get(category)) + { + CanBeFocused = true, + CanBeSelected = true, + OnPressed = () => + { + _selectedCategory = category; + GenerateSettingsListDisplay(_settingsDisplayGroup, GetDisplaySettingsList()); + return true; + } + }; + } + + } void GenerateSettingsListDisplay(GUILayoutGroup layoutGroup, ImmutableArray settings) { - + } } diff --git a/Barotrauma/BarotraumaShared/LocalMods/LuaCsForBarotrauma/Texts/English.xml b/Barotrauma/BarotraumaShared/LocalMods/LuaCsForBarotrauma/Texts/English.xml index 982c44b0b..1700c861f 100644 --- a/Barotrauma/BarotraumaShared/LocalMods/LuaCsForBarotrauma/Texts/English.xml +++ b/Barotrauma/BarotraumaShared/LocalMods/LuaCsForBarotrauma/Texts/English.xml @@ -2,8 +2,13 @@ Mod Controls Settings Mod Gameplay Settings - Suppress GUI Popup on Error - Are C# Mods Allowed - Hide Local OS Account Name In Logs - Where to Save Local Data + + Suppress GUI Popup on Error + General + Are C# Mods Allowed + General + Hide Local OS Account Name In Logs + General + Where to Save Local Data + General