Add AsyncTextRendered signal to async text
authorBowon Ryu <bowon.ryu@samsung.com>
Tue, 9 Jul 2024 07:48:40 +0000 (16:48 +0900)
committerBowon Ryu <bowon.ryu@samsung.com>
Tue, 9 Jul 2024 07:51:51 +0000 (16:51 +0900)
Signal is emitted along with the size information
once the async text rendering is complete.

Change-Id: I654dafdc46c810ad14b4713ab11a9bbe9dc8e01a
Signed-off-by: Bowon Ryu <bowon.ryu@samsung.com>
dali-toolkit/devel-api/controls/text-controls/text-label-devel.cpp
dali-toolkit/devel-api/controls/text-controls/text-label-devel.h
dali-toolkit/internal/controls/text-controls/text-label-impl.cpp
dali-toolkit/internal/controls/text-controls/text-label-impl.h

index 7db74f9..79c44d0 100644 (file)
@@ -35,6 +35,11 @@ TextFitChangedSignalType& TextFitChangedSignal(TextLabel textLabel)
   return GetImpl(textLabel).TextFitChangedSignal();
 }
 
+AsyncTextRenderedSignalType& AsyncTextRenderedSignal(TextLabel textLabel)
+{
+  return GetImpl(textLabel).AsyncTextRenderedSignal();
+}
+
 Vector<Vector2> GetTextSize(TextLabel textLabel, const uint32_t startIndex, const uint32_t endIndex)
 {
   return GetImpl(textLabel).GetTextSize(startIndex, endIndex);
index 2eebd35..df8d7f4 100644 (file)
@@ -405,6 +405,15 @@ using AnchorClickedSignalType = Signal<void(TextLabel, const char*, uint32_t)>;
 using TextFitChangedSignalType = Signal<void(TextLabel)>;
 
 /**
+ * @brief Async text rendered signal type.
+ *
+ * @note Signal
+ *  - float : rendered width.
+ *  - float : rendered height.
+ */
+using AsyncTextRenderedSignalType = Signal<void(TextLabel, float, float)>;
+
+/**
  * @brief This signal is emitted when the anchor is clicked.
  *
  * A callback of the following type may be connected:
@@ -428,6 +437,18 @@ DALI_TOOLKIT_API AnchorClickedSignalType& AnchorClickedSignal(TextLabel textLabe
  */
 DALI_TOOLKIT_API TextFitChangedSignalType& TextFitChangedSignal(TextLabel textLabel);
 
+/**
+ * @brief This signal is emitted when the async text rendered.
+ *
+ * A callback of the following type may be connected:
+ * @code
+ *   void YourCallbackName(TextLabel textLabel);
+ * @endcode
+ * @param[in] textLabel The instance of TextLabel.
+ * @return The signal to connect to.
+ */
+DALI_TOOLKIT_API AsyncTextRenderedSignalType& AsyncTextRenderedSignal(TextLabel textLabel);
+
 } // namespace DevelTextLabel
 
 } // namespace Toolkit
index 6260fad..8df21c7 100644 (file)
@@ -160,6 +160,7 @@ DALI_ANIMATABLE_PROPERTY_COMPONENT_REGISTRATION(Toolkit,    TextLabel, "textColo
 
 DALI_SIGNAL_REGISTRATION(Toolkit, TextLabel, "anchorClicked", SIGNAL_ANCHOR_CLICKED)
 DALI_SIGNAL_REGISTRATION(Toolkit, TextLabel, "textFitChanged", SIGNAL_TEXT_FIT_CHANGED)
+DALI_SIGNAL_REGISTRATION(Toolkit, TextLabel, "asyncTextRendered", SIGNAL_ASYNC_TEXT_RENDERED)
 
 DALI_TYPE_REGISTRATION_END()
 // clang-format on
@@ -1002,6 +1003,14 @@ bool TextLabel::DoConnectSignal(BaseObject* object, ConnectionTrackerInterface*
       labelImpl.TextFitChangedSignal().Connect(tracker, functor);
     }
   }
+  else if(0 == strcmp(signalName.c_str(), SIGNAL_ASYNC_TEXT_RENDERED))
+  {
+    if(label)
+    {
+      Internal::TextLabel& labelImpl(GetImpl(label));
+      labelImpl.AsyncTextRenderedSignal().Connect(tracker, functor);
+    }
+  }
   else
   {
     // signalName does not match any signal
@@ -1021,6 +1030,11 @@ DevelTextLabel::TextFitChangedSignalType& TextLabel::TextFitChangedSignal()
   return mTextFitChangedSignal;
 }
 
+DevelTextLabel::AsyncTextRenderedSignalType& TextLabel::AsyncTextRenderedSignal()
+{
+  return mAsyncTextRenderedSignal;
+}
+
 void TextLabel::OnInitialize()
 {
   Actor self = Self();
@@ -1580,6 +1594,8 @@ void TextLabel::AsyncLoadComplete(Text::AsyncTextRenderInfo renderInfo)
 
   // To avoid flickering issues, enable/disable the background visual when async load is completed.
   EnableControlBackground(!mController->IsTextCutout());
+
+  EmitAsyncTextRenderedSignal(renderInfo.renderedSize.width, renderInfo.renderedSize.height);
 }
 
 void TextLabel::OnLayoutDirectionChanged(Actor actor, LayoutDirection::Type type)
@@ -1607,6 +1623,12 @@ void TextLabel::EmitTextFitChangedSignal()
   mTextFitChangedSignal.Emit(handle);
 }
 
+void TextLabel::EmitAsyncTextRenderedSignal(float width, float height)
+{
+  Dali::Toolkit::TextLabel handle(GetOwner());
+  mAsyncTextRenderedSignal.Emit(handle, width, height);
+}
+
 void TextLabel::OnAccessibilityStatusChanged()
 {
   CommonTextUtils::SynchronizeTextAnchorsInParent(Self(), mController, mAnchorActors);
index a6b11ae..8c1a198 100644 (file)
@@ -87,6 +87,11 @@ public:
   DevelTextLabel::TextFitChangedSignalType& TextFitChangedSignal();
 
   /**
+   * @copydoc Dali::Toollkit::TextLabel::AsyncTextRenderedSignal()
+   */
+  DevelTextLabel::AsyncTextRenderedSignalType& AsyncTextRenderedSignal();
+
+  /**
    * Connects a callback function with the object's signals.
    * @param[in] object The object providing the signal.
    * @param[in] tracker Used to disconnect the signal.
@@ -394,6 +399,12 @@ private:
    * @brief Emits TextFitChanged signal.
    */
   void EmitTextFitChangedSignal();
+
+  /**
+   * @brief Emits AsyncTextRendered signal.
+   */
+  void EmitAsyncTextRenderedSignal(float width, float height);
+
   void OnAccessibilityStatusChanged();
 
 private: // Data
@@ -407,6 +418,7 @@ private: // Data
   // Signals
   Toolkit::DevelTextLabel::AnchorClickedSignalType  mAnchorClickedSignal;
   Toolkit::DevelTextLabel::TextFitChangedSignalType mTextFitChangedSignal;
+  Toolkit::DevelTextLabel::AsyncTextRenderedSignalType mAsyncTextRenderedSignal;
 
   std::string mLocale;