(Builder) Added Quit Signal 45/27245/3
authorAdeel Kazmi <adeel.kazmi@samsung.com>
Mon, 8 Sep 2014 16:13:55 +0000 (17:13 +0100)
committerAdeel Kazmi <adeel.kazmi@samsung.com>
Mon, 8 Sep 2014 17:23:48 +0000 (18:23 +0100)
We provide a quit action but did not do anything when this was signalled.
Now we emit a signal to the application using builder so that it can decide how quit should be
handled.

Change-Id: I51f24d29f30cbb38b400d346bf3c5d0c7b0d56c2

automated-tests/src/dali-toolkit-unmanaged/utc-Dali-Builder.cpp
base/dali-toolkit/internal/builder/builder-impl.cpp
base/dali-toolkit/internal/builder/builder-impl.h
base/dali-toolkit/internal/builder/builder-signals.cpp
base/dali-toolkit/public-api/builder/builder.cpp
base/dali-toolkit/public-api/builder/builder.h

index 833a40e71ae0d4a03193f198ab2238395cc55608..f95bbe757947fda92f6a1b9f70e4be13b248951b 100644 (file)
@@ -19,6 +19,7 @@
 #include <stdlib.h>
 #include <dali-toolkit-test-suite-utils.h>
 #include <dali-toolkit/public-api/builder/builder.h>
+#include <dali/integration-api/events/touch-event-integ.h>
 
 using namespace Dali;
 using namespace Toolkit;
@@ -159,6 +160,21 @@ std::string ReplaceQuotes(const std::string &in_s)
   return s;
 }
 
+struct BuilderFunctor
+{
+  BuilderFunctor( bool& called ) : mCalled( called )
+  {
+    mCalled = false;
+  }
+
+  void operator()()
+  {
+    mCalled = true;
+  }
+
+  bool& mCalled;
+};
+
 } // namespace
 
 
@@ -429,3 +445,44 @@ int UtcDaliBuilderApplyFromJson(void)
 
   END_TEST;
 }
+
+int UtcDaliBuilderQuitSignal(void)
+{
+  ToolkitTestApplication application;
+
+  // JSON with a quit event when the actor is touched
+  std::string json(
+      "{"
+         "\"stage\":"
+         "[{"
+           "\"type\": \"Actor\","
+           "\"size\": [100,100,1],"
+           "\"parent-origin\": \"TOP_LEFT\","
+           "\"anchor-point\": \"TOP_LEFT\","
+           "\"signals\": [{"
+             "\"name\": \"touched\","
+             "\"action\": \"quit\""
+           "}]"
+         "}]"
+      "}"
+  );
+  Builder builder = Builder::New();
+  builder.LoadFromString( json );
+  builder.AddActors ( Stage::GetCurrent().GetRootLayer() );
+
+  // Connect to builder's quit signal
+  bool functorCalled( false );
+  builder.QuitSignal().Connect( &application, BuilderFunctor( functorCalled ) );
+
+  // Render and notify
+  application.SendNotification();
+  application.Render();
+
+  // Emit touch event and check that our quit method is called
+  Integration::TouchEvent touchEvent;
+  touchEvent.points.push_back( TouchPoint ( 0, TouchPoint::Down, 10.0f, 10.0f ) );
+  application.ProcessEvent( touchEvent );
+  DALI_TEST_CHECK( functorCalled );
+
+  END_TEST;
+}
index 31def0e7d18034d310a2769610adc79a1e72ae25..f6af80ebec802e67c06403fdf70ec9778f6e2d6b 100644 (file)
@@ -20,6 +20,7 @@
 
 // EXTERNAL INCLUDES
 #include <sys/stat.h>
+#include <boost/function.hpp>
 #include <sstream>
 
 // INTERNAL INCLUDES
@@ -49,8 +50,8 @@ extern bool SetPropertyFromNode( const TreeNode& node, Property::Value& value );
 extern bool SetPropertyFromNode( const TreeNode& node, Property::Value& value, const Replacement& replacements );
 extern bool SetPropertyFromNode( const TreeNode& node, Property::Type type, Property::Value& value );
 extern bool SetPropertyFromNode( const TreeNode& node, Property::Type type, Property::Value& value, const Replacement& replacements );
