X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;ds=sidebyside;f=dali-toolkit%2Fpublic-api%2Fcontrols%2Fcontrol-impl.cpp;h=17db11bf5e003ba36b825dad210f7c43e919ebfc;hb=HEAD;hp=1a2445c28b26a8ea13d37008e46c6745ba620705;hpb=b6d4b9f100ccc6dce652ae9f301cb1ab19c463b1;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/public-api/controls/control-impl.cpp b/dali-toolkit/public-api/controls/control-impl.cpp index 1a2445c..068fb03 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) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2024 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. @@ -24,24 +24,24 @@ #include #include #include -#include -#include +#include #include #include // for strcmp #include #include -#include // INTERNAL INCLUDES #include #include #include #include -#include #include +#include #include +#include #include #include +#include #include #include #include @@ -88,8 +88,13 @@ void CreateClippingRenderer(Control& controlImpl) Toolkit::Control Control::New() { + return New(ControlBehaviour::CONTROL_BEHAVIOUR_DEFAULT); +} + +Toolkit::Control Control::New(ControlBehaviour additionalBehaviour) +{ // Create the implementation, temporarily owned on stack - IntrusivePtr controlImpl = new Control(ControlBehaviour(CONTROL_BEHAVIOUR_DEFAULT)); + IntrusivePtr controlImpl = new Control(ControlBehaviour(CONTROL_BEHAVIOUR_DEFAULT | additionalBehaviour)); // Pass ownership to handle Toolkit::Control handle(*controlImpl); @@ -162,6 +167,49 @@ void Control::ClearBackground() RelayoutRequest(); } +void Control::SetRenderEffect(Toolkit::RenderEffect effect) +{ + if(mImpl->mRenderEffect != effect) + { + ClearRenderEffect(); + mImpl->mRenderEffect = effect; + + if(effect) + { + Toolkit::Internal::RenderEffectImpl* object = dynamic_cast(mImpl->mRenderEffect.GetObjectPtr()); + DALI_ASSERT_ALWAYS(object && "Not a valid RenderEffect set."); + + Dali::Toolkit::Control ownerControl(GetOwner()); + object->SetOwnerControl(ownerControl); + } + } +} + +void Control::ClearRenderEffect() +{ + if(mImpl->mRenderEffect) + { + Toolkit::Internal::RenderEffectImpl* object = dynamic_cast(mImpl->mRenderEffect.GetObjectPtr()); + + if(object) + { + object->ClearOwnerControl(); + } + mImpl->mRenderEffect.Reset(); + } +} + +void Control::SetResourceReady() +{ + Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(*this); + controlDataImpl.ResourceReady(); +} + +std::shared_ptr Control::GetAccessibleObject() +{ + return mImpl->GetAccessibleObject(); +} + void Control::EnableGestureDetection(GestureType::Value type) { if((type & GestureType::PINCH) && !mImpl->mPinchGestureDetector) @@ -294,12 +342,6 @@ bool Control::IsKeyboardFocusGroup() return Toolkit::KeyboardFocusManager::Get().IsFocusGroup(Self()); } -void Control::AccessibilityActivate() -{ - // Inform deriving classes - OnAccessibilityActivated(); -} - void Control::KeyboardEnter() { // Inform deriving classes @@ -335,6 +377,11 @@ bool Control::OnAccessibilityZoom() return false; // Accessibility zoom action is not handled by default } +DevelControl::ControlAccessible* Control::CreateAccessibleObject() +{ + return new DevelControl::ControlAccessible(Self()); +} + Actor Control::GetNextKeyboardFocusableActor(Actor currentFocusedActor, Toolkit::Control::KeyboardFocus::Direction direction, bool loopEnabled) { return Actor(); @@ -392,6 +439,9 @@ Control::Control(ControlBehaviour behaviourFlags) Control::~Control() { + // Deactivate render effect before destroying the control impl + ClearRenderEffect(); + delete mImpl; } @@ -421,20 +471,18 @@ 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() { } +bool Control::IsResourceReady() const +{ + const Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(*this); + return controlDataImpl.IsResourceReady(); +} + void Control::OnStyleChange(Toolkit::StyleManager styleManager, StyleChange::Type change) { // By default the control is only interested in theme (not font) changes @@ -479,12 +527,15 @@ void Control::EmitKeyInputFocusSignal(bool focusGained) if(Accessibility::IsUp()) { - auto self = mImpl->GetAccessibilityObject(Self()); - self->EmitFocused(focusGained); - auto parent = self->GetParent(); - if(parent && !self->GetStates()[Dali::Accessibility::State::MANAGES_DESCENDANTS]) + auto accessible = GetAccessibleObject(); + if(DALI_LIKELY(accessible)) { - parent->EmitActiveDescendantChanged(self); + accessible->EmitFocused(focusGained); + auto parent = accessible->GetParent(); + if(parent && !accessible->GetStates()[Dali::Accessibility::State::MANAGES_DESCENDANTS]) + { + parent->EmitActiveDescendantChanged(accessible.get()); + } } } @@ -566,9 +617,19 @@ void Control::OnPropertySet(Property::Index index, const Property::Value& proper } case Actor::Property::VISIBLE: { - if(Dali::Accessibility::IsUp() && !Self().GetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_HIDDEN)) + auto accessible = GetAccessibleObject(); + if(DALI_LIKELY(accessible) && accessible->IsHighlighted()) + { + accessible->EmitVisible(Self().GetProperty(Actor::Property::VISIBLE)); + } + break; + } + case DevelActor::Property::USER_INTERACTION_ENABLED: + { + const bool enabled = propertyValue.Get(); + if(!enabled && Self() == Dali::Toolkit::KeyboardFocusManager::Get().GetCurrentFocusActor()) { - Dali::Accessibility::Accessible::Get(Self())->EmitVisible(Self().GetProperty(Actor::Property::VISIBLE).Get()); + Dali::Toolkit::KeyboardFocusManager::Get().ClearFocus(); } break; } @@ -577,12 +638,16 @@ void Control::OnPropertySet(Property::Index index, const Property::Value& proper void Control::OnSizeSet(const Vector3& targetSize) { + Vector2 size(targetSize); 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 } + + // Apply FittingMode here + mImpl->mSize = size; + mImpl->RegisterProcessorOnce(); } void Control::OnSizeAnimation(Animation& animation, const Vector3& targetSize) @@ -630,11 +695,8 @@ void Control::OnRelayout(const Vector2& size, RelayoutContainer& container) container.Add(child, newChildSize); } - 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 - } + // Apply FittingMode here + mImpl->ApplyFittingMode(size); } void Control::OnSetResizePolicy(ResizePolicy::Type policy, Dimension::Type dimension) @@ -694,8 +756,7 @@ void Control::SignalDisconnected(SlotObserver* slotObserver, CallbackBase* callb mImpl->SignalDisconnected(slotObserver, callback); } -void Control::MakeVisualTransition(Dali::Property::Map& sourcePropertyMap, Dali::Property::Map& destinationPropertyMap, - Dali::Toolkit::Control source, Dali::Toolkit::Control destination, Dali::Property::Index visualIndex) +void Control::MakeVisualTransition(Dali::Property::Map& sourcePropertyMap, Dali::Property::Map& destinationPropertyMap, Dali::Toolkit::Control source, Dali::Toolkit::Control destination, Dali::Property::Index visualIndex) { sourcePropertyMap.Clear(); destinationPropertyMap.Clear(); @@ -714,8 +775,7 @@ void Control::MakeVisualTransition(Dali::Property::Map& sourcePropertyMap, Dali: sourceVisual.CreatePropertyMap(sourceMap); destinationVisual.CreatePropertyMap(destinationMap); - static auto findValueVector4 = [](const Property::Map& map, Property::Index index, const Vector4& defaultValue = Vector4()) -> Vector4 - { + static auto findValueVector4 = [](const Property::Map& map, Property::Index index, const Vector4& defaultValue = Vector4()) -> Vector4 { Property::Value* propertyValue = map.Find(index); if(propertyValue) { @@ -724,8 +784,7 @@ void Control::MakeVisualTransition(Dali::Property::Map& sourcePropertyMap, Dali: return defaultValue; }; - static auto findValueFloat = [](const Property::Map& map, Property::Index index, const float& defaultValue = 0.0f) -> float - { + static auto findValueFloat = [](const Property::Map& map, Property::Index index, const float& defaultValue = 0.0f) -> float { Property::Value* propertyValue = map.Find(index); if(propertyValue) { @@ -753,16 +812,10 @@ void Control::MakeVisualTransition(Dali::Property::Map& sourcePropertyMap, Dali: float destinationBorderlineOffset = findValueFloat(destinationMap, Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, defaultBorderlineOffset); // If the value of the source Control and that of destination Control is different, the property should be transitioned. - if(Vector3(sourceMixColor) != Vector3(destinationMixColor)) - { - sourcePropertyMap.Add(Dali::Toolkit::Visual::Property::MIX_COLOR, Vector3(sourceMixColor)); - destinationPropertyMap.Add(Dali::Toolkit::Visual::Property::MIX_COLOR, Vector3(destinationMixColor)); - } - - if(std::abs(sourceMixColor.a - destinationMixColor.a) > Math::MACHINE_EPSILON_1) + if(sourceMixColor != destinationMixColor) { - sourcePropertyMap.Add(Dali::Toolkit::Visual::Property::OPACITY, sourceMixColor.a); - destinationPropertyMap.Add(Dali::Toolkit::Visual::Property::OPACITY, destinationMixColor.a); + sourcePropertyMap.Add(Dali::Toolkit::Visual::Property::MIX_COLOR, sourceMixColor); + destinationPropertyMap.Add(Dali::Toolkit::Visual::Property::MIX_COLOR, destinationMixColor); } if(sourceCornerRadius != destinationCornerRadius) @@ -771,7 +824,7 @@ void Control::MakeVisualTransition(Dali::Property::Map& sourcePropertyMap, Dali: destinationPropertyMap.Add(Dali::Toolkit::DevelVisual::Property::CORNER_RADIUS, destinationCornerRadius); } - if(sourceBorderlineWidth != destinationBorderlineWidth) + if(!Dali::Equals(sourceBorderlineWidth, destinationBorderlineWidth)) { sourcePropertyMap.Add(Dali::Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, sourceBorderlineWidth); destinationPropertyMap.Add(Dali::Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, destinationBorderlineWidth); @@ -783,7 +836,7 @@ void Control::MakeVisualTransition(Dali::Property::Map& sourcePropertyMap, Dali: destinationPropertyMap.Add(Dali::Toolkit::DevelVisual::Property::BORDERLINE_COLOR, destinationBorderlineColor); } - if(sourceBorderlineOffset != destinationBorderlineOffset) + if(!Dali::Equals(sourceBorderlineOffset, destinationBorderlineOffset)) { sourcePropertyMap.Add(Dali::Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, sourceBorderlineOffset); destinationPropertyMap.Add(Dali::Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, destinationBorderlineOffset);