1 // Copyright (c) 2017 Samsung Electronics Co., Ltd.
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
7 // http://www.apache.org/licenses/LICENSE-2.0
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
16 namespace Tizen.NUI.BaseComponents
19 using System.Runtime.InteropServices;
20 using System.Collections.Generic;
24 /// A visual view control for user add any visual to it.
29 /// VisualView _visualView = new VisualView();
30 /// ImageVisualMap imageVisualMap1 = new ImageVisualMap();
31 /// imageVisualMap1.URL = "./NUISample/res/images/image-1.jpg";
32 /// imageVisualMap1.VisualSize = new Vector2( 300.0f, 300.0f );
33 /// imageVisualMap1.Offset = new Vector2( 50.0f, 50.0f );
34 /// imageVisualMap1.OffsetSizeMode = new Vector4( 1.0f, 1.0f, 1.0f, 1.0f );
35 /// imageVisualMap1.Origin = AlignType.TOP_BEGIN;
36 /// imageVisualMap1.AnchorPoint = AlignType.TOP_BEGIN;
37 /// _visualView.AddVisual("imageVisual1", imageVisualMap1);
40 public class VisualView : CustomView
42 //private LinkedList<VisualBase> _visualList = null;
43 private Dictionary<int, VisualBase> _visualDictionary = null;
44 private Dictionary<int, PropertyMap> _tranformDictionary = null;
45 private PropertyArray _animateArray = null;
47 static CustomView CreateInstance()
49 return new VisualView();
52 // static constructor registers the control type (for user can add kinds of visuals to it)
55 // ViewRegistry registers control type with DALi type registery
56 // also uses introspection to find any properties that need to be registered with type registry
57 CustomViewRegistry.Instance.Register(CreateInstance, typeof(VisualView));
60 public VisualView() : base(typeof(VisualView).Name, CustomViewBehaviour.ViewBehaviourDefault)
65 /// Override the parent method.
67 public override void OnInitialize()
70 _visualDictionary = new Dictionary<int, VisualBase>();
71 _tranformDictionary = new Dictionary<int, PropertyMap>();
72 _animateArray = new PropertyArray();
76 /// Add or update a visual to visual view.
78 /// <param name="visualName"> The name of visual to add. If add a existed visual name, the visual will be replaced. </param>
79 /// <param name="visualMap"> The property map of visual to create. </param>
80 public void AddVisual(string visualName, VisualMap visualMap)
82 VisualBase visual = null;
85 /* If the visual had added, then replace it using RegisterVusal. */
87 foreach (var item in _visualDictionary)
89 if (item.Value.Name == visualName)
91 /* Find a existed visual, its key also exited. */
92 visualIndex = item.Key;
93 UnregisterVisual(visualIndex);
94 _visualDictionary.Remove(visualIndex);
95 _tranformDictionary.Remove(visualIndex);
100 if (visualIndex == -1) // The visual is a new one, create index for it. */
102 visualIndex = RegisterProperty(visualName, new PropertyValue(visualName), PropertyAccessMode.ReadWrite);
107 visual = VisualFactory.Instance.CreateVisual(visualMap.OutputVisualMap); // Create a visual for the new one.
108 visual.Name = visualName;
109 visual.DepthIndex = visualMap.DepthIndex;
111 RegisterVisual(visualIndex, visual);
113 _visualDictionary.Add(visualIndex, visual);
114 _tranformDictionary.Add(visualIndex, visualMap.OutputTransformMap);
116 visualMap.VisualIndex = visualIndex;
117 visualMap.Name = visualName;
118 visualMap.Parent = this;
125 /// Remove a visual by name.
127 /// <param name="visualName"> The name of visual to remove. </param>
128 public void RemoveVisual(string visualName)
130 foreach (var item in _visualDictionary)
132 if (item.Value.Name == visualName)
134 EnableVisual(item.Key, false);
135 UnregisterVisual(item.Key);
136 _tranformDictionary.Remove(item.Key);
137 _visualDictionary.Remove(item.Key);
146 /// Get the total number of Visuals which are added by users
148 public int NumberOfVisuals
152 return _visualDictionary.Count;
157 /// Remove all visuals of visual view.
159 public void RemoveAll()
161 foreach (var item in _visualDictionary)
163 EnableVisual(item.Key, false);
164 UnregisterVisual(item.Key);
166 _visualDictionary.Clear();
167 _tranformDictionary.Clear();
172 /// Override method of OnRelayout() for CustomView class.<br>
173 /// Called after the size negotiation has been finished for this control.<br>
174 /// The control is expected to assign this given size to itself/its children.<br>
175 /// Should be overridden by derived classes if they need to layout actors differently after certain operations like add or remove actors, resize or after changing specific properties.<br>
177 /// <remarks>As this function is called from inside the size negotiation algorithm, you cannot call RequestRelayout (the call would just be ignored)</remarks>
178 /// <param name="size">The allocated size</param>
179 /// <param name="container">The control should add actors to this container that it is not able to allocate a size for.</param>
180 public override void OnRelayout(Vector2 size, RelayoutContainer container)
182 foreach (var item in _visualDictionary)
184 item.Value.SetTransformAndSize(_tranformDictionary[item.Key], size);
185 EnableVisual(item.Key, true);
189 internal void UpdateVisual(int visualIndex, string visualName, VisualMap visualMap)
191 VisualBase visual = null;
193 visual = VisualFactory.Instance.CreateVisual(visualMap.OutputVisualMap);
194 visual.Name = visualName;
195 visual.DepthIndex = visualMap.DepthIndex;
197 RegisterVisual(visualIndex, visual);
199 _visualDictionary[visualIndex] = visual;
200 _tranformDictionary[visualIndex] = visualMap.OutputTransformMap;
203 NUILog.Debug("UpdateVisual() name=" + visualName);
207 /// Create visual animation (transition) with the input parameters.
209 /// <param name="target"> The visual map to animation.</param>
210 /// <param name="property"> The property of visual to animation.</param>
211 /// <param name="destinationValue"> The destination value of property after animation.</param>
212 /// <param name="startTime"> The start time of visual animation.</param>
213 /// <param name="endTime"> The end time of visual animation.</param>
214 /// <param name="alphaFunction"> The alpha function of visual animation</param>
215 /// <param name="initialValue"> The initial property value of visual animation </param>
216 /// <returns>Animation instance</returns>
217 public Animation AnimateVisual(VisualMap target, string property, object destinationValue, int startTime, int endTime, AlphaFunction.BuiltinFunctions? alphaFunction = null, object initialValue = null)
219 string _alphaFunction = null;
220 if (alphaFunction != null)
222 switch (alphaFunction)
224 case Tizen.NUI.AlphaFunction.BuiltinFunctions.Linear:
226 _alphaFunction = "LINEAR";
229 case Tizen.NUI.AlphaFunction.BuiltinFunctions.Reverse:
231 _alphaFunction = "REVERSE";
234 case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseInSquare:
236 _alphaFunction = "EASE_IN_SQUARE";
239 case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseOutSquare:
241 _alphaFunction = "EASE_OUT_SQUARE";
244 case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseIn:
246 _alphaFunction = "EASE_IN";
249 case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseOut:
251 _alphaFunction = "EASE_OUT";
254 case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseInOut:
256 _alphaFunction = "EASE_IN_OUT";
259 case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseInSine:
261 _alphaFunction = "EASE_IN_SINE";
264 case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseOutSine:
266 _alphaFunction = "EASE_OUT_SINE";
269 case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseInOutSine:
271 _alphaFunction = "EASE_IN_OUT_SINE";
274 case Tizen.NUI.AlphaFunction.BuiltinFunctions.Bounce:
276 _alphaFunction = "BOUNCE";
279 case Tizen.NUI.AlphaFunction.BuiltinFunctions.Sin:
281 _alphaFunction = "SIN";
284 case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseOutBack:
286 _alphaFunction = "EASE_OUT_BACK";
291 _alphaFunction = "DEFAULT";
297 foreach (var item in _visualDictionary.ToList())
299 if (item.Value.Name == target.Name)
301 PropertyMap _animator = new PropertyMap();
302 if ( _alphaFunction != null) {_animator.Add("alphaFunction", new PropertyValue(_alphaFunction));}
304 PropertyMap _timePeriod = new PropertyMap();
305 _timePeriod.Add("duration", new PropertyValue((endTime - startTime) / 1000.0f));
306 _timePeriod.Add("delay", new PropertyValue(startTime / 1000.0f));
307 _animator.Add("timePeriod", new PropertyValue(_timePeriod));
309 string _str1 = property.Substring(0, 1);
310 string _str2 = property.Substring(1);
311 string _str = _str1.ToLower() + _str2;
312 if (_str == "position") {_str = "offset";}
314 PropertyValue destVal = PropertyValue.CreateFromObject(destinationValue);
316 PropertyMap _transition = new PropertyMap();
317 _transition.Add("target", new PropertyValue(target.Name));
318 _transition.Add("property", new PropertyValue(_str));
319 if (initialValue != null)
321 PropertyValue initVal = PropertyValue.CreateFromObject(initialValue);
322 _transition.Add("initialValue", new PropertyValue(initVal));
324 _transition.Add("targetValue", destVal);
325 _transition.Add("animator", new PropertyValue(_animator));
327 TransitionData _transitionData = new TransitionData(_transition);
328 return this.CreateTransition(_transitionData);
335 /// Add group visual animation (transition) map with the input parameters.
337 /// <param name="target"> The visual map to animation.</param>
338 /// <param name="property"> The property of visual to animation.</param>
339 /// <param name="destinationValue"> The destination value of property after animation.</param>
340 /// <param name="startTime"> The start time of visual animation.</param>
341 /// <param name="endTime"> The end time of visual animation.</param>
342 /// <param name="alphaFunction"> The alpha function of visual animation</param>
343 /// <param name="initialValue"> The initial property value of visual animation </param>
344 public void AnimateVisualAdd(VisualMap target, string property, object destinationValue, int startTime, int endTime, AlphaFunction.BuiltinFunctions? alphaFunction = null, object initialValue = null)
346 string _alphaFunction = null;
347 if (alphaFunction != null)
349 switch (alphaFunction)
351 case Tizen.NUI.AlphaFunction.BuiltinFunctions.Linear:
353 _alphaFunction = "LINEAR";
356 case Tizen.NUI.AlphaFunction.BuiltinFunctions.Reverse:
358 _alphaFunction = "REVERSE";
361 case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseInSquare:
363 _alphaFunction = "EASE_IN_SQUARE";
366 case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseOutSquare:
368 _alphaFunction = "EASE_OUT_SQUARE";
371 case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseIn:
373 _alphaFunction = "EASE_IN";
376 case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseOut:
378 _alphaFunction = "EASE_OUT";
381 case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseInOut:
383 _alphaFunction = "EASE_IN_OUT";
386 case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseInSine:
388 _alphaFunction = "EASE_IN_SINE";
391 case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseOutSine:
393 _alphaFunction = "EASE_OUT_SINE";
396 case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseInOutSine:
398 _alphaFunction = "EASE_IN_OUT_SINE";
401 case Tizen.NUI.AlphaFunction.BuiltinFunctions.Bounce:
403 _alphaFunction = "BOUNCE";
406 case Tizen.NUI.AlphaFunction.BuiltinFunctions.Sin:
408 _alphaFunction = "SIN";
411 case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseOutBack:
413 _alphaFunction = "EASE_OUT_BACK";
418 _alphaFunction = "DEFAULT";
424 foreach (var item in _visualDictionary.ToList())
426 if (item.Value.Name == target.Name)
428 PropertyMap _animator = new PropertyMap();
429 if ( _alphaFunction != null) {_animator.Add("alphaFunction", new PropertyValue(_alphaFunction));}
431 PropertyMap _timePeriod = new PropertyMap();
432 _timePeriod.Add("duration", new PropertyValue((endTime - startTime) / 1000.0f));
433 _timePeriod.Add("delay", new PropertyValue(startTime / 1000.0f));
434 _animator.Add("timePeriod", new PropertyValue(_timePeriod));
436 string _str1 = property.Substring(0, 1);
437 string _str2 = property.Substring(1);
438 string _str = _str1.ToLower() + _str2;
439 if (_str == "position") {_str = "offset";}
441 PropertyValue destVal = PropertyValue.CreateFromObject(destinationValue);
443 PropertyMap _transition = new PropertyMap();
444 _transition.Add("target", new PropertyValue(target.Name));
445 _transition.Add("property", new PropertyValue(_str));
446 if (initialValue != null)
448 PropertyValue initVal = PropertyValue.CreateFromObject(initialValue);
449 _transition.Add("initialValue", new PropertyValue(initVal));
451 _transition.Add("targetValue", destVal);
452 _transition.Add("animator", new PropertyValue(_animator));
454 _animateArray.Add(new PropertyValue(_transition));
460 /// Finish to add Visual animation (transition) map and create transition animation.
462 /// <returns>Animation instance</returns>
463 public Animation AnimateVisualAddFinish()
465 if ( _animateArray == null || _animateArray.Empty())
467 Tizen.Log.Fatal("NUI", "animate visual property array is empty!");
470 TransitionData _transitionData = new TransitionData(_animateArray);
472 return this.CreateTransition(_transitionData);
476 //temporary fix to pass TCT
477 public Animation VisualAnimate(Tizen.NUI.VisualAnimator visualMap)
479 foreach (var item in _visualDictionary.ToList())
481 if (item.Value.Name == visualMap.Target)
483 TransitionData _transitionData = new TransitionData(visualMap.OutputVisualMap);
484 return this.CreateTransition(_transitionData);
489 //temporary fix to pass TCT