[NUI] Fixed Svace issues
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI.Wearable / src / public / WearableList.cs
1 /* Copyright (c) 2020 Samsung Electronics Co., Ltd.
2  *
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
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
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.
14  *
15  */
16 using System;
17 using Tizen.NUI.BaseComponents;
18 using Tizen.NUI.Components;
19 using System.ComponentModel;
20
21 namespace Tizen.NUI.Wearable
22 {
23     /// <summary>
24     /// [Draft] This class provides a list view styled by wearable ux.
25     /// List will lay out all items with Fish-Eye layout manager.
26     /// </summary>
27     /// This may be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
28     [EditorBrowsable(EditorBrowsableState.Never)]
29     public class WearableList : RecyclerView
30     {
31         private RecycleItem FocusedItem = null;
32
33         /// <summary>
34         /// Default constructor.
35         /// </summary>
36         /// <since_tizen> 8 </since_tizen>
37         /// This may be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API
38         [EditorBrowsable(EditorBrowsableState.Never)]
39         public WearableList() : base(new RecycleAdapter(), new FishEyeLayoutManager())
40         {
41             ScrollingDirection = ScrollableBase.Direction.Vertical;
42
43             ScrollDragStarted += OnScrollDragStarted;
44             ScrollAnimationEnded += OnAnimationEnded;
45
46             ContentContainer.PositionUsesPivotPoint = true;
47             ContentContainer.ParentOrigin = Tizen.NUI.ParentOrigin.Center;
48             ContentContainer.PivotPoint = Tizen.NUI.PivotPoint.TopCenter;
49             NoticeAnimationEndBeforePosition = 50;
50
51             ScrollAvailableArea = new Vector2(0, ContentContainer.SizeHeight);
52
53             SetFocus(0, false);
54
55             Scrollbar = new CircularScrollbar();
56             DecelerationThreshold = 60.0f;
57             DecelerationRate = 0.991f;
58         }
59
60         protected override void SetScrollbar()
61         {
62             if(LayoutManager != null)
63             {
64                 Scrollbar.Initialize(ContentContainer.Size.Height, LayoutManager.StepSize, ContentContainer.CurrentPosition.Y, false);
65             }
66         }
67
68         public new RecycleAdapter Adapter
69         {
70             get
71             {
72                 return base.Adapter;
73             }
74
75             set
76             {
77                 base.Adapter = value;
78
79                 foreach (View child in Children)
80                 {
81                     child.PositionUsesPivotPoint = true;
82                     child.ParentOrigin = Tizen.NUI.ParentOrigin.TopCenter;
83                 }
84
85                 ScrollAvailableArea = new Vector2( 0, ContentContainer.SizeHeight );
86             }
87         }
88
89         /// <summary>
90         /// Set focus to item which has specific data index.
91         /// </summary>
92         /// <param name="dataIndex">Data index of item.</param>
93         /// <param name="animated">If set true, scroll to item using animation.</param>
94         /// <since_tizen> 8 </since_tizen>
95         /// This may be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API
96         public void SetFocus(int dataIndex, bool animated)
97         {
98             if (LayoutManager == null)
99             {
100                 return;
101             }
102
103             foreach (RecycleItem item in Children)
104             {
105                 if (item.DataIndex == dataIndex)
106                 {
107                     RecycleItem prevFocusedItem = FocusedItem;
108                     prevFocusedItem?.OnFocusLost();
109                     FocusedItem = item;
110                     FocusedItem.OnFocusGained();
111
112                     ScrollTo(item.DataIndex * LayoutManager.StepSize, animated);
113                 }
114             }
115         }
116
117         private void OnAnimationEnded(object source, ScrollEventArgs args)
118         {
119         }
120
121         /// <summary>
122         /// This helps developer who wants to know before scroll is reaching target position.
123         /// </summary>
124         /// <param name="targetPosition">Index of item.</param>
125         /// <since_tizen> 8 </since_tizen>
126         /// This may be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API
127         protected override void OnPreReachedTargetPosition(float targetPosition)
128         {
129             if (LayoutManager == null)
130             {
131                 return;
132             }
133             int targetDataIndex = (int)Math.Round(Math.Abs(targetPosition) / LayoutManager.StepSize);
134
135             for (int i = 0; i < Children.Count; i++)
136             {
137                 RecycleItem item = Children[i] as RecycleItem;
138                 if (item == null)
139                 {
140                     continue;
141                 }
142
143                 if (targetDataIndex == item.DataIndex)
144                 {
145                     FocusedItem = item;
146                     item.OnFocusGained();
147                     break;
148                 }
149             }
150         }
151
152         private void OnScrollDragStarted(object source, ScrollEventArgs args)
153         {
154             RecycleItem prevFocusedItem = FocusedItem;
155             prevFocusedItem?.OnFocusLost();
156         }
157     }
158 }