2 * Copyright(c) 2020 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 using System.ComponentModel;
19 using Tizen.NUI.BaseComponents;
20 using Tizen.NUI.Binding;
21 using Tizen.NUI.Components.Extension;
23 namespace Tizen.NUI.Components
26 /// Button is one kind of common component, a button clearly describes what action will occur when the user selects it.
27 /// Button may contain text or an icon.
29 /// <since_tizen> 6 </since_tizen>
30 public class Button : Control
32 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
33 [EditorBrowsable(EditorBrowsableState.Never)]
34 public static readonly BindableProperty IconRelativeOrientationProperty = BindableProperty.Create(nameof(IconRelativeOrientation), typeof(IconOrientation?), typeof(Button), null, propertyChanged: (bindable, oldValue, newValue) =>
36 var instance = (Button)bindable;
39 instance.privateIconRelativeOrientation = (IconOrientation?)newValue;
42 defaultValueCreator: (bindable) =>
44 var instance = (Button)bindable;
45 return instance.privateIconRelativeOrientation;
47 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
48 [EditorBrowsable(EditorBrowsableState.Never)]
49 public static readonly BindableProperty IsEnabledProperty = BindableProperty.Create(nameof(IsEnabled), typeof(bool), typeof(Button), true, propertyChanged: (bindable, oldValue, newValue) =>
51 var instance = (Button)bindable;
54 instance.privateIsEnabled = (bool)newValue;
57 defaultValueCreator: (bindable) =>
59 var instance = (Button)bindable;
60 return instance.privateIsEnabled;
62 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
63 [EditorBrowsable(EditorBrowsableState.Never)]
64 public static readonly BindableProperty IsSelectedProperty = BindableProperty.Create(nameof(IsSelected), typeof(bool), typeof(Button), true, propertyChanged: (bindable, oldValue, newValue) =>
66 var instance = (Button)bindable;
69 instance.privateIsSelected = (bool)newValue;
72 defaultValueCreator: (bindable) =>
74 var instance = (Button)bindable;
75 return instance.privateIsSelected;
77 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
78 [EditorBrowsable(EditorBrowsableState.Never)]
79 public static readonly BindableProperty IsSelectableProperty = BindableProperty.Create(nameof(IsSelectable), typeof(bool), typeof(Button), true, propertyChanged: (bindable, oldValue, newValue) =>
81 var instance = (Button)bindable;
84 instance.privateIsSelectable = (bool)newValue;
87 defaultValueCreator: (bindable) =>
89 var instance = (Button)bindable;
90 return instance.privateIsSelectable;
92 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
93 [EditorBrowsable(EditorBrowsableState.Never)]
94 public static readonly BindableProperty IconPaddingProperty = BindableProperty.Create(nameof(IconPadding), typeof(Extents), typeof(Button), null, propertyChanged: (bindable, oldValue, newValue) =>
96 var instance = (Button)bindable;
97 if (null != newValue && null != instance.Style?.IconPadding)
99 instance.Style.IconPadding.CopyFrom((Extents)newValue);
100 instance.UpdateUIContent();
103 defaultValueCreator: (bindable) =>
105 var instance = (Button)bindable;
106 return instance.Style?.IconPadding;
108 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
109 [EditorBrowsable(EditorBrowsableState.Never)]
110 public static readonly BindableProperty TextPaddingProperty = BindableProperty.Create(nameof(TextPadding), typeof(Extents), typeof(Button), null, propertyChanged: (bindable, oldValue, newValue) =>
112 var instance = (Button)bindable;
113 if (null != newValue && null != instance.Style?.TextPadding)
115 instance.Style.TextPadding.CopyFrom((Extents)newValue);
116 instance.UpdateUIContent();
119 defaultValueCreator: (bindable) =>
121 var instance = (Button)bindable;
122 return instance.Style?.TextPadding;
125 private EventHandler<StateChangedEventArgs> stateChangeHander;
127 private bool isSelected = false;
128 private bool isEnabled = true;
129 private bool isPressed = false;
132 /// Button's overlay image part.
134 [EditorBrowsable(EditorBrowsableState.Never)]
135 protected ImageView ButtonOverlayImage { get; set; }
138 /// Button's text part.
140 [EditorBrowsable(EditorBrowsableState.Never)]
141 protected TextLabel ButtonText { get; set; }
144 /// Button's icon part.
146 [EditorBrowsable(EditorBrowsableState.Never)]
147 protected ImageView ButtonIcon { get; set; }
150 /// The last touch information triggering selected state change.
152 [EditorBrowsable(EditorBrowsableState.Never)]
153 protected Touch SelectionChangedByTouch { get; set; }
156 /// The ButtonExtension instance that is injected by ButtonStyle.
158 [EditorBrowsable(EditorBrowsableState.Never)]
159 protected ButtonExtension Extension { get; set; }
162 /// Creates Button's text part.
164 /// <return>The created Button's text part.</return>
165 [EditorBrowsable(EditorBrowsableState.Never)]
166 protected virtual TextLabel CreateText()
168 return new TextLabel();
172 /// Creates Button's icon part.
174 /// <return>The created Button's icon part.</return>
175 [EditorBrowsable(EditorBrowsableState.Never)]
176 protected virtual ImageView CreateIcon()
178 return new ImageView();
182 /// Creates Button's overlay image part.
184 /// <return>The created Button's overlay image part.</return>
185 [EditorBrowsable(EditorBrowsableState.Never)]
186 protected virtual ImageView CreateOverlayImage()
188 return new ImageView();
192 /// Called when the Button is Clicked by a user
194 /// <param name="eventArgs">The click information.</param>
195 [EditorBrowsable(EditorBrowsableState.Never)]
196 protected virtual void OnClick(ClickEventArgs eventArgs)
203 /// Creates a new instance of a Button.
205 /// <since_tizen> 6 </since_tizen>
206 public Button() : base()
212 /// Creates a new instance of a Button with style.
214 /// <param name="style">Create Button by special style defined in UX.</param>
215 /// <since_tizen> 8 </since_tizen>
216 public Button(string style) : base(style)
222 /// Creates a new instance of a Button with style.
224 /// <param name="buttonStyle">Create Button by style customized by user.</param>
225 /// <since_tizen> 8 </since_tizen>
226 public Button(ButtonStyle buttonStyle) : base(buttonStyle)
232 /// An event for the button clicked signal which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
234 /// <since_tizen> 6 </since_tizen>
235 public event EventHandler<ClickEventArgs> ClickEvent;
237 /// An event for the button state changed signal which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
239 /// <since_tizen> 6 </since_tizen>
240 public event EventHandler<StateChangedEventArgs> StateChangedEvent
244 stateChangeHander += value;
248 stateChangeHander -= value;
252 /// Icon orientation.
254 /// <since_tizen> 6 </since_tizen>
255 public enum IconOrientation
260 /// <since_tizen> 6 </since_tizen>
265 /// <since_tizen> 6 </since_tizen>
270 /// <since_tizen> 6 </since_tizen>
275 /// <since_tizen> 6 </since_tizen>
280 /// Style of the button.
282 /// <since_tizen> 8 </since_tizen>
283 public new ButtonStyle Style => ViewStyle as ButtonStyle;
286 /// The text of Button.
288 /// <since_tizen> 6 </since_tizen>
293 return Style?.Text?.Text?.GetValue(ControlState);
297 if (null != Style?.Text)
299 Style.Text.Text = value;
305 /// Flag to decide Button can be selected or not.
307 /// <since_tizen> 6 </since_tizen>
308 public bool IsSelectable
312 return (bool)GetValue(IsSelectableProperty);
316 SetValue(IsSelectableProperty, value);
320 private bool privateIsSelectable
324 return Style?.IsSelectable ?? false;
328 Style.IsSelectable = value;
333 /// Translate text string in Button.
335 /// <since_tizen> 6 </since_tizen>
336 public string TranslatableText
340 return Style?.Text?.TranslatableText?.All;
344 if (null != Style?.Text)
346 Style.Text.TranslatableText = value;
352 /// Text point size in Button.
354 /// <since_tizen> 6 </since_tizen>
355 public float PointSize
359 return Style?.Text?.PointSize?.All ?? 0;
363 if (null != Style?.Text)
365 Style.Text.PointSize = value;
371 /// Text font family in Button.
373 /// <since_tizen> 6 </since_tizen>
374 public string FontFamily
378 return Style?.Text?.FontFamily.All;
382 if (null != Style?.Text)
384 Style.Text.FontFamily = value;
389 /// Text color in Button.
391 /// <since_tizen> 6 </since_tizen>
392 public Color TextColor
396 return Style?.Text?.TextColor?.All;
400 if (null != Style?.Text)
402 Style.Text.TextColor = value;
407 /// Text horizontal alignment in Button.
409 /// <since_tizen> 6 </since_tizen>
410 public HorizontalAlignment TextAlignment
414 return Style?.Text?.HorizontalAlignment ?? HorizontalAlignment.Center;
418 if (null != Style?.Text)
420 Style.Text.HorizontalAlignment = value;
425 /// Icon image's resource url in Button.
427 /// <since_tizen> 6 </since_tizen>
428 public string IconURL
432 return Style?.Icon?.ResourceUrl?.All;
436 if (null != Style?.Icon)
438 Style.Icon.ResourceUrl = value;
443 private StringSelector textSelector = new StringSelector();
445 /// Text string selector in Button.
447 /// <since_tizen> 6 </since_tizen>
448 public StringSelector TextSelector
456 textSelector.Clone(value);
460 private StringSelector translatableTextSelector = new StringSelector();
462 /// Translateable text string selector in Button.
464 /// <since_tizen> 6 </since_tizen>
465 public StringSelector TranslatableTextSelector
469 return translatableTextSelector;
473 translatableTextSelector.Clone(value);
477 private ColorSelector textColorSelector = new ColorSelector();
479 /// Text color selector in Button.
481 /// <since_tizen> 6 </since_tizen>
482 public ColorSelector TextColorSelector
486 return textColorSelector;
490 textColorSelector.Clone(value);
494 private FloatSelector pointSizeSelector = new FloatSelector();
496 /// Text font size selector in Button.
498 /// <since_tizen> 6 </since_tizen>
499 public FloatSelector PointSizeSelector
503 return pointSizeSelector;
507 pointSizeSelector.Clone(value);
511 private StringSelector iconURLSelector = new StringSelector();
513 /// Icon image's resource url selector in Button.
515 /// <since_tizen> 6 </since_tizen>
516 public StringSelector IconURLSelector
520 return iconURLSelector;
524 iconURLSelector.Clone(value);
529 /// Flag to decide selected state in Button.
531 /// <since_tizen> 6 </since_tizen>
532 public bool IsSelected
536 return (bool)GetValue(IsSelectedProperty);
540 SetValue(IsSelectedProperty, value);
543 private bool privateIsSelected
553 UpdateState(SelectionChangedByTouch);
555 SelectionChangedByTouch = null;
560 /// Flag to decide enable or disable in Button.
562 /// <since_tizen> 6 </since_tizen>
563 public bool IsEnabled
567 return (bool)GetValue(IsEnabledProperty);
571 SetValue(IsEnabledProperty, value);
574 private bool privateIsEnabled
588 /// Icon relative orientation in Button, work only when show icon and text.
590 /// <since_tizen> 6 </since_tizen>
591 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
592 [EditorBrowsable(EditorBrowsableState.Never)]
593 public IconOrientation? IconRelativeOrientation
597 return (IconOrientation?)GetValue(IconRelativeOrientationProperty);
601 SetValue(IconRelativeOrientationProperty, value);
604 private IconOrientation? privateIconRelativeOrientation
608 return Style?.IconRelativeOrientation;
612 if(Style != null && Style.IconRelativeOrientation != value)
614 Style.IconRelativeOrientation = value;
621 /// Icon padding in Button, work only when show icon and text.
623 /// <since_tizen> 6 </since_tizen>
624 public Extents IconPadding
626 get => (Extents)GetValue(IconPaddingProperty);
627 set => SetValue(IconPaddingProperty, value);
631 /// Text padding in Button, work only when show icon and text.
633 /// <since_tizen> 6 </since_tizen>
634 public Extents TextPadding
636 get => (Extents) GetValue(TextPaddingProperty);
637 set => SetValue(TextPaddingProperty, value);
641 /// Dispose Button and all children on it.
643 /// <param name="type">Dispose type.</param>
644 /// <since_tizen> 6 </since_tizen>
645 protected override void Dispose(DisposeTypes type)
652 if (type == DisposeTypes.Explicit)
654 Extension?.OnDispose(this);
656 if (ButtonIcon != null)
658 Utility.Dispose(ButtonIcon);
660 if (ButtonText != null)
662 Utility.Dispose(ButtonText);
664 if (ButtonOverlayImage != null)
666 Utility.Dispose(ButtonOverlayImage);
673 /// Called after a key event is received by the view that has had its focus set.
675 /// <param name="key">The key event.</param>
676 /// <returns>True if the key event should be consumed.</returns>
677 /// <since_tizen> 6 </since_tizen>
678 public override bool OnKey(Key key)
680 if (null == key) return false;
681 if (key.State == Key.StateType.Down)
683 if (key.KeyPressedName == "Return")
689 else if (key.State == Key.StateType.Up)
691 if (key.KeyPressedName == "Return")
693 bool clicked = isPressed && isEnabled;
697 if (Style.IsSelectable != null && Style.IsSelectable == true)
699 IsSelected = !IsSelected;
708 ClickEventArgs eventArgs = new ClickEventArgs();
709 OnClickInternal(eventArgs);
713 return base.OnKey(key);
717 /// Called when the control gain key input focus. Should be overridden by derived classes if they need to customize what happens when the focus is gained.
719 /// <since_tizen> 6 </since_tizen>
720 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
721 [EditorBrowsable(EditorBrowsableState.Never)]
722 public override void OnFocusGained()
724 base.OnFocusGained();
729 /// Called when the control loses key input focus. Should be overridden by derived classes if they need to customize what happens when the focus is lost.
731 /// <since_tizen> 6 </since_tizen>
732 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
733 [EditorBrowsable(EditorBrowsableState.Never)]
734 public override void OnFocusLost()
741 /// Called after a touch event is received by the owning view.<br />
742 /// CustomViewBehaviour.REQUIRES_TOUCH_EVENTS must be enabled during construction. See CustomView(ViewWrapperImpl.CustomViewBehaviour behaviour).<br />
744 /// <param name="touch">The touch event.</param>
745 /// <returns>True if the event should be consumed.</returns>
746 /// <since_tizen> 6 </since_tizen>
747 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
748 [EditorBrowsable(EditorBrowsableState.Never)]
749 public override bool OnTouch(Touch touch)
751 if (null == touch) return false;
752 PointStateType state = touch.GetState(0);
756 case PointStateType.Down:
760 case PointStateType.Interrupted:
764 case PointStateType.Up:
766 bool clicked = isPressed && isEnabled;
770 if (Style.IsSelectable != null && Style.IsSelectable == true)
772 SelectionChangedByTouch = touch;
773 IsSelected = !IsSelected;
782 ClickEventArgs eventArgs = new ClickEventArgs();
783 OnClickInternal(eventArgs);
791 return base.OnTouch(touch);
795 /// Apply style to button.
797 /// <param name="viewStyle">The style to apply.</param>
798 /// <since_tizen> 8 </since_tizen>
799 public override void ApplyStyle(ViewStyle viewStyle)
801 base.ApplyStyle(viewStyle);
803 ButtonStyle buttonStyle = viewStyle as ButtonStyle;
805 if (null != buttonStyle)
807 ButtonOverlayImage?.ApplyStyle(buttonStyle.Overlay);
808 ButtonText?.ApplyStyle(buttonStyle.Text);
809 ButtonIcon?.ApplyStyle(buttonStyle.Icon);
814 /// Get Button style.
816 /// <returns>The default button style.</returns>
817 /// <since_tizen> 8 </since_tizen>
818 protected override ViewStyle GetViewStyle()
820 return new ButtonStyle();
823 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
824 [EditorBrowsable(EditorBrowsableState.Never)]
825 protected override void OnUpdate()
830 Extension?.OnRelayout(this);
834 /// Update Button State.
836 /// <param name="touchInfo">The touch information in case the state has changed by touching.</param>
837 /// <since_tizen> 6 </since_tizen>
838 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
839 [EditorBrowsable(EditorBrowsableState.Never)]
840 protected void UpdateState(Touch touchInfo = null)
842 ControlStates sourceState = ControlState;
843 ControlStates targetState;
847 targetState = isPressed ? ControlStates.Pressed : (IsFocused ? (IsSelected ? ControlStates.SelectedFocused : ControlStates.Focused) : (IsSelected ? ControlStates.Selected : ControlStates.Normal));
851 targetState = IsSelected ? ControlStates.DisabledSelected : (IsFocused ? ControlStates.DisabledFocused : ControlStates.Disabled);
854 if (SetControlState(targetState, touchInfo))
858 StateChangedEventArgs e = new StateChangedEventArgs
860 PreviousState = sourceState,
861 CurrentState = targetState
863 stateChangeHander?.Invoke(this, e);
865 Extension?.OnControlStateChanged(this, sourceState, touchInfo);
870 /// It is hijack by using protected, style copy problem when class inherited from Button.
872 /// <since_tizen> 6 </since_tizen>
873 private void Initialize()
875 var style = (ButtonStyle)Style;
877 Extension = style.CreateExtension();
881 if (ButtonOverlayImage != null)
883 Add(ButtonOverlayImage);
884 ButtonOverlayImage.ApplyStyle(style.Overlay);
887 if (ButtonIcon != null)
890 ButtonIcon.ApplyStyle(style.Icon);
891 ButtonIcon.Relayout += OnIconRelayout;
894 if (null != ButtonText)
897 ButtonText.ApplyStyle(style.Text);
902 LayoutDirectionChanged += OnLayoutDirectionChanged;
905 private void CreateComponents()
907 ButtonOverlayImage = CreateOverlayImage();
908 ButtonIcon = CreateIcon();
909 ButtonText = CreateText();
911 if (Extension == null)
916 // Update component with extension
917 ButtonOverlayImage = Extension.OnCreateOverlayImage(this, ButtonOverlayImage);
918 ButtonIcon = Extension.OnCreateIcon(this, ButtonIcon);
919 ButtonText = Extension.OnCreateText(this, ButtonText);
923 /// Measure text, it can be override.
925 /// <since_tizen> 6 </since_tizen>
926 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
927 [EditorBrowsable(EditorBrowsableState.Never)]
928 protected virtual void MeasureText()
930 if (Style.IconRelativeOrientation == null || ButtonIcon == null || ButtonText == null)
934 ButtonText.WidthResizePolicy = ResizePolicyType.Fixed;
935 ButtonText.HeightResizePolicy = ResizePolicyType.Fixed;
936 int textPaddingStart = Style.TextPadding.Start;
937 int textPaddingEnd = Style.TextPadding.End;
938 int textPaddingTop = Style.TextPadding.Top;
939 int textPaddingBottom = Style.TextPadding.Bottom;
941 int iconPaddingStart = Style.IconPadding.Start;
942 int iconPaddingEnd = Style.IconPadding.End;
943 int iconPaddingTop = Style.IconPadding.Top;
944 int iconPaddingBottom = Style.IconPadding.Bottom;
946 if (IconRelativeOrientation == IconOrientation.Top || IconRelativeOrientation == IconOrientation.Bottom)
948 ButtonText.SizeWidth = SizeWidth - textPaddingStart - textPaddingEnd;
949 ButtonText.SizeHeight = SizeHeight - textPaddingTop - textPaddingBottom - iconPaddingTop - iconPaddingBottom - ButtonIcon.SizeHeight;
953 ButtonText.SizeWidth = SizeWidth - textPaddingStart - textPaddingEnd - iconPaddingStart - iconPaddingEnd - ButtonIcon.SizeWidth;
954 ButtonText.SizeHeight = SizeHeight - textPaddingTop - textPaddingBottom;
958 /// Layout child, it can be override.
960 /// <since_tizen> 6 </since_tizen>
961 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
962 [EditorBrowsable(EditorBrowsableState.Never)]
963 protected virtual void LayoutChild()
965 if (Style.IconRelativeOrientation == null || ButtonIcon == null || ButtonText == null)
970 var buttonIcon = ButtonIcon;
971 var buttonText = ButtonText;
973 int textPaddingStart = Style.TextPadding.Start;
974 int textPaddingEnd = Style.TextPadding.End;
975 int textPaddingTop = Style.TextPadding.Top;
976 int textPaddingBottom = Style.TextPadding.Bottom;
978 int iconPaddingStart = Style.IconPadding.Start;
979 int iconPaddingEnd = Style.IconPadding.End;
980 int iconPaddingTop = Style.IconPadding.Top;
981 int iconPaddingBottom = Style.IconPadding.Bottom;
983 switch (IconRelativeOrientation)
985 case IconOrientation.Top:
986 buttonIcon.PositionUsesPivotPoint = true;
987 buttonIcon.ParentOrigin = NUI.ParentOrigin.TopCenter;
988 buttonIcon.PivotPoint = NUI.PivotPoint.TopCenter;
989 buttonIcon.Position2D = new Position2D(0, iconPaddingTop);
991 buttonText.PositionUsesPivotPoint = true;
992 buttonText.ParentOrigin = NUI.ParentOrigin.BottomCenter;
993 buttonText.PivotPoint = NUI.PivotPoint.BottomCenter;
994 buttonText.Position2D = new Position2D(0, -textPaddingBottom);
996 case IconOrientation.Bottom:
997 buttonIcon.PositionUsesPivotPoint = true;
998 buttonIcon.ParentOrigin = NUI.ParentOrigin.BottomCenter;
999 buttonIcon.PivotPoint = NUI.PivotPoint.BottomCenter;
1000 buttonIcon.Position2D = new Position2D(0, -iconPaddingBottom);
1002 buttonText.PositionUsesPivotPoint = true;
1003 buttonText.ParentOrigin = NUI.ParentOrigin.TopCenter;
1004 buttonText.PivotPoint = NUI.PivotPoint.TopCenter;
1005 buttonText.Position2D = new Position2D(0, textPaddingTop);
1007 case IconOrientation.Left:
1008 if (LayoutDirection == ViewLayoutDirectionType.LTR)
1010 buttonIcon.PositionUsesPivotPoint = true;
1011 buttonIcon.ParentOrigin = NUI.ParentOrigin.CenterLeft;
1012 buttonIcon.PivotPoint = NUI.PivotPoint.CenterLeft;
1013 buttonIcon.Position2D = new Position2D(iconPaddingStart, 0);
1015 buttonText.PositionUsesPivotPoint = true;
1016 buttonText.ParentOrigin = NUI.ParentOrigin.CenterRight;
1017 buttonText.PivotPoint = NUI.PivotPoint.CenterRight;
1018 buttonText.Position2D = new Position2D(-textPaddingEnd, 0);
1022 buttonIcon.PositionUsesPivotPoint = true;
1023 buttonIcon.ParentOrigin = NUI.ParentOrigin.CenterRight;
1024 buttonIcon.PivotPoint = NUI.PivotPoint.CenterRight;
1025 buttonIcon.Position2D = new Position2D(-iconPaddingStart, 0);
1027 buttonText.PositionUsesPivotPoint = true;
1028 buttonText.ParentOrigin = NUI.ParentOrigin.CenterLeft;
1029 buttonText.PivotPoint = NUI.PivotPoint.CenterLeft;
1030 buttonText.Position2D = new Position2D(textPaddingEnd, 0);
1034 case IconOrientation.Right:
1035 if (LayoutDirection == ViewLayoutDirectionType.RTL)
1037 buttonIcon.PositionUsesPivotPoint = true;
1038 buttonIcon.ParentOrigin = NUI.ParentOrigin.CenterLeft;
1039 buttonIcon.PivotPoint = NUI.PivotPoint.CenterLeft;
1040 buttonIcon.Position2D = new Position2D(iconPaddingEnd, 0);
1042 buttonText.PositionUsesPivotPoint = true;
1043 buttonText.ParentOrigin = NUI.ParentOrigin.CenterRight;
1044 buttonText.PivotPoint = NUI.PivotPoint.CenterRight;
1045 buttonText.Position2D = new Position2D(-textPaddingStart, 0);
1049 buttonIcon.PositionUsesPivotPoint = true;
1050 buttonIcon.ParentOrigin = NUI.ParentOrigin.CenterRight;
1051 buttonIcon.PivotPoint = NUI.PivotPoint.CenterRight;
1052 buttonIcon.Position2D = new Position2D(-iconPaddingEnd, 0);
1054 buttonText.PositionUsesPivotPoint = true;
1055 buttonText.ParentOrigin = NUI.ParentOrigin.CenterLeft;
1056 buttonText.PivotPoint = NUI.PivotPoint.CenterLeft;
1057 buttonText.Position2D = new Position2D(textPaddingStart, 0);
1063 if (string.IsNullOrEmpty(buttonText.Text))
1065 buttonIcon.ParentOrigin = NUI.ParentOrigin.Center;
1066 buttonIcon.PivotPoint = NUI.PivotPoint.Center;
1070 /// Theme change callback when theme is changed, this callback will be trigger.
1072 /// <param name="sender">The sender</param>
1073 /// <param name="e">The event data</param>
1074 /// <since_tizen> 8 </since_tizen>
1075 protected override void OnThemeChangedEvent(object sender, StyleManager.ThemeChangeEventArgs e)
1077 ButtonStyle buttonStyle = StyleManager.Instance.GetViewStyle(style) as ButtonStyle;
1078 if (buttonStyle != null)
1080 Style.CopyFrom(buttonStyle);
1085 private void UpdateUIContent()
1090 Sensitive = isEnabled;
1093 private void OnLayoutDirectionChanged(object sender, LayoutDirectionChangedEventArgs e)
1099 private void OnClickInternal(ClickEventArgs eventArgs)
1102 Extension?.OnClick(this, eventArgs);
1103 ClickEvent?.Invoke(this, eventArgs);
1106 private void OnIconRelayout(object sender, EventArgs e)
1113 /// ClickEventArgs is a class to record button click event arguments which will sent to user.
1115 /// <since_tizen> 6 </since_tizen>
1116 public class ClickEventArgs : EventArgs
1120 /// StateChangeEventArgs is a class to record button state change event arguments which will sent to user.
1122 /// <since_tizen> 6 </since_tizen>
1123 public class StateChangedEventArgs : EventArgs
1125 /// <summary> previous state of Button </summary>
1126 /// <since_tizen> 6 </since_tizen>
1127 public ControlStates PreviousState;
1128 /// <summary> current state of Button </summary>
1129 /// <since_tizen> 6 </since_tizen>
1130 public ControlStates CurrentState;
1134 /// A Selector class that describes Buttons state by actions.
1136 [EditorBrowsable(EditorBrowsableState.Never)]
1137 public class ActionSelector<T>
1140 /// Value used when the Button is created.
1142 [EditorBrowsable(EditorBrowsableState.Never)]
1143 public T OnCreate { get; set; }
1146 /// Value used when the Button is selected.
1148 [EditorBrowsable(EditorBrowsableState.Never)]
1149 public T OnSelect { get; set; }
1152 /// Value used when the Button is unselected.
1154 [EditorBrowsable(EditorBrowsableState.Never)]
1155 public T OnUnselect { get; set; }
1158 /// Value used when the Button is disabled.
1160 [EditorBrowsable(EditorBrowsableState.Never)]
1161 public T OnDisable { get; set; }
1164 /// Value used when the Button is disabled in selected state.
1166 [EditorBrowsable(EditorBrowsableState.Never)]
1167 public T OnDisableSelected { get; set; }
1170 /// Value used when the Button is pressed.
1172 [EditorBrowsable(EditorBrowsableState.Never)]
1173 public T OnPress { get; set; }
1176 /// Value used when the Button is pressed in selected state.
1178 [EditorBrowsable(EditorBrowsableState.Never)]
1179 public T OnPressSelected { get; set; }
1183 /// Get current text part to the attached ButtonExtension.
1186 /// It returns null if the passed extension is invaild.
1188 /// <param name="extension">The extension instance that is currently attached to this Button.</param>
1189 /// <return>The button's text part.</return>
1190 [EditorBrowsable(EditorBrowsableState.Never)]
1191 public TextLabel GetCurrentText(ButtonExtension extension)
1193 return (extension == Extension) ? ButtonText : null;
1197 /// Get current icon part to the attached ButtonExtension.
1200 /// It returns null if the passed extension is invaild.
1202 /// <param name="extension">The extension instance that is currently attached to this Button.</param>
1203 /// <return>The button's icon part.</return>
1204 [EditorBrowsable(EditorBrowsableState.Never)]
1205 public ImageView GetCurrentIcon(ButtonExtension extension)
1207 return (extension == Extension) ? ButtonIcon : null;
1211 /// Get current overlay image part to the attached ButtonExtension.
1214 /// It returns null if the passed extension is invaild.
1216 /// <param name="extension">The extension instance that is currently attached to this Button.</param>
1217 /// <return>The button's overlay image part.</return>
1218 [EditorBrowsable(EditorBrowsableState.Never)]
1219 public ImageView GetCurrentOverlayImage(ButtonExtension extension)
1221 return (extension == Extension) ? ButtonOverlayImage : null;