Summary: - Does not contain "magic" found in YogaKit yet, but enough to get started - Simple test project showing use - YGInteropSetLogger and YGNodeInit(IntPtr) were missing from native lib built by buck Closes https://github.com/facebook/yoga/pull/278 Reviewed By: emilsjolander Differential Revision: D4388480 Pulled By: splhack fbshipit-source-id: a7387bb5b5554b6fce80d08c23e4fa18a4611cce
138 lines
4.2 KiB
C#
138 lines
4.2 KiB
C#
/**
|
|
* Copyright 2014-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the license found in the
|
|
* LICENSE-examples file in the root directory of this source tree.
|
|
*/
|
|
|
|
//#define DEBUG_LAYOUT
|
|
using System;
|
|
|
|
using AppKit;
|
|
using Foundation;
|
|
using CoreGraphics;
|
|
|
|
namespace Facebook.Yoga.Mac.Test
|
|
{
|
|
public static class NSViewYogaExtensions
|
|
{
|
|
public static void ApplyYogaLayout (this NSView view, YogaNode n, bool root = true)
|
|
{
|
|
#if DEBUG_LAYOUT
|
|
Console.WriteLine ($"ApplyYogaLayout {view.ToolTip}, {n.LayoutX}, {n.LayoutY}, {n.LayoutWidth}, {n.LayoutHeight}");
|
|
#endif
|
|
|
|
// A bit of gross special casing
|
|
// This really should mostly go away if/when the UIView+Yoga.m magic gets ported to AppKit
|
|
if (root)
|
|
view.Frame = new CGRect (n.LayoutX, n.LayoutY, n.LayoutWidth, n.LayoutHeight);
|
|
#if DEBUG_LAYOUT
|
|
Console.WriteLine ($"Setting {view.ToolTip} frame to {view.Frame}");
|
|
#endif
|
|
|
|
// This assumes your YogaNode and NSView children were inserted in same order
|
|
for (int i = 0; i < n.Count; ++i) {
|
|
YogaNode childNode = n[i];
|
|
// Cocoa coord space is from bottom left not top left
|
|
view.Subviews[i].Frame = new CGRect (childNode.LayoutX, n.LayoutHeight - childNode.LayoutY - childNode.LayoutHeight, childNode.LayoutWidth, childNode.LayoutHeight);
|
|
#if DEBUG_LAYOUT
|
|
Console.WriteLine ($"Setting {view.Subviews[i].ToolTip} frame to {view.Subviews[i].Frame}");
|
|
#endif
|
|
if (childNode.Count > 0){
|
|
#if DEBUG_LAYOUT
|
|
Console.WriteLine ($"Calling ApplyYogaLayout recursively on {view.Subviews[i].ToolTip}");
|
|
#endif
|
|
ApplyYogaLayout (view.Subviews[i], childNode, false);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public partial class ViewController : NSViewController
|
|
{
|
|
public ViewController(IntPtr handle) : base(handle)
|
|
{
|
|
}
|
|
|
|
public override void ViewDidLoad()
|
|
{
|
|
base.ViewDidLoad ();
|
|
|
|
NSImage image = NSImage.ImageNamed (NSImageName.TrashFull);
|
|
|
|
NSView root = CreateViewHierarchy (image);
|
|
var rootNode = CalculateLayout (View.Frame, image.Size);
|
|
|
|
root.ApplyYogaLayout (rootNode);
|
|
|
|
View.AddSubview (root);
|
|
}
|
|
|
|
static NSView CreateViewHierarchy (NSImage image)
|
|
{
|
|
var root = new NSView () {
|
|
WantsLayer = true,
|
|
ToolTip = "Root"
|
|
};
|
|
root.Layer.BackgroundColor = NSColor.Red.CGColor;
|
|
|
|
NSView child1 = new NSView () {
|
|
WantsLayer = true,
|
|
ToolTip = "Child 1"
|
|
};
|
|
child1.Layer.BackgroundColor = NSColor.Blue.CGColor;
|
|
|
|
NSView child2 = new NSView () {
|
|
WantsLayer = true,
|
|
ToolTip = "Child 2"
|
|
};
|
|
child2.Layer.BackgroundColor = NSColor.Green.CGColor;
|
|
|
|
NSView child3 = new NSView () {
|
|
WantsLayer = true,
|
|
ToolTip = "Child 3"
|
|
};
|
|
child3.Layer.BackgroundColor = NSColor.Yellow.CGColor;
|
|
|
|
root.AddSubview (child1);
|
|
root.AddSubview (child2);
|
|
child2.AddSubview (child3);
|
|
|
|
return root;
|
|
}
|
|
|
|
static YogaNode CalculateLayout (CGRect rootFrame, CGSize imageSize)
|
|
{
|
|
var rootNode = new YogaNode () {
|
|
Width = (float)rootFrame.Width,
|
|
Height = (float)rootFrame.Height,
|
|
AlignItems = YogaAlign.Center,
|
|
JustifyContent = YogaJustify.Center
|
|
};
|
|
|
|
var child1Node = new YogaNode () {
|
|
Width = 100,
|
|
Height = 100
|
|
};
|
|
|
|
var child2Node = new YogaNode () {
|
|
Width = 200,
|
|
Height = 100
|
|
};
|
|
|
|
var child3Node = new YogaNode () {
|
|
Width = 100,
|
|
Height = 100
|
|
};
|
|
|
|
rootNode.Insert (0, child1Node);
|
|
rootNode.Insert (1, child2Node);
|
|
child2Node.Insert (0, child3Node);
|
|
rootNode.CalculateLayout ();
|
|
|
|
return rootNode;
|
|
}
|
|
}
|
|
}
|