X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Fpublic-api%2Fcontrols%2Fcontrol-impl.cpp;h=684e695f51776ba20e7f05013a85d1978378ffba;hp=b66cdd6fe716b8d18e883635e7ae088c08995557;hb=2d49df397bf377d412321ff978bd90186d55ba6b;hpb=6de1ee72f32ce241e32d653b427348cf553cf006 diff --git a/dali-toolkit/public-api/controls/control-impl.cpp b/dali-toolkit/public-api/controls/control-impl.cpp index b66cdd6..684e695 100644 --- a/dali-toolkit/public-api/controls/control-impl.cpp +++ b/dali-toolkit/public-api/controls/control-impl.cpp @@ -19,47 +19,49 @@ #include // EXTERNAL INCLUDES +#include +#include +#include +#include +#include #include // for strcmp #include #include #include -#include -#include -#include -#include -#include +#include +#include +#include // INTERNAL INCLUDES -#include -#include -#include -#include -#include -#include #include #include #include -#include #include +#include +#include #include #include #include +#include +#include +#include +#include +#include +#include #include +#include +#include namespace Dali { - namespace Toolkit { - namespace Internal { - namespace { - #if defined(DEBUG_ENABLED) -Debug::Filter* gLogFilter = Debug::Filter::New( Debug::NoLogging, false, "LOG_CONTROL_VISUALS"); +Debug::Filter* gLogFilter = Debug::Filter::New(Debug::NoLogging, false, "LOG_CONTROL_VISUALS"); #endif /** @@ -67,19 +69,19 @@ Debug::Filter* gLogFilter = Debug::Filter::New( Debug::NoLogging, false, "LOG_CO * @param[in] controlImpl The control implementation * @param[in] renderIfTransaparent Whether we should render if the color is transparent */ -void ChangeBackgroundColorVisual( Control& controlImpl, bool renderIfTransparent ) +void ChangeBackgroundColorVisual(Control& controlImpl, bool renderIfTransparent) { - Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get( controlImpl ); + Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(controlImpl); - Toolkit::Visual::Base backgroundVisual = controlDataImpl.GetVisual( Toolkit::Control::Property::BACKGROUND ); - if( backgroundVisual && backgroundVisual.GetType() == Toolkit::Visual::COLOR ) + Toolkit::Visual::Base backgroundVisual = controlDataImpl.GetVisual(Toolkit::Control::Property::BACKGROUND); + if(backgroundVisual && backgroundVisual.GetType() == Toolkit::Visual::COLOR) { Property::Map map; - backgroundVisual.CreatePropertyMap( map ); + backgroundVisual.CreatePropertyMap(map); // Only change it if it's a color visual - map[ Toolkit::DevelColorVisual::Property::RENDER_IF_TRANSPARENT ] = renderIfTransparent; - controlImpl.SetBackground( map ); + map[Toolkit::DevelColorVisual::Property::RENDER_IF_TRANSPARENT] = renderIfTransparent; + controlImpl.SetBackground(map); } } @@ -88,29 +90,29 @@ void ChangeBackgroundColorVisual( Control& controlImpl, bool renderIfTransparent * (EG. If no renders exist and clipping is enabled). * @param[in] controlImpl The control implementation. */ -void CreateClippingRenderer( Control& controlImpl ) +void CreateClippingRenderer(Control& controlImpl) { // We want to add a transparent background if we do not have one for clipping. - Actor self( controlImpl.Self() ); - int clippingMode = ClippingMode::DISABLED; - if( self.GetProperty( Actor::Property::CLIPPING_MODE ).Get( clippingMode ) ) + Actor self(controlImpl.Self()); + int clippingMode = ClippingMode::DISABLED; + if(self.GetProperty(Actor::Property::CLIPPING_MODE).Get(clippingMode)) { - switch( clippingMode ) + switch(clippingMode) { case ClippingMode::CLIP_CHILDREN: { - if( self.GetRendererCount() == 0u ) + if(self.GetRendererCount() == 0u) { - Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get( controlImpl ); - if( controlDataImpl.mVisuals.Empty() ) + Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(controlImpl); + if(controlDataImpl.mVisuals.Empty()) { - controlImpl.SetBackgroundColor( Color::TRANSPARENT ); + controlImpl.SetBackgroundColor(Color::TRANSPARENT); } else { // We have visuals, check if we've set the background and re-create it to // render even if transparent (only if it's a color visual) - ChangeBackgroundColorVisual( controlImpl, true ); + ChangeBackgroundColorVisual(controlImpl, true); } } break; @@ -120,7 +122,7 @@ void CreateClippingRenderer( Control& controlImpl ) case ClippingMode::CLIP_TO_BOUNDING_BOX: { // If we have a background visual, check if it's a color visual and remove the render if transparent flag - ChangeBackgroundColorVisual( controlImpl, false ); + ChangeBackgroundColorVisual(controlImpl, false); break; } } @@ -129,14 +131,13 @@ void CreateClippingRenderer( Control& controlImpl ) } // unnamed namespace - Toolkit::Control Control::New() { // Create the implementation, temporarily owned on stack - IntrusivePtr controlImpl = new Control( ControlBehaviour( CONTROL_BEHAVIOUR_DEFAULT ) ); + IntrusivePtr controlImpl = new Control(ControlBehaviour(CONTROL_BEHAVIOUR_DEFAULT)); // Pass ownership to handle - Toolkit::Control handle( *controlImpl ); + Toolkit::Control handle(*controlImpl); // Second-phase init of the implementation // This can only be done after the CustomActor connection has been made... @@ -145,17 +146,17 @@ Toolkit::Control Control::New() return handle; } -void Control::SetStyleName( const std::string& styleName ) +void Control::SetStyleName(const std::string& styleName) { - if( styleName != mImpl->mStyleName ) + if(styleName != mImpl->mStyleName) { mImpl->mStyleName = styleName; // Apply new style, if stylemanager is available Toolkit::StyleManager styleManager = Toolkit::StyleManager::Get(); - if( styleManager ) + if(styleManager) { - GetImpl( styleManager ).ApplyThemeStyle( Toolkit::Control( GetOwner() ) ); + GetImpl(styleManager).ApplyThemeStyle(Toolkit::Control(GetOwner())); } } } @@ -165,54 +166,53 @@ const std::string& Control::GetStyleName() const return mImpl->mStyleName; } -void Control::SetBackgroundColor( const Vector4& color ) +void Control::SetBackgroundColor(const Vector4& color) { mImpl->mBackgroundColor = color; Property::Map map; - map[ Toolkit::Visual::Property::TYPE ] = Toolkit::Visual::COLOR; - map[ Toolkit::ColorVisual::Property::MIX_COLOR ] = color; + map[Toolkit::Visual::Property::TYPE] = Toolkit::Visual::COLOR; + map[Toolkit::ColorVisual::Property::MIX_COLOR] = color; bool renderIfTransparent = false; - int clippingMode = ClippingMode::DISABLED; - if( ( Self().GetProperty( Actor::Property::CLIPPING_MODE ).Get( clippingMode ) ) && - ( clippingMode == ClippingMode::CLIP_CHILDREN ) ) + int clippingMode = ClippingMode::DISABLED; + if((Self().GetProperty(Actor::Property::CLIPPING_MODE).Get(clippingMode)) && + (clippingMode == ClippingMode::CLIP_CHILDREN)) { // If clipping-mode is set to CLIP_CHILDREN, then force visual to add the render even if transparent - map[ Toolkit::DevelColorVisual::Property::RENDER_IF_TRANSPARENT ] = true; - renderIfTransparent = true; + map[Toolkit::DevelColorVisual::Property::RENDER_IF_TRANSPARENT] = true; + renderIfTransparent = true; } - Toolkit::Visual::Base visual = mImpl->GetVisual( Toolkit::Control::Property::BACKGROUND ); - if( visual && visual.GetType() == Toolkit::Visual::COLOR ) + Toolkit::Visual::Base visual = mImpl->GetVisual(Toolkit::Control::Property::BACKGROUND); + if(visual && visual.GetType() == Toolkit::Visual::COLOR) { Property::Map visualMap; - visual.CreatePropertyMap( visualMap ); + visual.CreatePropertyMap(visualMap); - Property::Value* renderValue = visualMap.Find( Toolkit::DevelColorVisual::Property::RENDER_IF_TRANSPARENT ); - Property::Value* colorValue = visualMap.Find( Toolkit::ColorVisual::Property::MIX_COLOR ); - if( renderValue && colorValue ) + Property::Value* renderValue = visualMap.Find(Toolkit::DevelColorVisual::Property::RENDER_IF_TRANSPARENT); + Property::Value* colorValue = visualMap.Find(Toolkit::ColorVisual::Property::MIX_COLOR); + if(renderValue && colorValue) { - if( ( renderValue->Get< bool >() == true || colorValue->Get< Vector4 >().a > 0.0f ) - && ( renderIfTransparent || color.a > 0.0f ) ) + if((renderValue->Get() == true || colorValue->Get().a > 0.0f) && (renderIfTransparent || color.a > 0.0f)) { // Update background color only - mImpl->DoAction( Toolkit::Control::Property::BACKGROUND, DevelColorVisual::Action::UPDATE_PROPERTY, map ); + mImpl->DoAction(Toolkit::Control::Property::BACKGROUND, DevelColorVisual::Action::UPDATE_PROPERTY, map); return; } } } - SetBackground( map ); + SetBackground(map); } -void Control::SetBackground( const Property::Map& map ) +void Control::SetBackground(const Property::Map& map) { - Toolkit::Visual::Base visual = Toolkit::VisualFactory::Get().CreateVisual( map ); + Toolkit::Visual::Base visual = Toolkit::VisualFactory::Get().CreateVisual(map); visual.SetName("background"); - if( visual ) + if(visual) { - mImpl->RegisterVisual( Toolkit::Control::Property::BACKGROUND, visual, DepthIndex::BACKGROUND ); + mImpl->RegisterVisual(Toolkit::Control::Property::BACKGROUND, visual, DepthIndex::BACKGROUND); // Trigger a size negotiation request that may be needed by the new visual to relayout its contents. RelayoutRequest(); @@ -221,37 +221,38 @@ void Control::SetBackground( const Property::Map& map ) void Control::ClearBackground() { - mImpl->UnregisterVisual( Toolkit::Control::Property::BACKGROUND ); - mImpl->mBackgroundColor = Color::TRANSPARENT; + mImpl->UnregisterVisual(Toolkit::Control::Property::BACKGROUND); + mImpl->mBackgroundColor = Color::TRANSPARENT; - // Trigger a size negotiation request that may be needed when unregistering a visual. - RelayoutRequest(); + // Trigger a size negotiation request that may be needed when unregistering a visual. + RelayoutRequest(); } -void Control::EnableGestureDetection(Gesture::Type type) +void Control::EnableGestureDetection(GestureType::Value type) { - if ( (type & Gesture::Pinch) && !mImpl->mPinchGestureDetector ) + if((type & GestureType::PINCH) && !mImpl->mPinchGestureDetector) { mImpl->mPinchGestureDetector = PinchGestureDetector::New(); mImpl->mPinchGestureDetector.DetectedSignal().Connect(mImpl, &Impl::PinchDetected); mImpl->mPinchGestureDetector.Attach(Self()); } - if ( (type & Gesture::Pan) && !mImpl->mPanGestureDetector ) + if((type & GestureType::PAN) && !mImpl->mPanGestureDetector) { mImpl->mPanGestureDetector = PanGestureDetector::New(); + mImpl->mPanGestureDetector.SetMaximumTouchesRequired(2); mImpl->mPanGestureDetector.DetectedSignal().Connect(mImpl, &Impl::PanDetected); mImpl->mPanGestureDetector.Attach(Self()); } - if ( (type & Gesture::Tap) && !mImpl->mTapGestureDetector ) + if((type & GestureType::TAP) && !mImpl->mTapGestureDetector) { mImpl->mTapGestureDetector = TapGestureDetector::New(); mImpl->mTapGestureDetector.DetectedSignal().Connect(mImpl, &Impl::TapDetected); mImpl->mTapGestureDetector.Attach(Self()); } - if ( (type & Gesture::LongPress) && !mImpl->mLongPressGestureDetector ) + if((type & GestureType::LONG_PRESS) && !mImpl->mLongPressGestureDetector) { mImpl->mLongPressGestureDetector = LongPressGestureDetector::New(); mImpl->mLongPressGestureDetector.DetectedSignal().Connect(mImpl, &Impl::LongPressDetected); @@ -259,27 +260,27 @@ void Control::EnableGestureDetection(Gesture::Type type) } } -void Control::DisableGestureDetection(Gesture::Type type) +void Control::DisableGestureDetection(GestureType::Value type) { - if ( (type & Gesture::Pinch) && mImpl->mPinchGestureDetector ) + if((type & GestureType::PINCH) && mImpl->mPinchGestureDetector) { mImpl->mPinchGestureDetector.Detach(Self()); mImpl->mPinchGestureDetector.Reset(); } - if ( (type & Gesture::Pan) && mImpl->mPanGestureDetector ) + if((type & GestureType::PAN) && mImpl->mPanGestureDetector) { mImpl->mPanGestureDetector.Detach(Self()); mImpl->mPanGestureDetector.Reset(); } - if ( (type & Gesture::Tap) && mImpl->mTapGestureDetector ) + if((type & GestureType::TAP) && mImpl->mTapGestureDetector) { mImpl->mTapGestureDetector.Detach(Self()); mImpl->mTapGestureDetector.Reset(); } - if ( (type & Gesture::LongPress) && mImpl->mLongPressGestureDetector) + if((type & GestureType::LONG_PRESS) && mImpl->mLongPressGestureDetector) { mImpl->mLongPressGestureDetector.Detach(Self()); mImpl->mLongPressGestureDetector.Reset(); @@ -318,7 +319,7 @@ bool Control::IsKeyboardNavigationSupported() void Control::SetKeyInputFocus() { - if( Self().GetProperty< bool >( Actor::Property::CONNECTED_TO_SCENE ) ) + if(Self().GetProperty(Actor::Property::CONNECTED_TO_SCENE)) { Toolkit::KeyInputFocusManager::Get().SetFocus(Toolkit::Control::DownCast(Self())); } @@ -327,10 +328,10 @@ void Control::SetKeyInputFocus() bool Control::HasKeyInputFocus() { bool result = false; - if( Self().GetProperty< bool >( Actor::Property::CONNECTED_TO_SCENE ) ) + if(Self().GetProperty(Actor::Property::CONNECTED_TO_SCENE)) { Toolkit::Control control = Toolkit::KeyInputFocusManager::Get().GetCurrentFocusControl(); - if( Self() == control ) + if(Self() == control) { result = true; } @@ -340,7 +341,7 @@ bool Control::HasKeyInputFocus() void Control::ClearKeyInputFocus() { - if( Self().GetProperty< bool >( Actor::Property::CONNECTED_TO_SCENE ) ) + if(Self().GetProperty(Actor::Property::CONNECTED_TO_SCENE)) { Toolkit::KeyInputFocusManager::Get().RemoveFocus(Toolkit::Control::DownCast(Self())); } @@ -373,7 +374,11 @@ void Control::KeyboardEnter() bool Control::OnAccessibilityActivated() { - return false; // Accessibility activation is not handled by default + if( Toolkit::KeyboardFocusManager::Get().SetCurrentFocusActor( Self() ) ) + { + return OnKeyboardEnter(); + } + return false; } bool Control::OnKeyboardEnter() @@ -420,22 +425,22 @@ Toolkit::Control::KeyInputFocusSignalType& Control::KeyInputFocusLostSignal() return mImpl->mKeyInputFocusLostSignal; } -bool Control::EmitKeyEventSignal( const KeyEvent& event ) +bool Control::EmitKeyEventSignal(const KeyEvent& event) { // Guard against destruction during signal emission - Dali::Toolkit::Control handle( GetOwner() ); + Dali::Toolkit::Control handle(GetOwner()); bool consumed = false; - consumed = mImpl->FilterKeyEvent( event ); + consumed = mImpl->FilterKeyEvent(event); // signals are allocated dynamically when someone connects - if ( !consumed && !mImpl->mKeyEventSignal.Empty() ) + if(!consumed && !mImpl->mKeyEventSignal.Empty()) { - consumed = mImpl->mKeyEventSignal.Emit( handle, event ); + consumed = mImpl->mKeyEventSignal.Emit(handle, event); } - if ( !consumed ) + if(!consumed) { // Notification for derived classes consumed = OnKeyEvent(event); @@ -444,8 +449,8 @@ bool Control::EmitKeyEventSignal( const KeyEvent& event ) return consumed; } -Control::Control( ControlBehaviour behaviourFlags ) -: CustomActorImpl( static_cast< ActorFlags >( behaviourFlags ) ), +Control::Control(ControlBehaviour behaviourFlags) +: CustomActorImpl(static_cast(behaviourFlags)), mImpl(new Impl(*this)) { mImpl->mFlags = behaviourFlags; @@ -461,61 +466,71 @@ void Control::Initialize() // Call deriving classes so initialised before styling is applied to them. OnInitialize(); - if( (mImpl->mFlags & REQUIRES_STYLE_CHANGE_SIGNALS) || - !(mImpl->mFlags & DISABLE_STYLE_CHANGE_SIGNALS) ) + if(!(mImpl->mFlags & DISABLE_STYLE_CHANGE_SIGNALS)) { Toolkit::StyleManager styleManager = StyleManager::Get(); // if stylemanager is available - if( styleManager ) + if(styleManager) { - StyleManager& styleManagerImpl = GetImpl( styleManager ); + StyleManager& styleManagerImpl = GetImpl(styleManager); // Register for style changes - styleManagerImpl.ControlStyleChangeSignal().Connect( this, &Control::OnStyleChange ); + styleManagerImpl.ControlStyleChangeSignal().Connect(this, &Control::OnStyleChange); // Apply the current style - styleManagerImpl.ApplyThemeStyleAtInit( Toolkit::Control( GetOwner() ) ); + styleManagerImpl.ApplyThemeStyleAtInit(Toolkit::Control(GetOwner())); } } - if( mImpl->mFlags & REQUIRES_KEYBOARD_NAVIGATION_SUPPORT ) + if(mImpl->mFlags & REQUIRES_KEYBOARD_NAVIGATION_SUPPORT) { - SetKeyboardNavigationSupport( true ); + SetKeyboardNavigationSupport(true); } + + Dali::TypeInfo type; + Self().GetTypeInfo( type ); + if (type) + { + auto typeName = type.GetName(); + DevelControl::AppendAccessibilityAttribute( Self(), "t", typeName ); + } + + if (Accessibility::IsUp()) + mImpl->AccessibilityRegister(); } void Control::OnInitialize() { } -void Control::OnStyleChange( Toolkit::StyleManager styleManager, StyleChange::Type change ) +void Control::OnStyleChange(Toolkit::StyleManager styleManager, StyleChange::Type change) { // By default the control is only interested in theme (not font) changes - if( styleManager && change == StyleChange::THEME_CHANGE ) + if(styleManager && change == StyleChange::THEME_CHANGE) { - GetImpl( styleManager ).ApplyThemeStyle( Toolkit::Control( GetOwner() ) ); + GetImpl(styleManager).ApplyThemeStyle(Toolkit::Control(GetOwner())); RelayoutRequest(); } } void Control::OnPinch(const PinchGesture& pinch) { - if( !( mImpl->mStartingPinchScale ) ) + if(!(mImpl->mStartingPinchScale)) { // lazy allocate mImpl->mStartingPinchScale = new Vector3; } - if( pinch.state == Gesture::Started ) + if(pinch.GetState() == GestureState::STARTED) { - *( mImpl->mStartingPinchScale ) = Self().GetCurrentProperty< Vector3 >( Actor::Property::SCALE ); + *(mImpl->mStartingPinchScale) = Self().GetCurrentProperty(Actor::Property::SCALE); } - Self().SetProperty( Actor::Property::SCALE, *( mImpl->mStartingPinchScale ) * pinch.scale ); + Self().SetProperty(Actor::Property::SCALE, *(mImpl->mStartingPinchScale) * pinch.GetScale()); } -void Control::OnPan( const PanGesture& pan ) +void Control::OnPan(const PanGesture& pan) { } @@ -523,69 +538,87 @@ void Control::OnTap(const TapGesture& tap) { } -void Control::OnLongPress( const LongPressGesture& longPress ) +void Control::OnLongPress(const LongPressGesture& longPress) { } -void Control::EmitKeyInputFocusSignal( bool focusGained ) +void Control::EmitKeyInputFocusSignal(bool focusGained) { - Dali::Toolkit::Control handle( GetOwner() ); + Dali::Toolkit::Control handle(GetOwner()); + + if( Accessibility::IsUp() ) + { + auto self = mImpl->GetAccessibilityObject( Self() ); + self->EmitFocused( focusGained ); + auto parent = self->GetParent(); + if( parent && !self->GetStates()[Dali::Accessibility::State::MANAGES_DESCENDANTS] ) + { + parent->EmitActiveDescendantChanged( parent, self ); + } + } - if ( focusGained ) + if(focusGained) { // signals are allocated dynamically when someone connects - if ( !mImpl->mKeyInputFocusGainedSignal.Empty() ) + if(!mImpl->mKeyInputFocusGainedSignal.Empty()) { - mImpl->mKeyInputFocusGainedSignal.Emit( handle ); + mImpl->mKeyInputFocusGainedSignal.Emit(handle); } } else { // signals are allocated dynamically when someone connects - if ( !mImpl->mKeyInputFocusLostSignal.Empty() ) + if(!mImpl->mKeyInputFocusLostSignal.Empty()) { - mImpl->mKeyInputFocusLostSignal.Emit( handle ); + mImpl->mKeyInputFocusLostSignal.Emit(handle); } } } -void Control::OnSceneConnection( int depth ) +void Control::OnSceneConnection(int depth) { - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Control::OnSceneConnection number of registered visuals(%d)\n", mImpl->mVisuals.Size() ); + DALI_LOG_INFO(gLogFilter, Debug::Verbose, "Control::OnSceneConnection number of registered visuals(%d)\n", mImpl->mVisuals.Size()); - Actor self( Self() ); + Actor self(Self()); - for(RegisteredVisualContainer::Iterator iter = mImpl->mVisuals.Begin(); iter!= mImpl->mVisuals.End(); iter++) + for(RegisteredVisualContainer::Iterator iter = mImpl->mVisuals.Begin(); iter != mImpl->mVisuals.End(); iter++) { // Check whether the visual is empty and enabled - if( (*iter)->visual && (*iter)->enabled ) + if((*iter)->visual && (*iter)->enabled) { - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Control::OnSceneConnection Setting visual(%d) on scene\n", (*iter)->index ); - Toolkit::GetImplementation((*iter)->visual).SetOnScene( self ); + DALI_LOG_INFO(gLogFilter, Debug::Verbose, "Control::OnSceneConnection Setting visual(%d) on scene\n", (*iter)->index); + Toolkit::GetImplementation((*iter)->visual).SetOnScene(self); } } // The clipping renderer is only created if required. - CreateClippingRenderer( *this ); + CreateClippingRenderer(*this); // Request to be laid out when the control is connected to the Scene. // Signal that a Relayout may be needed + if( Accessibility::IsUp() ) + { + mImpl->AccessibilityRegister(); + } } - void Control::OnSceneDisconnection() { + if( Accessibility::IsUp() ) + { + mImpl->AccessibilityDeregister(); + } mImpl->OnSceneDisconnection(); } void Control::OnKeyInputFocusGained() { - EmitKeyInputFocusSignal( true ); + EmitKeyInputFocusSignal(true); } void Control::OnKeyInputFocusLost() { - EmitKeyInputFocusSignal( false ); + EmitKeyInputFocusSignal(false); } void Control::OnChildAdd(Actor& child) @@ -596,24 +629,63 @@ void Control::OnChildRemove(Actor& child) { } -void Control::OnPropertySet( Property::Index index, Property::Value propertyValue ) +void Control::OnPropertySet(Property::Index index, const Property::Value& propertyValue) { // If the clipping mode has been set, we may need to create a renderer. // Only do this if we are already on-stage as the OnSceneConnection will handle the off-stage clipping controls. - if( ( index == Actor::Property::CLIPPING_MODE ) && Self().GetProperty< bool >( Actor::Property::CONNECTED_TO_SCENE ) ) + switch( index ) { - // Note: This method will handle whether creation of the renderer is required. - CreateClippingRenderer( *this ); + case Actor::Property::CLIPPING_MODE: + { + if( Self().GetProperty< bool >( Actor::Property::CONNECTED_TO_SCENE )) + { + // Note: This method will handle whether creation of the renderer is required. + CreateClippingRenderer( *this ); + } + break; + } + case Actor::Property::VISIBLE: + { + if( Dali::Accessibility::IsUp() ) + { + Dali::Accessibility::Accessible::Get(Self())->EmitVisible( Self().GetProperty( Actor::Property::VISIBLE ).Get() ); + } + break; + } + case Toolkit::DevelControl::Property::ACCESSIBILITY_NAME: + { + if( Dali::Accessibility::IsUp() ) + { + Dali::Accessibility::Accessible::Get(Self())->Emit( Dali::Accessibility::ObjectPropertyChangeEvent::NAME ); + } + break; + } + case Toolkit::DevelControl::Property::ACCESSIBILITY_ROLE: + { + if( Dali::Accessibility::IsUp() ) + { + Dali::Accessibility::Accessible::Get(Self())->Emit( Dali::Accessibility::ObjectPropertyChangeEvent::ROLE ); + } + break; + } + case Toolkit::DevelControl::Property::ACCESSIBILITY_DESCRIPTION: + { + if( Dali::Accessibility::IsUp() ) + { + Dali::Accessibility::Accessible::Get(Self())->Emit( Dali::Accessibility::ObjectPropertyChangeEvent::DESCRIPTION ); + } + break; + } } } void Control::OnSizeSet(const Vector3& targetSize) { - Toolkit::Visual::Base visual = mImpl->GetVisual( Toolkit::Control::Property::BACKGROUND ); - if( visual ) + Toolkit::Visual::Base visual = mImpl->GetVisual(Toolkit::Control::Property::BACKGROUND); + if(visual) { - Vector2 size( targetSize ); - visual.SetTransformAndSize( Property::Map(), size ); // Send an empty map as we do not want to modify the visual's set transform + Vector2 size(targetSize); + visual.SetTransformAndSize(Property::Map(), size); // Send an empty map as we do not want to modify the visual's set transform } } @@ -622,133 +694,123 @@ void Control::OnSizeAnimation(Animation& animation, const Vector3& targetSize) // @todo size negotiate background to new size, animate as well? } -bool Control::OnHoverEvent(const HoverEvent& event) -{ - return false; // Do not consume -} - bool Control::OnKeyEvent(const KeyEvent& event) { return false; // Do not consume } -bool Control::OnWheelEvent(const WheelEvent& event) -{ - return false; // Do not consume -} - -void Control::OnRelayout( const Vector2& size, RelayoutContainer& container ) +void Control::OnRelayout(const Vector2& size, RelayoutContainer& container) { - for( unsigned int i = 0, numChildren = Self().GetChildCount(); i < numChildren; ++i ) + for(unsigned int i = 0, numChildren = Self().GetChildCount(); i < numChildren; ++i) { - Actor child = Self().GetChildAt( i ); - Vector2 newChildSize( size ); + Actor child = Self().GetChildAt(i); + Vector2 newChildSize(size); // When set the padding or margin on the control, child should be resized and repositioned. - if( ( mImpl->mPadding.start != 0 ) || ( mImpl->mPadding.end != 0 ) || ( mImpl->mPadding.top != 0 ) || ( mImpl->mPadding.bottom != 0 ) || - ( mImpl->mMargin.start != 0 ) || ( mImpl->mMargin.end != 0 ) || ( mImpl->mMargin.top != 0 ) || ( mImpl->mMargin.bottom != 0 ) ) + if((mImpl->mPadding.start != 0) || (mImpl->mPadding.end != 0) || (mImpl->mPadding.top != 0) || (mImpl->mPadding.bottom != 0) || + (mImpl->mMargin.start != 0) || (mImpl->mMargin.end != 0) || (mImpl->mMargin.top != 0) || (mImpl->mMargin.bottom != 0)) { Extents padding = mImpl->mPadding; - Dali::CustomActor ownerActor(GetOwner()); - Dali::LayoutDirection::Type layoutDirection = static_cast( ownerActor.GetProperty( Dali::Actor::Property::LAYOUT_DIRECTION ).Get() ); + Dali::CustomActor ownerActor(GetOwner()); + Dali::LayoutDirection::Type layoutDirection = static_cast(ownerActor.GetProperty(Dali::Actor::Property::LAYOUT_DIRECTION).Get()); - if( Dali::LayoutDirection::RIGHT_TO_LEFT == layoutDirection ) + if(Dali::LayoutDirection::RIGHT_TO_LEFT == layoutDirection) { - std::swap( padding.start, padding.end ); + std::swap(padding.start, padding.end); } - newChildSize.width = size.width - ( padding.start + padding.end ); - newChildSize.height = size.height - ( padding.top + padding.bottom ); + newChildSize.width = size.width - (padding.start + padding.end); + newChildSize.height = size.height - (padding.top + padding.bottom); // Cannot use childs Position property as it can already have padding and margin applied on it, // so we end up cumulatively applying them over and over again. - Vector2 childOffset( 0.f, 0.f ); - childOffset.x += ( mImpl->mMargin.start + padding.start ); - childOffset.y += ( mImpl->mMargin.top + padding.top ); + Vector2 childOffset(0.f, 0.f); + childOffset.x += (mImpl->mMargin.start + padding.start); + childOffset.y += (mImpl->mMargin.top + padding.top); - child.SetProperty( Actor::Property::POSITION, Vector2( childOffset.x, childOffset.y ) ); + child.SetProperty(Actor::Property::POSITION, Vector2(childOffset.x, childOffset.y)); } - container.Add( child, newChildSize ); + container.Add(child, newChildSize); } - Toolkit::Visual::Base visual = mImpl->GetVisual( Toolkit::Control::Property::BACKGROUND ); - if( visual ) + Toolkit::Visual::Base visual = mImpl->GetVisual(Toolkit::Control::Property::BACKGROUND); + if(visual) { - visual.SetTransformAndSize( Property::Map(), size ); // Send an empty map as we do not want to modify the visual's set transform + visual.SetTransformAndSize(Property::Map(), size); // Send an empty map as we do not want to modify the visual's set transform } } -void Control::OnSetResizePolicy( ResizePolicy::Type policy, Dimension::Type dimension ) +void Control::OnSetResizePolicy(ResizePolicy::Type policy, Dimension::Type dimension) { } Vector3 Control::GetNaturalSize() { - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Control::GetNaturalSize for %s\n", Self().GetProperty< std::string >( Dali::Actor::Property::NAME ).c_str() ); - Toolkit::Visual::Base visual = mImpl->GetVisual( Toolkit::Control::Property::BACKGROUND ); - if( visual ) + DALI_LOG_INFO(gLogFilter, Debug::Verbose, "Control::GetNaturalSize for %s\n", Self().GetProperty(Dali::Actor::Property::NAME).c_str()); + Toolkit::Visual::Base visual = mImpl->GetVisual(Toolkit::Control::Property::BACKGROUND); + if(visual) { Vector2 naturalSize; - visual.GetNaturalSize( naturalSize ); - naturalSize.width += ( mImpl->mPadding.start + mImpl->mPadding.end ); - naturalSize.height += ( mImpl->mPadding.top + mImpl->mPadding.bottom ); - return Vector3( naturalSize ); + visual.GetNaturalSize(naturalSize); + naturalSize.width += (mImpl->mPadding.start + mImpl->mPadding.end); + naturalSize.height += (mImpl->mPadding.top + mImpl->mPadding.bottom); + return Vector3(naturalSize); } return Vector3::ZERO; } -float Control::CalculateChildSize( const Dali::Actor& child, Dimension::Type dimension ) +float Control::CalculateChildSize(const Dali::Actor& child, Dimension::Type dimension) { - return CalculateChildSizeBase( child, dimension ); + return CalculateChildSizeBase(child, dimension); } -float Control::GetHeightForWidth( float width ) +float Control::GetHeightForWidth(float width) { - return GetHeightForWidthBase( width ); + return GetHeightForWidthBase(width); } -float Control::GetWidthForHeight( float height ) +float Control::GetWidthForHeight(float height) { - return GetWidthForHeightBase( height ); + return GetWidthForHeightBase(height); } -bool Control::RelayoutDependentOnChildren( Dimension::Type dimension ) +bool Control::RelayoutDependentOnChildren(Dimension::Type dimension) { - return RelayoutDependentOnChildrenBase( dimension ); + return RelayoutDependentOnChildrenBase(dimension); } -void Control::OnCalculateRelayoutSize( Dimension::Type dimension ) +void Control::OnCalculateRelayoutSize(Dimension::Type dimension) { } -void Control::OnLayoutNegotiated( float size, Dimension::Type dimension ) +void Control::OnLayoutNegotiated(float size, Dimension::Type dimension) { } -void Control::SignalConnected( SlotObserver* slotObserver, CallbackBase* callback ) +void Control::SignalConnected(SlotObserver* slotObserver, CallbackBase* callback) { - mImpl->SignalConnected( slotObserver, callback ); + mImpl->SignalConnected(slotObserver, callback); } -void Control::SignalDisconnected( SlotObserver* slotObserver, CallbackBase* callback ) +void Control::SignalDisconnected(SlotObserver* slotObserver, CallbackBase* callback) { - mImpl->SignalDisconnected( slotObserver, callback ); + mImpl->SignalDisconnected(slotObserver, callback); } -Control& GetImplementation( Dali::Toolkit::Control& handle ) +Control& GetImplementation(Dali::Toolkit::Control& handle) { CustomActorImpl& customInterface = handle.GetImplementation(); // downcast to control - Control& impl = dynamic_cast< Internal::Control& >( customInterface ); + Control& impl = dynamic_cast(customInterface); return impl; } -const Control& GetImplementation( const Dali::Toolkit::Control& handle ) +const Control& GetImplementation(const Dali::Toolkit::Control& handle) { const CustomActorImpl& customInterface = handle.GetImplementation(); // downcast to control - const Control& impl = dynamic_cast< const Internal::Control& >( customInterface ); + const Control& impl = dynamic_cast(customInterface); return impl; }