void LinkEvent::ReplaceLinkByLinkedEvents(gd::Project & project, EventsList & eventList, unsigned int indexOfTheEventInThisList) { //Finding what to link to. const EventsList * eventsToInclude = NULL; gd::ExternalEvents * linkedExternalEvents = NULL; if ( project.HasExternalEventsNamed(GetTarget()) ) { linkedExternalEvents = &project.GetExternalEvents(GetTarget()); eventsToInclude = &project.GetExternalEvents(GetTarget()).GetEvents(); } else if ( project.HasLayoutNamed(GetTarget()) ) eventsToInclude = &project.GetLayout(GetTarget()).GetEvents(); if ( eventsToInclude != NULL ) { unsigned int firstEvent = IncludeAllEvents() ? 0 : GetIncludeStart(); unsigned int lastEvent = IncludeAllEvents() ? eventsToInclude->size() - 1 : GetIncludeEnd(); //Check bounds if ( firstEvent >= eventsToInclude->size() ) { std::cout << "Unable to get events from a link ( Invalid start )" << std::endl; linkWasInvalid = true; return; } if ( lastEvent >= eventsToInclude->size() ) { std::cout << "Unable to get events from a link ( Invalid end )" << std::endl; linkWasInvalid = true; return; } if ( firstEvent > lastEvent ) { std::cout << "Unable to get events from a link ( End is before start )" << std::endl; linkWasInvalid = true; return; } //Insert an empty event to replace the link event ( we'll delete the link event at the end ) //( If we just erase the link event without adding a blank event to replace it, //the first event inserted by the link will not be preprocessed ( and it can be annoying if it require preprocessing, such as another link event ). ) gd::EmptyEvent emptyEvent; eventList.InsertEvent(emptyEvent, indexOfTheEventInThisList); eventList.InsertEvents(*eventsToInclude, firstEvent, lastEvent, indexOfTheEventInThisList+1); //Delete the link event ( which is now at the end of the list of events we've just inserted ) eventList.RemoveEvent(indexOfTheEventInThisList + 1 + static_cast<unsigned>(lastEvent-firstEvent)+1); } else { std::cout << "Unable to get events from a link." << std::endl; linkWasInvalid = true; //Delete the link event eventList.RemoveEvent(indexOfTheEventInThisList); return; } linkWasInvalid = false; }
void LinkEvent::ReplaceLinkByLinkedEvents(const gd::Project & project, EventsList & eventList, std::size_t indexOfTheEventInThisList) { linkWasInvalid = false; //Finding what to link to. const EventsList * eventsToInclude = GetLinkedEvents(project); if ( eventsToInclude != NULL ) { std::size_t firstEvent = includeConfig == INCLUDE_BY_INDEX ? GetIncludeStart() : 0; std::size_t lastEvent = includeConfig == INCLUDE_BY_INDEX ? GetIncludeEnd() : eventsToInclude->size() - 1; //Check bounds if ( firstEvent >= eventsToInclude->size() ) { std::cout << "Unable to get events from a link ( Invalid start )" << std::endl; linkWasInvalid = true; return; } if ( lastEvent >= eventsToInclude->size() ) { std::cout << "Unable to get events from a link ( Invalid end )" << std::endl; linkWasInvalid = true; return; } if ( firstEvent > lastEvent ) { std::cout << "Unable to get events from a link ( End is before start )" << std::endl; linkWasInvalid = true; return; } //Insert an empty event to replace the link event ( we'll delete the link event at the end ) //( If we just erase the link event without adding a blank event to replace it, //the first event inserted by the link will not be preprocessed ( and it can be annoying if it require preprocessing, such as another link event ). ) gd::EmptyEvent emptyEvent; eventList.InsertEvent(emptyEvent, indexOfTheEventInThisList); eventList.InsertEvents(*eventsToInclude, firstEvent, lastEvent, indexOfTheEventInThisList+1); //Delete the link event ( which is now at the end of the list of events we've just inserted ) eventList.RemoveEvent(indexOfTheEventInThisList + 1 + static_cast<unsigned>(lastEvent-firstEvent)+1); } else { std::cout << "Unable to get events from a link." << std::endl; linkWasInvalid = true; //Delete the link event eventList.RemoveEvent(indexOfTheEventInThisList); return; } }
void EventsList::InsertEvents(const EventsList & otherEvents, size_t begin, size_t end, size_t position) { if (begin >= otherEvents.size()) return; if (end < begin) return; if (end >= otherEvents.size()) end = otherEvents.size()-1; for (std::size_t insertPos = 0;insertPos <= (end-begin);insertPos++) { if (position != (size_t)-1 && position+insertPos < events.size()) events.insert(events.begin()+position+insertPos, CloneRememberingOriginalEvent(otherEvents.events[begin+insertPos])); else events.push_back(CloneRememberingOriginalEvent(otherEvents.events[begin+insertPos])); } }
void EventsListSerialization::SerializeEventsTo(const EventsList & list, SerializerElement & events) { events.ConsiderAsArrayOf("event"); for ( unsigned int j = 0;j < list.size();j++ ) { const gd::BaseEvent & event = list.GetEvent(j); SerializerElement & eventElem = events.AddChild("event"); eventElem.SetAttribute( "disabled", event.IsDisabled()); eventElem.SetAttribute( "folded", event.folded); eventElem.AddChild("type").SetValue(event.GetType()); event.SerializeTo(eventElem); } }
bool EngineApplication::handleEvent(const SEvent &event) { EventsList eventsList; if (!mGestureRecognizers.empty()) { irr::core::list<IGestureRecognizer*>::ConstIterator it = mGestureRecognizers.begin(); irr::core::list<IGestureRecognizer*>::ConstIterator end = mGestureRecognizers.end(); while (it != end) { Event* newGestureEvent = (*it)->handleIrrEvent(event); if (newGestureEvent) { eventsList.push_front(newGestureEvent); } ++it; } } return mSceneManager->handleEvent(event); }
void EventsListSerialization::UnserializeEventsFrom(gd::Project & project, EventsList & list, const SerializerElement & events) { events.ConsiderAsArrayOf("event", "Event"); for(unsigned int i = 0; i<events.GetChildrenCount(); ++i) { SerializerElement & eventElem = events.GetChild(i); std::string type = eventElem.GetChild("type", 0, "Type").GetValue().GetString(); gd::BaseEventSPtr event = project.CreateEvent(type); if ( event != std::shared_ptr<gd::BaseEvent>()) event->UnserializeFrom(project, eventElem); else { std::cout << "WARNING: Unknown event of type " << type << std::endl; event = std::shared_ptr<gd::BaseEvent>(new EmptyEvent); } event->SetDisabled(eventElem.GetBoolAttribute("disabled")); event->folded = eventElem.GetBoolAttribute("folded"); list.InsertEvent(event, list.GetEventsCount()); } }