File: VisualDiagnostics\RectangleAdorner.cs
Web Access
Project: src\src\Core\src\Core.csproj (Microsoft.Maui)
using System.Diagnostics;
using System.Linq;
using System.Numerics;
using Microsoft.Maui.Graphics;
 
namespace Microsoft.Maui
{
	/// <summary>
	/// Rectangle Adorner.
	/// </summary>
	public class RectangleAdorner : IAdorner
	{
 
		readonly AdornerModel model = new();
 
		/// <summary>
		/// Initializes a new instance of the <see cref="RectangleAdorner"/> class.
		/// </summary>
		/// <param name="view">An <see cref="IView"/> to create the adorner around.</param>
		/// <param name="density">Override density setting. Default: 1</param>
		/// <param name="offset">Offset point used for positioning drawable object. Default: null</param>
		/// <param name="fillColor">Canvas Fill Color.</param>
		/// <param name="strokeColor">Canvas Stroke Color.</param>
		public RectangleAdorner(IView view, float density = 1, Point? offset = null, Color? fillColor = null, Color? strokeColor = null)
		{
			FillColor = fillColor ?? Color.FromRgba(225, 0, 0, 125);
			StrokeColor = strokeColor ?? Color.FromRgba(225, 0, 0, 125);
			Offset = offset ?? Point.Zero;
			VisualView = view;
			Density = density;
 
			// Sanity check
			if (Density < 0.1)
			{
				Density = 1;
				Debug.Fail($"Invalid density {density}");
			}
		}
 
		/// <inheritdoc/>
		public float Density { get; }
 
		/// <inheritdoc/>
		public IView VisualView { get; }
 
		public Point Offset { get; }
 
		public Color FillColor { get; }
 
		public Color StrokeColor { get; }
 
		public Rect DrawnRectangle => model.BoundingBox;
 
		/// <inheritdoc/>
		public virtual bool Contains(Point point)
		{
			if (model.BoundingBox.Contains(point))
			{
				return true;
			}
 
			if (model.MarginZones.Any(r => r.Contains(point)))
			{
				return true;
			}
 
			return false;
		}
 
		public virtual void Draw(ICanvas canvas, RectF dirtyRect)
		{
			UpdateModel();
 
			// Draw highlight rectangle
			canvas.FillColor = FillColor;
			canvas.StrokeColor = StrokeColor;
			canvas.FillRectangle(model.BoundingBox);
		}
 
		void UpdateModel()
		{
			Rect box = VisualView.GetBoundingBox();
 
			box.X = box.X + Offset.X;
			box.Y = box.Y + Offset.Y;
 
			Matrix4x4 transform = VisualView.GetViewTransform();
			Thickness margin;
			if (VisualView is IView view)
			{
				margin = view.Margin;
			}
			else
			{
				margin = new Thickness();
			}
 
			model.Update(box, margin, transform, Density);
		}
	}
}