]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/layout.cpp
Add basic support for signals
[r2c2.git] / source / libr2c2 / layout.cpp
index de61b1bca4d5eb7e7ed5593af108ee34a2709abb..fefa3e9b3fb4045e2d6ecf84280c0319fa2431ed 100644 (file)
@@ -10,6 +10,8 @@
 #include "driver.h"
 #include "layout.h"
 #include "route.h"
+#include "signal.h"
+#include "signaltype.h"
 #include "track.h"
 #include "tracktype.h"
 #include "train.h"
@@ -79,6 +81,18 @@ void Layout::remove_track(Track &t)
        }
 }
 
+void Layout::add_signal(Signal &s)
+{
+       if(signals.insert(&s).second)
+               signal_signal_added.emit(s);
+}
+
+void Layout::remove_signal(Signal &s)
+{
+       if(signals.erase(&s))
+               signal_signal_removed.emit(s);
+}
+
 Track *Layout::pick_track(const Vector &start, const Vector &ray)
 {
        for(set<Track *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
@@ -270,6 +284,8 @@ void Layout::tick()
 
        for(set<Block *>::iterator i=blocks.begin(); i!=blocks.end(); ++i)
                (*i)->tick(dt);
+       for(set<Signal *>::iterator i=signals.begin(); i!=signals.end(); ++i)
+               (*i)->tick(dt);
        for(map<unsigned, Train *>::iterator i=trains.begin(); i!=trains.end(); ++i)
                i->second->tick(t, dt);
 }
@@ -298,6 +314,14 @@ void Layout::save(const string &fn) const
                writer.write(st);
        }
 
+       for(set<Signal *>::const_iterator i=signals.begin(); i!=signals.end(); ++i)
+       {
+               DataFile::Statement st("signal");
+               st.append((*i)->get_type().get_article_number());
+               (*i)->save(st.sub);
+               writer.write(st);
+       }
+
        for(set<Route *>::const_iterator i=routes.begin(); i!=routes.end(); ++i)
        {
                if((*i)->is_temporary())
@@ -349,6 +373,7 @@ Layout::Loader::Loader(Layout &l):
 {
        add("base",  &Layout::base);
        add("route", static_cast<void (Loader::*)()>(&Loader::route));
+       add("signal", &Loader::signal);
        add("track", static_cast<void (Loader::*)(ArticleNumber)>(&Loader::track));
        add("train", static_cast<void (Loader::*)(ArticleNumber, unsigned, const std::string &)>(&Loader::train));
        add("turnout", &Loader::turnout);
@@ -379,6 +404,12 @@ void Layout::Loader::route(const string &n)
        load_sub(*rte);
 }
 
+void Layout::Loader::signal(ArticleNumber art_nr)
+{
+       Signal *sig = new Signal(obj, obj.catalogue.get_signal(art_nr));
+       load_sub(*sig);
+}
+
 void Layout::Loader::track(unsigned art_nr)
 {
        track(ArticleNumber(art_nr));