Editor/ObjectGenericControlWidget.ControlSheetLabel.cs
using Sandbox.UI;

using Label = Editor.Label;
namespace Nodebox.Editor;

public partial class ObjectGenericControlWidget {

	/// <summary>
	/// A draggable label.
	/// </summary>
	public class ControlSheetLabel : Widget {
		private SerializedProperty Property { get; }
		private Drag _drag;

		public ControlSheetLabel(SerializedProperty property) {
			Property = property;

			MinimumHeight = Theme.RowHeight;
			MinimumWidth = 140f;
			HorizontalSizeMode = SizeMode.Flexible;

			IsDraggable = IsDraggableProperty(property);
		}

		private bool IsDraggableProperty(SerializedProperty property) {
			if (property.IsMultipleValues) return false;

			var target = property.Parent?.Targets.FirstOrDefault();

			return target is GameObject or Component or GameTransform;
		}

		protected override void OnDragStart() {
			base.OnDragStart();

			_drag = new Drag(this) {
				Data = { Object = Property, Text = Property.As.String }
			};

			_drag.Execute();
		}

		protected override void OnPaint() {
			base.OnPaint();

			Paint.SetBrushAndPen(Theme.TextControl, Theme.TextControl);

			Paint.Pen = Theme.TextControl.WithAlpha(Paint.HasMouseOver ? 1.0f : 0.7f);

			var contentRect = LocalRect.Shrink(4f);

			Paint.DrawText(contentRect, Property.DisplayName, TextFlag.LeftTop);

			if (!IsDraggable) return;

			var isDragging = _drag.IsValid();
			if (isDragging) {
				Paint.ClearPen();
				Paint.SetBrush(Theme.Pink.WithAlpha(0.3f));
				Paint.DrawRect(ContentRect, 3f);
			}
		}
	}
}