Add 'ExclusiveArch: armv7l' limit build to arm architecture
[platform/core/uifw/dali-toolkit.git] / base / dali-toolkit / internal / controls / scrollable / scroll-view / scroll-base-impl.cpp
1 //
2 // Copyright (c) 2014 Samsung Electronics Co., Ltd.
3 //
4 // Licensed under the Flora License, Version 1.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://floralicense.org/license/
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 #include <dali-toolkit/internal/controls/scrollable/scroll-view/scroll-base-impl.h>
18
19 using namespace Dali;
20
21 namespace Dali
22 {
23
24 namespace Toolkit
25 {
26
27 namespace Internal
28 {
29
30 ///////////////////////////////////////////////////////////////////////////////////////////////////
31 // ScrollBase
32 ///////////////////////////////////////////////////////////////////////////////////////////////////
33
34 const std::string ScrollBase::SCROLL_DOMAIN_OFFSET_PROPERTY_NAME( "domain-offset" );
35
36 ScrollBase::ScrollBase()
37 : Scrollable(),
38   mParent(NULL),
39   mPropertyTime(Property::INVALID_INDEX),
40   mPropertyX(Property::INVALID_INDEX),
41   mPropertyY(Property::INVALID_INDEX),
42   mPropertyPrePosition(Property::INVALID_INDEX),
43   mPropertyPosition(Property::INVALID_INDEX),
44   mPropertyScale(Property::INVALID_INDEX),
45   mPropertyOvershootX(Property::INVALID_INDEX),
46   mPropertyOvershootY(Property::INVALID_INDEX),
47   mPropertyWrap(Property::INVALID_INDEX),
48   mPropertyPanning(Property::INVALID_INDEX),
49   mPropertyScrolling(Property::INVALID_INDEX),
50   mPropertyFinal(Property::INVALID_INDEX),
51   mPropertyDomainOffset(Property::INVALID_INDEX),
52   mPropertyPositionDelta(Property::INVALID_INDEX),
53   mPropertyScrollStartPagePosition(Property::INVALID_INDEX),
54   mDelay(0.0f)
55 {
56 }
57
58 void ScrollBase::SetParent(ScrollBase *parent)
59 {
60   mParent = parent;
61 }
62
63 void ScrollBase::RegisterProperties()
64 {
65   Actor self = Self();
66
67   // Register common properties
68   RegisterCommonProperties();
69
70   // Register Scroll Properties.
71   mPropertyTime = self.RegisterProperty(Toolkit::ScrollView::SCROLL_TIME_PROPERTY_NAME, 0.0f);
72   mPropertyPrePosition = self.RegisterProperty(Toolkit::ScrollView::SCROLL_PRE_POSITION_PROPERTY_NAME, Vector3::ZERO);
73   mPropertyPosition = self.RegisterProperty(Toolkit::ScrollView::SCROLL_POSITION_PROPERTY_NAME, Vector3::ZERO);
74   mPropertyOvershootX = self.RegisterProperty(Toolkit::ScrollView::SCROLL_OVERSHOOT_X_PROPERTY_NAME, 0.0f);
75   mPropertyOvershootY = self.RegisterProperty(Toolkit::ScrollView::SCROLL_OVERSHOOT_Y_PROPERTY_NAME, 0.0f);
76   mPropertyFinal = self.RegisterProperty(Toolkit::ScrollView::SCROLL_FINAL_PROPERTY_NAME, Vector3::ZERO);
77   mPropertyX = self.RegisterProperty(Toolkit::ScrollView::SCROLL_X_PROPERTY_NAME, 0.0f);
78   mPropertyY = self.RegisterProperty(Toolkit::ScrollView::SCROLL_Y_PROPERTY_NAME, 0.0f);
79   mPropertyScale = self.RegisterProperty(Toolkit::ScrollView::SCROLL_SCALE_PROPERTY_NAME, Vector3::ONE);
80   mPropertyWrap = self.RegisterProperty(Toolkit::ScrollView::SCROLL_WRAP_PROPERTY_NAME, false);
81   mPropertyPanning = self.RegisterProperty(Toolkit::ScrollView::SCROLL_PANNING_PROPERTY_NAME, false);
82   mPropertyScrolling = self.RegisterProperty(Toolkit::ScrollView::SCROLL_SCROLLING_PROPERTY_NAME, false);
83   mPropertyDomainOffset = self.RegisterProperty(SCROLL_DOMAIN_OFFSET_PROPERTY_NAME, Vector3::ZERO);
84   mPropertyPositionDelta = self.RegisterProperty(Toolkit::ScrollView::SCROLL_POSITION_DELTA_PROPERTY_NAME, Vector3::ZERO);
85   mPropertyScrollStartPagePosition = self.RegisterProperty(Toolkit::ScrollView::SCROLL_START_PAGE_POSITION_PROPERTY_NAME, Vector3::ZERO);
86 }
87
88 void ScrollBase::BindActor(Actor child)
89 {
90   FindAndUnbindActor(child);
91
92   ActorInfoPtr actorInfo(new ActorInfo(child));
93   mBoundActors.push_back(actorInfo);
94
95   // Apply all our constraints to this new child.
96   ConstraintStack::iterator i;
97
98   for(i = mConstraintStack.begin();i!=mConstraintStack.end();i++)
99   {
100     actorInfo->ApplyConstraint(*i);
101   }
102 }
103
104 void ScrollBase::UnbindActor(Actor child)
105 {
106   // Find the child in mBoundActors, and unparent it
107   for (ActorInfoIter iter = mBoundActors.begin(); iter != mBoundActors.end(); ++iter)
108   {
109     ActorInfoPtr actorInfo = *iter;
110
111     if( actorInfo->mActor == child )
112     {
113       mBoundActors.erase(iter);
114       break;
115     }
116   }
117 }
118
119 void ScrollBase::FindAndUnbindActor(Actor child)
120 {
121   // Since we don't know if and where child may have been bound
122   // (as we cannot store such information inside the Actor), we
123   // perform a search on all associated ScrollBases
124   // This is done by recursively calling the parent of this ScrollBase
125   // until reaching the top (at which point implementation may be
126   // different as this is virtual)
127
128   if(mParent) // continuously ascend until reaches root ScrollBase.
129   {
130     mParent->FindAndUnbindActor(child);
131   }
132 }
133
134 void ScrollBase::ApplyConstraintToBoundActors(Constraint constraint)
135 {
136   mConstraintStack.push_back(constraint);
137
138   for(ActorInfoIter i = mBoundActors.begin();i != mBoundActors.end(); ++i)
139   {
140     (*i)->ApplyConstraint(constraint);
141   }
142 }
143
144 void ScrollBase::RemoveConstraintsFromBoundActors()
145 {
146   mConstraintStack.clear();
147
148   for(ActorInfoIter i = mBoundActors.begin();i != mBoundActors.end(); ++i)
149   {
150     (*i)->RemoveConstraints();
151   }
152 }
153
154 } // namespace Internal
155
156 } // namespace Toolkit
157
158 } // namespace Dali