-extern Actor SetupSignalAction(ConnectionTracker* tracker, const TreeNode &root, const TreeNode &child, Actor actor);
-extern Actor SetupPropertyNotification(ConnectionTracker* tracker, const TreeNode &root, const TreeNode &child, Actor actor);
+extern Actor SetupSignalAction(ConnectionTracker* tracker, const TreeNode &root, const TreeNode &child, Actor actor, boost::function<void (void)> quitAction);
+extern Actor SetupPropertyNotification(ConnectionTracker* tracker, const TreeNode &root, const TreeNode &child, Actor actor, boost::function<void (void)> quitAction);
 extern Actor SetupActor( const TreeNode& node, Actor& actor, const Replacement& constant );
 
 #if defined(DEBUG_ENABLED)
@@ -208,6 +209,23 @@ void CollectAllStyles( const TreeNode& stylesCollection, const TreeNode& style,
   }
 }
 
+struct QuitAction
+{
+public:
+  QuitAction( Builder& builder )
+  : mBuilder( builder )
+  {
+  }
+
+  void operator()(void)
+  {
+    mBuilder.EmitQuitSignal();
+  }
+
+private:
+  Builder& mBuilder;
+};
+
 } // namespace anon
 
 /*
@@ -335,9 +353,9 @@ void Builder::ApplyProperties( const TreeNode& root, const TreeNode& node,
       SetupActor( node, actor, constant );
 
       // add signals
-      SetupSignalAction( mSlotDelegate.GetConnectionTracker(), root, node, actor );
-
-      SetupPropertyNotification( mSlotDelegate.GetConnectionTracker(), root, node, actor );
+      QuitAction quitAction( *this );
+      SetupSignalAction( mSlotDelegate.GetConnectionTracker(), root, node, actor, quitAction );
+      SetupPropertyNotification( mSlotDelegate.GetConnectionTracker(), root, node, actor, quitAction );
    }
   }
   else
@@ -726,6 +744,16 @@ FrameBufferImage Builder::GetFrameBufferImage( const std::string &name, const Re
   return ret;
 }
 
+Toolkit::Builder::Signal& Builder::QuitSignal()
+{
+  return mQuitSignal;
+}
+
+void Builder::EmitQuitSignal()
+{
+  mQuitSignal.Emit();
+}
+
 void Builder::AddActors( Actor toActor )
 {
   // 'stage' is the default/by convention section to add from
index d5333660e6b42e7024e90b70c372bb48400dc952..e82ed9314aec99c9176616c5f669c5c7d0f7a112 100644 (file)
@@ -178,6 +178,16 @@ public:
    */
   FrameBufferImage GetFrameBufferImage( const std::string &name, const Replacement& constant );
 
+  /**
+   * @copydoc Toolkit::Builder::QuitSignal
+   */
+  Toolkit::Builder::Signal& QuitSignal();
+
+  /**
+   * Emits the quit signal
+   */
+  void EmitQuitSignal();
+
 protected:
 
   virtual ~Builder();
@@ -225,6 +235,7 @@ private:
 
   void SetProperties( const TreeNode& node, Handle& handle, const Replacement& constant );
 
+  Toolkit::Builder::Signal mQuitSignal;
 };
 
 } // namespace Internal
index a22815e441fa7be724be8625ec4cc30adc02c07a..3124c46559580602cb01289fc2e309541629a566 100644 (file)
@@ -43,17 +43,6 @@ using namespace Dali;
 // Signal Actions
 //
 
