using System;
using Tizen.NUI;
using Tizen.NUI.BaseComponents;
namespace CustomLayoutWithoutAbsoluteLayout
{
public class CustomLayout : LayoutGroup
{
protected override void OnMeasure(MeasureSpecification widthMeasureSpec, MeasureSpecification heightMeasureSpec)
{
var accumulatedWidth = new LayoutLength(0);
var maxHeight = 0;
var measuredWidth = new LayoutLength(0);
LayoutLength measuredHeight = new LayoutLength(0);
MeasureSpecification.ModeType widthMode = widthMeasureSpec.Mode;
MeasureSpecification.ModeType heightMode = heightMeasureSpec.Mode;
bool isWidthExact = (widthMode == MeasureSpecification.ModeType.EXACTLY);
bool isHeightExact = (heightMode == MeasureSpecification.ModeType.EXACTLY);
// In this layout we will:
// Measuring the layout with the children in a horizontal configuration, one after another
// Set the required width to be the accumulated width of our children
// Set the required height to be the maximum height of any of our children
for (uint i = 0; i < ChildCount; ++i)
{
var childLayout = GetChildAt(i);
if (childLayout)
{
MeasureChild(childLayout, widthMeasureSpec, heightMeasureSpec);
accumulatedWidth += childLayout.MeasuredWidth;
maxHeight = System.Math.Max(childLayout.MeasuredHeight.Value, maxHeight);
}
}
measuredHeight.Value = maxHeight;
measuredWidth = accumulatedWidth;
if (isWidthExact)
{
measuredWidth = new LayoutLength(widthMeasureSpec.Size);
}
if (isHeightExact)
{
measuredHeight = new LayoutLength(heightMeasureSpec.Size);
}
// Finally, call this method to set the dimensions we would like
SetMeasuredDimensions(new MeasuredSize(measuredWidth), new MeasuredSize(measuredHeight));
}
protected override void OnLayout(bool changed, LayoutLength left, LayoutLength top, LayoutLength right, LayoutLength bottom)
{
LayoutLength childTop = new LayoutLength(0);
LayoutLength childLeft = new LayoutLength(0);
// We want to vertically align the children to the middle
var height = bottom - top;
var middle = height / 2;
// Horizontally align the children to the middle of the space they are given too
var width = right - left;
uint count = ChildCount;
var childIncrement = 0;
if (count > 0)
{
childIncrement = width.Value / System.Convert.ToInt32(count);
}
var center = childIncrement / 2;
// Check layout direction
var view = GetOwner();
ViewLayoutDirectionType layoutDirection = view.LayoutDirection;
for (uint i = 0; i < count; i++)
{
uint itemIndex;
// If RTL, then layout the last item first
if (layoutDirection == ViewLayoutDirectionType.RTL)
{
itemIndex = count - 1 - i;
}
else
{
itemIndex = i;
}
LayoutItem childLayout = GetChildAt(itemIndex);
if (childLayout)
{
var childWidth = childLayout.MeasuredWidth;
var childHeight = childLayout.MeasuredHeight;
childTop = middle - (childHeight / 2);
var leftPosition = childLeft + center - childWidth / 2;
childLayout.Layout(leftPosition, childTop, leftPosition + childWidth, childTop + childHeight);
childLeft += childIncrement;
}
}
}
}
}
namespace CustomLayoutWithoutAbsoluteLayout
{
static class TestImages
{
//private const string resources = "./res";
public static string resources = Tizen.Applications.Application.Current.DirectoryInfo.Resource;
/// Child image filenames
public static readonly string[] s_images = new string[]
{
resources + "/images/application-icon-101.png",
resources + "/images/application-icon-102.png",
resources + "/images/application-icon-103.png",
resources + "/images/application-icon-104.png"
};
}
class Example : NUIApplication
{
protected override void OnCreate()
{
base.OnCreate();
Initialize();
}
private void Initialize()
{
// Change the background color of Window to White
Window window = Window.Instance;
window.BackgroundColor = Color.White;
//Layer layer = new Layer();
//window.AddLayer(layer);
// Create a new view
View customLayoutView = new View();
customLayoutView.Name = "CustomLayoutView";
customLayoutView.ParentOrigin = ParentOrigin.Center;
customLayoutView.PivotPoint = PivotPoint.Center;
customLayoutView.PositionUsesPivotPoint = true;
// Set our Custom Layout on the view
var layout = new CustomLayout();
customLayoutView.Layout = layout;
customLayoutView.SetProperty(LayoutItemWrapper.ChildProperty.WIDTH_SPECIFICATION, new PropertyValue(-2)); // -2 WRAP_CONTENT
customLayoutView.SetProperty(LayoutItemWrapper.ChildProperty.HEIGHT_SPECIFICATION, new PropertyValue(350));
customLayoutView.BackgroundColor = Color.Blue;
window.Add(customLayoutView);
// Add child image-views to the created view
foreach (String image in TestImages.s_images)
{
customLayoutView.Add(CreateChildImageView(image, new Size2D(100, 100)));
}
}
///
/// Helper function to create ImageViews with given filename and size..
///
/// The filename of the image to use.
/// The size that the image should be loaded at.
/// The created ImageView.
ImageView CreateChildImageView(String url, Size2D size)
{
ImageView imageView = new ImageView();
ImageVisual imageVisual = new ImageVisual();
imageVisual.URL = url;
imageVisual.DesiredHeight = size.Height;
imageVisual.DesiredWidth = size.Width;
imageView.Image = imageVisual.OutputVisualMap;
imageView.Name = "ImageView";
imageView.HeightResizePolicy = ResizePolicyType.Fixed;
imageView.WidthResizePolicy = ResizePolicyType.Fixed;
return imageView;
}
static void _Main(string[] args)
{
Example simpleLayout = new Example();
simpleLayout.Run(args);
}
}
}