using Tizen.NUI.BaseComponents;
using Tizen.NUI.Binding;
using Tizen.NUI.Components.Extension;
+using Tizen.NUI.Accessibility;
namespace Tizen.NUI.Components
{
/// <summary>
+ /// ClickedEventArgs is a class to record button click event arguments which will sent to user.
+ /// </summary>
+ /// <since_tizen> 8 </since_tizen>
+ public class ClickedEventArgs : EventArgs
+ {
+ }
+
+ /// <summary>
+ /// SelectedChangedEventArgs is a class to record item selected arguments which will sent to user.
+ /// </summary>
+ /// <since_tizen> 8 </since_tizen>
+ public class SelectedChangedEventArgs : EventArgs
+ {
+ /// <summary> Selected state </summary>
+ /// <since_tizen> 8 </since_tizen>
+ public bool IsSelected { get; set; }
+ }
+
+ /// <summary>
/// Button is one kind of common component, a button clearly describes what action will occur when the user selects it.
/// Button may contain text or an icon.
/// </summary>
public static readonly BindableProperty IconRelativeOrientationProperty = BindableProperty.Create(nameof(IconRelativeOrientation), typeof(IconOrientation?), typeof(Button), null, propertyChanged: (bindable, oldValue, newValue) =>
{
var instance = (Button)bindable;
- if (newValue != null)
+ var newIconOrientation = (IconOrientation?)newValue;
+ if (instance.iconRelativeOrientation != newIconOrientation)
{
- if (instance.buttonStyle != null && instance.buttonStyle.IconRelativeOrientation != (IconOrientation?)newValue)
- {
- instance.buttonStyle.IconRelativeOrientation = (IconOrientation?)newValue;
- instance.UpdateUIContent();
- }
+ instance.iconRelativeOrientation = newIconOrientation;
+ instance.UpdateUIContent();
}
},
- defaultValueCreator: (bindable) =>
- {
- var instance = (Button)bindable;
- return instance.buttonStyle?.IconRelativeOrientation;
- });
+ defaultValueCreator: (bindable) => ((Button)bindable).iconRelativeOrientation
+ );
+
/// 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 static readonly BindableProperty IsEnabledProperty = BindableProperty.Create(nameof(IsEnabled), typeof(bool), typeof(Button), true, propertyChanged: (bindable, oldValue, newValue) =>
var instance = (Button)bindable;
if (newValue != null)
{
- if (instance.buttonStyle != null && (!instance.styleApplied || instance.buttonStyle.IsEnabled != (bool)newValue))
+ bool newEnabled = (bool)newValue;
+ if (instance.isEnabled != newEnabled)
{
- instance.buttonStyle.IsEnabled = (bool)newValue;
+ instance.isEnabled = newEnabled;
+
+ if (instance.buttonStyle != null)
+ {
+ instance.buttonStyle.IsEnabled = newEnabled;
+ }
+
instance.UpdateState();
}
}
},
- defaultValueCreator: (bindable) =>
- {
- var instance = (Button)bindable;
- return instance.buttonStyle?.IsEnabled ?? true;
- });
+ defaultValueCreator: (bindable) => ((Button)bindable).isEnabled);
/// 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 static readonly BindableProperty IsSelectedProperty = BindableProperty.Create(nameof(IsSelected), typeof(bool), typeof(Button), true, propertyChanged: (bindable, oldValue, newValue) =>
var instance = (Button)bindable;
if (newValue != null)
{
- if (instance.buttonStyle != null && instance.IsSelectable && (!instance.styleApplied || instance.buttonStyle.IsSelected != (bool)newValue))
+ bool newSelected = (bool)newValue;
+ if (instance.isSelected != newSelected)
{
- instance.buttonStyle.IsSelected = (bool)newValue;
- instance.UpdateState();
+ instance.isSelected = newSelected;
+
+ if (instance.buttonStyle != null)
+ {
+ instance.buttonStyle.IsSelected = newSelected;
+ }
+
+ if (instance.isSelectable)
+ {
+ instance.UpdateState();
+ }
}
}
},
defaultValueCreator: (bindable) =>
{
var instance = (Button)bindable;
- return instance.IsSelectable && (instance.buttonStyle.IsSelected ?? false);
+ return instance.isSelectable && instance.isSelected;
});
/// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
[EditorBrowsable(EditorBrowsableState.Never)]
var instance = (Button)bindable;
if (newValue != null)
{
- if (instance.buttonStyle != null && (!instance.styleApplied || instance.buttonStyle.IsSelectable != (bool)newValue))
+ bool newSelectable = (bool)newValue;
+ if (instance.isSelectable != newSelectable)
{
- instance.buttonStyle.IsSelectable = (bool)newValue;
+ instance.isSelectable = newSelectable;
+
+ if (instance.buttonStyle != null)
+ {
+ instance.buttonStyle.IsSelectable = newSelectable;
+ }
+
+ instance.UpdateState();
}
}
},
- defaultValueCreator: (bindable) =>
- {
- var instance = (Button)bindable;
- return instance.buttonStyle?.IsSelectable ?? false;
- });
+ defaultValueCreator: (bindable) => ((Button)bindable).isSelectable);
+
/// 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 static readonly BindableProperty IconPaddingProperty = BindableProperty.Create(nameof(IconPadding), typeof(Extents), typeof(Button), null, propertyChanged: (bindable, oldValue, newValue) =>
{
var instance = (Button)bindable;
- if (null != newValue && null != instance.buttonStyle?.IconPadding)
- {
- instance.buttonStyle.IconPadding.CopyFrom((Extents)newValue);
- instance.UpdateUIContent();
- }
+ instance.iconPadding = (Extents)((Extents)newValue).Clone();
+ instance.UpdateUIContent();
},
- defaultValueCreator: (bindable) =>
- {
- var instance = (Button)bindable;
- return instance.buttonStyle?.IconPadding;
- });
+ defaultValueCreator: (bindable) => ((Button)bindable).iconPadding);
+
/// 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 static readonly BindableProperty TextPaddingProperty = BindableProperty.Create(nameof(TextPadding), typeof(Extents), typeof(Button), null, propertyChanged: (bindable, oldValue, newValue) =>
{
var instance = (Button)bindable;
- if (null != newValue && null != instance.buttonStyle?.TextPadding)
- {
- instance.buttonStyle.TextPadding.CopyFrom((Extents)newValue);
- instance.UpdateUIContent();
- }
+ instance.textPadding = (Extents)((Extents)newValue).Clone();
+ instance.UpdateUIContent();
},
- defaultValueCreator: (bindable) =>
- {
- var instance = (Button)bindable;
- return instance.buttonStyle?.TextPadding;
- });
+ defaultValueCreator: (bindable) => ((Button)bindable).textPadding);
+
+ private IconOrientation? iconRelativeOrientation;
+ private bool isSelected = false;
+ private bool isSelectable = false;
+ private bool isEnabled = true;
+ private Extents iconPadding;
+ private Extents textPadding;
static Button() { }
/// An event for the button clicked signal which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
/// </summary>
/// <since_tizen> 6 </since_tizen>
+ [Obsolete("Deprecated in API8; Will be removed in API10. Please use Clicked event instead.")]
public event EventHandler<ClickEventArgs> ClickEvent;
/// <summary>
+ /// An event for the button clicked signal which can be used to subscribe or unsubscribe the event handler provided by the user.
+ /// </summary>
+ /// <since_tizen> 8 </since_tizen>
+ public event EventHandler<ClickedEventArgs> Clicked;
+
+ /// <summary>
/// An event for the button state changed signal which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
/// </summary>
/// <since_tizen> 6 </since_tizen>
{
buttonIcon = Extension.OnCreateIcon(this, buttonIcon);
}
- Add(buttonIcon);
- buttonIcon.Relayout += OnIconRelayout;
+ if (null != buttonIcon)
+ {
+ Add(buttonIcon);
+ buttonIcon.Relayout += OnIconRelayout;
+ }
}
return buttonIcon;
}
{
overlayImage = Extension.OnCreateOverlayImage(this, overlayImage);
}
- overlayImage.WidthResizePolicy = ResizePolicyType.FillToParent;
- overlayImage.HeightResizePolicy = ResizePolicyType.FillToParent;
- Add(overlayImage);
+ if (null != overlayImage)
+ {
+ Add(overlayImage);
+ }
}
return overlayImage;
}
{
buttonText = Extension.OnCreateText(this, buttonText);
}
- buttonText.HorizontalAlignment = HorizontalAlignment.Center;
- buttonText.VerticalAlignment = VerticalAlignment.Center;
- Add(buttonText);
+ if (null != buttonText)
+ {
+ Add(buttonText);
+ }
}
return buttonText;
}
internal set
{
buttonText = value;
+ AccessibilityManager.Instance.SetAccessibilityAttribute(this, AccessibilityManager.AccessibilityAttribute.Label, buttonText.Text);
}
}
/// <summary>
/// Text string selector in Button.
/// Getter returns copied selector value if exist, null otherwise.
+ /// <exception cref="NullReferenceException">Thrown when setting null value.</exception>
/// </summary>
/// <since_tizen> 6 </since_tizen>
public StringSelector TextSelector
{
get => buttonText == null ? null : new StringSelector((Selector<string>)buttonText.GetValue(TextLabel.TextSelectorProperty));
- set => buttonText?.SetValue(TextLabel.TextSelectorProperty, value);
+ set
+ {
+ if (value == null || buttonText == null)
+ {
+ throw new NullReferenceException("Button.TextSelector is null");
+ }
+ else
+ {
+ buttonText.SetValue(TextLabel.TextSelectorProperty, value);
+ }
+ }
}
/// <summary>
/// Translateable text string selector in Button.
/// Getter returns copied selector value if exist, null otherwise.
/// </summary>
+ /// <exception cref="NullReferenceException">Thrown when setting null value.</exception>
/// <since_tizen> 6 </since_tizen>
public StringSelector TranslatableTextSelector
{
get => buttonText == null ? null : new StringSelector((Selector<string>)buttonText.GetValue(TextLabel.TranslatableTextSelectorProperty));
- set => buttonText?.SetValue(TextLabel.TranslatableTextSelectorProperty, value);
+ set
+ {
+ if (value == null || buttonText == null)
+ {
+ throw new NullReferenceException("Button.TranslatableTextSelector is null");
+ }
+ else
+ {
+ buttonText.SetValue(TextLabel.TranslatableTextSelectorProperty, value);
+ }
+ }
}
/// <summary>
/// Text color selector in Button.
/// Getter returns copied selector value if exist, null otherwise.
/// </summary>
+ /// <exception cref="NullReferenceException">Thrown when setting null value.</exception>
/// <since_tizen> 6 </since_tizen>
public ColorSelector TextColorSelector
{
get => buttonText == null ? null : new ColorSelector((Selector<Color>)buttonText.GetValue(TextLabel.TextColorSelectorProperty));
- set => buttonText?.SetValue(TextLabel.TextColorSelectorProperty, value);
+ set
+ {
+ if (value == null || buttonText == null)
+ {
+ throw new NullReferenceException("Button.TextColorSelectorProperty is null");
+ }
+ else
+ {
+ buttonText.SetValue(TextLabel.TextColorSelectorProperty, value);
+ }
+ }
}
/// <summary>
/// Text font size selector in Button.
/// Getter returns copied selector value if exist, null otherwise.
/// </summary>
+ /// <exception cref="NullReferenceException">Thrown when setting null value.</exception>
/// <since_tizen> 6 </since_tizen>
public FloatSelector PointSizeSelector
{
get => buttonText == null ? null : new FloatSelector((Selector<float?>)buttonText.GetValue(TextLabel.PointSizeSelectorProperty));
- set => buttonText?.SetValue(TextLabel.PointSizeSelectorProperty, value);
+ set
+ {
+ if (value == null || buttonText == null)
+ {
+ throw new NullReferenceException("Button.PointSizeSelector is null");
+ }
+ else
+ {
+ buttonText.SetValue(TextLabel.PointSizeSelectorProperty, value);
+ }
+ }
}
/// <summary>
/// Icon image's resource url selector in Button.
/// Getter returns copied selector value if exist, null otherwise.
/// </summary>
+ /// <exception cref="NullReferenceException">Thrown when setting null value.</exception>
/// <since_tizen> 6 </since_tizen>
public StringSelector IconURLSelector
{
- get => buttonIcon == null ? null : new StringSelector((Selector<string>)buttonText.GetValue(ImageView.ResourceUrlSelectorProperty));
- set => buttonIcon?.SetValue(ImageView.ResourceUrlSelectorProperty, value);
+ get => buttonIcon == null ? null : new StringSelector((Selector<string>)buttonIcon.GetValue(ImageView.ResourceUrlSelectorProperty));
+ set
+ {
+ if (value == null || buttonIcon == null)
+ {
+ throw new NullReferenceException("Button.IconURLSelector is null");
+ }
+ else
+ {
+ buttonIcon.SetValue(ImageView.ResourceUrlSelectorProperty, value);
+ }
+ }
}
/// <summary>
{
get
{
- return (IconOrientation?)GetValue(IconRelativeOrientationProperty);
+ return (IconOrientation?)GetValue(IconRelativeOrientationProperty) ?? IconOrientation.Left;
}
set
{
/// <since_tizen> 6 </since_tizen>
public Extents IconPadding
{
- get => (Extents)GetValue(IconPaddingProperty);
+ get => (Extents)GetValue(IconPaddingProperty) ?? new Extents();
set => SetValue(IconPaddingProperty, value);
}
/// <since_tizen> 6 </since_tizen>
public Extents TextPadding
{
- get => (Extents)GetValue(TextPaddingProperty);
+ get => (Extents)GetValue(TextPaddingProperty) ?? new Extents();
set => SetValue(TextPaddingProperty, value);
}
if (clicked)
{
- ClickEventArgs eventArgs = new ClickEventArgs();
- OnClickInternal(eventArgs);
+ ClickedEventArgs eventArgs = new ClickedEventArgs();
+ OnClickedInternal(eventArgs);
}
}
}
/// <param name="touch">The touch event.</param>
/// <returns>True if the event should be consumed.</returns>
/// <since_tizen> 8 </since_tizen>
+ [Obsolete("Deprecated in API8; Will be removed in API10. Please use OnClicked instead.")]
+#pragma warning disable CS0809 // Obsolete member overrides non-obsolete member, It will be removed in API10
public override bool OnTouch(Touch touch)
+#pragma warning restore CS0809 // Obsolete member overrides non-obsolete member, It will be removed in API10
{
- if (!IsEnabled || null == touch)
- {
- return false;
- }
-
- PointStateType state = touch.GetState(0);
-
- switch (state)
- {
- case PointStateType.Down:
- isPressed = true;
- Extension?.SetTouchInfo(touch);
- UpdateState();
- return true;
- case PointStateType.Interrupted:
- isPressed = false;
- UpdateState();
- return true;
- case PointStateType.Up:
- {
- bool clicked = isPressed && IsEnabled;
-
- isPressed = false;
-
- if (IsSelectable)
- {
- Extension?.SetTouchInfo(touch);
- IsSelected = !IsSelected;
- }
- else
- {
- Extension?.SetTouchInfo(touch);
- UpdateState();
- }
-
- if (clicked)
- {
- ClickEventArgs eventArgs = new ClickEventArgs();
- OnClickInternal(eventArgs);
- }
-
- return true;
- }
- default:
- break;
- }
return base.OnTouch(touch);
}
/// ClickEventArgs is a class to record button click event arguments which will sent to user.
/// </summary>
/// <since_tizen> 6 </since_tizen>
+ [Obsolete("Deprecated in API8; Will be removed in API10. Please use ClickedEventArgs instead.")]
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1034:NestedTypesShouldNotBeVisible")]
public class ClickEventArgs : EventArgs
{
}
/// </summary>
/// <since_tizen> 6 </since_tizen>
[Obsolete("Deprecated in API8; Will be removed in API10. Please use View.ControlStateChangedEventArgs")]
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1034:NestedTypesShouldNotBeVisible")]
public class StateChangedEventArgs : EventArgs
{
/// <summary> previous state of Button </summary>
/// <since_tizen> 6 </since_tizen>
+ /// It will be removed in API10
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1051:Do not declare visible instance fields")]
[Obsolete("Deprecated in API8; Will be removed in API10")]
public ControlStates PreviousState;
/// <summary> current state of Button </summary>
/// <since_tizen> 6 </since_tizen>
+ /// It will be removed in API10
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1051:Do not declare visible instance fields")]
[Obsolete("Deprecated in API8; Will be removed in API10")]
public ControlStates CurrentState;
}
-
- /// <summary>
- /// Get current text part to the attached ButtonExtension.
- /// </summary>
- /// <remarks>
- /// It returns null if the passed extension is invalid.
- /// </remarks>
- /// <param name="extension">The extension instance that is currently attached to this Button.</param>
- /// <return>The button's text part.</return>
- [EditorBrowsable(EditorBrowsableState.Never)]
- public TextLabel GetCurrentText(ButtonExtension extension)
- {
- return (extension == Extension) ? TextLabel : null;
- }
-
- /// <summary>
- /// Get current icon part to the attached ButtonExtension.
- /// </summary>
- /// <remarks>
- /// It returns null if the passed extension is invalid.
- /// </remarks>
- /// <param name="extension">The extension instance that is currently attached to this Button.</param>
- /// <return>The button's icon part.</return>
- [EditorBrowsable(EditorBrowsableState.Never)]
- public ImageView GetCurrentIcon(ButtonExtension extension)
- {
- return (extension == Extension) ? Icon : null;
- }
-
- /// <summary>
- /// Get current overlay image part to the attached ButtonExtension.
- /// </summary>
- /// <remarks>
- /// It returns null if the passed extension is invalid.
- /// </remarks>
- /// <param name="extension">The extension instance that is currently attached to this Button.</param>
- /// <return>The button's overlay image part.</return>
- [EditorBrowsable(EditorBrowsableState.Never)]
- public ImageView GetCurrentOverlayImage(ButtonExtension extension)
- {
- return (extension == Extension) ? OverlayImage : null;
- }
}
}