mirror of
https://github.com/space-syndicate/space-station-14.git
synced 2026-10-09 10:21:18 +03:00
124 lines
4 KiB
C#
124 lines
4 KiB
C#
using System.Linq;
|
|
using Content.Client.Lobby.UI.Roles;
|
|
using Content.Client.Stylesheets;
|
|
using Content.Shared.Traits;
|
|
using Robust.Client.UserInterface.Controls;
|
|
using Robust.Shared.Utility;
|
|
|
|
namespace Content.Client.Lobby.UI;
|
|
|
|
public sealed partial class HumanoidProfileEditor
|
|
{
|
|
|
|
/// <summary>
|
|
/// Refreshes traits selector
|
|
/// </summary>
|
|
public void RefreshTraits()
|
|
{
|
|
TraitsList.RemoveAllChildren();
|
|
|
|
var traits = _prototypeManager.EnumeratePrototypes<TraitPrototype>().OrderBy(t => Loc.GetString(t.Name)).ToList();
|
|
// TabContainer.SetTabTitle(3, Loc.GetString("humanoid-profile-editor-traits-tab")); // Corvax-TTS-Edit
|
|
|
|
if (traits.Count < 1)
|
|
{
|
|
TraitsList.AddChild(new Label
|
|
{
|
|
Text = Loc.GetString("humanoid-profile-editor-no-traits"),
|
|
FontColorOverride = Color.Gray,
|
|
});
|
|
return;
|
|
}
|
|
|
|
// Setup model
|
|
Dictionary<string, List<string>> traitGroups = new();
|
|
List<string> defaultTraits = new();
|
|
traitGroups.Add(TraitCategoryPrototype.Default, defaultTraits);
|
|
|
|
foreach (var trait in traits)
|
|
{
|
|
if (trait.Category == null)
|
|
{
|
|
defaultTraits.Add(trait.ID);
|
|
continue;
|
|
}
|
|
|
|
if (!_prototypeManager.HasIndex(trait.Category))
|
|
continue;
|
|
|
|
var group = traitGroups.GetOrNew(trait.Category);
|
|
group.Add(trait.ID);
|
|
}
|
|
|
|
// Create UI view from model
|
|
foreach (var (categoryId, categoryTraits) in traitGroups)
|
|
{
|
|
TraitCategoryPrototype? category = null;
|
|
|
|
if (categoryId != TraitCategoryPrototype.Default)
|
|
{
|
|
category = _prototypeManager.Index<TraitCategoryPrototype>(categoryId);
|
|
// Label
|
|
TraitsList.AddChild(new Label
|
|
{
|
|
Text = Loc.GetString(category.Name),
|
|
Margin = new Thickness(0, 10, 0, 0),
|
|
StyleClasses = { StyleClass.LabelHeading },
|
|
});
|
|
}
|
|
|
|
List<TraitPreferenceSelector?> selectors = new();
|
|
var selectionCount = 0;
|
|
|
|
foreach (var traitProto in categoryTraits)
|
|
{
|
|
var trait = _prototypeManager.Index<TraitPrototype>(traitProto);
|
|
var selector = new TraitPreferenceSelector(trait);
|
|
|
|
selector.Preference = Profile?.TraitPreferences.Contains(trait.ID) == true;
|
|
if (selector.Preference)
|
|
selectionCount += trait.Cost;
|
|
|
|
selector.PreferenceChanged += preference =>
|
|
{
|
|
if (preference)
|
|
{
|
|
Profile = Profile?.WithTraitPreference(trait.ID, _prototypeManager);
|
|
}
|
|
else
|
|
{
|
|
Profile = Profile?.WithoutTraitPreference(trait.ID, _prototypeManager);
|
|
}
|
|
|
|
SetDirty();
|
|
RefreshTraits(); // If too many traits are selected, they will be reset to the real value.
|
|
};
|
|
selectors.Add(selector);
|
|
}
|
|
|
|
// Selection counter
|
|
if (category is { MaxTraitPoints: >= 0 })
|
|
{
|
|
TraitsList.AddChild(new Label
|
|
{
|
|
Text = Loc.GetString("humanoid-profile-editor-trait-count-hint", ("current", selectionCount), ("max", category.MaxTraitPoints)),
|
|
FontColorOverride = Color.Gray
|
|
});
|
|
}
|
|
|
|
foreach (var selector in selectors)
|
|
{
|
|
if (selector == null)
|
|
continue;
|
|
|
|
if (category is { MaxTraitPoints: >= 0 } &&
|
|
selector.Cost + selectionCount > category.MaxTraitPoints)
|
|
{
|
|
selector.Checkbox.Label.FontColorOverride = Color.Red;
|
|
}
|
|
|
|
TraitsList.AddChild(selector);
|
|
}
|
|
}
|
|
}
|
|
}
|