[NUI] Add Transition Group
authorSeungho Baek <sbsh.baek@samsung.com>
Mon, 15 Nov 2021 05:27:47 +0000 (14:27 +0900)
committerdongsug-song <35130733+dongsug-song@users.noreply.github.com>
Fri, 19 Nov 2021 07:00:52 +0000 (16:00 +0900)
Signed-off-by: Seungho Baek <sbsh.baek@samsung.com>
13 files changed:
src/Tizen.NUI.Components/Controls/Navigation/Navigator.cs
src/Tizen.NUI/src/internal/Transition/FadeTransitionItem.cs
src/Tizen.NUI/src/internal/Transition/ScaleTransitionItem.cs
src/Tizen.NUI/src/internal/Transition/SlideTransitionItem.cs
src/Tizen.NUI/src/internal/Transition/TransitionGroupItem.cs [new file with mode: 0644]
src/Tizen.NUI/src/internal/Transition/TransitionItemBase.cs
src/Tizen.NUI/src/internal/Transition/TransitionSet.cs
src/Tizen.NUI/src/public/Transition/FadeTransition.cs
src/Tizen.NUI/src/public/Transition/ScaleTransition.cs
src/Tizen.NUI/src/public/Transition/SlideTransition.cs
src/Tizen.NUI/src/public/Transition/TransitionBase.cs
src/Tizen.NUI/src/public/Transition/TransitionGroup.cs [new file with mode: 0644]
test/Tizen.NUI.Samples/Tizen.NUI.Samples/Samples/PageTransitionSample.cs

