void undo() const override { auto& scenar = m_scenarioPath.find(); auto& globalTn = scenar.timeNode(m_destinationTnId); Deserializer<DataStream> s{m_serializedTimeNode}; auto recreatedTn = new TimeNodeModel{s, &scenar}; auto events_in_timenode = recreatedTn->events(); // we remove and re-add events in recreated Tn // to ensure correct parentship between elements. for(auto evId : events_in_timenode) { recreatedTn->removeEvent(evId); globalTn.removeEvent(evId); } for(auto evId : events_in_timenode) { recreatedTn->addEvent(evId); } scenar.timeNodes.add(recreatedTn); globalTn.trigger()->setExpression(m_targetTrigger); globalTn.trigger()->setActive(m_targetTriggerActive); m_moveCommand->undo(); updateTimeNodeExtent(m_destinationTnId, scenar); }
void updateEventExtent(const Id<EventModel> &id, Scenario::ScenarioModel& s) { auto& ev = s.event(id); double min = std::numeric_limits<double>::max(); double max = std::numeric_limits<double>::lowest(); for(const auto& state_id : ev.states()) { const auto& st = s.states.at(state_id); if(st.heightPercentage() < min) min = st.heightPercentage(); if(st.heightPercentage() > max) max = st.heightPercentage(); } ev.setExtent({min, max}); updateTimeNodeExtent(ev.timeNode(), s); }
void redo() const override { m_moveCommand->redo(); auto& scenar = m_scenarioPath.find(); auto& movingTn = scenar.timeNode(m_movingTnId); auto& destinationTn = scenar.timeNode(m_destinationTnId); auto movingEvents = movingTn.events(); for(auto& evId : movingEvents) { movingTn.removeEvent(evId); destinationTn.addEvent(evId); } destinationTn.trigger()->setActive(destinationTn.trigger()->active() || movingTn.trigger()->active()); destinationTn.trigger()->setExpression(movingTn.trigger()->expression()); scenar.timeNodes.remove(m_movingTnId); updateTimeNodeExtent(m_destinationTnId, scenar); }