mirror of
https://github.com/DeltaV-Station/Delta-v.git
synced 2026-09-29 23:57:29 +00:00
* Initial radial menu prototyping for the RCD
* Radial UI buttons can send messages to the server
* Beginning to update RCDSystem
* RCD building system in progress
* Further updates
* Added extra effects, RCDSystem now reads RCD prototype data
* Replacing tiles is instant, multiple constructions are allowed, deconstruction is broken
* Added extra functionality to RadialContainers plus documentation
* Fixed localization of RCD UI strings
* Menu opens near cursor, added basic RCD
* Avoiding merge conflict
* Implemented atomized construction / deconstruction rules
* Increased RCD ammo base charges
* Moved input context definition to content
* Removed obsoleted code
* Updates to system
* Switch machine and computer frames for electrical cabling
* Added construction ghosts
* Fixed issue with keybind detection code
* Fixed RCD construction ghost mispredications
* Code clean up
* Updated deconstruction effects
* RCDs effects don't rotate
* Code clean up
* Balancing for ammo counts
* Code clean up
* Added missing localized strings
* More clean up
* Made directional window handling more robust
* Added documentation to radial menus and made them no longer dependent on Content
* Made radial containers more robust
* Further robustness to the radial menu
* The RCD submenu buttons are only shown when the destination layer has at least one children
* Expanded upon deconstructing plus construction balance
* Fixed line endings
* Updated list of RCD deconstructable entities. Now needs a component to deconstruct instead of a tag
* Bug fixes
* Revert unnecessary change
* Updated RCD strings
* Fixed bug
* More fixes
* Deconstructed tiles/subflooring convert to lattice instead
* Fixed failed tests (Linux doesn't like invalid spritespecifer paths)
* Fixing merge conflict
* Updated airlock assembly
* Fixing merge conflict
* Fixing merge conflict
* More fixing...
* Removed erroneous project file change
* Fixed string handling issue
* Trying to fix merge conflict
* Still fixing merge conflicts
* Balancing
* Hidden RCD construction ghosts when in 'build' mode
* Fixing merge conflict
* Implemented requested changes (Part 1)
* Added more requested changes
* Fix for failed test. Removed sussy null suppression
* Made requested changes - custom construction ghost system was replaced
* Fixing merge conflict
* Fixed merge conflict
* Fixed bug in RCD construction ghost validation
* Fixing merge conflict
* Merge conflict fixed
* Made required update
* Removed lingering RCD deconstruct tag
* Fixing merge conflict
* Merge conflict fixed
* Made requested changes
* Bug fixes and balancing
* Made string names more consistent
* Can no longer stack catwalks
(cherry picked from commit 02273ca0e7)
106 lines
3.5 KiB
C#
106 lines
3.5 KiB
C#
using Robust.Client.Graphics;
|
|
using Robust.Client.UserInterface.Controls;
|
|
using System.Linq;
|
|
using System.Numerics;
|
|
|
|
namespace Content.Client.UserInterface.Controls;
|
|
|
|
[Virtual]
|
|
public class RadialContainer : LayoutContainer
|
|
{
|
|
/// <summary>
|
|
/// Specifies the anglular range, in radians, in which child elements will be placed.
|
|
/// The first value denotes the angle at which the first element is to be placed, and
|
|
/// the second value denotes the angle at which the last element is to be placed.
|
|
/// Both values must be between 0 and 2 PI radians
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// The top of the screen is at 0 radians, and the bottom of the screen is at PI radians
|
|
/// </remarks>
|
|
[ViewVariables(VVAccess.ReadWrite)]
|
|
public Vector2 AngularRange
|
|
{
|
|
get
|
|
{
|
|
return _angularRange;
|
|
}
|
|
|
|
set
|
|
{
|
|
var x = value.X;
|
|
var y = value.Y;
|
|
|
|
x = x > MathF.Tau ? x % MathF.Tau : x;
|
|
y = y > MathF.Tau ? y % MathF.Tau : y;
|
|
|
|
x = x < 0 ? MathF.Tau + x : x;
|
|
y = y < 0 ? MathF.Tau + y : y;
|
|
|
|
_angularRange = new Vector2(x, y);
|
|
}
|
|
}
|
|
|
|
private Vector2 _angularRange = new Vector2(0f, MathF.Tau - float.Epsilon);
|
|
|
|
/// <summary>
|
|
/// Determines the direction in which child elements will be arranged
|
|
/// </summary>
|
|
[ViewVariables(VVAccess.ReadWrite)]
|
|
public RAlignment RadialAlignment { get; set; } = RAlignment.Clockwise;
|
|
|
|
/// <summary>
|
|
/// Determines how far from the radial container's center that its child elements will be placed
|
|
/// </summary>
|
|
[ViewVariables(VVAccess.ReadWrite)]
|
|
public float Radius { get; set; } = 100f;
|
|
|
|
/// <summary>
|
|
/// Sets whether the container should reserve a space on the layout for child which are not currently visible
|
|
/// </summary>
|
|
[ViewVariables(VVAccess.ReadWrite)]
|
|
public bool ReserveSpaceForHiddenChildren { get; set; } = true;
|
|
|
|
/// <summary>
|
|
/// This container arranges its children, evenly separated, in a radial pattern
|
|
/// </summary>
|
|
public RadialContainer()
|
|
{
|
|
|
|
}
|
|
|
|
protected override void Draw(DrawingHandleScreen handle)
|
|
{
|
|
var children = ReserveSpaceForHiddenChildren ? Children : Children.Where(x => x.Visible);
|
|
var childCount = children.Count();
|
|
|
|
// Determine the size of the arc, accounting for clockwise and anti-clockwise arrangements
|
|
var arc = AngularRange.Y - AngularRange.X;
|
|
arc = (arc < 0) ? MathF.Tau + arc : arc;
|
|
arc = (RadialAlignment == RAlignment.AntiClockwise) ? MathF.Tau - arc : arc;
|
|
|
|
// Account for both circular arrangements and arc-based arrangements
|
|
var childMod = MathHelper.CloseTo(arc, MathF.Tau, 0.01f) ? 0 : 1;
|
|
|
|
// Determine the separation between child elements
|
|
var sepAngle = arc / (childCount - childMod);
|
|
sepAngle *= (RadialAlignment == RAlignment.AntiClockwise) ? -1f : 1f;
|
|
|
|
// Adjust the positions of all the child elements
|
|
foreach (var (i, child) in children.Select((x, i) => (i, x)))
|
|
{
|
|
var position = new Vector2(Radius * MathF.Sin(AngularRange.X + sepAngle * i) + Width / 2f - child.Width / 2f, -Radius * MathF.Cos(AngularRange.X + sepAngle * i) + Height / 2f - child.Height / 2f);
|
|
SetPosition(child, position);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Specifies the different radial alignment modes
|
|
/// </summary>
|
|
/// <seealso cref="RadialAlignment"/>
|
|
public enum RAlignment : byte
|
|
{
|
|
Clockwise,
|
|
AntiClockwise,
|
|
}
|
|
}
|