bool UserInterface::click(const glm::vec2 &pnt, ClickType clickType) { logger.trace("Process click: %f %f", pnt.x, pnt.y); // trace mouse click mouseIsDown = (clickType == CLICK_DOWN); UIElement *clikedElem = findElem(pnt); //process hooking if (mouseIsDown) { hookedElement = clikedElem; if (focusedElement != nullptr) { focusedElement->executeLostFocus(); } focusedElement = clikedElem; if (focusedElement != nullptr) focusedElement->executeFocused(); } else { hookedElement = nullptr; } //nothing if (clikedElem == nullptr) { if (mouseDownElement != nullptr) mouseDownElement->executePushOffAnimation(); mouseDownElement = nullptr; return false; } //instant action if (clickType == CLICK_DOWN && clikedElem->isInstantAction()) { mouseDownElement = nullptr; clikedElem->executeAction(); return true; } // deffered action if (clickType == CLICK_DOWN) { mouseDownElement = clikedElem; clikedElem->executePushOnAnimation(); } else if (clickType == CLICK_UP) { if (mouseDownElement != nullptr) clikedElem->executePushOffAnimation(); if (mouseDownElement == clikedElem) { mouseDownElement = nullptr; if (!clikedElem->isInstantAction()) { clikedElem->executeAction(); } } } return true; }