1 #ifndef LIBR2C2_TRACKCHAIN_H_
2 #define LIBR2C2_TRACKCHAIN_H_
6 #include <sigc++/trackable.h>
7 #include <msp/datafile/statement.h>
15 class bad_chain: public std::logic_error
18 bad_chain(const std::string &w): std::logic_error(w) { }
19 virtual ~bad_chain() throw() { }
23 class TrackChain: public sigc::trackable
33 typedef std::set<Track *> TrackSet;
45 sigc::signal<void, const std::string &> signal_name_changed;
46 sigc::signal<void, Track &> signal_track_added;
47 sigc::signal<void, Track &> signal_track_removed;
57 virtual ~TrackChain() { }
59 virtual void set_name(const std::string &);
60 const std::string &get_name() const { return name; }
62 void add_track(Track &);
63 void add_tracks(const TrackSet &);
65 virtual void on_track_added(Track &) { }
66 virtual Validity check_validity(Track &) const;
67 static void throw_bad_chain(Validity);
69 void update_ends(Track &);
71 const TrackSet &get_tracks() const { return tracks; }
72 bool has_track(Track &) const;
73 virtual TrackIter iter_for(Track &, Direction) const;
74 TrackIter get_end(unsigned) const;
78 void object_removed(Object &);
81 virtual Msp::DataFile::Statement save_reference() const = 0;
85 void operator<<(Msp::LexicalConverter &, TrackChain::Direction);
86 void operator>>(const Msp::LexicalConverter &, TrackChain::Direction &);