Add class for postponed function calling 60/169160/9
authorLukasz Wlazly <l.wlazly@partner.samsung.com>
Fri, 2 Feb 2018 14:04:48 +0000 (15:04 +0100)
committerLukasz Wlazly <l.wlazly@partner.samsung.com>
Mon, 5 Feb 2018 14:53:01 +0000 (15:53 +0100)
Change-Id: Ia1165f55ed1d48908bfa70f192a7e9fb35883db5

src/GestureActivity.cpp
src/ecore.cpp
src/ecore.hpp

index e5cf1a8..47916f4 100644 (file)
@@ -61,9 +61,24 @@ public:
                return DerivedType::requiredArguments;
        }
 
+       void process(DoneCallback doneCb) override
+       {
+               invoker.addToMainLoopQueue([this, doneCb{std::move(doneCb)}]() {
+                       auto res = this->processImpl(std::move(doneCb));
+                       markAsCompleted();
+
+                       if (res)
+                               doneCb.callAfterTimeElapsed(sideEffectDelays::eModGesture);
+                       else
+                               ERROR("%s", res.getError().message.c_str());
+               });
+       }
+
 protected:
+       virtual DBus::ValueOrError<void> processImpl(DoneCallback doneCb) = 0;
+
        std::vector<std::shared_ptr<UIElement>> uiElements;
-       ecore::Timer timer;
+       ecore::AsyncInvoker invoker;
 };
 
 template <typename DerivedType>
@@ -72,23 +87,13 @@ class TouchDispatcher : public GestureDispatcher<DerivedType>
 public:
        using GestureDispatcher<DerivedType>::uiElements;
        using GestureDispatcher<DerivedType>::markAsCompleted;
-       using GestureDispatcher<DerivedType>::timer;
        static constexpr unsigned int requiredArguments = 1;
 
-       void process(DoneCallback doneCb) override
+       DBus::ValueOrError<void> processImpl(DoneCallback doneCb) override
        {
-               timer.reset(NO_DELAY, [this, doneCb = std::move(doneCb)]() {
-                       ASSERT(uiElements.size() == requiredArguments);
-                       auto coord = uiElements.front()->getScanningCoordinates();
-                       auto res = utils::EventGenerator::generateTapGesture(coord.x, coord.y, DerivedType::hold_time);
-                       if (res) {
-                               doneCb.callAfterTimeElapsed(sideEffectDelays::eModGesture);
-                       } else {
-                               ERROR("%s", res.getError().message.c_str());
-                       }
-                       markAsCompleted();
-                       return ecore::TimerRepetitionPolicy::cancel;
-               });
+               ASSERT(uiElements.size() == requiredArguments);
+               auto coord = uiElements.front()->getScanningCoordinates();
+               return utils::EventGenerator::generateTapGesture(coord.x, coord.y, DerivedType::hold_time);
        }
 };
 
@@ -112,27 +117,16 @@ class SwipeDispatcher : public GestureDispatcher<DerivedType>
 public:
        using GestureDispatcher<DerivedType>::uiElements;
        using GestureDispatcher<DerivedType>::markAsCompleted;
-       using GestureDispatcher<DerivedType>::timer;
        static constexpr int requiredArguments = 1;
 
-       void process(DoneCallback doneCb) override
+       DBus::ValueOrError<void> processImpl(DoneCallback doneCb) override
        {
-               timer.reset(NO_DELAY, [this, doneCb = std::move(doneCb)]() {
-                       ASSERT(uiElements.size() == requiredArguments);
+               ASSERT(uiElements.size() == requiredArguments);
 
-                       auto from = getStartPoint();
-                       auto to = getEndPoint();
+               auto from = getStartPoint();
+               auto to = getEndPoint();
 
-                       auto res = utils::EventGenerator::generateDragGesture(from.x, from.y, to.x, to.y, DEFAULT_STEPS_NUMBER, NO_DELAY);
-                       if (res) {
-                               doneCb.callAfterTimeElapsed(sideEffectDelays::eModGesture);
-                       } else {
-                               ERROR("%s", res.getError().message.c_str());
-                       }
-
-                       markAsCompleted();
-                       return ecore::TimerRepetitionPolicy::cancel;
-               });
+               return utils::EventGenerator::generateDragGesture(from.x, from.y, to.x, to.y, DEFAULT_STEPS_NUMBER, NO_DELAY);
        }
 
 protected:
