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