#include <string>
#include <sigc++/trackable.h>
#include <msp/datafile/objectloader.h>
+#include "trackchain.h"
namespace R2C2 {
class TrackIter;
class Zone;
-enum RouteValidityMask
-{
- ROUTE_INVALID = 0,
- ROUTE_LINKED = 1,
- ROUTE_LINEAR = 2,
- ROUTE_SMOOTH = 4,
- ROUTE_VALID = 7
-};
-class bad_route: public std::logic_error
-{
-public:
- bad_route(RouteValidityMask m): std::logic_error(get_message(m)) { }
- virtual ~bad_route() throw() { }
-
-private:
- static std::string get_message(RouteValidityMask);
-};
-
-
-class Route: public sigc::trackable
+class Route: public TrackChain
{
public:
typedef std::map<unsigned, int> TurnoutMap;
Loader(Route &);
private:
virtual void finish();
+ void name(const std::string &);
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;
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();
+private:
+ void update_turnout(Track &);
+public:
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(const TrackIter &, 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:
- RouteValidityMask check_validity(Track &) const;
- void object_removed(Object &);
+ void add_turnout(Track &, unsigned);
+ virtual void on_track_added(Track &);
public:
+ void save(std::list<Msp::DataFile::Statement> &) const;
+ virtual Msp::DataFile::Statement save_reference() const;
+
static Route *find(const TrackIter &, Track &);
static Route *find(const TrackIter &, const Route &);
static Route *find(const TrackIter &, const Zone &);