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