Let modes specify priority

This commit is contained in:
Tayrtahn
2025-06-02 14:11:45 -04:00
parent 27efb6c5cf
commit f113b40c7f
15 changed files with 51 additions and 29 deletions
+3 -2
View File
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using Robust.Shared.Enums;
using Robust.Shared.Maths;
using Robust.Shared.Timing;
@@ -49,9 +50,9 @@ namespace Robust.Client.Placement
void ToggleEraserHijacked(PlacementHijack hijack);
/// <summary>
/// Returns an array containing the names of all placement modes that can be used.
/// Returns a collection containing all placement mode Types that can be used.
/// </summary>
string[] GetAllPlacementModes();
IEnumerable<Type> GetAllPlacementModes();
void FrameUpdate(FrameEventArgs e);
}
@@ -9,7 +9,7 @@ using Robust.Shared.Prototypes;
namespace Robust.Client.Placement.Modes
{
[PlacementMode]
[PlacementMode(priority: (int)EnginePlacementMode.AlignSimilar)]
public sealed class AlignSimilar : PlacementMode
{
private const uint SnapToRange = 50;
@@ -7,7 +7,7 @@ using Robust.Shared.Maths;
namespace Robust.Client.Placement.Modes
{
[PlacementMode]
[PlacementMode(priority: (int)EnginePlacementMode.SnapgridBorder)]
public sealed class SnapgridBorder : SnapgridCenter
{
public override bool HasLineMode => true;
@@ -9,7 +9,7 @@ using Robust.Shared.Maths;
namespace Robust.Client.Placement.Modes
{
[Virtual]
[PlacementMode]
[PlacementMode(priority: (int)EnginePlacementMode.SnapgridCenter)]
public class SnapgridCenter : PlacementMode
{
protected MapGridComponent? Grid;
@@ -5,7 +5,7 @@ using Robust.Shared.Map.Components;
namespace Robust.Client.Placement.Modes
{
[PlacementMode]
[PlacementMode(priority: (int)EnginePlacementMode.AlignTileAny)]
public sealed class AlignTileAny : PlacementMode
{
public override bool HasLineMode => true;
@@ -5,7 +5,7 @@ using Robust.Shared.Map.Components;
namespace Robust.Client.Placement.Modes
{
[PlacementMode]
[PlacementMode(priority: (int)EnginePlacementMode.AlignTileDense)]
public sealed class AlignTileDense : PlacementMode
{
public override bool HasLineMode => true;
@@ -6,7 +6,7 @@ using Robust.Shared.Maths;
namespace Robust.Client.Placement.Modes
{
[PlacementMode]
[PlacementMode(priority: (int)EnginePlacementMode.AlignTileEmpty)]
public sealed class AlignTileEmpty : PlacementMode
{
public override bool HasLineMode => true;
@@ -5,7 +5,7 @@ using Robust.Shared.Map.Components;
namespace Robust.Client.Placement.Modes
{
[PlacementMode]
[PlacementMode(priority: (int)EnginePlacementMode.AlignTileNonDense)]
public sealed class AlignTileNonDense : PlacementMode
{
public override bool HasLineMode => true;
+1 -1
View File
@@ -5,7 +5,7 @@ using Vector2 = System.Numerics.Vector2;
namespace Robust.Client.Placement.Modes
{
[PlacementMode]
[PlacementMode(priority: (int)EnginePlacementMode.AlignWall)]
public sealed class AlignWall : PlacementMode
{
public AlignWall(PlacementManager pMan) : base(pMan) { }
@@ -7,7 +7,7 @@ namespace Robust.Client.Placement.Modes
/// <summary>
/// Snaps in edge on one axis, center in the other.
/// </summary>
[PlacementMode]
[PlacementMode(priority: (int)EnginePlacementMode.AlignWallProper)]
public sealed class AlignWallProper : PlacementMode
{
public AlignWallProper(PlacementManager pMan) : base(pMan)
+1 -1
View File
@@ -2,7 +2,7 @@
namespace Robust.Client.Placement.Modes
{
[PlacementMode]
[PlacementMode(priority: (int)EnginePlacementMode.PlaceFree)]
public sealed class PlaceFree : PlacementMode
{
public PlaceFree(PlacementManager pMan) : base(pMan) { }
+1 -1
View File
@@ -2,7 +2,7 @@
namespace Robust.Client.Placement.Modes
{
[PlacementMode]
[PlacementMode(priority: (int)EnginePlacementMode.PlaceNearby)]
public sealed class PlaceNearby : PlacementMode
{
public PlaceNearby(PlacementManager pMan) : base(pMan) { }
@@ -6,10 +6,30 @@ namespace Robust.Client.Placement.Modes;
[AttributeUsage(AttributeTargets.Class)]
[BaseTypeRequired(typeof(PlacementMode))]
[MeansImplicitUse]
public sealed class PlacementModeAttribute(string? name = null) : Attribute
public sealed class PlacementModeAttribute(string? name = null, int priority = 0) : Attribute
{
/// <summary>
/// The display name of this placement mode.
/// </summary>
public string? Name { get; } = name;
/// <summary>
/// Controls ordering of modes in the selector. Higher priority modes are listed first.
/// </summary>
public int Priority { get; } = priority;
}
public enum EnginePlacementMode
{
PlaceFree = 1000,
PlaceNearby = 999,
SnapgridCenter = 998,
SnapgridBorder = 997,
AlignSimilar = 996,
AlignTileAny = 995,
AlignTileEmpty = 994,
AlignTileNonDense = 993,
AlignTileDense = 992,
AlignWall = 991,
AlignWallProper = 990,
}
+2 -12
View File
@@ -499,19 +499,9 @@ namespace Robust.Client.Placement
else Clear();
}
public string[] GetAllPlacementModes()
public IEnumerable<Type> GetAllPlacementModes()
{
List<string> names = [];
var modes = _reflectionManager.FindTypesWithAttribute<PlacementModeAttribute>();
foreach (var type in modes)
{
if (Attribute.GetCustomAttribute(type, typeof(PlacementModeAttribute)) is not PlacementModeAttribute attribute)
throw new InvalidImplementationException(type, typeof(PlacementMode), $"No {nameof(PlacementModeAttribute)}!");
// Use the override if specified, falling back to the Type name
names.Add(attribute.Name ?? type.Name);
}
return names.ToArray();
return _reflectionManager.FindTypesWithAttribute<PlacementModeAttribute>();
}
public void BeginPlacing(PlacementInformation info, PlacementHijack? hijack = null)
@@ -1,11 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using Robust.Client.AutoGenerated;
using Robust.Client.Graphics;
using Robust.Client.Placement;
using Robust.Client.Placement.Modes;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Graphics;
using Robust.Shared.IoC;
using Robust.Shared.IoC.Exceptions;
using Robust.Shared.Maths;
using Robust.Shared.Prototypes;
@@ -28,9 +32,16 @@ namespace Robust.Client.UserInterface.CustomControls
MeasureButton.Measure(Vector2Helpers.Infinity);
List<string> modes = ["Default"];
modes.AddRange(_placementManager.GetAllPlacementModes());
InitOpts = modes.ToArray();
List<(string Name, int Priority)> modes = [("Default", int.MaxValue)];
foreach (var type in _placementManager.GetAllPlacementModes())
{
if (Attribute.GetCustomAttribute(type, typeof(PlacementModeAttribute)) is not PlacementModeAttribute attribute)
throw new InvalidImplementationException(type, typeof(PlacementMode), $"No {nameof(PlacementModeAttribute)}!");
// Use the override if specified, falling back to the Type name
modes.Add((attribute.Name ?? type.Name, attribute.Priority));
}
InitOpts = modes.OrderByDescending(m => m.Priority).Select(m => m.Name).ToArray();
for (var i = 0; i < InitOpts.Length; i++)
{
OverrideMenu.AddItem(InitOpts[i], i);