]> git.tdb.fi Git - r2c2.git/blob - source/libr2c2/trackchain.h
729a89cd9c6910882fe641721f86751e93df21e0
[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, const std::string &> signal_name_changed;
38         sigc::signal<void, Track &> signal_track_added;
39         sigc::signal<void, Track &> signal_track_removed;
40
41 protected:
42         Layout &layout;
43         std::string name;
44         TrackSet tracks;
45         TrackIter ends[2];
46
47         TrackChain(Layout &);
48 public:
49         virtual ~TrackChain() { }
50
51         virtual void set_name(const std::string &);
52         const std::string &get_name() const { return name; }
53
54         void add_track(Track &);
55         void add_tracks(const TrackSet &);
56 protected:
57         virtual void on_track_added(Track &) { }
58         virtual Validity check_validity(Track &) const;
59         static void throw_bad_chain(Validity);
60 private:
61         void update_ends(Track &);
62 public:
63         const TrackSet &get_tracks() const { return tracks; }
64         bool has_track(Track &) const;
65
66 private:
67         void object_removed(Object &);
68 };
69
70 } // namespace R2C2
71
72 #endif