--- /dev/null
+#include <msp/core/maputils.h>
+#include <msp/core/raii.h>
+#include <msp/gltk/button.h>
+#include <msp/gltk/label.h>
+#include <msp/gltk/row.h>
+#include "libr2c2/vehicle.h"
+#include "controlpanel.h"
+#include "engineer.h"
+#include "trainview.h"
+
+using namespace std;
+using namespace Msp;
+using namespace R2C2;
+
+ControlPanel::ControlPanel(Engineer &e, Train &t):
+ engineer(e),
+ train(t),
+ updating(false)
+{
+ Loader::WidgetMap widgets;
+ DataFile::load(*this, "data/controlpanel.ui", widgets);
+
+ dynamic_cast<GLtk::Label *>(get_item(widgets, "lbl_protocol"))->set_text(train.get_protocol());
+ dynamic_cast<GLtk::Label *>(get_item(widgets, "lbl_address"))->set_text(lexical_cast<string>(train.get_address()));
+
+ dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_place"))->signal_clicked.connect(sigc::mem_fun(this, &ControlPanel::place_clicked));
+ dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_take"))->signal_clicked.connect(sigc::mem_fun(this, &ControlPanel::take_clicked));
+ dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_view"))->signal_clicked.connect(sigc::mem_fun(this, &ControlPanel::view_clicked));
+
+ GLtk::Panel *pnl_functions = dynamic_cast<GLtk::Panel *>(get_item(widgets, "pnl_functions"));
+
+ const VehicleType::FunctionMap &funcs = train.get_vehicle(0).get_type().get_functions();
+ GLtk::Row row(*pnl_functions->get_layout());
+ for(VehicleType::FunctionMap::const_iterator i=funcs.begin(); i!=funcs.end(); ++i)
+ {
+ GLtk::Toggle *tgl = new GLtk::Toggle(i->second);
+ tgl->signal_toggled.connect(sigc::bind(sigc::mem_fun(this, &ControlPanel::ui_function_toggled), i->first));
+ pnl_functions->add(*tgl);
+ tgl_funcs[i->first] = tgl;
+ }
+
+ train.signal_function_changed.connect(sigc::mem_fun(this, &ControlPanel::train_function_changed));
+}
+
+void ControlPanel::ui_function_toggled(bool value, unsigned func)
+{
+ if(!updating)
+ train.set_function(func, value);
+}
+
+void ControlPanel::train_function_changed(unsigned func, bool value)
+{
+ SetFlag setf(updating);
+ map<unsigned, GLtk::Toggle *>::iterator i = tgl_funcs.find(func);
+ if(i!=tgl_funcs.end())
+ i->second->set_value(value);
+}
+
+void ControlPanel::place_clicked()
+{
+ pick_conn = engineer.signal_pick_done.connect(sigc::mem_fun(this, &ControlPanel::place_pick_done));
+ engineer.pick(true);
+}
+
+void ControlPanel::place_pick_done(Track *track, unsigned ep)
+{
+ pick_conn.disconnect();
+ train.place(TrackIter(track, ep).block_iter());
+}
+
+void ControlPanel::take_clicked()
+{
+ train.unplace();
+}
+
+void ControlPanel::view_clicked()
+{
+ GLtk::Container *root = parent;
+ while(root->get_parent())
+ root = root->get_parent();
+
+ TrainView *dlg = new TrainView(engineer, train);
+ root->add(*dlg);
+ dlg->autosize();
+}