-// Action quit; connected to signals
-// TODO: MOVE TO BUILDER TEMPLATE
-struct ActionQuit
-{
-  ActionQuit(void) {};
-
-  void operator()(void) {
-    // Dali::Application::Get().Quit();
-  };
-};
-
 // Action on child actor. The child is found by alias so can be 'previous' etc.
 struct ChildActorAction
 {
@@ -233,7 +222,7 @@ void DoNothing(void) {};
 /**
  * Get an action as boost function callback
  */
-boost::function<void (void)> GetAction(const TreeNode &root, const TreeNode &child, Actor actor)
+boost::function<void (void)> GetAction(const TreeNode &root, const TreeNode &child, Actor actor, boost::function<void (void)> quitAction)
 {
   OptionalString childActorName(IsString( IsChild(&child, "child-actor")) );
   OptionalString actorName(IsString( IsChild(&child, "actor")) );
@@ -279,7 +268,7 @@ boost::function<void (void)> GetAction(const TreeNode &root, const TreeNode &chi
   }
   else if("quit" == *actionName)
   {
-    callback = ActionQuit();
+    callback = quitAction;
   }
   else if("play" == *actionName)
   {
@@ -383,7 +372,7 @@ Actor SetupPropertyNotification(const TreeNode &child, Actor actor);
 /**
  * Setup signals and actions on an actor
  */
-Actor SetupSignalAction(ConnectionTracker* tracker, const TreeNode &root, const TreeNode &child, Actor actor)
+Actor SetupSignalAction(ConnectionTracker* tracker, const TreeNode &root, const TreeNode &child, Actor actor, boost::function<void (void)> quitAction)
 {
   DALI_ASSERT_ALWAYS(actor);
 
@@ -400,7 +389,7 @@ Actor SetupSignalAction(ConnectionTracker* tracker, const TreeNode &root, const
       OptionalString name( IsString( IsChild( key_child.second, "name")) );
       DALI_ASSERT_ALWAYS(name && "Signal must have a name");
 
-      boost::function<void (void)> callback = GetAction(root, key_child.second, actor);
+      boost::function<void (void)> callback = GetAction(root, key_child.second, actor, quitAction);
 
       actor.ConnectSignal(tracker, *name, callback);
     }
@@ -412,7 +401,7 @@ Actor SetupSignalAction(ConnectionTracker* tracker, const TreeNode &root, const
 /**
  * Setup Property notifications for an actor
  */
-Actor SetupPropertyNotification(ConnectionTracker* tracker, const TreeNode &root, const TreeNode &child, Actor actor)
+Actor SetupPropertyNotification(ConnectionTracker* tracker, const TreeNode &root, const TreeNode &child, Actor actor, boost::function<void (void)> quitAction)
 {
   DALI_ASSERT_ALWAYS(actor);
 
@@ -426,7 +415,7 @@ Actor SetupPropertyNotification(ConnectionTracker* tracker, const TreeNode &root
 
       // Actor actions reference by pointer because of circular reference actor->signal
       // So this callback should only go onto the actor maintained list.
-      boost::function<void (void)> callback = GetAction(root, key_child.second, actor);
+      boost::function<void (void)> callback = GetAction(root, key_child.second, actor, quitAction);
 
       OptionalString prop(IsString( IsChild(key_child.second, "property")) );
       DALI_ASSERT_ALWAYS(prop && "Notification signal must specify a property");
index 79173f1238a8ba16d78ecbab70dc0953166a2d79..fbf422351fdc34fdd7a13b04ac68493a7e68fd1a 100644 (file)
@@ -144,6 +144,11 @@ FrameBufferImage Builder::GetFrameBufferImage( const std::string &name )
   return GetImpl(*this).GetFrameBufferImage( name );
 }
 
+Builder::Signal& Builder::QuitSignal()
+{
+  return GetImpl( *this ).QuitSignal();
+}
+
 } // namespace Toolkit
 
 } // namespace Dali
index ddbb041f5f4eef836fba331c1e5c27e9176cf14d..b0db57e7ab21bef26cf020a2d225399c4f06e666 100644 (file)
@@ -398,6 +398,18 @@ class Builder : public BaseHandle
    */
   FrameBufferImage GetFrameBufferImage( const std::string &name );
 
+  // Signals
+
+  /**
+   * @brief Builder signal type
+   */
+  typedef SignalV2< void () > Signal;
+
+  /**
+   * @brief Signal emitted when a quit action is requested by the builder.
+   */
+  Signal& QuitSignal();
+
 private:
   Builder(Internal::Builder *impl);