CatStation/Content.Client/Remotes/UI/DoorRemoteBoundUserInterface.cs
Whatstone eed6144042
Radial Sorting: add explicit order field (#45445)
* allow for manual radial ordering

* use order, not i

* one third of a radial menu test

* add a unit test for the radial menu comparer

* Fildrance's suggestions, remove unused compare fn

Co-authored-by: Fildrance <14752842+Fildrance@users.noreply.github.com>

* comment order, return SortOptions to private

I was planning to use this in an integration test, but settled on a unit
test.

* comments!

---------

Co-authored-by: Fildrance <14752842+Fildrance@users.noreply.github.com>
2026-08-23 20:08:30 +00:00

64 lines
2.2 KiB
C#

using Content.Client.Stylesheets.Palette;
using Content.Client.UserInterface.Controls;
using Content.Shared.Remotes.Components;
using Content.Shared.Remotes.EntitySystems;
using Robust.Client.UserInterface;
namespace Content.Client.Remotes.UI;
public sealed class DoorRemoteBoundUserInterface(EntityUid owner, Enum uiKey) : BoundUserInterface(owner, uiKey)
{
private static readonly Color SelectedOptionColor = Palettes.Green.Element.WithAlpha(128);
private static readonly Color SelectedOptionHoverColor = Palettes.Green.HoveredElement.WithAlpha(128);
private SimpleRadialMenu? _menu;
protected override void Open()
{
base.Open();
if (!EntMan.TryGetComponent<DoorRemoteComponent>(Owner, out var remote))
return;
_menu = this.CreateWindow<SimpleRadialMenu>();
var models = CreateButtons(remote.Mode, remote.Options);
_menu.SetButtons(models);
_menu.OpenOverMouseScreenPosition();
}
private IEnumerable<RadialMenuOptionBase> CreateButtons(OperatingMode selectedMode, List<DoorRemoteModeInfo> modeOptions)
{
var options = new List<RadialMenuOptionBase>();
for (var i = 0; i < modeOptions.Count; i++)
{
var modeOption = modeOptions[i];
Color? optionCustomColor = null;
Color? optionHoverCustomColor = null;
if (modeOption.Mode == selectedMode)
{
optionCustomColor = SelectedOptionColor;
optionHoverCustomColor = SelectedOptionHoverColor;
}
var option = new RadialMenuActionOption<OperatingMode>(HandleRadialMenuClick, modeOption.Mode)
{
IconSpecifier = RadialMenuIconSpecifier.With(modeOption.Icon),
ToolTip = Loc.GetString(modeOption.Tooltip),
BackgroundColor = optionCustomColor,
HoverBackgroundColor = optionHoverCustomColor,
Order = i
};
options.Add(option);
}
return options;
}
private void HandleRadialMenuClick(OperatingMode mode)
{
var msg = new DoorRemoteModeChangeMessage { Mode = mode };
SendPredictedMessage(msg);
}
}