From ac1f841ea9d4330cbc0a09fe22a964b967ff89e4 Mon Sep 17 00:00:00 2001 From: poemota <142114334+poeMota@users.noreply.github.com> Date: Sun, 29 Dec 2024 16:35:44 +1000 Subject: [PATCH 01/53] add layers menu and erase tile button --- .../Mapping/MappingLayersUIController.cs | 184 ++++++++++++++++++ .../Mapping/MappingLayersWindow.xaml | 20 ++ .../Mapping/MappingLayersWindow.xaml.cs | 15 ++ Content.Client/Mapping/MappingScreen.xaml | 4 + Content.Client/Mapping/MappingScreen.xaml.cs | 9 + Content.Client/Mapping/MappingState.cs | 26 +++ Resources/Locale/en-US/mapping/editor.ftl | 4 +- .../Locale/en-US/mapping/mapping-layers.ftl | 13 ++ .../Structures/Piping/Disposal/pipes.yml | 4 + .../Entities/Structures/Power/cables.yml | 4 + Resources/Prototypes/tags.yml | 7 + 11 files changed, 289 insertions(+), 1 deletion(-) create mode 100644 Content.Client/Mapping/MappingLayersUIController.cs create mode 100644 Content.Client/Mapping/MappingLayersWindow.xaml create mode 100644 Content.Client/Mapping/MappingLayersWindow.xaml.cs create mode 100644 Resources/Locale/en-US/mapping/mapping-layers.ftl diff --git a/Content.Client/Mapping/MappingLayersUIController.cs b/Content.Client/Mapping/MappingLayersUIController.cs new file mode 100644 index 000000000000..b2be8f92232a --- /dev/null +++ b/Content.Client/Mapping/MappingLayersUIController.cs @@ -0,0 +1,184 @@ +using Content.Client.Decals; +using Content.Client.Markers; +using Content.Client.Movement.Systems; +using Content.Client.SubFloor; +using Content.Shared.Atmos.Components; +using Content.Shared.Doors.Components; +using Content.Shared.Tag; +using Robust.Client.UserInterface.Controllers; +using Robust.Client.UserInterface.Controls; +using Robust.Client.GameObjects; +using Robust.Client.Graphics; +using Robust.Shared.Prototypes; + +namespace Content.Client.Mapping; + +public sealed class MappingLayersUIController : UIController +{ + [Dependency] private readonly IEntitySystemManager _entitySystemManager = default!; + [Dependency] private readonly IEyeManager _eyeManager = default!; + [Dependency] private readonly ILightManager _lightManager = default!; + + private MappingLayersWindow? _window; + + [ValidatePrototypeId] + private const string WallTag = "Wall"; + + [ValidatePrototypeId] + private const string CableTag = "Cable"; + + [ValidatePrototypeId] + private const string DisposalTag = "Disposal"; + + public void ToggleWindow() + { + EnsureWindow(); + + if (_window!.IsOpen) + { + _window.Close(); + } + else + { + _window.Open(); + } + } + + private void EnsureWindow() + { + if (_window is { Disposed: false }) + return; + + _window = UIManager.CreateWindow(); + + _window.Light.Pressed = _lightManager.Enabled; + _window.Light.OnPressed += args => + { + _lightManager.Enabled = args.Button.Pressed; + }; + + _window.Fov.Pressed = _eyeManager.CurrentEye.DrawFov; + _window.Fov.OnPressed += args => _eyeManager.CurrentEye.DrawFov = args.Button.Pressed; + + _window.Entities.Pressed = true; + _window.Entities.OnPressed += OnToggleEntitiesPressed; + + _window.Markers.Pressed = _entitySystemManager.GetEntitySystem().MarkersVisible; + _window.Markers.OnPressed += args => + { + _entitySystemManager.GetEntitySystem().MarkersVisible = args.Button.Pressed; + }; + + _window.Walls.Pressed = true; + _window.Walls.OnPressed += args => ToggleWithTag(args, WallTag); + + _window.Airlocks.Pressed = true; + _window.Airlocks.OnPressed += ToggleWithComp; + + _window.Decals.Pressed = true; + _window.Decals.OnPressed += _ => + { + _entitySystemManager.GetEntitySystem().ToggleOverlay(); + }; + + _window.SubFloor.Pressed = _entitySystemManager.GetEntitySystem().ShowAll; + _window.SubFloor.OnPressed += OnToggleSubfloorPressed; + + _window.Cables.Pressed = true; + _window.Cables.OnPressed += args => ToggleWithTag(args, CableTag); + + _window.Disposal.Pressed = true; + _window.Disposal.OnPressed += args => ToggleWithTag(args, DisposalTag); + + _window.Atmos.Pressed = true; + _window.Atmos.OnPressed += ToggleWithComp; + + LayoutContainer.SetAnchorPreset(_window, LayoutContainer.LayoutPreset.CenterTop); + } + + private void OnToggleEntitiesPressed(BaseButton.ButtonEventArgs args) + { + var entManager = IoCManager.Resolve(); + var query = entManager.AllEntityQueryEnumerator(); + + if (args.Button.Pressed && _window != null) + { + _window.Markers.Pressed = true; + _window.Walls.Pressed = true; + _window.Airlocks.Pressed = true; + } + else if (_window != null) + { + _window.Markers.Pressed = false; + _window.Walls.Pressed = false; + _window.Airlocks.Pressed = false; + } + + while (query.MoveNext(out _, out var sprite)) + { + sprite.Visible = args.Button.Pressed; + } + } + + private void OnToggleSubfloorPressed(BaseButton.ButtonEventArgs args) + { + _entitySystemManager.GetEntitySystem().ShowAll = args.Button.Pressed; + + if (args.Button.Pressed && _window != null) + { + _window.Cables.Pressed = true; + _window.Atmos.Pressed = true; + _window.Disposal.Pressed = true; + } + } + + private static void ToggleWithComp(BaseButton.ButtonEventArgs args) where TComp : IComponent + { + var entManager = IoCManager.Resolve(); + var query = entManager.AllEntityQueryEnumerator(); + + while (query.MoveNext(out _, out _, out var sprite)) + { + sprite.Visible = args.Button.Pressed; + } + } + + private static void ToggleWithTag(BaseButton.ButtonEventArgs args, ProtoId tag) + { + var entManager = IoCManager.Resolve(); + var query = entManager.AllEntityQueryEnumerator(); + var tagSystem = entManager.EntitySysManager.GetEntitySystem(); + + while (query.MoveNext(out var uid, out _, out var sprite)) + { + if (tagSystem.HasTag(uid, tag)) + { + sprite.Visible = args.Button.Pressed; + } + + } + } +} + +public sealed class LayersButton : Button +{ + public LayersButton() + { + HorizontalExpand = true; + SetHeight = 50; + ToggleMode = true; + StyleIdentifier = "OpenRight"; + Margin = new Thickness(0, 3, 0, 0); + } +} + +public sealed class SubLayersButton : Button +{ + public SubLayersButton() + { + HorizontalExpand = true; + SetHeight = 40; + ToggleMode = true; + Margin = new Thickness(10, 0, 0, 0); + } +} diff --git a/Content.Client/Mapping/MappingLayersWindow.xaml b/Content.Client/Mapping/MappingLayersWindow.xaml new file mode 100644 index 000000000000..7c53d751862e --- /dev/null +++ b/Content.Client/Mapping/MappingLayersWindow.xaml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + diff --git a/Content.Client/Mapping/MappingLayersWindow.xaml.cs b/Content.Client/Mapping/MappingLayersWindow.xaml.cs new file mode 100644 index 000000000000..58f75ad291ff --- /dev/null +++ b/Content.Client/Mapping/MappingLayersWindow.xaml.cs @@ -0,0 +1,15 @@ +using Robust.Client.AutoGenerated; +using Robust.Client.UserInterface.CustomControls; +using Robust.Client.UserInterface.XAML; + +namespace Content.Client.Mapping; + +[GenerateTypedNameReferences] +public sealed partial class MappingLayersWindow : DefaultWindow +{ + public MappingLayersWindow() + { + RobustXamlLoader.Load(this); + } +} + diff --git a/Content.Client/Mapping/MappingScreen.xaml b/Content.Client/Mapping/MappingScreen.xaml index bad492e7e41f..e00edef5f651 100644 --- a/Content.Client/Mapping/MappingScreen.xaml +++ b/Content.Client/Mapping/MappingScreen.xaml @@ -51,6 +51,9 @@