X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibmarklin%2Flayout.cpp;h=28d2eeb862ad85862e8cd45baab8291061d9261a;hb=52cbe8d99669f843f8f75c51128e2748584dd03a;hp=1fe06c7e4f5aed39948ae18e6ca9a46482545474;hpb=36beacc579d3132642ed4d98ce5a6d99842b5812;p=r2c2.git diff --git a/source/libmarklin/layout.cpp b/source/libmarklin/layout.cpp index 1fe06c7..28d2eeb 100644 --- a/source/libmarklin/layout.cpp +++ b/source/libmarklin/layout.cpp @@ -1,8 +1,9 @@ -#include #include -#include +#include +#include #include "catalogue.h" #include "layout.h" +#include "tracktype.h" using namespace std; using namespace Msp; @@ -13,50 +14,45 @@ Layout::Layout(Catalogue &c): catalogue(c) { } -void Layout::add_track(Track *t) +void Layout::add_track(Track &t) { - if(find(tracks.begin(), tracks.end(), t)==tracks.end()) - { - tracks.push_back(t); + if(tracks.insert(&t).second) signal_track_added.emit(t); - } } -void Layout::remove_track(Track *t) +void Layout::remove_track(Track &t) { - TrackSeq::iterator i=remove_if(tracks.begin(), tracks.end(), bind1st(equal_to(), t)); - if(i!=tracks.end()) + if(tracks.count(&t)) { - tracks.erase(i, tracks.end()); + tracks.erase(&t); signal_track_removed.emit(t); } } void Layout::check_links() { - for(TrackSeq::iterator i=tracks.begin(); i!=tracks.end(); ++i) + for(set::iterator i=tracks.begin(); i!=tracks.end(); ++i) (*i)->break_links(); - for(TrackSeq::iterator i=tracks.begin(); i!=tracks.end(); ++i) - for(TrackSeq::iterator j=i; j!=tracks.end(); ++j) + for(set::iterator i=tracks.begin(); i!=tracks.end(); ++i) + for(set::iterator j=i; j!=tracks.end(); ++j) if(j!=i) (*i)->snap_to(**j, true); } void Layout::load(const string &fn) { - ifstream in(fn.c_str()); - if(!in) - throw Exception("Couldn't open file"); + IO::File in(fn); + IO::Buffered inb(in); filename=fn; - Parser::Parser parser(in, fn); + DataFile::Parser parser(inb, fn); Loader loader(*this); loader.load(parser); check_links(); - for(TrackSeq::iterator i=tracks.begin(); i!=tracks.end(); ++i) + for(set::iterator i=tracks.begin(); i!=tracks.end(); ++i) (*i)->check_slope(); } @@ -69,9 +65,9 @@ int Layout::save(const string &fn) if(base.size()) out<<"base \""<::iterator i=tracks.begin(); i!=tracks.end(); ++i) { - out<<"track "<<(*i)->get_article_number()<<"\n{\n"; + out<<"track "<<(*i)->get_type().get_article_number()<<"\n{\n"; const Point &p=(*i)->get_position(); out<<"\tposition "<get_rotation()<<";\n"; @@ -96,7 +92,7 @@ int Layout::save(const string &fn) Layout::~Layout() { - for(TrackSeq::iterator i=tracks.begin(); i!=tracks.end(); ++i) + for(set::iterator i=tracks.begin(); i!=tracks.end(); ++i) delete *i; } @@ -113,22 +109,11 @@ Layout::Loader::Loader(Layout &l): void Layout::Loader::track(unsigned art_nr) { - Track *tmpl=layout.catalogue.get_track(art_nr); - if(!tmpl) - throw Exception("Unknown track"); + TrackType &type=layout.catalogue.get_track(art_nr); - Track *trk=tmpl->copy(); - try - { - load_sub(*trk); - } - catch(Msp::Exception &e) - { - delete trk; - throw; - } - layout.tracks.push_back(trk); - layout.signal_track_added.emit(trk); + RefPtr trk=new Track(type); + load_sub(*trk); + layout.add_track(*trk.release()); } } // namespace Marklin