void InputMap::action_add_event(const StringName& p_action,const InputEvent& p_event) { ERR_FAIL_COND(p_event.type==InputEvent::ACTION); ERR_FAIL_COND( !input_map.has(p_action) ); if (_find_event(input_map[p_action].inputs,p_event)) return; //already gots input_map[p_action].inputs.push_back(p_event); }
void InputMap::action_erase_event(const StringName& p_action,const InputEvent& p_event) { ERR_FAIL_COND( !input_map.has(p_action) ); List<InputEvent>::Element *E=_find_event(input_map[p_action].inputs,p_event); if (E) return; //already gots input_map[p_action].inputs.erase(E); }
//finds an event from a class static AWE_CLASS_EVENT *_find_event(const char *name, AWE_CLASS *pclass) { AWE_CLASS_EVENT *event; if (pclass->events) { for(event = pclass->events; event->name; event++) { if (strcmp(event->name, name) == 0) return event; } } return pclass->super ? _find_event(name, pclass->super) : 0; }
bool InputMap::event_is_action(const InputEvent& p_event, const StringName& p_action) const { Map<StringName,Action >::Element *E=input_map.find(p_action); if(!E) { ERR_EXPLAIN("Request for nonexistent InputMap action: "+String(p_action)); ERR_FAIL_COND_V(!E,false); } if (p_event.type==InputEvent::ACTION) { return p_event.action.action==E->get().id; } return _find_event(E->get().inputs,p_event)!=NULL; }
//registers an event with an object int awe_add_object_event(AWE_OBJECT *src, const char *name, AWE_OBJECT *dst, void *proc) { AWE_CLASS_EVENT *event; _AWE_SIGNAL *signal; _AWE_SLOT *slot; //find signal signal = _awe_find_signal(src, name); //if found, check if the slot already exists; if it exists, do nothing if (signal) { slot = _find_slot(signal, dst, proc); if (slot) return 1; } //if not found, install a new signal in the object (if the event exists) if (!signal) { event = _find_event(name, src->pclass); if (!event) return 0; signal = (_AWE_SIGNAL *)calloc(1, sizeof(_AWE_SIGNAL)); signal->name = event->name; awe_list_insert(&src->signals, &signal->node, 0); } //install a new slot in the src signal and in the dst object slot = (_AWE_SLOT *)calloc(1, sizeof(_AWE_SLOT)); slot->signal_node.data = slot; slot->slot_node.data = slot; slot->signal_list = &signal->slots; if (dst) slot->slot_list = &dst->slots; slot->object = dst; slot->proc = proc; awe_list_insert(&signal->slots, &slot->signal_node.node, 0); if (dst) awe_list_insert(&dst->slots, &slot->slot_node.node, 0); return 1; }
bool InputMap::action_has_event(const StringName& p_action,const InputEvent& p_event) { ERR_FAIL_COND_V( !input_map.has(p_action), false ); return (_find_event(input_map[p_action].inputs,p_event)!=NULL); }