void GuiSystem::handleInput(InputEvent &ev) { if (ev.isConsumed()) return; switch (ev.type) { case InputEvent::EV_KEY_DOWN: if (pFocusedElement_) { pFocusedElement_->keyDown(ev.key); ev.consume(); } break; case InputEvent::EV_KEY_UP: if (pFocusedElement_) { pFocusedElement_->keyUp(ev.key); ev.consume(); } break; case InputEvent::EV_KEY_CHAR: if (pFocusedElement_) { pFocusedElement_->keyChar(ev.ch); ev.consume(); } break; case InputEvent::EV_MOUSE_DOWN: if (pCaptured) { pCaptured->mouseDown((MouseButtons)ev.mouseButton); ev.consume(); } else { if (lastUnderMouse) { lastUnderMouse->mouseDown((MouseButtons)ev.mouseButton); int lastZ = 1; if (pFocusedElement_ != lastUnderMouse) { if (pFocusedElement_) { pFocusedElement_->focusLost(); lastZ += pFocusedElement_->getZValue(); } pFocusedElement_ = lastUnderMouse; pFocusedElement_->focusGot(); pFocusedElement_->setZValue(lastZ+1); normalizeZValuesAndSort(pFocusedElement_); } ev.consume(); } } break; case InputEvent::EV_MOUSE_UP: if (pCaptured) { pCaptured->mouseUp((MouseButtons)ev.mouseButton); ev.consume(); } else { if (lastUnderMouse) { lastUnderMouse->mouseUp((MouseButtons)ev.mouseButton); ev.consume(); } } break; case InputEvent::EV_MOUSE_MOVED: if (pCaptured) { pCaptured->mouseMoved(glm::vec2(ev.dx, ev.dy), glm::vec2(ev.x, ev.y)); ev.consume(); } else { IGuiElement *crt = getElementUnderMouse(ev.x, ev.y); if (crt != lastUnderMouse) { if (lastUnderMouse) lastUnderMouse->mouseLeave(); lastUnderMouse = crt; if (lastUnderMouse) { lastUnderMouse->mouseEnter(); } } if (lastUnderMouse) lastUnderMouse->mouseMoved(glm::vec2(ev.dx, ev.dy), glm::vec2(ev.x, ev.y)); } break; case InputEvent::EV_MOUSE_SCROLL: if (pCaptured) { pCaptured->mouseScroll(ev.dz); ev.consume(); } else { if (lastUnderMouse) { lastUnderMouse->mouseScroll(ev.dz); ev.consume(); } } break; default: LOGLN("unknown event type: " << ev.type); } }