X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibmarklin%2Flayout.cpp;h=50eba62ab6f096b04427c3feb09e093b7858f3ef;hb=65cbaf88a03497df08243ac27354b0c0ea1f640b;hp=28d2eeb862ad85862e8cd45baab8291061d9261a;hpb=52cbe8d99669f843f8f75c51128e2748584dd03a;p=r2c2.git diff --git a/source/libmarklin/layout.cpp b/source/libmarklin/layout.cpp index 28d2eeb..50eba62 100644 --- a/source/libmarklin/layout.cpp +++ b/source/libmarklin/layout.cpp @@ -1,6 +1,13 @@ -#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" @@ -10,10 +17,16 @@ using namespace Msp; namespace Marklin { -Layout::Layout(Catalogue &c): +Layout::Layout(const Catalogue &c): catalogue(c) { } +Layout::~Layout() +{ + for(set::iterator i=tracks.begin(); i!=tracks.end(); ++i) + delete *i; +} + void Layout::add_track(Track &t) { if(tracks.insert(&t).second) @@ -34,36 +47,44 @@ void Layout::check_links() for(set::iterator i=tracks.begin(); i!=tracks.end(); ++i) (*i)->break_links(); + set flext; for(set::iterator i=tracks.begin(); i!=tracks.end(); ++i) - for(set::iterator j=i; j!=tracks.end(); ++j) + { + if((*i)->get_flex()) + flext.insert(*i); + else + { + for(set::iterator j=i; j!=tracks.end(); ++j) + if(j!=i) + (*i)->snap_to(**j, true); + } + } + + 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); } -void Layout::load(const string &fn) +void Layout::save(const string &fn) { - IO::File in(fn); - IO::Buffered inb(in); - - filename=fn; - DataFile::Parser parser(inb, fn); - Loader loader(*this); - loader.load(parser); - - check_links(); - + 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) - (*i)->check_slope(); -} - -int Layout::save(const string &fn) -{ - ofstream out(fn.c_str()); + { + DataFile::Statement st("track"); + st.append((*i)->get_type().get_article_number()); + (*i)->save(st.sub); + writer.write(st); + } + /*ofstream out(fn.c_str()); if(!out) return -1; filename=fn; - if(base.size()) + if(!base.empty()) out<<"base \""<::iterator i=tracks.begin(); i!=tracks.end(); ++i) { @@ -87,33 +108,32 @@ int Layout::save(const string &fn) out<<"};\n"; } - return 0; + return 0;*/ } -Layout::~Layout() -{ - for(set::iterator i=tracks.begin(); i!=tracks.end(); ++i) - delete *i; -} - -/******************* -** 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) { - TrackType &type=layout.catalogue.get_track(art_nr); + TrackType &type=obj.catalogue.get_track(art_nr); RefPtr trk=new Track(type); load_sub(*trk); - layout.add_track(*trk.release()); + obj.add_track(*trk.release()); } } // namespace Marklin