File: Handlers\ViewHandlerExtensions.Tizen.cs
Web Access
Project: src\src\Core\src\Core.csproj (Microsoft.Maui)
using System;
using Microsoft.Maui.Graphics;
using Tizen.UIExtensions.NUI;
using IMeasurable = Tizen.UIExtensions.Common.IMeasurable;
using NLayoutLength = Tizen.NUI.LayoutLength;
using NMeasuredSize = Tizen.NUI.MeasuredSize;
 
namespace Microsoft.Maui
{
	internal static partial class ViewHandlerExtensions
	{
		internal static Size LayoutVirtualView(
			this IPlatformViewHandler viewHandler, Rect frame,
			Func<Rect, Size>? arrangeFunc = null)
		{
			var virtualView = viewHandler.VirtualView;
			var platformView = viewHandler.PlatformView;
 
			if (virtualView == null || platformView == null)
			{
				return Size.Zero;
			}
 
			arrangeFunc ??= virtualView.Arrange;
			return arrangeFunc(frame);
		}
 
		internal static Size MeasureVirtualView(
			this IPlatformViewHandler viewHandler,
			double widthConstraint,
			double heightConstraint,
			Func<double, double, Size>? measureFunc = null)
		{
			var virtualView = viewHandler.VirtualView;
			var platformView = viewHandler.PlatformView;
 
			if (virtualView == null || platformView == null)
			{
				return Size.Zero;
			}
 
			measureFunc ??= virtualView.Measure;
			var measure = measureFunc(widthConstraint, heightConstraint);
 
			return measure;
		}
 
		internal static Size GetDesiredSizeFromHandler(this IViewHandler viewHandler, double widthConstraint, double heightConstraint)
		{
			var platformView = viewHandler.ToPlatform();
			var virtualView = viewHandler.VirtualView;
 
			if (platformView == null || virtualView == null)
			{
				return virtualView == null || double.IsNaN(virtualView.Width) || double.IsNaN(virtualView.Height) ? Size.Zero : new Size(virtualView.Width, virtualView.Height);
			}
 
			int availableWidthAsInt = widthConstraint.ToScaledPixel();
			int availableHeightAsInt = heightConstraint.ToScaledPixel();
 
			double availableWidth = (availableWidthAsInt < 0 || availableWidthAsInt == int.MaxValue) ? double.PositiveInfinity : availableWidthAsInt;
			double availableHeight = (availableHeightAsInt < 0 || availableHeightAsInt == int.MaxValue) ? double.PositiveInfinity : availableHeightAsInt;
 
			double? explicitWidth = (virtualView.Width >= 0) ? virtualView.Width : null;
			double? explicitHeight = (virtualView.Height >= 0) ? virtualView.Height : null;
 
			Size measured;
			if (platformView is IMeasurable platformViewMeasurable)
			{
				measured = platformViewMeasurable.Measure(availableWidth, availableHeight).ToDP();
			}
			else
			{
				measured = platformView.NaturalSize2D.ToCommon().ToDP();
			}
 
			return new Size(explicitWidth ?? measured.Width, explicitHeight ?? measured.Height);
		}
 
		internal static void PlatformArrangeHandler(this IViewHandler viewHandler, Rect frame)
		{
			var platformView = viewHandler.ToPlatform();
 
			if (platformView == null)
				return;
 
			if (frame.Width < 0 || frame.Height < 0)
			{
				// This is just some initial Forms value nonsense, nothing is actually laying out yet
				return;
			}
 
			var bounds = frame.ToPixel();
			if (platformView.Layout != null)
			{
				platformView.Layout.MeasuredWidth = new NMeasuredSize(new NLayoutLength((float)bounds.Width), NMeasuredSize.StateType.MeasuredSizeOK);
				platformView.Layout.MeasuredHeight = new NMeasuredSize(new NLayoutLength((float)bounds.Height), NMeasuredSize.StateType.MeasuredSizeOK);
			}
			platformView.UpdateBounds(bounds);
 
			viewHandler.Invoke(nameof(IView.Frame), frame);
		}
	}
}