X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibmarklin%2Flayout.cpp;h=bd9ee712d5370ae5b7aac5afc180102fefdc6614;hb=38fb8d56efde037a71c46a58bda314655e68ab6c;hp=1fe06c7e4f5aed39948ae18e6ca9a46482545474;hpb=6c61179fe09af2f5366d50f10aadbf5f83438087;p=r2c2.git diff --git a/source/libmarklin/layout.cpp b/source/libmarklin/layout.cpp index 1fe06c7..bd9ee71 100644 --- a/source/libmarklin/layout.cpp +++ b/source/libmarklin/layout.cpp @@ -1,134 +1,109 @@ -#include -#include -#include +/* $Id$ + +This file is part of the MSP Märklin suite +Copyright © 2006-2009 Mikkosoft Productions, Mikko Rasa +Distributed under the GPL +*/ + +#include +#include +#include #include "catalogue.h" #include "layout.h" +#include "tracktype.h" using namespace std; using namespace Msp; namespace Marklin { -Layout::Layout(Catalogue &c): +Layout::Layout(const Catalogue &c): catalogue(c) { } -void Layout::add_track(Track *t) +Layout::~Layout() { - if(find(tracks.begin(), tracks.end(), t)==tracks.end()) - { - tracks.push_back(t); + for(set::iterator i=tracks.begin(); i!=tracks.end(); ++i) + delete *i; +} + +void Layout::add_track(Track &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) - 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"); - - filename=fn; - Parser::Parser parser(in, fn); - Loader loader(*this); - loader.load(parser); - - check_links(); - - for(TrackSeq::iterator i=tracks.begin(); i!=tracks.end(); ++i) - (*i)->check_slope(); -} - -int Layout::save(const string &fn) -{ - ofstream out(fn.c_str()); - if(!out) return -1; - - filename=fn; - - if(base.size()) - out<<"base \""< flext; + for(set::iterator i=tracks.begin(); i!=tracks.end(); ++i) { - out<<"track "<<(*i)->get_article_number()<<"\n{\n"; - const Point &p=(*i)->get_position(); - out<<"\tposition "<get_rotation()<<";\n"; - out<<"\tslope "<<(*i)->get_slope()<<";\n"; - - unsigned id=(*i)->get_turnout_id(); - if(id) - out<<"\tturnout_id "<get_sensor_id(); - if(id) - out<<"\tsensor_id "<get_flex()) - out<<"\tflex true;\n"; - - out<<"};\n"; + flext.insert(*i); + else + { + for(set::iterator j=i; j!=tracks.end(); ++j) + if(j!=i) + (*i)->snap_to(**j, true); + } } - return 0; + for(set::iterator i=flext.begin(); i!=flext.end(); ++i) + for(set::iterator j=tracks.begin(); j!=tracks.end(); ++j) + if(j!=i) + (*i)->snap_to(**j, true); } -Layout::~Layout() +void Layout::save(const string &fn) { - for(TrackSeq::iterator i=tracks.begin(); i!=tracks.end(); ++i) - delete *i; + IO::BufferedFile out(fn, IO::M_WRITE); + DataFile::Writer writer(out); + if(!base.empty()) + writer.write((DataFile::Statement("base"), base)); + for(set::iterator i=tracks.begin(); i!=tracks.end(); ++i) + { + DataFile::Statement st("track"); + st.append((*i)->get_type().get_article_number()); + (*i)->save(st.sub); + writer.write(st); + } } -/******************* -** Layout::Loader -*/ Layout::Loader::Loader(Layout &l): - layout(l) + DataFile::BasicLoader(l) { add("base", &Layout::base); add("track", &Loader::track); } +void Layout::Loader::finish() +{ + obj.check_links(); + + for(set::iterator i=obj.tracks.begin(); i!=obj.tracks.end(); ++i) + (*i)->check_slope(); +} + void Layout::Loader::track(unsigned art_nr) { - Track *tmpl=layout.catalogue.get_track(art_nr); - if(!tmpl) - throw Exception("Unknown track"); + TrackType &type = obj.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); + obj.add_track(*trk.release()); } } // namespace Marklin