UI/GameMenu/Canvas/GameCanvas.razor.cs
using Sandbox.UI;

namespace GuessIt;

public partial class GameCanvas
{
	// Drawing Variables
	bool IsDrawing = false;
	List<Vector2> DrawingPoints = new List<Vector2>();

	// UI Variables
	Image Canvas { get; set; }

	public void SetTexture( Texture texture )
	{
		Canvas.Texture = texture;
	}

	public void MarkDirty()
	{
		Canvas?.MarkRenderDirty();
	}

	protected override void OnAfterTreeRender( bool firstRender )
	{
		base.OnAfterTreeRender( firstRender );

		if ( Canvas is not null && GameMenu.Instance?.Canvas is not null )
		{
			Canvas.Texture = GameMenu.Instance.Canvas;
		}
	}

	protected override void OnMouseDown( MousePanelEvent e )
	{
		base.OnMouseDown( e );

		Log.Info( $"[GameCanvas] OnMouseDown LocalPos={e.LocalPosition} CanvasSize={Canvas?.Box?.Rect.Size} PlayerIsDrawing={Player.Local?.IsDrawing}" );

		DrawingPoints.Clear();
		IsDrawing = true;
		AddPoint( e.LocalPosition );
	}

	protected override void OnMouseMove( MousePanelEvent e )
	{
		base.OnMouseMove( e );

		if ( IsDrawing )
		{
			bool returnVal = AddPoint( e.LocalPosition );
			if ( returnVal == false )
			{
				Log.Info( $"[GameCanvas] AddPoint failed during move, stopping draw" );
				StopDrawing();
			}
		}
	}

	protected override void OnMouseUp( MousePanelEvent e )
	{
		base.OnMouseUp( e );

		StopDrawing();
	}

	void StopDrawing()
	{
		if ( !IsDrawing ) return;

		IsDrawing = false;
		if ( DrawingPoints.Count > 0 )
		{
			GameMenu.Instance.BroadcastDraw( DrawingPoints, GameMenu.Instance.BrushColor, GameMenu.Instance.BrushSize );
		}
		else
		{
			var canvasSize = Canvas?.Box?.Rect.Size ?? Vector2.One;
			var pos = MousePosition / canvasSize * new Vector2( 320, 240 );
			GameMenu.Instance.BroadcastDraw( pos, GameMenu.Instance.BrushColor, GameMenu.Instance.BrushSize );
		}
		DrawingPoints.Clear();
	}

	bool AddPoint( Vector2 vec2 )
	{
		if ( !(Player.Local?.IsDrawing ?? false) ) return false;
		if ( !IsDrawing ) return false;

		var canvasSize = Canvas?.Box?.Rect.Size ?? Vector2.Zero;
		if ( canvasSize.x <= 0 || canvasSize.y <= 0 )
		{
			Log.Warning( $"[GameCanvas] Canvas size is zero or invalid: {canvasSize}" );
			return false;
		}

		Vector2 pos = (vec2 / canvasSize) * new Vector2( 320, 240 );
		if ( pos.x < 0 || pos.x > 320 || pos.y < 0 || pos.y > 240 ) return false;
		DrawingPoints.Add( pos );

		if ( DrawingPoints.Count > 1 )
		{
			GameMenu.Instance.Draw( DrawingPoints, GameMenu.Instance.BrushColor, GameMenu.Instance.BrushSize );
		}
		else
		{
			GameMenu.Instance.Draw( DrawingPoints[0], GameMenu.Instance.BrushColor, GameMenu.Instance.BrushSize );
		}

		if ( DrawingPoints.Count >= 5 )
		{
			var last = DrawingPoints.LastOrDefault();
			GameMenu.Instance.BroadcastDraw( DrawingPoints, GameMenu.Instance.BrushColor, GameMenu.Instance.BrushSize );
			DrawingPoints.Clear();
			DrawingPoints.Add( last );
		}

		return true;
	}
}