Merge "DALi Version 2.1.1" into devel/master
authorDavid Steele <david.steele@samsung.com>
Fri, 3 Dec 2021 14:04:01 +0000 (14:04 +0000)
committerGerrit Code Review <gerrit@review>
Fri, 3 Dec 2021 14:04:01 +0000 (14:04 +0000)
dali-toolkit/devel-api/controls/accessible-impl.cpp
dali-toolkit/devel-api/controls/control-devel.cpp
dali-toolkit/internal/controls/control/control-data-impl.cpp
dali-toolkit/internal/controls/control/control-data-impl.h
dali-toolkit/internal/controls/text-controls/text-anchor-impl.cpp
dali-toolkit/internal/graphics/shaders/npatch-visual-3x3-shader.vert
dali-toolkit/internal/graphics/shaders/npatch-visual-shader.vert

index a962abf..e01bcb5 100644 (file)
@@ -536,23 +536,16 @@ std::vector<Dali::Accessibility::Relation> AccessibleImpl::GetRelationSet()
 
   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;
index ccf624b..7b497c9 100644 (file)
@@ -183,17 +183,10 @@ void AppendAccessibilityRelation(Dali::Actor control, Actor destination, Dali::A
 {
   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);
     }
   }
 }
@@ -202,27 +195,16 @@ void RemoveAccessibilityRelation(Dali::Actor control, Actor destination, Dali::A
 {
   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);
       }
     }
   }
@@ -232,16 +214,15 @@ std::vector<std::vector<Accessibility::Address>> GetAccessibilityRelations(Dali:
 {
   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();
       });
     }
@@ -256,10 +237,7 @@ void ClearAccessibilityRelations(Dali::Actor control)
 {
   if(auto controlDataImpl = GetControlImplementation(control))
   {
-    for(auto& it : controlDataImpl->mAccessibilityRelations)
-    {
-      it.clear();
-    }
+    controlDataImpl->mAccessibilityRelations.clear();
   }
 }
 
index d9a554e..4aecc29 100644 (file)
@@ -515,13 +515,6 @@ Control::Impl::Impl(Control& controlImpl)
   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()
index 5b2cee5..c81be41 100644 (file)
@@ -35,7 +35,9 @@
 #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
 {
@@ -546,9 +548,9 @@ public:
 
   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;
index 2fde91c..37831ea 100644 (file)
@@ -155,7 +155,10 @@ void TextAnchor::OnInitialize()
 }
 
 TextAnchor::TextAnchor()
-: Control(ControlBehaviour(CONTROL_BEHAVIOUR_DEFAULT))
+: Control(ControlBehaviour(CONTROL_BEHAVIOUR_DEFAULT)),
+  mStartCharacterIndex(0),
+  mEndCharacterIndex(0),
+  mUri()
 {
 }
 
index 1586312..c7b8a9f 100644 (file)
@@ -25,7 +25,10 @@ void main()
   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;
index 07f645b..4cd84bc 100644 (file)
@@ -25,7 +25,10 @@ void main()
   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;