/// This will be public opened in tizen_5.0 after ACR done. Before ACR, need to be hidden as inhouse API.
[EditorBrowsable(EditorBrowsableState.Never)]
- public ResourceDictionary Resources
+ public ResourceDictionary XamlResources
{
get
{
- return Application.Current.Resources;
+ return Application.Current.XamlResources;
}
set
{
- Application.Current.Resources = value;
+ Application.Current.XamlResources = value;
}
}
Tizen.NUI.Object.SetProperty(view.swigCPtr, View.Property.STYLE_NAME, new Tizen.NUI.PropertyValue((string)newValue));
}
},
- defaultValueCreator:(bindable) =>
+ defaultValueCreator:(bindable) =>
{
var view = (View)bindable;
string temp;
});
/// This will be public opened in tizen_5.0 after ACR done. Before ACR, need to be hidden as inhouse API.
[EditorBrowsable(EditorBrowsableState.Never)]
+ public static readonly BindableProperty WeightProperty = BindableProperty.Create("Weight", typeof(float), typeof(View), default(float), propertyChanged: (bindable, oldValue, newValue) =>
+ {
+ var view = (View)bindable;
+ if (newValue != null)
+ {
+ Tizen.NUI.Object.SetProperty(view.swigCPtr, LinearLayout.ChildProperty.WEIGHT, new Tizen.NUI.PropertyValue((float)newValue));
+ }
+ },
+ defaultValueCreator:(bindable) =>
+ {
+ var view = (View)bindable;
+ float temp = 0.0f;
+ Tizen.NUI.Object.GetProperty(view.swigCPtr, LinearLayout.ChildProperty.WEIGHT).Get(out temp);
+ return temp;
+ });
+ /// This will be public opened in tizen_5.0 after ACR done. Before ACR, need to be hidden as inhouse API.
+ [EditorBrowsable(EditorBrowsableState.Never)]
public static readonly BindableProperty LeftFocusableViewProperty = BindableProperty.Create("LeftFocusableView", typeof(View), typeof(View), default(View), propertyChanged: (bindable, oldValue, newValue) =>
{
var view = (View)bindable;
Size temp = new Size(0.0f, 0.0f, 0.0f);
Tizen.NUI.Object.GetProperty(view.swigCPtr, View.Property.SIZE).Get(temp);
Size2D size = new Size2D((int)temp.Width, (int)temp.Height);
- Console.WriteLine($"View Size2DProperty get width: {size.Width} height: {size.Height}");
return size;
});
/// This will be public opened in tizen_5.0 after ACR done. Before ACR, need to be hidden as inhouse API.
{
Tizen.NUI.Object.SetProperty(view.swigCPtr, View.Property.POSITION_USES_ANCHOR_POINT, new Tizen.NUI.PropertyValue((bool)newValue));
}
- Console.WriteLine("View PositionUsesPivotPointProperty changed: oldValue: " + oldValue + ", newValue: " + newValue);
},
defaultValueCreator:(bindable) =>
{
{
Tizen.NUI.Object.SetProperty(view.swigCPtr, View.Property.PARENT_ORIGIN, new Tizen.NUI.PropertyValue((Position)newValue));
}
- Console.WriteLine("View ParentOriginProperty changed: oldValue: " + oldValue + ", newValue: " + newValue);
},
defaultValueCreator:(bindable) =>
{
{
Tizen.NUI.Object.SetProperty(view.swigCPtr, View.Property.ANCHOR_POINT, new Tizen.NUI.PropertyValue((Position)newValue));
}
- Console.WriteLine("View PivotPointProperty changed: oldValue: " + oldValue + ", newValue: " + newValue);
},
defaultValueCreator:(bindable) =>
{
{
Tizen.NUI.Object.SetProperty(view.swigCPtr, View.Property.SIZE_WIDTH, new Tizen.NUI.PropertyValue((float)newValue));
}
- Console.WriteLine("View SizeWidthProperty changed: oldValue: " + oldValue + ", newValue: " + newValue);
},
defaultValueCreator:(bindable) =>
{
var view = (View)bindable;
float temp = 0.0f;
Tizen.NUI.Object.GetProperty(view.swigCPtr, View.Property.SIZE_WIDTH).Get(out temp);
- Console.WriteLine($"View SizeWidthProperty get Value: {temp}");
return temp;
});
/// This will be public opened in tizen_5.0 after ACR done. Before ACR, need to be hidden as inhouse API.
{
Tizen.NUI.Object.SetProperty(view.swigCPtr, View.Property.SIZE_HEIGHT, new Tizen.NUI.PropertyValue((float)newValue));
}
- Console.WriteLine("View SizeHeightProperty changed: oldValue: " + oldValue + ", newValue: " + newValue);
},
defaultValueCreator:(bindable) =>
{
var view = (View)bindable;
float temp = 0.0f;
Tizen.NUI.Object.GetProperty(view.swigCPtr, View.Property.SIZE_HEIGHT).Get(out temp);
- Console.WriteLine($"View SizeHeightProperty get Value: {temp}");
return temp;
});
/// This will be public opened in tizen_5.0 after ACR done. Before ACR, need to be hidden as inhouse API.
defaultValueCreator:(bindable) =>
{
var view = (View)bindable;
- string temp;
+ int temp = 0;
if (Tizen.NUI.Object.GetProperty(view.swigCPtr, View.Property.CLIPPING_MODE).Get(out temp) == false)
{
NUILog.Error("ClippingMode get error!");
}
- switch (temp)
- {
- case "DISABLED": return ClippingModeType.Disabled;
- case "CLIP_CHILDREN": return ClippingModeType.ClipChildren;
- case "CLIP_TO_BOUNDING_BOX": return ClippingModeType.ClipToBoundingBox;
- default: return ClippingModeType.Disabled;
- }
+ return (ClippingModeType)temp;
});
/// This will be public opened in tizen_5.0 after ACR done. Before ACR, need to be hidden as inhouse API.
[EditorBrowsable(EditorBrowsableState.Never)]
private global::System.Runtime.InteropServices.HandleRef swigCPtr;
+ private bool layoutSet = false; // Flag to indicate if SetLayout was called or View was automatically given a Layout
+
internal View(global::System.IntPtr cPtr, bool cMemoryOwn) : base(NDalicPINVOKE.View_SWIGUpcast(cPtr), cMemoryOwn)
{
swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr);
}
/// <summary>
- /// Event argument passed through ChildAdded event
+ /// Event argument passed through the ChildAdded event.
/// </summary>
/// <since_tizen> 5 </since_tizen>
- /// This will be public opened in tizen_5.0 after ACR done. Before ACR, need to be hidden as inhouse API.
- [EditorBrowsable(EditorBrowsableState.Never)]
public class ChildAddedEventArgs : EventArgs
{
/// <summary>
- /// Added child View at moment
+ /// Added child view at moment.
/// </summary>
/// <since_tizen> 5 </since_tizen>
public View Added { get; set; }
}
/// <summary>
- /// Event when a child is added
+ /// Event when a child is added.
/// </summary>
/// <since_tizen> 5 </since_tizen>
- /// This will be public opened in tizen_5.0 after ACR done. Before ACR, need to be hidden as inhouse API.
- [EditorBrowsable(EditorBrowsableState.Never)]
public new event EventHandler<ChildAddedEventArgs> ChildAdded;
// From Container Base class
/// <since_tizen> 4 </since_tizen>
public override void Add(View child)
{
- Container oldParent = child.Parent;
+ if (null == child)
+ {
+ Tizen.Log.Fatal("NUI", "Child is null");
+ return;
+ }
+
+ Container oldParent = child.GetParent();
if (oldParent != this)
{
if (oldParent != null)
{
oldParent.Remove(child);
}
+ child.InternalParent = this;
+
+ if (layoutSet == true && child.Layout == null) // Only give children a layout if parent an explicit container
+ {
+ if( child.GetType() == typeof(View) || true == child.LayoutingRequired )
+ {
+ child.Layout = new LayoutGroup();
+
+ }
+ else
+ {
+ child.Layout = new LayoutItem();
+ }
+ }
- LayoutItem layoutItem = new LayoutItem();
- child.Layout = layoutItem;
+ if (Layout)
+ {
+ Layout.LayoutChildren.Add(child.Layout);
+ }
NDalicPINVOKE.Actor_Add(swigCPtr, View.getCPtr(child));
if (NDalicPINVOKE.SWIGPendingException.Pending)
}
/// <summary>
- /// Event argument passed through ChildRemoved event
+ /// Event argument passed through the ChildRemoved event.
/// </summary>
/// <since_tizen> 5 </since_tizen>
- /// This will be public opened in tizen_5.0 after ACR done. Before ACR, need to be hidden as inhouse API.
- [EditorBrowsable(EditorBrowsableState.Never)]
public class ChildRemovedEventArgs : EventArgs
{
/// <summary>
- /// Removed child View at moment
+ /// Removed child view at moment.
/// </summary>
/// <since_tizen> 5 </since_tizen>
public View Removed { get; set; }
}
/// <summary>
- /// Event when a child is removed
+ /// Event when a child is removed.
/// </summary>
/// <since_tizen> 5 </since_tizen>
- /// This will be public opened in tizen_5.0 after ACR done. Before ACR, need to be hidden as inhouse API.
- [EditorBrowsable(EditorBrowsableState.Never)]
public new event EventHandler<ChildRemovedEventArgs> ChildRemoved;
-
+
/// <summary>
/// Removes a child view from this View. If the view was not a child of this view, this is a no-op.
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
Children.Remove(child);
+ child.InternalParent = null;
+
+ if (Layout)
+ {
+ if(child.Layout)
+ {
+ Layout.LayoutChildren.Remove(child.Layout);
+ }
+ }
if (ChildRemoved != null)
{
/// <since_tizen> 4 </since_tizen>
public override Container GetParent()
{
- //to fix memory leak issue, match the handle count with native side.
- IntPtr cPtr = NDalicPINVOKE.Actor_GetParent(swigCPtr);
- HandleRef CPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr);
- BaseHandle basehandle = Registry.GetManagedBaseHandleFromNativePtr(CPtr.Handle);
- NDalicPINVOKE.delete_BaseHandle(CPtr);
- CPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
-
- if (NDalicPINVOKE.SWIGPendingException.Pending)
- throw NDalicPINVOKE.SWIGPendingException.Retrieve();
-
- return basehandle as Container;
+ return this.InternalParent as Container;
}
internal bool IsTopLevelView()
swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
}
+ foreach (View view in Children)
+ {
+ view.InternalParent = null;
+ }
+
base.Dispose(type);
}
PageDown
}
- protected void InitXamlResource()
- {
- if (null != Application.Current)
- {
- Application.AddResourceChangedCallback(this, OnResourcesChanged);
- }
- }
-
/// <summary>
/// Creates a new instance of a view.
/// </summary>
/// <since_tizen> 3 </since_tizen>
public View() : this(NDalicPINVOKE.View_New(), true)
{
- InitXamlResource();
if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal View(View uiControl) : this(NDalicPINVOKE.new_View__SWIG_1(View.getCPtr(uiControl)), true)
{
- InitXamlResource();
if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
/// This does not interfere with the view's scale factor.<br />
/// The views default depth is the minimum of width and height.<br />
/// </summary>
+ /// <remarks>
+ /// This NUI object (Size2D) typed property can be configured by multiple cascade setting. <br />
+ /// For example, this code ( view.Size2D.Width = 100; view.Size2D.Height = 100; ) is equivalent to this ( view.Size2D = new Size2D(100, 100); ). <br />
+ /// Please note that this multi-cascade setting is especially possible for this NUI object (Size2D). <br />
+ /// This means by default others are impossible so it is recommended that NUI object typed properties are configured by their constructor with parameters. <br />
+ /// For example, this code is working fine : view.Scale = new Vector3( 2.0f, 1.5f, 0.0f); <br />
+ /// but this will not work! : view.Scale.X = 2.0f; view.Scale.Y = 1.5f; <br />
+ /// </remarks>
/// <since_tizen> 3 </since_tizen>
public Size2D Size2D
{
get
{
- return (Size2D)GetValue(Size2DProperty);
+ Size2D temp = (Size2D)GetValue(Size2DProperty);
+ return new Size2D(OnSize2DChanged, temp.Width, temp.Height);
}
set
{
SetValue(Size2DProperty, value);
+ // Set Specification so when layouts measure this View it matches the value set here.
+ // All Views are currently Layouts.
+ SetProperty(LayoutItemWrapper.ChildProperty.WIDTH_SPECIFICATION, new Tizen.NUI.PropertyValue(value.Width));
+ SetProperty(LayoutItemWrapper.ChildProperty.HEIGHT_SPECIFICATION, new Tizen.NUI.PropertyValue(value.Height));
NotifyPropertyChanged();
}
}
+ private void OnSize2DChanged(int width, int height)
+ {
+ Size2D = new Size2D(width, height);
+ }
+
/// <summary>
/// Retrieves the size of the view.<br />
/// The coordinates are relative to the view's parent.<br />
/// By default, sets the position vector between the parent origin and the pivot point (default).<br />
/// If the position inheritance is disabled, sets the world position.<br />
/// </summary>
+ /// <remarks>
+ /// This NUI object (Position2D) typed property can be configured by multiple cascade setting. <br />
+ /// For example, this code ( view.Position2D.X = 100; view.Position2D.Y = 100; ) is equivalent to this ( view.Position2D = new Position2D(100, 100); ). <br />
+ /// Please note that this multi-cascade setting is especially possible for this NUI object (Position2D). <br />
+ /// This means by default others are impossible so it is recommended that NUI object typed properties are configured by their constructor with parameters. <br />
+ /// For example, this code is working fine : view.Scale = new Vector3( 2.0f, 1.5f, 0.0f); <br />
+ /// but this will not work! : view.Scale.X = 2.0f; view.Scale.Y = 1.5f; <br />
+ /// </remarks>
/// <since_tizen> 3 </since_tizen>
public Position2D Position2D
{
get
{
- return (Position2D)GetValue(Position2DProperty);
+ Position2D temp = (Position2D)GetValue(Position2DProperty);
+ return new Position2D(OnPosition2DChanged, temp.X, temp.Y);
}
set
{
}
}
+ private void OnPosition2DChanged(int x, int y)
+ {
+ Position2D = new Position2D(x, y);
+ }
+
/// <summary>
/// Retrieves the screen postion of the view.<br />
/// </summary>
set
{
SetValue(SiblingOrderProperty, value);
- NotifyPropertyChanged();
+ NotifyPropertyChanged();
}
}
/// <remarks>
/// Deriving classes stipulate the natural size and by default a view has a zero natural size.
/// </remarks>
- /// /// Please do not use! this will be deprecated!
- /// Instead please use NaturalSize2D.
- /// <since_tizen> 3 </since_tizen>
- [Obsolete("Please do not use! This will be deprecated! Please use NaturalSize2D instead! " +
- "Like: " +
- "TextLabel label = new TextLabel(\"Hello World!\"); " +
- "Size2D size = label.NaturalSize2D;")]
- [EditorBrowsable(EditorBrowsableState.Never)]
+ /// <since_tizen> 5 </since_tizen>
public Vector3 NaturalSize
{
get
/// </summary>
/// <remarks>
/// </remarks>
- /// <since_tizen> 5 </since_tizen>
- /// This will be public opened in tizen_5.0 after ACR done. Before ACR, need to be hidden as inhouse API.
- [EditorBrowsable(EditorBrowsableState.Never)]
- public LayoutItem Layout
+ internal LayoutItem Layout
{
get
{
set
{
Tizen.NUI.NDalicManualPINVOKE.SetLayout__SWIG_1(View.getCPtr(this), LayoutItem.getCPtr(value));
+ value.LayoutChildren.Clear();
+ layoutSet = true;
+ foreach (View view in Children)
+ {
+ value.LayoutChildren.Add(view.Layout);
+ }
+ }
+ }
+
+ /// <summary>
+ /// Set that layouting is required on this View. It will automatically receive a Layout.
+ /// </summary>
+ /// <remarks>
+ /// </remarks>
+ internal bool LayoutingRequired
+ {
+ get
+ {
+ bool result = Tizen.NUI.NDalicManualPINVOKE.View_IsLayoutingRequired(View.getCPtr(this));
+ if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+ return result;
+ }
+ set
+ {
+ Tizen.NUI.NDalicManualPINVOKE.View_SetLayoutingRequired(View.getCPtr(this), value);
}
}
}
/// <summary>
- /// Gets the parent layer of this view.If a view has no parent, this method does nothing.
+ /// Gets the parent layer of this view.If a view has no parent, this method does not do anything.
/// </summary>
/// <pre>The view has been initialized. </pre>
- /// <returns>the parent layer of view </returns>
+ /// <returns>The parent layer of view </returns>
/// <since_tizen> 5 </since_tizen>
public Layer GetLayer()
{
}
set
{
+ if (Layout != null)
+ {
+ // Note: it only works if minimum size is >= than natural size.
+ // To force the size it should be done through the width&height spec or Size2D.
+ Layout.MinimumWidth = new Tizen.NUI.LayoutLength(value.Width);
+ Layout.MinimumHeight = new Tizen.NUI.LayoutLength(value.Height);
+ }
SetValue(MinimumSizeProperty, value);
NotifyPropertyChanged();
}
}
set
{
+ // We don't have Layout.Maximum(Width|Height) so we cannot apply it to layout.
+ // MATCH_PARENT spec + parent container size can be used to limit
SetValue(MaximumSizeProperty, value);
NotifyPropertyChanged();
}
}
/// <summary>
- /// [Obsolete("Please do not use! this will be deprecated")]
+ /// Sets the size of a view for the width, the height and the depth.<br />
+ /// Geometry can be scaled to fit within this area.<br />
+ /// This does not interfere with the view's scale factor.<br />
+ /// The views default depth is the minimum of width and height.<br />
/// </summary>
- /// <since_tizen> 3 </since_tizen>
- [Obsolete("Please do not use! This will be deprecated! Please use Size2D instead! " +
- "Like: " +
- "View view = new View(); " +
- "view.Size2D = new Size2D(100, 100);")]
- [EditorBrowsable(EditorBrowsableState.Never)]
+ /// <remarks>
+ /// Please note that multi-cascade setting is not possible for this NUI object. <br />
+ /// It is recommended that NUI object typed properties are configured by their constructor with parameters. <br />
+ /// For example, this code is working fine : view.Size = new Size( 1.0f, 1.0f, 0.0f); <br />
+ /// but this will not work! : view.Size.Width = 2.0f; view.Size.Height = 2.0f; <br />
+ /// </remarks>
+ /// <since_tizen> 5 </since_tizen>
public Size Size
{
get
/// <summary>
/// Gets or sets the Margin for use in layout.
/// </summary>
+ /// <remarks>
+ /// Margin property is supported by Layout algorithms and containers.
+ /// Please Set Layout if you want to use Margin property.
+ /// </remarks>
/// <since_tizen> 4 </since_tizen>
public Extents Margin
{
/// <summary>
/// Perform an action on a visual registered to this view. <br />
- /// Visuals will have actions, this API is used to perform one of these actions with the given attributes.
+ /// Visuals will have actions. This API is used to perform one of these actions with the given attributes.
/// </summary>
/// <param name="propertyIndexOfVisual">The Property index of the visual.</param>
- /// <param name="propertyIndexOfActionId">The action to perform. See Visual to find supported actions.</param>
+ /// <param name="propertyIndexOfActionId">The action to perform. See Visual to find the supported actions.</param>
/// <param name="attributes">Optional attributes for the action.</param>
/// <since_tizen> 5 </since_tizen>
public void DoAction(int propertyIndexOfVisual, int propertyIndexOfActionId, PropertyValue attributes)
internal readonly MergedStyle _mergedStyle;
- /// This will be public opened in tizen_5.0 after ACR done. Before ACR, need to be hidden as inhouse API.
- [EditorBrowsable(EditorBrowsableState.Never)]
- public int WidthSpecificationFixed
+ /// <summary>
+ /// Child property to specify desired width
+ /// </summary>
+ internal int LayoutWidthSpecificationFixed
{
get
{
SetProperty(LayoutItemWrapper.ChildProperty.WIDTH_SPECIFICATION, new Tizen.NUI.PropertyValue(value));
}
}
-
- /// This will be public opened in tizen_5.0 after ACR done. Before ACR, need to be hidden as inhouse API.
- [EditorBrowsable(EditorBrowsableState.Never)]
- public int HeightSpecificationFixed
+
+ /// <summary>
+ /// Child property to specify desired height
+ /// </summary>
+ internal int LayoutHeightSpecificationFixed
{
get
{
SetProperty(LayoutItemWrapper.ChildProperty.HEIGHT_SPECIFICATION, new Tizen.NUI.PropertyValue(value));
}
}
-
- /// This will be public opened in tizen_5.0 after ACR done. Before ACR, need to be hidden as inhouse API.
- [EditorBrowsable(EditorBrowsableState.Never)]
- public ChildLayoutData WidthSpecification
+
+ /// <summary>
+ /// Child property to specify desired width, use MatchParent/WrapContent)
+ /// </summary>
+ internal ChildLayoutData LayoutWidthSpecification
{
get
{
SetProperty(LayoutItemWrapper.ChildProperty.WIDTH_SPECIFICATION, new Tizen.NUI.PropertyValue((int)value));
}
}
-
- /// This will be public opened in tizen_5.0 after ACR done. Before ACR, need to be hidden as inhouse API.
- [EditorBrowsable(EditorBrowsableState.Never)]
- public ChildLayoutData HeightSpecification
+
+ /// <summary>
+ /// Child property to specify desired height, use MatchParent/WrapContent)
+ /// </summary>
+ internal ChildLayoutData LayoutHeightSpecification
{
get
{
}
}
+ internal float Weight
+ {
+ get
+ {
+ return (float)GetValue(WeightProperty);
+ }
+ set
+ {
+ SetValue(WeightProperty, value);
+ NotifyPropertyChanged();
+ }
+ }
}
-
-
-
/// <summary>
/// The View layout Direction type.
/// </summary>
RTL
}
- /// This will be public opened in tizen_5.0 after ACR done. Before ACR, need to be hidden as inhouse API.
- [EditorBrowsable(EditorBrowsableState.Never)]
- public enum ChildLayoutData
+ internal enum ChildLayoutData
{
+ /// <summary>
+ /// Constant which indicates child size should match parent size
+ /// </summary>
MatchParent = -1,
+ /// <summary>
+ /// Constant which indicates parent should take the smallest size possible to wrap it's children with their desired size
+ /// </summary>
WrapContent = -2,
}