+ engineer.pick(true);
+ pick_conn = engineer.signal_pick_done.connect(sigc::mem_fun(this, &TrainPanel::place));
+}
+
+void TrainPanel::take_clicked()
+{
+ train.unplace();
+}
+
+void TrainPanel::edit_clicked()
+{
+ TrainProperties *dialog = new TrainProperties(engineer, &train);
+ engineer.get_root().add(*dialog);
+ dialog->set_position(geom.x+geom.w, geom.y+geom.h-dialog->get_geometry().h);
+}
+
+void TrainPanel::route_clicked()
+{
+ RouteSelect *dialog = new RouteSelect(engineer, train);
+ engineer.get_root().add(*dialog);
+ dialog->set_position(geom.x+geom.w, geom.y+geom.h-dialog->get_geometry().h);
+}
+
+void TrainPanel::goto_clicked()
+{
+ engineer.pick(false);
+ pick_conn = engineer.signal_pick_done.connect(sigc::mem_fun(this, &TrainPanel::go_to));
+}
+
+void TrainPanel::view_clicked()
+{
+ TrainView *dialog = new TrainView(engineer, train);
+ engineer.get_root().add(*dialog);
+ dialog->set_position(geom.x+geom.w, geom.y+geom.h-dialog->get_geometry().h);
+}
+
+void TrainPanel::expand_clicked()
+{
+ expand(!expanded);
+}
+
+void TrainPanel::speed_slider_changed(double value)
+{
+ float speed = value/3.6*engineer.get_layout().get_catalogue().get_scale();
+ train.ai_message(TrainAI::Message("set-target-speed", speed));
+}
+
+void TrainPanel::forward_toggled(bool value)
+{
+ train.ai_message(TrainAI::Message("set-reverse", !value));
+}
+
+void TrainPanel::func_toggled(bool value, unsigned func)
+{
+ train.set_function(func, value);
+}
+
+void TrainPanel::place(Track *track, unsigned ep)
+{
+ pick_conn.disconnect();
+
+ BlockIter block = TrackIter(track, ep).block_iter();
+ if(block)
+ train.place(block);
+}
+
+void TrainPanel::go_to(Track *track, unsigned)
+{
+ pick_conn.disconnect();
+
+ TrainRouter *router = train.get_ai_of_type<TrainRouter>();
+ if(router)
+ router->set_destination(track->get_block());