[NUI] View Transition with page switching
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / public / Animation / TransitionOptions.cs
1 /*
2  * Copyright (c) 2021 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 using System;
18 using System.ComponentModel;
19 using Tizen.Applications;
20 using Tizen.NUI.BaseComponents;
21
22 namespace Tizen.NUI
23 {
24     /// <summary>
25     /// This TransitionOptions class is a class to control Transition motion.
26     /// This class includes multiple options for the Transition.
27     /// NUI supports a kind of Transitions such as App transition, Page transition, and so on.
28     /// Some of options could be used only for the App transition or Page transition, but others could be used for multiple purpose.
29     /// </summary>
30     /// <seealso cref="NUIApplication.TransitionOptions" />
31     [EditorBrowsable(EditorBrowsableState.Never)]
32     public class TransitionOptions : IDisposable
33     {
34         private bool disposed = false;
35         private FrameProvider frameProvider;
36         private DefaultFrameBroker frameBroker;
37         private bool enableTransition = false;
38         private Window mainWindow;
39         private View animatedTarget;
40
41         /// <summary>
42         /// Initializes the TransitionOptions class.
43         /// </summary>
44         /// <param name="window">The window instance of NUI Window</param>
45         [EditorBrowsable(EditorBrowsableState.Never)]
46         public TransitionOptions(Window window)
47         {
48             mainWindow = window;
49         }
50
51         /// <summary>
52         /// Initializes the TransitionOptions class.
53         /// </summary>
54         [EditorBrowsable(EditorBrowsableState.Never)]
55         public TransitionOptions()
56         {
57         }
58
59         /// <summary>
60         /// Set animated view of seamless animation.
61         /// </summary>
62         [EditorBrowsable(EditorBrowsableState.Never)]
63         public View AnimatedTarget
64         {
65             get
66             {
67                 return animatedTarget;
68             }
69             set
70             {
71                 animatedTarget = value;
72             }
73         }
74
75         /// <summary>
76         /// Gets or sets transition enable
77         /// </summary>
78         [EditorBrowsable(EditorBrowsableState.Never)]
79         public bool EnableTransition
80         {
81             get
82             {
83                 return enableTransition;
84             }
85
86             set
87             {
88                 if (value)
89                 {
90                     frameBroker = new DefaultFrameBroker(mainWindow);
91                     frameBroker.mainView = animatedTarget;
92                     frameBroker.AnimationInitialized += FrameBroker_TransitionAnimationInitialized;
93                     frameBroker.AnimationFinished += FrameBroker_TransitionAnimationFinished;
94                     EnableProvider();
95                 }
96                 enableTransition = value;
97             }
98         }
99
100         private void EnableProvider()
101         {
102             frameProvider = new FrameProvider(mainWindow);
103             frameProvider.Shown += FrameProvider_Shown;
104             frameProvider.Hidden += FrameProvider_Hidden;
105         }
106
107         /// <summary>
108         /// During the Page transition, if two Views each of on the old top Page
109         /// and new top Page have same TransitionTag, the View on the old top Page
110         /// will be transition to the one of new top Page.
111         /// </summary>
112         [EditorBrowsable(EditorBrowsableState.Never)]
113         public string TransitionTag { set; get; } = null;
114
115         /// <summary>
116         /// A View could be transition with its child Views or without them.
117         /// Default value is false
118         /// </summary>
119         [EditorBrowsable(EditorBrowsableState.Never)]
120         public bool TransitionWithChild { set; get; } = false;
121
122         /// <summary>
123         /// Gets or sets the forward animation of launching
124         /// </summary>
125         [EditorBrowsable(EditorBrowsableState.Never)]
126         public TransitionAnimation ForwardAnimation
127         {
128             get
129             {
130                 return frameBroker?.ForwardAnimation;
131             }
132             set
133             {
134                 if (frameBroker != null)
135                 {
136                     frameBroker.ForwardAnimation = value;
137                 }
138             }
139         }
140
141         /// <summary>
142         /// Gets or sets the backward animation of launching
143         /// </summary>
144         [EditorBrowsable(EditorBrowsableState.Never)]
145         public TransitionAnimation BackwardAnimation
146
147         {
148             get
149             {
150                 return frameBroker?.BackwardAnimation;
151             }
152             set
153             {
154                 if (frameBroker != null)
155                 {
156                     frameBroker.BackwardAnimation = value;
157                 }
158             }
159         }
160
161         /// <summary>
162         /// Emits the event when the animation is started.
163         /// </summary>
164         [EditorBrowsable(EditorBrowsableState.Never)]
165         public delegate void AnimationEventHandler(bool direction);
166
167         /// <summary>
168         /// Emits the event when the animation is started.
169         /// </summary>
170         [EditorBrowsable(EditorBrowsableState.Never)]
171         public event AnimationEventHandler AnimationInitialized;
172
173         /// <summary>
174         /// Emits the event when the animation is finished.
175         /// </summary>
176         [EditorBrowsable(EditorBrowsableState.Never)]
177         public event AnimationEventHandler AnimationFinished;
178
179         private void FrameBroker_TransitionAnimationFinished(bool direction)
180         {
181             AnimationFinished?.Invoke(direction);
182         }
183
184         private void FrameBroker_TransitionAnimationInitialized(bool direction)
185         {
186             AnimationInitialized?.Invoke(direction);
187         }
188
189         /// <summary>
190         /// Occurs whenever the window is shown on caller application.
191         /// </summary>
192         [EditorBrowsable(EditorBrowsableState.Never)]
193         public event EventHandler CallerScreenShown;
194
195         /// <summary>
196         /// Occurs whenever the window is hidden on caller application.
197         /// </summary>
198         [EditorBrowsable(EditorBrowsableState.Never)]
199         public event EventHandler CallerScreenHidden;
200
201         private void FrameProvider_Shown(object sender, EventArgs e)
202         {
203             Bundle bundle = new Bundle();
204             //Set information of shared object
205             frameProvider?.NotifyShowStatus(bundle);
206
207             CallerScreenShown?.Invoke(this, e);
208             bundle.Dispose();
209             bundle = null;
210         }
211
212         private void FrameProvider_Hidden(object sender, EventArgs e)
213         {
214             Bundle bundle = new Bundle();
215             //Set information of shared object
216             frameProvider?.NotifyHideStatus(bundle);
217
218             CallerScreenHidden?.Invoke(this, e);
219             bundle.Dispose();
220             bundle = null;
221         }
222
223         internal void SendLaunchRequest(AppControl appControl)
224         {
225             this.frameBroker.SendLaunchRequest(appControl, true);
226         }
227
228         /// <summary>
229         /// Hidden API (Inhouse API).
230         /// Dispose.
231         /// </summary>
232         /// <param name="disposing"></param>
233         [EditorBrowsable(EditorBrowsableState.Never)]
234         protected virtual void Dispose(bool disposing)
235         {
236             if (!disposed)
237             {
238                 if (frameBroker != null)
239                 {
240                     frameBroker.Dispose();
241                 }
242
243                 if (frameProvider != null)
244                 {
245                     frameProvider.Dispose();
246                 }
247                 disposed = true;
248             }
249         }
250
251         /// <summary>
252         /// Dispose for IDisposable pattern
253         /// </summary>
254         [EditorBrowsable(EditorBrowsableState.Never)]
255         public void Dispose()
256         {
257             Dispose(true);
258             System.GC.SuppressFinalize(this);
259         }
260     }
261 }