Fix ClearHighlight() for custom highlight frames 07/255307/2
authorArtur Świgoń <a.swigon@samsung.com>
Tue, 16 Mar 2021 13:52:48 +0000 (14:52 +0100)
committerArtur Świgoń <a.swigon@samsung.com>
Thu, 18 Mar 2021 15:51:38 +0000 (16:51 +0100)
ClearHighlight() used GetHighlightActor() to retrieve the currently
displayed highlight frame in order to determine which actor to remove
from the scene graph. However, it is perfectly legal to
SetHighlightActor() while a highlight frame is displayed (takes effect
on the next GrabHighlight()), so the currently visible highlight frame
handle needs to be saved separately in order to be properly cleared.

Change-Id: Ibf41574bac66f9375b72b31d061195d0235621aa

dali-toolkit/devel-api/controls/accessible-impl.cpp
dali-toolkit/devel-api/controls/accessible-impl.h

index f986bd4..be4735b 100644 (file)
@@ -291,6 +291,9 @@ bool AccessibleImpl::GrabHighlight()
   highlight.SetProperty(Actor::Property::POSITION_Z, 1.0f);
   highlight.SetProperty(Actor::Property::POSITION, Vector2(0.0f, 0.0f));
 
+  // Remember the highlight actor, so that when the default is changed with
+  // SetHighlightActor(), the currently displayed highlight can still be cleared.
+  currentHighlightActor = highlight;
   EnsureSelfVisible();
   self.Add(highlight);
   SetCurrentlyHighlightedActor(self);
@@ -305,7 +308,8 @@ bool AccessibleImpl::ClearHighlight()
     return false;
   if(GetCurrentlyHighlightedActor() == self)
   {
-    self.Remove(GetHighlightActor());
+    self.Remove(currentHighlightActor.GetHandle());
+    currentHighlightActor = {};
     SetCurrentlyHighlightedActor({});
     EmitHighlighted(false);
     return true;
index feffe75..ff31c1e 100644 (file)
@@ -19,6 +19,7 @@
 // EXTERNAL INCLUDES
 #include <dali/devel-api/adaptor-framework/accessibility-impl.h>
 #include <dali/devel-api/adaptor-framework/accessibility.h>
+#include <dali/public-api/object/weak-handle.h>
 
 // INTERNAL INCLUDES
 #include <dali-toolkit/public-api/dali-toolkit-common.h>
@@ -46,6 +47,7 @@ struct DALI_TOOLKIT_API AccessibleImpl : public virtual Dali::Accessibility::Acc
                                          public virtual Dali::Accessibility::Action
 {
   Dali::Actor self;
+  Dali::WeakHandle<Dali::Actor> currentHighlightActor;
   bool        modal = false, root = false;
 
   AccessibleImpl(Dali::Actor self, Dali::Accessibility::Role role, bool modal = false);