From: Adeel Kazmi Date: Mon, 8 Sep 2014 16:13:55 +0000 (+0100) Subject: (Builder) Added Quit Signal X-Git-Tag: dali_1.0.8~3^2 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=fc6a26b5914e2a4db7bc2b0eded44e77c0347a4d;hp=fa5750df279183e1fdf8821e3fe0c9302c6421a3 (Builder) Added Quit Signal 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 --- diff --git a/automated-tests/src/dali-toolkit-unmanaged/utc-Dali-Builder.cpp b/automated-tests/src/dali-toolkit-unmanaged/utc-Dali-Builder.cpp index 833a40e..f95bbe7 100644 --- a/automated-tests/src/dali-toolkit-unmanaged/utc-Dali-Builder.cpp +++ b/automated-tests/src/dali-toolkit-unmanaged/utc-Dali-Builder.cpp @@ -19,6 +19,7 @@ #include #include #include +#include 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; +} diff --git a/base/dali-toolkit/internal/builder/builder-impl.cpp b/base/dali-toolkit/internal/builder/builder-impl.cpp index 31def0e..f6af80e 100644 --- a/base/dali-toolkit/internal/builder/builder-impl.cpp +++ b/base/dali-toolkit/internal/builder/builder-impl.cpp @@ -20,6 +20,7 @@ // EXTERNAL INCLUDES #include +#include #include // 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 quitAction); +extern Actor SetupPropertyNotification(ConnectionTracker* tracker, const TreeNode &root, const TreeNode &child, Actor actor, boost::function 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 diff --git a/base/dali-toolkit/internal/builder/builder-impl.h b/base/dali-toolkit/internal/builder/builder-impl.h index d533366..e82ed93 100644 --- a/base/dali-toolkit/internal/builder/builder-impl.h +++ b/base/dali-toolkit/internal/builder/builder-impl.h @@ -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 diff --git a/base/dali-toolkit/internal/builder/builder-signals.cpp b/base/dali-toolkit/internal/builder/builder-signals.cpp index a22815e..3124c46 100644 --- a/base/dali-toolkit/internal/builder/builder-signals.cpp +++ b/base/dali-toolkit/internal/builder/builder-signals.cpp @@ -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 GetAction(const TreeNode &root, const TreeNode &child, Actor actor) +boost::function GetAction(const TreeNode &root, const TreeNode &child, Actor actor, boost::function quitAction) { OptionalString childActorName(IsString( IsChild(&child, "child-actor")) ); OptionalString actorName(IsString( IsChild(&child, "actor")) ); @@ -279,7 +268,7 @@ boost::function 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 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 callback = GetAction(root, key_child.second, actor); + boost::function 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 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 callback = GetAction(root, key_child.second, actor); + boost::function 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"); diff --git a/base/dali-toolkit/public-api/builder/builder.cpp b/base/dali-toolkit/public-api/builder/builder.cpp index 79173f1..fbf4223 100644 --- a/base/dali-toolkit/public-api/builder/builder.cpp +++ b/base/dali-toolkit/public-api/builder/builder.cpp @@ -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 diff --git a/base/dali-toolkit/public-api/builder/builder.h b/base/dali-toolkit/public-api/builder/builder.h index ddbb041..b0db57e 100644 --- a/base/dali-toolkit/public-api/builder/builder.h +++ b/base/dali-toolkit/public-api/builder/builder.h @@ -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);