// Copyright (c) 2017 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.
//
namespace Tizen.NUI.BaseComponents
{
using System;
using System.Text;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.Linq;
///
/// A visual view control if a user adds any visual to it.
///
///
/// Example:
///
/// VisualView _visualView = new VisualView();
/// ImageVisualMap imageVisualMap1 = new ImageVisualMap();
/// imageVisualMap1.URL = "./NUISample/res/images/image-1.jpg";
/// imageVisualMap1.VisualSize = new Vector2( 300.0f, 300.0f );
/// imageVisualMap1.Offset = new Vector2( 50.0f, 50.0f );
/// imageVisualMap1.OffsetSizeMode = new Vector4( 1.0f, 1.0f, 1.0f, 1.0f );
/// imageVisualMap1.Origin = AlignType.TOP_BEGIN;
/// imageVisualMap1.AnchorPoint = AlignType.TOP_BEGIN;
/// _visualView.AddVisual("imageVisual1", imageVisualMap1);
///
///
public class VisualView : CustomView
{
//private LinkedList _visualList = null;
private Dictionary _visualDictionary = null;
private Dictionary _tranformDictionary = null;
private PropertyArray _animateArray = null;
static CustomView CreateInstance()
{
return new VisualView();
}
// static constructor registers the control type (for user can add kinds of visuals to it)
static VisualView()
{
// ViewRegistry registers control type with DALi type registery
// also uses introspection to find any properties that need to be registered with type registry
CustomViewRegistry.Instance.Register(CreateInstance, typeof(VisualView));
}
///
/// Constructor.
///
/// 3
public VisualView() : base(typeof(VisualView).FullName, CustomViewBehaviour.ViewBehaviourDefault)
{
}
///
/// Overrides the parent method.
///
/// 3
public override void OnInitialize()
{
//Initialize empty
_visualDictionary = new Dictionary();
_tranformDictionary = new Dictionary();
_animateArray = new PropertyArray();
}
///
/// Adds or updates a visual to visual view.
///
/// The name of a visual to add. If a name is added to an existing visual name, the visual will be replaced.
/// The property map of a visual to create.
/// 3
public void AddVisual(string visualName, VisualMap visualMap)
{
VisualBase visual = null;
int visualIndex = -1;
/* If the visual had added, then replace it using RegisterVusal. */
//visual.Name = name;
foreach (var item in _visualDictionary)
{
if (item.Value.Name == visualName)
{
/* Find a existed visual, its key also exited. */
visualIndex = item.Key;
UnregisterVisual(visualIndex);
_visualDictionary.Remove(visualIndex);
_tranformDictionary.Remove(visualIndex);
break;
}
}
if (visualIndex == -1) // The visual is a new one, create index for it. */
{
visualIndex = RegisterProperty(visualName, new PropertyValue(visualName), PropertyAccessMode.ReadWrite);
}
if (visualIndex > 0)
{
visual = VisualFactory.Instance.CreateVisual(visualMap.OutputVisualMap); // Create a visual for the new one.
visual.Name = visualName;
visual.DepthIndex = visualMap.DepthIndex;
RegisterVisual(visualIndex, visual);
_visualDictionary.Add(visualIndex, visual);
_tranformDictionary.Add(visualIndex, visualMap.OutputTransformMap);
visualMap.VisualIndex = visualIndex;
visualMap.Name = visualName;
visualMap.Parent = this;
RelayoutRequest();
}
}
///
/// Removes a visual by name.
///
/// The name of a visual to remove.
/// 3
public void RemoveVisual(string visualName)
{
foreach (var item in _visualDictionary)
{
if (item.Value.Name == visualName)
{
EnableVisual(item.Key, false);
UnregisterVisual(item.Key);
_tranformDictionary.Remove(item.Key);
_visualDictionary.Remove(item.Key);
RelayoutRequest();
break;
}
}
}
///
/// Gets the total number of visuals which are added by users.
///
/// 3
public int NumberOfVisuals
{
get
{
return _visualDictionary.Count;
}
}
///
/// Removes all visuals of the visual view.
///
/// 3
public void RemoveAll()
{
foreach (var item in _visualDictionary)
{
EnableVisual(item.Key, false);
UnregisterVisual(item.Key);
}
_visualDictionary.Clear();
_tranformDictionary.Clear();
RelayoutRequest();
}
///
/// Overrides the method of OnRelayout() for CustomView class.
/// Called after the size negotiation has been finished for this control.
/// The control is expected to assign this given size to itself or its children.
/// 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.
///
/// As this function is called from inside the size negotiation algorithm, you cannot call RequestRelayout (the call would just be ignored).
/// The allocated size.
/// The control should add actors to this container that it is not able to allocate a size for.
/// 3
public override void OnRelayout(Vector2 size, RelayoutContainer container)
{
foreach (var item in _visualDictionary)
{
item.Value.SetTransformAndSize(_tranformDictionary[item.Key], size);
EnableVisual(item.Key, true);
}
}
internal void UpdateVisual(int visualIndex, string visualName, VisualMap visualMap)
{
VisualBase visual = null;
visual = VisualFactory.Instance.CreateVisual(visualMap.OutputVisualMap);
visual.Name = visualName;
visual.DepthIndex = visualMap.DepthIndex;
RegisterVisual(visualIndex, visual);
_visualDictionary[visualIndex] = visual;
_tranformDictionary[visualIndex] = visualMap.OutputTransformMap;
RelayoutRequest();
NUILog.Debug("UpdateVisual() name=" + visualName);
}
///
/// Creates a visual animation (transition) with the input parameters.
///
/// The visual map to animation.
/// The property of visual to animation.
/// The destination value of property after animation.
/// The start time of visual animation.
/// The end time of visual animation.
/// The alpha function of visual animation.
/// The initial property value of visual animation.
/// Animation instance
/// 3
public Animation AnimateVisual(VisualMap target, string property, object destinationValue, int startTime, int endTime, AlphaFunction.BuiltinFunctions? alphaFunction = null, object initialValue = null)
{
string _alphaFunction = null;
if (alphaFunction != null)
{
switch (alphaFunction)
{
case Tizen.NUI.AlphaFunction.BuiltinFunctions.Linear:
{
_alphaFunction = "LINEAR";
break;
}
case Tizen.NUI.AlphaFunction.BuiltinFunctions.Reverse:
{
_alphaFunction = "REVERSE";
break;
}
case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseInSquare:
{
_alphaFunction = "EASE_IN_SQUARE";
break;
}
case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseOutSquare:
{
_alphaFunction = "EASE_OUT_SQUARE";
break;
}
case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseIn:
{
_alphaFunction = "EASE_IN";
break;
}
case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseOut:
{
_alphaFunction = "EASE_OUT";
break;
}
case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseInOut:
{
_alphaFunction = "EASE_IN_OUT";
break;
}
case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseInSine:
{
_alphaFunction = "EASE_IN_SINE";
break;
}
case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseOutSine:
{
_alphaFunction = "EASE_OUT_SINE";
break;
}
case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseInOutSine:
{
_alphaFunction = "EASE_IN_OUT_SINE";
break;
}
case Tizen.NUI.AlphaFunction.BuiltinFunctions.Bounce:
{
_alphaFunction = "BOUNCE";
break;
}
case Tizen.NUI.AlphaFunction.BuiltinFunctions.Sin:
{
_alphaFunction = "SIN";
break;
}
case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseOutBack:
{
_alphaFunction = "EASE_OUT_BACK";
break;
}
default:
{
_alphaFunction = "DEFAULT";
break;
}
}
}
foreach (var item in _visualDictionary.ToList())
{
if (item.Value.Name == target.Name)
{
PropertyMap _animator = new PropertyMap();
if ( _alphaFunction != null) {_animator.Add("alphaFunction", new PropertyValue(_alphaFunction));}
PropertyMap _timePeriod = new PropertyMap();
_timePeriod.Add("duration", new PropertyValue((endTime - startTime) / 1000.0f));
_timePeriod.Add("delay", new PropertyValue(startTime / 1000.0f));
_animator.Add("timePeriod", new PropertyValue(_timePeriod));
StringBuilder sb = new StringBuilder(property);
sb[0] = (char)(sb[0] | 0x20);
string _str = sb.ToString();
if (_str == "position") {_str = "offset";}
PropertyValue destVal = PropertyValue.CreateFromObject(destinationValue);
PropertyMap _transition = new PropertyMap();
_transition.Add("target", new PropertyValue(target.Name));
_transition.Add("property", new PropertyValue(_str));
if (initialValue != null)
{
PropertyValue initVal = PropertyValue.CreateFromObject(initialValue);
_transition.Add("initialValue", new PropertyValue(initVal));
}
_transition.Add("targetValue", destVal);
_transition.Add("animator", new PropertyValue(_animator));
TransitionData _transitionData = new TransitionData(_transition);
return this.CreateTransition(_transitionData);
}
}
return null;
}
///
/// Adds a group visual animation (transition) map with the input parameters.
///
/// The visual map to animation.
/// The property of visual to animation.
/// The destination value of property after animation.
/// The start time of visual animation.
/// The end time of visual animation.
/// The alpha function of visual animation.
/// The initial property value of visual animation.
/// 3
public void AnimateVisualAdd(VisualMap target, string property, object destinationValue, int startTime, int endTime, AlphaFunction.BuiltinFunctions? alphaFunction = null, object initialValue = null)
{
string _alphaFunction = null;
if (alphaFunction != null)
{
switch (alphaFunction)
{
case Tizen.NUI.AlphaFunction.BuiltinFunctions.Linear:
{
_alphaFunction = "LINEAR";
break;
}
case Tizen.NUI.AlphaFunction.BuiltinFunctions.Reverse:
{
_alphaFunction = "REVERSE";
break;
}
case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseInSquare:
{
_alphaFunction = "EASE_IN_SQUARE";
break;
}
case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseOutSquare:
{
_alphaFunction = "EASE_OUT_SQUARE";
break;
}
case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseIn:
{
_alphaFunction = "EASE_IN";
break;
}
case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseOut:
{
_alphaFunction = "EASE_OUT";
break;
}
case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseInOut:
{
_alphaFunction = "EASE_IN_OUT";
break;
}
case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseInSine:
{
_alphaFunction = "EASE_IN_SINE";
break;
}
case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseOutSine:
{
_alphaFunction = "EASE_OUT_SINE";
break;
}
case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseInOutSine:
{
_alphaFunction = "EASE_IN_OUT_SINE";
break;
}
case Tizen.NUI.AlphaFunction.BuiltinFunctions.Bounce:
{
_alphaFunction = "BOUNCE";
break;
}
case Tizen.NUI.AlphaFunction.BuiltinFunctions.Sin:
{
_alphaFunction = "SIN";
break;
}
case Tizen.NUI.AlphaFunction.BuiltinFunctions.EaseOutBack:
{
_alphaFunction = "EASE_OUT_BACK";
break;
}
default:
{
_alphaFunction = "DEFAULT";
break;
}
}
}
foreach (var item in _visualDictionary.ToList())
{
if (item.Value.Name == target.Name)
{
PropertyMap _animator = new PropertyMap();
if ( _alphaFunction != null) {_animator.Add("alphaFunction", new PropertyValue(_alphaFunction));}
PropertyMap _timePeriod = new PropertyMap();
_timePeriod.Add("duration", new PropertyValue((endTime - startTime) / 1000.0f));
_timePeriod.Add("delay", new PropertyValue(startTime / 1000.0f));
_animator.Add("timePeriod", new PropertyValue(_timePeriod));
StringBuilder sb = new StringBuilder(property);
sb[0] = (char)(sb[0] | 0x20);
string _str = sb.ToString();
if (_str == "position") {_str = "offset";}
PropertyValue destVal = PropertyValue.CreateFromObject(destinationValue);
PropertyMap _transition = new PropertyMap();
_transition.Add("target", new PropertyValue(target.Name));
_transition.Add("property", new PropertyValue(_str));
if (initialValue != null)
{
PropertyValue initVal = PropertyValue.CreateFromObject(initialValue);
_transition.Add("initialValue", new PropertyValue(initVal));
}
_transition.Add("targetValue", destVal);
_transition.Add("animator", new PropertyValue(_animator));
_animateArray.Add(new PropertyValue(_transition));
}
}
}
///
/// Finishes to add a visual animation (transition) map and creates a transition animation.
///
/// Animation instance.
/// 3
public Animation AnimateVisualAddFinish()
{
if ( _animateArray == null || _animateArray.Empty())
{
Tizen.Log.Fatal("NUI", "animate visual property array is empty!");
return null;
}
TransitionData _transitionData = new TransitionData(_animateArray);
return this.CreateTransition(_transitionData);
}
///
/// temporary fix to pass TCT.
///
/// 3
public Animation VisualAnimate(Tizen.NUI.VisualAnimator visualMap)
{
foreach (var item in _visualDictionary.ToList())
{
if (item.Value.Name == visualMap.Target)
{
TransitionData _transitionData = new TransitionData(visualMap.OutputVisualMap);
return this.CreateTransition(_transitionData);
}
}
return null;
}
//temporary fix to pass TCT
}
}