2 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 #include <dali/public-api/object/type-registry.h>
22 #include <dali-toolkit/internal/controls/scrollable/scrollable-impl.h>
23 #include <dali-toolkit/internal/controls/scroll-component/scroll-bar-internal-impl.h>
30 } // unnamed namespace
38 const Property::Index Scrollable::PROPERTY_OVERSHOOT_EFFECT_COLOR( Toolkit::Internal::Control::CONTROL_PROPERTY_END_INDEX + 1 );
39 const Property::Index Scrollable::PROPERTY_OVERSHOOT_ANIMATION_SPEED( Toolkit::Internal::Control::CONTROL_PROPERTY_END_INDEX + 2 );
46 const Vector4 DEFAULT_OVERSHOOT_COLOUR(0.0f, 0.64f, 0.85f, 0.25f);
47 const float DEFAULT_OVERSHOOT_ANIMATION_SPEED(120.0f); // 120 pixels per second
51 // empty handle as we cannot create Scrollable (but type registered for scroll signal)
55 TypeRegistration mType( typeid(Toolkit::Scrollable), typeid(Toolkit::Control), Create );
57 SignalConnectorType s1(mType, Toolkit::Scrollable::SIGNAL_SCROLL_STARTED, &Scrollable::DoConnectSignal);
58 SignalConnectorType s2(mType, Toolkit::Scrollable::SIGNAL_SCROLL_COMPLETED, &Scrollable::DoConnectSignal);
59 SignalConnectorType s3(mType, Toolkit::Scrollable::SIGNAL_SCROLL_UPDATED, &Scrollable::DoConnectSignal);
60 SignalConnectorType s4(mType, Toolkit::Scrollable::SIGNAL_SCROLL_CLAMPED, &Scrollable::DoConnectSignal);
62 PropertyRegistration property1( mType,
63 "overshoot-effect-color",
64 Toolkit::Scrollable::PROPERTY_OVERSHOOT_EFFECT_COLOR,
66 &Scrollable::SetProperty,
67 &Scrollable::GetProperty );
69 PropertyRegistration property2( mType,
70 "overshoot-animation-speed",
71 Toolkit::Scrollable::PROPERTY_OVERSHOOT_ANIMATION_SPEED,
73 &Scrollable::SetProperty,
74 &Scrollable::GetProperty );
78 const std::string Scrollable::SCROLLABLE_CAN_SCROLL_VERTICAL( "scrollable-can-scroll-vertical" );
79 const std::string Scrollable::SCROLLABLE_CAN_SCROLL_HORIZONTAL( "scrollable-can-scroll-horizontal" );
81 ///////////////////////////////////////////////////////////////////////////////////////////////////
83 ///////////////////////////////////////////////////////////////////////////////////////////////////
85 // Scrollable controls are not layout containers so they dont need size negotiation..
86 // we dont want size negotiation while scrolling if we can avoid it
87 Scrollable::Scrollable()
88 : Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS | REQUIRES_STYLE_CHANGE_SIGNALS | NO_SIZE_NEGOTIATION ) ),
89 mOvershootEffectColor( DEFAULT_OVERSHOOT_COLOUR ),
90 mOvershootAnimationSpeed ( DEFAULT_OVERSHOOT_ANIMATION_SPEED ),
91 mPropertyRelativePosition(Property::INVALID_INDEX),
92 mPropertyPositionMin(Property::INVALID_INDEX),
93 mPropertyPositionMax(Property::INVALID_INDEX),
94 mPropertyScrollDirection(Property::INVALID_INDEX),
95 mPropertyCanScrollVertical(Property::INVALID_INDEX),
96 mPropertyCanScrollHorizontal(Property::INVALID_INDEX),
97 mOvershootEnabled(false)
101 Scrollable::~Scrollable()
103 // Clear scroll components, forces their destruction before Scrollable is destroyed.
107 void Scrollable::RegisterCommonProperties()
111 // Register properties.
112 mPropertyRelativePosition = self.RegisterProperty(Toolkit::Scrollable::SCROLL_RELATIVE_POSITION_PROPERTY_NAME, Vector3::ZERO);
113 mPropertyPositionMin = self.RegisterProperty(Toolkit::Scrollable::SCROLL_POSITION_MIN_PROPERTY_NAME, Vector3::ZERO);
114 mPropertyPositionMax = self.RegisterProperty(Toolkit::Scrollable::SCROLL_POSITION_MAX_PROPERTY_NAME, Vector3::ZERO);
115 mPropertyScrollDirection = self.RegisterProperty(Toolkit::Scrollable::SCROLL_DIRECTION_PROPERTY_NAME, Vector3::ZERO);
116 mPropertyCanScrollVertical = self.RegisterProperty(SCROLLABLE_CAN_SCROLL_VERTICAL, true);
117 mPropertyCanScrollHorizontal = self.RegisterProperty(SCROLLABLE_CAN_SCROLL_HORIZONTAL, true);
120 bool Scrollable::IsScrollComponentEnabled(Toolkit::Scrollable::ScrollComponentType type) const
122 if(type == Toolkit::Scrollable::OvershootIndicator)
124 return mOvershootEnabled;
126 return (mComponents.find(type) != mComponents.end());
129 void Scrollable::EnableScrollComponent(Toolkit::Scrollable::ScrollComponentType type)
131 if(type == Toolkit::Scrollable::OvershootIndicator)
133 if( !mOvershootEnabled )
135 SetOvershootEnabled(true);
136 mOvershootEnabled = true;
140 if( mComponents.find(type) == mComponents.end() )
142 // Create ScrollComponent
143 Toolkit::Scrollable scrollable = Toolkit::Scrollable::DownCast(Self());
144 Toolkit::ScrollComponent scrollComponent = NewScrollComponent(scrollable, type);
145 Toolkit::ScrollComponentImpl& component = static_cast<Toolkit::ScrollComponentImpl&>(scrollComponent.GetImplementation());
146 ScrollComponentPtr componentPtr(&component);
148 mComponents[type] = componentPtr;
152 void Scrollable::DisableScrollComponent(Toolkit::Scrollable::ScrollComponentType type)
154 if(type == Toolkit::Scrollable::OvershootIndicator)
156 if( mOvershootEnabled )
158 SetOvershootEnabled(false);
159 mOvershootEnabled = false;
163 ComponentIter pair = mComponents.find( type );
165 if( mComponents.end() != pair )
167 ScrollComponentPtr component = pair->second;
169 // Disconnect the scroll component first.
170 component->OnDisconnect();
172 // Destroy ScrollComponent.
173 mComponents.erase( type );
177 Vector4 Scrollable::GetOvershootEffectColor() const
179 return mOvershootEffectColor;
182 void Scrollable::SetOvershootAnimationSpeed( float pixelsPerSecond )
184 mOvershootAnimationSpeed = pixelsPerSecond;
187 float Scrollable::GetOvershootAnimationSpeed() const
189 return mOvershootAnimationSpeed;
192 Toolkit::Scrollable::ScrollStartedSignalType& Scrollable::ScrollStartedSignal()
194 return mScrollStartedSignal;
197 Toolkit::Scrollable::ScrollUpdatedSignalType& Scrollable::ScrollUpdatedSignal()
199 return mScrollUpdatedSignal;
202 Toolkit::Scrollable::ScrollCompletedSignalType& Scrollable::ScrollCompletedSignal()
204 return mScrollCompletedSignal;
207 Toolkit::Scrollable::ScrollClampedSignalType& Scrollable::ScrollClampedSignal()
209 return mScrollClampedSignal;
212 bool Scrollable::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
214 Dali::BaseHandle handle( object );
216 bool connected( true );
217 Toolkit::Scrollable scrollable = Toolkit::Scrollable::DownCast( handle );
219 if( Toolkit::Scrollable::SIGNAL_SCROLL_STARTED == signalName )
221 scrollable.ScrollStartedSignal().Connect( tracker, functor );
223 else if( Toolkit::Scrollable::SIGNAL_SCROLL_UPDATED == signalName )
225 scrollable.ScrollUpdatedSignal().Connect( tracker, functor );
227 else if( Toolkit::Scrollable::SIGNAL_SCROLL_COMPLETED == signalName )
229 scrollable.ScrollCompletedSignal().Connect( tracker, functor );
231 else if( Toolkit::Scrollable::SIGNAL_SCROLL_CLAMPED == signalName )
233 scrollable.ScrollClampedSignal().Connect( tracker, functor );
237 // signalName does not match any signal
244 void Scrollable::SetProperty( BaseObject* object, Property::Index index, const Property::Value& value )
246 Toolkit::Scrollable scrollable = Toolkit::Scrollable::DownCast( Dali::BaseHandle( object ) );
250 Scrollable& scrollableImpl( GetImpl( scrollable ) );
253 case Toolkit::Scrollable::PROPERTY_OVERSHOOT_EFFECT_COLOR:
255 scrollableImpl.SetOvershootEffectColor( value.Get<Vector4>() );
258 case Toolkit::Scrollable::PROPERTY_OVERSHOOT_ANIMATION_SPEED:
260 scrollableImpl.SetOvershootAnimationSpeed( value.Get<float>() );
267 Property::Value Scrollable::GetProperty( BaseObject* object, Property::Index index )
269 Property::Value value;
271 Toolkit::Scrollable scrollable = Toolkit::Scrollable::DownCast( Dali::BaseHandle( object ) );
275 Scrollable& scrollableImpl( GetImpl( scrollable ) );
278 case Toolkit::Scrollable::PROPERTY_OVERSHOOT_EFFECT_COLOR:
280 value = scrollableImpl.GetOvershootEffectColor();
283 case Toolkit::Scrollable::PROPERTY_OVERSHOOT_ANIMATION_SPEED:
285 value = scrollableImpl.GetOvershootAnimationSpeed();
294 Toolkit::ScrollComponent Scrollable::NewScrollComponent(Toolkit::Scrollable& scrollable, Toolkit::Scrollable::ScrollComponentType type)
296 Toolkit::ScrollComponent instance;
300 case Toolkit::Scrollable::VerticalScrollBar:
302 instance = static_cast<Toolkit::ScrollComponent>(Toolkit::ScrollBarInternal::New(scrollable, true));
305 case Toolkit::Scrollable::HorizontalScrollBar:
307 instance = static_cast<Toolkit::ScrollComponent>(Toolkit::ScrollBarInternal::New(scrollable, false));
310 case Toolkit::Scrollable::OvershootIndicator:
312 DALI_ASSERT_ALWAYS(!"Unrecognized component type");
320 } // namespace Internal
322 } // namespace Toolkit