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.
19 using System.Runtime.InteropServices;
20 using System.Collections.Generic;
24 /// A visual view control for user add any visual to it.
26 /// VisualView _visualView = new VisualView();
27 /// ImageVisualMap imageVisualMap1 = new ImageVisualMap();
28 /// imageVisualMap1.URL = "./NUISample/res/images/image-1.jpg";
29 /// imageVisualMap1.VisualSize = new Vector2( 300.0f, 300.0f );
30 /// imageVisualMap1.Offset = new Vector2( 50.0f, 50.0f );
31 /// imageVisualMap1.OffsetSizeMode = new Vector4( 1.0f, 1.0f, 1.0f, 1.0f );
32 /// imageVisualMap1.Origin = AlignType.TOP_BEGIN;
33 /// imageVisualMap1.AnchorPoint = AlignType.TOP_BEGIN;
34 /// _visualView.AddVisual("imageVisual1", imageVisualMap1);
36 public class VisualView : CustomView
38 //private LinkedList<VisualBase> _visualList = null;
39 private Dictionary<int, VisualBase> _visualDictionary = null;
40 private Dictionary<int, PropertyMap> _tranformDictionary = null;
42 static CustomView CreateInstance()
44 return new VisualView();
47 // static constructor registers the control type (for user can add kinds of visuals to it)
50 // ViewRegistry registers control type with DALi type registery
51 // also uses introspection to find any properties that need to be registered with type registry
52 ViewRegistry.Instance.Register(CreateInstance, typeof(VisualView));
55 public VisualView() : base(typeof(VisualView).Name, CustomViewBehaviour.ViewBehaviourDefault)
60 /// Override the parent method.
62 public override void OnInitialize()
65 _visualDictionary = new Dictionary<int, VisualBase>();
66 _tranformDictionary = new Dictionary<int, PropertyMap>();
70 /// Add or update a visual to visual view.
72 /// <param name="visualName"> The name of visual to add. If add a existed visual name, the visual will be replaced. </param>
73 /// <param name="visualMap"> The property map of visual to create. </param>
74 public void AddVisual(string visualName, VisualMap visualMap)
76 VisualBase visual = null;
79 /* If the visual had added, then replace it using RegisterVusal. */
81 foreach (var item in _visualDictionary)
83 if (item.Value.Name == visualName)
85 /* Find a existed visual, its key also exited. */
86 visualIndex = item.Key;
87 UnregisterVisual(visualIndex);
88 _visualDictionary.Remove(visualIndex);
89 _tranformDictionary.Remove(visualIndex);
94 if (visualIndex == -1) // The visual is a new one, create index for it. */
96 visualIndex = RegisterProperty(visualName, new PropertyValue(visualName), PropertyAccessMode.ReadWrite);
101 visual = VisualFactory.Get().CreateVisual(visualMap.OutputVisualMap); // Create a visual for the new one.
102 visual.Name = visualName;
103 visual.DepthIndex = visualMap.DepthIndex;
105 RegisterVisual(visualIndex, visual);
107 _visualDictionary.Add(visualIndex, visual);
108 _tranformDictionary.Add(visualIndex, visualMap.OutputTransformMap);
115 /// Remove a visual by name.
117 /// <param name="visualName"> The name of visual to remove. </param>
118 public void RemoveVisual(string visualName)
120 foreach (var item in _visualDictionary.ToList())
122 if (item.Value.Name == visualName)
124 EnableVisual(item.Key, false);
125 UnregisterVisual(item.Key);
126 _visualDictionary.Remove(item.Key);
132 /// Get the total number of Visuals which are added by users
134 public int NumberOfVisuals
138 return _visualDictionary.Count;
144 /// Remove all visuals of visual view.
146 public void RemoveAll()
148 _visualDictionary.Clear();
152 /// Override method of OnRelayout() for CustomView class.
153 /// Called after the size negotiation has been finished for this control.
154 /// The control is expected to assign this given size to itself/its children.
155 /// 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.
156 /// Note! As this function is called from inside the size negotiation algorithm, you cannot call RequestRelayout (the call would just be ignored)
158 /// <param name="size">The allocated size</param>
159 /// <param name="container">The control should add actors to this container that it is not able to allocate a size for.</param>
160 public override void OnRelayout(Vector2 size, RelayoutContainer container)
162 foreach (var item in _visualDictionary)
164 item.Value.SetTransformAndSize(_tranformDictionary[item.Key], size);
165 EnableVisual(item.Key, true);