]> git.tdb.fi Git - r2c2.git/blob - source/libr2c2/trackchain.h
New approach for displaying track state
[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 "trackiter.h"
8
9 namespace R2C2 {
10
11 class Layout;
12 class Object;
13
14 class bad_chain: public std::logic_error
15 {
16 public:
17         bad_chain(const std::string &w): std::logic_error(w) { }
18         virtual ~bad_chain() throw() { }
19 };
20
21
22 class TrackChain: public sigc::trackable
23 {
24 public:
25         typedef std::set<Track *> TrackSet;
26
27 protected:
28         enum Validity
29         {
30                 VALID,
31                 UNLINKED,
32                 BAD_PATH,
33                 INCOMPATIBLE
34         };
35
36 public:
37         sigc::signal<void, Track &> signal_track_added;
38         sigc::signal<void, Track &> signal_track_removed;
39
40         Layout &layout;
41         TrackSet tracks;
42         TrackIter ends[2];
43
44         TrackChain(Layout &);
45 public:
46         virtual ~TrackChain() { }
47
48         void add_track(Track &);
49         void add_tracks(const TrackSet &);
50 protected:
51         virtual void on_track_added(Track &) { }
52         virtual Validity check_validity(Track &) const;
53         static void throw_bad_chain(Validity);
54 private:
55         void update_ends(Track &);
56 public:
57         const TrackSet &get_tracks() const { return tracks; }
58         bool has_track(Track &) const;
59
60 private:
61         void object_removed(Object &);
62 };
63
64 } // namespace R2C2
65
66 #endif