]> git.tdb.fi Git - r2c2.git/blobdiff - source/engineer/trainpanel.cpp
Add a pathfinder function to Route
[r2c2.git] / source / engineer / trainpanel.cpp
index 24a182b05c9328caca4efc318c14b7d309831ebc..dce1387f58540c604e3b8b45c4e661ace7d523a6 100644 (file)
@@ -92,6 +92,7 @@ TrainPanel::TrainPanel(Engineer &e, const GLtk::Resources &r, Train &t):
 
        add(*(btn=new GLtk::Button(res, "GoTo")));
        btn->set_geometry(GLtk::Geometry(geom.w-130, 10, 40, 24));
+       btn->signal_clicked.connect(sigc::mem_fun(this, &TrainPanel::goto_clicked));
 
        add(*(btn=new GLtk::Button(res, "Route")));
        btn->set_geometry(GLtk::Geometry(geom.w-170, 10, 40, 24));
@@ -136,7 +137,8 @@ void TrainPanel::train_status_changed(const string &s)
 
 void TrainPanel::place_clicked()
 {
-       engineer.place_train(train);
+       engineer.pick(true);
+       pick_conn = engineer.signal_pick_done.connect(sigc::mem_fun(this, &TrainPanel::place));
 }
 
 void TrainPanel::edit_clicked()
@@ -155,6 +157,12 @@ void TrainPanel::route_clicked()
        dialog->set_visible(true);
 }
 
+void TrainPanel::goto_clicked()
+{
+       engineer.pick(false);
+       pick_conn = engineer.signal_pick_done.connect(sigc::mem_fun(this, &TrainPanel::go_to));
+}
+
 void TrainPanel::forward_toggled(bool value)
 {
        train.set_reverse(!value);
@@ -164,3 +172,47 @@ void TrainPanel::func_toggled(bool value, unsigned func)
 {
        train.set_function(func, value);
 }
+
+void TrainPanel::place(Track *track, unsigned ep)
+{
+       pick_conn.disconnect();
+
+       Block &block = engineer.get_layout().get_block_by_track(*track);
+
+       while(1)
+       {
+               const vector<Block::Endpoint> &eps = block.get_endpoints();
+               bool ok = false;
+               for(unsigned i=0; (!ok && i<eps.size()); ++i)
+                       if(eps[i].track==track && eps[i].track_ep==ep)
+                       {
+                               train.place(block, i);
+                               ok = true;
+                       }
+
+               if(ok)
+                       break;
+               else
+               {
+                       Track *next = track->get_links()[ep];
+                       ep = next->traverse(next->get_endpoint_by_link(*track), 0);
+                       track = next;
+                       if(!block.get_tracks().count(track))
+                               break;
+               }
+       }
+}
+
+void TrainPanel::go_to(Track *track, unsigned)
+{
+       pick_conn.disconnect();
+
+       try
+       {
+               train.go_to(*track);
+       }
+       catch(const Exception &e)
+       {
+               engineer.set_status(e.what());
+       }
+}