std::vector<Dali::Accessibility::Relation> ret;
- auto& relations = controlImpl.mAccessibilityRelations;
- for(auto i = 0u; i < relations.size(); ++i)
+ for(auto& relation : controlImpl.mAccessibilityRelations)
{
- auto& relation = relations[i];
+ auto& targets = relation.second;
- if(relation.empty())
- {
- continue;
- }
+ ret.emplace_back(Accessibility::Relation{relation.first, {}});
// Map every Accessible* to its Address
- std::vector<Accessibility::Address> targets;
- std::transform(relation.begin(), relation.end(), std::back_inserter(targets), [](auto* x) {
+ std::transform(targets.begin(), targets.end(), std::back_inserter(ret.back().targets), [](auto* x) {
return x->GetAddress();
});
-
- ret.emplace_back(Accessibility::Relation{static_cast<Accessibility::RelationType>(i), std::move(targets)});
}
return ret;
{
if(auto controlDataImpl = GetControlImplementation(control))
{
- auto index = static_cast<Dali::Property::Array::SizeType>(relation);
- if(index >= controlDataImpl->mAccessibilityRelations.size())
- {
- DALI_LOG_ERROR("Relation index exceeds vector size.");
- return;
- }
-
auto object = controlDataImpl->GetAccessibilityObject(destination);
if(object)
{
- controlDataImpl->mAccessibilityRelations[index].push_back(object);
+ controlDataImpl->mAccessibilityRelations[relation].insert(object);
}
}
}
{
if(auto controlDataImpl = GetControlImplementation(control))
{
- auto index = static_cast<Dali::Property::Array::SizeType>(relation);
- if(index >= controlDataImpl->mAccessibilityRelations.size())
- {
- DALI_LOG_ERROR("Relation index exceeds vector size.");
- return;
- }
-
auto object = controlDataImpl->GetAccessibilityObject(destination);
- if(!object)
+ if(object)
{
- return;
- }
+ auto& relations = controlDataImpl->mAccessibilityRelations;
- auto& targets = controlDataImpl->mAccessibilityRelations[index];
- for(auto i = 0u; i < targets.size(); ++i)
- {
- if(targets[i] == object)
+ relations[relation].erase(object);
+
+ if(relations[relation].empty())
{
- std::swap(targets[i], targets.back());
- targets.pop_back();
- --i;
+ relations.erase(relation);
}
}
}
{
if(auto controlDataImpl = GetControlImplementation(control))
{
- auto& relations = controlDataImpl->mAccessibilityRelations;
-
- std::vector<std::vector<Accessibility::Address>> result(relations.size());
+ std::vector<std::vector<Accessibility::Address>> result(static_cast<std::size_t>(Accessibility::RelationType::MAX_COUNT));
// Map every Accessible* to its Address
- for(std::size_t i = 0; i < relations.size(); ++i)
+ for(auto& relation : controlDataImpl->mAccessibilityRelations)
{
- auto& relation = relations[i];
+ auto index = static_cast<std::size_t>(relation.first);
+ auto& targets = relation.second;
- std::transform(relation.begin(), relation.end(), std::back_inserter(result[i]), [](auto* x) {
+ std::transform(targets.begin(), targets.end(), std::back_inserter(result[index]), [](auto* x) {
return x->GetAddress();
});
}
{
if(auto controlDataImpl = GetControlImplementation(control))
{
- for(auto& it : controlDataImpl->mAccessibilityRelations)
- {
- it.clear();
- }
+ controlDataImpl->mAccessibilityRelations.clear();
}
}
mAccessibilityConstructor = [](Dali::Actor actor) -> std::unique_ptr<Dali::Accessibility::Accessible> {
return std::unique_ptr<Dali::Accessibility::Accessible>(new DevelControl::AccessibleImpl(actor, Dali::Accessibility::Role::UNKNOWN));
};
-
- size_t length = static_cast<size_t>(Dali::Accessibility::RelationType::MAX_COUNT);
- mAccessibilityRelations.reserve(length);
- for(auto i = 0u; i < length; ++i)
- {
- mAccessibilityRelations.push_back({});
- }
}
Control::Impl::~Impl()
#include <dali-toolkit/public-api/visuals/visual-properties.h>
#include <dali/devel-api/common/owner-container.h>
#include <dali/integration-api/debug.h>
+#include <map>
#include <memory>
+#include <set>
namespace Dali
{
Dali::Accessibility::Role mAccessibilityRole = Dali::Accessibility::Role::UNKNOWN;
- std::vector<std::vector<Accessibility::Accessible*>> mAccessibilityRelations;
- std::function<std::unique_ptr<Dali::Accessibility::Accessible>(Actor)> mAccessibilityConstructor;
- std::unique_ptr<Dali::Accessibility::Accessible> mAccessibilityObject;
+ std::map<Dali::Accessibility::RelationType, std::set<Accessibility::Accessible*>> mAccessibilityRelations;
+ std::function<std::unique_ptr<Dali::Accessibility::Accessible>(Actor)> mAccessibilityConstructor;
+ std::unique_ptr<Dali::Accessibility::Accessible> mAccessibilityObject;
// Gesture Detection
PinchGestureDetector mPinchGestureDetector;
}
TextAnchor::TextAnchor()
-: Control(ControlBehaviour(CONTROL_BEHAVIOUR_DEFAULT))
+: Control(ControlBehaviour(CONTROL_BEHAVIOUR_DEFAULT)),
+ mStartCharacterIndex(0),
+ mEndCharacterIndex(0),
+ mUri()
{
}
mediump vec2 stretch = floor( aPosition * 0.5 );
mediump vec2 fixedTotal = uFixed[ 2 ];
- mediump vec4 gridPosition = vec4( fixedFactor + ( size - fixedTotal ) * stretch, 0.0, 1.0 );
+ // Scale down if fixedTotal is bigger than visualSize
+ mediump float fixedScaleDownRate = min(1.0, min(size.x / fixedTotal.x, size.y / fixedTotal.y));
+
+ mediump vec4 gridPosition = vec4( fixedFactor * fixedScaleDownRate + ( size - fixedTotal * fixedScaleDownRate ) * stretch, 0.0, 1.0 );
mediump vec4 vertexPosition = gridPosition;
vertexPosition.xy -= size * vec2( 0.5, 0.5 );
vertexPosition.xy += anchorPoint*size + (visualOffset + origin)*uSize.xy;
vec2 visualSize = mix(uSize.xy*size, size, offsetSizeMode.zw ) + extraSize;
vec2 visualOffset = mix( offset, offset/uSize.xy, offsetSizeMode.xy);
- mediump vec4 gridPosition = vec4( fixedFactor + ( visualSize.xy - fixedTotal ) * stretch / stretchTotal, 0.0, 1.0 );
+ // Scale down if fixedTotal is bigger than visualSize
+ mediump float fixedScaleDownRate = min(1.0, min(visualSize.x / fixedTotal.x, visualSize.y / fixedTotal.y));
+
+ mediump vec4 gridPosition = vec4( fixedFactor * fixedScaleDownRate + ( visualSize.xy - fixedTotal * fixedScaleDownRate ) * stretch / stretchTotal, 0.0, 1.0 );
mediump vec4 vertexPosition = gridPosition;
vertexPosition.xy -= visualSize.xy * vec2( 0.5, 0.5 );
vertexPosition.xy += anchorPoint*visualSize + (visualOffset + origin)*uSize.xy;