X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fengineer%2Ftrainpanel.cpp;h=dce1387f58540c604e3b8b45c4e661ace7d523a6;hb=43638fd7170c5c8290212c38c3eaf623b8c1b415;hp=24a182b05c9328caca4efc318c14b7d309831ebc;hpb=651698847d5293cfb15b6fb23a394701388c0151;p=r2c2.git diff --git a/source/engineer/trainpanel.cpp b/source/engineer/trainpanel.cpp index 24a182b..dce1387 100644 --- a/source/engineer/trainpanel.cpp +++ b/source/engineer/trainpanel.cpp @@ -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 &eps = block.get_endpoints(); + bool ok = false; + for(unsigned i=0; (!ok && iget_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()); + } +}