Browse Source

Fixes some buggy tab and arrow key behaviour.

Adam Blake 12 years ago
parent
commit
ef37bce223
2 changed files with 46 additions and 47 deletions
  1. 42 43
      gameplay/src/Container.cpp
  2. 4 4
      gameplay/src/Slider.cpp

+ 42 - 43
gameplay/src/Container.cpp

@@ -635,6 +635,8 @@ bool Container::keyEvent(Keyboard::KeyEvent evt, int key)
     // need to keep it alive until the method returns.
     addRef();
 
+    bool eventConsumed = false;
+
     std::vector<Control*>::const_iterator it;
     for (it = _controls.begin(); it < _controls.end(); it++)
     {
@@ -647,59 +649,47 @@ bool Container::keyEvent(Keyboard::KeyEvent evt, int key)
 
         if ((control->hasFocus() || control->getState() == ACTIVE) && control->keyEvent(evt, key))
         {
-            release();
-            return true;
+            eventConsumed |= true;
+            break;
         }
     }
 
-    // If we made it this far, no control handled the event.
     switch (evt)
     {
         case Keyboard::KEY_PRESS:
         {
-            switch (key)
+            if (!eventConsumed)
             {
-            case Keyboard::KEY_TAB:
-                _focusPressed |= NEXT;
-                if (moveFocus(NEXT))
+                switch (key)
                 {
-                    release();
-                    return true;
-                }
-                break;
-            case Keyboard::KEY_UP_ARROW:
-                _focusPressed |= UP;
-                if (moveFocus(UP))
-                {
-                    release();
-                    return true;
-                }
-                break;
-            case Keyboard::KEY_DOWN_ARROW:
-                _focusPressed |= DOWN;
-                if (moveFocus(DOWN))
-                {
-                    release();
-                    return true;
-                }
-                break;
-            case Keyboard::KEY_LEFT_ARROW:
-                _focusPressed |= LEFT;
-                if (moveFocus(LEFT))
-                {
-                    release();
-                    return true;
-                }
-                break;
-            case Keyboard::KEY_RIGHT_ARROW:
-                _focusPressed |= RIGHT;
-                if (moveFocus(RIGHT))
-                {
-                    release();
-                    return true;
+                case Keyboard::KEY_TAB:
+                    _focusPressed |= NEXT;
+                    if (moveFocus(NEXT))
+                        eventConsumed |= true;
+                    break;
+                case Keyboard::KEY_UP_ARROW:
+                    _focusPressed |= UP;
+                    if (moveFocus(UP))
+                        eventConsumed |= true;
+                    break;
+                case Keyboard::KEY_DOWN_ARROW:
+                    _focusPressed |= DOWN;
+                    if (moveFocus(DOWN))
+                        eventConsumed |= true;
+                    break;
+                case Keyboard::KEY_LEFT_ARROW:
+                    _focusPressed |= LEFT;
+                    if (moveFocus(LEFT))
+                        eventConsumed |= true;
+                    break;
+                case Keyboard::KEY_RIGHT_ARROW:
+                    _focusPressed |= RIGHT;
+                    if (moveFocus(RIGHT))
+                        eventConsumed |= true;
+                    break;
                 }
-                break;
             }
+            break;
         }
         case Keyboard::KEY_RELEASE:
         {
@@ -707,25 +697,31 @@ bool Container::keyEvent(Keyboard::KeyEvent evt, int key)
             {
             case Keyboard::KEY_TAB:
                 _focusPressed &= ~NEXT;
+                eventConsumed |= true;
                 break;
             case Keyboard::KEY_UP_ARROW:
                 _focusPressed &= ~UP;
+                eventConsumed |= true;
                 break;
             case Keyboard::KEY_DOWN_ARROW:
                 _focusPressed &= ~DOWN;
+                eventConsumed |= true;
                 break;
             case Keyboard::KEY_LEFT_ARROW:
                 _focusPressed &= ~LEFT;
+                eventConsumed |= true;
                 break;
             case Keyboard::KEY_RIGHT_ARROW:
                 _focusPressed &= ~RIGHT;
+                eventConsumed |= true;
                 break;
             }
+            break;
         }
     }
 
     release();
-    return false;
+    return eventConsumed;
 }
 
 void Container::guaranteeFocus(Control* inFocus)
@@ -856,6 +852,7 @@ bool Container::moveFocus(Direction direction, Control* outsideControl)
             {
                 setState(NORMAL);
                 _focusChangeRepeat = false;
+                _focusPressed = 0;
                 return true;
             }
             
@@ -890,6 +887,7 @@ bool Container::moveFocus(Direction direction, Control* outsideControl)
                 {
                     setState(NORMAL);
                     _focusChangeRepeat = false;
+                    _focusPressed = 0;
                     return true;
                 }
 
@@ -928,6 +926,7 @@ bool Container::moveFocus(Direction direction, Control* outsideControl)
                 ((Container*)next)->moveFocus(direction, start))
             {
                 _focusChangeRepeat = false;
+                _focusPressed = 0;
                 return true;
             }
         }

+ 4 - 4
gameplay/src/Slider.cpp

@@ -392,14 +392,14 @@ bool Slider::keyEvent(Keyboard::KeyEvent evt, int key)
                 _directionButtonDown = true;
                 _dirty = true;
                 _gamepadValue = _value;
-                return _consumeInputEvents;
+                return true;
 
             case Keyboard::KEY_RIGHT_ARROW:
                 _delta = 1.0f;
                 _directionButtonDown = true;
                 _dirty = true;
                 _gamepadValue = _value;
-                return _consumeInputEvents;
+                return true;
             }
             break;
 
@@ -412,7 +412,7 @@ bool Slider::keyEvent(Keyboard::KeyEvent evt, int key)
                     _directionButtonDown = false;
                     _dirty = true;
                     _delta = 0.0f;
-                    return _consumeInputEvents;
+                    return true;
                 }
                 break;
 
@@ -422,7 +422,7 @@ bool Slider::keyEvent(Keyboard::KeyEvent evt, int key)
                     _directionButtonDown = false;
                     _dirty = true;
                     _delta = 0.0f;
-                    return _consumeInputEvents;
+                    return true;
                 }
                 break;
             }