]> git.tdb.fi Git - r2c2.git/blob - source/libmarklin/layout.h
Add vehicles
[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 class Vehicle;
25
26 class Layout
27 {
28 public:
29         class Loader: public Msp::DataFile::BasicLoader<Layout>
30         {
31         private:
32                 bool new_tracks;
33
34         public:
35                 Loader(Layout &);
36         private:
37                 virtual void finish();
38                 void route(const std::string &);
39                 void track(unsigned);
40                 void train(unsigned, unsigned);
41         };
42
43 public:
44         sigc::signal<void, Track &> signal_track_added;
45         sigc::signal<void, Track &> signal_track_removed;
46         sigc::signal<void, Route &> signal_route_added;
47         sigc::signal<void, Route &> signal_route_removed;
48         sigc::signal<void, Train &> signal_train_added;
49         sigc::signal<void, Train &> signal_train_removed;
50         sigc::signal<void, Vehicle &> signal_vehicle_added;
51         sigc::signal<void, Vehicle &> signal_vehicle_removed;
52         sigc::signal<void, Block &, Train *> signal_block_reserved;
53
54 private:
55         Catalogue &catalogue;
56         Driver *driver;
57         std::string base;
58         std::set<Track *> tracks;
59         std::map<std::string, Route *> routes;
60         std::set<Block *> blocks;
61         std::map<unsigned, Train *> trains;
62         std::set<Vehicle *> vehicles;
63         Msp::Time::TimeStamp last_tick;
64
65 public:
66         Layout(Catalogue &, Driver * = 0);
67         ~Layout();
68
69         Catalogue &get_catalogue() const { return catalogue; }
70         bool has_driver() const { return driver; }
71         Driver &get_driver() const;
72         const std::string &get_base() const { return base; }
73
74         void add_track(Track &);
75         const std::set<Track *> &get_tracks() const { return tracks; }
76         void remove_track(Track &);
77
78         void add_block(Block &);
79         Block &get_block(unsigned) const;
80         Block &get_block_by_track(const Track &) const;
81         const std::set<Block *> &get_blocks() const { return blocks; }
82         void create_blocks();
83         void create_blocks(const Track &);
84         void remove_block(Block &);
85
86         void add_route(Route &);
87         const std::map<std::string, Route *> &get_routes() const { return routes; }
88         Route &get_route(const std::string &) const;
89         void remove_route(Route &);
90
91         void add_train(Train &);
92         Train &get_train(unsigned) const;
93         const std::map<unsigned, Train *> &get_trains() const { return trains; }
94         void remove_train(Train &);
95
96         void add_vehicle(Vehicle &);
97         void remove_vehicle(Vehicle &);
98
99         void tick();
100
101         void save(const std::string &);
102         void save_trains(const std::string &);
103 private:
104         void check_links();
105         void check_routes();
106 };
107
108 } // namespace Marklin
109
110 #endif
111