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=17db11bf5e003ba36b825dad210f7c43e919ebfc;hp=b4bb4da58a875321d9dfb5a8020d64bcf10348e2;hb=d34f98e1c0829e76b142607743488fe54d43ee3a;hpb=debd4ef5b35507bac4579dfbb8983b743872c70b diff --git a/dali-toolkit/public-api/controls/control-impl.cpp b/dali-toolkit/public-api/controls/control-impl.cpp index b4bb4da..17db11b 100644 --- a/dali-toolkit/public-api/controls/control-impl.cpp +++ b/dali-toolkit/public-api/controls/control-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * Copyright (c) 2021 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,9 +19,12 @@ #include // EXTERNAL INCLUDES +#include +#include #include #include #include +#include #include #include #include // for strcmp @@ -30,6 +33,7 @@ #include // INTERNAL INCLUDES +#include #include #include #include @@ -41,6 +45,7 @@ #include #include #include +#include #include #include #include @@ -59,27 +64,6 @@ Debug::Filter* gLogFilter = Debug::Filter::New(Debug::NoLogging, false, "LOG_CON #endif /** - * @brief Replace the background visual if it's a color visual with the renderIfTransparent property set as required. - * @param[in] controlImpl The control implementation - * @param[in] renderIfTransaparent Whether we should render if the color is transparent - */ -void ChangeBackgroundColorVisual(Control& controlImpl, bool renderIfTransparent) -{ - 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) - { - Property::Map map; - backgroundVisual.CreatePropertyMap(map); - - // Only change it if it's a color visual - map[Toolkit::DevelColorVisual::Property::RENDER_IF_TRANSPARENT] = renderIfTransparent; - controlImpl.SetBackground(map); - } -} - -/** * @brief Creates a clipping renderer if required. * (EG. If no renders exist and clipping is enabled). * @param[in] controlImpl The control implementation. @@ -91,34 +75,11 @@ void CreateClippingRenderer(Control& controlImpl) int clippingMode = ClippingMode::DISABLED; if(self.GetProperty(Actor::Property::CLIPPING_MODE).Get(clippingMode)) { - switch(clippingMode) - { - case ClippingMode::CLIP_CHILDREN: - { - if(self.GetRendererCount() == 0u) - { - Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(controlImpl); - if(controlDataImpl.mVisuals.Empty()) - { - 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); - } - } - break; - } + Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(controlImpl); - case ClippingMode::DISABLED: - 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); - break; - } + if(clippingMode == ClippingMode::CLIP_CHILDREN && controlDataImpl.mVisuals.Empty() && self.GetRendererCount() == 0u) + { + controlImpl.SetBackgroundColor(Color::TRANSPARENT); } } } @@ -168,33 +129,12 @@ void Control::SetBackgroundColor(const Vector4& 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)) - { - // 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; - } - Toolkit::Visual::Base visual = mImpl->GetVisual(Toolkit::Control::Property::BACKGROUND); if(visual && visual.GetType() == Toolkit::Visual::COLOR) { - Property::Map 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) - { - 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); - return; - } - } + // Update background color only + mImpl->DoAction(Toolkit::Control::Property::BACKGROUND, DevelColorVisual::Action::UPDATE_PROPERTY, map); + return; } SetBackground(map); @@ -234,6 +174,7 @@ void Control::EnableGestureDetection(GestureType::Value type) 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()); } @@ -367,7 +308,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() @@ -476,6 +421,14 @@ void Control::Initialize() { SetKeyboardNavigationSupport(true); } + + Dali::TypeInfo type; + Self().GetTypeInfo(type); + if(type) + { + auto typeName = type.GetName(); + DevelControl::AppendAccessibilityAttribute(Self(), "class", typeName); + } } void Control::OnInitialize() @@ -524,6 +477,17 @@ void Control::EmitKeyInputFocusSignal(bool focusGained) { 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) { // signals are allocated dynamically when someone connects @@ -560,9 +524,6 @@ void Control::OnSceneConnection(int depth) // The clipping renderer is only created if required. CreateClippingRenderer(*this); - - // Request to be laid out when the control is connected to the Scene. - // Signal that a Relayout may be needed } void Control::OnSceneDisconnection() @@ -592,10 +553,33 @@ void Control::OnPropertySet(Property::Index index, const Property::Value& proper { // 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(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(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_ROLE: + { + if(Dali::Accessibility::IsUp()) + { + Dali::Accessibility::Accessible::Get(Self())->Emit(Dali::Accessibility::ObjectPropertyChangeEvent::ROLE); + } + break; + } } }