2 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
21 #include <dali/public-api/dali-core.h>
22 #include <dali/integration-api/events/touch-event-integ.h>
23 #include <dali/integration-api/system-overlay.h>
24 #include <dali-test-suite-utils.h>
28 void utc_dali_touch_processing_startup(void)
30 test_return_value = TET_UNDEF;
33 void utc_dali_touch_processing_cleanup(void)
35 test_return_value = TET_PASS;
38 ///////////////////////////////////////////////////////////////////////////////
43 // Stores data that is populated in the callback and will be read by the TET cases
47 : functorCalled( false ),
55 functorCalled = false;
58 touchEvent.points.clear();
64 TouchEvent touchEvent;
68 // Functor that sets the data when called
69 struct TouchEventFunctor
73 * @param[in] data Reference to the data to store callback information.
74 * @param[in] returnValue What the functor should return.
76 TouchEventFunctor( SignalData& data, bool returnValue = true )
78 returnValue( returnValue )
82 bool operator()( Actor actor, const TouchEvent& touchEvent )
84 signalData.functorCalled = true;
85 signalData.touchedActor = actor;
86 signalData.touchEvent = touchEvent;
91 SignalData& signalData;
95 // Functor that removes the actor when called.
96 struct RemoveActorFunctor : public TouchEventFunctor
100 * @param[in] data Reference to the data to store callback information.
101 * @param[in] returnValue What the functor should return.
103 RemoveActorFunctor( SignalData& data, bool returnValue = true )
104 : TouchEventFunctor( data, returnValue )
108 bool operator()( Actor actor, const TouchEvent& touchEvent )
110 Actor parent( actor.GetParent() );
113 parent.Remove( actor );
116 return TouchEventFunctor::operator()( actor, touchEvent );
120 Integration::TouchEvent GenerateSingleTouch( TouchPoint::State state, Vector2 screenPosition )
122 Integration::TouchEvent touchEvent;
123 touchEvent.points.push_back( TouchPoint ( 0, state, screenPosition.x, screenPosition.y ) );
129 ///////////////////////////////////////////////////////////////////////////////
131 int UtcDaliTouchNormalProcessing(void)
133 TestApplication application;
135 Actor actor = Actor::New();
136 actor.SetSize(100.0f, 100.0f);
137 actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
138 Stage::GetCurrent().Add(actor);
141 application.SendNotification();
142 application.Render();
144 // Connect to actor's touched signal
146 TouchEventFunctor functor( data );
147 actor.TouchedSignal().Connect( &application, functor );
149 Vector2 screenCoordinates( 10.0f, 10.0f );
150 Vector2 localCoordinates;
151 actor.ScreenToLocal( localCoordinates.x, localCoordinates.y, screenCoordinates.x, screenCoordinates.y );
153 // Emit a down signal
154 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, screenCoordinates ) );
155 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
156 DALI_TEST_EQUALS( 1u, data.touchEvent.GetPointCount(), TEST_LOCATION );
157 DALI_TEST_EQUALS( TouchPoint::Down, data.touchEvent.points[0].state, TEST_LOCATION );
158 DALI_TEST_EQUALS( screenCoordinates, data.touchEvent.points[0].screen, TEST_LOCATION );
159 DALI_TEST_EQUALS( localCoordinates, data.touchEvent.points[0].local, 0.1f, TEST_LOCATION );
162 // Emit a motion signal
163 screenCoordinates.x = screenCoordinates.y = 11.0f;
164 actor.ScreenToLocal( localCoordinates.x, localCoordinates.y, screenCoordinates.x, screenCoordinates.y );
165 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, screenCoordinates ) );
166 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
167 DALI_TEST_EQUALS( 1u, data.touchEvent.GetPointCount(), TEST_LOCATION );
168 DALI_TEST_EQUALS( TouchPoint::Motion, data.touchEvent.points[0].state, TEST_LOCATION );
169 DALI_TEST_EQUALS( screenCoordinates, data.touchEvent.points[0].screen, TEST_LOCATION );
170 DALI_TEST_EQUALS( localCoordinates, data.touchEvent.points[0].local, 0.1f, TEST_LOCATION );
174 screenCoordinates.x = screenCoordinates.y = 12.0f;
175 actor.ScreenToLocal( localCoordinates.x, localCoordinates.y, screenCoordinates.x, screenCoordinates.y );
176 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Up, screenCoordinates ) );
177 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
178 DALI_TEST_EQUALS( 1u, data.touchEvent.GetPointCount(), TEST_LOCATION );
179 DALI_TEST_EQUALS( TouchPoint::Up, data.touchEvent.points[0].state, TEST_LOCATION );
180 DALI_TEST_EQUALS( screenCoordinates, data.touchEvent.points[0].screen, TEST_LOCATION );
181 DALI_TEST_EQUALS( localCoordinates, data.touchEvent.points[0].local, 0.1f, TEST_LOCATION );
184 // Emit a down signal where the actor is not present
185 screenCoordinates.x = screenCoordinates.y = 200.0f;
186 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, screenCoordinates ) );
187 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
191 int UtcDaliTouchOutsideCameraNearFarPlanes(void)
193 TestApplication application;
195 Stage stage = Stage::GetCurrent();
196 Vector2 stageSize = stage.GetSize();
198 Actor actor = Actor::New();
199 actor.SetSize(100.0f, 100.0f);
200 actor.SetAnchorPoint(AnchorPoint::CENTER);
201 actor.SetParentOrigin(ParentOrigin::CENTER);
205 application.SendNotification();
206 application.Render();
208 // Get the camera's near and far planes
209 RenderTaskList taskList = stage.GetRenderTaskList();
210 Dali::RenderTask task = taskList.GetTask(0);
211 CameraActor camera = task.GetCameraActor();
212 float nearPlane = camera.GetNearClippingPlane();
213 float farPlane = camera.GetFarClippingPlane();
215 // Calculate the current distance of the actor from the camera
216 float tanHalfFov = tanf(camera.GetFieldOfView() * 0.5f);
217 float distance = (stageSize.y * 0.5f) / tanHalfFov;
219 // Connect to actor's touched signal
221 TouchEventFunctor functor( data );
222 actor.TouchedSignal().Connect( &application, functor );
224 Vector2 screenCoordinates( stageSize.x * 0.5f, stageSize.y * 0.5f );
226 // Emit a down signal
227 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, screenCoordinates ) );
228 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
231 // Emit a down signal where actor is just at the camera's near plane
232 actor.SetZ(distance - nearPlane);
235 application.SendNotification();
236 application.Render();
238 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, screenCoordinates ) );
239 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
242 // Emit a down signal where actor is closer than the camera's near plane
243 actor.SetZ((distance - nearPlane) + 1.0f);
246 application.SendNotification();
247 application.Render();
249 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, screenCoordinates ) );
250 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
253 // Emit a down signal where actor is just at the camera's far plane
254 actor.SetZ(distance - farPlane);
257 application.SendNotification();
258 application.Render();
260 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, screenCoordinates ) );
261 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
264 // Emit a down signal where actor is further than the camera's far plane
265 actor.SetZ((distance - farPlane) - 1.0f);
268 application.SendNotification();
269 application.Render();
271 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, screenCoordinates ) );
272 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
277 int UtcDaliTouchEmitEmpty(void)
279 TestApplication application;
283 // Emit an empty TouchEvent
284 Integration::TouchEvent event;
285 application.ProcessEvent( event );
286 tet_result( TET_FAIL );
288 catch ( Dali::DaliException& e )
290 DALI_TEST_ASSERT( e, "!event.points.empty()", TEST_LOCATION );
295 int UtcDaliTouchInterrupted(void)
297 TestApplication application;
299 Actor actor = Actor::New();
300 actor.SetSize(100.0f, 100.0f);
301 actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
302 Stage::GetCurrent().Add(actor);
305 application.SendNotification();
306 application.Render();
308 // Connect to actor's touched signal
310 TouchEventFunctor functor( data );
311 actor.TouchedSignal().Connect( &application, functor );
313 // Emit a down signal
314 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
315 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
316 DALI_TEST_EQUALS( TouchPoint::Down, data.touchEvent.points[0].state, TEST_LOCATION );
319 // Emit an interrupted signal, we should be signalled regardless of whether there is a hit or not.
320 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Interrupted, Vector2( 200.0f, 200.0f /* Outside actor */ ) ) );
321 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
322 DALI_TEST_EQUALS( TouchPoint::Interrupted, data.touchEvent.points[0].state, TEST_LOCATION );
325 // Emit another interrupted signal, our signal handler should not be called.
326 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Interrupted, Vector2( 200.0f, 200.0f ) ) );
327 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
331 int UtcDaliTouchParentConsumer(void)
333 TestApplication application;
334 Actor rootActor( Stage::GetCurrent().GetRootLayer() );
336 Actor actor = Actor::New();
337 actor.SetSize(100.0f, 100.0f);
338 actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
339 Stage::GetCurrent().Add(actor);
342 application.SendNotification();
343 application.Render();
345 // Connect to actor's touched signal
347 TouchEventFunctor functor( data, false );
348 actor.TouchedSignal().Connect( &application, functor );
350 // Connect to root actor's touched signal
352 TouchEventFunctor rootFunctor( rootData ); // Consumes signal
353 rootActor.TouchedSignal().Connect( &application, rootFunctor );
355 Vector2 screenCoordinates( 10.0f, 10.0f );
356 Vector2 actorCoordinates, rootCoordinates;
357 actor.ScreenToLocal( actorCoordinates.x, actorCoordinates.y, screenCoordinates.x, screenCoordinates.y );
358 rootActor.ScreenToLocal( rootCoordinates.x, rootCoordinates.y, screenCoordinates.x, screenCoordinates.y );
360 // Emit a down signal
361 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, screenCoordinates ) );
362 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
363 DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION );
364 DALI_TEST_EQUALS( 1u, data.touchEvent.GetPointCount(), TEST_LOCATION );
365 DALI_TEST_EQUALS( 1u, rootData.touchEvent.GetPointCount(), TEST_LOCATION );
366 DALI_TEST_EQUALS( TouchPoint::Down, data.touchEvent.points[0].state, TEST_LOCATION );
367 DALI_TEST_EQUALS( TouchPoint::Down, rootData.touchEvent.points[0].state, TEST_LOCATION );
368 DALI_TEST_EQUALS( screenCoordinates, data.touchEvent.points[0].screen, TEST_LOCATION );
369 DALI_TEST_EQUALS( screenCoordinates, rootData.touchEvent.points[0].screen, TEST_LOCATION );
370 DALI_TEST_EQUALS( actorCoordinates, data.touchEvent.points[0].local, 0.1f, TEST_LOCATION );
371 DALI_TEST_EQUALS( rootCoordinates, rootData.touchEvent.points[0].local, 0.1f, TEST_LOCATION );
372 DALI_TEST_CHECK( actor == data.touchEvent.points[0].hitActor );
373 DALI_TEST_CHECK( actor == rootData.touchEvent.points[0].hitActor );
377 // Emit a motion signal
378 screenCoordinates.x = screenCoordinates.y = 11.0f;
379 actor.ScreenToLocal( actorCoordinates.x, actorCoordinates.y, screenCoordinates.x, screenCoordinates.y );
380 rootActor.ScreenToLocal( rootCoordinates.x, rootCoordinates.y, screenCoordinates.x, screenCoordinates.y );
381 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, screenCoordinates ) );
382 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
383 DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION );
384 DALI_TEST_EQUALS( 1u, data.touchEvent.GetPointCount(), TEST_LOCATION );
385 DALI_TEST_EQUALS( 1u, rootData.touchEvent.GetPointCount(), TEST_LOCATION );
386 DALI_TEST_EQUALS( TouchPoint::Motion, data.touchEvent.points[0].state, TEST_LOCATION );
387 DALI_TEST_EQUALS( TouchPoint::Motion, rootData.touchEvent.points[0].state, TEST_LOCATION );
388 DALI_TEST_EQUALS( screenCoordinates, data.touchEvent.points[0].screen, TEST_LOCATION );
389 DALI_TEST_EQUALS( screenCoordinates, rootData.touchEvent.points[0].screen, TEST_LOCATION );
390 DALI_TEST_EQUALS( actorCoordinates, data.touchEvent.points[0].local, 0.1f, TEST_LOCATION );
391 DALI_TEST_EQUALS( rootCoordinates, rootData.touchEvent.points[0].local, 0.1f, TEST_LOCATION );
392 DALI_TEST_CHECK( actor == data.touchEvent.points[0].hitActor );
393 DALI_TEST_CHECK( actor == rootData.touchEvent.points[0].hitActor );
398 screenCoordinates.x = screenCoordinates.y = 12.0f;
399 actor.ScreenToLocal( actorCoordinates.x, actorCoordinates.y, screenCoordinates.x, screenCoordinates.y );
400 rootActor.ScreenToLocal( rootCoordinates.x, rootCoordinates.y, screenCoordinates.x, screenCoordinates.y );
401 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Up, screenCoordinates ) );
402 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
403 DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION );
404 DALI_TEST_EQUALS( 1u, data.touchEvent.GetPointCount(), TEST_LOCATION );
405 DALI_TEST_EQUALS( 1u, rootData.touchEvent.GetPointCount(), TEST_LOCATION );
406 DALI_TEST_EQUALS( TouchPoint::Up, data.touchEvent.points[0].state, TEST_LOCATION );
407 DALI_TEST_EQUALS( TouchPoint::Up, rootData.touchEvent.points[0].state, TEST_LOCATION );
408 DALI_TEST_EQUALS( screenCoordinates, data.touchEvent.points[0].screen, TEST_LOCATION );
409 DALI_TEST_EQUALS( screenCoordinates, rootData.touchEvent.points[0].screen, TEST_LOCATION );
410 DALI_TEST_EQUALS( actorCoordinates, data.touchEvent.points[0].local, 0.1f, TEST_LOCATION );
411 DALI_TEST_EQUALS( rootCoordinates, rootData.touchEvent.points[0].local, 0.1f, TEST_LOCATION );
412 DALI_TEST_CHECK( actor == data.touchEvent.points[0].hitActor );
413 DALI_TEST_CHECK( actor == rootData.touchEvent.points[0].hitActor );
417 // Emit a down signal where the actor is not present, will hit the root actor though
418 screenCoordinates.x = screenCoordinates.y = 200.0f;
419 rootActor.ScreenToLocal( rootCoordinates.x, rootCoordinates.y, screenCoordinates.x, screenCoordinates.y );
420 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, screenCoordinates ) );
421 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
422 DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION );
423 DALI_TEST_EQUALS( 1u, rootData.touchEvent.GetPointCount(), TEST_LOCATION );
424 DALI_TEST_EQUALS( TouchPoint::Down, rootData.touchEvent.points[0].state, TEST_LOCATION );
425 DALI_TEST_EQUALS( screenCoordinates, rootData.touchEvent.points[0].screen, TEST_LOCATION );
426 DALI_TEST_EQUALS( rootCoordinates, rootData.touchEvent.points[0].local, 0.1f, TEST_LOCATION );
427 DALI_TEST_CHECK( rootActor == rootData.touchEvent.points[0].hitActor );
431 int UtcDaliTouchInterruptedParentConsumer(void)
433 TestApplication application;
434 Actor rootActor( Stage::GetCurrent().GetRootLayer() );
436 Actor actor = Actor::New();
437 actor.SetSize(100.0f, 100.0f);
438 actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
439 Stage::GetCurrent().Add(actor);
442 application.SendNotification();
443 application.Render();
445 // Connect to actor's touched signal
447 TouchEventFunctor functor( data, false );
448 actor.TouchedSignal().Connect( &application, functor );
450 // Connect to root actor's touched signal
452 TouchEventFunctor rootFunctor( rootData ); // Consumes signal
453 rootActor.TouchedSignal().Connect( &application, rootFunctor );
455 // Emit a down signal
456 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
457 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
458 DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION );
459 DALI_TEST_EQUALS( TouchPoint::Down, data.touchEvent.points[0].state, TEST_LOCATION );
460 DALI_TEST_EQUALS( TouchPoint::Down, rootData.touchEvent.points[0].state, TEST_LOCATION );
461 DALI_TEST_CHECK( actor == data.touchEvent.points[0].hitActor );
462 DALI_TEST_CHECK( actor == rootData.touchEvent.points[0].hitActor );
466 // Emit an interrupted signal
467 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Interrupted, Vector2( 200.0f, 200.0f ) ) );
468 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
469 DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION );
470 DALI_TEST_EQUALS( TouchPoint::Interrupted, data.touchEvent.points[0].state, TEST_LOCATION );
471 DALI_TEST_EQUALS( TouchPoint::Interrupted, rootData.touchEvent.points[0].state, TEST_LOCATION );
472 DALI_TEST_CHECK( actor == data.touchEvent.points[0].hitActor );
473 DALI_TEST_CHECK( actor == rootData.touchEvent.points[0].hitActor );
477 // Emit another down signal
478 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
479 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
480 DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION );
481 DALI_TEST_EQUALS( TouchPoint::Down, data.touchEvent.points[0].state, TEST_LOCATION );
482 DALI_TEST_EQUALS( TouchPoint::Down, rootData.touchEvent.points[0].state, TEST_LOCATION );
486 // Remove actor from Stage
487 Stage::GetCurrent().Remove( actor );
490 application.SendNotification();
491 application.Render();
493 // Emit an interrupted signal, only root actor's signal should be called.
494 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Interrupted, Vector2( 200.0f, 200.0f /* Outside actor */ ) ) );
495 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
496 DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION );
497 DALI_TEST_EQUALS( TouchPoint::Interrupted, rootData.touchEvent.points[0].state, TEST_LOCATION );
498 DALI_TEST_CHECK( rootActor == rootData.touchEvent.points[0].hitActor );
502 // Emit another interrupted state, none of the signal's should be called.
503 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Interrupted, Vector2( 200.0f, 200.0f ) ) );
504 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
505 DALI_TEST_EQUALS( false, rootData.functorCalled, TEST_LOCATION );
509 int UtcDaliTouchLeave(void)
511 TestApplication application;
513 Actor actor = Actor::New();
514 actor.SetSize(100.0f, 100.0f);
515 actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
516 Stage::GetCurrent().Add(actor);
519 application.SendNotification();
520 application.Render();
522 // Connect to actor's touched signal
524 TouchEventFunctor functor( data );
525 actor.TouchedSignal().Connect( &application, functor );
527 // Set actor to require leave events
528 actor.SetLeaveRequired( true );
530 // Emit a down signal
531 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
532 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
533 DALI_TEST_EQUALS( TouchPoint::Down, data.touchEvent.points[0].state, TEST_LOCATION );
536 // Emit a motion signal outside of actor, should be signalled with a Leave
537 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2 ( 200.0f, 200.0f )) );
538 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
539 DALI_TEST_EQUALS( TouchPoint::Leave, data.touchEvent.points[0].state, TEST_LOCATION );
542 // Another motion outside of actor, no signalling
543 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2 ( 201.0f, 201.0f )) );
544 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
547 // Another motion event inside actor, signalled with motion
548 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2 ( 10.0f, 10.0f )) );
549 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
550 DALI_TEST_EQUALS( TouchPoint::Motion, data.touchEvent.points[0].state, TEST_LOCATION );
553 // We do not want to listen to leave events anymore
554 actor.SetLeaveRequired( false );
556 // Another motion event outside of actor, no signalling
557 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2 ( 200.0f, 200.0f )) );
558 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
563 int UtcDaliTouchLeaveParentConsumer(void)
565 TestApplication application;
566 Actor rootActor( Stage::GetCurrent().GetRootLayer() );
568 Actor actor = Actor::New();
569 actor.SetSize(100.0f, 100.0f);
570 actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
571 Stage::GetCurrent().Add(actor);
574 application.SendNotification();
575 application.Render();
577 // Connect to actor's touched signal
579 TouchEventFunctor functor( data, false );
580 actor.TouchedSignal().Connect( &application, functor );
582 // Connect to root actor's touched signal
584 TouchEventFunctor rootFunctor( rootData ); // Consumes signal
585 rootActor.TouchedSignal().Connect( &application, rootFunctor );
587 // Set actor to require leave events
588 actor.SetLeaveRequired( true );
589 rootActor.SetLeaveRequired( true );
591 // Emit a down signal
592 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
593 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
594 DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION );
595 DALI_TEST_EQUALS( TouchPoint::Down, data.touchEvent.points[0].state, TEST_LOCATION );
596 DALI_TEST_EQUALS( TouchPoint::Down, rootData.touchEvent.points[0].state, TEST_LOCATION );
597 DALI_TEST_CHECK( actor == data.touchEvent.points[0].hitActor );
598 DALI_TEST_CHECK( actor == rootData.touchEvent.points[0].hitActor );
602 // Emit a motion signal outside of actor, should be signalled with a Leave
603 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2 ( 200.0f, 200.0f )) );
604 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
605 DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION );
606 DALI_TEST_EQUALS( TouchPoint::Leave, data.touchEvent.points[0].state, TEST_LOCATION );
607 DALI_TEST_EQUALS( TouchPoint::Leave, rootData.touchEvent.points[0].state, TEST_LOCATION );
608 DALI_TEST_CHECK( actor == data.touchEvent.points[0].hitActor );
609 DALI_TEST_CHECK( actor == rootData.touchEvent.points[0].hitActor );
613 // Another motion outside of actor, only rootActor signalled
614 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2 ( 201.0f, 201.0f )) );
615 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
616 DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION );
617 DALI_TEST_EQUALS( TouchPoint::Motion, rootData.touchEvent.points[0].state, TEST_LOCATION );
618 DALI_TEST_CHECK( rootActor == rootData.touchEvent.points[0].hitActor );
622 // Another motion event inside actor, signalled with motion
623 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2 ( 10.0f, 10.0f )) );
624 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
625 DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION );
626 DALI_TEST_EQUALS( TouchPoint::Motion, data.touchEvent.points[0].state, TEST_LOCATION );
627 DALI_TEST_EQUALS( TouchPoint::Motion, rootData.touchEvent.points[0].state, TEST_LOCATION );
628 DALI_TEST_CHECK( actor == data.touchEvent.points[0].hitActor );
629 DALI_TEST_CHECK( actor == rootData.touchEvent.points[0].hitActor );
633 // We do not want to listen to leave events of actor anymore
634 actor.SetLeaveRequired( false );
636 // Another motion event outside of root actor, only root signalled
637 Vector2 stageSize( Stage::GetCurrent().GetSize() );
638 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2 ( stageSize.width + 10.0f, stageSize.height + 10.0f )) );
639 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
640 DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION );
641 DALI_TEST_EQUALS( TouchPoint::Leave, rootData.touchEvent.points[0].state, TEST_LOCATION );
645 int UtcDaliTouchActorBecomesInsensitive(void)
647 TestApplication application;
649 Actor actor = Actor::New();
650 actor.SetSize(100.0f, 100.0f);
651 actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
652 Stage::GetCurrent().Add(actor);
655 application.SendNotification();
656 application.Render();
658 // Connect to actor's touched signal
660 TouchEventFunctor functor( data );
661 actor.TouchedSignal().Connect( &application, functor );
663 // Emit a down signal
664 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
665 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
666 DALI_TEST_EQUALS( TouchPoint::Down, data.touchEvent.points[0].state, TEST_LOCATION );
669 // Change actor to insensitive
670 actor.SetSensitive( false );
672 // Emit a motion signal, signalled with an interrupted
673 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2 ( 200.0f, 200.0f )) );
674 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
675 DALI_TEST_EQUALS( TouchPoint::Interrupted, data.touchEvent.points[0].state, TEST_LOCATION );
680 int UtcDaliTouchActorBecomesInsensitiveParentConsumer(void)
682 TestApplication application;
683 Actor rootActor( Stage::GetCurrent().GetRootLayer() );
685 Actor actor = Actor::New();
686 actor.SetSize(100.0f, 100.0f);
687 actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
688 Stage::GetCurrent().Add(actor);
691 application.SendNotification();
692 application.Render();
694 // Connect to actor's touched signal
696 TouchEventFunctor functor( data, false );
697 actor.TouchedSignal().Connect( &application, functor );
699 // Connect to root actor's touched signal
701 TouchEventFunctor rootFunctor( rootData ); // Consumes signal
702 rootActor.TouchedSignal().Connect( &application, rootFunctor );
704 // Emit a down signal
705 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
706 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
707 DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION );
708 DALI_TEST_EQUALS( TouchPoint::Down, data.touchEvent.points[0].state, TEST_LOCATION );
709 DALI_TEST_EQUALS( TouchPoint::Down, rootData.touchEvent.points[0].state, TEST_LOCATION );
710 DALI_TEST_CHECK( actor == data.touchEvent.points[0].hitActor );
711 DALI_TEST_CHECK( actor == rootData.touchEvent.points[0].hitActor );
715 // Remove actor from Stage
716 Stage::GetCurrent().Remove( actor );
719 application.SendNotification();
720 application.Render();
722 // Make root actor insensitive
723 rootActor.SetSensitive( false );
725 // Emit a motion signal, signalled with an interrupted (should get interrupted even if within root actor)
726 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2 ( 200.0f, 200.0f )) );
727 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
728 DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION );
729 DALI_TEST_EQUALS( TouchPoint::Interrupted, rootData.touchEvent.points[0].state, TEST_LOCATION );
733 int UtcDaliTouchMultipleLayers(void)
735 TestApplication application;
736 Actor rootActor( Stage::GetCurrent().GetRootLayer() );
738 // Connect to actor's touched signal
740 TouchEventFunctor functor( data );
742 Layer layer1 ( Layer::New() );
743 layer1.SetSize(100.0f, 100.0f);
744 layer1.SetAnchorPoint(AnchorPoint::TOP_LEFT);
745 Stage::GetCurrent().Add( layer1 );
747 Actor actor1 ( Actor::New() );
748 actor1.SetSize( 100.0f, 100.0f );
749 actor1.SetAnchorPoint(AnchorPoint::TOP_LEFT);
750 actor1.SetZ( 1.0f ); // Should hit actor1 in this layer
751 layer1.Add( actor1 );
754 application.SendNotification();
755 application.Render();
757 // Connect to layer1 and actor1
758 layer1.TouchedSignal().Connect( &application, functor );
759 actor1.TouchedSignal().Connect( &application, functor );
761 // Hit in hittable area, actor1 should be hit
762 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
763 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
764 DALI_TEST_CHECK( data.touchedActor == actor1 );
767 // Make layer1 insensitive, nothing should be hit
768 layer1.SetSensitive( false );
769 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
770 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
773 // Make layer1 sensitive again, again actor1 will be hit
774 layer1.SetSensitive( true );
775 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
776 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
777 DALI_TEST_CHECK( data.touchedActor == actor1 );
780 // Make rootActor insensitive, nothing should be hit
781 rootActor.SetSensitive( false );
782 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
783 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
786 // Make rootActor sensitive
787 rootActor.SetSensitive( true );
790 Layer layer2 ( Layer::New() );
791 layer2.SetSize(100.0f, 100.0f );
792 layer2.SetAnchorPoint(AnchorPoint::TOP_LEFT);
793 layer2.SetZ( 10.0f ); // Should hit layer2 in this layer rather than actor2
794 Stage::GetCurrent().Add( layer2 );
796 Actor actor2 ( Actor::New() );
797 actor2.SetSize(100.0f, 100.0f);
798 actor2.SetAnchorPoint(AnchorPoint::TOP_LEFT);
799 layer2.Add( actor2 );
802 application.SendNotification();
803 application.Render();
805 // Connect to layer2 and actor2
806 layer2.TouchedSignal().Connect( &application, functor );
807 actor2.TouchedSignal().Connect( &application, functor );
809 // Emit an event, should hit layer2
810 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
811 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
812 //DALI_TEST_CHECK( data.touchedActor == layer2 ); // TODO: Uncomment this after removing renderable hack!
815 // Make layer2 insensitive, should hit actor1
816 layer2.SetSensitive( false );
817 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
818 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
819 DALI_TEST_CHECK( data.touchedActor == actor1 );
822 // Make layer2 sensitive again, should hit layer2
823 layer2.SetSensitive( true );
824 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
825 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
826 //DALI_TEST_CHECK( data.touchedActor == layer2 ); // TODO: Uncomment this after removing renderable hack!
829 // Make layer2 invisible, render and notify
830 layer2.SetVisible( false );
831 application.SendNotification();
832 application.Render();
835 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
836 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
837 DALI_TEST_CHECK( data.touchedActor == actor1 );
840 // Make rootActor invisible, render and notify
841 rootActor.SetVisible( false );
842 application.SendNotification();
843 application.Render();
845 // Should not hit anything
846 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
847 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
852 int UtcDaliTouchMultipleRenderTasks(void)
854 TestApplication application;
855 Stage stage ( Stage::GetCurrent() );
856 Vector2 stageSize ( stage.GetSize() );
858 Actor actor = Actor::New();
859 actor.SetSize(100.0f, 100.0f);
860 actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
863 // Create render task
864 Viewport viewport( stageSize.width * 0.5f, stageSize.height * 0.5f, stageSize.width * 0.5f, stageSize.height * 0.5f );
865 RenderTask renderTask ( Stage::GetCurrent().GetRenderTaskList().CreateTask() );
866 renderTask.SetViewport( viewport );
867 renderTask.SetInputEnabled( true );
870 application.SendNotification();
871 application.Render();
873 // Connect to actor's touched signal
875 TouchEventFunctor functor( data );
876 actor.TouchedSignal().Connect( &application, functor );
878 // Emit a down signal
879 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
880 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
883 // Ensure renderTask actor can be hit too.
884 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( viewport.x + 5.0f, viewport.y + 5.0f ) ) );
885 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
888 // Disable input on renderTask, should not be hittable
889 renderTask.SetInputEnabled( false );
890 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( viewport.x + 5.0f, viewport.y + 5.0f ) ) );
891 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
896 int UtcDaliTouchMultipleRenderTasksWithChildLayer(void)
898 TestApplication application;
899 Stage stage ( Stage::GetCurrent() );
900 Vector2 stageSize ( stage.GetSize() );
902 Actor actor = Actor::New();
903 actor.SetSize(100.0f, 100.0f);
904 actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
907 Layer layer = Layer::New();
908 layer.SetSize(100.0f, 100.0f);
909 layer.SetAnchorPoint(AnchorPoint::TOP_LEFT);
912 // Create render task
913 Viewport viewport( stageSize.width * 0.5f, stageSize.height * 0.5f, stageSize.width * 0.5f, stageSize.height * 0.5f );
914 RenderTask renderTask ( Stage::GetCurrent().GetRenderTaskList().CreateTask() );
915 renderTask.SetViewport( viewport );
916 renderTask.SetInputEnabled( true );
917 renderTask.SetSourceActor( actor );
920 application.SendNotification();
921 application.Render();
923 // Connect to layer's touched signal
925 TouchEventFunctor functor( data );
926 actor.TouchedSignal().Connect( &application, functor );
927 layer.TouchedSignal().Connect( &application, functor );
929 // Emit a down signal
930 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
931 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
934 // Ensure renderTask actor can be hit too.
935 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( viewport.x + 5.0f, viewport.y + 5.0f ) ) );
936 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
939 // Disable input on renderTask, should not be hittable
940 renderTask.SetInputEnabled( false );
941 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( viewport.x + 5.0f, viewport.y + 5.0f ) ) );
942 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
947 int UtcDaliTouchOffscreenRenderTasks(void)
949 TestApplication application;
950 Stage stage ( Stage::GetCurrent() );
951 Vector2 stageSize ( stage.GetSize() );
953 // FrameBufferImage for offscreen RenderTask
954 FrameBufferImage frameBufferImage( FrameBufferImage::New( stageSize.width, stageSize.height, Pixel::RGBA8888 ) );
956 // Create an image actor to display the FrameBufferImage
957 ImageActor imageActor ( ImageActor::New( frameBufferImage ) );
958 imageActor.SetParentOrigin(ParentOrigin::CENTER);
959 imageActor.SetSize( stageSize.x, stageSize.y );
960 imageActor.ScaleBy( Vector3(1.0f, -1.0f, 1.0f) ); // FIXME
961 stage.Add( imageActor );
963 Actor actor = Actor::New();
964 actor.SetSize(100.0f, 100.0f);
965 actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
967 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); // Ensure framebuffer connects
969 stage.GetRenderTaskList().GetTask( 0u ).SetScreenToFrameBufferFunction( RenderTask::FULLSCREEN_FRAMEBUFFER_FUNCTION );
971 // Create a RenderTask
972 RenderTask renderTask = stage.GetRenderTaskList().CreateTask();
973 renderTask.SetSourceActor( actor );
974 renderTask.SetTargetFrameBuffer( frameBufferImage );
975 renderTask.SetInputEnabled( true );
977 // Create another RenderTask
978 RenderTask renderTask2( stage.GetRenderTaskList().CreateTask() );
979 renderTask2.SetInputEnabled( true );
982 application.SendNotification();
983 application.Render();
985 // Connect to actor's touched signal
987 TouchEventFunctor functor( data );
988 actor.TouchedSignal().Connect( &application, functor );
990 // Emit a down signal
991 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
992 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
997 int UtcDaliTouchMultipleRenderableActors(void)
999 TestApplication application;
1000 Stage stage ( Stage::GetCurrent() );
1001 Vector2 stageSize ( stage.GetSize() );
1003 Actor parent = ImageActor::New();
1004 parent.SetSize(100.0f, 100.0f);
1005 parent.SetAnchorPoint(AnchorPoint::TOP_LEFT);
1008 Actor actor = ImageActor::New();
1009 actor.SetSize(100.0f, 100.0f);
1010 actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
1013 // Render and notify
1014 application.SendNotification();
1015 application.Render();
1017 // Connect to layer's touched signal
1019 TouchEventFunctor functor( data );
1020 parent.TouchedSignal().Connect( &application, functor );
1021 actor.TouchedSignal().Connect( &application, functor );
1023 // Emit a down signal
1024 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
1025 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
1026 DALI_TEST_CHECK( actor == data.touchedActor );
1030 int UtcDaliTouchActorRemovedInSignal(void)
1032 TestApplication application;
1034 Actor actor = Actor::New();
1035 actor.SetSize(100.0f, 100.0f);
1036 actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
1037 Stage::GetCurrent().Add(actor);
1039 // Render and notify
1040 application.SendNotification();
1041 application.Render();
1043 // Connect to actor's touched signal
1045 RemoveActorFunctor functor( data );
1046 actor.TouchedSignal().Connect( &application, functor );
1048 // Register for leave events
1049 actor.SetLeaveRequired( true );
1051 // Emit a down signal
1052 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
1053 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
1056 // Re-add, render and notify
1057 Stage::GetCurrent().Add(actor);
1058 application.SendNotification();
1059 application.Render();
1061 // Emit another signal outside of actor's area, should not get anything as the scene has changed.
1062 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2( 210.0f, 210.0f ) ) );
1063 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
1066 // Emit a down signal
1067 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
1068 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
1071 // Render and notify
1072 application.SendNotification();
1073 application.Render();
1075 // Emit another signal outside of actor's area, should not get anything as the scene has changed.
1076 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2( 210.0f, 210.0f ) ) );
1077 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
1080 // Re-add actor back to stage, render and notify
1081 Stage::GetCurrent().Add(actor);
1082 application.SendNotification();
1083 application.Render();
1085 // Emit another down event
1086 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
1087 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
1090 // Completely delete the actor
1093 // Emit event, should not crash and should not receive an event.
1094 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2( 210.0f, 210.0f ) ) );
1095 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
1099 int UtcDaliTouchActorSignalNotConsumed(void)
1101 TestApplication application;
1103 Actor actor = Actor::New();
1104 actor.SetSize(100.0f, 100.0f);
1105 actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
1106 Stage::GetCurrent().Add(actor);
1108 // Render and notify
1109 application.SendNotification();
1110 application.Render();
1112 // Connect to actor's touched signal
1114 TouchEventFunctor functor( data, false );
1115 actor.TouchedSignal().Connect( &application, functor );
1117 // Emit a down signal
1118 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
1119 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
1123 int UtcDaliTouchActorUnStaged(void)
1125 TestApplication application;
1127 Actor actor = Actor::New();
1128 actor.SetSize(100.0f, 100.0f);
1129 actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
1130 Stage::GetCurrent().Add(actor);
1132 // Render and notify
1133 application.SendNotification();
1134 application.Render();
1136 // Connect to actor's touched signal
1138 TouchEventFunctor functor( data );
1139 actor.TouchedSignal().Connect( &application, functor );
1141 // Emit a down signal
1142 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
1143 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
1146 // Remove actor from stage
1147 Stage::GetCurrent().Remove( actor );
1149 // Render and notify
1150 application.SendNotification();
1151 application.Render();
1153 // Emit a move at the same point, we should not be signalled.
1154 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2( 10.0f, 10.0f ) ) );
1155 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
1160 int UtcDaliTouchSystemOverlayActor(void)
1162 TestApplication application;
1163 Dali::Integration::Core& core( application.GetCore() );
1164 Dali::Integration::SystemOverlay& systemOverlay( core.GetSystemOverlay() );
1165 systemOverlay.GetOverlayRenderTasks().CreateTask();
1167 // Create an actor and add it to the system overlay.
1168 Actor systemActor = Actor::New();
1169 systemActor.SetSize(100.0f, 100.0f);
1170 systemActor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
1171 systemOverlay.Add( systemActor );
1173 // Create an actor and add it to the stage as per normal, same position and size as systemActor
1174 Actor actor = Actor::New();
1175 actor.SetSize(100.0f, 100.0f);
1176 actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
1177 Stage::GetCurrent().Add(actor);
1179 // Connect to the touch signals.
1181 TouchEventFunctor functor( data );
1182 systemActor.TouchedSignal().Connect( &application, functor );
1183 actor.TouchedSignal().Connect( &application, functor );
1185 // Render and notify
1186 application.SendNotification();
1187 application.Render();
1189 // Emit a down signal, the system overlay is drawn last so is at the top, should hit the systemActor.
1190 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
1191 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
1192 DALI_TEST_CHECK( systemActor == data.touchedActor );
1196 int UtcDaliTouchLayerConsumesTouch(void)
1198 TestApplication application;
1200 Actor actor = Actor::New();
1201 actor.SetSize(100.0f, 100.0f);
1202 actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
1203 Stage::GetCurrent().Add(actor);
1205 // Render and notify
1206 application.SendNotification();
1207 application.Render();
1209 // Connect to actor's touched signal
1211 TouchEventFunctor functor( data );
1212 actor.TouchedSignal().Connect( &application, functor );
1214 // Add a layer to overlap the actor
1215 Layer layer = Layer::New();
1216 layer.SetSize(100.0f, 100.0f);
1217 layer.SetAnchorPoint(AnchorPoint::TOP_LEFT);
1218 Stage::GetCurrent().Add( layer );
1221 // Render and notify
1222 application.SendNotification();
1223 application.Render();
1225 // Emit a few touch signals
1226 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
1227 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Up, Vector2( 10.0f, 10.0f ) ) );
1228 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
1231 // Set layer to consume all touch
1232 layer.SetTouchConsumed( true );
1234 // Render and notify
1235 application.SendNotification();
1236 application.Render();
1238 // Emit the same signals again, should not receive
1239 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
1240 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Up, Vector2( 10.0f, 10.0f ) ) );
1241 DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
1247 int UtcDaliTouchLeaveActorReadded(void)
1249 TestApplication application;
1250 Stage stage = Stage::GetCurrent();
1252 Actor actor = Actor::New();
1253 actor.SetSize(100.0f, 100.0f);
1254 actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
1257 // Set actor to receive touch-events
1258 actor.SetLeaveRequired( true );
1260 // Render and notify
1261 application.SendNotification();
1262 application.Render();
1264 // Connect to actor's touched signal
1266 TouchEventFunctor functor( data );
1267 actor.TouchedSignal().Connect( &application, functor );
1269 // Emit a down and motion
1270 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
1271 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2( 11.0f, 10.0f ) ) );
1272 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
1275 // Remove actor from stage and add again
1276 stage.Remove( actor );
1279 // Emit a motion within the actor's bounds
1280 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2( 12.0f, 10.0f ) ) );
1281 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
1284 // Emit a motion outside the actor's bounds
1285 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2( 200.0f, 200.0f ) ) );
1286 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
1287 DALI_TEST_EQUALS( TouchPoint::Leave, data.touchEvent.points[0].state, TEST_LOCATION );
1293 int UtcDaliTouchStencil(void)
1295 TestApplication application;
1296 Stage stage = Stage::GetCurrent();
1298 TextActor actor = TextActor::New();
1299 actor.SetSize(100.0f, 100.0f);
1300 actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
1303 Actor stencil = Actor::New();
1304 stencil.SetSize(50.0f, 50.0f);
1305 stencil.SetAnchorPoint(AnchorPoint::TOP_LEFT);
1306 stencil.SetDrawMode( DrawMode::STENCIL );
1309 // Render and notify
1310 application.SendNotification();
1311 application.Render();
1313 // Connect to actor's touched signal
1315 TouchEventFunctor functor( data );
1316 actor.TouchedSignal().Connect( &application, functor );
1318 // Emit an event within stencil area
1319 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
1320 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
1323 // Emit an event outside the stencil area but within the actor area
1324 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 60.0f, 60.0f ) ) );
1325 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
1331 int UtcDaliTouchStencilInActorHierarchy(void)
1333 TestApplication application;
1334 Stage stage = Stage::GetCurrent();
1336 TextActor parent = TextActor::New();
1337 parent.SetSize(100.0f, 100.0f);
1338 parent.SetAnchorPoint(AnchorPoint::TOP_LEFT);
1341 TextActor child = TextActor::New();
1342 child.SetSize(25.0f, 25.0f);
1343 child.SetAnchorPoint(AnchorPoint::TOP_LEFT);
1346 Actor stencil = Actor::New();
1347 stencil.SetSize(50.0f, 50.0f);
1348 stencil.SetAnchorPoint(AnchorPoint::TOP_LEFT);
1349 stencil.SetDrawMode( DrawMode::STENCIL );
1352 // Render and notify
1353 application.SendNotification();
1354 application.Render();
1356 // Connect to touch signals
1357 SignalData parentData;
1358 parent.TouchedSignal().Connect( &application, TouchEventFunctor(parentData) );
1359 SignalData childData;
1360 child.TouchedSignal().Connect( &application, TouchEventFunctor(childData) );
1362 // Emit an event within stencil area
1363 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
1364 DALI_TEST_EQUALS( false, parentData.functorCalled, TEST_LOCATION );
1365 DALI_TEST_EQUALS( true, childData.functorCalled, TEST_LOCATION );
1369 // Emit an event outside child area and within stencil area
1370 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2( 40.0f, 40.0f ) ) );
1371 DALI_TEST_EQUALS( true, parentData.functorCalled, TEST_LOCATION );
1372 DALI_TEST_EQUALS( false, childData.functorCalled, TEST_LOCATION );
1376 // Emit an event outside stencil are but within parent area
1377 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2( 60.0f, 60.0f ) ) );
1378 DALI_TEST_EQUALS( false, parentData.functorCalled, TEST_LOCATION );
1379 DALI_TEST_EQUALS( false, childData.functorCalled, TEST_LOCATION );
1383 // Readd actor (so that stencil is the first child)
1384 stage.Remove(parent);
1385 application.SendNotification();
1386 application.Render();
1388 application.SendNotification();
1389 application.Render();
1391 // Redo hit in same area...
1393 // Emit an event within stencil area
1394 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2( 10.0f, 10.0f ) ) );
1395 DALI_TEST_EQUALS( false, parentData.functorCalled, TEST_LOCATION );
1396 DALI_TEST_EQUALS( true, childData.functorCalled, TEST_LOCATION );
1400 // Emit an event outside child area and within stencil area
1401 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2( 40.0f, 40.0f ) ) );
1402 DALI_TEST_EQUALS( true, parentData.functorCalled, TEST_LOCATION );
1403 DALI_TEST_EQUALS( false, childData.functorCalled, TEST_LOCATION );
1407 // Emit an event outside stencil are but within parent area
1408 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2( 60.0f, 60.0f ) ) );
1409 DALI_TEST_EQUALS( false, parentData.functorCalled, TEST_LOCATION );
1410 DALI_TEST_EQUALS( false, childData.functorCalled, TEST_LOCATION );
1417 int UtcDaliTouchMultipleStencils(void)
1419 TestApplication application;
1420 Stage stage = Stage::GetCurrent();
1422 TextActor actor = TextActor::New();
1423 actor.SetSize(100.0f, 100.0f);
1424 actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
1427 Actor stencil = Actor::New();
1428 stencil.SetSize(50.0f, 50.0f);
1429 stencil.SetAnchorPoint(AnchorPoint::TOP_LEFT);
1430 stencil.SetDrawMode( DrawMode::STENCIL );
1433 Actor stencil2 = Actor::New();
1434 stencil2.SetSize(50.0f, 50.0f);
1435 stencil2.SetAnchorPoint(AnchorPoint::TOP_LEFT);
1436 stencil2.SetDrawMode( DrawMode::STENCIL );
1437 stencil2.SetPosition(50.0f, 50.0f);
1438 stage.Add(stencil2);
1440 // Render and notify
1441 application.SendNotification();
1442 application.Render();
1444 // Connect to actor's touched signal
1446 TouchEventFunctor functor( data );
1447 actor.TouchedSignal().Connect( &application, functor );
1449 // Emit an event within stencil area
1450 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
1451 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
1454 // Emit an event inside the second stencil area
1455 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 60.0f, 60.0f ) ) );
1456 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
1459 // Emit an event outside both stencil areas but within the actor area
1460 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 60.0f ) ) );
1461 DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
1467 int UtcDaliTouchStencilNonRenderableActor(void)
1469 TestApplication application;
1470 Stage stage = Stage::GetCurrent();
1472 Actor actor = Actor::New();
1473 actor.SetSize(100.0f, 100.0f);
1474 actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
1477 Actor stencil = Actor::New();
1478 stencil.SetSize(50.0f, 50.0f);
1479 stencil.SetAnchorPoint(AnchorPoint::TOP_LEFT);
1480 stencil.SetDrawMode( DrawMode::STENCIL );
1483 // Render and notify
1484 application.SendNotification();
1485 application.Render();
1487 // Connect to actor's touched signal
1489 TouchEventFunctor functor( data );
1490 actor.TouchedSignal().Connect( &application, functor );
1492 // Emit an event within stencil area
1493 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
1494 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
1497 // Emit an event outside the stencil area but within the actor area, we should have a hit!
1498 application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 60.0f, 60.0f ) ) );
1499 DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );