/*
- * Copyright (c) 2023 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.
#include <dali/public-api/object/type-registry.h>
// INTERNAL INCLUDES
+#include <dali-toolkit/devel-api/controls/control-depth-index-ranges.h>
#include <dali-toolkit/devel-api/controls/control-devel.h>
#include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
#include <dali-toolkit/devel-api/visuals/visual-actions-devel.h>
{
const Vector4 FULL_TEXTURE_RECT(0.f, 0.f, 1.f, 1.f);
-constexpr float FULL_OPACITY = 1.0f;
-constexpr float LOW_OPACITY = 0.2f;
+constexpr float FULL_OPACITY = 1.0f;
+constexpr float LOW_OPACITY = 0.2f;
constexpr float TRANSITION_EFFECT_SPEED = 0.3f;
+constexpr int PLACEHOLDER_DEPTH_INDEX = -2;
+constexpr int PREVIOUS_VISUAL_DEPTH_INDEX = -1;
+constexpr int CURRENT_VISUAL_DEPTH_INDEX = 0;
+
BaseHandle Create()
{
return Toolkit::ImageView::New();
mImageVisualPaddingSetByTransform(false),
mImageViewPixelAreaSetByFittingMode(false),
mTransitionEffect(false),
- mNeedLazyFittingMode(false)
+ mNeedLazyFittingMode(false),
+ mImageReplaced(false)
{
}
{
if(mTransitionAnimation.GetState() == Animation::PLAYING)
{
- mTransitionAnimation.Stop();
+ // Hide placeholder
+ HidePlaceholderImage();
ClearTransitionAnimation();
}
}
mPropertyMap = map;
mUrl.clear();
+ mImageReplaced = true;
+
// keep alpha for transition effect
if(mTransitionEffect)
{
visualImpl.SetCustomShader(mShaderMap);
}
- DevelControl::RegisterVisual(*this, Toolkit::ImageView::Property::IMAGE, visual);
+ DevelControl::RegisterVisual(*this, Toolkit::ImageView::Property::IMAGE, visual, DepthIndex::CONTENT);
}
else
{
// Trigger a size negotiation request that may be needed when unregistering a visual.
RelayoutRequest();
}
-
// Signal that a Relayout may be needed
}
{
if(mTransitionAnimation.GetState() == Animation::PLAYING)
{
- mTransitionAnimation.Stop();
+ HidePlaceholderImage();
ClearTransitionAnimation();
}
}
mImageSize = size;
mPropertyMap.Clear();
+ mImageReplaced = true;
+
if(!mVisual)
{
ShowPlaceholderImage();
visualImpl.SetCustomShader(mShaderMap);
}
- DevelControl::RegisterVisual(*this, Toolkit::ImageView::Property::IMAGE, visual);
+ DevelControl::RegisterVisual(*this, Toolkit::ImageView::Property::IMAGE, visual, DepthIndex::CONTENT);
}
else
{
// Trigger a size negotiation request that may be needed when unregistering a visual.
RelayoutRequest();
}
-
// Signal that a Relayout may be needed
}
{
visual.SetTransformAndSize(Property::Map(), size);
}
+
+ if(!mTransitionEffect)
+ {
+ // we don't need placeholder anymore because visual is replaced. so hide placeholder.
+ HidePlaceholderImage();
+ }
}
}
// when placeholder is disabled or ready placeholder and image, we need to transition effect
TransitionImageWithEffect();
}
- else
- {
- ClearTransitionAnimation();
- }
- }
- else
- {
- // we don't need placeholder anymore because visual is replaced. so hide placeholder.
- HidePlaceholderImage();
}
// Visual ready so update visual attached to this ImageView, following call to RelayoutRequest will use this visual.
bool zeroPadding = (padding == Extents());
Dali::LayoutDirection::Type layoutDirection = static_cast<Dali::LayoutDirection::Type>(
- Self().GetProperty(Dali::Actor::Property::LAYOUT_DIRECTION).Get<int>());
+ Self().GetProperty(Dali::Actor::Property::LAYOUT_DIRECTION).Get<int>());
if(Dali::LayoutDirection::RIGHT_TO_LEFT == layoutDirection)
{
std::swap(padding.start, padding.end);
if(mPlaceholderVisual)
{
mPlaceholderVisual.SetName("placeholder");
+ mPlaceholderVisual.SetDepthIndex(mPlaceholderVisual.GetDepthIndex() + PLACEHOLDER_DEPTH_INDEX);
}
else
{
if(handle)
{
+ if(!mImageReplaced)
+ {
+ // If the image is not replaced, the transition effect is not required.
+ return;
+ }
+
+ if(mTransitionAnimation)
+ {
+ ClearTransitionAnimation();
+ }
+
+ // Control visual's depth for transition effect
+ if(mPreviousVisual)
+ {
+ mPreviousVisual.SetDepthIndex(mPreviousVisual.GetDepthIndex() + PREVIOUS_VISUAL_DEPTH_INDEX);
+ }
+
mTransitionAnimation = Animation::New(TRANSITION_EFFECT_SPEED);
mTransitionAnimation.SetEndAction(Animation::EndAction::DISCARD);
float destinationAlpha = (mTransitionTargetAlpha > LOW_OPACITY) ? mTransitionTargetAlpha : LOW_OPACITY;
Dali::KeyFrames fadeinKeyFrames = Dali::KeyFrames::New();
fadeinKeyFrames.Add(0.0f, LOW_OPACITY);
fadeinKeyFrames.Add(1.0f, destinationAlpha);
- mTransitionAnimation.AnimateBetween(DevelControl::GetVisualProperty(handle, Toolkit::ImageView::Property::IMAGE, Toolkit::Visual::Property::OPACITY), fadeinKeyFrames, AlphaFunction::EASE_IN_OUT);
+ mTransitionAnimation.AnimateBetween(DevelControl::GetVisualProperty(handle, Toolkit::ImageView::Property::IMAGE, Toolkit::Visual::Property::OPACITY), fadeinKeyFrames, AlphaFunction::EASE_IN_OUT);
+ imageVisual.SetDepthIndex(imageVisual.GetDepthIndex() + CURRENT_VISUAL_DEPTH_INDEX);
}
// Play transition animation
void ImageView::ClearTransitionAnimation()
{
- // Hide placeholder
- HidePlaceholderImage();
-
// Clear PreviousVisual
if(mPreviousVisual)
{
if(mTransitionAnimation)
{
+ if(mTransitionAnimation.GetState() == Animation::PLAYING)
+ {
+ mTransitionAnimation.Stop();
+ }
mTransitionAnimation.FinishedSignal().Disconnect(this, &ImageView::OnTransitionAnimationFinishedCallback);
mTransitionAnimation.Clear();
+ mTransitionAnimation.Reset();
+
+ // After transition effect is cleared, we don't need transition effect until image is replaced.
+ mImageReplaced = false;
}
}
void ImageView::OnTransitionAnimationFinishedCallback(Animation& animation)
{
+ // Hide placeholder
+ HidePlaceholderImage();
ClearTransitionAnimation();
}