]> git.tdb.fi Git - r2c2.git/blob - source/libr2c2/catalogue.cpp
2fdc21c08cb482667b08162d81535d8d1bb7c1d6
[r2c2.git] / source / libr2c2 / catalogue.cpp
1 #include <msp/core/maputils.h>
2 #include <msp/core/refptr.h>
3 #include <msp/datafile/parser.h>
4 #include "catalogue.h"
5 #include "signaltype.h"
6 #include "terraintype.h"
7 #include "tracktype.h"
8 #include "vehicletype.h"
9
10 using namespace std;
11 using namespace Msp;
12
13 namespace R2C2 {
14
15 Catalogue::Catalogue():
16         scale(1),
17         gauge(1.524),
18         layout(*this)
19 { }
20
21 Catalogue::~Catalogue()
22 {
23         for(ObjectMap::iterator i=objects.begin(); i!=objects.end(); ++i)
24                 delete i->second;
25 }
26
27 void Catalogue::add(ObjectType &object)
28 {
29         insert_unique(objects, object.get_article_number(), &object);
30         signal_object_added.emit(object);
31 }
32
33 const ObjectType &Catalogue::get(const ArticleNumber &art_nr) const
34 {
35         return *get_item(objects, art_nr);
36 }
37
38
39 Catalogue::Loader::Loader(Catalogue &c):
40         DataFile::ObjectLoader<Catalogue>(c)
41 {
42         add("gauge", &Loader::gauge);
43         add("layout", &Loader::layout);
44         add("scale", &Loader::scale);
45         add("signal", &Loader::signal);
46         add("terrain", &Loader::terrain);
47         add("track", &Loader::track);
48         add("track_appearance", &Loader::track_appearance);
49         add("vehicle", &Loader::vehicle);
50 }
51
52 void Catalogue::Loader::gauge(float g)
53 {
54         obj.gauge = g/1000;
55 }
56
57 void Catalogue::Loader::layout()
58 {
59         load_sub(obj.layout);
60 }
61
62 void Catalogue::Loader::scale(float n, float d)
63 {
64         obj.scale = n/d;
65 }
66
67 void Catalogue::Loader::signal(ArticleNumber art_nr)
68 {
69         if(obj.objects.count(art_nr))
70                 throw key_error(art_nr);
71
72         RefPtr<SignalType> sig = new SignalType(art_nr);
73         load_sub(*sig);
74         obj.add(*sig.release());
75 }
76
77 void Catalogue::Loader::terrain(ArticleNumber art_nr)
78 {
79         if(obj.objects.count(art_nr))
80                 throw key_error(art_nr);
81
82         RefPtr<TerrainType> ter = new TerrainType(art_nr);
83         load_sub(*ter);
84         obj.add(*ter.release());
85 }
86
87 void Catalogue::Loader::track(ArticleNumber art_nr)
88 {
89         if(obj.objects.count(art_nr))
90                 throw key_error(art_nr);
91
92         RefPtr<TrackType> trk = new TrackType(art_nr, obj.appearance);
93         load_sub(*trk);
94         obj.add(*trk.release());
95 }
96
97 void Catalogue::Loader::track_appearance()
98 {
99         load_sub(obj.appearance);
100 }
101
102 void Catalogue::Loader::vehicle(ArticleNumber art_nr)
103 {
104         if(obj.objects.count(art_nr))
105                 throw key_error(art_nr);
106
107         RefPtr<VehicleType> veh = new VehicleType(art_nr);
108         load_sub(*veh);
109         obj.add(*veh.release());
110 }
111
112 } // namespace R2C2