]> git.tdb.fi Git - r2c2.git/blob - source/libr2c2/trackchain.h
Support directionality for zones
[r2c2.git] / source / libr2c2 / trackchain.h
1 #ifndef LIBR2C2_TRACKCHAIN_H_
2 #define LIBR2C2_TRACKCHAIN_H_
3
4 #include <set>
5 #include <stdexcept>
6 #include <sigc++/trackable.h>
7 #include <msp/datafile/statement.h>
8 #include "trackiter.h"
9
10 namespace R2C2 {
11
12 class Layout;
13 class Object;
14
15 class bad_chain: public std::logic_error
16 {
17 public:
18         bad_chain(const std::string &w): std::logic_error(w) { }
19         virtual ~bad_chain() throw() { }
20 };
21
22
23 class TrackChain: public sigc::trackable
24 {
25 public:
26         enum Direction
27         {
28                 UNSPECIFIED,
29                 UP,
30                 DOWN
31         };
32
33         typedef std::set<Track *> TrackSet;
34
35 protected:
36         enum Validity
37         {
38                 VALID,
39                 UNLINKED,
40                 BAD_PATH,
41                 INCOMPATIBLE
42         };
43
44 public:
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;
48
49 protected:
50         Layout &layout;
51         std::string name;
52         TrackSet tracks;
53         TrackIter ends[2];
54
55         TrackChain(Layout &);
56 public:
57         virtual ~TrackChain() { }
58
59         virtual void set_name(const std::string &);
60         const std::string &get_name() const { return name; }
61
62         void add_track(Track &);
63         void add_tracks(const TrackSet &);
64 protected:
65         virtual void on_track_added(Track &) { }
66         virtual Validity check_validity(Track &) const;
67         static void throw_bad_chain(Validity);
68 private:
69         void update_ends(Track &);
70 public:
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;
75         bool is_loop() const;
76
77 private:
78         void object_removed(Object &);
79
80 public:
81         virtual Msp::DataFile::Statement save_reference() const = 0;
82 };
83
84
85 void operator<<(Msp::LexicalConverter &, TrackChain::Direction);
86 void operator>>(const Msp::LexicalConverter &, TrackChain::Direction &);
87
88 } // namespace R2C2
89
90 #endif