From aaa8f34f5cbfdb73d82d3b145ff76ccc077f6365 Mon Sep 17 00:00:00 2001 From: abdullah Date: Mon, 17 Jan 2022 17:24:25 +0200 Subject: [PATCH] Add SelectionStarted signal added signal which will be called when selection started void OnSelectionStarted(TextEditor textEditor) Change-Id: I1ec070f5ebba419d8da2a75693c9c94d8f7f16bb --- .../src/dali-toolkit/utc-Dali-TextEditor.cpp | 76 +++++++++++++++++++++- .../src/dali-toolkit/utc-Dali-TextField.cpp | 76 +++++++++++++++++++++- .../controls/text-controls/text-editor-devel.cpp | 7 +- .../controls/text-controls/text-editor-devel.h | 17 +++++ .../controls/text-controls/text-field-devel.cpp | 7 +- .../controls/text-controls/text-field-devel.h | 17 +++++ .../controls/text-controls/text-editor-impl.cpp | 36 +++++++++- .../controls/text-controls/text-editor-impl.h | 15 ++++- .../controls/text-controls/text-field-impl.cpp | 36 +++++++++- .../controls/text-controls/text-field-impl.h | 15 ++++- 10 files changed, 294 insertions(+), 8 deletions(-) diff --git a/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp b/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp index e38ca01..0247a3b 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 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. @@ -140,6 +140,7 @@ static bool gSelectionChangedCallbackCall static uint32_t oldSelectionStart; static uint32_t oldSelectionEnd; static bool gSelectionClearedCallbackCalled; +static bool gSelectionStartedCallbackCalled; static bool gAnchorClickedCallBackCalled; static bool gAnchorClickedCallBackNotCalled; static bool gTextChangedCallBackCalled; @@ -165,6 +166,13 @@ struct CallbackFunctor bool* mCallbackFlag; }; +static void TestSelectionStartedCallback(TextEditor control) +{ + tet_infoline(" TestSelectionStartedCallback"); + + gSelectionStartedCallbackCalled = true; +} + static void TestSelectionClearedCallback(TextEditor control) { tet_infoline(" TestSelectionClearedCallback"); @@ -5022,6 +5030,72 @@ int utcDaliTextEditorSelectionClearedSignal(void) END_TEST; } +int utcDaliTextEditorSelectionStartedSignal(void) +{ + ToolkitTestApplication application; + tet_infoline(" utcDaliTextEditorSelectionStartedSignal"); + + TextEditor editor = TextEditor::New(); + DALI_TEST_CHECK(editor); + + application.GetScene().Add(editor); + + // connect to the selection changed signal. + ConnectionTracker* testTracker = new ConnectionTracker(); + DevelTextEditor::SelectionStartedSignal(editor).Connect(&TestSelectionStartedCallback); + bool selectionStartedSignal = false; + editor.ConnectSignal(testTracker, "selectionStarted", CallbackFunctor(&selectionStartedSignal)); + + editor.SetProperty(TextEditor::Property::TEXT, "Hello\nworld\nHello world"); + editor.SetProperty(TextEditor::Property::POINT_SIZE, 10.f); + editor.SetProperty(Actor::Property::SIZE, Vector2(100.f, 50.f)); + editor.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT); + editor.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT); + + // Avoid a crash when core load gl resources. + application.GetGlAbstraction().SetCheckFramebufferStatusResult(GL_FRAMEBUFFER_COMPLETE); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Tap on the text editor + TestGenerateTap(application, 3.0f, 25.0f); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Move to second line of the text & Select some text in the right of the current cursor position + application.ProcessEvent(GenerateKey("", "", "", DALI_KEY_CURSOR_DOWN, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + application.ProcessEvent(GenerateKey("", "", "", DALI_KEY_CURSOR_RIGHT, KEY_SHIFT_MODIFIER, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + + // Render and notify + application.SendNotification(); + application.Render(); + + DALI_TEST_CHECK(gSelectionStartedCallbackCalled); + + // remove selection + application.ProcessEvent(GenerateKey("", "", "", DALI_KEY_ESCAPE, 0, 0, Integration::KeyEvent::UP, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + + // Render and notify + application.SendNotification(); + application.Render(); + + gSelectionStartedCallbackCalled = false; + + DevelTextEditor::SelectText(editor, 1, 3); + + // Render and notify + application.SendNotification(); + application.Render(); + + DALI_TEST_CHECK(gSelectionStartedCallbackCalled); + + END_TEST; +} + int utcDaliTextEditorSelectionWithSecondaryCursor(void) { ToolkitTestApplication application; diff --git a/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp b/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp index aca0054..18200b8 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 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. @@ -131,6 +131,7 @@ static bool gSelectionChangedCallbackCalle static uint32_t oldSelectionStart; static uint32_t oldSelectionEnd; static bool gSelectionClearedCallbackCalled; +static bool gSelectionStartedCallbackCalled; static bool gAnchorClickedCallBackCalled; static bool gAnchorClickedCallBackNotCalled; static bool gTextChangedCallBackCalled; @@ -229,6 +230,13 @@ static void TestSelectionClearedCallback(TextField control) gSelectionClearedCallbackCalled = true; } +static void TestSelectionStartedCallback(TextField control) +{ + tet_infoline(" TestSelectionStartedCallback"); + + gSelectionStartedCallbackCalled = true; +} + static void TestSelectionChangedCallback(TextField control, uint32_t oldStart, uint32_t oldEnd) { tet_infoline(" TestSelectionChangedCallback"); @@ -4782,6 +4790,72 @@ int utcDaliTextFieldSelectionClearedSignal(void) END_TEST; } +int utcDaliTextFieldSelectionStartedSignal(void) +{ + ToolkitTestApplication application; + tet_infoline(" utcDaliTextFieldSelectionStartedSignal"); + + TextField field = TextField::New(); + DALI_TEST_CHECK(field); + + application.GetScene().Add(field); + + // connect to the selection changed signal. + ConnectionTracker* testTracker = new ConnectionTracker(); + DevelTextField::SelectionStartedSignal(field).Connect(&TestSelectionStartedCallback); + bool selectionStartedSignal = false; + field.ConnectSignal(testTracker, "selectionStarted", CallbackFunctor(&selectionStartedSignal)); + + field.SetProperty(TextField::Property::TEXT, "Hello\nworld\nHello world"); + field.SetProperty(TextField::Property::POINT_SIZE, 10.f); + field.SetProperty(Actor::Property::SIZE, Vector2(100.f, 50.f)); + field.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT); + field.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT); + + // Avoid a crash when core load gl resources. + application.GetGlAbstraction().SetCheckFramebufferStatusResult(GL_FRAMEBUFFER_COMPLETE); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Tap on the text field + TestGenerateTap(application, 3.0f, 25.0f); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Move to second line of the text & Select some text in the right of the current cursor position + application.ProcessEvent(GenerateKey("", "", "", DALI_KEY_CURSOR_DOWN, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + application.ProcessEvent(GenerateKey("", "", "", DALI_KEY_CURSOR_RIGHT, KEY_SHIFT_MODIFIER, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + + // Render and notify + application.SendNotification(); + application.Render(); + + DALI_TEST_CHECK(gSelectionStartedCallbackCalled); + + // remove selection + application.ProcessEvent(GenerateKey("", "", "", DALI_KEY_ESCAPE, 0, 0, Integration::KeyEvent::UP, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + + // Render and notify + application.SendNotification(); + application.Render(); + + gSelectionStartedCallbackCalled = false; + + DevelTextField::SelectText(field, 1, 3); + + // Render and notify + application.SendNotification(); + application.Render(); + + DALI_TEST_CHECK(gSelectionStartedCallbackCalled); + + END_TEST; +} + int utcDaliTextFieldSelectionChangedSignal(void) { ToolkitTestApplication application; diff --git a/dali-toolkit/devel-api/controls/text-controls/text-editor-devel.cpp b/dali-toolkit/devel-api/controls/text-controls/text-editor-devel.cpp index a7b4ae4..41d0c34 100644 --- a/dali-toolkit/devel-api/controls/text-controls/text-editor-devel.cpp +++ b/dali-toolkit/devel-api/controls/text-controls/text-editor-devel.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 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. @@ -60,6 +60,11 @@ SelectionClearedSignalType& SelectionClearedSignal(TextEditor textEditor) return GetImpl(textEditor).SelectionClearedSignal(); } +SelectionStartedSignalType& SelectionStartedSignal(TextEditor textEditor) +{ + return GetImpl(textEditor).SelectionStartedSignal(); +} + void SelectWholeText(TextEditor textEditor) { GetImpl(textEditor).SelectWholeText(); diff --git a/dali-toolkit/devel-api/controls/text-controls/text-editor-devel.h b/dali-toolkit/devel-api/controls/text-controls/text-editor-devel.h index 5a35e2d..196cc3b 100644 --- a/dali-toolkit/devel-api/controls/text-controls/text-editor-devel.h +++ b/dali-toolkit/devel-api/controls/text-controls/text-editor-devel.h @@ -434,6 +434,23 @@ using SelectionClearedSignalType = Signal; DALI_TOOLKIT_API SelectionClearedSignalType& SelectionClearedSignal(TextEditor textEditor); /** + * @brief selection start signal type. + */ +using SelectionStartedSignalType = Signal; + +/** + * @brief This signal is emitted when the selection start. + * + * A callback of the following type may be connected: + * @code + * void YourCallbackName( TextEditor textEditor); + * @endcode + * @param[in] textEditor The instance of TextEditor. + * @return The signal to connect to + */ +DALI_TOOLKIT_API SelectionStartedSignalType& SelectionStartedSignal(TextEditor textEditor); + +/** * @brief Select the whole text of TextEditor. * * @param[in] textEditor The instance of TextEditor. diff --git a/dali-toolkit/devel-api/controls/text-controls/text-field-devel.cpp b/dali-toolkit/devel-api/controls/text-controls/text-field-devel.cpp index fce7819..345bb12 100644 --- a/dali-toolkit/devel-api/controls/text-controls/text-field-devel.cpp +++ b/dali-toolkit/devel-api/controls/text-controls/text-field-devel.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 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. @@ -55,6 +55,11 @@ SelectionClearedSignalType& SelectionClearedSignal(TextField textField) return GetImpl(textField).SelectionClearedSignal(); } +SelectionStartedSignalType& SelectionStartedSignal(TextField textField) +{ + return GetImpl(textField).SelectionStartedSignal(); +} + void SelectWholeText(TextField textField) { GetImpl(textField).SelectWholeText(); diff --git a/dali-toolkit/devel-api/controls/text-controls/text-field-devel.h b/dali-toolkit/devel-api/controls/text-controls/text-field-devel.h index 9bc6fc1..165cd3f 100644 --- a/dali-toolkit/devel-api/controls/text-controls/text-field-devel.h +++ b/dali-toolkit/devel-api/controls/text-controls/text-field-devel.h @@ -356,6 +356,23 @@ using SelectionClearedSignalType = Signal; DALI_TOOLKIT_API SelectionClearedSignalType& SelectionClearedSignal(TextField textField); /** + * @brief selection start signal type. + */ +using SelectionStartedSignalType = Signal; + +/** + * @brief This signal is emitted when the selection start. + * + * A callback of the following type may be connected: + * @code + * void YourCallbackName( TextField textField); + * @endcode + * @param[in] textField The instance of TextField. + * @return The signal to connect to + */ +DALI_TOOLKIT_API SelectionStartedSignalType& SelectionStartedSignal(TextField textField); + +/** * @brief Get the rendered size of a specific text range. * if the requested text is at multilines, multiple sizes will be returned for each text located in a separate line. * if a line contains characters with different directions, multiple sizes will be returned for each block of contiguous characters with the same direction. diff --git a/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp b/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp index a75e21c..cc8804d 100644 --- a/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp @@ -166,6 +166,7 @@ DALI_SIGNAL_REGISTRATION(Toolkit, TextEditor, "inputFiltered", SIGNAL_IN DALI_SIGNAL_REGISTRATION(Toolkit, TextEditor, "cursorPositionChanged", SIGNAL_CURSOR_POSITION_CHANGED) DALI_SIGNAL_REGISTRATION(Toolkit, TextEditor, "selectionChanged", SIGNAL_SELECTION_CHANGED ) DALI_SIGNAL_REGISTRATION(Toolkit, TextEditor, "selectionCleared", SIGNAL_SELECTION_CLEARED ) +DALI_SIGNAL_REGISTRATION(Toolkit, TextEditor, "selectionStarted", SIGNAL_SELECTION_STARTED ) DALI_TYPE_REGISTRATION_END() // clang-format on @@ -404,6 +405,11 @@ DevelTextEditor::SelectionClearedSignalType& TextEditor::SelectionClearedSignal( return mSelectionClearedSignal; } +DevelTextEditor::SelectionStartedSignalType& TextEditor::SelectionStartedSignal() +{ + return mSelectionStartedSignal; +} + Text::ControllerPtr TextEditor::GetTextController() { return mController; @@ -472,6 +478,14 @@ bool TextEditor::DoConnectSignal(BaseObject* object, ConnectionTrackerInterface* editorImpl.SelectionClearedSignal().Connect(tracker, functor); } } + else if(0 == strcmp(signalName.c_str(), SIGNAL_SELECTION_STARTED)) + { + if(editor) + { + Internal::TextEditor& editorImpl(GetImpl(editor)); + editorImpl.SelectionStartedSignal().Connect(tracker, functor); + } + } else { // signalName does not match any signal @@ -718,6 +732,11 @@ void TextEditor::OnRelayout(const Vector2& size, RelayoutContainer& container) EmitCursorPositionChangedSignal(); } + if(mSelectionStarted) + { + EmitSelectionStartedSignal(); + } + if(mSelectionChanged) { EmitSelectionChangedSignal(); @@ -975,6 +994,13 @@ void TextEditor::EmitSelectionClearedSignal() mSelectionCleared = false; } +void TextEditor::EmitSelectionStartedSignal() +{ + Dali::Toolkit::TextEditor handle(GetOwner()); + mSelectionStartedSignal.Emit(handle); + mSelectionStarted = false; +} + void TextEditor::SelectionChanged(uint32_t oldStart, uint32_t oldEnd, uint32_t newStart, uint32_t newEnd) { if(((oldStart != newStart) || (oldEnd != newEnd)) && !mSelectionChanged) @@ -983,6 +1009,13 @@ void TextEditor::SelectionChanged(uint32_t oldStart, uint32_t oldEnd, uint32_t n { mSelectionCleared = true; } + else + { + if(oldStart == oldEnd) + { + mSelectionStarted = true; + } + } mSelectionChanged = true; mOldSelectionStart = oldStart; @@ -1282,7 +1315,8 @@ TextEditor::TextEditor() mSelectionCleared(false), mOldPosition(0u), mOldSelectionStart(0u), - mOldSelectionEnd(0u) + mOldSelectionEnd(0u), + mSelectionStarted(false) { } diff --git a/dali-toolkit/internal/controls/text-controls/text-editor-impl.h b/dali-toolkit/internal/controls/text-controls/text-editor-impl.h index 6ea1cc8..8118a1c 100644 --- a/dali-toolkit/internal/controls/text-controls/text-editor-impl.h +++ b/dali-toolkit/internal/controls/text-controls/text-editor-impl.h @@ -2,7 +2,7 @@ #define DALI_TOOLKIT_INTERNAL_TEXT_EDITOR_H /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 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. @@ -116,6 +116,11 @@ public: DevelTextEditor::SelectionClearedSignalType& SelectionClearedSignal(); /** + * @copydoc Dali::Toollkit::TextEditor::SelectionStartedSignal() + */ + DevelTextEditor::SelectionStartedSignalType& SelectionStartedSignal(); + + /** * 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. @@ -448,6 +453,11 @@ private: // Implementation void EmitSelectionClearedSignal(); /** + * @brief Emits SelectionStarted signal. + */ + void EmitSelectionStartedSignal(); + + /** * @brief set RenderActor's position with new scrollPosition * * Apply updated scroll position or start scroll animation if VerticalScrollAnimation is enabled @@ -512,6 +522,7 @@ private: // Data Toolkit::DevelTextEditor::CursorPositionChangedSignalType mCursorPositionChangedSignal; Toolkit::DevelTextEditor::SelectionChangedSignalType mSelectionChangedSignal; Toolkit::DevelTextEditor::SelectionClearedSignalType mSelectionClearedSignal; + Toolkit::DevelTextEditor::SelectionStartedSignalType mSelectionStartedSignal; InputMethodContext mInputMethodContext; Text::ControllerPtr mController; @@ -551,6 +562,8 @@ private: // Data uint32_t mOldSelectionStart; uint32_t mOldSelectionEnd; + bool mSelectionStarted : 1; ///< If true, emits SelectionStartedSignal at the end of OnRelayout(). + struct PropertyHandler; /** diff --git a/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp b/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp index 3475b36..2b813da 100644 --- a/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp @@ -153,6 +153,7 @@ DALI_SIGNAL_REGISTRATION(Toolkit, TextField, "inputFiltered", SIGNAL_INP DALI_SIGNAL_REGISTRATION(Toolkit, TextField, "cursorPositionChanged", SIGNAL_CURSOR_POSITION_CHANGED) DALI_SIGNAL_REGISTRATION(Toolkit, TextField, "selectionChanged", SIGNAL_SELECTION_CHANGED ) DALI_SIGNAL_REGISTRATION(Toolkit, TextField, "selectionCleared", SIGNAL_SELECTION_CLEARED ) +DALI_SIGNAL_REGISTRATION(Toolkit, TextField, "selectionStarted", SIGNAL_SELECTION_STARTED ) DALI_TYPE_REGISTRATION_END() // clang-format on @@ -417,6 +418,14 @@ bool TextField::DoConnectSignal(BaseObject* object, ConnectionTrackerInterface* fieldImpl.SelectionClearedSignal().Connect(tracker, functor); } } + else if(0 == strcmp(signalName.c_str(), SIGNAL_SELECTION_STARTED)) + { + if(field) + { + Internal::TextField& fieldImpl(GetImpl(field)); + fieldImpl.SelectionStartedSignal().Connect(tracker, functor); + } + } else { // signalName does not match any signal @@ -466,6 +475,11 @@ DevelTextField::SelectionClearedSignalType& TextField::SelectionClearedSignal() return mSelectionClearedSignal; } +DevelTextField::SelectionStartedSignalType& TextField::SelectionStartedSignal() +{ + return mSelectionStartedSignal; +} + void TextField::OnAccessibilityStatusChanged() { CommonTextUtils::SynchronizeTextAnchorsInParent(Self(), mController, mAnchorActors); @@ -676,6 +690,11 @@ void TextField::OnRelayout(const Vector2& size, RelayoutContainer& container) EmitCursorPositionChangedSignal(); } + if(mSelectionStarted) + { + EmitSelectionStartedSignal(); + } + if(mSelectionChanged) { EmitSelectionChangedSignal(); @@ -951,6 +970,13 @@ void TextField::EmitSelectionClearedSignal() mSelectionCleared = false; } +void TextField::EmitSelectionStartedSignal() +{ + Dali::Toolkit::TextField handle(GetOwner()); + mSelectionStartedSignal.Emit(handle); + mSelectionStarted = false; +} + void TextField::SelectionChanged(uint32_t oldStart, uint32_t oldEnd, uint32_t newStart, uint32_t newEnd) { if(((oldStart != newStart) || (oldEnd != newEnd)) && !mSelectionChanged) @@ -959,6 +985,13 @@ void TextField::SelectionChanged(uint32_t oldStart, uint32_t oldEnd, uint32_t ne { mSelectionCleared = true; } + else + { + if(oldStart == oldEnd) + { + mSelectionStarted = true; + } + } mSelectionChanged = true; mOldSelectionStart = oldStart; @@ -1117,7 +1150,8 @@ TextField::TextField() mSelectionCleared(false), mOldPosition(0u), mOldSelectionStart(0u), - mOldSelectionEnd(0u) + mOldSelectionEnd(0u), + mSelectionStarted(false) { } diff --git a/dali-toolkit/internal/controls/text-controls/text-field-impl.h b/dali-toolkit/internal/controls/text-controls/text-field-impl.h index e53189e..51a97c7 100644 --- a/dali-toolkit/internal/controls/text-controls/text-field-impl.h +++ b/dali-toolkit/internal/controls/text-controls/text-field-impl.h @@ -2,7 +2,7 @@ #define DALI_TOOLKIT_INTERNAL_TEXT_FIELD_H /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 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. @@ -139,6 +139,11 @@ public: */ DevelTextField::SelectionClearedSignalType& SelectionClearedSignal(); + /** + * @copydoc TextField::SelectionStartedSignal() + */ + DevelTextField::SelectionStartedSignalType& SelectionStartedSignal(); + private: // From Control /** * @copydoc Control::OnInitialize() @@ -418,6 +423,11 @@ private: // Implementation void EmitSelectionClearedSignal(); /** + * @brief Emits SelectionStarted signal. + */ + void EmitSelectionStartedSignal(); + + /** * @brief Callback function for when the layout is changed. * @param[in] actor The actor whose layoutDirection is changed. * @param[in] type The layoutDirection. @@ -467,6 +477,7 @@ private: // Data Toolkit::DevelTextField::CursorPositionChangedSignalType mCursorPositionChangedSignal; Toolkit::DevelTextField::SelectionChangedSignalType mSelectionChangedSignal; Toolkit::DevelTextField::SelectionClearedSignalType mSelectionClearedSignal; + Toolkit::DevelTextField::SelectionStartedSignalType mSelectionStartedSignal; InputMethodContext mInputMethodContext; Text::ControllerPtr mController; @@ -498,6 +509,8 @@ private: // Data uint32_t mOldSelectionStart; uint32_t mOldSelectionEnd; + bool mSelectionStarted : 1; ///< If true, emits SelectionStartedSignal at the end of OnRelayout(). + protected: struct PropertyHandler; -- 2.7.4