Example #1
0
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);
	}
}