]> git.tdb.fi Git - r2c2.git/blob - source/libr2c2/catalogue.cpp
Move gauge to TrackAppearance
[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         layout(*this)
18 { }
19
20 Catalogue::~Catalogue()
21 {
22         for(ObjectMap::iterator i=objects.begin(); i!=objects.end(); ++i)
23                 delete i->second;
24 }
25
26 void Catalogue::add(ObjectType &object)
27 {
28         insert_unique(objects, object.get_article_number(), &object);
29         signal_object_added.emit(object);
30 }
31
32 const ObjectType &Catalogue::get(const ArticleNumber &art_nr) const
33 {
34         return *get_item(objects, art_nr);
35 }
36
37
38 Catalogue::Loader::Loader(Catalogue &c):
39         DataFile::ObjectLoader<Catalogue>(c)
40 {
41         add("layout", &Loader::layout);
42         add("scale", &Loader::scale);
43         add("signal", &Loader::signal);
44         add("terrain", &Loader::terrain);
45         add("track", &Loader::track);
46         add("track_appearance", &Loader::track_appearance);
47         add("vehicle", &Loader::vehicle);
48 }
49
50 void Catalogue::Loader::layout()
51 {
52         load_sub(obj.layout);
53 }
54
55 void Catalogue::Loader::scale(float n, float d)
56 {
57         obj.scale = n/d;
58 }
59
60 void Catalogue::Loader::signal(ArticleNumber art_nr)
61 {
62         if(obj.objects.count(art_nr))
63                 throw key_error(art_nr);
64
65         RefPtr<SignalType> sig = new SignalType(art_nr);
66         load_sub(*sig);
67         obj.add(*sig.release());
68 }
69
70 void Catalogue::Loader::terrain(ArticleNumber art_nr)
71 {
72         if(obj.objects.count(art_nr))
73                 throw key_error(art_nr);
74
75         RefPtr<TerrainType> ter = new TerrainType(art_nr);
76         load_sub(*ter);
77         obj.add(*ter.release());
78 }
79
80 void Catalogue::Loader::track(ArticleNumber art_nr)
81 {
82         if(obj.objects.count(art_nr))
83                 throw key_error(art_nr);
84
85         RefPtr<TrackType> trk = new TrackType(art_nr, obj.appearance);
86         load_sub(*trk);
87         obj.add(*trk.release());
88 }
89
90 void Catalogue::Loader::track_appearance()
91 {
92         load_sub(obj.appearance);
93 }
94
95 void Catalogue::Loader::vehicle(ArticleNumber art_nr)
96 {
97         if(obj.objects.count(art_nr))
98                 throw key_error(art_nr);
99
100         RefPtr<VehicleType> veh = new VehicleType(art_nr);
101         load_sub(*veh);
102         obj.add(*veh.release());
103 }
104
105 } // namespace R2C2