index dcf0662..191ee12 100755 (executable)
@@ -164,7 +164,7 @@ namespace Tizen.NUI.Components
         {
             if (!transitionFinished)
             {
-                Tizen.Log.Error("NUI", "Transition is still not finished.\n");
+                Tizen.Log.Info("NUI", "Transition is still not finished.\n");
                 return;
             }
 
@@ -217,7 +217,7 @@ namespace Tizen.NUI.Components
         {
             if (!transitionFinished)
             {
-                Tizen.Log.Error("NUI", "Transition is still not finished.\n");
+                Tizen.Log.Info("NUI", "Transition is still not finished.\n");
                 return null;
             }
 
@@ -755,26 +755,22 @@ namespace Tizen.NUI.Components
         /// </summary>
         /// <param name="taggedViews">Returned tagged view list..</param>
         /// <param name="view">Root View to get tagged child View.</param>
-        /// <param name="isPage">Flag to check current View is page or not</param>
-        private void RetrieveTaggedViews(List<View> taggedViews, View view, bool isPage)
+        /// <param name="isRoot">Flag to check current View is page or not</param>
+        private void RetrieveTaggedViews(List<View> taggedViews, View view, bool isRoot)
         {
-            if (!isPage)
+            if (!isRoot && view.TransitionOptions != null)
             {
                 if (!string.IsNullOrEmpty(view.TransitionOptions?.TransitionTag))
                 {
                     taggedViews.Add((view as View));
+                    if (view.TransitionOptions.TransitionWithChild)
+                    {
+                        return;
+                    }
                 }
 
-                if (view.ChildCount == 0)
-                {
-                    return;
-                }
-
-                if (view.TransitionOptions?.TransitionWithChild ?? false)
-                {
-                    return;
-                }
             }
+
             foreach (View child in view.Children)
             {
                 RetrieveTaggedViews(taggedViews, child, false);
index b222372..8dfd6eb 100644 (file)
@@ -32,10 +32,10 @@ namespace Tizen.NUI
         /// Creates an initialized fade.<br />
         /// </summary>
         /// <remarks>DurationmSeconds must be greater than zero.</remarks>
-        public FadeTransitionItem(View view, float opacity, bool isAppearing, TimePeriod timePeriod, AlphaFunction alphaFunction) : this(Interop.FadeTransitionItem.New(view.SwigCPtr, opacity, timePeriod.SwigCPtr), true)
+        public FadeTransitionItem(View view, float opacity, bool appearingTransition, TimePeriod timePeriod, AlphaFunction alphaFunction) : this(Interop.FadeTransitionItem.New(view.SwigCPtr, opacity, timePeriod.SwigCPtr), true)
         {
             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
-            AppearingTransition = isAppearing;
+            AppearingTransition = appearingTransition;
             AlphaFunction = alphaFunction;
         }
 
index da944c6..19afeab 100755 (executable)
@@ -32,10 +32,10 @@ namespace Tizen.NUI
         /// Creates an initialized ScaleTransition.<br />
         /// </summary>
         /// <remarks>Delay and duration of timePeriod must be greater than zero.</remarks>
-        public ScaleTransitionItem(View view, float scale, bool isAppearing, TimePeriod timePeriod, AlphaFunction alphaFunction) : this(Interop.ScaleTransitionItem.New(view.SwigCPtr, scale, timePeriod.SwigCPtr), true)
+        public ScaleTransitionItem(View view, float scale, bool appearingTransition, TimePeriod timePeriod, AlphaFunction alphaFunction) : this(Interop.ScaleTransitionItem.New(view.SwigCPtr, scale, timePeriod.SwigCPtr), true)
         {
             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
-            AppearingTransition = isAppearing;
+            AppearingTransition = appearingTransition;
             AlphaFunction = alphaFunction;
         }
 
@@ -43,10 +43,10 @@ namespace Tizen.NUI
         /// Creates an initialized ScaleTransition.<br />
         /// </summary>
         /// <remarks>Delay and duration of timePeriod must be greater than zero.</remarks>
-        public ScaleTransitionItem(View view, Vector2 scale, bool isAppearing, TimePeriod timePeriod, AlphaFunction alphaFunction) : this(Interop.ScaleTransitionItem.New(view.SwigCPtr, scale.SwigCPtr, timePeriod.SwigCPtr), true)
+        public ScaleTransitionItem(View view, Vector2 scale, bool appearingTransition, TimePeriod timePeriod, AlphaFunction alphaFunction) : this(Interop.ScaleTransitionItem.New(view.SwigCPtr, scale.SwigCPtr, timePeriod.SwigCPtr), true)
         {
             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
-            AppearingTransition = isAppearing;
+            AppearingTransition = appearingTransition;
             AlphaFunction = alphaFunction;
         }
 
index 5b963d5..a09e48f 100755 (executable)
@@ -32,10 +32,10 @@ namespace Tizen.NUI
         /// Creates an initialized SlideTransition.<br />
         /// </summary>
         /// <remarks>Delay and duration of timePeriod must be greater than zero.</remarks>
-        public SlideTransitionItem(View view, Vector2 direction, bool isAppearing, TimePeriod timePeriod, AlphaFunction alphaFunction) : this(Interop.SlideTransitionItem.New(view.SwigCPtr, direction.SwigCPtr, timePeriod.SwigCPtr), true)
+        public SlideTransitionItem(View view, Vector2 direction, bool appearingTransition, TimePeriod timePeriod, AlphaFunction alphaFunction) : this(Interop.SlideTransitionItem.New(view.SwigCPtr, direction.SwigCPtr, timePeriod.SwigCPtr), true)
         {
             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
-            AppearingTransition = isAppearing;
+            AppearingTransition = appearingTransition;
             AlphaFunction = alphaFunction;
         }
 
diff --git a/src/Tizen.NUI/src/internal/Transition/TransitionGroupItem.cs b/src/Tizen.NUI/src/internal/Transition/TransitionGroupItem.cs
new file mode 100644 (file)
index 0000000..5a209d9
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ * Copyright(c) 2021 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+using System;
+using System.ComponentModel;
+using Tizen.NUI.BaseComponents;
+using System.Collections.Generic;
+
+namespace Tizen.NUI
+{
+    /// <summary>
+    /// TransitionGroupItem is an object to set Fade transition of a View that will appear or disappear.
+    /// TransitionGroupItem object is required to be added to the TransitionSet to play.
+    /// </summary>
+    internal class TransitionGroupItem : TransitionItemBase
+    {
+        private List<TransitionItemBase> transitionItemList = null;
+
+        private bool useGroupTimePeriod = false;
+        private bool stepTransition = false;
+        private bool useGroupAlphaFunction = false;
+
+        private View transitionView = null;
+
+        /// <summary>
+        /// Creates an initialized fade.<br />
+        /// </summary>
+        /// <remarks>DurationmSeconds must be greater than zero.</remarks>
+        public TransitionGroupItem(View view, List<TransitionBase> transitionList, bool useGroupTimePeriod, bool stepTransition, bool useGroupAlphaFunction, bool appearingTransition, TimePeriod timePeriod, AlphaFunction alphaFunction)
+        : base(view, appearingTransition, timePeriod, alphaFunction)
+        {
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+
+            this.useGroupTimePeriod = useGroupTimePeriod;
+            this.stepTransition = stepTransition;
+            this.useGroupAlphaFunction = useGroupAlphaFunction;
+            transitionView = view;
+
+            transitionItemList = new List<TransitionItemBase>();
+            for (int index = 0; index < transitionList.Count; ++index)
+            {
+                TimePeriod localTimePeriod = transitionList[index].GetTimePeriod();
+                AlphaFunction localAlphaFunction = transitionList[index].GetAlphaFunction();
+                if (useGroupTimePeriod)
+                {
+                    int stepMilliseconds = 0;
+                    if (stepTransition)
+                    {
+                        stepMilliseconds = TimePeriod.DurationMilliseconds / transitionList.Count;
+                    }
+                    localTimePeriod.DelayMilliseconds += TimePeriod.DelayMilliseconds + stepMilliseconds * index;
+                }
+                if (useGroupAlphaFunction)
+                {
+                    localAlphaFunction = AlphaFunction;
+                }
+                transitionItemList.Add(transitionList[index].CreateTransition(transitionView, AppearingTransition, localTimePeriod, localAlphaFunction));
+            }
+        }
+
+        public int TransitionCount
+        {
+            get
+            {
+                if(transitionItemList != null)
+                {
+                    return transitionItemList.Count;
+                }
+                return 0;
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets whether the View moves with child or not.
+        /// </summary>
+        public override bool TransitionWithChild
+        {
+            set
+            {
+                foreach (TransitionItemBase item in transitionItemList)
+                {
+                    item.TransitionWithChild = value;
+                }
+            }
+        }
+
+        public TransitionItemBase GetTransitionAt(int index)
+        {
+            if (transitionItemList != null && index < transitionItemList.Count)
+            {
+                return transitionItemList[index];
+            }
+            return null;
+        }
+    }
+}
index 98bec77..28073f4 100755 (executable)
@@ -23,14 +23,21 @@ namespace Tizen.NUI
 
     internal class TransitionItemBase : BaseHandle
     {
+        private bool appearingTransition = true;
+
         /// <summary>
         /// Creates an initialized TransitionItemBase.<br />
         /// </summary>
-        public TransitionItemBase(View target, bool isAppearing, TimePeriod timePeriod, AlphaFunction alphaFunction) : this(Interop.TransitionItemBase.New(), true)
+        public TransitionItemBase(View target, bool appearingTransition, TimePeriod timePeriod, AlphaFunction alphaFunction) : this(Interop.TransitionItemBase.New(), true)
         {
             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+
+            if(target == null)
+            {
+                Tizen.Log.Error("NUI", "Argument target is empty\n");
+            }
             
-            AppearingTransition = isAppearing;
+            AppearingTransition = appearingTransition;
             TimePeriod = timePeriod;
             AlphaFunction = alphaFunction;
         }
@@ -78,7 +85,7 @@ namespace Tizen.NUI
         /// <summary>
         /// Gets or sets whether the View moves with child or not.
         /// </summary>
-        public bool TransitionWithChild
+        public virtual bool TransitionWithChild
         {
             set
             {
@@ -94,9 +101,14 @@ namespace Tizen.NUI
         {
             set
             {
+                appearingTransition = value;
                 Interop.TransitionItemBase.SetAppearingTransition(SwigCPtr, value);
                 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
             }
+            get
+            {
+                return appearingTransition;
+            }
         }
 
         /// <summary>
index 6770353..edcb919 100755 (executable)
@@ -101,8 +101,19 @@ namespace Tizen.NUI
 
         public void AddTransition(TransitionItemBase transition)
         {
-            Interop.TransitionSet.AddTransition(SwigCPtr, transition.SwigCPtr);
-            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            if (transition is TransitionGroupItem)
+            {
+                TransitionGroupItem transitionGroup = transition as TransitionGroupItem;
+                for (int index = 0; index < transitionGroup.TransitionCount; ++index)
+                {
+                    this.AddTransition(transitionGroup.GetTransitionAt(index));
+                }
+            }
+            else
+            {
+                Interop.TransitionSet.AddTransition(SwigCPtr, transition.SwigCPtr);
+                if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            }
         }
 
         public TransitionItemBase GetTransitionAt(uint index)
index 5c7e595..a465dce 100644 (file)
@@ -56,9 +56,9 @@ namespace Tizen.NUI
             }
         }
 
-        internal override TransitionItemBase CreateTransition(View view, bool isAppearing)
+        internal override TransitionItemBase CreateTransition(View view, bool appearingTransition, TimePeriod timePeriod, AlphaFunction alphaFunction)
         {
-            FadeTransitionItem fade = new FadeTransitionItem(view, Opacity, isAppearing, GetTimePeriod(), GetAlphaFunction());
+            FadeTransitionItem fade = new FadeTransitionItem(view, Opacity, appearingTransition, timePeriod, alphaFunction);
             return fade;
         }
     }
index fd0b1db..e87e80e 100644 (file)
@@ -49,9 +49,9 @@ namespace Tizen.NUI
         /// <since_tizen> 9 </since_tizen>
         public Vector2 ScaleFactor { get; set; } = new Vector2(0.0f, 0.0f);
 
-        internal override TransitionItemBase CreateTransition(View view, bool isAppearing)
+        internal override TransitionItemBase CreateTransition(View view, bool appearingTransition, TimePeriod timePeriod, AlphaFunction alphaFunction)
         {
-            ScaleTransitionItem scale = new ScaleTransitionItem(view, ScaleFactor, isAppearing, GetTimePeriod(), GetAlphaFunction());
+            ScaleTransitionItem scale = new ScaleTransitionItem(view, ScaleFactor, appearingTransition, timePeriod, alphaFunction);
             return scale;
         }
     }
index 571b49b..07ab42d 100644 (file)
@@ -44,9 +44,9 @@ namespace Tizen.NUI
         /// <since_tizen> 9 </since_tizen>
         public Vector2 Direction { get; set; } = SlideTransitionDirection.Right;
 
-        internal override TransitionItemBase CreateTransition(View view, bool isAppearing)
+        internal override TransitionItemBase CreateTransition(View view, bool appearingTransition, TimePeriod timePeriod, AlphaFunction alphaFunction)
         {
-            SlideTransitionItem slide = new SlideTransitionItem(view, Direction, isAppearing, GetTimePeriod(), GetAlphaFunction());
+            SlideTransitionItem slide = new SlideTransitionItem(view, Direction, appearingTransition, timePeriod, alphaFunction);
             return slide;
         }
     }
index 7cc9849..980ecc9 100644 (file)
@@ -84,9 +84,14 @@ namespace Tizen.NUI
             return alphaFunction ??= new AlphaFunction(AlphaFunction.BuiltinFunctions.Default);
         }
 
-        internal virtual TransitionItemBase CreateTransition(View view, bool isAppearing)
+        internal TransitionItemBase CreateTransition(View view, bool appearingTransition)
         {
-            return new TransitionItemBase(view, isAppearing, GetTimePeriod(), GetAlphaFunction());
+            return CreateTransition(view, appearingTransition, GetTimePeriod(), GetAlphaFunction());
+        }
+
+        internal virtual TransitionItemBase CreateTransition(View view, bool appearingTransition, TimePeriod timePeriod, AlphaFunction alphaFunction)
+        {
+            return new TransitionItemBase(view, appearingTransition, timePeriod, alphaFunction);
         }
 
         [EditorBrowsable(EditorBrowsableState.Never)]
diff --git a/src/Tizen.NUI/src/public/Transition/TransitionGroup.cs b/src/Tizen.NUI/src/public/Transition/TransitionGroup.cs
new file mode 100644 (file)
index 0000000..daac3e4
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * Copyright(c) 2021 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+using System;
+using System.ComponentModel;
+using Tizen.NUI.BaseComponents;
+using System.Collections.Generic;
+
+namespace Tizen.NUI
+{
+    /// <summary>
+    /// TransitionGroup class is a cluster of properties to use multiple Transitions on a target.
+    /// FadeTransition, ScaleTransition, and SlideTransition can be added on this group with AddTransition method.
+    /// The transitions can be started at the same time or can be started sequentially in order.
+    /// </summary>
+    [EditorBrowsable(EditorBrowsableState.Never)]
+    public class TransitionGroup : TransitionBase
+    {
+        private List<TransitionBase> transitionList = null;
+
+        /// <summary>
+        /// Create a FadeTransition for the View pair.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public TransitionGroup()
+        {
+        }
+
+        /// <summary>
+        /// Set/Get whether the child Transitions are affected by the TimePeriod of this TransitionGroup
+        /// If UseGroupTimePeriod is true, child Transitions wait for a TimePeriod.DelayMilliseconds before starting.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public bool UseGroupTimePeriod { set; get; } = false;
+
+        /// <summary>
+        /// Set/Get whether the child Transitions are started sequentially or not.
+        /// If StepTransition is true, the child Transitions starts sequentially with an interval of "TimePeriod.DurationMilliseconds/#ofChildTransitions".
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public bool StepTransition { set; get; } = false;
+
+        /// <summary>
+        /// Set/Get whether the child Transitions are affected by the AlphaFunction of this TransitionGroup
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public bool UseGroupAlphaFunction { set; get; } = false;
+
+
+        /// <summary>
+        /// Adds a Transition to this TransitionGroup.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public void AddTransition(TransitionBase transition)
+        {
+            if (transitionList == null)
+            {
+                transitionList = new List<TransitionBase>();
+            }
+            transitionList.Add(transition);
+        }
+
+        internal override TransitionItemBase CreateTransition(View view, bool appearingTransition, TimePeriod timePeriod, AlphaFunction alphaFunction)
+        {
+            TransitionGroupItem group = new TransitionGroupItem(view, transitionList, UseGroupTimePeriod, StepTransition, UseGroupAlphaFunction, appearingTransition, timePeriod, alphaFunction);
+            return group;
+        }
+    }
+}
index 2c7c215..5288315 100755 (executable)
@@ -82,6 +82,34 @@ namespace Tizen.NUI.Samples
             layoutView.Add(greenButton);
             layoutView.Add(blueButton);
 
+
+            TransitionGroup transitionGroup = new TransitionGroup()
+            {
+                UseGroupAlphaFunction = true,
+                AlphaFunction = new AlphaFunction(AlphaFunction.BuiltinFunctions.EaseInOut),
+            };
+            SlideTransition slide = new SlideTransition()
+            {
+                TimePeriod = new TimePeriod(400),
+                AlphaFunction = new AlphaFunction(AlphaFunction.BuiltinFunctions.Default),
+                Direction = SlideTransitionDirection.Top
+            };
+            transitionGroup.AddTransition(slide);
+            FadeTransition fade = new FadeTransition()
+            {
+                Opacity = 0.3f,
+                TimePeriod = new TimePeriod(400),
+                AlphaFunction = new AlphaFunction(AlphaFunction.BuiltinFunctions.Default)
+            };
+            transitionGroup.AddTransition(fade);
+            ScaleTransition scale = new ScaleTransition()
+            {
+                ScaleFactor = new Vector2(0.3f, 0.3f),
+                TimePeriod = new TimePeriod(400),
+                AlphaFunction = new AlphaFunction(AlphaFunction.BuiltinFunctions.Default)
+            };
+            transitionGroup.AddTransition(scale);
+
             mainPage = new ContentPage()
             {
                 BackgroundColor = Color.Transparent,
@@ -92,12 +120,7 @@ namespace Tizen.NUI.Samples
                     AlphaFunction = new AlphaFunction(AlphaFunction.BuiltinFunctions.Default),
                     ScaleFactor = new Vector2(0.5f, 1.5f)
                 },
-                AppearingTransition = new SlideTransition()
-                {
-                    TimePeriod = new TimePeriod(500),
-                    AlphaFunction = new AlphaFunction(AlphaFunction.BuiltinFunctions.Default),
-                    Direction = SlideTransitionDirection.Top
-                },
+                AppearingTransition = transitionGroup,
             };
             navigator.Push(mainPage);
 
@@ -328,15 +351,20 @@ namespace Tizen.NUI.Samples
             };
             pageRoot.Add(pageBackground);
 
+            TransitionGroup transitionGroup = new TransitionGroup();
+            FadeTransition slide = new FadeTransition()
+            {
+                TimePeriod = new TimePeriod(500),
+                AlphaFunction = new AlphaFunction(AlphaFunction.BuiltinFunctions.Default),
+            };
+            transitionGroup.AddTransition(slide);
+
             Page page = new ContentPage()
             {
                 BackgroundColor = Color.Transparent,
                 Content = pageRoot,
-                AppearingTransition = new FadeTransition()
-                {
-                    TimePeriod = new TimePeriod(500),
-                    AlphaFunction = new AlphaFunction(AlphaFunction.BuiltinFunctions.Default),
-                },
+
+                AppearingTransition = transitionGroup,
                 DisappearingTransition = new SlideTransition()
                 {
                     TimePeriod = new TimePeriod(500),