in FigmaSharp/FigmaSharp.Cocoa/PropertyConfigure/ViewPropertyConfigure.cs [38:146]
public override void Configure(string propertyName, ViewNode currentViewNode, ViewNode parentViewNode, NodeConverter converter, ViewRenderService rendererService)
{
var currentNode = currentViewNode.Node;
var parentNode = parentViewNode?.Node;
if (propertyName == PropertyNames.AddChild)
{
if (parentViewNode?.View != null)
{
if (parentNode.IsStackView() && parentViewNode.View.NativeObject is AppKit.NSStackView stackView)
stackView.AddArrangedSubview(currentViewNode.View.NativeObject as NSView);
else
parentViewNode.View.AddChild(currentViewNode.View);
}
return;
}
if (propertyName == PropertyNames.Constraints)
{
if (!rendererService.HasConstraints(currentNode, converter))
return;
if (currentNode is IConstraints constrainedNode && currentViewNode?.View?.NativeObject is AppKit.NSView nativeView && parentViewNode?.View?.NativeObject is AppKit.NSView parentNativeView)
{
var constraints = constrainedNode.constraints;
var absoluteBoundingBox = ((IAbsoluteBoundingBox)currentNode)
.absoluteBoundingBox;
var absoluteBoundBoxParent = ((IAbsoluteBoundingBox)parentNode)
.absoluteBoundingBox;
if (constraints.horizontal.Contains("RIGHT") || constraints.horizontal == "SCALE")
{
var endPosition1 = absoluteBoundingBox.X + absoluteBoundingBox.Width;
var endPosition2 = absoluteBoundBoxParent.X + absoluteBoundBoxParent.Width;
var value = Math.Max(endPosition1, endPosition2) - Math.Min(endPosition1, endPosition2);
var rightConstraint = nativeView.TrailingAnchor.ConstraintEqualToAnchor(parentNativeView.TrailingAnchor, -value);
rightConstraint.Active = true;
}
if (constraints.horizontal.Contains ("LEFT"))
{
var value2 = absoluteBoundingBox.X - absoluteBoundBoxParent.X;
nativeView.LeadingAnchor.ConstraintEqualToAnchor(parentNativeView.LeadingAnchor, value2)
.Active = true;
}
if (constraints.vertical.Contains("BOTTOM") || constraints.horizontal == "SCALE")
{
var endPosition1 = absoluteBoundingBox.Y + absoluteBoundingBox.Height;
var endPosition2 = absoluteBoundBoxParent.Y + absoluteBoundBoxParent.Height;
var value2 = Math.Max(endPosition1, endPosition2) - Math.Min(endPosition1, endPosition2);
var bottomConstraint = nativeView.BottomAnchor.ConstraintEqualToAnchor(parentNativeView.BottomAnchor, -value2);
bottomConstraint.Active = true;
}
if (constraints.vertical.Contains ("TOP"))
{
var value = absoluteBoundingBox.Y - absoluteBoundBoxParent.Y;
nativeView.TopAnchor.ConstraintEqualToAnchor(parentNativeView.TopAnchor, value)
.Active = true;
}
if (constraints.horizontal == "CENTER" || constraints.horizontal == "SCALE")
{
var delta = absoluteBoundingBox.X - absoluteBoundBoxParent.X - absoluteBoundBoxParent.Center.X;
nativeView.LeadingAnchor.ConstraintEqualToAnchor(parentNativeView.CenterXAnchor, delta)
.Active = true;
}
if (constraints.vertical == "CENTER" || constraints.vertical == "SCALE")
{
var delta = absoluteBoundingBox.Y - absoluteBoundBoxParent.Y - absoluteBoundBoxParent.Center.Y;
//var delta = absoluteBoundBoxParent.Center.Substract(absoluteBoundingBox.Origin).Y;
var test = nativeView.TopAnchor.ConstraintEqualToAnchor(parentNativeView.CenterYAnchor, delta);
test.Active = true;
}
}
return;
}
if (propertyName == PropertyNames.Frame)
{
if (currentNode is IAbsoluteBoundingBox absoluteBounding)
{
if (!rendererService.HasConstraints(currentNode, converter))
return;
var nativeView = currentViewNode?.View?.NativeObject as AppKit.NSView;
if (rendererService.HasWidthConstraint(currentNode, converter))
{
var widthConstraint = nativeView.WidthAnchor.ConstraintEqualToConstant(Math.Max(absoluteBounding.absoluteBoundingBox.Width, 1));
if (rendererService.IsFlexibleHorizontal(currentViewNode, converter))
widthConstraint.Priority = (float)NSLayoutPriority.DefaultLow;
widthConstraint.Active = true;
}
if (rendererService.HasHeightConstraint(currentNode, converter))
{
var heightConstraint = nativeView.HeightAnchor.ConstraintEqualToConstant(Math.Max(absoluteBounding.absoluteBoundingBox.Height, 1));
if (rendererService.IsFlexibleVertical(currentViewNode, converter))
heightConstraint.Priority = (float)NSLayoutPriority.DefaultLow;
heightConstraint.Active = true;
}
}
return;
}
}