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;
848 targetState = ControlStates.Normal;
851 targetState |= (IsSelected ? ControlStates.Selected : 0);
853 // Pressed, PressedSelected, Focused, SelectedFocused
854 targetState |= (isPressed ? ControlStates.Pressed : (IsFocused ? ControlStates.Focused : 0));
859 targetState = ControlStates.Disabled;
861 // DisabledSelected, DisabledFocused
862 targetState |= (IsSelected ? ControlStates.Selected : (IsFocused ? ControlStates.Focused : 0));
865 if (SetControlState(targetState, touchInfo))
869 StateChangedEventArgs e = new StateChangedEventArgs
871 PreviousState = sourceState,
872 CurrentState = targetState
874 stateChangeHander?.Invoke(this, e);
876 Extension?.OnControlStateChanged(this, sourceState, touchInfo);
881 /// It is hijack by using protected, style copy problem when class inherited from Button.
883 /// <since_tizen> 6 </since_tizen>
884 private void Initialize()
886 var style = (ButtonStyle)Style;
888 Extension = style.CreateExtension();
892 if (ButtonOverlayImage != null)
894 Add(ButtonOverlayImage);
895 ButtonOverlayImage.ApplyStyle(style.Overlay);
898 if (ButtonIcon != null)
901 ButtonIcon.ApplyStyle(style.Icon);
902 ButtonIcon.Relayout += OnIconRelayout;
905 if (null != ButtonText)
908 ButtonText.ApplyStyle(style.Text);
913 LayoutDirectionChanged += OnLayoutDirectionChanged;
916 private void CreateComponents()
918 ButtonOverlayImage = CreateOverlayImage();
919 ButtonIcon = CreateIcon();
920 ButtonText = CreateText();
922 if (Extension == null)
927 // Update component with extension
928 ButtonOverlayImage = Extension.OnCreateOverlayImage(this, ButtonOverlayImage);
929 ButtonIcon = Extension.OnCreateIcon(this, ButtonIcon);
930 ButtonText = Extension.OnCreateText(this, ButtonText);
934 /// Measure text, it can be override.
936 /// <since_tizen> 6 </since_tizen>
937 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
938 [EditorBrowsable(EditorBrowsableState.Never)]
939 protected virtual void MeasureText()
941 if (Style.IconRelativeOrientation == null || ButtonIcon == null || ButtonText == null)
945 ButtonText.WidthResizePolicy = ResizePolicyType.Fixed;
946 ButtonText.HeightResizePolicy = ResizePolicyType.Fixed;
947 int textPaddingStart = Style.TextPadding.Start;
948 int textPaddingEnd = Style.TextPadding.End;
949 int textPaddingTop = Style.TextPadding.Top;
950 int textPaddingBottom = Style.TextPadding.Bottom;
952 int iconPaddingStart = Style.IconPadding.Start;
953 int iconPaddingEnd = Style.IconPadding.End;
954 int iconPaddingTop = Style.IconPadding.Top;
955 int iconPaddingBottom = Style.IconPadding.Bottom;
957 if (IconRelativeOrientation == IconOrientation.Top || IconRelativeOrientation == IconOrientation.Bottom)
959 ButtonText.SizeWidth = SizeWidth - textPaddingStart - textPaddingEnd;
960 ButtonText.SizeHeight = SizeHeight - textPaddingTop - textPaddingBottom - iconPaddingTop - iconPaddingBottom - ButtonIcon.SizeHeight;
964 ButtonText.SizeWidth = SizeWidth - textPaddingStart - textPaddingEnd - iconPaddingStart - iconPaddingEnd - ButtonIcon.SizeWidth;
965 ButtonText.SizeHeight = SizeHeight - textPaddingTop - textPaddingBottom;
969 /// Layout child, it can be override.
971 /// <since_tizen> 6 </since_tizen>
972 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
973 [EditorBrowsable(EditorBrowsableState.Never)]
974 protected virtual void LayoutChild()
976 if (Style.IconRelativeOrientation == null || ButtonIcon == null || ButtonText == null)
981 var buttonIcon = ButtonIcon;
982 var buttonText = ButtonText;
984 int textPaddingStart = Style.TextPadding.Start;
985 int textPaddingEnd = Style.TextPadding.End;
986 int textPaddingTop = Style.TextPadding.Top;
987 int textPaddingBottom = Style.TextPadding.Bottom;
989 int iconPaddingStart = Style.IconPadding.Start;
990 int iconPaddingEnd = Style.IconPadding.End;
991 int iconPaddingTop = Style.IconPadding.Top;
992 int iconPaddingBottom = Style.IconPadding.Bottom;
994 switch (IconRelativeOrientation)
996 case IconOrientation.Top:
997 buttonIcon.PositionUsesPivotPoint = true;
998 buttonIcon.ParentOrigin = NUI.ParentOrigin.TopCenter;
999 buttonIcon.PivotPoint = NUI.PivotPoint.TopCenter;
1000 buttonIcon.Position2D = new Position2D(0, iconPaddingTop);
1002 buttonText.PositionUsesPivotPoint = true;
1003 buttonText.ParentOrigin = NUI.ParentOrigin.BottomCenter;
1004 buttonText.PivotPoint = NUI.PivotPoint.BottomCenter;
1005 buttonText.Position2D = new Position2D(0, -textPaddingBottom);
1007 case IconOrientation.Bottom:
1008 buttonIcon.PositionUsesPivotPoint = true;
1009 buttonIcon.ParentOrigin = NUI.ParentOrigin.BottomCenter;
1010 buttonIcon.PivotPoint = NUI.PivotPoint.BottomCenter;
1011 buttonIcon.Position2D = new Position2D(0, -iconPaddingBottom);
1013 buttonText.PositionUsesPivotPoint = true;
1014 buttonText.ParentOrigin = NUI.ParentOrigin.TopCenter;
1015 buttonText.PivotPoint = NUI.PivotPoint.TopCenter;
1016 buttonText.Position2D = new Position2D(0, textPaddingTop);
1018 case IconOrientation.Left:
1019 if (LayoutDirection == ViewLayoutDirectionType.LTR)
1021 buttonIcon.PositionUsesPivotPoint = true;
1022 buttonIcon.ParentOrigin = NUI.ParentOrigin.CenterLeft;
1023 buttonIcon.PivotPoint = NUI.PivotPoint.CenterLeft;
1024 buttonIcon.Position2D = new Position2D(iconPaddingStart, 0);
1026 buttonText.PositionUsesPivotPoint = true;
1027 buttonText.ParentOrigin = NUI.ParentOrigin.CenterRight;
1028 buttonText.PivotPoint = NUI.PivotPoint.CenterRight;
1029 buttonText.Position2D = new Position2D(-textPaddingEnd, 0);
1033 buttonIcon.PositionUsesPivotPoint = true;
1034 buttonIcon.ParentOrigin = NUI.ParentOrigin.CenterRight;
1035 buttonIcon.PivotPoint = NUI.PivotPoint.CenterRight;
1036 buttonIcon.Position2D = new Position2D(-iconPaddingStart, 0);
1038 buttonText.PositionUsesPivotPoint = true;
1039 buttonText.ParentOrigin = NUI.ParentOrigin.CenterLeft;
1040 buttonText.PivotPoint = NUI.PivotPoint.CenterLeft;
1041 buttonText.Position2D = new Position2D(textPaddingEnd, 0);
1045 case IconOrientation.Right:
1046 if (LayoutDirection == ViewLayoutDirectionType.RTL)
1048 buttonIcon.PositionUsesPivotPoint = true;
1049 buttonIcon.ParentOrigin = NUI.ParentOrigin.CenterLeft;
1050 buttonIcon.PivotPoint = NUI.PivotPoint.CenterLeft;
1051 buttonIcon.Position2D = new Position2D(iconPaddingEnd, 0);
1053 buttonText.PositionUsesPivotPoint = true;
1054 buttonText.ParentOrigin = NUI.ParentOrigin.CenterRight;
1055 buttonText.PivotPoint = NUI.PivotPoint.CenterRight;
1056 buttonText.Position2D = new Position2D(-textPaddingStart, 0);
1060 buttonIcon.PositionUsesPivotPoint = true;
1061 buttonIcon.ParentOrigin = NUI.ParentOrigin.CenterRight;
1062 buttonIcon.PivotPoint = NUI.PivotPoint.CenterRight;
1063 buttonIcon.Position2D = new Position2D(-iconPaddingEnd, 0);
1065 buttonText.PositionUsesPivotPoint = true;
1066 buttonText.ParentOrigin = NUI.ParentOrigin.CenterLeft;
1067 buttonText.PivotPoint = NUI.PivotPoint.CenterLeft;
1068 buttonText.Position2D = new Position2D(textPaddingStart, 0);
1074 if (string.IsNullOrEmpty(buttonText.Text))
1076 buttonIcon.ParentOrigin = NUI.ParentOrigin.Center;
1077 buttonIcon.PivotPoint = NUI.PivotPoint.Center;
1081 /// Theme change callback when theme is changed, this callback will be trigger.
1083 /// <param name="sender">The sender</param>
1084 /// <param name="e">The event data</param>
1085 /// <since_tizen> 8 </since_tizen>
1086 protected override void OnThemeChangedEvent(object sender, StyleManager.ThemeChangeEventArgs e)
1088 ButtonStyle buttonStyle = StyleManager.Instance.GetViewStyle(style) as ButtonStyle;
1089 if (buttonStyle != null)
1091 Style.CopyFrom(buttonStyle);
1096 private void UpdateUIContent()
1101 Sensitive = isEnabled;
1104 private void OnLayoutDirectionChanged(object sender, LayoutDirectionChangedEventArgs e)
1110 private void OnClickInternal(ClickEventArgs eventArgs)
1113 Extension?.OnClick(this, eventArgs);
1114 ClickEvent?.Invoke(this, eventArgs);
1117 private void OnIconRelayout(object sender, EventArgs e)
1124 /// ClickEventArgs is a class to record button click event arguments which will sent to user.
1126 /// <since_tizen> 6 </since_tizen>
1127 public class ClickEventArgs : EventArgs
1131 /// StateChangeEventArgs is a class to record button state change event arguments which will sent to user.
1133 /// <since_tizen> 6 </since_tizen>
1134 public class StateChangedEventArgs : EventArgs
1136 /// <summary> previous state of Button </summary>
1137 /// <since_tizen> 6 </since_tizen>
1138 public ControlStates PreviousState;
1139 /// <summary> current state of Button </summary>
1140 /// <since_tizen> 6 </since_tizen>
1141 public ControlStates CurrentState;
1145 /// Get current text part to the attached ButtonExtension.
1148 /// It returns null if the passed extension is invaild.
1150 /// <param name="extension">The extension instance that is currently attached to this Button.</param>
1151 /// <return>The button's text part.</return>
1152 [EditorBrowsable(EditorBrowsableState.Never)]
1153 public TextLabel GetCurrentText(ButtonExtension extension)
1155 return (extension == Extension) ? ButtonText : null;
1159 /// Get current icon part to the attached ButtonExtension.
1162 /// It returns null if the passed extension is invaild.
1164 /// <param name="extension">The extension instance that is currently attached to this Button.</param>
1165 /// <return>The button's icon part.</return>
1166 [EditorBrowsable(EditorBrowsableState.Never)]
1167 public ImageView GetCurrentIcon(ButtonExtension extension)
1169 return (extension == Extension) ? ButtonIcon : null;
1173 /// Get current overlay image part to the attached ButtonExtension.
1176 /// It returns null if the passed extension is invaild.
1178 /// <param name="extension">The extension instance that is currently attached to this Button.</param>
1179 /// <return>The button's overlay image part.</return>
1180 [EditorBrowsable(EditorBrowsableState.Never)]
1181 public ImageView GetCurrentOverlayImage(ButtonExtension extension)
1183 return (extension == Extension) ? ButtonOverlayImage : null;