}
Toolkit::Visual::Base Control::Impl::GetVisual(Property::Index index) const
+{
+ return Toolkit::Visual::Base(GetVisualImplPtr(index));
+}
+
+Toolkit::Internal::Visual::Base* Control::Impl::GetVisualImplPtr(Property::Index index) const
{
if(DALI_LIKELY(mVisualData))
{
- return mVisualData->GetVisual(index);
+ return mVisualData->GetVisualImplPtr(index);
}
- return Toolkit::Visual::Base();
+ return nullptr;
}
bool Control::Impl::IsResourceReady() const
if(DALI_LIKELY(controlImpl.mImpl->mVisualData))
{
- Toolkit::Visual::Base visual = controlImpl.mImpl->mVisualData->GetVisual(Toolkit::Control::Property::BACKGROUND);
- if(visual)
+ const Toolkit::Internal::Visual::Base* visualImplPtr = controlImpl.mImpl->mVisualData->GetVisualImplPtr(Toolkit::Control::Property::BACKGROUND);
+ if(visualImplPtr)
{
- visual.CreatePropertyMap(map);
+ visualImplPtr->CreatePropertyMap(map);
}
}
{
namespace Internal
{
+namespace Visual
+{
+class Base;
+}
+
enum class TriStateProperty
{
AUTO = 0,
*/
Toolkit::Visual::Base GetVisual(Property::Index index) const;
+ /**
+ * @brief Get the raw pointer of visual impl.
+ * It will be used when we want to get visual infomations without increase reference counts.
+ * @note Only for internal usage.
+ *
+ * @param[in] index Index of parameter
+ * @return Raw pointer of visual base implements. nullptr if not exist.
+ */
+ Toolkit::Internal::Visual::Base* GetVisualImplPtr(Property::Index index) const;
+
/**
* @brief Sets the given visual to be ready transition
*
RegisteredVisualContainer::Iterator iter;
if(FindVisual(index, mVisuals, iter))
{
- const Toolkit::Visual::Base visual = (*iter)->visual;
- const Internal::Visual::Base& visualImpl = Toolkit::GetImplementation(visual);
- return visualImpl.GetResourceStatus();
+ if((*iter)->visual)
+ {
+ const Internal::Visual::Base& visualImpl = Toolkit::GetImplementation((*iter)->visual);
+ return visualImpl.GetResourceStatus();
+ }
}
return Toolkit::Visual::ResourceStatus::PREPARING;
}
Toolkit::Visual::Base Control::Impl::VisualData::GetVisual(Property::Index index) const
+{
+ return Toolkit::Visual::Base(GetVisualImplPtr(index));
+}
+
+Toolkit::Internal::Visual::Base* Control::Impl::VisualData::GetVisualImplPtr(Property::Index index) const
{
RegisteredVisualContainer::Iterator iter;
if(FindVisual(index, mVisuals, iter))
{
- return (*iter)->visual;
+ return (*iter)->visual ? &Toolkit::GetImplementation((*iter)->visual) : nullptr;
}
-
- return Toolkit::Visual::Base();
+ return nullptr;
}
Toolkit::Visual::Base Control::Impl::VisualData::GetVisual(const std::string& name) const
void Control::Impl::VisualData::ApplyFittingMode(const Vector2& size)
{
- Actor self = mOuter.mControlImpl.Self();
+ Actor self;
for(RegisteredVisualContainer::Iterator iter = mVisuals.Begin(); iter != mVisuals.End(); iter++)
{
// Check whether the visual is empty and enabled
continue;
}
- Visual::FittingMode fittingMode = visualImpl.GetFittingMode();
- Property::Map transformMap = Property::Map();
+ Visual::FittingMode fittingMode = visualImpl.GetFittingMode();
- // If the fittingMode is DONT_CARE, we don't need to apply fittingMode, just Set empty transformMap
+ // If the fittingMode is DONT_CARE, we don't need to apply fittingMode, just Set the size of control
if(fittingMode == Visual::FittingMode::DONT_CARE)
{
if(visualImpl.GetType() != Toolkit::Visual::Type::TEXT)
{
- ((*iter)->visual).SetTransformAndSize(transformMap, size);
+ visualImpl.SetControlSize(size);
}
continue;
}
+ if(!self)
+ {
+ self = mOuter.mControlImpl.Self();
+ }
+
Extents padding = self.GetProperty<Extents>(Toolkit::Control::Property::PADDING);
bool zeroPadding = (padding == Extents());
visualImpl.SetPixelAreaForFittingMode(FULL_TEXTURE_RECT);
}
+ Property::Map transformMap = Property::Map();
+
if((!zeroPadding) || // If padding is not zero
(fittingMode != Visual::FittingMode::FILL))
{
// Skip GetNaturalSize
if(fittingMode != Visual::FittingMode::FILL)
{
- ((*iter)->visual).GetNaturalSize(naturalSize);
+ visualImpl.GetNaturalSize(naturalSize);
}
// If FittingMode use FIT_WIDTH or FIT_HEIGTH, it need to change proper fittingMode
Vector2(Toolkit::Visual::Transform::Policy::RELATIVE, Toolkit::Visual::Transform::Policy::RELATIVE));
}
- ((*iter)->visual).SetTransformAndSize(transformMap, size);
+ visualImpl.SetTransformAndSize(transformMap, size);
}
}
}
{
namespace Internal
{
+namespace Visual
+{
+class Base;
+}
+
/**
* @brief Struct used to store Visual within the control, index is a unique key for each visual.
*/
*/
Toolkit::Visual::Base GetVisual(Property::Index index) const;
+ /**
+ * @copydoc Dali::Toolkit::Internal::Control::Impl::GetVisualImplPtr()
+ */
+ Toolkit::Internal::Visual::Base* GetVisualImplPtr(Property::Index index) const;
+
/**
* @brief Get visual by its name
* @param[in] name Name of visual
}
}
-void ImageView::OnRelayout(const Vector2& size, RelayoutContainer& container)
-{
- Control::OnRelayout(size, container);
- if(mVisual)
- {
- // mVisual is not updated util the resource is ready in the case of visual replacement.
- // in this case, the Property Map must be initialized so that the previous value is not reused.
- // after mVisual is updated, the correct value will be reset.
- Toolkit::Visual::Base visual = DevelControl::GetVisual(*this, Toolkit::ImageView::Property::IMAGE);
- if(visual && visual != mVisual)
- {
- visual.SetTransformAndSize(Property::Map(), size);
- }
- }
-}
-
void ImageView::OnCreateTransitions(std::vector<std::pair<Dali::Property::Index, Dali::Property::Map>>& sourceProperties,
std::vector<std::pair<Dali::Property::Index, Dali::Property::Map>>& destinationProperties,
Dali::Toolkit::Control source,
#define DALI_TOOLKIT_INTERNAL_IMAGE_VIEW_H
/*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2025 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.
*/
float GetWidthForHeight(float height) override;
- /**
- * @copydoc Toolkit::Control::OnRelayout()
- */
- void OnRelayout(const Vector2& size, RelayoutContainer& container) override;
-
/**
* @copydoc Toolkit::Control::OnCreateTransitions()
*/
*/
void OnResourceReady(Toolkit::Control control);
- /**
+ /**
* @brief Create placeholder image if it set. placeholder image is shown when image view is waiting for the image to load.
*/
void CreatePlaceholderImage();
Toolkit::Visual::Base mPreviousVisual;
Toolkit::Visual::Base mPlaceholderVisual;
- std::string mUrl; ///< the url for the image if the image came from a URL, empty otherwise
- std::string mPlaceholderUrl; ///< the url for the placeholder image if the image came from a PLACEHOLDER_IMAGE, empty otherwise
- Property::Map mPropertyMap; ///< the Property::Map if the image came from a Property::Map, empty otherwise
- Property::Map mShaderMap; ///< the Property::Map if the custom shader is set, empty otherwise
- Property::Map mTransitionEffectOptionMap; ///< the Property::Map if the transition effect option is set, empty otherwise
- ImageDimensions mImageSize; ///< the image size
-
- Animation mTransitionAnimation; ///< the animation for transition effect
- float mTransitionTargetAlpha; ///< Keep image's alpha value
- bool mTransitionEffect :1; ///< Flag to indicate TransitionEffect is enabled
- bool mImageReplaced:1; ///< Flag to indicate image is replaced
+ std::string mUrl; ///< the url for the image if the image came from a URL, empty otherwise
+ std::string mPlaceholderUrl; ///< the url for the placeholder image if the image came from a PLACEHOLDER_IMAGE, empty otherwise
+ Property::Map mPropertyMap; ///< the Property::Map if the image came from a Property::Map, empty otherwise
+ Property::Map mShaderMap; ///< the Property::Map if the custom shader is set, empty otherwise
+ Property::Map mTransitionEffectOptionMap; ///< the Property::Map if the transition effect option is set, empty otherwise
+ ImageDimensions mImageSize; ///< the image size
+
+ Animation mTransitionAnimation; ///< the animation for transition effect
+ float mTransitionTargetAlpha; ///< Keep image's alpha value
+ bool mTransitionEffect : 1; ///< Flag to indicate TransitionEffect is enabled
+ bool mImageReplaced : 1; ///< Flag to indicate image is replaced
};
} // namespace Internal
mImpl->mTransformMapSetForFittingMode = used;
}
+void Visual::Base::SetControlSize(Size controlSize)
+{
+ const static Property::Map emptyMap;
+ SetTransformAndSize(emptyMap, controlSize);
+}
+
Visual::Base& Visual::Base::GetVisualObject()
{
return *this;
#define DALI_TOOLKIT_INTERNAL_VISUAL_H
/*
- * Copyright (c) 2024 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2025 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.
*/
void SetTransformMapUsageForFittingMode(bool used);
+ /**
+ * @brief Sets the control size
+ * It will call SetTransformAndSize with empty transform map.
+ *
+ * @param[in] controlSize The size of the parent control for visuals that need to scale internally.
+ */
+ void SetControlSize(Size controlSize);
+
/**
* @brief Get the actual Visual Object.
* @return The actual visual object
map[Toolkit::Visual::Property::TYPE] = Toolkit::Visual::COLOR;
map[Toolkit::ColorVisual::Property::MIX_COLOR] = color;
- Toolkit::Visual::Base visual = mImpl->GetVisual(Toolkit::Control::Property::BACKGROUND);
- if(visual && visual.GetType() == Toolkit::Visual::COLOR)
+ Toolkit::Internal::Visual::Base* visualImplPtr = mImpl->GetVisualImplPtr(Toolkit::Control::Property::BACKGROUND);
+ if(visualImplPtr && visualImplPtr->GetType() == Toolkit::Visual::COLOR)
{
// Update background color only
- mImpl->DoAction(Toolkit::Control::Property::BACKGROUND, DevelVisual::Action::UPDATE_PROPERTY, map);
+ visualImplPtr->DoAction(DevelVisual::Action::UPDATE_PROPERTY, map);
return;
}
void Control::OnSizeSet(const Vector3& targetSize)
{
- Vector2 size(targetSize);
- Toolkit::Visual::Base visual = mImpl->GetVisual(Toolkit::Control::Property::BACKGROUND);
- if(visual)
+ Vector2 size(targetSize);
+
+ Toolkit::Internal::Visual::Base* visualImplPtr = mImpl->GetVisualImplPtr(Toolkit::Control::Property::BACKGROUND);
+ if(visualImplPtr)
{
- visual.SetTransformAndSize(Property::Map(), size); // Send an empty map as we do not want to modify the visual's set transform
+ visualImplPtr->SetControlSize(size); // Send an empty map as we do not want to modify the visual's set transform
}
// Apply FittingMode here
- mImpl->mSize = size;
+ mImpl->mSize = Vector2(targetSize);
mImpl->RegisterProcessorOnce();
}
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)
+ Toolkit::Internal::Visual::Base* visualImplPtr = mImpl->GetVisualImplPtr(Toolkit::Control::Property::BACKGROUND);
+ if(visualImplPtr)
{
Vector2 naturalSize;
- visual.GetNaturalSize(naturalSize);
+ visualImplPtr->GetNaturalSize(naturalSize);
naturalSize.width += (mImpl->mPadding.start + mImpl->mPadding.end);
naturalSize.height += (mImpl->mPadding.top + mImpl->mPadding.bottom);
return Vector3(naturalSize);