+ return layout.pick<Track>(Ray(start, ray.slice<3>(0)));
+}
+
+void Engineer::emergency(Block *block, const string &msg)
+{
+ set_status(msg);
+ if(block)
+ {
+ TrackChain3D *tch3d = new TrackChain3D(layout_3d, *block);
+ tch3d->set_color(GL::Color(1.0f, 0.0f, 0.0f));
+ tch3d->set_layer(2);
+ emergencies.push_back(tch3d);
+ }
+}
+
+void Engineer::halt_event(bool h)
+{
+ if(!h)
+ {
+ for(list<TrackChain3D *>::iterator i=emergencies.begin(); i!=emergencies.end(); ++i)
+ delete *i;
+ emergencies.clear();
+ }
+}
+
+void Engineer::locomotive_detected(const Driver::DetectedLocomotive &loco)
+{
+ if(!import_active)
+ {
+ NewTrainDialog *dlg = new NewTrainDialog(*this);
+ dlg->prefill(loco);
+ dlg->signal_response.connect(sigc::mem_fun(this, &Engineer::import_finished));
+ root->add(*dlg);
+ import_active = true;
+ }
+}
+
+void Engineer::import_finished(int)
+{
+ import_active = false;