]> git.tdb.fi Git - r2c2.git/blob - source/libr2c2/catalogue.h
21ebd38a90a6382c931f08809ac46e25051b7036
[r2c2.git] / source / libr2c2 / catalogue.h
1 #ifndef LIBR2C2_CATALOGUE_H_
2 #define LIBR2C2_CATALOGUE_H_
3
4 #include <map>
5 #include <msp/datafile/objectloader.h>
6 #include "articlenumber.h"
7 #include "layout.h"
8 #include "trackappearance.h"
9
10 namespace R2C2 {
11
12 class ObjectType;
13
14 class Catalogue
15 {
16 public:
17         class Loader: public Msp::DataFile::ObjectLoader<Catalogue>
18         {
19         public:
20                 Loader(Catalogue &);
21         private:
22                 void gauge(float);
23                 void layout();
24                 void scale(float, float);
25                 void signal(ArticleNumber);
26                 void terrain(ArticleNumber);
27                 void track(ArticleNumber);
28                 void track_appearance();
29                 void vehicle(ArticleNumber);
30         };
31
32         typedef std::map<ArticleNumber, ObjectType *> ObjectMap;
33
34         sigc::signal<void, const ObjectType &> signal_object_added;
35
36 private:
37         float scale;
38         float gauge;
39         TrackAppearance appearance;
40         ObjectMap objects;
41         Layout layout;
42
43 public:
44         Catalogue();
45         ~Catalogue();
46
47         float get_scale() const { return scale; }
48         float get_gauge() const { return gauge; }
49
50         void add(ObjectType &);
51         const ObjectType &get(const ArticleNumber &) const;
52         const ObjectMap &get_all() const { return objects; }
53
54         template<typename T>
55         const T &get(const ArticleNumber &an) const
56         { return dynamic_cast<const T &>(get(an)); }
57
58         Layout &get_layout() { return layout; }
59 };
60
61 } // namespace R2C2
62
63 #endif