[NUI] Fix to change IsSelected when ControlState is changed
authorJaehyun Cho <jae_hyun.cho@samsung.com>
Wed, 20 Jul 2022 08:11:45 +0000 (17:11 +0900)
committerJaehyun Cho <jaehyun0cho@gmail.com>
Mon, 25 Jul 2022 08:33:12 +0000 (17:33 +0900)
Previously, IsSelected property was not changed when its ControlState
was changed between Normal and Selected.

Now, IsSelected property is also changed when ControlState is changed.
So, SelectedChanged event's IsSelected is synchronized with its look.

src/Tizen.NUI.Components/Controls/Button.Internal.cs
src/Tizen.NUI.Components/Controls/RecyclerView/Item/RecyclerViewItem.Internal.cs
src/Tizen.NUI.Components/Controls/SelectButton.cs
src/Tizen.NUI.Components/Controls/Switch.cs
test/Tizen.NUI.StyleGuide/Examples/DefaultLinearItemExample.cs

index f24d899..9db2270 100644 (file)
@@ -315,6 +315,16 @@ namespace Tizen.NUI.Components
             {
                 isPressed = statePressed;
             }
+
+            if (IsSelectable)
+            {
+                var stateSelected = controlStateChangedInfo.CurrentState.Contains(ControlState.Selected);
+
+                if (IsSelected != stateSelected)
+                {
+                    IsSelected = stateSelected;
+                }
+            }
         }
 
         /// <summary>
index 05d28f1..e655306 100755 (executable)
@@ -178,6 +178,16 @@ namespace Tizen.NUI.Components
             {
                 IsPressed = statePressed;
             }
+
+            if (IsSelectable)
+            {
+                var stateSelected = controlStateChangedInfo.CurrentState.Contains(ControlState.Selected);
+
+                if (IsSelected != stateSelected)
+                {
+                    IsSelected = stateSelected;
+                }
+            }
         }
 
         /// <summary>
index 1857750..e1f4a44 100755 (executable)
@@ -196,6 +196,11 @@ namespace Tizen.NUI.Components
 
                 OnSelectedChanged();
 
+                if (IsSelected != info.CurrentState.Contains(ControlState.Selected))
+                {
+                    IsSelected = info.CurrentState.Contains(ControlState.Selected);
+                }
+
                 if (SelectedChanged != null)
                 {
                     SelectedChangedEventArgs eventArgs = new SelectedChangedEventArgs();
index 5dd4913..1c1c885 100755 (executable)
@@ -349,18 +349,15 @@ namespace Tizen.NUI.Components
         [EditorBrowsable(EditorBrowsableState.Never)]
         protected override void OnControlStateChanged(ControlStateChangedEventArgs controlStateChangedInfo)
         {
+            if (controlStateChangedInfo == null) throw new ArgumentNullException(nameof(controlStateChangedInfo));
             base.OnControlStateChanged(controlStateChangedInfo);
 
-            if (!IsSelectable)
+            if (IsSelectable)
             {
-                return;
-            }
-
-            bool previousSelected = controlStateChangedInfo.PreviousState.Contains(ControlState.Selected);
-
-            if (previousSelected != IsSelected)
-            {
-                OnSelect();
+                if (controlStateChangedInfo.PreviousState.Contains(ControlState.Selected) != controlStateChangedInfo.CurrentState.Contains(ControlState.Selected))
+                {
+                   OnSelect();
+                }
             }
         }
 
index 398b10c..bbc9785 100644 (file)
@@ -41,7 +41,27 @@ namespace Tizen.NUI.StyleGuide
                 Text = text,
             };
             if (subText != null) item.SubText = subText;
-            if (icon) item.Icon = new CheckBox();
+            if (icon)
+            {
+                var check = new CheckBox();
+                check.SelectedChanged += (s, e) =>
+                {
+                    if (e.IsSelected)
+                    {
+                        Log.Info(this.GetType().Name, "CheckBox is Selected\n");
+                    }
+                    else
+                    {
+                        Log.Info(this.GetType().Name, "CheckBox is Unselected\n");
+                    }
+                };
+                // CheckBox does not process touch event by setting Sensitive false.
+                // So, when user touches CheckBox, the touch event is passed to item and item becomes selected/unselected.
+                // When item becomes selected/unselected, CheckBox becomes selected/unselected.
+                // Because item's ControlState is propagated to its children by default by setting item.EnableControlStatePropagation true.
+                check.Sensitive = false;
+                item.Icon = check;
+            }
             if (extra) item.Extra = new RadioButton();
             return item;
         }