[dali_2.3.24] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / controls / scroll-bar / scroll-bar-impl.cpp
index fcf0b91..fe49f3c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 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.
@@ -24,6 +24,7 @@
 #include <dali/integration-api/debug.h>
 #include <dali/public-api/animation/constraint.h>
 #include <dali/public-api/animation/constraints.h>
+#include <dali/public-api/math/math-utils.h>
 #include <dali/public-api/object/property-array.h>
 #include <dali/public-api/object/type-registry-helper.h>
 #include <dali/public-api/object/type-registry.h>
@@ -209,13 +210,17 @@ ScrollBar::~ScrollBar()
 
 void ScrollBar::OnInitialize()
 {
+  auto self = Self();
+
   CreateDefaultIndicatorActor();
-  Self().SetProperty(Actor::Property::DRAW_MODE, DrawMode::OVERLAY_2D);
+  self.SetProperty(Actor::Property::DRAW_MODE, DrawMode::OVERLAY_2D);
 
-  DevelControl::SetAccessibilityConstructor(Self(), [](Dali::Actor actor) {
-    return std::unique_ptr<Dali::Accessibility::Accessible>(
-      new AccessibleImpl(actor, Dali::Accessibility::Role::SCROLL_BAR));
-  });
+  self.SetProperty(DevelControl::Property::ACCESSIBILITY_ROLE, Dali::Accessibility::Role::SCROLL_BAR);
+}
+
+DevelControl::ControlAccessible* ScrollBar::CreateAccessibleObject()
+{
+  return new ScrollBarAccessible(Self());
 }
 
 void ScrollBar::SetScrollPropertySource(Handle handle, Property::Index propertyScrollPosition, Property::Index propertyMinScrollPosition, Property::Index propertyMaxScrollPosition, Property::Index propertyScrollContentSize)
@@ -358,9 +363,11 @@ void ScrollBar::OnScrollPositionIntervalReached(PropertyNotification& source)
   if(scrollableHandle)
   {
     mScrollPositionIntervalReachedSignal.Emit(scrollableHandle.GetCurrentProperty<float>(mPropertyScrollPosition));
-    if(Self() == Dali::Accessibility::Accessible::GetCurrentlyHighlightedActor())
+
+    auto accessible = GetAccessibleObject();
+    if(DALI_LIKELY(accessible) && accessible->IsHighlighted())
     {
-      Control::Impl::GetAccessibilityObject(Self())->Emit(Dali::Accessibility::ObjectPropertyChangeEvent::VALUE);
+      accessible->Emit(Dali::Accessibility::ObjectPropertyChangeEvent::VALUE);
     }
   }
 }
@@ -698,12 +705,22 @@ void ScrollBar::SetProperty(BaseObject* object, Property::Index index, const Pro
           Dali::Vector<float> positions;
           size_t              positionCount = array->Count();
           positions.Resize(positionCount);
+
+          bool valid = true;
           for(size_t i = 0; i != positionCount; ++i)
           {
-            array->GetElementAt(i).Get(positions[i]);
+            if(DALI_UNLIKELY(!array->GetElementAt(i).Get(positions[i])))
+            {
+              // Given array is invalid. Fast out.
+              valid = false;
+              break;
+            }
           }
 
-          scrollBarImpl.SetScrollPositionIntervals(positions);
+          if(DALI_LIKELY(valid))
+          {
+            scrollBarImpl.SetScrollPositionIntervals(positions);
+          }
         }
         break;
       }
@@ -861,49 +878,61 @@ Toolkit::ScrollBar ScrollBar::New(Toolkit::ScrollBar::Direction direction)
   return handle;
 }
 
-double ScrollBar::AccessibleImpl::GetMinimum()
+double ScrollBar::ScrollBarAccessible::GetMinimum() const
+{
+  auto   self             = Toolkit::ScrollBar::DownCast(Self());
+  Handle scrollableHandle = GetImpl(self).mScrollableObject.GetHandle();
+  return scrollableHandle ? scrollableHandle.GetCurrentProperty<float>(GetImpl(self).mPropertyMinScrollPosition) : 0.0f;
+}
+
+double ScrollBar::ScrollBarAccessible::GetCurrent() const
 {
-  auto   p                = Toolkit::ScrollBar::DownCast(Self());
-  Handle scrollableHandle = GetImpl(p).mScrollableObject.GetHandle();
-  return scrollableHandle ? scrollableHandle.GetCurrentProperty<float>(GetImpl(p).mPropertyMinScrollPosition) : 0.0f;
+  auto   self             = Toolkit::ScrollBar::DownCast(Self());
+  Handle scrollableHandle = GetImpl(self).mScrollableObject.GetHandle();
+  return scrollableHandle ? scrollableHandle.GetCurrentProperty<float>(GetImpl(self).mPropertyScrollPosition) : 0.0f;
 }
 
-double ScrollBar::AccessibleImpl::GetCurrent()
+std::string ScrollBar::ScrollBarAccessible::GetValueText() const
 {
-  auto   p                = Toolkit::ScrollBar::DownCast(Self());
-  Handle scrollableHandle = GetImpl(p).mScrollableObject.GetHandle();
-  return scrollableHandle ? scrollableHandle.GetCurrentProperty<float>(GetImpl(p).mPropertyScrollPosition) : 0.0f;
+  return {}; // Text mode is not used at the moment
 }
 
-double ScrollBar::AccessibleImpl::GetMaximum()
+double ScrollBar::ScrollBarAccessible::GetMaximum() const
 {
-  auto   p                = Toolkit::ScrollBar::DownCast(Self());
-  Handle scrollableHandle = GetImpl(p).mScrollableObject.GetHandle();
-  return scrollableHandle ? scrollableHandle.GetCurrentProperty<float>(GetImpl(p).mPropertyMaxScrollPosition) : 1.0f;
+  auto   self             = Toolkit::ScrollBar::DownCast(Self());
+  Handle scrollableHandle = GetImpl(self).mScrollableObject.GetHandle();
+  return scrollableHandle ? scrollableHandle.GetCurrentProperty<float>(GetImpl(self).mPropertyMaxScrollPosition) : 1.0f;
 }
 
-bool ScrollBar::AccessibleImpl::SetCurrent(double current)
+bool ScrollBar::ScrollBarAccessible::SetCurrent(double current)
 {
   if(current < GetMinimum() || current > GetMaximum())
+  {
     return false;
+  }
 
-  auto value_before = GetCurrent();
+  auto valueBefore = GetCurrent();
 
-  auto   p                = Toolkit::ScrollBar::DownCast(Self());
-  Handle scrollableHandle = GetImpl(p).mScrollableObject.GetHandle();
+  auto   self             = Toolkit::ScrollBar::DownCast(Self());
+  Handle scrollableHandle = GetImpl(self).mScrollableObject.GetHandle();
   if(!scrollableHandle)
+  {
     return false;
-  scrollableHandle.SetProperty(GetImpl(p).mPropertyScrollPosition, static_cast<float>(current));
+  }
+
+  scrollableHandle.SetProperty(GetImpl(self).mPropertyScrollPosition, static_cast<float>(current));
 
-  auto value_after = GetCurrent();
+  auto valueAfter = GetCurrent();
 
-  if((current != value_before) && (value_before == value_after))
+  if(!Dali::Equals(current, valueBefore) && Dali::Equals(valueBefore, valueAfter))
+  {
     return false;
+  }
 
   return true;
 }
 
-double ScrollBar::AccessibleImpl::GetMinimumIncrement()
+double ScrollBar::ScrollBarAccessible::GetMinimumIncrement() const
 {
   return 1.0;
 }