From: Seungho Baek Date: Tue, 28 Sep 2021 07:29:26 +0000 (+0900) Subject: Make transition select target control during pair transition X-Git-Tag: dali_2.0.50~5 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=cab6cfc0b656124cf8b51c7e484b9e2682e6bd1f;ds=inline Make transition select target control during pair transition Change-Id: I87c868572b67dab4ad3289299599ebb3d25104da Signed-off-by: Seungho Baek --- diff --git a/automated-tests/src/dali-toolkit/utc-Dali-Transition.cpp b/automated-tests/src/dali-toolkit/utc-Dali-Transition.cpp index 7e36d2c..ef1eb2c 100755 --- a/automated-tests/src/dali-toolkit/utc-Dali-Transition.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-Transition.cpp @@ -118,7 +118,7 @@ int UtcDaliTransitionSetGetProperty01(void) application.SendNotification(); application.Render(20); - Transition transition = Transition::New(control1, control2, TimePeriod(-0.1f, -0.1f)); + Transition transition = Transition::New(control1, control2, true, TimePeriod(-0.1f, -0.1f)); TimePeriod timePeriod = transition.GetTimePeriod(); DALI_TEST_EQUALS(0.0f, timePeriod.durationSeconds, TEST_LOCATION); DALI_TEST_EQUALS(0.0f, timePeriod.delaySeconds, TEST_LOCATION); @@ -178,7 +178,7 @@ int UtcDaliTransitionSetGetProperty02(void) application.SendNotification(); application.Render(20); - Transition transition = Transition::New(control1, control2, TimePeriod(-0.1f)); + Transition transition = Transition::New(control1, control2, true, TimePeriod(-0.1f)); TimePeriod timePeriod = transition.GetTimePeriod(); DALI_TEST_EQUALS(0.0f, timePeriod.durationSeconds, TEST_LOCATION); DALI_TEST_EQUALS(0.0f, timePeriod.delaySeconds, TEST_LOCATION); @@ -268,7 +268,7 @@ int UtcDaliTransitionBetweenControlPair(void) application.SendNotification(); application.Render(20); - Transition transition = Transition::New(control1, control2, TimePeriod(0.5f)); + Transition transition = Transition::New(control1, control2, true, TimePeriod(0.5f)); TransitionSet transitionSet = TransitionSet::New(); transitionSet.AddTransition(transition); transitionSet.Play(); @@ -333,6 +333,185 @@ int UtcDaliTransitionBetweenControlPair(void) END_TEST; } +int UtcDaliTransitionBetweenControlPair2(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliTransitionBetweenControlPair2 - source target will be transitioned."); + + Vector3 sourcePosition(100, 200, 0); + Vector3 sourceSize(150, 150, 0); + Vector3 sourceScale(1, 2, 0); + Vector4 sourceColor(1.0f, 1.0f, 1.0f, 0.5f); + float sourceOpacity(0.5f); + float sourceRadius(30.f); + float sourceBorderlineWidth(60.0f); + Vector4 sourceBorderlineColor(1.0f, 0.0f, 0.0f, 1.0f); + float sourceBorderlineOffset(1.f); + Vector4 sourceRadiusV4 = Vector4(sourceRadius, sourceRadius, sourceRadius, sourceRadius); + + Vector3 destinationPosition(50, 50, 0); + Vector3 destinationSize(120, 120, 0); + Vector3 destinationScale(2, 1, 0); + Vector4 destinationColor(1.0f, 0.5f, 1.0f, 0.8f); + float destinationOpacity(0.8f); + float destinationRadius(50.f); + float destinationBorderlineWidth(80.0f); + Vector4 destinationBorderlineColor(0.5f, 1.0f, 0.5f, 0.3f); + float destinationBorderlineOffset(-1.0f); + Vector4 destinationRadiusV4 = Vector4(destinationRadius, destinationRadius, destinationRadius, destinationRadius); + + Control control1 = Control::New(); + control1.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER); + control1.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER); + control1.SetProperty(Actor::Property::POSITION, sourcePosition); + control1.SetProperty(Actor::Property::SIZE, sourceSize); + control1.SetProperty(Actor::Property::SCALE, sourceScale); + control1.SetProperty(Actor::Property::COLOR, sourceColor); + control1.SetProperty(Actor::Property::OPACITY, sourceOpacity); + Property::Map controlProperty1; + controlProperty1.Insert(Toolkit::Visual::Property::TYPE, Toolkit::Visual::COLOR); + controlProperty1.Insert(Toolkit::ColorVisual::Property::MIX_COLOR, Vector4(1.0f, 0.0f, 0.0f, 1.0f)); + controlProperty1.Insert(Toolkit::DevelVisual::Property::CORNER_RADIUS, sourceRadius); + controlProperty1.Insert(Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, sourceBorderlineWidth); + controlProperty1.Insert(Toolkit::DevelVisual::Property::BORDERLINE_COLOR, sourceBorderlineColor); + controlProperty1.Insert(Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, sourceBorderlineOffset); + control1.SetProperty(Toolkit::Control::Property::BACKGROUND, controlProperty1); + + Control control2 = Control::New(); + control2.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER); + control2.SetProperty(Actor::Property::ANCHOR_POINT, ParentOrigin::CENTER); + control2.SetProperty(Actor::Property::POSITION, destinationPosition); + control2.SetProperty(Actor::Property::SIZE, destinationSize); + control2.SetProperty(Actor::Property::SCALE, destinationScale); + control2.SetProperty(Actor::Property::COLOR, destinationColor); + control2.SetProperty(Actor::Property::OPACITY, destinationOpacity); + Property::Map controlProperty2; + controlProperty2.Insert(Toolkit::Visual::Property::TYPE, Toolkit::Visual::COLOR); + controlProperty2.Insert(Toolkit::ColorVisual::Property::MIX_COLOR, Vector4(1.0f, 1.0f, 0.0f, 0.5f)); + controlProperty2.Insert(Toolkit::DevelVisual::Property::CORNER_RADIUS, destinationRadius); + controlProperty2.Insert(Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, destinationBorderlineWidth); + controlProperty2.Insert(Toolkit::DevelVisual::Property::BORDERLINE_COLOR, destinationBorderlineColor); + controlProperty2.Insert(Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, destinationBorderlineOffset); + control2.SetProperty(Toolkit::Control::Property::BACKGROUND, controlProperty2); + + DALI_TEST_EQUALS(destinationPosition, control2.GetProperty(Actor::Property::POSITION), TEST_LOCATION); + Property::Map backgroundMap = control2.GetProperty(Toolkit::Control::Property::BACKGROUND); + Vector4 cornerRadius = backgroundMap.Find(Toolkit::DevelVisual::Property::CORNER_RADIUS)->Get(); + DALI_TEST_EQUALS(destinationRadiusV4, cornerRadius, TEST_LOCATION); + float borderlineWidth = backgroundMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_WIDTH)->Get(); + DALI_TEST_EQUALS(destinationBorderlineWidth, borderlineWidth, TEST_LOCATION); + Vector4 borderlineColor = backgroundMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_COLOR)->Get(); + DALI_TEST_EQUALS(destinationBorderlineColor, borderlineColor, TEST_LOCATION); + float borderlineOffset = backgroundMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_OFFSET)->Get(); + DALI_TEST_EQUALS(destinationBorderlineOffset, borderlineOffset, TEST_LOCATION); + + application.GetScene().Add(control1); + application.GetScene().Add(control2); + + application.SendNotification(); + application.Render(20); + + Transition transition = Transition::New(control1, control2, false, TimePeriod(0.5f)); + TransitionSet transitionSet = TransitionSet::New(); + transitionSet.AddTransition(transition); + transitionSet.Play(); + + bool signalReceived(false); + TransitionFinishCheck finishCheck(signalReceived); + transitionSet.FinishedSignal().Connect(&application, finishCheck); + + application.SendNotification(); + application.Render(50); + + // We didn't expect the animation to finish yet + application.SendNotification(); + finishCheck.CheckSignalNotReceived(); + + DALI_TEST_NOT_EQUALS(destinationPosition, control1.GetCurrentProperty(Actor::Property::POSITION), 0.00001f, TEST_LOCATION); + DALI_TEST_EQUALS(1, control1.GetRendererCount(), TEST_LOCATION); + + Dali::Renderer renderer = control1.GetRendererAt(0); + Property::Index index = renderer.GetPropertyIndex(DevelVisual::Property::CORNER_RADIUS); + cornerRadius = renderer.GetCurrentProperty(index); + DALI_TEST_NOT_EQUALS(destinationRadiusV4, cornerRadius, 0.00001f, TEST_LOCATION); + + index = renderer.GetPropertyIndex(DevelVisual::Property::BORDERLINE_WIDTH); + borderlineWidth = renderer.GetCurrentProperty(index); + DALI_TEST_NOT_EQUALS(destinationBorderlineWidth, borderlineWidth, 0.00001f, TEST_LOCATION); + + index = renderer.GetPropertyIndex(DevelVisual::Property::BORDERLINE_COLOR); + borderlineColor = renderer.GetCurrentProperty(index); + DALI_TEST_NOT_EQUALS(destinationBorderlineColor, borderlineColor, 0.00001f, TEST_LOCATION); + + index = renderer.GetPropertyIndex(DevelVisual::Property::BORDERLINE_OFFSET); + borderlineOffset = renderer.GetCurrentProperty(index); + DALI_TEST_NOT_EQUALS(destinationBorderlineOffset, borderlineOffset, 0.00001f, TEST_LOCATION); + + application.SendNotification(); + application.Render(700); + + // We did expect the animation to finish + application.SendNotification(); + finishCheck.CheckSignalReceived(); + + // After the transition is finished, + // every current and renderer propeties of control1 are equal to destination properties. + DALI_TEST_EQUALS(destinationPosition, control1.GetCurrentProperty(Actor::Property::POSITION), TEST_LOCATION); + DALI_TEST_EQUALS(destinationSize, control1.GetCurrentProperty(Actor::Property::SIZE), TEST_LOCATION); + DALI_TEST_EQUALS(destinationScale, control1.GetCurrentProperty(Actor::Property::SCALE), TEST_LOCATION); + DALI_TEST_EQUALS(destinationColor, control1.GetCurrentProperty(Actor::Property::COLOR), TEST_LOCATION); + DALI_TEST_EQUALS(destinationOpacity, control1.GetCurrentProperty(Actor::Property::OPACITY), TEST_LOCATION); + + DALI_TEST_EQUALS(1, control1.GetRendererCount(), TEST_LOCATION); + renderer = control1.GetRendererAt(0); + index = renderer.GetPropertyIndex(DevelVisual::Property::CORNER_RADIUS); + cornerRadius = renderer.GetCurrentProperty(index); + DALI_TEST_EQUALS(destinationRadiusV4, cornerRadius, TEST_LOCATION); + + index = renderer.GetPropertyIndex(DevelVisual::Property::BORDERLINE_WIDTH); + borderlineWidth = renderer.GetCurrentProperty(index); + DALI_TEST_EQUALS(destinationBorderlineWidth, borderlineWidth, TEST_LOCATION); + + index = renderer.GetPropertyIndex(DevelVisual::Property::BORDERLINE_COLOR); + borderlineColor = renderer.GetCurrentProperty(index); + DALI_TEST_EQUALS(destinationBorderlineColor, borderlineColor, TEST_LOCATION); + + index = renderer.GetPropertyIndex(DevelVisual::Property::BORDERLINE_OFFSET); + borderlineOffset = renderer.GetCurrentProperty(index); + DALI_TEST_EQUALS(destinationBorderlineOffset, borderlineOffset, TEST_LOCATION); + + // every actor properties of control1 are returned to the source properties. + DALI_TEST_EQUALS(sourcePosition, control1.GetProperty(Actor::Property::POSITION), TEST_LOCATION); + DALI_TEST_EQUALS(sourceSize, control1.GetProperty(Actor::Property::SIZE), TEST_LOCATION); + DALI_TEST_EQUALS(sourceScale, control1.GetProperty(Actor::Property::SCALE), TEST_LOCATION); + DALI_TEST_EQUALS(sourceColor, control1.GetProperty(Actor::Property::COLOR), TEST_LOCATION); + DALI_TEST_EQUALS(sourceOpacity, control1.GetProperty(Actor::Property::OPACITY), TEST_LOCATION); + + application.SendNotification(); + application.Render(20); + + // after next update, renderer properties are returned to the source properties. + DALI_TEST_EQUALS(1, control1.GetRendererCount(), TEST_LOCATION); + renderer = control1.GetRendererAt(0); + index = renderer.GetPropertyIndex(DevelVisual::Property::CORNER_RADIUS); + cornerRadius = renderer.GetCurrentProperty(index); + DALI_TEST_EQUALS(sourceRadiusV4, cornerRadius, TEST_LOCATION); + + index = renderer.GetPropertyIndex(DevelVisual::Property::BORDERLINE_WIDTH); + borderlineWidth = renderer.GetCurrentProperty(index); + DALI_TEST_EQUALS(sourceBorderlineWidth, borderlineWidth, TEST_LOCATION); + + index = renderer.GetPropertyIndex(DevelVisual::Property::BORDERLINE_COLOR); + borderlineColor = renderer.GetCurrentProperty(index); + DALI_TEST_EQUALS(sourceBorderlineColor, borderlineColor, TEST_LOCATION); + + index = renderer.GetPropertyIndex(DevelVisual::Property::BORDERLINE_OFFSET); + borderlineOffset = renderer.GetCurrentProperty(index); + DALI_TEST_EQUALS(sourceBorderlineOffset, borderlineOffset, TEST_LOCATION); + + END_TEST; +} + int UtcDaliTransitionBetweenControlPairWithoutEmptySourceBackground(void) { ToolkitTestApplication application; @@ -377,7 +556,7 @@ int UtcDaliTransitionBetweenControlPairWithoutEmptySourceBackground(void) application.SendNotification(); application.Render(20); - Transition transition = Transition::New(control1, control2, TimePeriod(0.5f)); + Transition transition = Transition::New(control1, control2, true, TimePeriod(0.5f)); TransitionSet transitionSet = TransitionSet::New(); transitionSet.AddTransition(transition); transitionSet.Play(); @@ -474,7 +653,7 @@ int UtcDaliTransitionBetweenImageViewPair(void) Vector3 startWorldPosition = control1.GetProperty(Actor::Property::WORLD_POSITION); Vector3 finishWorldPosition = control2.GetProperty(Actor::Property::WORLD_POSITION); - Transition transition = Transition::New(control1, control2, TimePeriod(0.5f)); + Transition transition = Transition::New(control1, control2, true, TimePeriod(0.5f)); TransitionSet transitionSet = TransitionSet::New(); transitionSet.AddTransition(transition); transitionSet.Play(); @@ -562,7 +741,7 @@ int UtcDaliTransitionBetweenImageViewPairWithDelay(void) Vector3 startWorldPosition = control1.GetProperty(Actor::Property::WORLD_POSITION); Vector3 finishWorldPosition = control2.GetProperty(Actor::Property::WORLD_POSITION); - Transition transition = Transition::New(control1, control2, TimePeriod(0.5f, 0.5f)); + Transition transition = Transition::New(control1, control2, true, TimePeriod(0.5f, 0.5f)); TransitionSet transitionSet = TransitionSet::New(); transitionSet.AddTransition(transition); transitionSet.Play(); @@ -654,7 +833,7 @@ int UtcDaliTransitionBetweenControlPairWithTree(void) application.SendNotification(); application.Render(20); - Transition transition = Transition::New(control1, control2, TimePeriod(0.5f)); + Transition transition = Transition::New(control1, control2, true, TimePeriod(0.5f)); TransitionSet transitionSet = TransitionSet::New(); transitionSet.AddTransition(transition); transitionSet.Play(); @@ -721,7 +900,7 @@ int UtcDaliTransitionBetweenControlPairWithTreeWithChild(void) application.SendNotification(); application.Render(20); - Transition transition = Transition::New(control1, control2, TimePeriod(0.5f)); + Transition transition = Transition::New(control1, control2, true, TimePeriod(0.5f)); transition.TransitionWithChild(true); TransitionSet transitionSet = TransitionSet::New(); transitionSet.AddTransition(transition); @@ -801,7 +980,7 @@ int UtcDaliTransitionBetweenControlPairWithTreeWithoutPositionInheritance(void) control3.SetProperty(Actor::Property::INHERIT_ORIENTATION, true); control3.SetProperty(Actor::Property::INHERIT_SCALE, true); - transition = Transition::New(control1, control3, TimePeriod(0.5f)); + transition = Transition::New(control1, control3, true, TimePeriod(0.5f)); transitionSet = TransitionSet::New(); transitionSet.AddTransition(transition); transitionSet.Play(); @@ -892,7 +1071,7 @@ int UtcDaliTransitionBetweenControlPairWithTreeWithoutOrientationInheritance(voi bool signalReceived(false); TransitionFinishCheck finishCheck(signalReceived); - transition = Transition::New(control1, control3, TimePeriod(0.5f)); + transition = Transition::New(control1, control3, true, TimePeriod(0.5f)); transitionSet = TransitionSet::New(); transitionSet.AddTransition(transition); transitionSet.Play(); @@ -978,7 +1157,7 @@ int UtcDaliTransitionBetweenControlPairWithTreeWithoutScaleInheritance(void) bool signalReceived(false); TransitionFinishCheck finishCheck(signalReceived); - transition = Transition::New(control1, control3, TimePeriod(0.5f)); + transition = Transition::New(control1, control3, true, TimePeriod(0.5f)); transitionSet = TransitionSet::New(); transitionSet.AddTransition(transition); transitionSet.Play(); diff --git a/dali-toolkit/devel-api/controls/control-devel.cpp b/dali-toolkit/devel-api/controls/control-devel.cpp index 55becb3..dc7a128 100644 --- a/dali-toolkit/devel-api/controls/control-devel.cpp +++ b/dali-toolkit/devel-api/controls/control-devel.cpp @@ -122,19 +122,6 @@ Dali::Property GetVisualProperty(Control control, Dali::Property::Index index, D return controlDataImpl.GetVisualProperty(index, visualPropertyKey); } -void CreateTransitions(Control control, Dali::Animation& animation, Dali::Toolkit::Control source, AlphaFunction alphaFunction, TimePeriod timePeriod) -{ - if(animation) - { - // make visual transition of control visual. - Internal::Control& internalControl = Toolkit::Internal::GetImplementation(control); - Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get(internalControl); - controlDataImpl.MakeVisualTransition(animation, source, Toolkit::Control::Property::BACKGROUND, alphaFunction, timePeriod); - controlDataImpl.MakeVisualTransition(animation, source, Toolkit::DevelControl::Property::SHADOW, alphaFunction, timePeriod); - internalControl.OnCreateTransitions(animation, source, alphaFunction, timePeriod); - } -} - static Toolkit::Internal::Control::Impl* GetControlImplementation(Dali::Actor actor) { Dali::Toolkit::Control control = Toolkit::Control::DownCast(actor); diff --git a/dali-toolkit/devel-api/controls/control-devel.h b/dali-toolkit/devel-api/controls/control-devel.h index 36b83f9..8877646 100644 --- a/dali-toolkit/devel-api/controls/control-devel.h +++ b/dali-toolkit/devel-api/controls/control-devel.h @@ -371,20 +371,6 @@ DALI_TOOLKIT_API VisualEventSignalType& VisualEventSignal(Control control); DALI_TOOLKIT_API Dali::Property GetVisualProperty(Control control, Dali::Property::Index index, Dali::Property::Key visualPropertyKey); /** - * @brief Retrieve visual/renderer property animation between this Control and source control. - * Input animation must be created before this method called. - * And the animations between this method created are added the input animation. - * This method generates visual/renderer property animation but not creates Actor property animation. - * - * @param[in] control The control - * @param[in] animation generated animation - * @param[in] source source control of the animation. - * @param[in] alphaFunction AlphaFunction of the animation - * @param[in] timePeriod TimePeriod of the animation - */ -DALI_TOOLKIT_API void CreateTransitions(Control control, Dali::Animation& animation, Dali::Toolkit::Control source, AlphaFunction alphaFunction, TimePeriod timePeriod); - -/** * @brief The signal is emmited as a succession of "activate" signal send by accessibility client. * @return The signal to connect to */ diff --git a/dali-toolkit/internal/controls/control/control-data-impl.cpp b/dali-toolkit/internal/controls/control/control-data-impl.cpp index f9f4376..b81149c 100644 --- a/dali-toolkit/internal/controls/control/control-data-impl.cpp +++ b/dali-toolkit/internal/controls/control/control-data-impl.cpp @@ -36,6 +36,7 @@ #include // INTERNAL INCLUDES +#include #include #include #include @@ -1970,115 +1971,46 @@ Dali::Property Control::Impl::GetVisualProperty(Dali::Property::Index index, Dal return Dali::Property(handle, Property::INVALID_INDEX); } -void Control::Impl::MakeVisualTransition(Dali::Animation& animation, Dali::Toolkit::Control source, Dali::Property::Index visualIndex, AlphaFunction alphaFunction, TimePeriod timePeriod) +void Control::Impl::CreateTransitions(std::vector>& sourceProperties, + std::vector>& destinationProperties, + Dali::Toolkit::Control source, Dali::Toolkit::Control destination) { - Dali::Toolkit::Control sourceHandle = Dali::Toolkit::Control::DownCast(source); - Property::Map sourceMap = sourceHandle.GetProperty(visualIndex); - Dali::Toolkit::Control destinationHandle = Dali::Toolkit::Control::DownCast(mControlImpl.Self()); - Property::Map destinationMap = destinationHandle.GetProperty(visualIndex); - - Vector4 mixColor(1.0f, 1.0f, 1.0f, 1.0f); - Vector4 cornerRadius(0.0f, 0.0f, 0.0f, 0.0f); - float borderlineWidth(0.0f); - Vector4 borderlineColor(0.0f, 0.0f, 0.0f, 1.0f); - float borderlineOffset(0.0f); - - if(!destinationMap.Empty()) + // Retrieves background properties to be transitioned. + Dali::Property::Map backgroundSourcePropertyMap, backgroundDestinationPropertyMap; + mControlImpl.MakeVisualTransition(backgroundSourcePropertyMap, backgroundDestinationPropertyMap, source, destination, Toolkit::Control::Property::BACKGROUND); + if(backgroundSourcePropertyMap.Count() > 0) { - static auto findValueVector4 = [](const Property::Map& map, Property::Index index, const Vector4& defaultValue = Vector4()) -> Vector4 { - Property::Value* propertyValue = map.Find(index); - if(propertyValue) - { - return propertyValue->Get(); - } - return defaultValue; - }; - - static auto findValueFloat = [](const Property::Map& map, Property::Index index, const float& defaultValue = 0.0f) -> float { - Property::Value* propertyValue = map.Find(index); - if(propertyValue) - { - return propertyValue->Get(); - } - return defaultValue; - }; - - mixColor = findValueVector4(destinationMap, Dali::Toolkit::Visual::Property::MIX_COLOR, mixColor); - cornerRadius = findValueVector4(destinationMap, Toolkit::DevelVisual::Property::CORNER_RADIUS, cornerRadius); - borderlineWidth = findValueFloat(destinationMap, Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, borderlineWidth); - borderlineColor = findValueVector4(destinationMap, Toolkit::DevelVisual::Property::BORDERLINE_COLOR, borderlineColor); - borderlineOffset = findValueFloat(destinationMap, Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, borderlineOffset); - - if(sourceMap.Empty()) - { - sourceMap.Insert(Toolkit::Visual::Property::TYPE, Toolkit::Visual::COLOR); - sourceMap.Insert(Dali::Toolkit::Visual::Property::MIX_COLOR, Color::TRANSPARENT); - sourceMap.Insert(Toolkit::DevelVisual::Property::CORNER_RADIUS, cornerRadius); - sourceMap.Insert(Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, borderlineWidth); - sourceMap.Insert(Toolkit::DevelVisual::Property::BORDERLINE_COLOR, borderlineColor); - sourceMap.Insert(Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, borderlineOffset); - } - - Vector4 sourceMixColor = findValueVector4(sourceMap, Dali::Toolkit::Visual::Property::MIX_COLOR, mixColor); - Vector4 sourceCornerRadius = findValueVector4(sourceMap, Toolkit::DevelVisual::Property::CORNER_RADIUS, cornerRadius); - float sourceBorderlineWidth = findValueFloat(sourceMap, Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, borderlineWidth); - Vector4 sourceBorderlineColor = findValueVector4(sourceMap, Toolkit::DevelVisual::Property::BORDERLINE_COLOR, borderlineColor); - float sourceBorderlineOffset = findValueFloat(sourceMap, Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, borderlineOffset); - - std::vector properties; - std::vector> values; - - if(Vector3(sourceMixColor) != Vector3(mixColor)) - { - properties.push_back(GetVisualProperty(visualIndex, Dali::Toolkit::Visual::Property::MIX_COLOR)); - values.push_back(std::make_pair(Vector3(sourceMixColor), Vector3(mixColor))); - } - - if(std::abs(sourceMixColor.a - mixColor.a) > Math::MACHINE_EPSILON_1) - { - properties.push_back(GetVisualProperty(visualIndex, Dali::Toolkit::Visual::Property::OPACITY)); - values.push_back(std::make_pair(sourceMixColor.a, mixColor.a)); - } - - if(sourceCornerRadius != cornerRadius) - { - properties.push_back(GetVisualProperty(visualIndex, Dali::Toolkit::DevelVisual::Property::CORNER_RADIUS)); - values.push_back(std::make_pair(sourceCornerRadius, cornerRadius)); - } + sourceProperties.push_back(std::pair(Toolkit::Control::Property::BACKGROUND, backgroundSourcePropertyMap)); + destinationProperties.push_back(std::pair(Toolkit::Control::Property::BACKGROUND, backgroundDestinationPropertyMap)); + } - if(sourceBorderlineWidth != borderlineWidth) - { - properties.push_back(GetVisualProperty(visualIndex, Dali::Toolkit::DevelVisual::Property::BORDERLINE_WIDTH)); - values.push_back(std::make_pair(sourceBorderlineWidth, borderlineWidth)); - } + // Retrieves shadow properties to be transitioned. + Dali::Property::Map shadowSourcePropertyMap, shadowDestinationPropertyMap; + mControlImpl.MakeVisualTransition(shadowSourcePropertyMap, shadowDestinationPropertyMap, source, destination, Toolkit::DevelControl::Property::SHADOW); + if(shadowSourcePropertyMap.Count() > 0) + { + sourceProperties.push_back(std::pair(Toolkit::DevelControl::Property::SHADOW, shadowSourcePropertyMap)); + destinationProperties.push_back(std::pair(Toolkit::DevelControl::Property::SHADOW, shadowDestinationPropertyMap)); + } - if(sourceBorderlineColor != borderlineColor) - { - properties.push_back(GetVisualProperty(visualIndex, Dali::Toolkit::DevelVisual::Property::BORDERLINE_COLOR)); - values.push_back(std::make_pair(sourceBorderlineColor, borderlineColor)); - } + // Retrieves transition from inherited class. + mControlImpl.OnCreateTransitions(sourceProperties, destinationProperties, source, destination); +} - if(sourceBorderlineOffset != borderlineOffset) +void Control::Impl::UpdateVisualProperties(const std::vector>& properties) +{ + for(auto&& data : properties) + { + if(data.first == Toolkit::Control::Property::BACKGROUND) { - properties.push_back(GetVisualProperty(visualIndex, Dali::Toolkit::DevelVisual::Property::BORDERLINE_OFFSET)); - values.push_back(std::make_pair(sourceBorderlineOffset, borderlineOffset)); + DoAction(Toolkit::Control::Property::BACKGROUND, DevelVisual::Action::UPDATE_PROPERTY, data.second); } - - for(uint32_t i = 0; i < properties.size(); ++i) + else if(data.first == Toolkit::DevelControl::Property::SHADOW) { - if(timePeriod.delaySeconds > 0.0f) - { - Dali::KeyFrames initialKeyframes = Dali::KeyFrames::New(); - initialKeyframes.Add(0.0f, values[i].first); - initialKeyframes.Add(1.0f, values[i].first); - animation.AnimateBetween(properties[i], initialKeyframes, TimePeriod(timePeriod.delaySeconds)); - } - Dali::KeyFrames keyframes = Dali::KeyFrames::New(); - keyframes.Add(0.0f, values[i].first); - keyframes.Add(1.0f, values[i].second); - animation.AnimateBetween(properties[i], keyframes, alphaFunction, timePeriod); + DoAction(Toolkit::DevelControl::Property::SHADOW, DevelVisual::Action::UPDATE_PROPERTY, data.second); } } + mControlImpl.OnUpdateVisualProperties(properties); } void Control::Impl::EmitResourceReadySignal() diff --git a/dali-toolkit/internal/controls/control/control-data-impl.h b/dali-toolkit/internal/controls/control/control-data-impl.h index 94da0fc..55c49a6 100644 --- a/dali-toolkit/internal/controls/control/control-data-impl.h +++ b/dali-toolkit/internal/controls/control/control-data-impl.h @@ -393,16 +393,32 @@ public: Dali::Property GetVisualProperty(Dali::Property::Index index, Dali::Property::Key visualPropertyKey); /** - * @brief Make visual transition from source control to this control about specific Property::Index - * If both of source and this control have Property::Index property, than create animation between them. + * @brief Retrieves source and destination visual properties for the Transition of this Control. + * The properties of this Control will be transitioned from the propeties of source Control to that of destination control. + * If a property value is different between source and destination Control, + * the property information of each Control will be included in sourceProperties and destinationProperties. * - * @param[in] animation Return animation from source to this control. - * @param[in] source Source control to be used property animation. - * @param[in] visualIndex Property::Index to make animation. - * @param[in] alphaFunction alpha function of the animation. - * @param[in] timePeriod time period of the animation. + * @param[out] sourceProperties Source property list to be applied on this Control. + * @param[out] destinationProperties Destination property list to be applied on this Control. + * @param[in] source Source control of the animation. + * @param[in] destination Destination control of the animation. + * + * @note This method do not handle Actor properties. + * And the size and order of the sourceProperties and destinationProperties must be synchronized. + * + * This method triggers Control::OnCreateTransition(). + */ + void CreateTransitions(std::vector>& sourceProperties, + std::vector>& destinationProperties, + Dali::Toolkit::Control source, Dali::Toolkit::Control destination); + + /** + * @brief Update visual properties. + * @param[in] properties Property list to be used to update visual properties of this Control. + * + * @note This method triggers Control::OnUpdateVisualProperties(). */ - void MakeVisualTransition(Dali::Animation& animation, Dali::Toolkit::Control source, Dali::Property::Index visualIndex, AlphaFunction alphaFunction, TimePeriod timePeriod); + void UpdateVisualProperties(const std::vector>& properties); /** * @brief Gets the current control's accessible object. diff --git a/dali-toolkit/internal/controls/image-view/image-view-impl.cpp b/dali-toolkit/internal/controls/image-view/image-view-impl.cpp index e3701ec..1a653a1 100644 --- a/dali-toolkit/internal/controls/image-view/image-view-impl.cpp +++ b/dali-toolkit/internal/controls/image-view/image-view-impl.cpp @@ -24,6 +24,7 @@ #include // INTERNAL INCLUDES +#include #include #include #include @@ -284,114 +285,36 @@ void ImageView::OnRelayout(const Vector2& size, RelayoutContainer& container) } } -void ImageView::OnCreateTransitions(Dali::Animation& animation, Dali::Toolkit::Control source, AlphaFunction alphaFunction, TimePeriod timePeriod) +void ImageView::OnCreateTransitions(std::vector>& sourceProperties, + std::vector>& destinationProperties, + Dali::Toolkit::Control source, + Dali::Toolkit::Control destination) { - Dali::Toolkit::ImageView destinationHandle = Toolkit::ImageView(GetOwner()); - Toolkit::Visual::Base destinationVisual = DevelControl::GetVisual(GetImplementation(destinationHandle), Toolkit::ImageView::Property::IMAGE); - Property::Map destinationMap; - - if(!destinationVisual) - { - return; - } - - destinationVisual.CreatePropertyMap(destinationMap); - - static auto findValueVector4 = [](const Property::Map& map, Property::Index index, const Vector4& defaultValue = Vector4()) -> Vector4 { - Property::Value* propertyValue = map.Find(index); - if(propertyValue) - { - return propertyValue->Get(); - } - return defaultValue; - }; - - static auto findValueFloat = [](const Property::Map& map, Property::Index index, const float& defaultValue = 0.0f) -> float { - Property::Value* propertyValue = map.Find(index); - if(propertyValue) - { - return propertyValue->Get(); - } - return defaultValue; - }; - - Vector4 sourceMixColor(0.0f, 0.0f, 0.0f, 0.0f); - Vector4 sourceCornerRadius(0.0f, 0.0f, 0.0f, 0.0f); - float sourceBorderlineWidth(0.0f); - Vector4 sourceBorderlineColor(0.0f, 0.0f, 0.0f, 1.0f); - float sourceBorderlineOffset(0.0f); - Vector4 destinationMixColor = findValueVector4(destinationMap, Dali::Toolkit::Visual::Property::MIX_COLOR, sourceMixColor); - Vector4 destinationCornerRadius = findValueVector4(destinationMap, Toolkit::DevelVisual::Property::CORNER_RADIUS, sourceCornerRadius); - float destinationBorderlineWidth = findValueFloat(destinationMap, Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, sourceBorderlineWidth); - Vector4 destinationBorderlineColor = findValueVector4(destinationMap, Toolkit::DevelVisual::Property::BORDERLINE_COLOR, sourceBorderlineColor); - float destinationBorderlineOffset = findValueFloat(destinationMap, Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, sourceBorderlineOffset); - - Dali::Toolkit::ImageView sourceHandle = Dali::Toolkit::ImageView::DownCast(source); - Toolkit::Visual::Base sourceVisual; - Property::Map sourceMap; - - if(sourceHandle) - { - sourceVisual = DevelControl::GetVisual(GetImplementation(sourceHandle), Toolkit::ImageView::Property::IMAGE); - } - - if(sourceVisual) + // Retrieves image properties to be transitioned. + Dali::Property::Map imageSourcePropertyMap, imageDestinationPropertyMap; + MakeVisualTransition(imageSourcePropertyMap, imageDestinationPropertyMap, source, destination, Toolkit::ImageView::Property::IMAGE); + if(imageSourcePropertyMap.Count() > 0) { - sourceVisual.CreatePropertyMap(sourceMap); - sourceMixColor = findValueVector4(sourceMap, Dali::Toolkit::Visual::Property::MIX_COLOR, sourceMixColor); - sourceCornerRadius = findValueVector4(sourceMap, Toolkit::DevelVisual::Property::CORNER_RADIUS, sourceCornerRadius); - sourceBorderlineWidth = findValueFloat(sourceMap, Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, sourceBorderlineWidth); - sourceBorderlineColor = findValueVector4(sourceMap, Toolkit::DevelVisual::Property::BORDERLINE_COLOR, sourceBorderlineColor); - sourceBorderlineOffset = findValueFloat(sourceMap, Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, sourceBorderlineOffset); + sourceProperties.push_back(std::pair(Toolkit::ImageView::Property::IMAGE, imageSourcePropertyMap)); + destinationProperties.push_back(std::pair(Toolkit::ImageView::Property::IMAGE, imageDestinationPropertyMap)); } +} - std::vector properties; - std::vector> values; - - if(Vector3(sourceMixColor) != Vector3(destinationMixColor)) - { - properties.push_back(DevelControl::GetVisualProperty(destinationHandle, Toolkit::ImageView::Property::IMAGE, Toolkit::Visual::Property::MIX_COLOR)); - values.push_back(std::make_pair(Vector3(sourceMixColor), Vector3(destinationMixColor))); - } - if(std::abs(sourceMixColor.a - destinationMixColor.a) > Math::MACHINE_EPSILON_1) - { - properties.push_back(DevelControl::GetVisualProperty(destinationHandle, Toolkit::ImageView::Property::IMAGE, Toolkit::Visual::Property::OPACITY)); - values.push_back(std::make_pair(sourceMixColor.a, destinationMixColor.a)); - } - if(sourceCornerRadius != destinationCornerRadius) - { - properties.push_back(DevelControl::GetVisualProperty(destinationHandle, Toolkit::ImageView::Property::IMAGE, Toolkit::DevelVisual::Property::CORNER_RADIUS)); - values.push_back(std::make_pair(sourceCornerRadius, destinationCornerRadius)); - } - if(sourceBorderlineWidth != destinationBorderlineWidth) - { - properties.push_back(DevelControl::GetVisualProperty(destinationHandle, Toolkit::ImageView::Property::IMAGE, Toolkit::DevelVisual::Property::BORDERLINE_WIDTH)); - values.push_back(std::make_pair(sourceBorderlineWidth, destinationBorderlineWidth)); - } - if(sourceBorderlineColor != destinationBorderlineColor) - { - properties.push_back(DevelControl::GetVisualProperty(destinationHandle, Toolkit::ImageView::Property::IMAGE, Toolkit::DevelVisual::Property::BORDERLINE_COLOR)); - values.push_back(std::make_pair(sourceBorderlineColor, destinationBorderlineColor)); - } - if(sourceBorderlineOffset != destinationBorderlineOffset) +void ImageView::OnUpdateVisualProperties(const std::vector>& properties) +{ + Toolkit::Visual::Base visual = DevelControl::GetVisual(*this, Toolkit::ImageView::Property::IMAGE); + if(visual) { - properties.push_back(DevelControl::GetVisualProperty(destinationHandle, Toolkit::ImageView::Property::IMAGE, Toolkit::DevelVisual::Property::BORDERLINE_OFFSET)); - values.push_back(std::make_pair(sourceBorderlineOffset, destinationBorderlineOffset)); - } + Dali::Toolkit::Control handle(GetOwner()); - for(uint32_t i = 0; i < properties.size(); ++i) - { - if(timePeriod.delaySeconds > 0.0f) + for(auto&& data : properties) { - Dali::KeyFrames initialKeyframes = Dali::KeyFrames::New(); - initialKeyframes.Add(0.0f, values[i].first); - initialKeyframes.Add(1.0f, values[i].first); - animation.AnimateBetween(properties[i], initialKeyframes, TimePeriod(timePeriod.delaySeconds)); + if(data.first == Toolkit::ImageView::Property::IMAGE) + { + DevelControl::DoAction(handle, Toolkit::ImageView::Property::IMAGE, DevelVisual::Action::UPDATE_PROPERTY, data.second); + break; + } } - Dali::KeyFrames keyframes = Dali::KeyFrames::New(); - keyframes.Add(0.0f, values[i].first); - keyframes.Add(1.0f, values[i].second); - animation.AnimateBetween(properties[i], keyframes, alphaFunction, timePeriod); } } diff --git a/dali-toolkit/internal/controls/image-view/image-view-impl.h b/dali-toolkit/internal/controls/image-view/image-view-impl.h index 023930e..ef48839 100644 --- a/dali-toolkit/internal/controls/image-view/image-view-impl.h +++ b/dali-toolkit/internal/controls/image-view/image-view-impl.h @@ -136,7 +136,15 @@ private: // From Control /** * @copydoc Toolkit::Control::OnCreateTransitions() */ - virtual void OnCreateTransitions(Dali::Animation& animation, Dali::Toolkit::Control source, AlphaFunction alphaFunction, TimePeriod timePeriod) override; + virtual void OnCreateTransitions(std::vector>& sourceProperties, + std::vector>& destinationProperties, + Dali::Toolkit::Control source, + Dali::Toolkit::Control destination) override; + + /** + * @copydoc Toolkit::Control::OnUpdateVisualProperties() + */ + virtual void OnUpdateVisualProperties(const std::vector>& properties) override; private: /** diff --git a/dali-toolkit/internal/transition/transition-impl.cpp b/dali-toolkit/internal/transition/transition-impl.cpp index 2cbd14d..fbe1789 100644 --- a/dali-toolkit/internal/transition/transition-impl.cpp +++ b/dali-toolkit/internal/transition/transition-impl.cpp @@ -27,6 +27,7 @@ // INTERNAL INCLUDES #include +#include namespace Dali { @@ -37,10 +38,9 @@ namespace Internal namespace { const Dali::AlphaFunction DEFAULT_ALPHA_FUNCTION(Dali::AlphaFunction::DEFAULT); - } // anonymous namespace -TransitionPtr Transition::New(Dali::Toolkit::Control source, Dali::Toolkit::Control destination, TimePeriod timePeriod) +TransitionPtr Transition::New(Dali::Toolkit::Control source, Dali::Toolkit::Control destination, bool useDestinationTarget, TimePeriod timePeriod) { float delaySeconds = timePeriod.delaySeconds; if(delaySeconds < 0.0f) @@ -56,7 +56,7 @@ TransitionPtr Transition::New(Dali::Toolkit::Control source, Dali::Toolkit::Cont durationSeconds = 0.0f; } - TransitionPtr transition = new Transition(source, destination, TimePeriod(delaySeconds, durationSeconds)); + TransitionPtr transition = new Transition(source, destination, useDestinationTarget, TimePeriod(delaySeconds, durationSeconds)); // Second-phase construction transition->Initialize(); @@ -64,12 +64,14 @@ TransitionPtr Transition::New(Dali::Toolkit::Control source, Dali::Toolkit::Cont return transition; } -Transition::Transition(Dali::Toolkit::Control source, Dali::Toolkit::Control destination, TimePeriod timePeriod) +Transition::Transition(Dali::Toolkit::Control source, Dali::Toolkit::Control destination, bool useDestinationTarget, TimePeriod timePeriod) : TransitionBase(), + mUseDestinationTarget(useDestinationTarget), + mOriginalSize(), mSourceControl(source), mDestinationControl(destination) { - SetTarget(destination); + SetTarget(mUseDestinationTarget ? destination : source); SetTimePeriod(timePeriod); SetPairTransition(true); } @@ -90,16 +92,15 @@ void Transition::OnPlay() } //Make startPropertyMap and finishPropertyMap to use for property animation. - Matrix sourceWorldTransform = sourceControl[Dali::Actor::Property::WORLD_MATRIX]; + Matrix sourceWorldTransform = GetWorldTransform(sourceControl); Vector3 sourcePosition, sourceScale; Quaternion sourceOrientation; sourceWorldTransform.GetTransformComponents(sourcePosition, sourceOrientation, sourceScale); - Vector3 destinationPosition = destinationControl[Dali::Actor::Property::POSITION]; - Vector3 destinationScale = destinationControl[Dali::Actor::Property::SCALE]; - Quaternion destinationOrientation = destinationControl[Dali::Actor::Property::ORIENTATION]; - Vector4 targetColor = destinationControl[Dali::Actor::Property::COLOR]; - Vector3 targetSize = destinationControl[Dali::Actor::Property::SIZE]; + Matrix destinationWorldTransform = GetWorldTransform(destinationControl); + Vector3 destinationPosition, destinationScale; + Quaternion destinationOrientation; + destinationWorldTransform.GetTransformComponents(destinationPosition, destinationOrientation, destinationScale); Property::Map startPropertyMap; Property::Map finishPropertyMap; @@ -114,29 +115,36 @@ void Transition::OnPlay() startPropertyMap.Insert(Dali::Actor::Property::SCALE, sourceScale); finishPropertyMap.Insert(Dali::Actor::Property::SCALE, destinationScale); - Vector4 sourceColor = sourceControl.GetCurrentProperty(Dali::Actor::Property::WORLD_COLOR); + Vector4 sourceColor = GetWorldColor(sourceControl); + Vector4 destinationColor = GetWorldColor(destinationControl); startPropertyMap.Insert(Dali::Actor::Property::COLOR, sourceColor); - finishPropertyMap.Insert(Dali::Actor::Property::COLOR, targetColor); + finishPropertyMap.Insert(Dali::Actor::Property::COLOR, destinationColor); // Set animation for other properties if source and destination is different. - Vector3 sourceSize = sourceControl.GetCurrentProperty(Dali::Actor::Property::SIZE); - if(sourceSize != targetSize) + Vector3 sourceSize = sourceControl.GetCurrentProperty(Dali::Actor::Property::SIZE); + Vector3 destinationSize = destinationControl[Dali::Actor::Property::SIZE]; + if(sourceSize != destinationSize) { startPropertyMap.Insert(Dali::Actor::Property::SIZE, sourceSize); - finishPropertyMap.Insert(Dali::Actor::Property::SIZE, targetSize); + finishPropertyMap.Insert(Dali::Actor::Property::SIZE, destinationSize); + if(!mUseDestinationTarget) + { + mOriginalSize = GetTargetControl().GetProperty(Dali::Actor::Property::SIZE); + } } SetStartPropertyMap(startPropertyMap); SetFinishPropertyMap(finishPropertyMap); // source View becomes transparent during transition. + Dali::Toolkit::Control waitingControl = GetWaitingControl(); if(IsTransitionWithChild()) { - sourceControl[Dali::Actor::Property::VISIBLE] = false; + waitingControl[Dali::Actor::Property::VISIBLE] = false; } else { - GetImplementation(sourceControl).SetTransparent(true); + GetImplementation(waitingControl).SetTransparent(true); } Dali::Animation animation = GetAnimation(); @@ -145,27 +153,82 @@ void Transition::OnPlay() DALI_LOG_ERROR("animation is still not initialized\n"); return; } - Dali::Toolkit::DevelControl::CreateTransitions(destinationControl, animation, sourceControl, GetAlphaFunction(), GetTimePeriod()); + + mOriginalVisualProperties.clear(); + std::vector> destinationVisualProperties; + Dali::Toolkit::Control targetControl = GetTargetControl(); + Internal::Control& internalControl = Toolkit::Internal::GetImplementation(targetControl); + Internal::Control::Impl& controlDataImpl = Toolkit::Internal::Control::Impl::Get(internalControl); + controlDataImpl.CreateTransitions(mOriginalVisualProperties, destinationVisualProperties, sourceControl, destinationControl); + + for(uint32_t index = 0; index < mOriginalVisualProperties.size(); ++index) + { + Dali::Property::Map source = mOriginalVisualProperties[index].second; + Dali::Property::Map destination = destinationVisualProperties[index].second; + for(size_t i = 0; i < source.Count(); ++i) + { + Dali::Property property = DevelControl::GetVisualProperty(targetControl, mOriginalVisualProperties[index].first, source.GetKeyAt(i)); + if(GetTimePeriod().delaySeconds > 0.0f) + { + Dali::KeyFrames initialKeyframes = Dali::KeyFrames::New(); + initialKeyframes.Add(0.0f, source.GetValue(i)); + animation.AnimateBetween(property, initialKeyframes, TimePeriod(GetTimePeriod().delaySeconds)); + } + Dali::KeyFrames keyframes = Dali::KeyFrames::New(); + keyframes.Add(0.0f, source.GetValue(i)); + keyframes.Add(1.0f, destination.GetValue(i)); + animation.AnimateBetween(property, keyframes, GetAlphaFunction(), GetTimePeriod()); + } + } } void Transition::OnFinished() { - Dali::Toolkit::Control sourceControl = mSourceControl.GetHandle(); - if(!sourceControl) + Dali::Toolkit::Control waitingControl = GetWaitingControl(); + if(!waitingControl) { return; } + if(!mUseDestinationTarget) + { + Dali::Toolkit::Control target = GetTargetControl(); + Dali::Animation resetAnimation = Dali::Animation::New(0.0f); + if(mOriginalSize != target.GetProperty(Dali::Actor::Property::SIZE)) + { + // Use Animation not to notify size change and not to change width and height resize policy. + resetAnimation.AnimateTo(Dali::Property(target, Dali::Actor::Property::SIZE), mOriginalSize); + } + resetAnimation.Play(); + + Dali::Toolkit::Control targetControl = GetTargetControl(); + Internal::Control& internalControl = Toolkit::Internal::GetImplementation(targetControl); + Internal::Control::Impl& controlDataImpl = Toolkit::Internal::Control::Impl::Get(internalControl); + controlDataImpl.UpdateVisualProperties(mOriginalVisualProperties); + } + if(IsTransitionWithChild()) { - sourceControl[Dali::Actor::Property::VISIBLE] = true; + waitingControl[Dali::Actor::Property::VISIBLE] = true; } else { - GetImplementation(sourceControl).SetTransparent(false); + GetImplementation(waitingControl).SetTransparent(false); } } +Dali::Toolkit::Control Transition::GetTargetControl() +{ + Dali::Toolkit::Control target = mUseDestinationTarget ? mDestinationControl.GetHandle() : mSourceControl.GetHandle(); + return target; +} + +Dali::Toolkit::Control Transition::GetWaitingControl() +{ + Dali::Toolkit::Control waitingControl = mUseDestinationTarget ? mSourceControl.GetHandle() : mDestinationControl.GetHandle(); + return waitingControl; +} + } // namespace Internal } // namespace Toolkit diff --git a/dali-toolkit/internal/transition/transition-impl.h b/dali-toolkit/internal/transition/transition-impl.h index 6aa1374..7230e2b 100644 --- a/dali-toolkit/internal/transition/transition-impl.h +++ b/dali-toolkit/internal/transition/transition-impl.h @@ -41,10 +41,11 @@ public: * @brief Create a new Transition object. * @param[in] source A source control of this transition. * @param[in] destination A destination control of this transition. + * @param[in] useDestinationTarget True if this transition uses destination control as target. * @param[in] timePeriod The timePeriod of the animation. * @return A smart-pointer to the newly allocated Transition. */ - static TransitionPtr New(Dali::Toolkit::Control source, Dali::Toolkit::Control destination, TimePeriod timePeriod); + static TransitionPtr New(Dali::Toolkit::Control source, Dali::Toolkit::Control destination, bool useDestinationTarget, TimePeriod timePeriod); protected: /** @@ -63,6 +64,7 @@ protected: */ Transition(Dali::Toolkit::Control source, Dali::Toolkit::Control destination, + bool useDestinationTarget, TimePeriod timePeriod); /** @@ -78,8 +80,15 @@ private: Transition& operator=(const Transition& rhs); private: - WeakHandle mSourceControl; - WeakHandle mDestinationControl; + Dali::Toolkit::Control GetTargetControl(); + Dali::Toolkit::Control GetWaitingControl(); + +private: + bool mUseDestinationTarget; + Vector3 mOriginalSize; + std::vector> mOriginalVisualProperties; + WeakHandle mSourceControl; + WeakHandle mDestinationControl; }; } // namespace Internal diff --git a/dali-toolkit/internal/visuals/visual-base-impl.cpp b/dali-toolkit/internal/visuals/visual-base-impl.cpp index f155b86..f0a7af4 100644 --- a/dali-toolkit/internal/visuals/visual-base-impl.cpp +++ b/dali-toolkit/internal/visuals/visual-base-impl.cpp @@ -295,6 +295,11 @@ void Visual::Base::SetProperties(const Property::Map& propertyMap) { mImpl->mBorderlineWidth = width; } + + if(mImpl->mBorderlineWidthIndex != Property::INVALID_INDEX) + { + mImpl->mRenderer.SetProperty(mImpl->mBorderlineWidthIndex, mImpl->mBorderlineWidth); + } break; } case Toolkit::DevelVisual::Property::BORDERLINE_COLOR: @@ -304,6 +309,11 @@ void Visual::Base::SetProperties(const Property::Map& propertyMap) { mImpl->mBorderlineColor = color; } + + if(mImpl->mBorderlineColorIndex != Property::INVALID_INDEX) + { + mImpl->mRenderer.SetProperty(mImpl->mBorderlineColorIndex, mImpl->mBorderlineColor); + } break; } case Toolkit::DevelVisual::Property::BORDERLINE_OFFSET: @@ -313,6 +323,11 @@ void Visual::Base::SetProperties(const Property::Map& propertyMap) { mImpl->mBorderlineOffset = offset; } + + if(mImpl->mBorderlineOffsetIndex != Property::INVALID_INDEX) + { + mImpl->mRenderer.SetProperty(mImpl->mBorderlineOffsetIndex, mImpl->mBorderlineOffset); + } break; } case Toolkit::DevelVisual::Property::CORNER_RADIUS: @@ -338,6 +353,11 @@ void Visual::Base::SetProperties(const Property::Map& propertyMap) mImpl->mCornerRadius = Vector4(radius, radius, radius, radius); } } + + if(mImpl->mCornerRadiusIndex != Property::INVALID_INDEX) + { + mImpl->mRenderer.SetProperty(mImpl->mCornerRadiusIndex, mImpl->mCornerRadius); + } break; } case Toolkit::DevelVisual::Property::CORNER_RADIUS_POLICY: diff --git a/dali-toolkit/public-api/controls/control-impl.cpp b/dali-toolkit/public-api/controls/control-impl.cpp index 548e45e..64745d0 100644 --- a/dali-toolkit/public-api/controls/control-impl.cpp +++ b/dali-toolkit/public-api/controls/control-impl.cpp @@ -702,6 +702,102 @@ 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) +{ + sourcePropertyMap.Clear(); + destinationPropertyMap.Clear(); + + Toolkit::Visual::Base sourceVisual = DevelControl::GetVisual(GetImplementation(source), visualIndex); + Toolkit::Visual::Base destinationVisual = DevelControl::GetVisual(GetImplementation(destination), visualIndex); + + // If source or destination doesn't have the visual, do not create transition for the visual. + if(!sourceVisual || !destinationVisual) + { + return; + } + + Property::Map sourceMap; + Property::Map destinationMap; + sourceVisual.CreatePropertyMap(sourceMap); + destinationVisual.CreatePropertyMap(destinationMap); + + static auto findValueVector4 = [](const Property::Map& map, Property::Index index, const Vector4& defaultValue = Vector4()) -> Vector4 + { + Property::Value* propertyValue = map.Find(index); + if(propertyValue) + { + return propertyValue->Get(); + } + return defaultValue; + }; + + static auto findValueFloat = [](const Property::Map& map, Property::Index index, const float& defaultValue = 0.0f) -> float + { + Property::Value* propertyValue = map.Find(index); + if(propertyValue) + { + return propertyValue->Get(); + } + return defaultValue; + }; + + Vector4 defaultMixColor(Color::TRANSPARENT); + Vector4 defaultCornerRadius(0.0f, 0.0f, 0.0f, 0.0f); + float defaultBorderlineWidth(0.0f); + Vector4 defaultBorderlineColor(0.0f, 0.0f, 0.0f, 1.0f); + float defaultBorderlineOffset(0.0f); + + Vector4 sourceMixColor = findValueVector4(sourceMap, Dali::Toolkit::Visual::Property::MIX_COLOR, defaultMixColor); + Vector4 sourceCornerRadius = findValueVector4(sourceMap, Toolkit::DevelVisual::Property::CORNER_RADIUS, defaultCornerRadius); + float sourceBorderlineWidth = findValueFloat(sourceMap, Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, defaultBorderlineWidth); + Vector4 sourceBorderlineColor = findValueVector4(sourceMap, Toolkit::DevelVisual::Property::BORDERLINE_COLOR, defaultBorderlineColor); + float sourceBorderlineOffset = findValueFloat(sourceMap, Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, defaultBorderlineOffset); + + Vector4 destinationMixColor = findValueVector4(destinationMap, Dali::Toolkit::Visual::Property::MIX_COLOR, defaultMixColor); + Vector4 destinationCornerRadius = findValueVector4(destinationMap, Toolkit::DevelVisual::Property::CORNER_RADIUS, defaultCornerRadius); + float destinationBorderlineWidth = findValueFloat(destinationMap, Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, defaultBorderlineWidth); + Vector4 destinationBorderlineColor = findValueVector4(destinationMap, Toolkit::DevelVisual::Property::BORDERLINE_COLOR, defaultBorderlineColor); + 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) + { + sourcePropertyMap.Add(Dali::Toolkit::Visual::Property::OPACITY, sourceMixColor.a); + destinationPropertyMap.Add(Dali::Toolkit::Visual::Property::OPACITY, destinationMixColor.a); + } + + if(sourceCornerRadius != destinationCornerRadius) + { + sourcePropertyMap.Add(Dali::Toolkit::DevelVisual::Property::CORNER_RADIUS, sourceCornerRadius); + destinationPropertyMap.Add(Dali::Toolkit::DevelVisual::Property::CORNER_RADIUS, destinationCornerRadius); + } + + if(sourceBorderlineWidth != destinationBorderlineWidth) + { + sourcePropertyMap.Add(Dali::Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, sourceBorderlineWidth); + destinationPropertyMap.Add(Dali::Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, destinationBorderlineWidth); + } + + if(sourceBorderlineColor != destinationBorderlineColor) + { + sourcePropertyMap.Add(Dali::Toolkit::DevelVisual::Property::BORDERLINE_COLOR, sourceBorderlineColor); + destinationPropertyMap.Add(Dali::Toolkit::DevelVisual::Property::BORDERLINE_COLOR, destinationBorderlineColor); + } + + if(sourceBorderlineOffset != destinationBorderlineOffset) + { + sourcePropertyMap.Add(Dali::Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, sourceBorderlineOffset); + destinationPropertyMap.Add(Dali::Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, destinationBorderlineOffset); + } +} + Control& GetImplementation(Dali::Toolkit::Control& handle) { CustomActorImpl& customInterface = handle.GetImplementation(); diff --git a/dali-toolkit/public-api/controls/control-impl.h b/dali-toolkit/public-api/controls/control-impl.h index 9a68ca1..48c6b9c 100644 --- a/dali-toolkit/public-api/controls/control-impl.h +++ b/dali-toolkit/public-api/controls/control-impl.h @@ -45,6 +45,7 @@ class StyleManager; namespace Internal { + /** * @brief This is the internal base class for all controls. * @@ -617,18 +618,47 @@ public: // API for derived classes to override return NULL; } - // Transition + // Transition APIs + + /** + * @brief Make visual transition from source control to destination control about specific Visual. + * If both of source and destination control have same visual index, than generates information for the transition of this Control. + * + * @param[out] sourcePropertyMap Source property map to be applied on this Control. + * @param[out] destinationPropertyMap Destination property map to be applied on this Control. + * @param[in] source Source control of the animation. + * @param[in] destination Destination control of the animation. + * @param[in] visualIndex Property::Index to make animation. + */ + void MakeVisualTransition(Dali::Property::Map& sourcePropertyMap, Dali::Property::Map& destinationPropertyMap, + Dali::Toolkit::Control source, Dali::Toolkit::Control destination, Dali::Property::Index visualIndex); /** - * @brief Retrieve visual property animations. - * This Control is a destination. + * @brief Retrieves source and destination visual properties for the Transition of this Control. + * The properties of this Control will be transitioned from the propeties of source Control to that of destination control. + * If a property value is different between source and destination Control, + * the property information of each Control will be included in sourceProperties and destinationProperties. + * + * @param[out] sourceProperties Source property list to be applied on this Control. + * @param[out] destinationProperties Destination property list to be applied on this Control. + * @param[in] source Source control of the animation. + * @param[in] destination Destination control of the animation. * - * @param[in] animation generated animation - * @param[in] source source control of the animation. - * @param[in] alphaFunction AlphaFunction of the animation - * @param[in] timePeriod TimePeriod of the animation + * @note This method do not handle Actor properties. + * And the size and order of the sourceProperties and destinationProperties must be synchronized. + */ + virtual void OnCreateTransitions(std::vector>& sourceProperties, + std::vector>& destinationProperties, + Dali::Toolkit::Control source, + Dali::Toolkit::Control destination) + { + } + + /** + * @brief Update visual properties. + * @param[in] properties Property list to be used to update visual properties of this Control. */ - virtual void OnCreateTransitions(Dali::Animation& animation, Dali::Toolkit::Control source, AlphaFunction alphaFunction, TimePeriod timePeriod) + virtual void OnUpdateVisualProperties(const std::vector>& properties) { } diff --git a/dali-toolkit/public-api/transition/transition.cpp b/dali-toolkit/public-api/transition/transition.cpp index 3e2f378..57f7364 100644 --- a/dali-toolkit/public-api/transition/transition.cpp +++ b/dali-toolkit/public-api/transition/transition.cpp @@ -32,9 +32,9 @@ Transition::Transition(Internal::Transition* transition) { } -Transition Transition::New(Dali::Toolkit::Control source, Dali::Toolkit::Control destination, TimePeriod timePeriod) +Transition Transition::New(Dali::Toolkit::Control source, Dali::Toolkit::Control destination, bool useDestinationTarget, TimePeriod timePeriod) { - Internal::TransitionPtr internal = Dali::Toolkit::Internal::Transition::New(source, destination, timePeriod); + Internal::TransitionPtr internal = Dali::Toolkit::Internal::Transition::New(source, destination, useDestinationTarget, timePeriod); return Transition(internal.Get()); } diff --git a/dali-toolkit/public-api/transition/transition.h b/dali-toolkit/public-api/transition/transition.h index 634face..fa27fa6 100644 --- a/dali-toolkit/public-api/transition/transition.h +++ b/dali-toolkit/public-api/transition/transition.h @@ -51,13 +51,14 @@ public: /** * @brief Creates an initialized Transition. * - * @param[in] source Source - * @param[in] destination Destination + * @param[in] source A source control of this transition. + * @param[in] destination A destination control of this transition. + * @param[in] useDestinationTarget True if this transition uses destination control as target. * @param[in] timePeriod The duration in seconds * @return A handle to a newly allocated Dali resource * @note durationSeconds can not be negative. */ - static Transition New(Dali::Toolkit::Control source, Dali::Toolkit::Control destination, TimePeriod timePeriod); + static Transition New(Dali::Toolkit::Control source, Dali::Toolkit::Control destination, bool useDestinationTarget, TimePeriod timePeriod); /** * @brief Downcasts a handle to Transition handle.