X-Git-Url: http://git.tdb.fi/?p=libs%2Fdemoscene.git;a=blobdiff_plain;f=source%2Fsequencer.h;fp=source%2Fsequencer.h;h=d01ee6865da58811745c592ee17d83b2cfde007e;hp=cb80f8f05d87b9a7d55583c1e7f70080f4ac1e2f;hb=cdcad43ad8b497bd73df611ae53e1dfd5257400e;hpb=2128f0eff817490e4d86ef921ac346775c62348a diff --git a/source/sequencer.h b/source/sequencer.h index cb80f8f..d01ee68 100644 --- a/source/sequencer.h +++ b/source/sequencer.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -36,31 +37,15 @@ public: }; private: - class ActionDefLoader; - class SegmentLoader; - - class RegisteredAction - { - public: - 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; - }; - - template - class RegisteredActionType: public RegisteredAction - { - public: - virtual DefLoaderFunc get_def_loader_func() const; - virtual LoaderFunc get_loader_func() const; - }; - class ActionDefLoader: public Msp::DataFile::ObjectLoader { - private: + protected: + template + struct AddAction + { + static void add(ActionDefLoader &ldr, const std::string &kw) { ldr.add(kw, &ActionDefLoader::action_def); } + }; + Demo &demo; Msp::RefPtr action; @@ -69,14 +54,14 @@ private: Action *get_action() { return action.release(); } - private: - virtual void finished(); + protected: + virtual void action_loaded() { } + private: template void action_def(); - template - friend class RegisteredActionType; + friend class Sequencer; }; struct Segment @@ -86,31 +71,26 @@ private: float end_beat; }; - class SegmentLoader: public Msp::DataFile::ObjectLoader + class SegmentLoader: public ActionDefLoader { private: float start_beat; float end_beat; - Demo &demo; public: SegmentLoader(Sequencer &, float, float, Demo &); private: - template - void action(); + virtual void action_loaded(); void apply(const std::string &); - - template - friend class RegisteredActionType; }; public: sigc::signal signal_finished; private: - std::map action_types; + DataFile::LoadableTypeRegistry action_registry; std::map named_actions; std::vector anonymous_actions; @@ -147,22 +127,7 @@ public: template inline void Sequencer::register_action_type(const std::string &n) { - if(action_types.count(n)) - throw Msp::key_error(n); - - action_types[n] = new RegisteredActionType; -} - -template -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; + action_registry.register_type(n); } template @@ -171,19 +136,11 @@ void Sequencer::ActionDefLoader::action_def() if(action) throw std::runtime_error("Only one action per definition is allowed"); - Msp::RefPtr act = new T; - load_sub(*act, demo); - action = act; -} - -template -void Sequencer::SegmentLoader::action() -{ Msp::RefPtr act = new T; load_sub(*act, demo); act->validate(); - obj.add_action(*act, start_beat, end_beat); - obj.anonymous_actions.push_back(act.release()); + action = act.release(); + action_loaded(); } } // namespace DemoScene