/** * @RDE_HEADER@ * Exercise * $Id$ * $HeadURL$ * $Author$ * Created by Christian Fröbel, SLSE, 2017-11-30 */ #pragma once #include "exercise_context.h" #include "avm_export.h" #include "asset.h" #include "mounting_point.h" #include #include #include #include #include namespace AudioVideoManagement { class Asset; class MountingPoint; /** * @author Christian Fröbel */ class AVM_COMMON_EXPORT Exercise : public QObject { Q_OBJECT public: explicit Exercise(const ExerciseContext &context) : m_context(context) {} const ExerciseContext &context() const { return m_context; } /** * Move the *mounted* Asset and MountingPoint from this Exercise * to the targetExercise. * Emits assetUnassigned() for this Exercise and assetAssigned() for targetExercise. * If modifiedData is set, the asset will be updated with that data. * The update will be applied between both signals. */ void moveMountedTo(Asset *asset, Exercise *targetExercise, const boost::optional &modifiedData); void add(std::unique_ptr &&asset); void add(std::unique_ptr &&mountingPoint); std::unique_ptr take(Asset *asset); std::unique_ptr take(MountingPoint *mountingPoint); /** @return nullptr if not found */ Asset *findAsset(int id); std::vector assets() const; /** @return nullptr if not found */ MountingPoint *findMountingPoint(int id); bool isEmpty() const { return m_assets.empty() && m_mountingPoints.empty(); } signals: void assetAssigned(Asset *asset); void assetUnassigned(Asset *asset); private: ExerciseContext m_context; std::map> m_assets; std::map> m_mountingPoints; }; } // namespace AudioVideoManagement