Add Transit
authorsung-su.kim <sung-su.kim@samsung.com>
Mon, 19 Jun 2017 11:37:11 +0000 (20:37 +0900)
committersung-su.kim <sung-su.kim@samsung.com>
Fri, 23 Jun 2017 06:36:55 +0000 (15:36 +0900)
Change-Id: I84f82a4fa1940214286219bf9a7940ad8fdb5469

src/ElmSharp/ElmSharp/EffectBase.cs [new file with mode: 0755]
src/ElmSharp/ElmSharp/Transit.cs [new file with mode: 0755]
src/ElmSharp/ElmSharp/TransitEffect.cs [new file with mode: 0755]
test/ElmSharp.Test/ElmSharp.Test.csproj [changed mode: 0644->0755]
test/ElmSharp.Test/TC/TransitTest.cs [new file with mode: 0755]

diff --git a/src/ElmSharp/ElmSharp/EffectBase.cs b/src/ElmSharp/ElmSharp/EffectBase.cs
new file mode 100755 (executable)
index 0000000..19eddb0
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * 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;
+
+namespace ElmSharp
+{
+    /// <summary>
+    /// EffectBase class for the TransitEffect
+    /// </summary>
+    public abstract class EffectBase
+    {
+        /// <summary>
+        /// EffectEneded event will be triggered when be effect ended.
+        /// </summary>
+        public event EventHandler EffectEnded;
+
+        internal abstract IntPtr CreateEffect(IntPtr transit);
+
+        internal void SendEffectEnd()
+        {
+            EffectEnded?.Invoke(this, EventArgs.Empty);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/ElmSharp/ElmSharp/Transit.cs b/src/ElmSharp/ElmSharp/Transit.cs
new file mode 100755 (executable)
index 0000000..2b2dc00
--- /dev/null
@@ -0,0 +1,381 @@
+/*
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * 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.Collections;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Collections.Specialized;
+using static Interop.Elementary;
+
+namespace ElmSharp
+{
+    /// <summary>
+    /// Transit is designed to apply various animated transition effects, such like translation, rotation, etc.
+    /// For using these effects, create an Transit and add the desired transition effects.
+    /// </summary>
+    /// <remarks>Transit is not reusable. If the effect ends, the transit is destroyed automatically.</remarks>
+    public class Transit : IDisposable
+    {
+        IntPtr _handle = IntPtr.Zero;
+        bool _isDisposed = false;
+        ObservableCollection<EvasObject> _objects = new ObservableCollection<EvasObject>();
+        ObservableCollection<Transit> _chains = new ObservableCollection<Transit>();
+        HashSet<object> _checker = new HashSet<object>();
+        Elm_Transit_Del_Cb DeletedCallback;
+        Elm_Transit_Effect_End_Cb EffectEndCallback;
+
+        /// <summary>
+        /// A callback called when the transit is deleted.
+        /// </summary>
+        public event EventHandler Deleted;
+
+        /// <summary>
+        /// Creates and initializes a new instance of Transit class.
+        /// </summary>
+        public Transit()
+        {
+            _handle = Interop.Elementary.elm_transit_add();
+            DeletedCallback = (ptr1, ptr2) => {
+                Deleted?.Invoke(this, EventArgs.Empty);
+                Dispose(true);
+            };
+            Interop.Elementary.elm_transit_del_cb_set(_handle, DeletedCallback, IntPtr.Zero);
+            ((INotifyCollectionChanged)_objects).CollectionChanged += OnObjectCollectionChanged;
+            ((INotifyCollectionChanged)_chains).CollectionChanged += OnChaninCollectionChanged;
+        }
+
+        ~Transit()
+        {
+            Dispose(false);
+        }
+
+        /// <summary>
+        /// Gets or sets the transit animation time
+        /// </summary>
+        public double Duration
+        {
+            get
+            {
+                return Interop.Elementary.elm_transit_duration_get(_handle);
+            }
+            set
+            {
+                Interop.Elementary.elm_transit_duration_set(_handle, value);
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets a value whether the objects states will be keep or not.
+        /// If it is not kept, the objects states will be reset when transition ends.
+        /// </summary>
+        public bool ObjectStateKeep
+        {
+            get
+            {
+                return Interop.Elementary.elm_transit_objects_final_state_keep_get(_handle);
+            }
+            set
+            {
+                Interop.Elementary.elm_transit_objects_final_state_keep_set(_handle, value);
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the transit animation acceleration type.
+        /// </summary>
+        public TweenMode TweenMode
+        {
+            get
+            {
+                return (TweenMode)Interop.Elementary.elm_transit_tween_mode_get(_handle);
+            }
+            set
+            {
+                Interop.Elementary.elm_transit_tween_mode_set(_handle, (int)value);
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the transit repeat count.
+        /// If the repeat is a negative number, it will repeat infinite times.
+        /// </summary>
+        public int Repeat
+        {
+            get
+            {
+                return Interop.Elementary.elm_transit_repeat_times_get(_handle);
+            }
+            set
+            {
+                Interop.Elementary.elm_transit_repeat_times_set(_handle, value);
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets if the auto reverse is on.
+        /// </summary>
+        public bool AutoReverse
+        {
+            get
+            {
+                return Interop.Elementary.elm_transit_auto_reverse_get(_handle);
+            }
+            set
+            {
+                Interop.Elementary.elm_transit_auto_reverse_set(_handle, value);
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the event enabled when transit is operating.
+        /// </summary>
+        public bool EventEnabled
+        {
+            get
+            {
+                return Interop.Elementary.elm_transit_event_enabled_get(_handle);
+            }
+            set
+            {
+                Interop.Elementary.elm_transit_event_enabled_set(_handle, value);
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the smooth scaling for transit map rendering
+        /// This gets smooth scaling for transit map rendering.
+        /// </summary>
+        public bool Smooth
+        {
+            get
+            {
+                return Interop.Elementary.elm_transit_smooth_get(_handle);
+            }
+            set
+            {
+                Interop.Elementary.elm_transit_smooth_set(_handle, value);
+            }
+        }
+
+        /// <summary>
+        /// Pause/Resume the transition.
+        /// </summary>
+        public bool Pause
+        {
+            get
+            {
+                return Interop.Elementary.elm_transit_paused_get(_handle);
+            }
+            set
+            {
+                Interop.Elementary.elm_transit_paused_set(_handle, value);
+            }
+        }
+
+        /// <summary>
+        /// Get the time progression of the animation (a double value between 0.0 and 1.0).
+        /// The value returned is a fraction(current time / total time).
+        /// It represents the progression position relative to the total.
+        /// </summary>
+        public double Progress
+        {
+            get
+            {
+                return Interop.Elementary.elm_transit_progress_value_get(_handle);
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the transit animation tween mode acceleration factor.
+        /// </summary>
+        /// <returns>A factor value from 0.0 to 1.0.</returns>
+        public double BeginAccelerationFactor
+        {
+            get
+            {
+                double begin = 1.0, end = 0.0;
+                Interop.Elementary.elm_transit_tween_mode_factor_get(_handle, out begin, out end);
+                return begin;
+            }
+            set
+            {
+                Interop.Elementary.elm_transit_tween_mode_factor_set(_handle, value, EndAccelerationFactor);
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the transit animation tween mode acceleration factor.
+        /// </summary>
+        /// <returns>A factor value from 0.0 to 1.0.</returns>
+        public double EndAccelerationFactor
+        {
+            get
+            {
+                double begin = 1.0, end = 0.0;
+                Interop.Elementary.elm_transit_tween_mode_factor_get(_handle, out begin, out end);
+                return end;
+            }
+            set
+            {
+                Interop.Elementary.elm_transit_tween_mode_factor_set(_handle, BeginAccelerationFactor, value);
+            }
+        }
+
+        /// <summary>
+        /// Starts the transition in given seconds.
+        /// Once this API is called, the transit begins to measure the time.
+        /// </summary>
+        /// <param name="interval">The interval value in seconds</param>
+        public void Go(double interval = 0)
+        {
+            Interop.Elementary.elm_transit_go_in(_handle, interval);
+        }
+
+        /// <summary>
+        /// Get the current chained transit list.
+        /// </summary>
+        /// <remarks>Cannot add the duplicate transit.</remarks>
+        public IList<Transit> Chains
+        {
+            get { return _chains; }
+        }
+
+        /// <summary>
+        /// Get the objects list of the transit.
+        /// </summary>
+        /// <remarks>Cannot add the duplicate object.</remarks>
+        public IList<EvasObject> Objects
+        {
+            get { return _objects; }
+        }
+
+        /// <summary>
+        /// Add the effect.
+        /// </summary>
+        /// <param name="effect">EffectBase object.</param>
+        public void AddEffect(EffectBase effect)
+        {
+            IntPtr _effect = effect.CreateEffect(_handle);
+            EffectEndCallback = (ptr1, ptr2) => { effect.SendEffectEnd(); };
+            Interop.Elementary.elm_transit_effect_add(_handle, null, _effect, EffectEndCallback);
+        }
+
+        public void Dispose()
+        {
+            Dispose(true);
+            GC.SuppressFinalize(this);
+        }
+
+        protected virtual void Dispose(bool isDisposing)
+        {
+            if (_isDisposed)
+                return;
+
+            if (isDisposing)
+            {
+                ((INotifyCollectionChanged)_chains).CollectionChanged -= OnChaninCollectionChanged;
+                _chains.Clear();
+                ((INotifyCollectionChanged)_objects).CollectionChanged -= OnObjectCollectionChanged;
+                _objects.Clear();
+                _checker.Clear();
+            }
+
+            _isDisposed = true;
+        }
+
+        void OnObjectCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
+        {
+            if (e.Action == NotifyCollectionChangedAction.Add)
+            {
+                foreach (EvasObject item in e.NewItems)
+                    AddObject(item);
+            }
+            else if (e.Action == NotifyCollectionChangedAction.Remove)
+            {
+                foreach (EvasObject item in e.OldItems)
+                    RemoveObject(item);
+            }
+        }
+
+        void OnChaninCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
+        {
+            if (e.Action == NotifyCollectionChangedAction.Add)
+            {
+                foreach (Transit item in e.NewItems)
+                    AddChainedTransit(item);
+            }
+            else if (e.Action == NotifyCollectionChangedAction.Remove)
+            {
+                foreach (Transit item in e.OldItems)
+                    DeleteChainedTransit(item);
+            }
+        }
+
+        /// <summary>
+        /// Add new object to apply the effects.
+        /// After the first addition of an object to transit, if its object list become empty again, the transit will be killed.
+        /// If the obj belongs to another transit, the obj will be removed from it and it will only belong to the other transit.
+        /// </summary>
+        /// <remarks>It is not allowed to add a new object after transit begins.</remarks>
+        /// <param name="obj">Object to be animated.</param>
+        void AddObject(EvasObject obj)
+        {
+            if (_checker.Contains(obj))
+                throw new Exception("Cannot add the duplicate object.");
+
+            _checker.Add(obj);
+            Interop.Elementary.elm_transit_object_add(_handle, obj);
+        }
+
+        /// <summary>
+        /// Removes an added object from the transit.
+        /// </summary>
+        /// <param name="obj">Object to be removed from transit.</param>
+        void RemoveObject(EvasObject obj)
+        {
+            if (_checker.Contains(obj))
+                _checker.Remove(obj);
+
+            Interop.Elementary.elm_transit_object_remove(_handle, obj);
+        }
+
+        /// <summary>
+        /// Makes the chain relationship between two transits.
+        /// </summary>
+        /// <param name="transit">The chain transit object. This transit will be operated after transit is done.</param>
+        void AddChainedTransit(Transit transit)
+        {
+            if (_checker.Contains(transit))
+                throw new Exception("Cannot add the duplicate transit.");
+
+            _checker.Add(transit);
+            Interop.Elementary.elm_transit_chain_transit_add(_handle, transit._handle);
+        }
+
+        /// <summary>
+        /// Cut off the chain relationship between two transits.
+        /// </summary>
+        /// <param name="transit">The chain transit object.</param>
+        void DeleteChainedTransit(Transit transit)
+        {
+            if (_checker.Contains(transit))
+                _checker.Remove(transit);
+
+            Interop.Elementary.elm_transit_chain_transit_del(_handle, transit._handle);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/ElmSharp/ElmSharp/TransitEffect.cs b/src/ElmSharp/ElmSharp/TransitEffect.cs
new file mode 100755 (executable)
index 0000000..fd29499
--- /dev/null
@@ -0,0 +1,461 @@
+/*
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * 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.Collections.Generic;
+
+namespace ElmSharp
+{
+    /// <summary>
+    /// The axis along which flip effect should be applied.
+    /// </summary>
+    public enum FlipAxis
+    {
+        /// <summary>
+        /// Flip on X axis
+        /// </summary>
+        X,
+
+        /// <summary>
+        /// Flip on Y axis
+        /// </summary>
+        Y,
+    }
+
+    /// <summary>
+    /// The direction in which the wipe effect should occur.
+    /// </summary>
+    public enum WipeDirection
+    {
+        /// <summary>
+        /// Wipe to the left
+        /// </summary>
+        Left,
+
+        /// <summary>
+        /// Wipe to the right
+        /// </summary>
+        Right,
+
+        /// <summary>
+        /// Wipe to the up
+        /// </summary>
+        Up,
+
+        /// <summary>
+        /// Wipe to the down
+        /// </summary>
+        Down,
+    }
+
+    /// <summary>
+    /// Whether the wipe effect should show or hide the object.
+    /// </summary>
+    public enum WipeType
+    {
+        /// <summary>
+        /// Hide the object during the animation
+        /// </summary>
+        Hide,
+
+        /// <summary>
+        /// Show the object during the animation
+        /// </summary>
+        Show,
+    }
+
+    /// <summary>
+    /// The type of acceleration used in the transition.
+    /// </summary>
+    public enum TweenMode
+    {
+        /// <summary>
+        /// Constant speed
+        /// </summary>
+        Linear,
+
+        /// <summary>
+        /// Starts slow, increase speed over time, then decrease again and stop slowly, v1 being a power factor
+        /// </summary>
+        Sinusoidal,
+
+        /// <summary>
+        /// Starts fast and decrease speed over time, v1 being a power factor
+        /// </summary>
+        Decelerate,
+
+        /// <summary>
+        /// Starts slow and increase speed over time, v1 being a power factor
+        /// </summary>
+        Accelerate,
+
+        /// <summary>
+        /// Start at gradient v1, interpolated via power of v2 curve
+        /// </summary>
+        DivisorInterpolate,
+
+        /// <summary>
+        /// Start at 0.0 then "drop" like a ball bouncing to the ground at 1.0, and bounce v2 times, with decay factor of v1
+        /// </summary>
+        Bounce,
+
+        /// <summary>
+        /// Start at 0.0 then "wobble" like a spring rest position 1.0, and wobble v2 times, with decay factor of v1
+        /// </summary>
+        Spring,
+
+        /// <summary>
+        /// Follow the cubic-bezier curve calculated with the control points (x1, y1), (x2, y2)
+        /// </summary>
+        BezierCurve,
+    }
+
+    /// <summary>
+    /// Blend effect class.
+    /// </summary>
+    public class BlendEffect : EffectBase
+    {
+        /// <summary>
+        /// Creates and initializes a new instance of BlendEffect class.
+        /// </summary>
+        public BlendEffect()
+        {
+        }
+
+        internal override IntPtr CreateEffect(IntPtr transit)
+        {
+            return Interop.Elementary.elm_transit_effect_blend_add(transit);
+        }
+    }
+
+    /// <summary>
+    /// Color effect class.
+    /// </summary>
+    public class ColorEffect : EffectBase
+    {
+        Color _begin;
+        Color _end;
+
+        /// <summary>
+        /// Creates and initializes a new instance of ColorEffect class.
+        /// </summary>
+        /// <param name="beginColor">The begin color of the effect</param>
+        /// <param name="endColor">The end color of the effect</param>
+        public ColorEffect(Color beginColor, Color endColor)
+        {
+            _begin = beginColor;
+            _end = endColor;
+        }
+
+        /// <summary>
+        /// The begin color of the effect
+        /// </summary>
+        public Color BeginColor
+        {
+            get { return _begin; }
+        }
+
+        /// <summary>
+        /// The end color of the effect
+        /// </summary>
+        public Color EndColor
+        {
+            get { return _end; }
+        }
+
+        internal override IntPtr CreateEffect(IntPtr transit)
+        {
+            return Interop.Elementary.elm_transit_effect_color_add(transit, _begin.R, _begin.G, _begin.B, _begin.A, _end.R, _end.G, _end.B, _end.A);
+        }
+    }
+
+    /// <summary>
+    /// Fade effect class.
+    /// </summary>
+    public class FadeEffect : EffectBase
+    {
+        /// <summary>
+        /// Creates and initializes a new instance of FadeEffect class.
+        /// </summary>
+        public FadeEffect()
+        {
+        }
+
+        internal override IntPtr CreateEffect(IntPtr transit)
+        {
+            return Interop.Elementary.elm_transit_effect_fade_add(transit);
+        }
+    }
+
+    /// <summary>
+    /// Flip effect class.
+    /// </summary>
+    public class FlipEffect : EffectBase
+    {
+        FlipAxis _axis;
+        bool _clockWise;
+        bool _resizable;
+
+        /// <summary>
+        /// Creates and initializes a new instance of FlipEffect class.
+        /// </summary>
+        /// <param name="axis">Flipping Axis(X or Y).</param>
+        /// <param name="clockWise">Flipping Direction. True is clock-wise.</param>
+        /// <param name="resizable">Resizable effect with FlipEffect</param>
+        public FlipEffect(FlipAxis axis, bool clockWise, bool resizable = false)
+        {
+            _axis = axis;
+            _clockWise = clockWise;
+            _resizable = resizable;
+        }
+
+        /// <summary>
+        /// Flipping Axis(X or Y).
+        /// </summary>
+        public FlipAxis Axis
+        {
+            get { return _axis; }
+        }
+
+        /// <summary>
+        /// Flipping Direction. True is clock-wise.
+        /// </summary>
+        public bool ClockWise
+        {
+            get { return _clockWise; }
+        }
+
+        /// <summary>
+        /// Resizable FlipEffect.
+        /// </summary>
+        public bool Resizable
+        {
+            get { return _resizable; }
+        }
+
+        internal override IntPtr CreateEffect(IntPtr transit)
+        {
+            if (_resizable)
+                return Interop.Elementary.elm_transit_effect_resizable_flip_add(transit, (int)_axis, _clockWise);
+            return Interop.Elementary.elm_transit_effect_flip_add(transit, (int)_axis, _clockWise);
+        }
+    }
+
+    /// <summary>
+    /// Resizing effect class.
+    /// </summary>
+    public class ResizingEffect : EffectBase
+    {
+        Size _begin;
+        Size _end;
+
+        /// <summary>
+        /// Creates and initializes a new instance of FlipEffect class.
+        /// </summary>
+        /// <param name="beginSize">The begin Size of the effect</param>
+        /// <param name="endSize">The end Size of the effect</param>
+        public ResizingEffect(Size beginSize, Size endSize)
+        {
+            _begin = beginSize;
+            _end = endSize;
+        }
+
+        /// <summary>
+        /// The begin Size of the effect
+        /// </summary>
+        public Size BeginSize
+        {
+            get { return _begin; }
+        }
+
+        /// <summary>
+        /// The end Size of the effect
+        /// </summary>
+        public Size EndSize
+        {
+            get { return _end; }
+        }
+
+        internal override IntPtr CreateEffect(IntPtr transit)
+        {
+            return Interop.Elementary.elm_transit_effect_resizing_add(transit, _begin.Width, _begin.Height, _end.Width, _end.Height);
+        }
+    }
+
+    /// <summary>
+    /// Rotation effect class.
+    /// </summary>
+    public class RotationEffect : EffectBase
+    {
+        float _begin;
+        float _end;
+
+        /// <summary>
+        /// Creates and initializes a new instance of RotationEffect class.
+        /// </summary>
+        /// <param name="beginDegree">The begin degree of the effect</param>
+        /// <param name="endDegree">The end degree of the effect</param>
+        public RotationEffect(float beginDegree, float endDegree)
+        {
+            _begin = beginDegree;
+            _end = endDegree;
+        }
+
+        /// <summary>
+        /// The begin degree of the effect
+        /// </summary>
+        public float BeginDegree
+        {
+            get { return _begin; }
+        }
+
+        /// <summary>
+        /// The end degree of the effect
+        /// </summary>
+        public float EndDegree
+        {
+            get { return _end; }
+        }
+
+        internal override IntPtr CreateEffect(IntPtr transit)
+        {
+            return Interop.Elementary.elm_transit_effect_rotation_add(transit, _begin, _end);
+        }
+    }
+
+    /// <summary>
+    /// Translation effect class.
+    /// </summary>
+    public class TranslationEffect : EffectBase
+    {
+        Point _begin;
+        Point _end;
+
+        /// <summary>
+        /// Creates and initializes a new instance of FlipEffect class.
+        /// </summary>
+        /// <param name="beginPoint">The begin Point of the effect</param>
+        /// <param name="endPoint">The end Point of the effect</param>
+        public TranslationEffect(Point beginPoint, Point endPoint)
+        {
+            _begin = beginPoint;
+            _end = endPoint;
+        }
+
+        /// <summary>
+        /// The begin Point of the effect
+        /// </summary>
+        public Point BeginPoint
+        {
+            get { return _begin; }
+        }
+
+        /// <summary>
+        /// The end Point of the effect
+        /// </summary>
+        public Point EndPoint
+        {
+            get { return _end; }
+        }
+
+        internal override IntPtr CreateEffect(IntPtr transit)
+        {
+            return Interop.Elementary.elm_transit_effect_translation_add(transit, _begin.X, _begin.Y, _end.X, _end.Y);
+        }
+    }
+
+    /// <summary>
+    /// Wipe effect class.
+    /// </summary>
+    public class WipeEffect : EffectBase
+    {
+        WipeType _type;
+        WipeDirection _direction;
+
+        /// <summary>
+        /// Creates and initializes a new instance of WipeEffect class.
+        /// </summary>
+        /// <param name="type">Wipe type. Hide or show.</param>
+        /// <param name="direction">Wipe Direction.</param>
+        public WipeEffect(WipeType type, WipeDirection direction)
+        {
+            _type = type;
+            _direction = direction;
+        }
+
+        /// <summary>
+        /// Wipe type. Hide or show.
+        /// </summary>
+        public WipeType Type
+        {
+            get { return _type; }
+        }
+
+        /// <summary>
+        /// Wipe Direction.
+        /// </summary>
+        public WipeDirection Direction
+        {
+            get { return _direction; }
+        }
+
+        internal override IntPtr CreateEffect(IntPtr transit)
+        {
+            return Interop.Elementary.elm_transit_effect_wipe_add(transit, (int)_type, (int)_direction);
+        }
+    }
+
+    /// <summary>
+    /// Zoom effect class.
+    /// </summary>
+    public class ZoomEffect : EffectBase
+    {
+        float _begin;
+        float _end;
+
+        /// <summary>
+        /// Creates and initializes a new instance of ZoomEffect class.
+        /// </summary>
+        /// <param name="beginRate">The begin rate of the effect</param>
+        /// <param name="endRate">The end rate of the effect</param>
+        public ZoomEffect(float beginRate, float endRate)
+        {
+            _begin = beginRate;
+            _end = endRate;
+        }
+
+        /// <summary>
+        /// The begin rate of the effect
+        /// </summary>
+        public float BeginRate
+        {
+            get { return _begin; }
+        }
+
+        /// <summary>
+        /// The end rate of the effect
+        /// </summary>
+        public float EndRate
+        {
+            get { return _end; }
+        }
+
+        internal override IntPtr CreateEffect(IntPtr transit)
+        {
+            return Interop.Elementary.elm_transit_effect_zoom_add(transit, _begin, _end);
+        }
+    }
+}
\ No newline at end of file
old mode 100644 (file)
new mode 100755 (executable)
index 31b0e5b..3e94c09
@@ -45,6 +45,7 @@
     <Compile Include="TC\BackgroundTest1.cs" />
     <Compile Include="TC\BackgroundTest2.cs" />
     <Compile Include="TC\BackgroundTest3.cs" />
+    <Compile Include="TC\TransitTest.cs" />
     <Compile Include="TC\EcoreTimerTest1.cs" />
     <Compile Include="TC\EntryTest3.cs" />
     <Compile Include="TC\EvasMapTest2.cs" />
diff --git a/test/ElmSharp.Test/TC/TransitTest.cs b/test/ElmSharp.Test/TC/TransitTest.cs
new file mode 100755 (executable)
index 0000000..6bab1e2
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * 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 ElmSharp;
+
+namespace ElmSharp.Test
+{
+    class TransitTest : TestCaseBase
+    {
+        public override string TestName => "TransitTest";
+        public override string TestDescription => "To test basic operation of Transit";
+
+        Transit CreateTransit()
+        {
+            Transit transit = new Transit();
+            transit.Deleted += (s, e) => { Console.WriteLine("Transit Deleted"); };
+            transit.Repeat = 1;
+            transit.AutoReverse = true;
+            transit.Duration = 1;
+            return transit;
+        }
+
+        public override void Run(Window window)
+        {
+            Button button1 = new Button(window) {
+                Text = "Effect",
+            };
+            button1.Move(0, 0);
+            button1.Resize(270, 200);
+            button1.Show();
+
+            Button button2 = new Button(window)
+            {
+                Text = "Chain Effect",
+            };
+            button2.Move(270, 200);
+            button2.Resize(270, 200);
+            button2.Show();
+
+            Point begin = new Point();
+            begin.X = begin.Y = 0;
+            Point end = new Point();
+            end.X = end.Y = 200;
+            TranslationEffect translation = new TranslationEffect(begin, end);
+            translation.EffectEnded += (s, e) => { Console.WriteLine("Translation Effect Ended"); };
+
+            RotationEffect rotation = new RotationEffect(0, 180);
+            rotation.EffectEnded += (s, e) => { Console.WriteLine("Rotation Effect Ended"); };
+
+            button1.Clicked += (s, e) => {
+                Transit transit1 = CreateTransit();
+                transit1.Objects.Add(button1);
+                transit1.Objects.Add(button2);
+                transit1.AddEffect(translation);
+                transit1.AddEffect(rotation);
+                transit1.Go();
+            };
+
+            button2.Clicked += (s, e) => {
+                Transit transit1 = CreateTransit();
+                transit1.Objects.Add(button1);
+                transit1.AddEffect(translation);
+                transit1.AddEffect(rotation);
+
+                Transit transit2 = CreateTransit();
+                transit2.Objects.Add(button2);
+                transit2.AddEffect(translation);
+                transit2.AddEffect(rotation);
+
+                transit1.Chains.Add(transit2);
+                transit1.Go();
+            };
+        }
+    }
+}
\ No newline at end of file