Browse Source

Merge remote-tracking branch 'origin/master' into ox-move

dmuratshin 8 years ago
parent
commit
dbaf81547a
3 changed files with 37 additions and 4 deletions
  1. 15 1
      src/flow/Scene.cpp
  2. 6 0
      src/flow/Scene.h
  3. 16 3
      src/flow/flow.cpp

+ 15 - 1
src/flow/Scene.cpp

@@ -46,7 +46,7 @@ namespace oxygine
         extern bool _wasTouchBlocked;
         extern spTransition _defaultTransition;
 
-        Scene::Scene(): _done(false), _remove(false), _dialog(false), _instack(false), _instackWide(false), _visible(false), _visibleWide(false), _allowDialogsOnTop(true)
+        Scene::Scene(): _done(false), _remove(false), _dialog(false), _instack(false), _instackWide(false), _visible(false), _visibleWide(false), _allowDialogsOnTop(true), _passBlockedTouch(true)
         {
             setName("Scene");
             _holder = new Actor;
@@ -240,12 +240,26 @@ namespace oxygine
                 if (ev)
                     static_cast<Event&>(_finishEvent) = *ev;
                 else
+                {
                     _finishEvent = FlowEvent();
+                    _finishEvent.target = _finishEvent.currentTarget = getStage();
+                }
             }
 
             //Flow::instance.checkDone();
         }
 
+        void Scene::finishNoResult()
+        {
+            _done = true;
+            _resultCB = EventCallback();
+        }
+
+        void Scene::noResult()
+        {
+            _resultCB = EventCallback();
+        }
+
         void Scene::remove()
         {
             LOGD("%-20s '%s'", "remove", getName().c_str());

+ 6 - 0
src/flow/Scene.h

@@ -81,6 +81,8 @@ namespace oxygine
 
             /*closes current scene**/
             void finish(Event* ev = 0);
+            void finishNoResult();
+            void noResult();
 
             /**
             Automatically removes Scene from stack (flow).
@@ -109,6 +111,7 @@ namespace oxygine
             void setTransitionIn(spTransition t);
             void setTransitionOut(spTransition t);
             void setTransition(spTransition tin, spTransition tout);
+            void setAllowDialogsOnTop(bool allow) { _allowDialogsOnTop = allow; }
             void removeTransitions() { _transitionIn = _transitionOut = 0; }
 
             spActor         getHolder() const { return _holder; }
@@ -117,6 +120,8 @@ namespace oxygine
             bool            isInStackWide() const { return _instackWide; }
             bool            isVisibleWide() const { return _visibleWide; }
 
+            void setPassBlockedTouch(bool v) { _passBlockedTouch = v; }
+
         protected:
 
             friend class Flow;
@@ -128,6 +133,7 @@ namespace oxygine
             /**dialog mode*/
             bool _dialog;
             bool _allowDialogsOnTop;
+            bool _passBlockedTouch;
 
 
             spTransition runTransition(Flow*, spScene current, bool back);

+ 16 - 3
src/flow/flow.cpp

@@ -115,6 +115,7 @@ namespace oxygine
             TouchEvent* event = safeCast<TouchEvent*>(ev);
             _blockedTouchPosition = event->getPointer()->getPosition();
             _wasTouchBlocked = true;
+            _wasBackBlocked = false;
         }
 
         bool Flow::hasSceneInStack(spScene scene) const
@@ -130,6 +131,12 @@ namespace oxygine
             {
                 scenes.erase(it);
             }
+
+            it = std::find(scenes2show.begin(), scenes2show.end(), scene);
+            if (it != scenes2show.end())
+            {
+                scenes2show.erase(it);
+            }
         }
 
         void Flow::phaseBegin(spScene current, spScene next, bool back)
@@ -244,9 +251,12 @@ namespace oxygine
             {
                 if (scenes2show.empty())
                 {
-                    LOGD("send  blocked touch");
-                    TouchEvent click(TouchEvent::CLICK, true, _blockedTouchPosition);
-                    getStage()->handleEvent(&click);
+                    if (current->_passBlockedTouch)
+                    {
+                        LOGD("send  blocked touch");
+                        TouchEvent click(TouchEvent::CLICK, true, _blockedTouchPosition);
+                        getStage()->handleEvent(&click);
+                    }                    
                 }
                 _wasTouchBlocked = false;
             }
@@ -345,6 +355,7 @@ namespace oxygine
             if (quit && !quitLast)
             {
                 _wasBackBlocked = true;
+                _wasTouchBlocked = false;
             }
             quitLast = quit;
 
@@ -372,6 +383,8 @@ namespace oxygine
                 {
                     _wasBackBlocked = false;
 
+                    LOGD("send  blocked BACK");
+
                     Event ev(Scene::EVENT_BACK);
                     current->dispatchEvent(&ev);
                     checkDone();