Add new "OptionsVisualizer" (#25128)

This is a visualizer somewhat similar to the Generic. It allows configuring appearance info based on specific CVars the user has set. This allows YAML to easily configure alternatives for accessibility CVars like reduced motion.
This commit is contained in:
Pieter-Jan Briers
2024-02-17 21:52:11 +01:00
committed by GitHub
parent cb32a8470f
commit 1ce2155315
10 changed files with 217 additions and 0 deletions

View File

@@ -0,0 +1,97 @@
using Content.Shared.CCVar;
using Robust.Client.GameObjects;
using Robust.Shared.Configuration;
using Robust.Shared.Reflection;
namespace Content.Client.Options;
/// <summary>
/// Implements <see cref="OptionsVisualizerComponent"/>.
/// </summary>
public sealed class OptionsVisualizerSystem : EntitySystem
{
private static readonly (OptionVisualizerOptions, CVarDef<bool>)[] OptionVars =
{
(OptionVisualizerOptions.Test, CCVars.DebugOptionVisualizerTest),
(OptionVisualizerOptions.ReducedMotion, CCVars.ReducedMotion),
};
[Dependency] private readonly IConfigurationManager _cfg = default!;
[Dependency] private readonly IReflectionManager _reflection = default!;
private OptionVisualizerOptions _currentOptions;
public override void Initialize()
{
base.Initialize();
foreach (var (_, cvar) in OptionVars)
{
Subs.CVar(_cfg, cvar, _ => CVarChanged());
}
UpdateActiveOptions();
SubscribeLocalEvent<OptionsVisualizerComponent, ComponentStartup>(OnComponentStartup);
}
private void CVarChanged()
{
UpdateActiveOptions();
UpdateAllComponents();
}
private void UpdateActiveOptions()
{
_currentOptions = OptionVisualizerOptions.Default;
foreach (var (value, cVar) in OptionVars)
{
if (_cfg.GetCVar(cVar))
_currentOptions |= value;
}
}
private void UpdateAllComponents()
{
var query = EntityQueryEnumerator<OptionsVisualizerComponent, SpriteComponent>();
while (query.MoveNext(out _, out var component, out var sprite))
{
UpdateComponent(component, sprite);
}
}
private void OnComponentStartup(EntityUid uid, OptionsVisualizerComponent component, ComponentStartup args)
{
if (!TryComp(uid, out SpriteComponent? sprite))
return;
UpdateComponent(component, sprite);
}
private void UpdateComponent(OptionsVisualizerComponent component, SpriteComponent sprite)
{
foreach (var (layerKeyRaw, layerData) in component.Visuals)
{
object layerKey = _reflection.TryParseEnumReference(layerKeyRaw, out var @enum)
? @enum
: layerKeyRaw;
OptionsVisualizerComponent.LayerDatum? matchedDatum = null;
foreach (var datum in layerData)
{
if ((datum.Options & _currentOptions) != datum.Options)
continue;
matchedDatum = datum;
}
if (matchedDatum == null)
continue;
var layerIndex = sprite.LayerMapReserveBlank(layerKey);
sprite.LayerSetData(layerIndex, matchedDatum.Data);
}
}
}