C# Baseline function
Summary: same as Measure function, based on #317 Closes https://github.com/facebook/yoga/pull/321 Reviewed By: emilsjolander Differential Revision: D4385336 Pulled By: splhack fbshipit-source-id: b583ec79861d2e9abba31a72503e2f706bfda8e8
This commit is contained in:
committed by
Facebook Github Bot
parent
8d320ceac2
commit
70a4221b9e
13
csharp/Facebook.Yoga/BaselineFunction.cs
Normal file
13
csharp/Facebook.Yoga/BaselineFunction.cs
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2014-present, Facebook, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the BSD-style license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree. An additional grant
|
||||||
|
* of patent rights can be found in the PATENTS file in the same directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Facebook.Yoga
|
||||||
|
{
|
||||||
|
public delegate float BaselineFunction(YogaNode node, float width, float height);
|
||||||
|
}
|
@@ -9,12 +9,14 @@
|
|||||||
<Import_RootNamespace>Facebook.Yoga.Shared</Import_RootNamespace>
|
<Import_RootNamespace>Facebook.Yoga.Shared</Import_RootNamespace>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Compile Include="$(MSBuildThisFileDirectory)BaselineFunction.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)Border.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)Border.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)MeasureFunction.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)MeasureFunction.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)MeasureOutput.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)MeasureOutput.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)Native.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)Native.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)Spacing.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)Spacing.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)YogaAlign.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)YogaAlign.cs" />
|
||||||
|
<Compile Include="$(MSBuildThisFileDirectory)YogaBaselineFunc.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)YogaConstants.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)YogaConstants.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)YogaDimension.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)YogaDimension.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)YogaDirection.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)YogaDirection.cs" />
|
||||||
|
@@ -104,8 +104,9 @@ namespace Facebook.Yoga
|
|||||||
[MarshalAs(UnmanagedType.FunctionPtr)] YogaMeasureFunc measureFunc);
|
[MarshalAs(UnmanagedType.FunctionPtr)] YogaMeasureFunc measureFunc);
|
||||||
|
|
||||||
[DllImport(DllName, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
|
[DllImport(DllName, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
|
||||||
[return: MarshalAs(UnmanagedType.FunctionPtr)]
|
public static extern void YGNodeSetBaselineFunc(
|
||||||
public static extern YogaMeasureFunc YGNodeGetMeasureFunc(YGNodeHandle node);
|
YGNodeHandle node,
|
||||||
|
[MarshalAs(UnmanagedType.FunctionPtr)] YogaBaselineFunc baselineFunc);
|
||||||
|
|
||||||
[DllImport(DllName, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
|
[DllImport(DllName, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
|
||||||
public static extern void YGNodeSetHasNewLayout(YGNodeHandle node, [MarshalAs(UnmanagedType.I1)] bool hasNewLayout);
|
public static extern void YGNodeSetHasNewLayout(YGNodeHandle node, [MarshalAs(UnmanagedType.I1)] bool hasNewLayout);
|
||||||
|
17
csharp/Facebook.Yoga/YogaBaselineFunc.cs
Normal file
17
csharp/Facebook.Yoga/YogaBaselineFunc.cs
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2014-present, Facebook, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the BSD-style license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree. An additional grant
|
||||||
|
* of patent rights can be found in the PATENTS file in the same directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace Facebook.Yoga
|
||||||
|
{
|
||||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||||
|
public delegate float YogaBaselineFunc(IntPtr node, float width, float height);
|
||||||
|
}
|
@@ -21,6 +21,8 @@ namespace Facebook.Yoga
|
|||||||
private List<YogaNode> _children;
|
private List<YogaNode> _children;
|
||||||
private MeasureFunction _measureFunction;
|
private MeasureFunction _measureFunction;
|
||||||
private YogaMeasureFunc _ygMeasureFunc;
|
private YogaMeasureFunc _ygMeasureFunc;
|
||||||
|
private BaselineFunction _baselineFunction;
|
||||||
|
private YogaBaselineFunc _ygBaselineFunc;
|
||||||
private object _data;
|
private object _data;
|
||||||
|
|
||||||
public YogaNode()
|
public YogaNode()
|
||||||
@@ -37,6 +39,7 @@ namespace Facebook.Yoga
|
|||||||
public void Reset()
|
public void Reset()
|
||||||
{
|
{
|
||||||
_measureFunction = null;
|
_measureFunction = null;
|
||||||
|
_baselineFunction = null;
|
||||||
_data = null;
|
_data = null;
|
||||||
|
|
||||||
Native.YGNodeReset(_ygNode);
|
Native.YGNodeReset(_ygNode);
|
||||||
@@ -84,6 +87,14 @@ namespace Facebook.Yoga
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool IsBaselineDefined
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _baselineFunction != null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void CopyStyle(YogaNode srcNode)
|
public void CopyStyle(YogaNode srcNode)
|
||||||
{
|
{
|
||||||
Native.YGNodeCopyStyle(_ygNode, srcNode._ygNode);
|
Native.YGNodeCopyStyle(_ygNode, srcNode._ygNode);
|
||||||
@@ -585,6 +596,13 @@ namespace Facebook.Yoga
|
|||||||
Native.YGNodeSetMeasureFunc(_ygNode, _ygMeasureFunc);
|
Native.YGNodeSetMeasureFunc(_ygNode, _ygMeasureFunc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SetBaselineFunction(BaselineFunction baselineFunction)
|
||||||
|
{
|
||||||
|
_baselineFunction = baselineFunction;
|
||||||
|
_ygBaselineFunc = baselineFunction != null ? BaselineInternal : (YogaBaselineFunc)null;
|
||||||
|
Native.YGNodeSetBaselineFunc(_ygNode, _ygBaselineFunc);
|
||||||
|
}
|
||||||
|
|
||||||
public void CalculateLayout()
|
public void CalculateLayout()
|
||||||
{
|
{
|
||||||
Native.YGNodeCalculateLayout(
|
Native.YGNodeCalculateLayout(
|
||||||
@@ -609,6 +627,16 @@ namespace Facebook.Yoga
|
|||||||
return _measureFunction(this, width, widthMode, height, heightMode);
|
return _measureFunction(this, width, widthMode, height, heightMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private float BaselineInternal(IntPtr node, float width, float height)
|
||||||
|
{
|
||||||
|
if (_baselineFunction == null)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("Baseline function is not defined.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return _baselineFunction(this, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
public string Print(YogaPrintOptions options =
|
public string Print(YogaPrintOptions options =
|
||||||
YogaPrintOptions.Layout|YogaPrintOptions.Style|YogaPrintOptions.Children)
|
YogaPrintOptions.Layout|YogaPrintOptions.Style|YogaPrintOptions.Children)
|
||||||
{
|
{
|
||||||
|
@@ -197,6 +197,54 @@ namespace Facebook.Yoga
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestBaselineFunc()
|
||||||
|
{
|
||||||
|
YogaNode node = new YogaNode();
|
||||||
|
node.Height = 200;
|
||||||
|
node.FlexDirection = YogaFlexDirection.Row;
|
||||||
|
node.AlignItems = YogaAlign.Baseline;
|
||||||
|
|
||||||
|
YogaNode child0 = new YogaNode();
|
||||||
|
child0.Width = 100;
|
||||||
|
child0.Height = 110;
|
||||||
|
child0.SetBaselineFunction((_, width, height) => {
|
||||||
|
Assert.AreEqual(100, width);
|
||||||
|
Assert.AreEqual(110, height);
|
||||||
|
return 65;
|
||||||
|
});
|
||||||
|
node.Insert(0, child0);
|
||||||
|
|
||||||
|
YogaNode child1 = new YogaNode();
|
||||||
|
child1.Width = 100;
|
||||||
|
child1.Height = 110;
|
||||||
|
child1.SetBaselineFunction((_, width, height) => {
|
||||||
|
Assert.AreEqual(100, width);
|
||||||
|
Assert.AreEqual(110, height);
|
||||||
|
return 80;
|
||||||
|
});
|
||||||
|
node.Insert(1, child1);
|
||||||
|
|
||||||
|
YogaNode child2 = new YogaNode();
|
||||||
|
child2.Width = 100;
|
||||||
|
child2.Height = 110;
|
||||||
|
child2.SetBaselineFunction((_, width, height) => {
|
||||||
|
Assert.AreEqual(100, width);
|
||||||
|
Assert.AreEqual(110, height);
|
||||||
|
return 88;
|
||||||
|
});
|
||||||
|
node.Insert(2, child2);
|
||||||
|
|
||||||
|
node.CalculateLayout();
|
||||||
|
|
||||||
|
Assert.AreEqual(0, child0.LayoutX);
|
||||||
|
Assert.AreEqual(23, child0.LayoutY);
|
||||||
|
Assert.AreEqual(100, child1.LayoutX);
|
||||||
|
Assert.AreEqual(8, child1.LayoutY);
|
||||||
|
Assert.AreEqual(200, child2.LayoutX);
|
||||||
|
Assert.AreEqual(0, child2.LayoutY);
|
||||||
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void TestPrint()
|
public void TestPrint()
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user