in FigmaSharp/FigmaSharp.Cocoa/PropertyConfigure/CodePropertyConfigure.cs [45:236]
public override string ConvertToCode(string propertyName, CodeNode currentNode, CodeNode parentNode, NodeConverter converter, CodeRenderService rendererService)
{
if (propertyName == PropertyNames.Frame)
{
if (!rendererService.HasConstraints(currentNode.Node, converter))
return string.Empty;
System.Text.StringBuilder builder = new System.Text.StringBuilder();
if (currentNode.Node is IAbsoluteBoundingBox absoluteBounding)
{
var name = currentNode.Name;
if (rendererService.HasWidthConstraint(currentNode.Node, converter))
{
//width
var widthConstraintName = $"{name}WidthConstraint";
var widthMaxStringValue = Math.Max(absoluteBounding.absoluteBoundingBox.Width, 1).ToDesignerString();
var widthConstraintStringValue = CodeGenerationHelpers.GetWidthConstraintEqualToConstant(name, widthMaxStringValue);
builder.AppendLine($"var {widthConstraintName} = {widthConstraintStringValue};");
if (rendererService.IsFlexibleHorizontal(currentNode, converter))
builder.WritePropertyEquality(widthConstraintName, nameof(AppKit.NSLayoutConstraint.Priority), $"({typeof(int).FullName}){typeof(NSLayoutPriority)}.{nameof(NSLayoutPriority.DefaultLow)}");
builder.WritePropertyEquality(widthConstraintName, nameof(AppKit.NSLayoutConstraint.Active), true);
}
if (rendererService.HasHeightConstraint(currentNode.Node, converter))
{
//height
var heightConstraintName = $"{name}HeightConstraint";
var heightStringValue = Math.Max(absoluteBounding.absoluteBoundingBox.Height, 1).ToDesignerString();
var heightConstraintStringValue = CodeGenerationHelpers.GetHeightConstraintEqualToConstant(name, heightStringValue);
builder.AppendLine($"var {heightConstraintName} = {heightConstraintStringValue};");
if (rendererService.IsFlexibleVertical(currentNode, converter))
builder.WritePropertyEquality(heightConstraintName, nameof(AppKit.NSLayoutConstraint.Priority), $"({typeof(int).FullName}){typeof(NSLayoutPriority)}.{nameof(NSLayoutPriority.DefaultLow)}");
builder.WritePropertyEquality(heightConstraintName, nameof(AppKit.NSLayoutConstraint.Active), true);
}
return builder.ToString();
}
return string.Empty;
}
if (propertyName == PropertyNames.AddChild)
{
if (currentNode.Node.Parent?.IsStackView () ?? false)
return parentNode?.GetMethod(nameof(NSStackView.AddArrangedSubview), currentNode.Name);
else
return parentNode?.GetMethod(nameof(NSView.AddSubview), currentNode.Name);
}
if (propertyName == PropertyNames.Size)
{
if (currentNode.Node is IAbsoluteBoundingBox container)
{
if (currentNode.Node is FigmaLine line)
{
var width = container.absoluteBoundingBox.Width == 0 ? 1 : container.absoluteBoundingBox.Width;
var height = container.absoluteBoundingBox.Height == 0 ? 1 : container.absoluteBoundingBox.Height;
var size = typeof(CoreGraphics.CGSize).GetConstructor(new string[] { width.ToDesignerString(), height.ToDesignerString() });
return currentNode.GetMethod(nameof(NSView.SetFrameSize), size);
}
var sizeConstructor = typeof(CoreGraphics.CGSize).GetConstructor(
container.absoluteBoundingBox.Width.ToDesignerString(),
container.absoluteBoundingBox.Height.ToDesignerString());
return currentNode.GetMethod(nameof(NSView.SetFrameSize), sizeConstructor);
}
return string.Empty;
}
if (propertyName == PropertyNames.Position)
{
//first level has an special behaviour on positioning
if (currentNode.Node.Parent is FigmaCanvas)
return string.Empty;
if (currentNode.Node is IAbsoluteBoundingBox absoluteBounding && currentNode.Node.Parent is IAbsoluteBoundingBox parentAbsoluteBoundingBox)
{
var x = absoluteBounding.absoluteBoundingBox.X - parentAbsoluteBoundingBox.absoluteBoundingBox.X;
var parentY = parentAbsoluteBoundingBox.absoluteBoundingBox.Y + parentAbsoluteBoundingBox.absoluteBoundingBox.Height;
var actualY = absoluteBounding.absoluteBoundingBox.Y + absoluteBounding.absoluteBoundingBox.Height;
var y = parentY - actualY;
if (x != default || y != default)
{
var pointConstructor = typeof(CoreGraphics.CGPoint)
.GetConstructor(x.ToDesignerString(), y.ToDesignerString()
);
return currentNode.GetMethod(nameof(AppKit.NSView.SetFrameOrigin), pointConstructor);
}
}
return string.Empty;
}
if (propertyName == PropertyNames.Constraints)
{
if (!rendererService.HasConstraints(currentNode.Node, converter))
return string.Empty;
if (currentNode.Node is IConstraints constrainedNode && currentNode.Node.Parent != null)
{
string parentNodeName = parentNode?.Name;
if (string.IsNullOrEmpty(parentNodeName))
{
//we try to resolve the name using the default behaviour
parentNodeName = GetDefaultParentName(currentNode.Node, currentNode.Node.Parent, rendererService);
}
var builder = new System.Text.StringBuilder();
var constraints = constrainedNode.constraints;
var absoluteBoundingBox = ((IAbsoluteBoundingBox)currentNode.Node)
.absoluteBoundingBox;
var absoluteBoundBoxParent = ((IAbsoluteBoundingBox)(parentNode == null ? currentNode.Node.Parent : currentNode.Node.Parent))
.absoluteBoundingBox;
if (parentNode != null && !parentNode.Node.IsStackView())
{
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 rightConstraintStringValue = CodeGenerationHelpers.GetTrailingConstraintEqualToAnchor(
currentNode.Name, -value, parentNodeName);
builder.WritePropertyEquality(rightConstraintStringValue, nameof(NSLayoutConstraint.Active), true);
}
if (constraints.horizontal.Contains("LEFT"))
{
var value2 = absoluteBoundingBox.X - absoluteBoundBoxParent.X;
var rightConstraintStringValue = CodeGenerationHelpers.GetLeadingConstraintEqualToAnchor(
currentNode.Name, value2, parentNodeName);
builder.WritePropertyEquality(rightConstraintStringValue, nameof(NSLayoutConstraint.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 rightConstraintStringValue = CodeGenerationHelpers.GetBottomConstraintEqualToAnchor(
currentNode.Name, -value2, parentNodeName);
builder.WritePropertyEquality(rightConstraintStringValue, nameof(NSLayoutConstraint.Active), true);
}
if (constraints.vertical.Contains("TOP"))
{
var parentFrameObject = currentNode.Node as FigmaFrame;
var value = absoluteBoundingBox.Y - absoluteBoundBoxParent.Y;
var rightConstraintStringValue = CodeGenerationHelpers.GetTopConstraintEqualToAnchor(
currentNode.Name, value, parentNodeName);
builder.WritePropertyEquality(rightConstraintStringValue, nameof(NSLayoutConstraint.Active), true);
}
if (constraints.horizontal == "CENTER" || constraints.horizontal == "SCALE")
{
var delta = absoluteBoundingBox.X - absoluteBoundBoxParent.X - absoluteBoundBoxParent.Center.X;
var rightConstraintStringValue = CodeGenerationHelpers.GetConstraintEqualToAnchor(
currentNode.Name, nameof(NSView.LeadingAnchor), delta, parentNodeName, nameof(NSView.CenterXAnchor));
builder.WritePropertyEquality(rightConstraintStringValue, nameof(NSLayoutConstraint.Active), true);
}
if (constraints.vertical == "CENTER" || constraints.vertical == "SCALE")
{
var delta = absoluteBoundingBox.Y - absoluteBoundBoxParent.Y - absoluteBoundBoxParent.Center.Y;
var rightConstraintStringValue = CodeGenerationHelpers.GetConstraintEqualToAnchor(
currentNode.Name, nameof(NSView.TopAnchor), delta, parentNodeName, nameof(NSView.CenterYAnchor));
builder.WritePropertyEquality(rightConstraintStringValue, nameof(NSLayoutConstraint.Active), true);
}
}
return builder.ToString();
}
return string.Empty;
}
throw new System.NotImplementedException(propertyName);
}