Esempio n. 1
0
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;
}