+
+
+Sequencer::Loader::Loader(Sequencer &s, Demo &d):
+ DataFile::ObjectLoader<Sequencer>(s),
+ demo(d)
+{
+ add("define_action", &Loader::define_action);
+ add("instant", &Loader::instant);
+ add("segment", &Loader::segment);
+}
+
+void Sequencer::Loader::define_action(const string &n)
+{
+ ActionDefLoader ldr(obj, demo);
+ load_sub_with(ldr);
+ obj.named_actions[n] = ldr.get_action();
+}
+
+void Sequencer::Loader::instant(float beat)
+{
+ segment(beat, beat);
+}
+
+void Sequencer::Loader::segment(float start, float end)
+{
+ SegmentLoader ldr(obj, start, end, demo);
+ load_sub_with(ldr);
+}
+
+
+Sequencer::ActionDefLoader::ActionDefLoader(Sequencer &s, Demo &d):
+ DataFile::ObjectLoader<Sequencer>(s),
+ demo(d)
+{
+ for(const auto &t: obj.action_types)
+ add(t.first, t.second->get_def_loader_func());
+}
+
+void Sequencer::ActionDefLoader::finished()
+{
+ if(action)
+ action->validate();
+}
+
+
+Sequencer::SegmentLoader::SegmentLoader(Sequencer &s, float b, float e, Demo &d):
+ ObjectLoader<Sequencer>(s),
+ start_beat(b),
+ end_beat(e),
+ demo(d)
+{
+ add("apply", &SegmentLoader::apply);
+ for(const auto &t: obj.action_types)
+ add(t.first, t.second->get_loader_func());
+}
+
+void Sequencer::SegmentLoader::apply(const string &n)
+{
+ obj.add_action(*get_item(obj.named_actions, n), start_beat, end_beat);
+}