return std::move(std::get<0>(chs));
}
- std::tuple< int32_t, int32_t, int32_t, int32_t > TestGetExtents(const Address &adr)
+ std::tuple< int32_t, int32_t, int32_t, int32_t > TestGetExtents(const Address &adr, Dali::Accessibility::CoordinateType coordinateType)
{
auto wr = static_cast<TestDBusWrapper*>(DBusWrapper::Installed());
- auto chs = wr->fromTestCall< std::tuple< int32_t, int32_t, int32_t, int32_t > >(adr.GetPath(), "org.a11y.atspi.Component", "GetExtents", std::tuple<uint32_t>(0));
+ auto chs = wr->fromTestCall< std::tuple< int32_t, int32_t, int32_t, int32_t > >(adr.GetPath(), "org.a11y.atspi.Component", "GetExtents", std::make_tuple(static_cast<uint32_t>(coordinateType)));
return std::move(std::get<0>(chs));
}
bool TestGrabFocus(const Address &adr);
bool TestGrabHighlight(const Address &adr);
bool TestClearHighlight(const Address &adr);
- std::tuple< int32_t, int32_t, int32_t, int32_t > TestGetExtents(const Address &adr);
+ std::tuple< int32_t, int32_t, int32_t, int32_t > TestGetExtents(const Address &adr, Dali::Accessibility::CoordinateType coordinateType );
int TestGetMdiZOrder(const Address &adr);
double TestGetAlpha(const Address &adr);
void printTree(const Address &root, size_t depth = 0);
END_TEST;
}
+
+int UtcDaliAccessibilityCheckShowingState(void)
+{
+ ToolkitTestApplication application;
+
+ auto parentButton = Toolkit::PushButton::New();
+ parentButton.SetProperty(Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_TO_BOUNDING_BOX);
+ parentButton.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
+ parentButton.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
+ parentButton.SetProperty(Actor::Property::POSITION, Dali::Vector2(0.0f, 0.0f));
+ parentButton.SetProperty(Actor::Property::SIZE, Dali::Vector2(200.0f, 200.0f));
+ application.GetScene().Add( parentButton );
+
+ // Toatally inside of parent
+ auto buttonA = Toolkit::PushButton::New();
+ buttonA.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
+ buttonA.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
+ buttonA.SetProperty(Actor::Property::POSITION, Dali::Vector2(0.0f, 0.0f));
+ buttonA.SetProperty(Actor::Property::SIZE, Dali::Vector2(100.0f, 100.0f));
+ parentButton.Add(buttonA);
+
+ // Toatally outside of parent
+ auto buttonB = Toolkit::PushButton::New();
+ buttonB.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
+ buttonB.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
+ buttonB.SetProperty(Actor::Property::POSITION, Dali::Vector2(300.0f, 300.0f));
+ buttonB.SetProperty(Actor::Property::SIZE, Dali::Vector2(100.0f, 100.0f));
+ parentButton.Add(buttonB);
+
+ // Partially inside of parent
+ auto buttonC = Toolkit::PushButton::New();
+ buttonC.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
+ buttonC.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
+ buttonC.SetProperty(Actor::Property::POSITION, Dali::Vector2(100.0f,100.0f));
+ buttonC.SetProperty(Actor::Property::SIZE, Dali::Vector2(200.0f, 200.0f));
+ parentButton.Add(buttonC);
+
+ application.SendNotification();
+ application.Render(16);
+
+ auto q = Dali::Accessibility::Accessible::Get(buttonA);
+ DALI_TEST_CHECK(q);
+ auto states = q->GetStates();
+ DALI_TEST_EQUALS((int) states[Dali::Accessibility::State::SHOWING], (int) true, TEST_LOCATION);
+
+ q = Dali::Accessibility::Accessible::Get(buttonB);
+ DALI_TEST_CHECK(q);
+ states = q->GetStates();
+ DALI_TEST_EQUALS((int) states[Dali::Accessibility::State::SHOWING], (int) false, TEST_LOCATION);
+
+ q = Dali::Accessibility::Accessible::Get(buttonC);
+ DALI_TEST_CHECK(q);
+ states = q->GetStates();
+ DALI_TEST_EQUALS((int) states[Dali::Accessibility::State::SHOWING], (int) true, TEST_LOCATION);
+
+ // Make SHOWING object invisible
+ buttonC.SetProperty(Actor::Property::VISIBLE, false);
+
+ application.SendNotification();
+ application.Render(16);
+
+ states = q->GetStates();
+ DALI_TEST_EQUALS((int) states[Dali::Accessibility::State::SHOWING], (int) false, TEST_LOCATION);
+
+ END_TEST;
+}
\ No newline at end of file
#include <dali-toolkit/dali-toolkit.h>
#include <dali/devel-api/adaptor-framework/accessibility.h>
#include <dali/devel-api/adaptor-framework/accessibility-impl.h>
+#include <dali/devel-api/adaptor-framework/window-devel.h>
#include <dali-toolkit/devel-api/controls/buttons/toggle-button.h>
#include <dali-toolkit/devel-api/controls/control-devel.h>
#include <dali-toolkit/devel-api/controls/popup/popup.h>
END_TEST;
}
-int UtcDaliAccessibilityGetExtents(void)
+int UtcDaliAccessibilityGetExtentsScreenAndWindowPositionMatch(void)
{
ToolkitTestApplication application;
+ tet_infoline( "UtcDaliAccessibilityGetExtentsScreenAndWindowPositionMatch" );
Dali::Accessibility::TestEnableSC( true );
auto control = Control::New();
Stage::GetCurrent().GetRootLayer().Add( control );
- control.SetProperty(Actor::Property::POSITION, Vector3(10, 10, 100));
- control.SetProperty(Actor::Property::SIZE, Vector2(10, 10));
+ auto window = Dali::DevelWindow::Get( control );
+ DALI_TEST_CHECK( window );
+
+ //window.SetPosition({0,0});
+ DevelWindow::SetPositionSize( window, PositionSize( 0,0,480, 240 ) );
+
+ control.SetProperty( Actor::Property::POSITION, Vector3( 10, 10, 100 ) );
+ control.SetProperty( Actor::Property::SIZE, Vector2( 10, 10 ) );
+
+ application.SendNotification();
+ application.Render( 1 );
+
+ auto a = Dali::Accessibility::Accessible::Get( control );
+ auto a_component = dynamic_cast<Dali::Accessibility::Component*>( a );
+
+ auto extents = a_component->GetExtents( Dali::Accessibility::CoordinateType::SCREEN );
+ DALI_TEST_EQUALS( extents.x, 5.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( extents.y, 5.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( extents.height, 10.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( extents.width, 10.0f, TEST_LOCATION );
+
+ auto bridge_extents = TestGetExtents( a_component -> GetAddress(), Dali::Accessibility::CoordinateType::SCREEN );
+ DALI_TEST_EQUALS( std::get< 0 >( bridge_extents ), 5, TEST_LOCATION );
+ DALI_TEST_EQUALS( std::get< 1 >( bridge_extents ), 5, TEST_LOCATION );
+ DALI_TEST_EQUALS( std::get< 2 >( bridge_extents ), 10, TEST_LOCATION );
+ DALI_TEST_EQUALS( std::get< 3 >( bridge_extents ), 10, TEST_LOCATION );
+
+ extents = a_component->GetExtents( Dali::Accessibility::CoordinateType::WINDOW );
+ DALI_TEST_EQUALS( extents.x, 5.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( extents.y, 5.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( extents.height, 10.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( extents.width, 10.0f, TEST_LOCATION );
+
+ bridge_extents = TestGetExtents( a_component -> GetAddress(), Dali::Accessibility::CoordinateType::WINDOW );
+ DALI_TEST_EQUALS( std::get< 0 >( bridge_extents ), 5, TEST_LOCATION );
+ DALI_TEST_EQUALS( std::get< 1 >( bridge_extents ), 5, TEST_LOCATION );
+ DALI_TEST_EQUALS( std::get< 2 >( bridge_extents ), 10, TEST_LOCATION );
+ DALI_TEST_EQUALS( std::get< 3 >( bridge_extents ), 10, TEST_LOCATION );
+
+ control.SetProperty( Dali::DevelActor::Property::POSITION_USES_ANCHOR_POINT, false );
+ application.SendNotification();
+ application.Render( 1 );
+
+ extents = a_component->GetExtents( Dali::Accessibility::CoordinateType::SCREEN );
+ DALI_TEST_EQUALS( extents.x, 10.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( extents.y, 10.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( extents.height, 10.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( extents.width, 10.0f, TEST_LOCATION );
+
+ bridge_extents = TestGetExtents( a_component -> GetAddress(), Dali::Accessibility::CoordinateType::SCREEN );
+ DALI_TEST_EQUALS( std::get< 0 >( bridge_extents ), 10, TEST_LOCATION );
+ DALI_TEST_EQUALS( std::get< 1 >( bridge_extents ), 10, TEST_LOCATION );
+ DALI_TEST_EQUALS( std::get< 2 >( bridge_extents ), 10, TEST_LOCATION );
+ DALI_TEST_EQUALS( std::get< 3 >( bridge_extents ), 10, TEST_LOCATION );
+
+ extents = a_component->GetExtents( Dali::Accessibility::CoordinateType::WINDOW );
+ DALI_TEST_EQUALS( extents.x, 10.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( extents.y, 10.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( extents.height, 10.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( extents.width, 10.0f, TEST_LOCATION );
+
+ bridge_extents = TestGetExtents( a_component -> GetAddress(), Dali::Accessibility::CoordinateType::WINDOW );
+ DALI_TEST_EQUALS( std::get< 0 >( bridge_extents ), 10, TEST_LOCATION );
+ DALI_TEST_EQUALS( std::get< 1 >( bridge_extents ), 10, TEST_LOCATION );
+ DALI_TEST_EQUALS( std::get< 2 >( bridge_extents ), 10, TEST_LOCATION );
+ DALI_TEST_EQUALS( std::get< 3 >( bridge_extents ), 10, TEST_LOCATION );
+
+ Dali::Accessibility::TestEnableSC( false );
+
+ END_TEST;
+}
+
+int UtcDaliAccessibilityGetExtentsScreenAndWindowPositionDoNotMatch(void)
+{
+ ToolkitTestApplication application;
+
+ Dali::Accessibility::TestEnableSC( true );
+
+ auto control = Control::New();
+ Stage::GetCurrent().GetRootLayer().Add( control );
+ auto window = Dali::DevelWindow::Get( control );
+ //window.SetPosition({33,33});
+ DevelWindow::SetPositionSize( window, PositionSize( 33,33,480, 240 ) );
+
+ control.SetProperty( Actor::Property::POSITION, Vector3( 10, 10, 100 ) );
+ control.SetProperty( Actor::Property::SIZE, Vector2( 10, 10 ) );
application.SendNotification();
application.Render( 1 );
auto a = Dali::Accessibility::Accessible::Get( control );
auto a_component = dynamic_cast<Dali::Accessibility::Component*>( a );
- auto extents = a_component->GetExtents(Dali::Accessibility::CoordinateType::SCREEN);
+ auto extents = a_component->GetExtents( Dali::Accessibility::CoordinateType::SCREEN );
+ DALI_TEST_EQUALS( extents.x, 38.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( extents.y, 38.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( extents.height, 10.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( extents.width, 10.0f, TEST_LOCATION );
+
+ auto bridge_extents = TestGetExtents( a_component -> GetAddress(), Dali::Accessibility::CoordinateType::SCREEN );
+ DALI_TEST_EQUALS( std::get< 0 >( bridge_extents ), 38, TEST_LOCATION );
+ DALI_TEST_EQUALS( std::get< 1 >( bridge_extents ), 38, TEST_LOCATION );
+ DALI_TEST_EQUALS( std::get< 2 >( bridge_extents ), 10, TEST_LOCATION );
+ DALI_TEST_EQUALS( std::get< 3 >( bridge_extents ), 10, TEST_LOCATION );
+
+ extents = a_component->GetExtents( Dali::Accessibility::CoordinateType::WINDOW );
DALI_TEST_EQUALS( extents.x, 5.0f, TEST_LOCATION );
DALI_TEST_EQUALS( extents.y, 5.0f, TEST_LOCATION );
DALI_TEST_EQUALS( extents.height, 10.0f, TEST_LOCATION );
DALI_TEST_EQUALS( extents.width, 10.0f, TEST_LOCATION );
- auto bridge_extents = TestGetExtents( a_component -> GetAddress() );
+ bridge_extents = TestGetExtents( a_component -> GetAddress(), Dali::Accessibility::CoordinateType::WINDOW );
DALI_TEST_EQUALS( std::get< 0 >( bridge_extents ), 5, TEST_LOCATION );
DALI_TEST_EQUALS( std::get< 1 >( bridge_extents ), 5, TEST_LOCATION );
DALI_TEST_EQUALS( std::get< 2 >( bridge_extents ), 10, TEST_LOCATION );
application.SendNotification();
application.Render( 1 );
- extents = a_component->GetExtents(Dali::Accessibility::CoordinateType::SCREEN);
+ extents = a_component->GetExtents( Dali::Accessibility::CoordinateType::SCREEN );
+ DALI_TEST_EQUALS( extents.x, 43.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( extents.y, 43.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( extents.height, 10.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( extents.width, 10.0f, TEST_LOCATION );
+
+ bridge_extents = TestGetExtents( a_component -> GetAddress(), Dali::Accessibility::CoordinateType::SCREEN );
+ DALI_TEST_EQUALS( std::get< 0 >( bridge_extents ), 43, TEST_LOCATION );
+ DALI_TEST_EQUALS( std::get< 1 >( bridge_extents ), 43, TEST_LOCATION );
+ DALI_TEST_EQUALS( std::get< 2 >( bridge_extents ), 10, TEST_LOCATION );
+ DALI_TEST_EQUALS( std::get< 3 >( bridge_extents ), 10, TEST_LOCATION );
+
+ extents = a_component->GetExtents( Dali::Accessibility::CoordinateType::WINDOW );
DALI_TEST_EQUALS( extents.x, 10.0f, TEST_LOCATION );
DALI_TEST_EQUALS( extents.y, 10.0f, TEST_LOCATION );
DALI_TEST_EQUALS( extents.height, 10.0f, TEST_LOCATION );
DALI_TEST_EQUALS( extents.width, 10.0f, TEST_LOCATION );
- bridge_extents = TestGetExtents( a_component -> GetAddress() );
+ bridge_extents = TestGetExtents( a_component -> GetAddress(), Dali::Accessibility::CoordinateType::WINDOW );
DALI_TEST_EQUALS( std::get< 0 >( bridge_extents ), 10, TEST_LOCATION );
DALI_TEST_EQUALS( std::get< 1 >( bridge_extents ), 10, TEST_LOCATION );
DALI_TEST_EQUALS( std::get< 2 >( bridge_extents ), 10, TEST_LOCATION );
// Make precondition two children exist in parent area
PushButton parentButton = PushButton::New();
+ parentButton.SetProperty(Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_TO_BOUNDING_BOX);
parentButton.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
parentButton.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
- parentButton.SetProperty( Dali::Actor::Property::POSITION, Dali::Vector2(0.0f, 0.0f) );
- parentButton.SetProperty( Dali::Actor::Property::SIZE, Dali::Vector2(100.0f, 200.0f) );
+ parentButton.SetProperty(Actor::Property::POSITION, Dali::Vector2(0.0f, 0.0f));
+ parentButton.SetProperty(Actor::Property::SIZE, Dali::Vector2(100.0f, 200.0f));
application.GetScene().Add( parentButton );
PushButton buttonA = PushButton::New();
buttonA.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
buttonA.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
- buttonA.SetProperty( Dali::Actor::Property::POSITION, Dali::Vector2(0.0f, 0.0f) );
- buttonA.SetProperty( Dali::Actor::Property::SIZE, Dali::Vector2(100.0f, 100.0f) );
+ buttonA.SetProperty(Actor::Property::POSITION, Dali::Vector2(0.0f, 0.0f));
+ buttonA.SetProperty(Actor::Property::SIZE, Dali::Vector2(100.0f, 100.0f));
parentButton.Add(buttonA);
PushButton buttonB = PushButton::New();
buttonB.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
buttonB.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
- buttonB.SetProperty( Dali::Actor::Property::POSITION, Dali::Vector2(0.0f, 100.0f) );
- buttonB.SetProperty( Dali::Actor::Property::SIZE, Dali::Vector2(100.0f, 100.0f) );
+ buttonB.SetProperty(Actor::Property::POSITION, Dali::Vector2(0.0f, 100.0f));
+ buttonB.SetProperty(Actor::Property::SIZE, Dali::Vector2(100.0f, 100.0f));
parentButton.Add(buttonB);
Wait(application);
Wait(application);
// Move first child (A) out of parent area through the parent's area top edge - single move outed event expected for A object and OUTGOING_TOP_LEFT direction
- buttonA.SetProperty( Dali::Actor::Property::POSITION, Dali::Vector2(0.0f, -200.0f) );
+ buttonA.SetProperty(Actor::Property::POSITION, Dali::Vector2(0.0f, -200.0f));
Wait(application);
- // Need one more seding notificaiton to get correct updated position
+ // Need one more notificaiton to get correct updated position
application.SendNotification();
DALI_TEST_EQUALS( true, Dali::Accessibility::TestGetMoveOutedCalled(), TEST_LOCATION );
// Move first child (A) outside of parent area (both start and end position are outside of parent area) - no move outed event expected for A object
buttonA.SetProperty( Dali::Actor::Property::POSITION, Dali::Vector2(0.0f, -300.0f) );
Wait(application);
- // Need one more seding notificaiton to get correct updated position
+ // Need one more notificaiton to get correct updated position
application.SendNotification();
DALI_TEST_EQUALS( false, Dali::Accessibility::TestGetMoveOutedCalled(), TEST_LOCATION );
// B: (0,100) --> (0, 50)
buttonB.SetProperty( Dali::Actor::Property::POSITION, Dali::Vector2(0.0f, 50.0f) );
Wait(application);
- // Need one more seding notificaiton to get correct updated position
+ // Need one more notificaiton to get correct updated position
application.SendNotification();
DALI_TEST_EQUALS( false, Dali::Accessibility::TestGetMoveOutedCalled(), TEST_LOCATION );
Dali::Accessibility::TestResetMoveOutedCalled();
// Move second child (B) out of parent area through the parent's area right edge - single move outed event expected for B object and OUTGOING_BOTTOM_RIGHT direction
- buttonB.SetProperty( Dali::Actor::Property::POSITION, Dali::Vector2(300.0f, 100.0f) );
+ buttonB.SetProperty(Actor::Property::POSITION, Dali::Vector2(300.0f, 100.0f));
Wait(application);
- // Need one more seding notificaiton to get correct updated position
+ // Need one more notificaiton to get correct updated position
application.SendNotification();
DALI_TEST_EQUALS( true, Dali::Accessibility::TestGetMoveOutedCalled(), TEST_LOCATION );
// Sets some text.
controller->SetText( "Hello world" );
+ // When the TextSelectionPopup is active, the controller has focus.
+ controller->KeyboardFocusGainEvent();
+
// Select the whole text.
button = PushButton::DownCast( textPopup.FindChildByName( OPTION_SELECT_ALL ) );
DALI_TEST_CHECK( button );
END_TEST;
}
+int UtcDaliTextEditorSelectText(void)
+{
+ ToolkitTestApplication application;
+ tet_infoline(" UtcDaliTextEditorSelectText ");
+
+ TextEditor textEditor = TextEditor::New();
+
+ application.GetScene().Add( textEditor );
+
+ textEditor.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) );
+ textEditor.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT );
+ textEditor.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT );
+
+ // Avoid a crash when core load gl resources.
+ application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
+
+ application.SendNotification();
+ application.Render();
+
+ DevelTextEditor::SelectText( textEditor ,0, 5 );
+
+ application.SendNotification();
+ application.Render();
+
+ // Nothing is selected
+ std::string selectedText = textEditor.GetProperty( DevelTextEditor::Property::SELECTED_TEXT ).Get<std::string>();
+ DALI_TEST_EQUALS( "", selectedText, TEST_LOCATION );
+
+ textEditor.SetProperty( TextEditor::Property::TEXT, "Hello world" );
+
+ application.SendNotification();
+ application.Render();
+
+ DevelTextEditor::SelectText( textEditor, 0, 5 );
+
+ application.SendNotification();
+ application.Render();
+
+ selectedText = textEditor.GetProperty( DevelTextEditor::Property::SELECTED_TEXT ).Get<std::string>();
+ DALI_TEST_EQUALS( "Hello", selectedText, TEST_LOCATION );
+
+ DALI_TEST_EQUALS( textEditor.GetProperty( DevelTextEditor::Property::SELECTED_TEXT_START ).Get<int>(), 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( textEditor.GetProperty( DevelTextEditor::Property::SELECTED_TEXT_END ).Get<int>(), 5, TEST_LOCATION );
+
+ // world is selected
+ DevelTextEditor::SelectText( textEditor, 6, 11 );
+
+ application.SendNotification();
+ application.Render();
+
+ selectedText = textEditor.GetProperty( DevelTextEditor::Property::SELECTED_TEXT ).Get<std::string>();
+ DALI_TEST_EQUALS( "world", selectedText, TEST_LOCATION );
+
+ DALI_TEST_EQUALS( textEditor.GetProperty( DevelTextEditor::Property::SELECTED_TEXT_START ).Get<int>(), 6, TEST_LOCATION );
+ DALI_TEST_EQUALS( textEditor.GetProperty( DevelTextEditor::Property::SELECTED_TEXT_END ).Get<int>(), 11, TEST_LOCATION );
+
+ END_TEST;
+}
+
int UtcDaliTextEditorSelectNone(void)
{
ToolkitTestApplication application;
textEditor.SetProperty( DevelTextEditor::Property::PRIMARY_CURSOR_POSITION, 3);
application.SendNotification();
application.Render();
+ textEditor.SetKeyInputFocus();
application.ProcessEvent( GenerateKey( "D", "", "D", KEY_D_CODE, 0, 0, Integration::KeyEvent::DOWN, "D", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) );
END_TEST;
}
+int UtcDaliTextFieldSelectText(void)
+{
+ ToolkitTestApplication application;
+ tet_infoline(" UtcDaliTextFieldSelectText ");
+
+ TextField textField = TextField::New();
+
+ application.GetScene().Add( textField );
+
+ textField.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) );
+ textField.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT );
+ textField.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT );
+
+ // Avoid a crash when core load gl resources.
+ application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
+
+ application.SendNotification();
+ application.Render();
+
+ DevelTextField::SelectText( textField, 0, 5 );
+
+ application.SendNotification();
+ application.Render();
+
+ // Nothing is selected
+ std::string selectedText = textField.GetProperty( DevelTextField::Property::SELECTED_TEXT ).Get<std::string>();
+ DALI_TEST_EQUALS( "", selectedText, TEST_LOCATION );
+
+ textField.SetProperty( TextField::Property::TEXT, "Hello world" );
+
+ application.SendNotification();
+ application.Render();
+
+ // Hello is selected
+ DevelTextField::SelectText( textField, 0, 5 );
+
+ application.SendNotification();
+ application.Render();
+
+ selectedText = textField.GetProperty( DevelTextField::Property::SELECTED_TEXT ).Get<std::string>();
+ DALI_TEST_EQUALS( "Hello", selectedText, TEST_LOCATION );
+
+ DALI_TEST_EQUALS( textField.GetProperty( DevelTextField::Property::SELECTED_TEXT_START ).Get<int>(), 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( textField.GetProperty( DevelTextField::Property::SELECTED_TEXT_END ).Get<int>(), 5, TEST_LOCATION );
+
+ // world is selected
+ DevelTextField::SelectText( textField, 6, 11 );
+
+ application.SendNotification();
+ application.Render();
+
+ selectedText = textField.GetProperty( DevelTextField::Property::SELECTED_TEXT ).Get<std::string>();
+ DALI_TEST_EQUALS( "world", selectedText, TEST_LOCATION );
+
+ DALI_TEST_EQUALS( textField.GetProperty( DevelTextField::Property::SELECTED_TEXT_START ).Get<int>(), 6, TEST_LOCATION );
+ DALI_TEST_EQUALS( textField.GetProperty( DevelTextField::Property::SELECTED_TEXT_END ).Get<int>(), 11, TEST_LOCATION );
+
+ END_TEST;
+}
+
int UtcDaliTextFieldSelectNone(void)
{
ToolkitTestApplication application;
textField.SetProperty( DevelTextField::Property::PRIMARY_CURSOR_POSITION, 3);
application.SendNotification();
application.Render();
+ textField.SetKeyInputFocus();
application.ProcessEvent( GenerateKey( "D", "", "D", KEY_D_CODE, 0, 0, Integration::KeyEvent::DOWN, "D", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) );
#endif
#include <dali/devel-api/actors/actor-devel.h>
+#include <dali/devel-api/adaptor-framework/window-devel.h>
// INTERNAL INCLUDES
#include <dali-toolkit/devel-api/asset-manager/asset-manager.h>
return GetLocaleText(GetRoleName());
}
+bool AccessibleImpl::IsShowing()
+{
+ Dali::Actor self = Self();
+ if(self.GetProperty(Dali::DevelActor::Property::CULLED).Get<bool>() || !self.GetCurrentProperty<bool>(Actor::Property::VISIBLE))
+ {
+ return false;
+ }
+
+ auto* child = this;
+ auto* parent = dynamic_cast<Toolkit::DevelControl::AccessibleImpl*>(child->GetParent());
+ if(!parent)
+ {
+ return true;
+ }
+
+ auto childExtent = child->GetExtents(Dali::Accessibility::CoordinateType::WINDOW);
+ while(parent)
+ {
+ auto control = Dali::Toolkit::Control::DownCast(parent->Self());
+ auto clipMode = control.GetProperty(Actor::Property::CLIPPING_MODE).Get<bool>();
+ auto parentExtent = parent->GetExtents(Dali::Accessibility::CoordinateType::WINDOW);
+ if ((clipMode != ClippingMode::DISABLED) && !parentExtent.Intersects(childExtent))
+ {
+ return false;
+ }
+ parent = dynamic_cast<Toolkit::DevelControl::AccessibleImpl*>(parent->GetParent());
+ }
+
+ return true;
+}
+
Dali::Accessibility::States AccessibleImpl::CalculateStates()
{
Dali::Actor self = Self();
{
state[Dali::Accessibility::State::MODAL] = true;
}
- state[Dali::Accessibility::State::SHOWING] = !self.GetProperty(Dali::DevelActor::Property::CULLED).Get<bool>() && self.GetCurrentProperty<bool>(Actor::Property::VISIBLE);
-
+ state[Dali::Accessibility::State::SHOWING] = IsShowing();
state[Dali::Accessibility::State::DEFUNCT] = !self.GetProperty(Dali::DevelActor::Property::CONNECTED_TO_SCENE).Get<bool>();
return state;
}
Vector3 anchorPointOffSet = size * (positionUsesAnchorPoint ? self.GetCurrentProperty<Vector3>(Actor::Property::ANCHOR_POINT) : AnchorPoint::TOP_LEFT);
Vector2 position = Vector2((screenPosition.x - anchorPointOffSet.x), (screenPosition.y - anchorPointOffSet.y));
- return {position.x, position.y, size.x, size.y};
+ if(type == Dali::Accessibility::CoordinateType::WINDOW)
+ {
+ return {position.x, position.y, size.x, size.y};
+ }
+ else // Dali::Accessibility::CoordinateType::SCREEN
+ {
+ auto window = Dali::DevelWindow::Get(self);
+ auto windowPosition = window.GetPosition();
+ return {position.x + windowPosition.GetX(), position.y + windowPosition.GetY(), size.x, size.y};
+ }
}
int16_t AccessibleImpl::GetMdiZOrder()
*/
void UnregisterPositionPropertyNotification();
+ /**
+ * @brief Check if the actor is showing
+ * @return True if the actor is showing
+ */
+ bool IsShowing();
+
public:
AccessibleImpl(Dali::Actor self, Dali::Accessibility::Role role, bool modal = false);
GetImpl(textEditor).SelectNone();
}
+void SelectText(TextEditor textEditor, const uint32_t start, const uint32_t end)
+{
+ GetImpl(textEditor).SelectText(start, end);
+}
+
void ScrollBy(TextEditor textEditor, Vector2 scroll)
{
GetImpl(textEditor).ScrollBy(scroll);
DALI_TOOLKIT_API void SelectNone(TextEditor textEditor);
/**
+ * @brief Select the text from start index to end index of TextEditor.
+ * @note
+ * The selection index is based on the cursor index.
+ *
+ * text H e l l o
+ * index 0 1 2 3 4 5
+ * if textEditor.SelectText(1, 4); is executed, "ell" is selected.
+ *
+ * @param[in] textEditor The instance of TextEditor.
+ * @param[in] start The start index of the text to select. (The starting point of start index is 0.)
+ * @param[in] end The end index of the text to select. (If end index > text's length, the end index is set to the length of the text.)
+ */
+DALI_TOOLKIT_API void SelectText(TextEditor textEditor, const uint32_t start, const uint32_t end);
+
+/**
* @brief Scroll the TextEditor by specific amount.
*
* @param[in] textEditor The instance of TextEditor.
GetImpl(textField).SelectNone();
}
+void SelectText(TextField textField, const uint32_t start, const uint32_t end)
+{
+ GetImpl(textField).SelectText(start, end);
+}
+
} // namespace DevelTextField
} // namespace Toolkit
*/
DALI_TOOLKIT_API void SelectNone(TextField textField);
+/**
+ * @brief Select the text from start index to end index of TextField.
+ * @note
+ * The selection index is based on the cursor index.
+ *
+ * text H e l l o
+ * index 0 1 2 3 4 5
+ * if textField.SelectText(1, 4); is executed, "ell" is selected.
+ *
+ * @param[in] textField The instance of TextField.
+ * @param[in] start The start index of the text to select. (The starting point of start index is 0.)
+ * @param[in] end The end index of the text to select. (If end index > text's length, the end index is set to the length of the text.)
+ */
+DALI_TOOLKIT_API void SelectText(TextField textField, const uint32_t start, const uint32_t end);
+
} // namespace DevelTextField
} // namespace Toolkit
{\r
namespace\r
{\r
+static constexpr float FULLY_TRANSPARENT(0.01f); ///< Alpha values must rise above this, before an object is considered to be visible.\r
+\r
static int MajorAxisDistanceRaw(Dali::Toolkit::Control::KeyboardFocus::Direction direction, Dali::Rect<float> source, Dali::Rect<float> dest)\r
{\r
switch(direction)\r
case Dali::Toolkit::Control::KeyboardFocus::RIGHT:\r
{\r
// the distance between the center verticals\r
- return std::abs(\r
- (((source.top + source.bottom) * 0.5f) -\r
- (((dest.top + dest.bottom) * 0.5f))));\r
+ return std::abs((source.top + (source.bottom - source.top) * 0.5f) -\r
+ (dest.top + (dest.bottom - dest.top) * 0.5f));\r
}\r
case Dali::Toolkit::Control::KeyboardFocus::UP:\r
case Dali::Toolkit::Control::KeyboardFocus::DOWN:\r
{\r
// the distance between the center horizontals\r
- return std::abs(\r
- (((source.left + source.right) * 0.5f) -\r
- (((dest.left + dest.right) * 0.5f))));\r
+ return std::abs((source.left + (source.right - source.left) * 0.5f) -\r
+ (dest.left + (dest.right - dest.left) * 0.5f));\r
}\r
default:\r
{\r
{\r
case Dali::Toolkit::Control::KeyboardFocus::LEFT:\r
{\r
- return (srcRect.right > destRect.right || srcRect.left >= destRect.right) && srcRect.left > destRect.left;\r
+ return (srcRect.right > destRect.right || srcRect.left >= destRect.right);\r
}\r
case Dali::Toolkit::Control::KeyboardFocus::RIGHT:\r
{\r
- return (srcRect.left < destRect.left || srcRect.right <= destRect.left) && srcRect.right < destRect.right;\r
+ return (srcRect.left < destRect.left || srcRect.right <= destRect.left);\r
}\r
case Dali::Toolkit::Control::KeyboardFocus::UP:\r
{\r
- return (srcRect.bottom > destRect.bottom || srcRect.top >= destRect.bottom) && srcRect.top > destRect.top;\r
+ return (srcRect.bottom > destRect.bottom || srcRect.top >= destRect.bottom);\r
}\r
case Dali::Toolkit::Control::KeyboardFocus::DOWN:\r
{\r
- return (srcRect.top < destRect.top || srcRect.bottom <= destRect.top) && srcRect.bottom < destRect.bottom;\r
+ return (srcRect.top < destRect.top || srcRect.bottom <= destRect.top);\r
}\r
default:\r
{\r
MinorAxisDistance(direction, focusedRect, bestCandidateRect)));\r
}\r
\r
+bool IsFocusable(Actor& actor)\r
+{\r
+ return (actor.GetProperty<bool>(Actor::Property::KEYBOARD_FOCUSABLE) &&\r
+ actor.GetProperty<bool>(Actor::Property::VISIBLE) &&\r
+ actor.GetProperty<bool>(Actor::Property::SENSITIVE) &&\r
+ actor.GetProperty<Vector4>(Actor::Property::WORLD_COLOR).a > FULLY_TRANSPARENT);\r
+}\r
+\r
Actor FindNextFocus(Actor& actor, Actor& focusedActor, Rect<float>& focusedRect, Rect<float>& bestCandidateRect, Toolkit::Control::KeyboardFocus::Direction direction)\r
{\r
Actor nearestActor;\r
for(auto i = 0u; i < childCount; ++i)\r
{\r
Dali::Actor child = actor.GetChildAt(i);\r
- if(child && child != focusedActor && child.GetProperty<bool>(Actor::Property::KEYBOARD_FOCUSABLE))\r
+ if(child && child != focusedActor && IsFocusable(child))\r
{\r
Rect<float> candidateRect = DevelActor::CalculateScreenExtents(child);\r
\r
OPACITY = Dali::Toolkit::Visual::Property::OPACITY,
/**
- * @brief The fitting mode of the visual
+ * @brief The fitting mode of the visual.
* @details Name "fittingMode", type FittingMode (Property::INTEGER) or Property::STRING.
* @see DevelVisual::FittingMode
* @note The default is defined by the type of visual (if it's suitable to be stretched or not).
VISUAL_FITTING_MODE = OPACITY + 1,
/**
- * @brief The radius for the rounded corners of the visual
+ * @brief The radius for the rounded corners of the visual.
* @details Name "cornerRadius", type Property::FLOAT or Prooperty::VECTOR4, animatable
* @note By default, it is Vector::ZERO.
* @note Only Property::Vector4 can be animated.
* @note Each radius will clamp internally to the half of smaller of the visual width and visual height.
- * @note Their may exist some alias when you use it as ClippingMode::CLIP_CHILDREN
+ * @note Their may exist some alias when you use it as ClippingMode::CLIP_CHILDREN.
* @note Radius value are used in clockwise order from top-left-corner to bottom-left-corner.
* When radius is Vector4(x, y, z, w)
* x y
CORNER_RADIUS = OPACITY + 2,
/**
- * @brief Whether the corner radius value is relative (percentage [0.0f to 1.0f] of the visual size) or absolute (in world units).
+ * @brief Whether the corner radius value is relative (percentage [0.0f to 0.5f] of the visual size) or absolute (in world units).
* @details Name "cornerRadiusPolicy", type Property::INTEGER.
* @see Policy::Type
* @note By default, it is ABSOLUTE to the visual's size.
CORNER_RADIUS_POLICY = OPACITY + 3,
/**
- * @brief The width for the borderline of the visual
+ * @brief The width for the borderline of the visual.
* @details Name "borderlineWidth", type Property::FLOAT, animatable
* @note Optional. Default value is 0.0f.
*/
BORDERLINE_WIDTH = OPACITY + 4,
/**
- * @brief The color for the borderline of the visual
+ * @brief The color for the borderline of the visual.
* @details Name "borderlineColor", type Property::VECTOR4, animatable
- * @note Default value is Color::BLACK
+ * @note Default value is Color::BLACK.
+ * @note This color is affected by opacity.
*/
BORDERLINE_COLOR = OPACITY + 5,
{
uint32_t position = static_cast<uint32_t>(value.Get<int>());
DALI_LOG_INFO(gLogFilter, Debug::General, "TextEditor %p PRIMARY_CURSOR_POSITION %d\n", impl.mController.Get(), position);
- if(impl.mController->SetPrimaryCursorPosition(position))
+ if(impl.mController->SetPrimaryCursorPosition(position, impl.HasKeyInputFocus()))
{
impl.SetKeyInputFocus();
}
}
}
+void TextEditor::SelectText(const uint32_t start, const uint32_t end)
+{
+ if(mController && mController->IsShowingRealText())
+ {
+ mController->SelectText(start, end);
+ SetKeyInputFocus();
+ }
+}
+
void TextEditor::ScrollBy(Vector2 scroll)
{
if(mController && mController->IsShowingRealText())
void SelectNone() override;
/**
+ * @copydoc Text::SelectableControlInterface::SelectText()
+ */
+ void SelectText(const uint32_t start, const uint32_t end) override;
+
+ /**
* @copydoc Dali::Toolkit::DevelTextEditor::ScrollBy()
*/
void ScrollBy(Vector2 Scroll);
{
uint32_t position = static_cast<uint32_t>(value.Get<int>());
DALI_LOG_INFO(gLogFilter, Debug::General, "TextField %p PRIMARY_CURSOR_POSITION %d\n", impl.mController.Get(), position);
- if(impl.mController->SetPrimaryCursorPosition(position))
+ if(impl.mController->SetPrimaryCursorPosition(position, impl.HasKeyInputFocus()))
{
impl.SetKeyInputFocus();
}
}
}
+void TextField::SelectText(const uint32_t start, const uint32_t end)
+{
+ if(mController && mController->IsShowingRealText())
+ {
+ mController->SelectText(start, end);
+ SetKeyInputFocus();
+ }
+}
+
string TextField::GetSelectedText() const
{
string selectedText = "";
void SelectNone() override;
/**
+ * @copydoc Text::SelectableControlInterface::SelectText()
+ */
+ void SelectText(const uint32_t start, const uint32_t end) override;
+
+ /**
* @copydoc Text::SelectableControlInterface::GetSelectedText()
*/
string GetSelectedText() const override;
{
if(EventData::INTERRUPTED != controller.mImpl->mEventData->mState)
{
+ // Init selection position
+ if(controller.mImpl->mEventData->mState == EventData::SELECTING)
+ {
+ controller.mImpl->mEventData->mLeftSelectionPosition = controller.mImpl->mEventData->mPrimaryCursorPosition;
+ controller.mImpl->mEventData->mRightSelectionPosition = controller.mImpl->mEventData->mPrimaryCursorPosition;
+ }
+
controller.mImpl->ChangeState(EventData::INACTIVE);
if(!controller.mImpl->IsShowingRealText())
}
}
+void Controller::EventHandler::SelectEvent(Controller& controller, const uint32_t start, const uint32_t end, SelectionType selectType)
+{
+ DALI_LOG_INFO(gLogFilter, Debug::Verbose, "Controller::SelectEvent\n");
+
+ if(NULL != controller.mImpl->mEventData)
+ {
+ if(selectType == SelectionType::RANGE)
+ {
+ Event event(Event::SELECT_RANGE);
+ event.p2.mUint = start;
+ event.p3.mUint = end;
+ controller.mImpl->mEventData->mEventQueue.push_back(event);
+ }
+
+ controller.mImpl->mEventData->mCheckScrollAmount = true;
+ controller.mImpl->mEventData->mIsLeftHandleSelected = true;
+ controller.mImpl->mEventData->mIsRightHandleSelected = true;
+ controller.mImpl->RequestRelayout();
+ }
+}
+
void Controller::EventHandler::ProcessModifyEvents(Controller& controller)
{
Vector<ModifyEvent>& events = controller.mImpl->mModifyEvents;
static void PanEvent(Controller& controller, GestureState state, const Vector2& displacement);
static void LongPressEvent(Controller& controller, GestureState state, float x, float y);
static void SelectEvent(Controller& controller, float x, float y, SelectionType selectType);
+ static void SelectEvent(Controller& controller, const uint32_t start, const uint32_t end, SelectionType selectType);
static void ProcessModifyEvents(Controller& controller);
static void TextReplacedEvent(Controller& controller);
static void TextInsertedEvent(Controller& controller);
OnSelectNoneEvent(impl);
break;
}
+ case Event::SELECT_RANGE:
+ {
+ OnSelectRangeEvent(impl, *iter);
+ break;
+ }
}
}
}
if(impl.mEventData)
{
EventData& eventData = *impl.mEventData;
- if(eventData.mSelectionEnabled)
+ if(eventData.mSelectionEnabled && eventData.mState != EventData::INACTIVE)
{
ModelPtr& model = impl.mModel;
const Vector2& scrollPosition = model->mScrollPosition;
}
}
+void ControllerImplEventHandler::OnSelectRangeEvent(Controller::Impl& impl, const Event& event)
+{
+ if(impl.mEventData && impl.mEventData->mSelectionEnabled && impl.mEventData->mState != EventData::INACTIVE)
+ {
+ ModelPtr& model = impl.mModel;
+ const Vector2& scrollPosition = model->mScrollPosition;
+
+ // Calculate the selection index.
+ const uint32_t length = static_cast<uint32_t>(model->mLogicalModel->mText.Count());
+ const uint32_t start = std::min(event.p2.mUint, length);
+ const uint32_t end = std::min(event.p3.mUint, length);
+
+ if(start != end)
+ {
+ // Calculates the logical position from the x,y coords.
+ impl.RepositionSelectionHandles(0.f - scrollPosition.x, 0.f - scrollPosition.y, Controller::NoTextTap::HIGHLIGHT);
+
+ impl.mEventData->mLeftSelectionPosition = start;
+ impl.mEventData->mRightSelectionPosition = end;
+ }
+ }
+}
+
void ControllerImplEventHandler::OnHandlePressed(Controller::Impl& impl, const Event& event, const bool isSmoothHandlePanEnabled)
{
ModelPtr& model = impl.mModel;
*/
static void OnSelectNoneEvent(Controller::Impl& controllerImpl);
+ /**
+ * @brief Called by Controller::Impl when a select range event is received.
+ *
+ * @param controllerImpl A reference to Controller::Impl
+ * @param event The event
+ */
+ static void OnSelectRangeEvent(Controller::Impl& controllerImpl, const Event& event);
+
private:
/**
* @brief Called by OnHandleEvent when we are in the Pressed state.
return mEventData->mPrimaryCursorPosition;
}
-bool Controller::Impl::SetPrimaryCursorPosition(CharacterIndex index)
+bool Controller::Impl::SetPrimaryCursorPosition(CharacterIndex index, bool focused)
{
if(nullptr == mEventData)
{
uint32_t length = static_cast<uint32_t>(mModel->mLogicalModel->mText.Count());
mEventData->mPrimaryCursorPosition = std::min(index, length);
- ChangeState(EventData::EDITING);
- mEventData->mLeftSelectionPosition = mEventData->mRightSelectionPosition = mEventData->mPrimaryCursorPosition;
- mEventData->mUpdateCursorPosition = true;
- ScrollTextToMatchCursor();
+ // If there is no focus, only the value is updated.
+ if(focused)
+ {
+ ChangeState(EventData::EDITING);
+ mEventData->mLeftSelectionPosition = mEventData->mRightSelectionPosition = mEventData->mPrimaryCursorPosition;
+ mEventData->mUpdateCursorPosition = true;
+ ScrollTextToMatchCursor();
+ }
return true;
}
SELECT,
SELECT_ALL,
SELECT_NONE,
+ SELECT_RANGE,
};
union Param
/**
* @copydoc Text::Controller::SetPrimaryCursorPosition()
*/
- bool SetPrimaryCursorPosition(CharacterIndex index);
+ bool SetPrimaryCursorPosition(CharacterIndex index, bool focused);
/**
* @copydoc Text::SelectableControlInterface::SetTextSelectionRange()
EventHandler::SelectEvent(*this, x, y, selectType);
}
+void Controller::SelectEvent(const uint32_t start, const uint32_t end, SelectionType selectType)
+{
+ EventHandler::SelectEvent(*this, start, end, selectType);
+}
+
void Controller::SetTextSelectionRange(const uint32_t* start, const uint32_t* end)
{
if(mImpl->mEventData)
return mImpl->GetPrimaryCursorPosition();
}
-bool Controller::SetPrimaryCursorPosition(CharacterIndex index)
+bool Controller::SetPrimaryCursorPosition(CharacterIndex index, bool focused)
{
if(mImpl->mEventData)
{
mImpl->mEventData->mIsLeftHandleSelected = true;
mImpl->mEventData->mIsRightHandleSelected = true;
mImpl->mEventData->mCheckScrollAmount = true;
- if(mImpl->SetPrimaryCursorPosition(index))
+ if(mImpl->SetPrimaryCursorPosition(index, focused) && focused)
{
KeyboardFocusGainEvent();
return true;
SelectEvent(0.f, 0.f, SelectionType::NONE);
}
+void Controller::SelectText(const uint32_t start, const uint32_t end)
+{
+ SelectEvent(start, end, SelectionType::RANGE);
+}
+
string Controller::GetSelectedText() const
{
string text;
*/
enum SelectionType
{
- INTERACTIVE = 0x0000,
- ALL = 0x0001,
- NONE = 0x0002
+ INTERACTIVE = 0x0000, ///< Select the word where the cursor is located.
+ ALL = 0x0001, ///< Select the whole text.
+ NONE = 0x0002, ///< Unselect the whole text.
+ RANGE = 0x0003 ///< Select the range text.
};
typedef IntrusivePtr<Controller> ControllerPtr;
* @brief Used to set the Primary cursor position.
*
* @param[in] index for the Primary cursor position.
+ * @param[in] focused true if UI control has gained focus to receive key event, false otherwise.
* @return[in] true if cursor position changed, false otherwise.
*/
- bool SetPrimaryCursorPosition(CharacterIndex index);
+ bool SetPrimaryCursorPosition(CharacterIndex index, bool focused);
/**
* @brief Creates a selection event.
void SelectEvent(float x, float y, SelectionType selection);
/**
+ * @brief Creates a selection event with a selection index.
+ *
+ * It could be called from the SelectText().
+ * The start and end parameters are passed through the event.
+ *
+ * @param[in] start The start selection position.
+ * @param[in] end The end selection position.
+ * @param[in] selection type like the range.
+ */
+ void SelectEvent(const uint32_t start, const uint32_t end, SelectionType selection);
+
+ /**
* @copydoc Text::SelectableControlInterface::SetTextSelectionRange()
*/
void SetTextSelectionRange(const uint32_t* start, const uint32_t* end);
void SelectNone();
/**
+ * @copydoc Text::SelectableControlInterface::SelectText()
+ */
+ void SelectText(const uint32_t start, const uint32_t end);
+
+ /**
* @copydoc Text::SelectableControlInterface::GetSelectedText()
*/
string GetSelectedText() const;
virtual void SelectNone() = 0;
/**
+ * @brief Called to set the selection postions in the texts.
+ * @param start start selection position.
+ * @param end end selection position.
+ */
+ virtual void SelectText(const uint32_t start, const uint32_t end) = 0;
+
+ /**
* @brief Retrive Selected text.
* @return The seletced text.
*/
{
const unsigned int TOOLKIT_MAJOR_VERSION = 2;
const unsigned int TOOLKIT_MINOR_VERSION = 0;
-const unsigned int TOOLKIT_MICRO_VERSION = 37;
+const unsigned int TOOLKIT_MICRO_VERSION = 38;
const char* const TOOLKIT_BUILD_DATE = __DATE__ " " __TIME__;
#ifdef DEBUG_ENABLED
Name: dali2-toolkit
Summary: Dali 3D engine Toolkit
-Version: 2.0.37
+Version: 2.0.38
Release: 1
Group: System/Libraries
License: Apache-2.0 and BSD-3-Clause and MIT
%description -n %{dali2_scene_loader}-devel
Development components for dali-scene-loader.
-##############################
-# Preparation
-##############################
-%prep
-%setup -q
-
%define dali_data_rw_dir %TZ_SYS_SHARE/dali/
%define dali_data_ro_dir %TZ_SYS_RO_SHARE/dali/
%define dali_xml_file_dir %TZ_SYS_RO_PACKAGES
+##############################
+# Preparation
+##############################
+%prep
+%setup -q
+
+##############################
+# Build
+##############################
+%build
# PO
{
cd %{_builddir}/dali2-toolkit-%{version}/dali-toolkit/po
done
} &> /dev/null
-##############################
-# Build
-##############################
-%build
PREFIX="/usr"
CXXFLAGS+=" -Wall -g -Os -fPIC -fvisibility-inlines-hidden -fdata-sections -ffunction-sections "
LDFLAGS+=" -Wl,--rpath=$PREFIX/lib -Wl,--as-needed -Wl,--gc-sections -Wl,-Bsymbolic-functions "