[NUI] Fix RadioButton not to invoke duplicate SelectedChanged (#2115)
authorJaehyun Cho <29364140+jaehyun0cho@users.noreply.github.com>
Tue, 22 Dec 2020 06:18:50 +0000 (15:18 +0900)
committerdongsug-song <35130733+dongsug-song@users.noreply.github.com>
Tue, 22 Dec 2020 08:57:34 +0000 (17:57 +0900)
RadioButton does not change its state to unselected if button or key is
unpressed while its state is selected.

Previously, RadioButton invoked duplicate SelectedChanged if button or
key is unpressed while its state is selected.

Now, RadioButton does not invoke duplicate SelectedChanged if button or
key is unpressed while its state is selected.

Co-authored-by: Jaehyun Cho <jae_hyun.cho@samsung.com>
Co-authored-by: Jiyun Yang <ji.yang@samsung.com>
src/Tizen.NUI.Components/Controls/RadioButton.cs
src/Tizen.NUI.Components/Controls/SelectButton.cs

index dcbb75d..0d279a3 100755 (executable)
@@ -32,6 +32,8 @@ namespace Tizen.NUI.Components
     /// <since_tizen> 8 </since_tizen>
     public class RadioButton : SelectButton
     {
+        private bool selectedAgain = false;
+
         static RadioButton() { }
 
         /// <summary>
@@ -85,19 +87,6 @@ namespace Tizen.NUI.Components
             }
         }
 
-        /// <summary>
-        /// Set CheckState to true after selecting RadioButton.
-        /// </summary>
-        /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
-        [EditorBrowsable(EditorBrowsableState.Never)]
-        protected override void OnSelectedChanged()
-        {
-            if (!IsSelected)
-            {
-                IsSelected = true;
-            }
-        }
-
         /// <inheritdoc/>
         [EditorBrowsable(EditorBrowsableState.Never)]
         protected override ImageView CreateIcon()
@@ -112,5 +101,86 @@ namespace Tizen.NUI.Components
                 SizeModeFactor = new Vector3(1, 1, 1),
             };
         }
+
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public override bool OnKey(Key key)
+        {
+            if ((IsEnabled == false) || (key == null))
+            {
+                return false;
+            }
+
+            if (key.State == Key.StateType.Up)
+            {
+                if (key.KeyPressedName == "Return")
+                {
+                    if (IsSelected == true)
+                    {
+                        selectedAgain = true;
+                    }
+                }
+            }
+
+            bool ret = base.OnKey(key);
+
+            if (selectedAgain == true)
+            {
+                IsSelected = true;
+                selectedAgain = false;
+            }
+
+            return ret;
+        }
+
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        protected override bool HandleControlStateOnTouch(Touch touch)
+        {
+            if ((IsEnabled == false) || (touch == null))
+            {
+                return false;
+            }
+
+            PointStateType state = touch.GetState(0);
+            switch (state)
+            {
+                case PointStateType.Up:
+                    if (IsSelected == true)
+                    {
+                        selectedAgain = true;
+                    }
+                    break;
+                default:
+                    break;
+            }
+
+            bool ret = base.HandleControlStateOnTouch(touch);
+
+            if (selectedAgain == true)
+            {
+                IsSelected = true;
+                selectedAgain = false;
+            }
+
+            return ret;
+        }
+
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        protected override void OnControlStateChanged(ControlStateChangedEventArgs info)
+        {
+            if (info.PreviousState.Contains(ControlState.Selected) != info.CurrentState.Contains(ControlState.Selected))
+            {
+                // RadioButton does not invoke SelectedChanged if button or key
+                // is unpressed while its state is selected.
+                if (selectedAgain == true)
+                {
+                    return;
+                }
+
+                base.OnControlStateChanged(info);
+            }
+        }
     }
 }
index ccd46e0..9eebaec 100755 (executable)
@@ -32,6 +32,8 @@ namespace Tizen.NUI.Components
     {
         private SelectGroup itemGroup = null;
 
+        private bool invokeSelectedChanged = false;
+
         /// <summary>
         /// Item group which is used to manager all SelectButton in it.
         /// </summary>
@@ -134,20 +136,24 @@ namespace Tizen.NUI.Components
         [EditorBrowsable(EditorBrowsableState.Never)]
         public override bool OnKey(Key key)
         {
-            if (IsEnabled == false)
+            if ((IsEnabled == false) || (key == null))
             {
                 return false;
             }
-            bool ret = base.OnKey(key);
+
             if (key.State == Key.StateType.Up)
             {
                 if (key.KeyPressedName == "Return")
                 {
-                    OnSelect();
+                    invokeSelectedChanged = true;
                 }
             }
+            else
+            {
+                invokeSelectedChanged = false;
+            }
 
-            return ret;
+            return base.OnKey(key);
         }
 
         /// <summary>
@@ -168,22 +174,23 @@ namespace Tizen.NUI.Components
         [EditorBrowsable(EditorBrowsableState.Never)]
         protected override bool HandleControlStateOnTouch(Touch touch)
         {
-            if (false == IsEnabled)
+            if ((IsEnabled == false) || (touch == null))
             {
                 return false;
             }
 
             PointStateType state = touch.GetState(0);
-            bool ret = base.HandleControlStateOnTouch(touch);
             switch (state)
             {
                 case PointStateType.Up:
-                    OnSelect();
+                    invokeSelectedChanged = true;
                     break;
                 default:
+                    invokeSelectedChanged = false;
                     break;
             }
-            return ret;
+
+            return base.HandleControlStateOnTouch(touch);
         }
 
         /// <summary>
@@ -200,15 +207,26 @@ namespace Tizen.NUI.Components
             IsSelectable = true;
         }
 
-        private void OnSelect()
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        protected override void OnControlStateChanged(ControlStateChangedEventArgs info)
         {
-            OnSelectedChanged();
-
-            if (SelectedChanged != null)
+            if (info.PreviousState.Contains(ControlState.Selected) != info.CurrentState.Contains(ControlState.Selected))
             {
-                SelectedChangedEventArgs eventArgs = new SelectedChangedEventArgs();
-                eventArgs.IsSelected = IsSelected;
-                SelectedChanged(this, eventArgs);
+                // SelectedChanged is invoked when button or key is unpressed.
+                if (invokeSelectedChanged == false)
+                {
+                    return;
+                }
+
+                OnSelectedChanged();
+
+                if (SelectedChanged != null)
+                {
+                    SelectedChangedEventArgs eventArgs = new SelectedChangedEventArgs();
+                    eventArgs.IsSelected = IsSelected;
+                    SelectedChanged(this, eventArgs);
+                }
             }
         }
     }