[dali_1.4.26] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / plugins / dali-script-v8 / src / signals / signal-manager.cpp
index 9f61ffc..15648b2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 #include <dali/public-api/events/pan-gesture-detector.h>
 #include <dali/public-api/object/any.h>
 #include <dali/public-api/images/image.h>
-#include <dali/public-api/events/touch-event.h>
+#include <dali/public-api/events/touch-data.h>
 #include <dali/public-api/events/hover-event.h>
 #include <dali/public-api/events/wheel-event.h>
 #include <dali/public-api/events/key-event.h>
 #include <dali/public-api/events/pan-gesture.h>
+#include <dali/public-api/object/weak-handle.h>
 
 // INTERNAL INCLUDES
 #include <v8-utils.h>
@@ -53,7 +54,7 @@ namespace V8Plugin
 
 namespace // un-named namespace
 {
-const char* const SIGNAL_TOUCHED = "touched";
+const char* const SIGNAL_TOUCH = "touch";
 const char* const SIGNAL_HOVERED = "hovered";
 const char* const SIGNAL_WHEEL_EVENT = "wheelEvent";
 const char* const SIGNAL_ON_STAGE = "onStage";
@@ -63,7 +64,7 @@ const char* const SIGNAL_PAN_DETECTED = "panDetected";
 
 const char* const STAGE_SIGNAL_KEY_EVENT = "keyEvent";
 const char* const STAGE_SIGNAL_EVENT_PROCESSING_FINISHED = "eventProcessingFinished";
-const char* const STAGE_SIGNAL_TOUCHED = "touched";
+const char* const STAGE_SIGNAL_TOUCH = "touch";
 const char* const SIGNAL_IMAGE_LOADING_FINISHED = "imageLoadingFinished";
 const char* const SIGNAL_IMAGE_UPLOADED = "uploaded";
 
@@ -179,16 +180,17 @@ class ActorCallback :  public BaseCallBack
 {
 public:
 
-  ActorCallback(v8::Isolate* isolate,  const v8::Local<v8::Function>& callback ,const std::string& signalName )
-  : BaseCallBack( isolate, callback, signalName )
+  ActorCallback(v8::Isolate* isolate,  const v8::Local<v8::Function>& callback ,const std::string& signalName, Actor actor )
+  : BaseCallBack( isolate, callback, signalName ),
+    mActor(actor)
   {
   }
-  bool OnTouch( Actor actor, const TouchEvent& event)
+  bool OnTouch( Actor actor, const TouchData& touch )
   {
     std::vector< Dali::Any > arguments;  // Dali::Vector considers Dali::Any to be a non trivial type so won't compile
     Dali::Any returnValue(false);
     arguments.push_back( actor );
-    arguments.push_back( event );
+    arguments.push_back( touch );
     CallJavaScript( returnValue, arguments );
     bool ret;
     returnValue.Get(ret);
@@ -231,8 +233,22 @@ public:
     CallJavaScript( returnValue, arguments );
   }
 
-private:
+  WeakHandle< Actor > mActor;
+
+};
+
+struct ActorGenericCallbackFunctor
+{
+  ActorGenericCallbackFunctor(ActorCallback& callback) : callback(callback) { }
+  void operator()()
+  {
+    std::vector< Dali::Any > arguments;
+    Dali::Any returnValue;          //no return
+    arguments.push_back(callback.mActor.GetHandle()); //pass the actor handle as the parameter
+    callback.CallJavaScript( returnValue, arguments );
+  }
 
+  ActorCallback& callback;
 };
 
 
@@ -292,11 +308,11 @@ public:
     Dali::Any returnValue;  //no return
     CallJavaScript( returnValue, arguments );
   }
-  void TouchedSignal( const TouchEvent& touchEvent)
+  void TouchSignal( const TouchData& touch )
   {
     std::vector< Dali::Any > arguments;
     Dali::Any returnValue;   //no return
-    arguments.push_back( touchEvent );
+    arguments.push_back( touch );
     CallJavaScript( returnValue, arguments );
   }
 };
