Added generic signal binding for toolkit controls in JavaScript 50/51650/2
authorRichard Huang <r.huang@samsung.com>
Wed, 11 Nov 2015 17:30:50 +0000 (17:30 +0000)
committerRichard Huang <r.huang@samsung.com>
Wed, 11 Nov 2015 18:36:33 +0000 (18:36 +0000)
This should cover generic use cases where the signal callback only needs to
be aware of who emits the signal and do not need to return any parameter.

This will work for most of control signals without specific binding.

For example, for button, you can do:

  var button = new dali.Control("PushButton");
  button.name = "myButton";
  button.connect("pressed", app.onButtonPressed);
  button.connect("released", app.onButtonReleased);

  app.onButtonPressed = function( button ) {
    console.log(button.name + " Pressed!!!");
  }

  app.onButtonReleased = function( button ) {
    console.log(button.name + " Released!!!");
  }

  button.disconnect("pressed", app.onButtonPressed);
  button.disconnect("released", app.onButtonReleased);

Change-Id: I3144ca274cc07e68d81ba78cc606e5367ea5419b

plugins/dali-script-v8/src/signals/signal-manager.cpp

index 9f61ffc..3f26d0b 100644 (file)
@@ -30,6 +30,7 @@
 #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/devel-api/object/weak-handle.h>
 
 // INTERNAL INCLUDES
 #include <v8-utils.h>
@@ -179,8 +180,9 @@ 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)
@@ -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;
 };
 
 
@@ -380,7 +396,7 @@ 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 )
   {
@@ -404,7 +420,7 @@ void ActorConnection( v8::Isolate* isolate,
   }
   else
   {
-    connected = false;
+    connected = actor.ConnectSignal( callback, signalName, ActorGenericCallbackFunctor(*callback) );
   }
 
   if( connected )
@@ -619,47 +635,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;
+    }
   }
 
 }