/** * @RDE_HEADER@ * ActiveExercises * $Id$ * $HeadURL$ * $Author$ * Created by Christian Fröbel, NLE, 2019-08-01 */ #include "active_exercises.h" #include #include #include #include namespace { bool isActive(ExerciseManagement::ExerciseState state) { return (state == ExerciseManagement::ExerciseState::Started || state == ExerciseManagement::ExerciseState::Paused); } } // anonymous namespace namespace CombatNetRadio { ActiveExercises::ActiveExercises(ExerciseManagement::Interface::Dtc *exmDtc) : m_exmDtc(exmDtc) { Q_ASSERT(exmDtc); connect(m_exmDtc, &ExerciseManagement::Interface::Dtc::exerciseChanged, this, &ActiveExercises::onExerciseChanged); // Make sure that the topic is enabled *after* construction. Q_ASSERT(!m_exmDtc->isExerciseEnabled()); } void ActiveExercises::onExerciseChanged(const ExerciseManagement::Exercise &exercise, DataModification modType) { switch (modType) { case DataModification::eAdded: Q_FALLTHROUGH(); case DataModification::eModified: check(exercise); break; case DataModification::eRemoved: tryDeactivate(exercise.id()); break; } } void ActiveExercises::check(const ExerciseManagement::Exercise &exercise) { Q_ASSERT(exercise.id() > 0); if (isActive(exercise.state())) tryActivate(exercise.id()); else tryDeactivate(exercise.id()); } void ActiveExercises::tryActivate(int exerciseId) { Q_ASSERT(exerciseId > 0); auto found = m_activeExercises.find(exerciseId); if (found != m_activeExercises.end()) return; m_activeExercises.insert(exerciseId); emit activated(exerciseId); } void ActiveExercises::tryDeactivate(int exerciseId) { Q_ASSERT(exerciseId > 0); auto found = m_activeExercises.find(exerciseId); if (found == m_activeExercises.end()) return; m_activeExercises.erase(found); emit deactivated(exerciseId); } } // namespace CombatNetRadio