Editor/Tileset/TilesetResource/TilesetDropObject.cs
using System.Linq;
using Editor;
using Sandbox;
using System.Threading;
using System.Threading.Tasks;

namespace SpriteTools;

[DropObject("tileset", "tileset")]
partial class TilesetDropObject : BaseDropObject
{
	TilesetResource tileset;

	protected override async Task Initialize(string dragData, CancellationToken token)
	{
		Asset asset = await InstallAsset(dragData, token);

		if (asset is null)
			return;

		if (token.IsCancellationRequested)
			return;

		tileset = asset.LoadResource<TilesetResource>();
		PackageStatus = null;
	}

	public override void OnUpdate()
	{
	}

	public override async Task OnDrop()
	{
		await WaitForLoad();

		if (tileset is null)
			return;

		var undoScope = SceneEditorSession.Active.UndoScope("Drag Tileset").WithGameObjectCreations();
		using (undoScope.Push())
		{
			var DragObject = new GameObject();
			DragObject.Name = tileset.ResourceName;
			DragObject.Transform.World = new Transform(Vector3.Zero, Rotation.Identity, 1);

			GameObject = DragObject;

			var tilesetComponent = GameObject.Components.GetOrCreate<TilesetComponent>();
			var layer = new TilesetComponent.Layer();
			layer.TilesetResource = tileset;
			tilesetComponent.Layers ??= new();
			tilesetComponent.Layers.Add(layer);

			EditorScene.Selection.Set(DragObject);
		}
	}
}