private Dictionary<string, Transition> transDictionary = new Dictionary<string, Transition>();
private string[] transitionNames;
private bool controlStatePropagation = false;
+ private ViewStyle viewStyle;
+ private bool themeChangeSensitive = false;
internal Size2D sizeSetExplicitly = new Size2D(); // Store size set by API, will be used in place of NaturalSize if not set.
internal BackgroundExtraData backgroundExtraData;
- static View() {}
+ // List of constraint
+ private Constraint widthConstraint = null;
+ private Constraint heightConstraint = null;
- /// <summary>
- /// The Style instance binded with this View.
- /// </summary>
- private ViewStyle viewStyle;
+ static View() {}
/// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
[EditorBrowsable(EditorBrowsableState.Never)]
/// This will be public opened in next release of tizen after ACR done. Before ACR, it is used as HiddenAPI (InhouseAPI).
[EditorBrowsable(EditorBrowsableState.Never)]
- public View(ViewStyle viewStyle) : this(Interop.View.View_New(), true)
+ public View(ViewStyle viewStyle) : this(Interop.View.View_New(), true, viewStyle)
{
- this.ViewStyle.CopyFrom(viewStyle);
}
/// <summary>
internal View(global::System.IntPtr cPtr, bool cMemoryOwn, ViewStyle viewStyle, bool shown = true) : this(cPtr, cMemoryOwn, shown)
{
- if (this.viewStyle == null)
- {
- ApplyStyle((viewStyle == null) ? GetViewStyle() : viewStyle.Clone());
- }
- else
- {
- this.viewStyle.CopyFrom(viewStyle);
- }
+ if (!ThemeManager.ThemeApplied) return;
+
+ if (viewStyle == null) UpdateStyle(); // Use style in the current theme
+ else ApplyStyle(viewStyle.Clone()); // Use given style
}
internal View(global::System.IntPtr cPtr, bool cMemoryOwn, bool shown = true) : base(Interop.View.View_SWIGUpcast(cPtr), cMemoryOwn)
ControlStateChangeEventInternal?.Invoke(this, changeInfo);
- OnControlStateChanged(changeInfo);
-
if (controlStatePropagation)
{
foreach (View child in Children)
}
}
+ OnControlStateChanged(changeInfo);
+
ControlStateChangedEvent?.Invoke(this, changeInfo);
}
}
/// <summary>
/// The StyleName, type string.
+ /// The value indicates DALi style name defined in json theme file.
/// </summary>
/// <since_tizen> 3 </since_tizen>
public string StyleName
}
/// <summary>
+ /// The KeyInputFocus, type bool.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public bool KeyInputFocus
+ {
+ get
+ {
+ return (bool)GetValue(KeyInputFocusProperty);
+ }
+ set
+ {
+ SetValue(KeyInputFocusProperty, value);
+ NotifyPropertyChanged();
+ }
+ }
+
+ /// <summary>
/// The mutually exclusive with "backgroundImage" and "background" type Vector4.
/// </summary>
/// <remarks>
}
set
{
- if (viewStyle != null)
+ SetValue(BackgroundColorProperty, value);
+ if (selectorData != null)
{
- viewStyle.BackgroundImage = null;
- viewStyle.BackgroundColor = value;
+ selectorData.BackgroundImage.Reset(this);
+ selectorData.BackgroundColor.UpdateIfNeeds(this, value);
}
- else
- {
- SetValue(BackgroundColorProperty, value);
- }
-
NotifyPropertyChanged();
}
}
}
set
{
- if (viewStyle != null)
+ SetValue(BackgroundImageProperty, value);
+ if (selectorData != null)
{
- viewStyle.BackgroundColor = null;
- viewStyle.BackgroundImage = value;
+ selectorData.BackgroundColor.Reset(this);
+ selectorData.BackgroundImage.UpdateIfNeeds(this, value);
}
- else
- {
- SetValue(BackgroundImageProperty, value);
- }
-
NotifyPropertyChanged();
}
}
}
set
{
- if (viewStyle != null)
- {
- viewStyle.BackgroundImageBorder = value;
- }
- else
- {
- SetValue(BackgroundImageBorderProperty, value);
- }
-
+ SetValue(BackgroundImageBorderProperty, value);
+ selectorData?.BackgroundImageBorder.UpdateIfNeeds(this, value);
NotifyPropertyChanged();
}
}
/// It is null by default.
/// </summary>
/// <remarks>
- /// Gettter returns copied instance of current shadow.
+ /// Getter returns copied instance of current shadow.
/// </remarks>
/// <remarks>
/// The mutually exclusive with "BoxShadow".
set
{
SetValue(ImageShadowProperty, value);
+ if (selectorData != null)
+ {
+ selectorData.BoxShadow.Reset(this);
+ selectorData.ImageShadow.UpdateIfNeeds(this, value);
+ }
NotifyPropertyChanged();
}
}
set
{
SetValue(BoxShadowProperty, value);
+ if (selectorData != null)
+ {
+ selectorData.ImageShadow.Reset(this);
+ selectorData.BoxShadow.UpdateIfNeeds(this, value);
+ }
NotifyPropertyChanged();
}
}
set
{
SetValue(CornerRadiusProperty, value);
+ selectorData?.CornerRadius.UpdateIfNeeds(this, value);
NotifyPropertyChanged();
}
}
}
/// <summary>
+ /// Whether the children of this view can be focusable by keyboard navigation. If user sets this to false, the children of this actor view will not be focused.
+ /// Note : Default value is true.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public bool FocusableChildren
+ {
+ set
+ {
+ SetValue(FocusableChildrenProperty, value);
+ NotifyPropertyChanged();
+ }
+ get
+ {
+ return (bool)GetValue(FocusableChildrenProperty);
+ }
+ }
+
+ /// <summary>
+ /// Whether this view can focus by touch.
+ /// If Focusable is false, FocusableInTouch is disabled.
+ /// If you want to have focus on touch, you need to set both Focusable and FocusableInTouch settings to true.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public bool FocusableInTouch
+ {
+ set
+ {
+ SetValue(FocusableInTouchProperty, value);
+ NotifyPropertyChanged();
+ }
+ get
+ {
+ return (bool)GetValue(FocusableInTouchProperty);
+ }
+ }
+
+ /// <summary>
/// Retrieves the position of the view.<br />
/// The coordinates are relative to the view's parent.<br />
/// </summary>
get
{
Size2D temp = (Size2D)GetValue(Size2DProperty);
- return new Size2D(OnSize2DChanged, temp.Width, temp.Height);
+ int width = temp.Width;
+ int height = temp.Height;
+
+ if (this.Layout == null)
+ {
+ if (width < 0) { width = 0; }
+ if (height < 0) { height = 0; }
+ }
+
+ return new Size2D(OnSize2DChanged, width, height);
}
set
{
MeasureSpecificationHeight = new MeasureSpecification(new LayoutLength(value.Height), MeasureSpecification.ModeType.Exactly);
_widthPolicy = value.Width;
_heightPolicy = value.Height;
+
_layout?.RequestLayout();
NotifyPropertyChanged();
}
}
set
{
- if (viewStyle != null)
- {
- viewStyle.Opacity = value;
- }
- else
- {
- SetValue(OpacityProperty, value);
- }
-
+ SetValue(OpacityProperty, value);
+ selectorData?.Opacity.UpdateIfNeeds(this, value);
NotifyPropertyChanged();
}
}
set
{
Extents padding = value;
- if (Layout !=null)
+ if (Layout != null)
{
// Layout set so store Padding in LayoutItem instead of in View.
// If View stores the Padding value then Legacy Size Negotiation will overwrite
Layout.Padding = value;
// If Layout is a LayoutItem then it could be a View that handles it's own padding.
// Let the View keeps it's padding. Still store Padding in Layout to reduce code paths.
- if( Layout.GetType() != typeof(LayoutItem)) // If a Layout container of some kind.
+ if (typeof(LayoutGroup).IsAssignableFrom(Layout.GetType())) // If a Layout container of some kind.
{
- padding = new Extents(0,0,0,0); // Reset value stored in View.
+ padding = new Extents(0, 0, 0, 0); // Reset value stored in View.
}
- _layout?.RequestLayout();
}
+
SetValue(PaddingProperty, padding);
NotifyPropertyChanged();
- _layout?.RequestLayout();
}
}
if (basehandle is Layer layer)
{
ret = new View(Layer.getCPtr(layer).Handle, false);
- NUILog.Error("This Parent property is deprecated, shoud do not be used");
+ NUILog.Error("This Parent property is deprecated, should do not be used");
}
else
{
if(_heightPolicy>=0) // Policy an exact value
{
- Size2D.Width = _widthPolicy;
- }
- else
- {
- // Store _heightPolicy in the Size2D memember as will be reset to 0 by a Size2D callback.
- // Size2D height will store the specification value (negative number) this will then be applied to the
- // HeightSpecification when the Size2D callback is invoked.
+ // Create Size2D only both _widthPolicy and _heightPolicy are set.
Size2D = new Size2D(_widthPolicy,_heightPolicy);
}
}
if(_widthPolicy>=0) // Policy an exact value
{
- Size2D.Height = _heightPolicy;
- }
- else
- {
- // Store widthPolicy in the Size2D memember as will be reset to 0 by a Size2D callback.
- // Size2D height will store the specification value (negative number) this will then be applied to the
- // HeightSpecification when the Size2D callback is invoked.
+ // Create Size2D only both _widthPolicy and _heightPolicy are set.
Size2D = new Size2D(_widthPolicy,_heightPolicy);
}
}
set
{
- if (viewStyle != null)
- {
- viewStyle.Color = value;
- }
- else
- {
- SetValue(ColorProperty, value);
- }
-
+ SetValue(ColorProperty, value);
+ selectorData?.Color.UpdateIfNeeds(this, value);
NotifyPropertyChanged();
}
}
return;
}
- Log.Info("NUI", "Setting Layout on:" + Name + "\n");
layoutingDisabled = false;
layoutSet = true;
value.Owner.Layout = new AbsoluteLayout();
// Copy Margin and Padding to replacement LayoutGroup.
- value.Owner.Layout.Margin = value.Margin;
- value.Owner.Layout.Padding = value.Padding;
+ if (value.Owner.Layout != null)
+ {
+ value.Owner.Layout.Margin = value.Margin;
+ value.Owner.Layout.Padding = value.Padding;
+ }
}
// Copy Margin and Padding to new layout being set or restore padding and margin back to
else
{
// First Layout to be added to the View hence copy
-
// Do not try to set Margins or Padding on a null Layout (when a layout is being removed from a View)
- if (value !=null)
+ if (value != null)
{
- if (Margin.Top != 0 || Margin.Bottom !=0 || Margin.Start !=0 || Margin.End != 0)
+ if (Margin.Top != 0 || Margin.Bottom != 0 || Margin.Start != 0 || Margin.End != 0)
{
// If View already has a margin set then store it in Layout instead.
value.Margin = Margin;
- SetValue(MarginProperty, new Extents(0,0,0,0));
+ SetValue(MarginProperty, new Extents(0, 0, 0, 0));
NotifyPropertyChanged();
}
- if (Padding.Top != 0 || Padding.Bottom !=0 || Padding.Start !=0 || Padding.End != 0)
+ if (Padding.Top != 0 || Padding.Bottom != 0 || Padding.Start != 0 || Padding.End != 0)
{
// If View already has a padding set then store it in Layout instead.
value.Padding = Padding;
- SetValue(PaddingProperty, new Extents(0,0,0,0));
- NotifyPropertyChanged();
+ // If Layout is a LayoutItem then it could be a View that handles it's own padding.
+ // Let the View keeps it's padding. Still store Padding in Layout to reduce code paths.
+ if (typeof(LayoutGroup).IsAssignableFrom(value.GetType())) // If a Layout container of some kind.
+ {
+ SetValue(PaddingProperty, new Extents(0, 0, 0, 0));
+ NotifyPropertyChanged();
+ }
}
}
}
set
{
_backgroundImageSynchronosLoading = value;
- string bgUrl = "";
- int visualType = 0;
- Background.Find(Visual.Property.Type)?.Get(out visualType);
- if (visualType == (int)Visual.Type.Image)
- {
- Background.Find(ImageVisualProperty.URL)?.Get(out bgUrl);
- }
- if (bgUrl.Length != 0)
+ string bgUrl = null;
+ Background.Find(ImageVisualProperty.URL)?.Get(out bgUrl);
+
+ if (!string.IsNullOrEmpty(bgUrl))
{
PropertyMap bgMap = this.Background;
bgMap.Add("synchronousLoading", new PropertyValue(_backgroundImageSynchronosLoading));
}
/// <summary>
+ /// If this property is set to true, the View can have a touch related ControlState (such as Pressed) when touch.
+ /// By default, it is false in View, true in Control.
+ /// Note that if the value is true, the View will be a touch receptor.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public bool EnableControlState
+ {
+ get
+ {
+ return (bool)GetValue(EnableControlStateProperty);
+ }
+ set
+ {
+ SetValue(EnableControlStateProperty, value);
+ }
+ }
+
+ /// <summary>
+ /// Whether the actor grab all touches even if touch leaves its boundary.
+ /// </summary>
+ /// <returns>true, if it grab all touch after start</returns>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public bool GrabTouchAfterLeave
+ {
+ get
+ {
+ bool temp = false;
+ GetProperty(View.Property.CaptureAllTouchAfterStart).Get(out temp);
+ return temp;
+ }
+ set
+ {
+ SetProperty(View.Property.CaptureAllTouchAfterStart, new Tizen.NUI.PropertyValue(value));
+ NotifyPropertyChanged();
+ }
+ }
+
+ /// <summary>
+ /// If the value is true, the View will change its style as the theme changes.
+ /// It is false by default, but turned to true when setting StyleName (by setting property or using specified constructor).
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public bool ThemeChangeSensitive
+ {
+ get => (bool)GetValue(ThemeChangeSensitiveProperty);
+ set => SetValue(ThemeChangeSensitiveProperty, value);
+ }
+
+ /// <summary>
/// Get Style, it is abstract function and must be override.
/// </summary>
/// <since_tizen> 6 </since_tizen>
{
}
- internal static readonly BindableProperty BackgroundImageSelectorProperty = BindableProperty.Create("BackgroundImageSelector", typeof(Selector<string>), typeof(View), null, propertyChanged: (bindable, oldValue, newValue) =>
- {
- var view = (View)bindable;
- view.backgroundImageSelector.Clone((Selector<string>)newValue);
- },
- defaultValueCreator: (bindable) =>
- {
- var view = (View)bindable;
- return view.backgroundImageSelector;
- });
- private TriggerableSelector<string> _backgroundImageSelector;
- private TriggerableSelector<string> backgroundImageSelector
- {
- get
- {
- if (null == _backgroundImageSelector)
- {
- _backgroundImageSelector = new TriggerableSelector<string>(this, BackgroundImageProperty);
- }
- return _backgroundImageSelector;
- }
- }
- internal static readonly BindableProperty BackgroundColorSelectorProperty = BindableProperty.Create("BackgroundColorSelector", typeof(Selector<Color>), typeof(View), null, propertyChanged: (bindable, oldValue, newValue) =>
- {
- var view = (View)bindable;
- view.backgroundColorSelector.Clone((Selector<Color>)newValue);
- },
- defaultValueCreator: (bindable) =>
- {
- var view = (View)bindable;
- return view.backgroundColorSelector;
- });
- private TriggerableSelector<Color> _backgroundColorSelector;
- private TriggerableSelector<Color> backgroundColorSelector
- {
- get
- {
- if (null == _backgroundColorSelector)
- {
- _backgroundColorSelector = new TriggerableSelector<Color>(this, BackgroundColorProperty);
- }
- return _backgroundColorSelector;
- }
- }
-
- internal static readonly BindableProperty ColorSelectorProperty = BindableProperty.Create("ColorSelector", typeof(Selector<Color>), typeof(View), null, propertyChanged: (bindable, oldValue, newValue) =>
- {
- var view = (View)bindable;
- view.colorSelector.Clone((Selector<Color>)newValue);
- },
- defaultValueCreator: (bindable) =>
- {
- var view = (View)bindable;
- return view.colorSelector;
- });
-
- private TriggerableSelector<Color> _colorSelector;
- private TriggerableSelector<Color> colorSelector
- {
- get
- {
- if (null == _colorSelector)
- {
- _colorSelector = new TriggerableSelector<Color>(this, ColorProperty);
- }
- return _colorSelector;
- }
- }
-
- internal static readonly BindableProperty BackgroundImageBorderSelectorProperty = BindableProperty.Create("BackgroundImageBorderSelector", typeof(Selector<Rectangle>), typeof(View), null, propertyChanged: (bindable, oldValue, newValue) =>
- {
- var view = (View)bindable;
- view.backgroundImageBorderSelector.Clone((Selector<Rectangle>)newValue);
- },
- defaultValueCreator: (bindable) =>
- {
- var view = (View)bindable;
- return view.backgroundImageBorderSelector;
- });
- private TriggerableSelector<Rectangle> _backgroundImageBorderSelector;
- private TriggerableSelector<Rectangle> backgroundImageBorderSelector
- {
- get
- {
- if (null == _backgroundImageBorderSelector)
- {
- _backgroundImageBorderSelector = new TriggerableSelector<Rectangle>(this, BackgroundImageBorderProperty);
- }
- return _backgroundImageBorderSelector;
- }
- }
- internal static readonly BindableProperty OpacitySelectorProperty = BindableProperty.Create("OpacitySelector", typeof(Selector<float?>), typeof(View), null, propertyChanged: (bindable, oldValue, newValue) =>
- {
- var view = (View)bindable;
- view.opacitySelector.Clone((Selector<float?>)newValue);
- },
- defaultValueCreator: (bindable) =>
- {
- var view = (View)bindable;
- return view.opacitySelector;
- });
- private TriggerableSelector<float?> _opacitySelector;
- private TriggerableSelector<float?> opacitySelector
+ /// <summary>
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ protected virtual void OnThemeChanged(object sender, ThemeChangedEventArgs e)
{
- get
- {
- if (null == _opacitySelector)
- {
- _opacitySelector = new TriggerableSelector<float?>(this, OpacityProperty);
- }
- return _opacitySelector;
- }
+ UpdateStyle();
}
/// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
[EditorBrowsable(EditorBrowsableState.Never)]
public virtual void ApplyStyle(ViewStyle viewStyle)
{
- if (null == viewStyle)
- {
- return;
- }
-
- if (this.viewStyle == viewStyle)
- {
- return;
- }
-
- if (null != this.viewStyle)
- {
- simpleBinding.Clear();
- }
+ if (null == viewStyle || this.viewStyle == viewStyle) return;
this.viewStyle = viewStyle;
BindableProperty viewProperty;
bindablePropertyOfView.TryGetValue(keyValuePair.Key, out viewProperty);
- if (null != viewProperty)
+ if (null != viewProperty && viewProperty != StyleNameProperty)
{
object value = viewStyle.GetValue(keyValuePair.Value);
{
SetValue(viewProperty, value);
}
-
- simpleBinding.Bind(viewStyle, keyValuePair.Value, this, viewProperty, BindingDirection.TwoWay);
}
}
}
}
-
- /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
- [EditorBrowsable(EditorBrowsableState.Never)]
- private BundledPipe simpleBinding = new BundledPipe();
}
}