]> git.tdb.fi Git - r2c2.git/blob - source/libmarklin/layout.h
608ddece1eed1c2398fc36b101d2b0d6fb0c5063
[r2c2.git] / source / libmarklin / layout.h
1 /* $Id$
2
3 This file is part of the MSP Märklin suite
4 Copyright © 2006-2010  Mikkosoft Productions, Mikko Rasa
5 Distributed under the GPL
6 */
7
8 #ifndef LIBMARKLIN_LAYOUT_H_
9 #define LIBMARKLIN_LAYOUT_H_
10
11 #include <set>
12 #include <sigc++/sigc++.h>
13 #include <msp/datafile/loader.h>
14 #include <msp/time/timestamp.h>
15
16 namespace Marklin {
17
18 class Block;
19 class Catalogue;
20 class Driver;
21 class Route;
22 class Track;
23 class Train;
24
25 class Layout
26 {
27 public:
28         class Loader: public Msp::DataFile::BasicLoader<Layout>
29         {
30         private:
31                 bool new_tracks;
32
33         public:
34                 Loader(Layout &);
35         private:
36                 virtual void finish();
37                 void route(const std::string &);
38                 void track(unsigned);
39                 void train(unsigned, unsigned);
40         };
41
42 public:
43         sigc::signal<void, Track &> signal_track_added;
44         sigc::signal<void, Track &> signal_track_removed;
45         sigc::signal<void, Route &> signal_route_added;
46         sigc::signal<void, Route &> signal_route_removed;
47         sigc::signal<void, Train &> signal_train_added;
48         sigc::signal<void, Train &> signal_train_removed;
49         sigc::signal<void, Block &, Train *> signal_block_reserved;
50
51 private:
52         Catalogue &catalogue;
53         Driver *driver;
54         std::string base;
55         std::set<Track *> tracks;
56         std::map<std::string, Route *> routes;
57         std::set<Block *> blocks;
58         std::map<unsigned, Train *> trains;
59         Msp::Time::TimeStamp last_tick;
60
61 public:
62         Layout(Catalogue &, Driver * = 0);
63         ~Layout();
64
65         Catalogue &get_catalogue() const { return catalogue; }
66         bool has_driver() const { return driver; }
67         Driver &get_driver() const;
68         const std::string &get_base() const { return base; }
69
70         void add_track(Track &);
71         const std::set<Track *> &get_tracks() const { return tracks; }
72         void remove_track(Track &);
73
74         void add_block(Block &);
75         Block &get_block(unsigned) const;
76         Block &get_block_by_track(const Track &) const;
77         const std::set<Block *> &get_blocks() const { return blocks; }
78         void create_blocks();
79         void create_blocks(const Track &);
80         void remove_block(Block &);
81
82         void add_route(Route &);
83         const std::map<std::string, Route *> &get_routes() const { return routes; }
84         Route &get_route(const std::string &) const;
85         void remove_route(Route &);
86
87         void add_train(Train &);
88         Train &get_train(unsigned) const;
89         const std::map<unsigned, Train *> &get_trains() const { return trains; }
90         void remove_train(Train &);
91
92         void tick();
93
94         void save(const std::string &);
95         void save_trains(const std::string &);
96 private:
97         void check_links();
98         void check_routes();
99 };
100
101 } // namespace Marklin
102
103 #endif
104