]> git.tdb.fi Git - r2c2.git/blobdiff - source/engineer/controlpanel.cpp
Complete rewrite of the engineer UI
[r2c2.git] / source / engineer / controlpanel.cpp
diff --git a/source/engineer/controlpanel.cpp b/source/engineer/controlpanel.cpp
new file mode 100644 (file)
index 0000000..e81d25c
--- /dev/null
@@ -0,0 +1,85 @@
+#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();
+}