]> git.tdb.fi Git - r2c2.git/blobdiff - source/engineer/trainpanel.cpp
Support setting routes for trains
[r2c2.git] / source / engineer / trainpanel.cpp
index be675d6b8a2e4582c65390cc121d16acccf935f9..d462b5139c85f192d7bf747523c3b4e40fca1cdd 100644 (file)
@@ -9,6 +9,7 @@ Distributed under the GPL
 #include <msp/strings/formatter.h>
 #include "libmarklin/locomotive.h"
 #include "engineer.h"
+#include "routeselect.h"
 #include "trainpanel.h"
 #include "trainproperties.h"
 
@@ -22,7 +23,7 @@ TrainPanel::TrainPanel(Engineer &e, const GLtk::Resources &r, Train &t):
        engineer(e),
        train(t)
 {
-       set_size(200, 145);
+       set_size(200, 170);
 
        add(*(lbl_addr=new GLtk::Label(res, format("%2d", train.get_locomotive().get_address()))));
        lbl_addr->set_style("digital");
@@ -50,6 +51,11 @@ TrainPanel::TrainPanel(Engineer &e, const GLtk::Resources &r, Train &t):
        tgl_forward->set_value(!train.get_locomotive().get_reverse());
        tgl_forward->signal_toggled.connect(sigc::mem_fun(this, &TrainPanel::forward_toggled));
 
+       add(*(lbl_route=new GLtk::Label(res, "Free run")));
+       lbl_route->set_style("digital");
+       lbl_route->set_geometry(GLtk::Geometry(10, 58, geom.w-20, 24));
+       train.signal_route_changed.connect(sigc::mem_fun(this, &TrainPanel::train_route_changed));
+
        add(*(lbl_status=new GLtk::Label(res, train.get_status())));
        lbl_status->set_style("digital");
        lbl_status->set_geometry(GLtk::Geometry(10, 34, geom.w-20, 24));
@@ -84,6 +90,10 @@ 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));
+
+       add(*(btn=new GLtk::Button(res, "Route")));
+       btn->set_geometry(GLtk::Geometry(geom.w-170, 10, 40, 24));
+       btn->signal_clicked.connect(sigc::mem_fun(this, &TrainPanel::route_clicked));
 }
 
 void TrainPanel::speed_slider_changed(double v)
@@ -104,6 +114,14 @@ void TrainPanel::loco_function_changed(unsigned func, bool value)
                i->second->set_value(value);
 }
 
+void TrainPanel::train_route_changed(const Route *r)
+{
+       if(r)
+               lbl_route->set_text(r->get_name());
+       else
+               lbl_route->set_text("Free run");
+}
+
 void TrainPanel::train_status_changed(const string &s)
 {
        lbl_status->set_text(s);
@@ -122,6 +140,14 @@ void TrainPanel::edit_clicked()
        dialog->set_visible(true);
 }
 
+void TrainPanel::route_clicked()
+{
+       RouteSelect *dialog = new RouteSelect(engineer, res, train);
+       engineer.get_root().add(*dialog);
+       dialog->set_position(geom.x+geom.w, geom.y+geom.h-dialog->get_geometry().h);
+       dialog->set_visible(true);
+}
+
 void TrainPanel::forward_toggled(bool value)
 {
        train.set_reverse(!value);