[NUI] avoid duplicated elements in Selector (#2122)
authorYeongJong Lee <cleanlyj@naver.com>
Thu, 29 Oct 2020 07:32:13 +0000 (16:32 +0900)
committerGitHub <noreply@github.com>
Thu, 29 Oct 2020 07:32:13 +0000 (16:32 +0900)
Co-authored-by: Jiyun Yang <ji.yang@samsung.com>
src/Tizen.NUI/src/public/BaseComponents/Style/Selector.cs

index 4d92571..7c4b431 100755 (executable)
@@ -37,22 +37,30 @@ namespace Tizen.NUI.BaseComponents
         /// The list for adding state-value pair.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        public IList<StateValuePair<T>> StateValueList { get; private set; } = new List<StateValuePair<T>>();
+        List<StateValuePair<T>> StateValueList { get; set; } = new List<StateValuePair<T>>();
 
         /// <summary>
-        /// Adds the specified state and value to the <see cref="StateValueList"/>.
+        /// Adds the specified state and value.
         /// </summary>
         /// <param name="state">The state.</param>
         /// <param name="value">The value associated with state.</param>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        public void Add(ControlState state, T value) => StateValueList.Add(new StateValuePair<T>(state, value));
+        public void Add(ControlState state, T value) => Add(new StateValuePair<T>(state, value));
 
         /// <summary>
-        /// Adds the specified state and value to the <see cref="StateValueList"/>.
+        /// Adds the specified state and value.
         /// </summary>
         /// <param name="stateValuePair"></param>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        public void Add(StateValuePair<T> stateValuePair) => StateValueList.Add(stateValuePair);
+        public void Add(StateValuePair<T> stateValuePair)
+        {
+            // To prevent a state from having multiple values, remove existing state-value pair.
+            int index = StateValueList.FindIndex(x => x.State == stateValuePair.State);
+            if (index != -1)
+               StateValueList.RemoveAt(index);
+
+            StateValueList.Add(stateValuePair);
+        }
 
         /// <since_tizen> 6 </since_tizen>
         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
@@ -100,7 +108,7 @@ namespace Tizen.NUI.BaseComponents
         [EditorBrowsable(EditorBrowsableState.Never)]
         public T Normal
         {
-            get => ((List<StateValuePair<T>>)StateValueList).FindLast(x => x.State == ControlState.Normal).Value;
+            get => StateValueList.Find(x => x.State == ControlState.Normal).Value;
             set => Add(ControlState.Normal, value);
         }
         /// <summary>
@@ -112,7 +120,7 @@ namespace Tizen.NUI.BaseComponents
         public T Pressed
         {
 
-            get => ((List<StateValuePair<T>>)StateValueList).FindLast(x => x.State == ControlState.Pressed).Value;
+            get => StateValueList.Find(x => x.State == ControlState.Pressed).Value;
             set => Add(ControlState.Pressed, value);
         }
         /// <summary>
@@ -123,7 +131,7 @@ namespace Tizen.NUI.BaseComponents
         [EditorBrowsable(EditorBrowsableState.Never)]
         public T Focused
         {
-            get => ((List<StateValuePair<T>>)StateValueList).FindLast(x => x.State == ControlState.Focused).Value;
+            get => StateValueList.Find(x => x.State == ControlState.Focused).Value;
             set => Add(ControlState.Focused, value);
         }
         /// <summary>
@@ -134,7 +142,7 @@ namespace Tizen.NUI.BaseComponents
         [EditorBrowsable(EditorBrowsableState.Never)]
         public T Selected
         {
-            get => ((List<StateValuePair<T>>)StateValueList).FindLast(x => x.State == ControlState.Selected).Value;
+            get => StateValueList.Find(x => x.State == ControlState.Selected).Value;
             set => Add(ControlState.Selected, value);
         }
         /// <summary>
@@ -146,7 +154,7 @@ namespace Tizen.NUI.BaseComponents
         public T Disabled
         {
 
-            get => ((List<StateValuePair<T>>)StateValueList).FindLast(x => x.State == ControlState.Disabled).Value;
+            get => StateValueList.Find(x => x.State == ControlState.Disabled).Value;
             set => Add(ControlState.Disabled, value);
         }
         /// <summary>
@@ -157,7 +165,7 @@ namespace Tizen.NUI.BaseComponents
         [EditorBrowsable(EditorBrowsableState.Never)]
         public T DisabledFocused
         {
-            get => ((List<StateValuePair<T>>)StateValueList).FindLast(x => x.State == ControlState.DisabledFocused).Value;
+            get => StateValueList.Find(x => x.State == ControlState.DisabledFocused).Value;
             set => Add(ControlState.DisabledFocused, value);
         }
         /// <summary>
@@ -167,7 +175,7 @@ namespace Tizen.NUI.BaseComponents
         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
         public T SelectedFocused
         {
-            get => ((List<StateValuePair<T>>)StateValueList).FindLast(x => x.State == ControlState.SelectedFocused).Value;
+            get => StateValueList.Find(x => x.State == ControlState.SelectedFocused).Value;
             set => Add(ControlState.SelectedFocused, value);
         }
         /// <summary>
@@ -179,7 +187,7 @@ namespace Tizen.NUI.BaseComponents
         public T DisabledSelected
         {
 
-            get => ((List<StateValuePair<T>>)StateValueList).FindLast(x => x.State == ControlState.DisabledSelected).Value;
+            get => StateValueList.Find(x => x.State == ControlState.DisabledSelected).Value;
             set => Add(ControlState.DisabledSelected, value);
         }
 
@@ -191,9 +199,16 @@ namespace Tizen.NUI.BaseComponents
         [EditorBrowsable(EditorBrowsableState.Never)]
         public T Other
         {
-            get => ((List<StateValuePair<T>>)StateValueList).FindLast(x => x.State == ControlState.Other).Value;
+            get => StateValueList.Find(x => x.State == ControlState.Other).Value;
             set => Add(ControlState.Other, value);
         }
+
+        /// <summary>
+        /// Gets the number of elements.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public int Count => StateValueList.Count;
+
         /// <summary>
         /// Get value by State.
         /// </summary>
@@ -212,7 +227,7 @@ namespace Tizen.NUI.BaseComponents
 
             result = default;
 
-            int index = ((List<StateValuePair<T>>)StateValueList).FindLastIndex(x => x.State == state);
+            int index = StateValueList.FindIndex(x => x.State == state);
             if (index >= 0)
             {
                 result = StateValueList[index].Value;
@@ -221,7 +236,7 @@ namespace Tizen.NUI.BaseComponents
 
             if (state.IsCombined)
             {
-                index = ((List<StateValuePair<T>>)StateValueList).FindLastIndex(x => state.Contains(x.State));
+                index = StateValueList.FindIndex(x => state.Contains(x.State));
                 if (index >= 0)
                 {
                     result = StateValueList[index].Value;
@@ -229,7 +244,7 @@ namespace Tizen.NUI.BaseComponents
                 }
             }
 
-            index = ((List<StateValuePair<T>>)StateValueList).FindLastIndex(x => x.State == ControlState.Other);
+            index = StateValueList.FindIndex(x => x.State == ControlState.Other);
             if (index >= 0)
             {
                 result = StateValueList[index].Value;
@@ -240,7 +255,7 @@ namespace Tizen.NUI.BaseComponents
         }
 
         /// <summary>
-        /// Removes all elements from <see cref="StateValueList"/>.
+        /// Removes all elements.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
         public void Clear()
@@ -286,12 +301,12 @@ namespace Tizen.NUI.BaseComponents
             if (cloneable)
             {
                 All = (T)((ICloneable)other.All)?.Clone();
-                StateValueList = ((List<StateValuePair<T>>)other.StateValueList).ConvertAll(m => new StateValuePair<T>(m.State, (T)((ICloneable)m.Value)?.Clone()));
+                StateValueList = other.StateValueList.ConvertAll(m => new StateValuePair<T>(m.State, (T)((ICloneable)m.Value)?.Clone()));
             }
             else
             {
                 All = other.All;
-                StateValueList = ((List<StateValuePair<T>>)other.StateValueList).ConvertAll(m => m);
+                StateValueList = other.StateValueList.ConvertAll(m => m);
             }
         }
 
@@ -299,6 +314,7 @@ namespace Tizen.NUI.BaseComponents
         {
             return StateValueList.Count > 1;
         }
+
     }
 
     /// <summary>
@@ -426,23 +442,4 @@ namespace Tizen.NUI.BaseComponents
             }
         }
     }
-
-    /// <summary>
-    /// Extension class for <see cref="Selector{T}"/>.
-    /// </summary>
-    [EditorBrowsable(EditorBrowsableState.Never)]
-    public static class SelectorExtensions
-    {
-        /// <summary>
-        /// Adds the specified state and value to the <see cref="Selector{T}.StateValueList"/>.
-        /// </summary>
-        /// <param name="list">The list for adding state-value pair.</param>
-        /// <param name="state">The state.</param>
-        /// <param name="value">The value associated with state.</param>
-        [EditorBrowsable(EditorBrowsableState.Never)]
-        public static void Add<T>(this IList<StateValuePair<T>> list, ControlState state, T value)
-        {
-            list.Add(new StateValuePair<T>(state, value));
-        }
-    }
 }