@@ -240,27 +234,16 @@ class DragDispatcher : public GestureDispatcher<DerivedType>
 public:
        using GestureDispatcher<DerivedType>::uiElements;
        using GestureDispatcher<DerivedType>::markAsCompleted;
-       using GestureDispatcher<DerivedType>::timer;
        static constexpr int requiredArguments = 2;
 
-       void process(DoneCallback doneCb) override
+       DBus::ValueOrError<void> processImpl(DoneCallback doneCb) override
        {
-               timer.reset(NO_DELAY, [this, doneCb = std::move(doneCb)]() {
-                       ASSERT(uiElements.size() == requiredArguments);
-
-                       auto from = uiElements.front()->getScanningCoordinates();
-                       auto to = uiElements.back()->getScanningCoordinates();
+               ASSERT(uiElements.size() == requiredArguments);
 
-                       auto res = utils::EventGenerator::generateDragGesture(from.x, from.y, to.x, to.y, DerivedType::steps, DerivedType::hold_time);
-                       if (res) {
-                               doneCb.callAfterTimeElapsed(sideEffectDelays::eModGesture);
-                       } else {
-                               ERROR("%s", res.getError().message.c_str());
-                       }
+               auto from = uiElements.front()->getScanningCoordinates();
+               auto to = uiElements.back()->getScanningCoordinates();
 
-                       markAsCompleted();
-                       return ecore::TimerRepetitionPolicy::cancel;
-               });
+               return utils::EventGenerator::generateDragGesture(from.x, from.y, to.x, to.y, DerivedType::steps, DerivedType::hold_time);
        }
 };
 
@@ -286,25 +269,14 @@ class PinchDispatcher : public GestureDispatcher<DerivedType>
 public:
        using GestureDispatcher<DerivedType>::uiElements;
        using GestureDispatcher<DerivedType>::markAsCompleted;
-       using GestureDispatcher<DerivedType>::timer;
        static constexpr int requiredArguments = 1;
 
-       void process(DoneCallback doneCb) override
+       DBus::ValueOrError<void> processImpl(DoneCallback doneCb) override
        {
-               timer.reset(NO_DELAY, [this, doneCb = std::move(doneCb)]() {
-                       ASSERT(GestureDispatcher<DerivedType>::uiElements.size() == requiredArguments);
-                       auto coord = GestureDispatcher<DerivedType>::uiElements.front()->getScanningCoordinates();
-
-                       auto res = utils::EventGenerator::generatePinchGesture(coord.x, coord.y, DerivedType::radius_change, DEFAULT_STEPS_NUMBER);
-                       if (res) {
-                               doneCb.callAfterTimeElapsed(sideEffectDelays::eModGesture);
-                       } else {
-                               ERROR("%s", res.getError().message.c_str());
-                       }
+               ASSERT(GestureDispatcher<DerivedType>::uiElements.size() == requiredArguments);
+               auto coord = GestureDispatcher<DerivedType>::uiElements.front()->getScanningCoordinates();
 
-                       markAsCompleted();
-                       return ecore::TimerRepetitionPolicy::cancel;
-               });
+               return utils::EventGenerator::generatePinchGesture(coord.x, coord.y, DerivedType::radius_change, DEFAULT_STEPS_NUMBER);
        }
 };
 
index bf8b85e..862e480 100644 (file)
@@ -89,4 +89,17 @@ namespace ecore
                auto t = static_cast<Timer *>(data);
                return t->onCallback();
        }
+
+       AsyncInvoker::~AsyncInvoker()
+       {
+               timer.reset();
+       }
+
+       void AsyncInvoker::addToMainLoopQueue(std::function<void(void)> f)
+       {
+               timer.reset(NO_DELAY, [ f{std::move(f)} ]() {
+                       f();
+                       return TimerRepetitionPolicy::cancel;
+               });
+       }
 }
index d749fca..c2e33a7 100644 (file)
@@ -95,6 +95,25 @@ namespace ecore
                Ecore_Event_Handler *eventHandler;
                std::function<bool(EventType *)> method;
        };
+
+
+       /*
+        * AsyncInvoker enables postponing of method call to next ecore main loop iteration.
+        * This is generic solution for cases when function shouldn't be invoked now
+        * but when all events with higher priority were consumed by main loop.
+        */
+       class AsyncInvoker
+       {
+       public:
+               AsyncInvoker() = default;
+               ~AsyncInvoker();
+
+               void addToMainLoopQueue(std::function<void(void)> f);
+
+       private:
+               Timer timer;
+               static constexpr double NO_DELAY = 0.0;
+       };
 }
 
 template <typename EventType>