Browse Source

added multi buttons TouchEvent::CLICK support

dmuratshin 9 years ago
parent
commit
53bb3f36a8

+ 29 - 14
examples/Demo/src/TestTouches.h

@@ -1,5 +1,6 @@
 #pragma once
 #include "test.h"
+#include "utils/stringUtils.h"
 
 class TestTouches: public Test
 {
@@ -35,20 +36,28 @@ public:
         tf->setY(5);
         tf->attachTo(orange);
 
-        tf = new TextField;
-        tf->setText("");
-        tf->setColor(Color::Black);
-        tf->setName("state2");
-        tf->setX(35);
-        tf->setY(5);
-        tf->attachTo(orange);
+        for (int i = 0; i < MouseButton_Num; ++i)
+        {
+            tf = new TextField;
+            tf->setText("");
+            tf->setColor(Color::Black);
+            char name[255];
+            safe_sprintf(name, "pressed %d", i);
+            tf->setName(name);
+            tf->setX(5);
+            tf->setY(15 + i * 10);
+            tf->attachTo(orange);
+        }
+
+
+
 
         tf = new TextField;
         tf->setText("");
         tf->setColor(Color::Black);
         tf->setName("local");
         tf->setX(5);
-        tf->setY(25);
+        tf->setY(50);
         tf->setMultiline(true);
         tf->setWidth(orange->getWidth());
         tf->attachTo(orange);
@@ -66,9 +75,14 @@ public:
 
     void onDownUp(Event* ev)
     {
+        TouchEvent* te = safeCast<TouchEvent*>(ev);
         spSprite s = safeSpCast<Sprite>(ev->currentTarget);
-        spTextField tf = s->getChildT<TextField>("state2");
-        tf->setText(ev->type == TouchEvent::TOUCH_DOWN ? "pressed" : "");
+
+        char name[255];
+        safe_sprintf(name, "pressed %d", (int)te->mouseButton);
+
+        spTextField tf = s->getChildT<TextField>(name);
+        tf->setText(ev->type == TouchEvent::TOUCH_DOWN ? name : "");
         updateLocalPos(ev);
     }
 
@@ -110,10 +124,10 @@ public:
         spSprite Green = createRect("Green", Color::Green, Vector2(100, 25), Vector2(100, 150));
         Green->attachTo(Orange);
 
-        spSprite Beige = createRect("Beige", Color::Beige, Vector2(150, 150), Vector2(250, 100));
+        spSprite Beige = createRect("Beige", Color::Beige, Vector2(150, 150), Vector2(260, 100));
         Beige->attachTo(Orange);
 
-        spSprite LightGreen = createRect("LightGreen", Color::LightGreen, Vector2(180, -50), Vector2(50, 200));
+        spSprite LightGreen = createRect("LightGreen", Color::LightGreen, Vector2(180, -50), Vector2(65, 200));
         LightGreen->attachTo(Beige);
 
 
@@ -174,14 +188,15 @@ public:
                      "\n"
                      "current target: %s\n"
                      "local position: %d %d\n"
+                     "button: %d\n"
                      ,
                      n,
                      eventName,
                      te->target->getName().c_str(),
                      (int)te->position.x, (int)te->position.y,
                      te->currentTarget->getName().c_str(),
-                     (int)te->localPosition.x, (int)te->localPosition.y
-
+                     (int)te->localPosition.x, (int)te->localPosition.y,
+                     (int)te->mouseButton
                     );
 
 

+ 18 - 18
oxygine/src/Actor.cpp

@@ -35,13 +35,12 @@ namespace oxygine
         _flags(flag_visible | flag_touchEnabled | flag_touchChildrenEnabled | flag_fastTransform),
         _parent(0),
         _alpha(255),
-        _pressed(0),
-        _overred(0),
         _stage(0),
         _material(0)
     {
         _transform.identity();
         _transformInvert.identity();
+        _pressedOvered = 0;
     }
 
     void Actor::copyFrom(const Actor& src, cloneOptions opt)
@@ -58,8 +57,8 @@ namespace oxygine
         _flags = src._flags;
         _parent = 0;
         _alpha = src._alpha;
-        _overred = 0;
-        _pressed = 0;
+
+        _pressedOvered = 0;
 
         _transform = src._transform;
         _transformInvert = src._transformInvert;
@@ -124,8 +123,7 @@ namespace oxygine
         _stage->removeEventListeners(this);
         _stage = 0;
 
-        _pressed = 0;
-        _overred = 0;
+        _pressedOvered = 0;
 
         spActor actor = _children._first;
         while (actor)
@@ -276,9 +274,9 @@ namespace oxygine
         return stream.str();
     }
 
-    pointer_index Actor::getPressed() const
+    pointer_index Actor::getPressed(MouseButton b) const
     {
-        return _pressed;
+        return _pressedButton[b];
     }
 
     pointer_index Actor::getOvered() const
@@ -286,10 +284,11 @@ namespace oxygine
         return _overred;
     }
 
