int UtcDaliHoverActorBecomesInsensitive(void) { TestApplication application; Actor actor = Actor::New(); actor.SetSize(100.0f, 100.0f); actor.SetAnchorPoint(AnchorPoint::TOP_LEFT); Stage::GetCurrent().Add(actor); // Render and notify application.SendNotification(); application.Render(); // Connect to actor's hovered signal SignalData data; HoverEventFunctor functor( data ); actor.HoveredSignal().Connect( &application, functor ); // Emit a started signal application.ProcessEvent( GenerateSingleHover( TouchPoint::Started, Vector2( 10.0f, 10.0f ) ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( TouchPoint::Started, data.hoverEvent.points[0].state, TEST_LOCATION ); data.Reset(); // Change actor to insensitive actor.SetSensitive( false ); // Emit a motion signal, signalled with an interrupted application.ProcessEvent( GenerateSingleHover( TouchPoint::Motion, Vector2 ( 200.0f, 200.0f )) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( TouchPoint::Interrupted, data.hoverEvent.points[0].state, TEST_LOCATION ); data.Reset(); END_TEST; }
void WorkspaceSerializer::Write(const QString& fileName, const SignalData& data, const PlotInfo& plotInfo, bool writeValues /*= true*/) { QJsonObject json; json["background"] = plotInfo.getBackgroundColor().name(); if (writeValues) { if (auto domain = data.getDomain()) json["domain"] = domain->name; } QJsonArray signArray; data.onSignals([&](const Signal& signal){ QJsonObject signObj; signObj["name"] = signal.name; signObj["color"] = signal.graphic.color.name(); signObj["visible"] = signal.graphic.visible; signObj["range"] = ToJsonArray(QVector < qreal > {signal.graphic.rangeLower, signal.graphic.rangeUpper}); if (writeValues) signObj["values"] = ToJsonArray(signal.y); signObj["ticks"] = ToJsonArray(signal.graphic.ticks); signObj["tickLabels"] = ToJsonArray(signal.graphic.tickLabels); signArray.push_back(std::move(signObj)); }); json["signals"] = signArray; QJsonDocument saveDoc(json); QFile outF(fileName); outF.open(QIODevice::WriteOnly); outF.write(saveDoc.toJson(QJsonDocument::Indented)); }
int UtcDaliHoverInterrupted(void) { TestApplication application; Actor actor = Actor::New(); actor.SetSize(100.0f, 100.0f); actor.SetAnchorPoint(AnchorPoint::TOP_LEFT); Stage::GetCurrent().Add(actor); // Render and notify application.SendNotification(); application.Render(); // Connect to actor's hovered signal SignalData data; HoverEventFunctor functor( data ); actor.HoveredSignal().Connect( &application, functor ); // Emit a started signal application.ProcessEvent( GenerateSingleHover( TouchPoint::Started, Vector2( 10.0f, 10.0f ) ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( TouchPoint::Started, data.hoverEvent.points[0].state, TEST_LOCATION ); data.Reset(); // Emit an interrupted signal, we should be signalled regardless of whether there is a hit or not. application.ProcessEvent( GenerateSingleHover( TouchPoint::Interrupted, Vector2( 200.0f, 200.0f /* Outside actor */ ) ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( TouchPoint::Interrupted, data.hoverEvent.points[0].state, TEST_LOCATION ); data.Reset(); // Emit another interrupted signal, our signal handler should not be called. application.ProcessEvent( GenerateSingleHover( TouchPoint::Interrupted, Vector2( 200.0f, 200.0f ) ) ); DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION ); END_TEST; }
static void UtcDaliKeyInputFocusManagerSignalUnhandledKeyEvent() { ToolkitTestApplication application; tet_infoline("UtcDaliKeyInputFocusManagerSignalUnhandledKeyEvent"); SignalData data; SignalUnhandledKeyEventCallback callback( data ); KeyInputFocusManager manager = KeyInputFocusManager::Get(); manager.UnhandledKeyEventSignal().Connect( &callback, &SignalUnhandledKeyEventCallback::Callback ); Integration::KeyEvent event("a", "a", 0, 0, 0, Integration::KeyEvent::Up); application.ProcessEvent(event); DALI_TEST_CHECK(data.functorCalled); DALI_TEST_CHECK(event.keyName == data.receivedKeyEvent.keyPressedName ); DALI_TEST_CHECK(event.keyCode == data.receivedKeyEvent.keyCode); DALI_TEST_CHECK(event.keyString == data.receivedKeyEvent.keyPressed ); DALI_TEST_CHECK(event.state == data.receivedKeyEvent.state ); data.Reset(); Integration::KeyEvent event2("v", "v", 0, 0, 0, Integration::KeyEvent::Up); application.ProcessEvent(event2); DALI_TEST_CHECK(data.functorCalled); DALI_TEST_CHECK(event2.keyName == data.receivedKeyEvent.keyPressedName ); DALI_TEST_CHECK(event2.keyCode == data.receivedKeyEvent.keyCode); DALI_TEST_CHECK(event2.keyString == data.receivedKeyEvent.keyPressed ); }
int UtcDaliTapGestureSignalReceptionAttachDetachMany(void) { TestApplication application; Actor first = Actor::New(); first.SetSize(100.0f, 100.0f); first.SetAnchorPoint(AnchorPoint::TOP_LEFT); Stage::GetCurrent().Add(first); Actor second = Actor::New(); second.SetSize(100.0f, 100.0f); second.SetX(100.0f); second.SetAnchorPoint(AnchorPoint::TOP_LEFT); Stage::GetCurrent().Add(second); // Render and notify application.SendNotification(); application.Render(); SignalData data; GestureReceivedFunctor functor(data); TapGestureDetector detector = TapGestureDetector::New(); detector.Attach(first); detector.Attach(second); detector.DetectedSignal().Connect(&application, functor); // Tap within second actor's area application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(120.0f, 10.0f))); application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(120.0f, 10.0f))); DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION); DALI_TEST_EQUALS(true, second == data.tappedActor, TEST_LOCATION); // Tap within first actor's area data.Reset(); application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(20.0f, 10.0f))); application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(20.0f, 10.0f))); DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION); DALI_TEST_EQUALS(true, first == data.tappedActor, TEST_LOCATION); // Detach the second actor detector.Detach(second); // second actor shouldn't receive event data.Reset(); application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(120.0f, 10.0f))); application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(120.0f, 10.0f))); DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION); // first actor should continue receiving event data.Reset(); application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(20.0f, 10.0f))); application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(20.0f, 10.0f))); DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION); END_TEST; }
int UtcDaliTapGestureSignalReceptionRotatedActor(void) { TestApplication application; Actor actor = Actor::New(); actor.SetSize(100.0f, 100.0f); actor.SetOrientation(Dali::Degree(90.0f), Vector3::ZAXIS); Stage::GetCurrent().Add(actor); // Render and notify application.SendNotification(); application.Render(); SignalData data; GestureReceivedFunctor functor(data); TapGestureDetector detector = TapGestureDetector::New(); detector.Attach(actor); detector.DetectedSignal().Connect(&application, functor); // Do tap, only check finished value application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(5.0f, 5.0f))); application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(5.0f, 5.0f))); DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION); DALI_TEST_EQUALS(1u, data.receivedGesture.numberOfTaps, TEST_LOCATION); DALI_TEST_EQUALS(1u, data.receivedGesture.numberOfTouches, TEST_LOCATION); DALI_TEST_EQUALS( Vector2(5.0f, 5.0f), data.receivedGesture.screenPoint, 0.1, TEST_LOCATION); // Rotate actor again and render actor.SetOrientation(Dali::Degree(180.0f), Vector3::ZAXIS); application.SendNotification(); application.Render(); // Do tap, should still receive event data.Reset(); application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(5.0f, 5.0f))); application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(5.0f, 5.0f))); DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION); DALI_TEST_EQUALS(1u, data.receivedGesture.numberOfTaps, TEST_LOCATION); DALI_TEST_EQUALS(1u, data.receivedGesture.numberOfTouches, TEST_LOCATION); DALI_TEST_EQUALS( Vector2(5.0f, 5.0f), data.receivedGesture.screenPoint, 0.1, TEST_LOCATION); // Rotate actor again and render actor.SetOrientation(Dali::Degree(90.0f), Vector3::YAXIS); application.SendNotification(); application.Render(); // Do tap, inside the actor's area (area if it is not rotated), Should not receive the event data.Reset(); application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(70.0f, 70.0f))); application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(70.0f, 70.0f))); DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION); END_TEST; }
int UtcDaliTapGestureSignalReceptionChildHit(void) { TestApplication application; Actor parent = Actor::New(); parent.SetSize(100.0f, 100.0f); parent.SetAnchorPoint(AnchorPoint::TOP_LEFT); Stage::GetCurrent().Add(parent); // Set child to completely cover parent. // Change rotation of child to be different from parent so that we can check if our local coordinate // conversion of the parent actor is correct. Actor child = Actor::New(); child.SetSize(100.0f, 100.0f); child.SetAnchorPoint(AnchorPoint::CENTER); child.SetParentOrigin(ParentOrigin::CENTER); child.SetOrientation(Dali::Degree(90.0f), Vector3::ZAXIS); parent.Add(child); TouchEventFunctor touchFunctor; child.TouchedSignal().Connect(&application, touchFunctor); // Render and notify application.SendNotification(); application.Render(); SignalData data; GestureReceivedFunctor functor(data); TapGestureDetector detector = TapGestureDetector::New(); detector.Attach(parent); detector.DetectedSignal().Connect(&application, functor); // Do tap - hits child area but parent should still receive it application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(50.0f, 50.0f))); application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(50.0f, 50.0f))); DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION); DALI_TEST_EQUALS(true, parent == data.tappedActor, TEST_LOCATION); DALI_TEST_EQUALS(Vector2(50.0f, 50.0f), data.receivedGesture.screenPoint, 0.01f, TEST_LOCATION); // Attach child and generate same touch points // (Also proves that you can detach and then re-attach another actor) detector.Attach(child); detector.Detach(parent); // Do an entire tap, only check finished value data.Reset(); application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(51.0f, 51.0f))); application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(51.0f, 51.0f))); DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION); DALI_TEST_EQUALS(true, child == data.tappedActor, TEST_LOCATION); DALI_TEST_EQUALS(Vector2(51.0f, 51.0f), data.receivedGesture.screenPoint, 0.01f, TEST_LOCATION); END_TEST; }
int UtcDaliTapGestureTouchBehindGesturedSystemOverlay(void) { TestApplication application; Dali::Integration::Core& core = application.GetCore(); Dali::Integration::SystemOverlay& systemOverlay( core.GetSystemOverlay() ); systemOverlay.GetOverlayRenderTasks().CreateTask(); // SystemOverlay actor Actor systemOverlayActor = Actor::New(); systemOverlayActor.SetSize(100.0f, 100.0f); systemOverlayActor.SetAnchorPoint(AnchorPoint::TOP_LEFT); systemOverlay.Add(systemOverlayActor); // Stage actor Actor stageActor = Actor::New(); stageActor.SetSize(100.0f, 100.0f); stageActor.SetAnchorPoint(AnchorPoint::TOP_LEFT); Stage::GetCurrent().Add(stageActor); // Render and notify application.SendNotification(); application.Render(); // Set stage actor to touchable TouchEventData touchData; TouchEventDataFunctor touchFunctor( touchData ); stageActor.TouchedSignal().Connect(&application, touchFunctor); // Set system-overlay actor to have the gesture SignalData data; GestureReceivedFunctor functor(data); TapGestureDetector detector = TapGestureDetector::New(); detector.Attach(systemOverlayActor); detector.DetectedSignal().Connect(&application, functor); Vector2 screenCoords( 50.0f, 50.0f ); // Do a tap inside both actors' area application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, screenCoords ) ); application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, screenCoords ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( false, touchData.functorCalled, TEST_LOCATION ); data.Reset(); touchData.Reset(); // Do touch in the same area application.ProcessEvent( touchFunctor.GenerateSingleTouch( PointState::DOWN, screenCoords ) ); DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( true, touchData.functorCalled, TEST_LOCATION ); END_TEST; }
int UtcDaliHoverActorBecomesInsensitiveParentConsumer(void) { TestApplication application; Actor rootActor( Stage::GetCurrent().GetRootLayer() ); Actor actor = Actor::New(); actor.SetSize(100.0f, 100.0f); actor.SetAnchorPoint(AnchorPoint::TOP_LEFT); Stage::GetCurrent().Add(actor); // Render and notify application.SendNotification(); application.Render(); // Connect to actor's hovered signal SignalData data; HoverEventFunctor functor( data, false ); actor.HoveredSignal().Connect( &application, functor ); // Connect to root actor's hovered signal SignalData rootData; HoverEventFunctor rootFunctor( rootData ); // Consumes signal rootActor.HoveredSignal().Connect( &application, rootFunctor ); // Emit a started signal application.ProcessEvent( GenerateSingleHover( TouchPoint::Started, Vector2( 10.0f, 10.0f ) ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( TouchPoint::Started, data.hoverEvent.points[0].state, TEST_LOCATION ); DALI_TEST_EQUALS( TouchPoint::Started, rootData.hoverEvent.points[0].state, TEST_LOCATION ); DALI_TEST_CHECK( actor == data.hoverEvent.points[0].hitActor ); DALI_TEST_CHECK( actor == rootData.hoverEvent.points[0].hitActor ); data.Reset(); rootData.Reset(); // Remove actor from Stage Stage::GetCurrent().Remove( actor ); // Render and notify application.SendNotification(); application.Render(); // Make root actor insensitive rootActor.SetSensitive( false ); // Emit a motion signal, signalled with an interrupted (should get interrupted even if within root actor) application.ProcessEvent( GenerateSingleHover( TouchPoint::Motion, Vector2 ( 200.0f, 200.0f )) ); DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( TouchPoint::Interrupted, rootData.hoverEvent.points[0].state, TEST_LOCATION ); END_TEST; }
int UtcDaliHoverMultipleRenderTasksWithChildLayer(void) { TestApplication application; Stage stage ( Stage::GetCurrent() ); Vector2 stageSize ( stage.GetSize() ); Actor actor = Actor::New(); actor.SetSize(100.0f, 100.0f); actor.SetAnchorPoint(AnchorPoint::TOP_LEFT); stage.Add(actor); Layer layer = Layer::New(); layer.SetSize(100.0f, 100.0f); layer.SetAnchorPoint(AnchorPoint::TOP_LEFT); actor.Add(layer); // Create render task Viewport viewport( stageSize.width * 0.5f, stageSize.height * 0.5f, stageSize.width * 0.5f, stageSize.height * 0.5f ); RenderTask renderTask ( Stage::GetCurrent().GetRenderTaskList().CreateTask() ); renderTask.SetViewport( viewport ); renderTask.SetInputEnabled( true ); renderTask.SetSourceActor( actor ); // Render and notify application.SendNotification(); application.Render(); // Connect to layer's hovered signal SignalData data; HoverEventFunctor functor( data ); actor.HoveredSignal().Connect( &application, functor ); layer.HoveredSignal().Connect( &application, functor ); // Emit a started signal application.ProcessEvent( GenerateSingleHover( TouchPoint::Started, Vector2( 10.0f, 10.0f ) ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); data.Reset(); // Ensure renderTask actor can be hit too. application.ProcessEvent( GenerateSingleHover( TouchPoint::Started, Vector2( viewport.x + 5.0f, viewport.y + 5.0f ) ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); data.Reset(); // Disable input on renderTask, should not be hittable renderTask.SetInputEnabled( false ); application.ProcessEvent( GenerateSingleHover( TouchPoint::Started, Vector2( viewport.x + 5.0f, viewport.y + 5.0f ) ) ); DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION ); data.Reset(); END_TEST; }
int UtcDaliTapGestureSignalReceptionDetach(void) { TestApplication application; Actor actor = Actor::New(); actor.SetSize(100.0f, 100.0f); actor.SetAnchorPoint(AnchorPoint::TOP_LEFT); Stage::GetCurrent().Add(actor); // Render and notify application.SendNotification(); application.Render(); SignalData data; GestureReceivedFunctor functor(data); TapGestureDetector detector = TapGestureDetector::New(); detector.Attach(actor); detector.DetectedSignal().Connect(&application, functor); // Start tap within the actor's area application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(20.0f, 20.0f))); application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(20.0f, 20.0f))); DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION); DALI_TEST_EQUALS(1u, data.receivedGesture.numberOfTaps, TEST_LOCATION); DALI_TEST_EQUALS(1u, data.receivedGesture.numberOfTouches, TEST_LOCATION); DALI_TEST_EQUALS( Vector2(20.0f, 20.0f), data.receivedGesture.localPoint, 0.1, TEST_LOCATION); // repeat the tap within the actor's area - we should still receive the signal data.Reset(); application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(50.0f, 50.0f))); application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(50.0f, 50.0f))); DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION); DALI_TEST_EQUALS(1u, data.receivedGesture.numberOfTaps, TEST_LOCATION); DALI_TEST_EQUALS(1u, data.receivedGesture.numberOfTouches, TEST_LOCATION); DALI_TEST_EQUALS( Vector2(50.0f, 50.0f), data.receivedGesture.localPoint, 0.1, TEST_LOCATION); // Detach actor detector.DetachAll(); // Ensure we are no longer signalled data.Reset(); application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(20.0f, 20.0f))); application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(20.0f, 20.0f))); DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION); application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(50.0f, 50.0f))); application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(50.0f, 50.0f))); DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION); END_TEST; }
int UtcDaliTapGestureLayerConsumesTouch(void) { TestApplication application; Actor actor = Actor::New(); actor.SetSize(100.0f, 100.0f); actor.SetAnchorPoint(AnchorPoint::TOP_LEFT); Stage::GetCurrent().Add(actor); // Add a detector SignalData data; GestureReceivedFunctor functor(data); TapGestureDetector detector = TapGestureDetector::New(); detector.Attach(actor); detector.DetectedSignal().Connect( &application, functor ); // Add a layer to overlap the actor Layer layer = Layer::New(); layer.SetSize(100.0f, 100.0f); layer.SetAnchorPoint(AnchorPoint::TOP_LEFT); Stage::GetCurrent().Add( layer ); layer.RaiseToTop(); // Render and notify application.SendNotification(); application.Render(); Vector2 screenCoords( 50.0f, 50.0f ); // Emit signals, should receive application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, screenCoords ) ); application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, screenCoords ) ); DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION); data.Reset(); // Set layer to consume all touch layer.SetTouchConsumed( true ); // Render and notify application.SendNotification(); application.Render(); // Emit the same signals again, should not receive application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, screenCoords ) ); application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, screenCoords ) ); DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION); data.Reset(); END_TEST; }
int UtcDaliHoverOffscreenRenderTasks(void) { TestApplication application; Stage stage ( Stage::GetCurrent() ); Vector2 stageSize ( stage.GetSize() ); // FrameBufferImage for offscreen RenderTask FrameBufferImage frameBufferImage( FrameBufferImage::New( stageSize.width, stageSize.height, Pixel::RGBA8888 ) ); // Create a renderable actor to display the FrameBufferImage Actor renderableActor = CreateRenderableActor( frameBufferImage ); renderableActor.SetParentOrigin(ParentOrigin::CENTER); renderableActor.SetSize( stageSize.x, stageSize.y ); renderableActor.ScaleBy( Vector3(1.0f, -1.0f, 1.0f) ); // FIXME stage.Add( renderableActor ); Actor actor = Actor::New(); actor.SetSize(100.0f, 100.0f); actor.SetAnchorPoint(AnchorPoint::TOP_LEFT); stage.Add( actor ); application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); // Ensure framebuffer connects stage.GetRenderTaskList().GetTask( 0u ).SetScreenToFrameBufferFunction( RenderTask::FULLSCREEN_FRAMEBUFFER_FUNCTION ); // Create a RenderTask RenderTask renderTask = stage.GetRenderTaskList().CreateTask(); renderTask.SetSourceActor( actor ); renderTask.SetTargetFrameBuffer( frameBufferImage ); renderTask.SetInputEnabled( true ); // Create another RenderTask RenderTask renderTask2( stage.GetRenderTaskList().CreateTask() ); renderTask2.SetInputEnabled( true ); // Render and notify application.SendNotification(); application.Render(); // Connect to actor's hovered signal SignalData data; HoverEventFunctor functor( data ); actor.HoveredSignal().Connect( &application, functor ); // Emit a started signal application.ProcessEvent( GenerateSingleHover( TouchPoint::Started, Vector2( 10.0f, 10.0f ) ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); data.Reset(); END_TEST; }
int UtcDaliHoverLeaveActorReadded(void) { TestApplication application; Stage stage = Stage::GetCurrent(); Actor actor = Actor::New(); actor.SetSize(100.0f, 100.0f); actor.SetAnchorPoint(AnchorPoint::TOP_LEFT); stage.Add(actor); // Set actor to receive hover-events actor.SetLeaveRequired( true ); // Render and notify application.SendNotification(); application.Render(); // Connect to actor's hovered signal SignalData data; HoverEventFunctor functor( data ); actor.HoveredSignal().Connect( &application, functor ); // Emit a started and motion application.ProcessEvent( GenerateSingleHover( TouchPoint::Started, Vector2( 10.0f, 10.0f ) ) ); application.ProcessEvent( GenerateSingleHover( TouchPoint::Motion, Vector2( 11.0f, 10.0f ) ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); data.Reset(); // Remove actor from stage and add again stage.Remove( actor ); stage.Add( actor ); // Emit a motion within the actor's bounds application.ProcessEvent( GenerateSingleHover( TouchPoint::Motion, Vector2( 12.0f, 10.0f ) ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); data.Reset(); // Emit a motion outside the actor's bounds application.ProcessEvent( GenerateSingleHover( TouchPoint::Motion, Vector2( 200.0f, 200.0f ) ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( TouchPoint::Leave, data.hoverEvent.points[0].state, TEST_LOCATION ); data.Reset(); END_TEST; }
int UtcDaliTapGestureSignalReceptionActorDestroyedWhileTapping(void) { TestApplication application; SignalData data; GestureReceivedFunctor functor(data); TapGestureDetector detector = TapGestureDetector::New(); detector.DetectedSignal().Connect(&application, functor); // Actor lifetime is scoped { Actor actor = Actor::New(); actor.SetSize(100.0f, 100.0f); actor.SetAnchorPoint(AnchorPoint::TOP_LEFT); Stage::GetCurrent().Add(actor); // Render and notify application.SendNotification(); application.Render(); detector.Attach(actor); // Start tap within the actor's area application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(20.0f, 20.0f))); application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(20.0f, 20.0f))); DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION); // Remove the actor from stage and reset the data Stage::GetCurrent().Remove(actor); // Render and notify application.SendNotification(); application.Render(); } // Actor should now have been destroyed data.Reset(); application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(20.0f, 20.0f))); application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(20.0f, 20.0f))); DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION); END_TEST; }
void WorkspaceSerializer::Read(const QString& fileName, SignalData& data, PlotInfo& plotInfo) { DataMap newData; ::Read(fileName, data, plotInfo, [&](Signal&& signal){ auto signalName = signal.name; newData.emplace(std::move(signalName), std::move(signal)); }, [&]{ data.add(std::move(newData)); }); }
DataToReplay PrepareReplay(const QString& file, SignalData& signalData) { SignalData data; PlotInfo info; WorkspaceSerializer::Read(file, data, info); DataMap toSet; vector < pair<QString, QVector<qreal>>> toSend; data.onSignals([&](const Signal& signal){ toSet.emplace(signal.name, Signal{ signal.name, {}, signal.graphic }); toSend.emplace_back(make_pair(signal.name, std::move(signal.y))); }); for (auto& signal : toSet) { signalData.addIfNotExists(std::move(signal.second)); } signalData.setAsDomain(data.getDomain()->name); return toSend; }
void WorkspaceSerializerTests::VerifyActualDataAndPersistedFile(const QString& file, const DataMap& expectedDataMap, const QString& expectedDomain, const QColor& expectedBackground) { SignalData actualSignalData; PlotInfo actualPlotInfo; QSignalSpy dataSpy(&actualSignalData, SIGNAL(DataAdded(const DataMap&))); QSignalSpy plotSpy(&actualPlotInfo, SIGNAL(BackgroundColorChanged(const QColor&))); WorkspaceSerializer::Read(file, actualSignalData, actualPlotInfo); QCOMPARE(1, dataSpy.count()); QCOMPARE(1, plotSpy.count()); auto actualdata = dataSpy.takeFirst().takeFirst().value<DataMap>(); QCOMPARE(actualdata, expectedDataMap); QCOMPARE(actualSignalData.getDomain()->name, expectedDomain); auto actualColor = plotSpy.takeFirst().takeFirst().value<QColor>(); QCOMPARE(actualColor, expectedBackground); }
int UtcDaliTapGestureSignalReceptionActorBecomesUntouchable(void) { TestApplication application; Actor actor = Actor::New(); actor.SetSize(100.0f, 100.0f); actor.SetAnchorPoint(AnchorPoint::TOP_LEFT); Stage::GetCurrent().Add(actor); // Render and notify application.SendNotification(); application.Render(); SignalData data; GestureReceivedFunctor functor(data); TapGestureDetector detector = TapGestureDetector::New(); detector.Attach(actor); detector.DetectedSignal().Connect(&application, functor); // Tap in actor's area application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(50.0f, 10.0f))); application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(50.0f, 10.0f))); DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION); // Actor become invisible - actor should not receive the next pan actor.SetVisible(false); // Render and notify application.SendNotification(); application.Render(); // Tap in the same area, shouldn't receive event data.Reset(); application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(50.0f, 10.0f))); application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(50.0f, 10.0f))); DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION); END_TEST; }
void WorkspaceSerializerTests::WriteTest() { DataMap dataMap = { { "cubic", { "cubic", { 1, 8, 27, 64, 125, 216, 343, 512, 729, 1000 }, { "#008000", true, 1, 1000 } } }, { "line", { "line", { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }, { "#ffff00", false, 1, 10 } } } }; PlotInfo plot; plot.setBackgroundColor("red"); SignalData data; data.add(dataMap); data.setAsDomain("line"); QString tmpFileName = std::tmpnam(nullptr); struct guard { guard(const QString& fileName) : fileName(fileName) { } ~guard() { QFile f(fileName); f.remove(); } const QString& fileName; } fileDeleter(tmpFileName); WorkspaceSerializer::Write(tmpFileName, data, plot); VerifyActualDataAndPersistedFile(tmpFileName, dataMap, "line", "red"); }
int UtcDaliTapGestureRepeatedState(void) { TestApplication application; Actor actor = Actor::New(); actor.SetSize(100.0f, 100.0f); actor.SetAnchorPoint(AnchorPoint::TOP_LEFT); Stage::GetCurrent().Add(actor); // Render and notify application.SendNotification(); application.Render(); // Attach actor to detector SignalData data; GestureReceivedFunctor functor( data ); TapGestureDetector detector = TapGestureDetector::New(); detector.Attach(actor); detector.DetectedSignal().Connect( &application, functor ); // Emit two possibles application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(50.0f, 10.0f))); application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(50.0f, 10.0f))); DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION); // Send a couple of Started states, only first one should be received. application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(50.0f, 10.0f))); DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION); data.Reset(); application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(50.0f, 10.0f))); DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION); // Send a couple of cancelled states, no reception application.ProcessEvent(GenerateTap(Gesture::Cancelled, 1u, 1u, Vector2(50.0f, 10.0f))); application.ProcessEvent(GenerateTap(Gesture::Cancelled, 1u, 1u, Vector2(50.0f, 10.0f))); DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION); END_TEST; }
int UtcDaliHoverStencilNonRenderableActor(void) { TestApplication application; Stage stage = Stage::GetCurrent(); Actor actor = Actor::New(); actor.SetSize(100.0f, 100.0f); actor.SetAnchorPoint(AnchorPoint::TOP_LEFT); stage.Add(actor); Actor stencil = Actor::New(); stencil.SetSize(50.0f, 50.0f); stencil.SetAnchorPoint(AnchorPoint::TOP_LEFT); stencil.SetDrawMode( DrawMode::STENCIL ); stage.Add(stencil); // Render and notify application.SendNotification(); application.Render(); // Connect to actor's hovered signal SignalData data; HoverEventFunctor functor( data ); actor.HoveredSignal().Connect( &application, functor ); // Emit an event within stencil area application.ProcessEvent( GenerateSingleHover( TouchPoint::Started, Vector2( 10.0f, 10.0f ) ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); data.Reset(); // Emit an event outside the stencil area but within the actor area, we should have a hit! application.ProcessEvent( GenerateSingleHover( TouchPoint::Started, Vector2( 60.0f, 60.0f ) ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); data.Reset(); END_TEST; }
int UtcDaliHoverActorUnStaged(void) { TestApplication application; Actor actor = Actor::New(); actor.SetSize(100.0f, 100.0f); actor.SetAnchorPoint(AnchorPoint::TOP_LEFT); Stage::GetCurrent().Add(actor); // Render and notify application.SendNotification(); application.Render(); // Connect to actor's hovered signal SignalData data; HoverEventFunctor functor( data ); actor.HoveredSignal().Connect( &application, functor ); // Emit a started signal application.ProcessEvent( GenerateSingleHover( TouchPoint::Started, Vector2( 10.0f, 10.0f ) ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); data.Reset(); // Remove actor from stage Stage::GetCurrent().Remove( actor ); // Render and notify application.SendNotification(); application.Render(); // Emit a move at the same point, we should not be signalled. application.ProcessEvent( GenerateSingleHover( TouchPoint::Motion, Vector2( 10.0f, 10.0f ) ) ); DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION ); data.Reset(); END_TEST; }
int UtcDaliHoverLeave(void) { TestApplication application; Actor actor = Actor::New(); actor.SetSize(100.0f, 100.0f); actor.SetAnchorPoint(AnchorPoint::TOP_LEFT); Stage::GetCurrent().Add(actor); // Render and notify application.SendNotification(); application.Render(); // Connect to actor's hovered signal SignalData data; HoverEventFunctor functor( data ); actor.HoveredSignal().Connect( &application, functor ); // Set actor to require leave events actor.SetLeaveRequired( true ); // Emit a started signal application.ProcessEvent( GenerateSingleHover( TouchPoint::Started, Vector2( 10.0f, 10.0f ) ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( TouchPoint::Started, data.hoverEvent.points[0].state, TEST_LOCATION ); data.Reset(); // Emit a motion signal outside of actor, should be signalled with a Leave application.ProcessEvent( GenerateSingleHover( TouchPoint::Motion, Vector2 ( 200.0f, 200.0f )) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( TouchPoint::Leave, data.hoverEvent.points[0].state, TEST_LOCATION ); data.Reset(); // Another motion outside of actor, no signalling application.ProcessEvent( GenerateSingleHover( TouchPoint::Motion, Vector2 ( 201.0f, 201.0f )) ); DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION ); data.Reset(); // Another motion event inside actor, signalled with motion application.ProcessEvent( GenerateSingleHover( TouchPoint::Motion, Vector2 ( 10.0f, 10.0f )) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( TouchPoint::Motion, data.hoverEvent.points[0].state, TEST_LOCATION ); data.Reset(); // We do not want to listen to leave events anymore actor.SetLeaveRequired( false ); // Another motion event outside of actor, no signalling application.ProcessEvent( GenerateSingleHover( TouchPoint::Motion, Vector2 ( 200.0f, 200.0f )) ); DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION ); data.Reset(); END_TEST; }
void Read(const QString& fileName, SignalData& data, PlotInfo& plotInfo, std::function<void(Signal&&)> onSignal, std::function<void()> onAfterSignalRead) { QFile in(fileName); if (!in.open(QIODevice::ReadOnly | QFile::Text)) { auto mex = QString("Cannot open specified file -> %1").arg(fileName); QMessageBox::critical(nullptr, "Anvedi", mex); throw std::exception(mex.toUtf8().data()); } const auto json = QJsonDocument::fromJson(in.readAll()).object(); auto backgroundIt = json.find("background"); if (backgroundIt != json.end()) { plotInfo.setBackgroundColor(backgroundIt->toString()); } auto graphIt = json.find("signals"); if ((graphIt != json.end()) && graphIt->isArray()) { for (const auto& elem : graphIt->toArray()) { if (elem.isObject()) { onSignal(ReadGraph(elem.toObject())); } } } onAfterSignalRead(); auto domainIt = json.find("domain"); if (domainIt != json.end()) { const auto domainName = domainIt->toString(); try { data.setAsDomain(domainName); } catch (const std::exception&){} } }
int UtcDaliTapGestureSignalReceptionMultipleGestureDetectors(void) { TestApplication application; Dali::TestGestureManager& gestureManager = application.GetGestureManager(); Actor first = Actor::New(); first.SetSize(100.0f, 100.0f); first.SetAnchorPoint(AnchorPoint::TOP_LEFT); Stage::GetCurrent().Add(first); Actor second = Actor::New(); second.SetSize(100.0f, 100.0f); second.SetAnchorPoint(AnchorPoint::TOP_LEFT); second.SetX(100.0f); first.Add(second); // Render and notify application.SendNotification(); application.Render(); SignalData data; GestureReceivedFunctor functor(data); TapGestureDetector firstDetector = TapGestureDetector::New(); firstDetector.Attach(first); firstDetector.DetectedSignal().Connect(&application, functor); // secondDetector is scoped { // Reset gestureManager statistics gestureManager.Initialize(); TapGestureDetector secondDetector = TapGestureDetector::New( 2 ); secondDetector.Attach(second); secondDetector.DetectedSignal().Connect(&application, functor); DALI_TEST_EQUALS(true, gestureManager.WasCalled(TestGestureManager::UpdateType), TEST_LOCATION); DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::RegisterType), TEST_LOCATION); DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::UnregisterType), TEST_LOCATION); // Tap within second actor's area application.ProcessEvent(GenerateTap(Gesture::Possible, 2u, 1u, Vector2(150.0f, 10.0f))); application.ProcessEvent(GenerateTap(Gesture::Started, 2u, 1u, Vector2(150.0f, 10.0f))); DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION); DALI_TEST_EQUALS(true, second == data.tappedActor, TEST_LOCATION); // Tap continues as single touch gesture - we should not receive any gesture data.Reset(); application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(150.0f, 10.0f))); application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(150.0f, 10.0f))); DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION); // Single touch tap starts - first actor should be panned data.Reset(); application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(50.0f, 10.0f))); application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(50.0f, 10.0f))); DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION); DALI_TEST_EQUALS(true, first == data.tappedActor, TEST_LOCATION); // Pan changes to double-touch - we shouldn't receive event data.Reset(); application.ProcessEvent(GenerateTap(Gesture::Possible, 2u, 2u, Vector2(50.0f, 10.0f))); application.ProcessEvent(GenerateTap(Gesture::Started, 2u, 2u, Vector2(50.0f, 10.0f))); DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION); // Reset gesture manager statistics gestureManager.Initialize(); } // secondDetector has now been deleted. Gesture detection should have been updated only DALI_TEST_EQUALS(true, gestureManager.WasCalled(TestGestureManager::UpdateType), TEST_LOCATION); DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::RegisterType), TEST_LOCATION); DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::UnregisterType), TEST_LOCATION); END_TEST; }
int UtcDaliHoverParentConsumer(void) { TestApplication application; Actor rootActor( Stage::GetCurrent().GetRootLayer() ); Actor actor = Actor::New(); actor.SetSize(100.0f, 100.0f); actor.SetAnchorPoint(AnchorPoint::TOP_LEFT); Stage::GetCurrent().Add(actor); // Render and notify application.SendNotification(); application.Render(); // Connect to actor's hovered signal SignalData data; HoverEventFunctor functor( data, false ); actor.HoveredSignal().Connect( &application, functor ); // Connect to root actor's hovered signal SignalData rootData; HoverEventFunctor rootFunctor( rootData ); // Consumes signal rootActor.HoveredSignal().Connect( &application, rootFunctor ); Vector2 screenCoordinates( 10.0f, 10.0f ); Vector2 actorCoordinates, rootCoordinates; actor.ScreenToLocal( actorCoordinates.x, actorCoordinates.y, screenCoordinates.x, screenCoordinates.y ); rootActor.ScreenToLocal( rootCoordinates.x, rootCoordinates.y, screenCoordinates.x, screenCoordinates.y ); // Emit a started signal application.ProcessEvent( GenerateSingleHover( TouchPoint::Started, screenCoordinates ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( 1u, data.hoverEvent.GetPointCount(), TEST_LOCATION ); DALI_TEST_EQUALS( 1u, rootData.hoverEvent.GetPointCount(), TEST_LOCATION ); DALI_TEST_EQUALS( TouchPoint::Started, data.hoverEvent.points[0].state, TEST_LOCATION ); DALI_TEST_EQUALS( TouchPoint::Started, rootData.hoverEvent.points[0].state, TEST_LOCATION ); DALI_TEST_EQUALS( screenCoordinates, data.hoverEvent.points[0].screen, TEST_LOCATION ); DALI_TEST_EQUALS( screenCoordinates, rootData.hoverEvent.points[0].screen, TEST_LOCATION ); DALI_TEST_EQUALS( actorCoordinates, data.hoverEvent.points[0].local, 0.1f, TEST_LOCATION ); DALI_TEST_EQUALS( rootCoordinates, rootData.hoverEvent.points[0].local, 0.1f, TEST_LOCATION ); DALI_TEST_CHECK( actor == data.hoverEvent.points[0].hitActor ); DALI_TEST_CHECK( actor == rootData.hoverEvent.points[0].hitActor ); data.Reset(); rootData.Reset(); // Emit a motion signal screenCoordinates.x = screenCoordinates.y = 11.0f; actor.ScreenToLocal( actorCoordinates.x, actorCoordinates.y, screenCoordinates.x, screenCoordinates.y ); rootActor.ScreenToLocal( rootCoordinates.x, rootCoordinates.y, screenCoordinates.x, screenCoordinates.y ); application.ProcessEvent( GenerateSingleHover( TouchPoint::Motion, screenCoordinates ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( 1u, data.hoverEvent.GetPointCount(), TEST_LOCATION ); DALI_TEST_EQUALS( 1u, rootData.hoverEvent.GetPointCount(), TEST_LOCATION ); DALI_TEST_EQUALS( TouchPoint::Motion, data.hoverEvent.points[0].state, TEST_LOCATION ); DALI_TEST_EQUALS( TouchPoint::Motion, rootData.hoverEvent.points[0].state, TEST_LOCATION ); DALI_TEST_EQUALS( screenCoordinates, data.hoverEvent.points[0].screen, TEST_LOCATION ); DALI_TEST_EQUALS( screenCoordinates, rootData.hoverEvent.points[0].screen, TEST_LOCATION ); DALI_TEST_EQUALS( actorCoordinates, data.hoverEvent.points[0].local, 0.1f, TEST_LOCATION ); DALI_TEST_EQUALS( rootCoordinates, rootData.hoverEvent.points[0].local, 0.1f, TEST_LOCATION ); DALI_TEST_CHECK( actor == data.hoverEvent.points[0].hitActor ); DALI_TEST_CHECK( actor == rootData.hoverEvent.points[0].hitActor ); data.Reset(); rootData.Reset(); // Emit a finished signal screenCoordinates.x = screenCoordinates.y = 12.0f; actor.ScreenToLocal( actorCoordinates.x, actorCoordinates.y, screenCoordinates.x, screenCoordinates.y ); rootActor.ScreenToLocal( rootCoordinates.x, rootCoordinates.y, screenCoordinates.x, screenCoordinates.y ); application.ProcessEvent( GenerateSingleHover( TouchPoint::Finished, screenCoordinates ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( 1u, data.hoverEvent.GetPointCount(), TEST_LOCATION ); DALI_TEST_EQUALS( 1u, rootData.hoverEvent.GetPointCount(), TEST_LOCATION ); DALI_TEST_EQUALS( TouchPoint::Finished, data.hoverEvent.points[0].state, TEST_LOCATION ); DALI_TEST_EQUALS( TouchPoint::Finished, rootData.hoverEvent.points[0].state, TEST_LOCATION ); DALI_TEST_EQUALS( screenCoordinates, data.hoverEvent.points[0].screen, TEST_LOCATION ); DALI_TEST_EQUALS( screenCoordinates, rootData.hoverEvent.points[0].screen, TEST_LOCATION ); DALI_TEST_EQUALS( actorCoordinates, data.hoverEvent.points[0].local, 0.1f, TEST_LOCATION ); DALI_TEST_EQUALS( rootCoordinates, rootData.hoverEvent.points[0].local, 0.1f, TEST_LOCATION ); DALI_TEST_CHECK( actor == data.hoverEvent.points[0].hitActor ); DALI_TEST_CHECK( actor == rootData.hoverEvent.points[0].hitActor ); data.Reset(); rootData.Reset(); // Emit a started signal where the actor is not present, will hit the root actor though screenCoordinates.x = screenCoordinates.y = 200.0f; rootActor.ScreenToLocal( rootCoordinates.x, rootCoordinates.y, screenCoordinates.x, screenCoordinates.y ); application.ProcessEvent( GenerateSingleHover( TouchPoint::Started, screenCoordinates ) ); DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( 1u, rootData.hoverEvent.GetPointCount(), TEST_LOCATION ); DALI_TEST_EQUALS( TouchPoint::Started, rootData.hoverEvent.points[0].state, TEST_LOCATION ); DALI_TEST_EQUALS( screenCoordinates, rootData.hoverEvent.points[0].screen, TEST_LOCATION ); DALI_TEST_EQUALS( rootCoordinates, rootData.hoverEvent.points[0].local, 0.1f, TEST_LOCATION ); DALI_TEST_CHECK( rootActor == rootData.hoverEvent.points[0].hitActor ); END_TEST; }
int UtcDaliHoverInterruptedParentConsumer(void) { TestApplication application; Actor rootActor( Stage::GetCurrent().GetRootLayer() ); Actor actor = Actor::New(); actor.SetSize(100.0f, 100.0f); actor.SetAnchorPoint(AnchorPoint::TOP_LEFT); Stage::GetCurrent().Add(actor); // Render and notify application.SendNotification(); application.Render(); // Connect to actor's hovered signal SignalData data; HoverEventFunctor functor( data, false ); actor.HoveredSignal().Connect( &application, functor ); // Connect to root actor's hovered signal SignalData rootData; HoverEventFunctor rootFunctor( rootData ); // Consumes signal rootActor.HoveredSignal().Connect( &application, rootFunctor ); // Emit a started signal application.ProcessEvent( GenerateSingleHover( TouchPoint::Started, Vector2( 10.0f, 10.0f ) ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( TouchPoint::Started, data.hoverEvent.points[0].state, TEST_LOCATION ); DALI_TEST_EQUALS( TouchPoint::Started, rootData.hoverEvent.points[0].state, TEST_LOCATION ); DALI_TEST_CHECK( actor == data.hoverEvent.points[0].hitActor ); DALI_TEST_CHECK( actor == rootData.hoverEvent.points[0].hitActor ); data.Reset(); rootData.Reset(); // Emit an interrupted signal application.ProcessEvent( GenerateSingleHover( TouchPoint::Interrupted, Vector2( 200.0f, 200.0f ) ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( TouchPoint::Interrupted, data.hoverEvent.points[0].state, TEST_LOCATION ); DALI_TEST_EQUALS( TouchPoint::Interrupted, rootData.hoverEvent.points[0].state, TEST_LOCATION ); DALI_TEST_CHECK( actor == data.hoverEvent.points[0].hitActor ); DALI_TEST_CHECK( actor == rootData.hoverEvent.points[0].hitActor ); data.Reset(); rootData.Reset(); // Emit another started signal application.ProcessEvent( GenerateSingleHover( TouchPoint::Started, Vector2( 10.0f, 10.0f ) ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( TouchPoint::Started, data.hoverEvent.points[0].state, TEST_LOCATION ); DALI_TEST_EQUALS( TouchPoint::Started, rootData.hoverEvent.points[0].state, TEST_LOCATION ); data.Reset(); rootData.Reset(); // Remove actor from Stage Stage::GetCurrent().Remove( actor ); // Render and notify application.SendNotification(); application.Render(); // Emit an interrupted signal, only root actor's signal should be called. application.ProcessEvent( GenerateSingleHover( TouchPoint::Interrupted, Vector2( 200.0f, 200.0f /* Outside actor */ ) ) ); DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( TouchPoint::Interrupted, rootData.hoverEvent.points[0].state, TEST_LOCATION ); DALI_TEST_CHECK( rootActor == rootData.hoverEvent.points[0].hitActor ); data.Reset(); rootData.Reset(); // Emit another interrupted state, none of the signal's should be called. application.ProcessEvent( GenerateSingleHover( TouchPoint::Interrupted, Vector2( 200.0f, 200.0f ) ) ); DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( false, rootData.functorCalled, TEST_LOCATION ); END_TEST; }
int UtcDaliHoverMultipleLayers(void) { TestApplication application; Actor rootActor( Stage::GetCurrent().GetRootLayer() ); // Connect to actor's hovered signal SignalData data; HoverEventFunctor functor( data ); Layer layer1 ( Layer::New() ); layer1.SetSize(100.0f, 100.0f); layer1.SetAnchorPoint(AnchorPoint::TOP_LEFT); Stage::GetCurrent().Add( layer1 ); Actor actor1 ( Actor::New() ); actor1.SetSize( 100.0f, 100.0f ); actor1.SetAnchorPoint(AnchorPoint::TOP_LEFT); actor1.SetZ( 1.0f ); // Should hit actor1 in this layer layer1.Add( actor1 ); // Render and notify application.SendNotification(); application.Render(); // Connect to layer1 and actor1 layer1.HoveredSignal().Connect( &application, functor ); actor1.HoveredSignal().Connect( &application, functor ); // Hit in hittable area, actor1 should be hit application.ProcessEvent( GenerateSingleHover( TouchPoint::Started, Vector2( 10.0f, 10.0f ) ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); DALI_TEST_CHECK( data.hoveredActor == actor1 ); data.Reset(); // Make layer1 insensitive, nothing should be hit layer1.SetSensitive( false ); application.ProcessEvent( GenerateSingleHover( TouchPoint::Started, Vector2( 10.0f, 10.0f ) ) ); DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION ); data.Reset(); // Make layer1 sensitive again, again actor1 will be hit layer1.SetSensitive( true ); application.ProcessEvent( GenerateSingleHover( TouchPoint::Started, Vector2( 10.0f, 10.0f ) ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); DALI_TEST_CHECK( data.hoveredActor == actor1 ); data.Reset(); // Make rootActor insensitive, nothing should be hit rootActor.SetSensitive( false ); application.ProcessEvent( GenerateSingleHover( TouchPoint::Started, Vector2( 10.0f, 10.0f ) ) ); DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION ); data.Reset(); // Make rootActor sensitive rootActor.SetSensitive( true ); // Add another layer Layer layer2 ( Layer::New() ); layer2.SetSize(100.0f, 100.0f ); layer2.SetAnchorPoint(AnchorPoint::TOP_LEFT); layer2.SetZ( 10.0f ); // Should hit layer2 in this layer rather than actor2 Stage::GetCurrent().Add( layer2 ); Actor actor2 ( Actor::New() ); actor2.SetSize(100.0f, 100.0f); actor2.SetAnchorPoint(AnchorPoint::TOP_LEFT); layer2.Add( actor2 ); // Render and notify application.SendNotification(); application.Render(); // Connect to layer2 and actor2 layer2.HoveredSignal().Connect( &application, functor ); actor2.HoveredSignal().Connect( &application, functor ); // Emit an event, should hit layer2 application.ProcessEvent( GenerateSingleHover( TouchPoint::Started, Vector2( 10.0f, 10.0f ) ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); //DALI_TEST_CHECK( data.hoveredActor == layer2 ); // TODO: Uncomment this after removing renderable hack! data.Reset(); // Make layer2 insensitive, should hit actor1 layer2.SetSensitive( false ); application.ProcessEvent( GenerateSingleHover( TouchPoint::Started, Vector2( 10.0f, 10.0f ) ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); DALI_TEST_CHECK( data.hoveredActor == actor1 ); data.Reset(); // Make layer2 sensitive again, should hit layer2 layer2.SetSensitive( true ); application.ProcessEvent( GenerateSingleHover( TouchPoint::Started, Vector2( 10.0f, 10.0f ) ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); //DALI_TEST_CHECK( data.hoveredActor == layer2 ); // TODO: Uncomment this after removing renderable hack! data.Reset(); // Make layer2 invisible, render and notify layer2.SetVisible( false ); application.SendNotification(); application.Render(); // Should hit actor1 application.ProcessEvent( GenerateSingleHover( TouchPoint::Started, Vector2( 10.0f, 10.0f ) ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); DALI_TEST_CHECK( data.hoveredActor == actor1 ); data.Reset(); // Make rootActor invisible, render and notify rootActor.SetVisible( false ); application.SendNotification(); application.Render(); // Should not hit anything application.ProcessEvent( GenerateSingleHover( TouchPoint::Started, Vector2( 10.0f, 10.0f ) ) ); DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION ); data.Reset(); END_TEST; }
int UtcDaliTapGestureSetTapsRequired(void) { TestApplication application; TapGestureDetector detector = TapGestureDetector::New(); const unsigned int minTaps = 3; const unsigned int maxTaps = 7; DALI_TEST_CHECK( minTaps != detector.GetMinimumTapsRequired() ); DALI_TEST_CHECK( maxTaps != detector.GetMaximumTapsRequired() ); detector.SetMinimumTapsRequired( minTaps ); detector.SetMaximumTapsRequired( maxTaps ); DALI_TEST_EQUALS( minTaps, detector.GetMinimumTapsRequired(), TEST_LOCATION ); DALI_TEST_EQUALS( maxTaps, detector.GetMaximumTapsRequired(), TEST_LOCATION ); // Attach an actor and change the required touches Actor actor = Actor::New(); actor.SetSize(100.0f, 100.0f); actor.SetAnchorPoint(AnchorPoint::TOP_LEFT); Stage::GetCurrent().Add(actor); // Render and notify application.SendNotification(); application.Render(); SignalData data; GestureReceivedFunctor functor(data); detector.Attach(actor); detector.DetectedSignal().Connect( &application, functor ); // Ensure signal is emitted if minimum taps received application.ProcessEvent(GenerateTap(Gesture::Possible, minTaps, 1u, Vector2(50.0f, 50.0f))); application.ProcessEvent(GenerateTap(Gesture::Started, minTaps, 1u, Vector2(50.0f, 50.0f))); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( minTaps, data.receivedGesture.numberOfTaps, TEST_LOCATION ); data.Reset(); // Ensure signal is emitted if maximum taps received application.ProcessEvent(GenerateTap(Gesture::Possible, maxTaps, 1u, Vector2(50.0f, 50.0f))); application.ProcessEvent(GenerateTap(Gesture::Started, maxTaps, 1u, Vector2(50.0f, 50.0f))); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( maxTaps, data.receivedGesture.numberOfTaps, TEST_LOCATION ); data.Reset(); // Ensure signal is NOT emitted if outside the range application.ProcessEvent(GenerateTap(Gesture::Possible, minTaps - 1, 1u, Vector2(50.0f, 50.0f))); application.ProcessEvent(GenerateTap(Gesture::Started, minTaps - 1, 1u, Vector2(50.0f, 50.0f))); DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION ); data.Reset(); application.ProcessEvent(GenerateTap(Gesture::Possible, maxTaps + 1, 1u, Vector2(50.0f, 50.0f))); application.ProcessEvent(GenerateTap(Gesture::Started, maxTaps + 1, 1u, Vector2(50.0f, 50.0f))); DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION ); data.Reset(); TestGestureManager& gestureManager = application.GetGestureManager(); gestureManager.Initialize(); detector.SetMinimumTapsRequired(4); // Gesture detection should have been updated only DALI_TEST_EQUALS(true, gestureManager.WasCalled(TestGestureManager::UpdateType), TEST_LOCATION); DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::RegisterType), TEST_LOCATION); DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::UnregisterType), TEST_LOCATION); // Reset values gestureManager.Initialize(); detector.SetMaximumTapsRequired(maxTaps); // Gesture detection should NOT have been updated DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::UpdateType), TEST_LOCATION); DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::RegisterType), TEST_LOCATION); DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::UnregisterType), TEST_LOCATION); // Reset values gestureManager.Initialize(); // Create a second gesture detector that requires even less maximum touches TapGestureDetector secondDetector = TapGestureDetector::New(); secondDetector.Attach(actor); // Gesture detection should have been updated DALI_TEST_EQUALS(true, gestureManager.WasCalled(TestGestureManager::UpdateType), TEST_LOCATION); DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::RegisterType), TEST_LOCATION); DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::UnregisterType), TEST_LOCATION); // Reset values gestureManager.Initialize(); // Delete the second detector so that our detection is updated again secondDetector.Reset(); DALI_TEST_EQUALS(true, gestureManager.WasCalled(TestGestureManager::UpdateType), TEST_LOCATION); DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::RegisterType), TEST_LOCATION); DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::UnregisterType), TEST_LOCATION); // Set the minimum to be greater than the maximum, should Assert try { detector.SetMinimumTapsRequired( maxTaps ); detector.SetMaximumTapsRequired( minTaps ); DALI_TEST_CHECK( false ); // Should not get here } catch ( DaliException& e ) { DALI_TEST_CHECK( true ); } END_TEST; }