@@ -380,11 +396,11 @@ void ActorConnection( v8::Isolate* isolate,
 {
   bool connected(true);
 
-  ActorCallback* callback =new ActorCallback( isolate, javaScriptCallback, signalName );
+  ActorCallback* callback =new ActorCallback( isolate, javaScriptCallback, signalName, actor );
 
-  if( strcmp( signalName.c_str(), SIGNAL_TOUCHED ) == 0 )
+  if( strcmp( signalName.c_str(), SIGNAL_TOUCH ) == 0 )
   {
-    actor.TouchedSignal().Connect( callback, &ActorCallback::OnTouch );
+    actor.TouchSignal().Connect( callback, &ActorCallback::OnTouch );
   }
   else if( strcmp( signalName.c_str(), SIGNAL_HOVERED ) == 0 )
   {
@@ -404,7 +420,7 @@ void ActorConnection( v8::Isolate* isolate,
   }
   else
   {
-    connected = false;
+    connected = actor.ConnectSignal( callback, signalName, ActorGenericCallbackFunctor(*callback) );
   }
 
   if( connected )
@@ -414,6 +430,7 @@ void ActorConnection( v8::Isolate* isolate,
   else
   {
     delete callback;
+    DALI_SCRIPT_EXCEPTION( isolate, "the signal is not available in this object.");
   }
 }
 
@@ -477,9 +494,9 @@ void StageConnection( v8::Isolate* isolate,
   {
     stage.EventProcessingFinishedSignal().Connect( callback, &StageCallback::EventProcessingFinishedSignal );
   }
-  else if (strcmp( signalName.c_str(), STAGE_SIGNAL_TOUCHED ) == 0 )
+  else if (strcmp( signalName.c_str(), STAGE_SIGNAL_TOUCH ) == 0 )
   {
-    stage.TouchedSignal().Connect( callback, &StageCallback::TouchedSignal );
+    stage.TouchSignal().Connect( callback, &StageCallback::TouchSignal );
   }
   else
   {
@@ -581,10 +598,10 @@ void SignalManager::SignalConnect( const v8::FunctionCallbackInfo< v8::Value >&
   // first paramter =  signal to connect to
   // Second parameter = function ( to run )
   // args.This() = myActor
-  // e.g. myActor.Connect("touched", myJavaScriptActorTouched );
+  // e.g. myActor.Connect("touch", myJavaScriptActorTouched );
 
   // Inside Callback on myJavaScriptActorTouched
-  // myActor.Disconnect("touched", myJavaScriptActorTouched );
+  // myActor.Disconnect("touch", myJavaScriptActorTouched );
 
   v8::Isolate* isolate = args.GetIsolate();
   v8::HandleScope handleScope( isolate );
@@ -619,47 +636,47 @@ void SignalManager::SignalConnect( const v8::FunctionCallbackInfo< v8::Value >&
   // see if we're connecting to an Actor
   switch( baseObject->GetType() )
   {
-  case BaseWrappedObject::ACTOR:
-  {
-    ActorWrapper* actorWrapper = static_cast< ActorWrapper*>( baseObject );
-    ActorConnection( isolate, func, actorWrapper, signal,  actorWrapper->GetActor() );
-    break;
-  }
-  case BaseWrappedObject::ANIMATION:
-  {
-    AnimationWrapper* animWrapper = static_cast< AnimationWrapper*>( baseObject );
-    AnimationConnection( isolate, func, animWrapper, signal, animWrapper->GetAnimation() );
-    break;
-  }
-  case BaseWrappedObject::IMAGE:
-  {
-    ImageWrapper* imageWrapper = static_cast< ImageWrapper*>( baseObject );
-    ImageConnection( isolate, func, imageWrapper, signal, imageWrapper->GetImage() );
-    break;
-  }
-  case BaseWrappedObject::STAGE:
-  {
-    StageWrapper* stageWrapper = static_cast< StageWrapper*>( baseObject );
-    StageConnection( isolate, func, stageWrapper, signal, stageWrapper->GetStage() );
-    break;
-  }
-  case BaseWrappedObject::KEYBOARD_FOCUS_MANAGER:
-  {
-    KeyboardFocusManagerWrapper* keyboardFocusWrapper = static_cast< KeyboardFocusManagerWrapper*>( baseObject );
-    KeyboardFocusManagerConnection( isolate, func, keyboardFocusWrapper, signal, keyboardFocusWrapper->GetKeyboardFocusManager() );
-    break;
-  }
-  case BaseWrappedObject::PAN_GESTURE_DETECTOR:
-  {
-    PanGestureDetectorWrapper* panGestureDetectorWrapper = static_cast< PanGestureDetectorWrapper*>( baseObject );
-    PanGestureDetectorConnection( isolate, func, panGestureDetectorWrapper, signal, panGestureDetectorWrapper->GetPanGestureDetector() );
-    break;
-  }
-  default:
-  {
-    DALI_SCRIPT_EXCEPTION( isolate, "object does not support connections");
-    break;
-  }
+    case BaseWrappedObject::ACTOR:
+    {
+      ActorWrapper* actorWrapper = static_cast< ActorWrapper*>( baseObject );
+      ActorConnection( isolate, func, actorWrapper, signal,  actorWrapper->GetActor() );
+      break;
+    }
+    case BaseWrappedObject::ANIMATION:
+    {
+      AnimationWrapper* animWrapper = static_cast< AnimationWrapper*>( baseObject );
+      AnimationConnection( isolate, func, animWrapper, signal, animWrapper->GetAnimation() );
+      break;
+    }
+    case BaseWrappedObject::IMAGE:
+    {
+      ImageWrapper* imageWrapper = static_cast< ImageWrapper*>( baseObject );
+      ImageConnection( isolate, func, imageWrapper, signal, imageWrapper->GetImage() );
+      break;
+    }
+    case BaseWrappedObject::STAGE:
+    {
+      StageWrapper* stageWrapper = static_cast< StageWrapper*>( baseObject );
+      StageConnection( isolate, func, stageWrapper, signal, stageWrapper->GetStage() );
+      break;
+    }
+    case BaseWrappedObject::KEYBOARD_FOCUS_MANAGER:
+    {
+      KeyboardFocusManagerWrapper* keyboardFocusWrapper = static_cast< KeyboardFocusManagerWrapper*>( baseObject );
+      KeyboardFocusManagerConnection( isolate, func, keyboardFocusWrapper, signal, keyboardFocusWrapper->GetKeyboardFocusManager() );
+      break;
+    }
+    case BaseWrappedObject::PAN_GESTURE_DETECTOR:
+    {
+      PanGestureDetectorWrapper* panGestureDetectorWrapper = static_cast< PanGestureDetectorWrapper*>( baseObject );
+      PanGestureDetectorConnection( isolate, func, panGestureDetectorWrapper, signal, panGestureDetectorWrapper->GetPanGestureDetector() );
+      break;
+    }
+    default:
+    {
+      DALI_SCRIPT_EXCEPTION( isolate, "object does not support connections");
+      break;
+    }
   }
 
 }