示例#1
0
int UtcDaliStageTouchedSignalN(void)
{
  TestApplication application;
  Stage stage = Stage::GetCurrent();

  TouchedSignalData data;
  TouchedFunctor functor( data );
  stage.TouchedSignal().Connect( &application, functor );

  // Render and notify.
  application.SendNotification();
  application.Render();

  // Confirm functor not called before there has been any touch event.
  DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );

  // No actors, single touch, down, motion then up.
  {
    Integration::TouchEvent touchEvent;
    touchEvent.points.push_back( TouchPoint( 0, TouchPoint::Down, 10.0f, 10.0f ) );
    application.ProcessEvent( touchEvent );

    DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
    DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0u );
    DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor );
    data.Reset();

    // Confirm there is no signal when the touchpoint is only moved.
    touchEvent.points[0].state = TouchPoint::Motion;
    touchEvent.points[0].screen.x = 1200.0f; // Some motion
    application.ProcessEvent( touchEvent );

    DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
    data.Reset();

    // Confirm a following up event generates a signal.
    touchEvent.points[0].state = TouchPoint::Up;
    application.ProcessEvent( touchEvent );

    DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
    DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0u );
    DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor );
    data.Reset();
  }

  // Add an actor to the scene.
  Actor actor = Actor::New();
  actor.SetSize( 100.0f, 100.0f );
  actor.SetAnchorPoint( AnchorPoint::TOP_LEFT );
  actor.SetParentOrigin( ParentOrigin::TOP_LEFT );
  actor.TouchedSignal().Connect( &DummyTouchCallback );
  stage.Add( actor );

  // Render and notify.
  application.SendNotification();
  application.Render();

  // Actor on scene. Interrupted before down and interrupted after down.
  {
    Integration::TouchEvent touchEvent;
    touchEvent.points.push_back( TouchPoint( 0, TouchPoint::Interrupted, 10.0f, 10.0f ) );
    application.ProcessEvent( touchEvent );

    DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
    DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0u );
    DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor );
    DALI_TEST_CHECK( data.receivedTouchEvent.points[0].state == TouchPoint::Interrupted );
    data.Reset();

    touchEvent.points[0].state = TouchPoint::Down;
    application.ProcessEvent( touchEvent );

    DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
    DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0u );
    DALI_TEST_CHECK( data.receivedTouchEvent.points[0].hitActor == actor );
    DALI_TEST_CHECK( data.receivedTouchEvent.points[0].state == TouchPoint::Down );
    data.Reset();

    touchEvent.points[0].state = TouchPoint::Interrupted;
    application.ProcessEvent( touchEvent );

    DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
    DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0u );
    DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor );
    DALI_TEST_CHECK( data.receivedTouchEvent.points[0].state == TouchPoint::Interrupted );

    DALI_TEST_EQUALS( data.receivedTouchEvent.GetPointCount(), 1u, TEST_LOCATION );

    // Check that getting info about a non-existent point causes an assert.
    bool asserted = false;
    try
    {
      data.receivedTouchEvent.GetPoint( 1 );
    }
    catch( Dali::DaliException& e )
    {
      DALI_TEST_PRINT_ASSERT( e );
      DALI_TEST_ASSERT( e, "point < points.size() && \"No point at index\"", TEST_LOCATION );
      asserted = true;
    }
    DALI_TEST_CHECK( asserted );

    data.Reset();
  }

  END_TEST;
}
示例#2
0
int UtcDaliStageTouchedSignalP(void)
{
  TestApplication application;
  Stage stage = Stage::GetCurrent();

  TouchedSignalData data;
  TouchedFunctor functor( data );
  stage.TouchedSignal().Connect( &application, functor );

  // Render and notify.
  application.SendNotification();
  application.Render();

  // Basic test: No actors, single touch (down then up).
  {
    Integration::TouchEvent touchEvent;
    touchEvent.points.push_back( TouchPoint( 0, TouchPoint::Down, 10.0f, 10.0f ) );
    application.ProcessEvent( touchEvent );

    DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
    DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0u );
    DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor );
    data.Reset();

    touchEvent.points[0].state = TouchPoint::Up;
    application.ProcessEvent( touchEvent );

    DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
    DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0u );
    DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor );
    data.Reset();
  }

  // Add an actor to the scene.
  Actor actor = Actor::New();
  actor.SetSize( 100.0f, 100.0f );
  actor.SetAnchorPoint( AnchorPoint::TOP_LEFT );
  actor.SetParentOrigin( ParentOrigin::TOP_LEFT );
  actor.TouchedSignal().Connect( &DummyTouchCallback );
  stage.Add( actor );

  // Render and notify.
  application.SendNotification();
  application.Render();

  // Actor on scene, single touch, down in actor, motion, then up outside actor.
  {
    Integration::TouchEvent touchEvent;
    touchEvent.points.push_back( TouchPoint( 0, TouchPoint::Down, 10.0f, 10.0f ) );
    application.ProcessEvent( touchEvent );

    DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
    DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0u );
    DALI_TEST_CHECK( data.receivedTouchEvent.points[0].hitActor == actor );
    data.Reset();

    touchEvent.points[0].state = TouchPoint::Motion;
    touchEvent.points[0].screen.x = 150.0f; // Some motion
    application.ProcessEvent( touchEvent );

    DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
    data.Reset();

    touchEvent.points[0].state = TouchPoint::Up;
    application.ProcessEvent( touchEvent );

    DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
    DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0u );
    DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor );
    data.Reset();
  }

  // Multiple touch. Should only receive a touch on first down and last up.
  {
    Integration::TouchEvent touchEvent;

    // 1st point
    touchEvent.points.push_back( TouchPoint( 0, TouchPoint::Down, 10.0f, 10.0f ) );
    application.ProcessEvent( touchEvent );
    DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
    DALI_TEST_EQUALS( data.receivedTouchEvent.GetPointCount(), 1u, TEST_LOCATION );
    data.Reset();

    // 2nd point
    touchEvent.points[0].state = TouchPoint::Stationary;
    touchEvent.points.push_back( TouchPoint( 1, TouchPoint::Down, 50.0f, 50.0f ) );
    application.ProcessEvent( touchEvent );
    DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
    DALI_TEST_EQUALS( data.receivedTouchEvent.GetPointCount(), 0u, TEST_LOCATION );
    data.Reset();

    // Primary point is up
    touchEvent.points[0].state = TouchPoint::Up;
    touchEvent.points[1].state = TouchPoint::Stationary;
    application.ProcessEvent( touchEvent );
    DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
    DALI_TEST_EQUALS( data.receivedTouchEvent.GetPointCount(), 0u, TEST_LOCATION );
    data.Reset();

    // Remove 1st point now, 2nd point is now in motion
    touchEvent.points.erase( touchEvent.points.begin() );
    touchEvent.points[0].state = TouchPoint::Motion;
    touchEvent.points[0].screen.x = 150.0f;
    application.ProcessEvent( touchEvent );
    DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
    DALI_TEST_EQUALS( data.receivedTouchEvent.GetPointCount(), 0u, TEST_LOCATION );
    data.Reset();

    // Final point Up
    touchEvent.points[0].state = TouchPoint::Up;
    application.ProcessEvent( touchEvent );
    DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
    DALI_TEST_EQUALS( data.receivedTouchEvent.GetPointCount(), 1u, TEST_LOCATION );
    data.Reset();
  }
  END_TEST;
}