Files
space-station-14/Content.Client/Humanoid/LayerMarkingPicker.xaml.cs
pathetic meowmeow 8cf744ec55 Visual nubody (humanoid appearance refactor) (#42476)
* initial visual nubody

* oops overlay

* im so pheeming rn

* conversion...

* tests

* comeback of the underwear

* oops eyes

* blabbl

* zeds

* yaml linted

* search and visible count constraints

* reordering

* preserve previously selected markings colors

* fix test

* some ui niceties

* ordering

* make DB changes backwards-compatible/downgrade-friendly

* fix things again

* fix migration

* vulpkanin markings limit increase

* wrapping

* code cleanup and more code cleanup and more code cleanup and more code cleanup and

* fix slop ports

* better sampling API

* make filter work + use the method i made for its intended purpose

* fix test fails real quick

* magic mirror cleanup, remove TODO

* don't 0-init the organ profile data

* remove deltastates

---------

Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com>
2026-01-20 07:07:53 +00:00

114 lines
3.4 KiB
C#

using System.Linq;
using Content.Client.UserInterface.ControlExtensions;
using Content.Client.Guidebook.Controls;
using Content.Shared.Body;
using Content.Shared.Humanoid;
using Content.Shared.Humanoid.Markings;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Prototypes;
namespace Content.Client.Humanoid;
[GenerateTypedNameReferences]
public sealed partial class LayerMarkingPicker : BoxContainer
{
private readonly IReadOnlyDictionary<string, MarkingPrototype> _allMarkings;
private readonly ProtoId<OrganCategoryPrototype> _organ;
private readonly HumanoidVisualLayers _layer;
private readonly MarkingsViewModel _markingsModel;
private List<ISearchableControl> _searchable = new();
private const int _columnWidth = 500;
public LayerMarkingPicker(MarkingsViewModel markingsModel, ProtoId<OrganCategoryPrototype> organ, HumanoidVisualLayers layer, IReadOnlyDictionary<string, MarkingPrototype> allMarkings)
{
RobustXamlLoader.Load(this);
_markingsModel = markingsModel;
_allMarkings = allMarkings;
_organ = organ;
_layer = layer;
OrderingItems.AddChild(new LayerMarkingOrderer(markingsModel, organ, layer));
UpdateMarkings();
SearchBar.OnTextChanged += _ =>
{
foreach (var element in _searchable)
{
element.SetHiddenState(true, SearchBar.Text.Trim());
}
};
UpdateCount();
ReorderButton.OnPressed += ReorderButtonPressed;
}
protected override void EnteredTree()
{
base.EnteredTree();
_markingsModel.MarkingsReset += UpdateCount;
_markingsModel.MarkingsChanged += MarkingsChanged;
}
protected override void ExitedTree()
{
base.ExitedTree();
_markingsModel.MarkingsReset -= UpdateCount;
_markingsModel.MarkingsChanged -= MarkingsChanged;
}
private void MarkingsChanged(ProtoId<OrganCategoryPrototype> organ, HumanoidVisualLayers layer)
{
if (_organ != organ || _layer != layer)
return;
UpdateCount();
}
private void UpdateMarkings()
{
foreach (var marking in _allMarkings.Values.OrderBy(marking => Loc.GetString($"marking-{marking.ID}")))
{
var item = new LayerMarkingItem(_markingsModel, _organ, _layer, marking, true);
Items.AddChild(item);
}
_searchable = Items.GetSearchableControls();
}
private void UpdateCount()
{
_markingsModel.GetMarkingCounts(_organ, _layer, out var isRequired, out var count, out var selected);
MarkingsStatus.Text = Loc.GetString("markings-limits", ("required", isRequired), ("count", count), ("selectable", count - selected));
}
private void ReorderButtonPressed(BaseButton.ButtonEventArgs args)
{
if (ReorderButton.Pressed)
{
SelectionItems.Visible = false;
SearchBar.Visible = false;
OrderingItems.Visible = true;
}
else
{
SelectionItems.Visible = true;
SearchBar.Visible = true;
OrderingItems.Visible = false;
}
}
protected override void Resized()
{
base.Resized();
Items.Columns = (int)(Width / _columnWidth);
}
}