+/* $Id$
+
+This file is part of the MSP Märklin suite
+Copyright © 2007-2010 Mikkosoft Productions, Mikko Rasa
+Distributed under the GPL
+*/
+
#ifndef LIBMARKLIN_ROUTE_H_
#define LIBMARKLIN_ROUTE_H_
-#include <list>
#include <map>
#include <set>
#include <string>
+#include <sigc++/trackable.h>
+#include <msp/datafile/loader.h>
namespace Marklin {
+class Layout;
class Track;
-class Turnout;
+class TrackIter;
-class Route
+class Route: public sigc::trackable
{
public:
- Route();
- const std::map<unsigned, Turnout *> &get_turnouts() const { return turnouts; }
- void add_track(Track *);
- ~Route();
+ typedef std::map<unsigned, int> TurnoutMap;
+
+ class Loader: public Msp::DataFile::BasicLoader<Route>
+ {
+ private:
+ TurnoutMap turnouts;
+
+ public:
+ Loader(Route &);
+ private:
+ virtual void finish();
+ void turnout(unsigned, unsigned);
+ };
+
+ sigc::signal<void, const std::string &> signal_name_changed;
+
private:
+ Layout &layout;
std::string name;
+ bool temporary;
std::set<Track *> tracks;
- std::map<unsigned, Turnout *> turnouts;
+ TurnoutMap turnouts;
+
+public:
+ Route(Layout &);
+ ~Route();
+
+ void set_name(const std::string &);
+ const std::string &get_name() const { return name; }
+ void set_temporary(bool);
+ bool is_temporary() const { return temporary; }
+ void set_turnout(unsigned, unsigned);
+ void update_turnouts();
+ int get_turnout(unsigned) const;
+ unsigned get_path(Track &) const;
+ const std::map<unsigned, int> &get_turnouts() const { return turnouts; }
+ void add_track(Track &);
+ void add_tracks(const std::set<Track *> &);
+ void add_track_chain(Track &, unsigned, const TurnoutMap &);
+ const std::set<Track *> &get_tracks() const { return tracks; }
+ bool has_track(Track &) const;
+ void save(std::list<Msp::DataFile::Statement> &) const;
+private:
+ unsigned check_validity(Track &) const;
+ void track_removed(Track &);
+
+public:
+ static Route *find(const TrackIter &, Track &);
+ static Route *find(const TrackIter &, const Route &);
+ static Route *find(const TrackIter &, const std::set<Track *> &);
};
} // namespace Marklin