[NUI] Refactor ButtonExtension
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI.Components / Controls / Extension / LottieButtonExtension.cs
index d173d26..67a499b 100755 (executable)
@@ -29,57 +29,56 @@ namespace Tizen.NUI.Components.Extension
     [EditorBrowsable(EditorBrowsableState.Never)]
     public class LottieButtonExtension : ButtonExtension
     {
-        /// <summary>
-        /// A constructor that creates LottieButtonExtension with a specified Lottie resource URL
-        /// </summary>
+        /// <inheritdoc/>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        public LottieButtonExtension() : base()
+        public override bool ProcessIcon(Button button, ref ImageView icon)
         {
-            LottieView = new LottieAnimationView();
-        }
+            if (button.Style is ILottieButtonStyle lottieStyle)
+            {
+                var lottieView = LottieExtensionHelper.CreateLottieView(lottieStyle);
+                var parent = icon.GetParent();
 
-        /// <summary>
-        /// The Lottie view that will be used as an icon part in a Button.
-        /// </summary>
-        [EditorBrowsable(EditorBrowsableState.Never)]
-        protected LottieAnimationView LottieView { get; set; }
+                icon.Unparent();
+                icon.Dispose();
+                icon = lottieView;
+                parent?.Add(icon);
 
-        /// <inheritdoc/>
-        [EditorBrowsable(EditorBrowsableState.Never)]
-        public override ImageView OnCreateIcon(Button button, ImageView icon)
-        {
-            InitializeLottieView(button, LottieView);
+                return true;
+            }
 
-            return LottieView;
+            return false;
         }
 
         /// <inheritdoc/>
         [EditorBrowsable(EditorBrowsableState.Never)]
         public override void OnControlStateChanged(Button button, View.ControlStateChangedEventArgs args)
         {
-            UpdateLottieView(button, args.PreviousState, LottieView);
+            if (button.Style is ILottieButtonStyle lottieStyle && button.Icon is LottieAnimationView lottieView)
+            {
+                LottieExtensionHelper.UpdateLottieView(lottieView, lottieStyle, args.PreviousState, button.ControlState);
+            }
         }
+    }
 
-        internal static void InitializeLottieView(Button button, LottieAnimationView lottieView)
+    internal static class LottieExtensionHelper
+    {
+        internal static LottieAnimationView CreateLottieView(ILottieButtonStyle lottieStyle)
         {
-            if (button.Style as ILottieButtonStyle == null)
+            var lottieView = new LottieAnimationView()
             {
-                throw new Exception("LottieButtonExtension must be used within a ILottieButtonStyle or derived class.");
-            }
-
-            var lottieStyle = (ILottieButtonStyle)button.Style;
-            lottieView.URL = lottieStyle.LottieUrl;
-            lottieView.StopBehavior = LottieAnimationView.StopBehaviorType.MaximumFrame;
+                URL = lottieStyle.LottieUrl,
+                StopBehavior = LottieAnimationView.StopBehaviorType.MaximumFrame
+            };
             if (lottieStyle.PlayRange != null && lottieStyle.PlayRange.GetValue(ControlState.Normal, out var result))
             {
                 result.Show(lottieView, true);
             }
+            return lottieView;
         }
 
-        internal static void UpdateLottieView(Button button, ControlState previousState, LottieAnimationView lottieView)
+        internal static void UpdateLottieView(LottieAnimationView lottieView, ILottieButtonStyle lottieStyle, ControlState previousState, ControlState currentState)
         {
-            var lottieStyle = ((ILottieButtonStyle)button.Style);
-            if (lottieStyle != null && lottieStyle.PlayRange != null && lottieStyle.PlayRange.GetValue(button.ControlState, out var result))
+            if (lottieStyle.PlayRange != null && lottieStyle.PlayRange.GetValue(currentState, out var result))
             {
                 result.Show(lottieView, !previousState.Contains(ControlState.Pressed));
             }