X-Git-Url: http://git.tdb.fi/?p=libs%2Fdemoscene.git;a=blobdiff_plain;f=source%2Fsequencer.h;h=f8137177bbd73c31d792a5f59299187a49d99fdd;hp=387cdde3cfbc0118047f045c37b5b8de3a198e3d;hb=5296c1532980c5918ac91370e7dd670d673edb85;hpb=e34e82619af0704b465e081f257f9952972e04b2 diff --git a/source/sequencer.h b/source/sequencer.h index 387cdde..f813717 100644 --- a/source/sequencer.h +++ b/source/sequencer.h @@ -31,13 +31,16 @@ public: private: class ActionDefLoader; + class SegmentLoader; class RegisteredAction { public: - typedef void (ActionDefLoader::*LoaderFunc)(); + typedef void (ActionDefLoader::*DefLoaderFunc)(); + typedef void (SegmentLoader::*LoaderFunc)(); virtual ~RegisteredAction() { } + virtual DefLoaderFunc get_def_loader_func() const = 0; virtual LoaderFunc get_loader_func() const = 0; }; @@ -45,6 +48,7 @@ private: class RegisteredActionType: public RegisteredAction { public: + virtual DefLoaderFunc get_def_loader_func() const; virtual LoaderFunc get_loader_func() const; }; @@ -81,12 +85,19 @@ private: private: float start_beat; float end_beat; + Demo &demo; public: - SegmentLoader(Sequencer &, float, float); + SegmentLoader(Sequencer &, float, float, Demo &); private: + template + void action(); + void apply(const std::string &); + + template + friend class RegisteredActionType; }; public: @@ -95,6 +106,7 @@ public: private: std::map action_types; std::map named_actions; + std::vector anonymous_actions; Msp::Time::TimeDelta secs_per_beat; std::vector static_actions; @@ -136,11 +148,17 @@ inline void Sequencer::register_action_type(const std::string &n) } template -Sequencer::RegisteredAction::LoaderFunc Sequencer::RegisteredActionType::get_loader_func() const +Sequencer::RegisteredAction::DefLoaderFunc Sequencer::RegisteredActionType::get_def_loader_func() const { return &ActionDefLoader::action_def; } +template +Sequencer::RegisteredAction::LoaderFunc Sequencer::RegisteredActionType::get_loader_func() const +{ + return &SegmentLoader::action; +} + template void Sequencer::ActionDefLoader::action_def() { @@ -152,4 +170,13 @@ void Sequencer::ActionDefLoader::action_def() action = act; } +template +void Sequencer::SegmentLoader::action() +{ + Msp::RefPtr act = new T; + load_sub(*act, demo); + obj.add_action(*act, start_beat, end_beat); + obj.anonymous_actions.push_back(act.release()); +} + #endif