-    void Actor::setNotPressed()
+    void Actor::setNotPressed(MouseButton b)
     {
-        _pressed = 0;
-        _getStage()->removeEventListener(TouchEvent::TOUCH_UP, CLOSURE(this, &Actor::_onGlobalTouchUpEvent));
+        _pressedButton[b] = 0;
+        if (_pressedOvered == _overred)//!_pressed[0] && !_pressed[1] && !_pressed[2])
+            _getStage()->removeEventListener(TouchEvent::TOUCH_UP, CLOSURE(this, &Actor::_onGlobalTouchUpEvent));
 
         updateStatePressed();
     }
@@ -297,10 +296,10 @@ namespace oxygine
     void Actor::_onGlobalTouchUpEvent(Event* ev)
     {
         TouchEvent* te = safeCast<TouchEvent*>(ev);
-        if (te->index != _pressed)
+        if (te->index != _pressedButton[te->mouseButton])
             return;
 
-        setNotPressed();
+        setNotPressed(te->mouseButton);
 
         TouchEvent up = *te;
         up.bubbles = false;
@@ -351,11 +350,12 @@ namespace oxygine
         if (event->type == TouchEvent::TOUCH_DOWN)
         {
             TouchEvent* te = safeCast<TouchEvent*>(event);
-            if (!_pressed)
+            if (!_pressedButton[te->mouseButton])
             {
-                _pressed = te->index;
-                _getStage()->addEventListener(TouchEvent::TOUCH_UP, CLOSURE(this, &Actor::_onGlobalTouchUpEvent));
+                if (_pressedOvered == _overred)//!_pressed[0] && !_pressed[1] && !_pressed[2])
+                    _getStage()->addEventListener(TouchEvent::TOUCH_UP, CLOSURE(this, &Actor::_onGlobalTouchUpEvent));
 
+                _pressedButton[te->mouseButton] = te->index;
                 updateStatePressed();
             }
         }
@@ -365,14 +365,14 @@ namespace oxygine
         if (event->type == TouchEvent::TOUCH_UP)
         {
             TouchEvent* te = safeCast<TouchEvent*>(event);
-            if (_pressed == te->index)
+            if (_pressedButton[te->mouseButton] == te->index)
             {
                 click = *te;
                 click.type = TouchEvent::CLICK;
                 click.bubbles = false;
                 //will be dispatched later after UP
 
-                setNotPressed();
+                setNotPressed(te->mouseButton);
             }
         }
 

+ 17 - 6
oxygine/src/Actor.h

@@ -15,7 +15,6 @@
 namespace oxygine
 {
     class Event;
-    typedef char pointer_index;
 
     typedef unsigned int dumpOptions;
 
@@ -145,7 +144,7 @@ namespace oxygine
         const spClock&      getClock() const;
         virtual RectF       getDestRect() const;
         /**returns touch id if actor is pressed down*/
-        pointer_index       getPressed() const;
+        pointer_index       getPressed(MouseButton b = MouseButton_Touch) const;
         /**returns touch id if actor is moused overred*/
         pointer_index       getOvered() const;
         bool                getTouchEnabled() const { return (_flags & flag_touchEnabled) != 0; }
@@ -325,7 +324,7 @@ namespace oxygine
         /**Returns Stage where Actor attached to. Used for multi stage (window) mode*/
         Stage*              _getStage();
 
-        void setNotPressed();
+        void setNotPressed(MouseButton b);
 
         bool internalRender(RenderState& rs, const RenderState& parentRS);
 
@@ -354,6 +353,8 @@ namespace oxygine
         static unsigned short& _getFlags(Actor* actor) { return actor->_flags; }
 
         void _onGlobalTouchUpEvent(Event*);
+        void _onGlobalTouchUpEvent1(Event*);
+        void _onGlobalTouchUpEvent2(Event*);
         void _onGlobalTouchMoveEvent(Event*);
 
         const Vector2& _getSize() const { return _size; }
@@ -403,17 +404,27 @@ namespace oxygine
 
         children _children;
 
-        pointer_index _pressed;
-        pointer_index _overred;
+        union
+        {
+            struct
+            {
+                pointer_index _pressedButton[MouseButton_Num];
+                pointer_index _overred;
+            };
+            OXYGINE_DEPRECATED
+            pointer_index _pressed;//for compatibility, deprecated
+            int32_t _pressedOvered;
+        };
+
 
     private:
-        short   _zOrder;
 
         Vector2 _pos;
         Vector2 _anchor;
         Vector2 _scale;
         Vector2 _size;
         float   _rotation;
+        short   _zOrder;
     };
 
     Vector2 convert_local2stage(spActor child, const Vector2& pos, spActor root = 0);

+ 15 - 4
oxygine/src/Button.cpp

@@ -34,15 +34,26 @@ namespace oxygine
     void Button::_mouseEvent(Event* event)
     {
         TouchEvent* me = safeCast<TouchEvent*>(event);
-
-        switch (event->type)
+        if (event->type == TouchEvent::CLICK)
         {
-            case TouchEvent::CLICK:
+            if (me->mouseButton == MouseButton_Left)
             {
                 event->phase = Event::phase_target;
                 event->target = this;
             }
-            break;
+            else
+            {
+                event->stopImmediatePropagation();
+            }
+
+            return;
+        }
+
+        if (me->mouseButton != MouseButton_Left)
+            return;
+
+        switch (event->type)
+        {
             case TouchEvent::OVER:
             {
                 if (!_btnOvered)

+ 2 - 1
oxygine/src/Input.cpp

@@ -93,8 +93,9 @@ namespace oxygine
         _multiTouch = en;
     }
 
-    PointerState* Input::getTouchByIndex(int index)
+    PointerState* Input::getTouchByIndex(pointer_index index_)
     {
+        int index = index_;
         if (index == MAX_TOUCHES + 1)
             return &_pointerMouse;
         index -= 1;

+ 2 - 2
oxygine/src/Input.h

@@ -24,8 +24,8 @@ namespace oxygine
 
         void multiTouchEnabled(bool en);
 
-        /**id should be in range [1, MAX_TOUCHES]*/
-        PointerState* getTouchByIndex(int index);
+        /**index should be in range [1, MAX_TOUCHES]*/
+        PointerState* getTouchByIndex(pointer_index index);
 
 #ifndef __S3E__
         int touchID2index(int64 id);

+ 4 - 3
oxygine/src/PointerState.cpp

@@ -2,14 +2,15 @@
 #include "Actor.h"
 namespace oxygine
 {
-    PointerState::PointerState(): _index(0)
+    PointerState::PointerState(): _index(1)
     {
         init(_index);
     }
 
-    void PointerState::init(int pointerIndex)
+    void PointerState::init(pointer_index index)
     {
-        _index = pointerIndex;
+        OX_ASSERT(index > 0 && index < 16);
+        _index = index;
         _pressed = 0;
         _position.setZero();
     }

+ 7 - 5
oxygine/src/PointerState.h

@@ -13,7 +13,9 @@ namespace oxygine
         MouseButton_Touch = 0,
         MouseButton_Left = 0,
         MouseButton_Middle = 1,
-        MouseButton_Right = 2
+        MouseButton_Right = 2,
+        MouseButton_Num = 3
+
     };
 
     class PointerState
@@ -21,17 +23,17 @@ namespace oxygine
     public:
         PointerState();
 
-        void init(int pointerIndex);
+        void init(pointer_index pointerIndex);
 
         bool            isPressed(MouseButton mb = MouseButton_Touch) const;
-        int             getIndex() const {return _index;}
+        pointer_index   getIndex() const {return _index;}
         const Vector2&  getPosition() const {return _position;}
 
     private:
         friend class Input;
 
-        int _index;
-        int _pressed;
         Vector2 _position;
+        int _pressed;
+        pointer_index _index;
     };
 }

+ 2 - 1
oxygine/src/SlidingActor.cpp

@@ -325,7 +325,8 @@ namespace oxygine
                         spActor act = safeSpCast<Actor>(_holded);
                         while (act && act.get() != _content.get())
                         {
-                            act->setNotPressed();
+                            for (int i = 0; i < MouseButton_Num; ++i)
+                                act->setNotPressed((MouseButton)i);
                             act = act->getParent();
                         }
 

+ 0 - 1
oxygine/src/TouchEvent.h

@@ -3,7 +3,6 @@
 #undef OUT
 namespace oxygine
 {
-    typedef char pointer_index;
     class PointerState;
 
     class TouchEvent : public Event

+ 1 - 0
oxygine/src/oxygine_include.h

@@ -167,6 +167,7 @@ namespace oxygine
     void handleErrorPolicy(error_policy ep, const char* format, ...);
 
     typedef int timeMS;
+    typedef unsigned char pointer_index;
 
     /** returns local app time in milliseconds (1sec = 1000ms). Counting starts from zero*/
     timeMS          getTimeMS();

+ 4 - 4
oxygine/src/res/CreateResourceContext.cpp

@@ -66,9 +66,9 @@ namespace oxygine
         //_alphaTracking = true;
     }
 
-    const char * isRelative(const char *str)
+    const char* isRelative(const char* str)
     {
-        const char *str_ = str;
+        const char* str_ = str;
         if (*str == '.')
         {
             ++str;
@@ -83,7 +83,7 @@ namespace oxygine
     {
         std::string s;
 
-        const char *rl = isRelative(str);
+        const char* rl = isRelative(str);
         if (rl)
         {
             s = currentPath;
@@ -97,7 +97,7 @@ namespace oxygine
     std::string XmlWalker::getPath(const char* attrName) const
     {
         const char* str = _root.attribute(attrName).as_string();
-        const char *rl = isRelative(str);
+        const char* rl = isRelative(str);
         if (rl)
         {
             return *_xmlFolder + rl;