Editor/Commands/SuiReorderElementCommand.cs
using SboxUiDesigner.Runtime;
namespace SboxUiDesigner.EditorUi.Commands;
/// <summary>
/// Move an element up or down within its parent's child list. Delta is the
/// signed offset to apply to the child's index (-1 = up, +1 = down).
/// Out-of-range moves are no-ops.
/// </summary>
public sealed class SuiReorderElementCommand : ISuiCommand
{
private readonly string _elementId;
private readonly int _delta;
private bool _applied;
public string Description => _delta < 0 ? "Move up" : "Move down";
public SuiReorderElementCommand( string elementId, int delta )
{
_elementId = elementId;
_delta = delta;
}
public void Apply( SuiDocument doc )
{
_applied = TrySwap( doc, _delta );
}
public void Undo( SuiDocument doc )
{
if ( !_applied ) return;
TrySwap( doc, -_delta );
}
private bool TrySwap( SuiDocument doc, int delta )
{
if ( doc == null ) return false;
var el = doc.GetElement( _elementId );
if ( el == null || string.IsNullOrEmpty( el.ParentId ) ) return false;
var parent = doc.GetElement( el.ParentId );
if ( parent == null ) return false;
var idx = parent.Children.IndexOf( _elementId );
if ( idx < 0 ) return false;
var newIdx = idx + delta;
if ( newIdx < 0 || newIdx >= parent.Children.Count ) return false;
parent.Children.RemoveAt( idx );
parent.Children.Insert( newIdx, _elementId );
return true;
}
}