void Menu::itemReleased(TriggeredSource source) { if (_pressed >= 0 && _pressed < _actions.size()) { auto pressed = _pressed; setPressed(-1); if (source == TriggeredSource::Mouse && _actionsData[pressed].ripple) { _actionsData[pressed].ripple->lastStop(); } if (pressed == _selected && _triggeredCallback) { _triggeredCallback(_actions[_selected], itemTop(_selected), source); } } }
void __AGE Button::update(float dt) { Entity::update(dt); Input& input = Input::instance(); if( transformationDirty ) { // make sure the text passes the z test textEntity->setZ(z()+1e-3); computeClickBoundingBox(); } // update state switch( state ) { case 0: case 1: { for( int id = 0; id < MOUSE_POINTERS; ++id ) { Eigen::Vector2f pos; input.mouseXY(pos.x(), pos.y(),id); bool inside_bb = isInside(pos, clickBoundingBoxMin, clickBoundingBoxMax); if( inside_bb ) { if( input.mouseJustPressed(0,0,id) ) { state = 2; mouse_id = id; } else { #ifdef __ANDROID__ state = 0; // no hover on touch devices #else state = 1; // hover #endif } break; } else state = 0; } } break; case 2: { Eigen::Vector2f pos; input.mouseXY(pos.x(), pos.y(),mouse_id); if( input.mouseJustReleased(0,0,mouse_id) ) { bool inside_bb = isInside(pos, clickBoundingBoxMin, clickBoundingBoxMax); if( inside_bb ) { _triggeredCallback(dt); } state = 0; } } break; } }