mirror of
https://github.com/space-wizards/RobustToolbox.git
synced 2026-09-15 14:52:35 +02:00
Let modes specify priority
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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) { }
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user