Ui/Paint/PaintUi.State.cs
namespace Clover.Ui;

public partial class PaintUi
{
	private Stack<byte[]> UndoStack = new(30);
	private Stack<byte[]> RedoStack = new(30);

	private void Undo()
	{
		if ( UndoStack.Count == 0 )
		{
			Log.Info( "Nothing to undo" );
			return;
		}

		Log.Info( $"UNDO | Size: {UndoStack.Count}" );

		PushRedo();

		DrawTextureData = UndoStack.Pop();
		PushByteDataToTexture();

		_isDrawing = false;
		_isMoving = false;
		_lastBrushPosition = null;
	}

	private void Redo()
	{
		if ( RedoStack.Count == 0 )
		{
			Log.Info( "Nothing to redo" );
			return;
		}

		Log.Info( $"REDO | Size: {RedoStack.Count}" );

		PushUndo();

		DrawTextureData = RedoStack.Pop();
		PushByteDataToTexture();

		_isDrawing = false;
		_isMoving = false;
		_lastBrushPosition = null;
	}

	private void PushUndo()
	{
		if ( DrawTextureData == null )
		{
			Log.Error( "DrawTextureData is null" );
			return;
		}

		if ( DrawTextureData.Length == 0 )
		{
			Log.Error( "DrawTextureData is empty" );
			return;
		}

		UndoStack.Push( DrawTextureData.ToArray() );
		Log.Info( $"PUSHED UNDO | Size: {UndoStack.Count}" );
		UndoStack.TrimExcess();
	}

	private void PushRedo()
	{
		RedoStack.Push( DrawTextureData.ToArray() );
		Log.Info( $"PUSHED REDO | Size: {RedoStack.Count}" );
		RedoStack.TrimExcess();
	}
}