]> git.tdb.fi Git - r2c2.git/blobdiff - source/engineer/trainpanel.cpp
Support taking trains off the tracks
[r2c2.git] / source / engineer / trainpanel.cpp
index 7177489be5e990574ed8be934b33ea169d0d863a..75024dcac300f1a7abc65e65ff7e8e0562c4104a 100644 (file)
@@ -26,44 +26,44 @@ TrainPanel::TrainPanel(Engineer &e, const GLtk::Resources &r, Train &t):
        engineer(e),
        train(t)
 {
-       set_size(200, 170);
+       set_size(200, 175);
 
        train.signal_control_changed.connect(sigc::mem_fun(this, &TrainPanel::train_control_changed));
 
        add(*(lbl_addr=new GLtk::Label(res, format("%2d", train.get_address()))));
        lbl_addr->set_style("digital");
-       lbl_addr->set_geometry(GLtk::Geometry(10, geom.h-34, 35, 24));
+       lbl_addr->set_geometry(GLtk::Geometry(10, geom.h-30, 35, 20));
 
        add(*(lbl_name=new GLtk::Label(res, train.get_name())));
        lbl_name->set_style("digital");
-       lbl_name->set_geometry(GLtk::Geometry(45, geom.h-34, geom.w-55, 24));
+       lbl_name->set_geometry(GLtk::Geometry(50, geom.h-30, geom.w-55, 20));
        train.signal_name_changed.connect(sigc::mem_fun(lbl_name, &GLtk::Label::set_text));
 
        add(*(lbl_speed=new GLtk::Label(res, "  0")));
        lbl_speed->set_style("digital");
-       lbl_speed->set_geometry(GLtk::Geometry(10, geom.h-58, 35, 24));
+       lbl_speed->set_geometry(GLtk::Geometry(10, geom.h-55, 35, 20));
 
        add(*(sld_speed=new GLtk::HSlider(res)));
-       sld_speed->set_geometry(GLtk::Geometry(50, geom.h-51, geom.w-80, 10));
+       sld_speed->set_geometry(GLtk::Geometry(50, geom.h-50, geom.w-80, 10));
        sld_speed->set_range(0, 200);
        sld_speed->set_step(5);
        sld_speed->signal_value_changed.connect(sigc::mem_fun(this, &TrainPanel::speed_slider_changed));
 
        add(*(tgl_forward=new GLtk::Toggle(res)));
        tgl_forward->set_text("Fwd");
-       tgl_forward->set_geometry(GLtk::Geometry(geom.w-30, geom.h-59, 20, 27));
+       tgl_forward->set_geometry(GLtk::Geometry(geom.w-30, geom.h-58, 20, 27));
        tgl_forward->set_value(true);
        tgl_forward->signal_toggled.connect(sigc::mem_fun(this, &TrainPanel::forward_toggled));
 
        const Route *route = train.get_route();
        add(*(lbl_route=new GLtk::Label(res, (route ? route->get_name() : "Free run"))));
        lbl_route->set_style("digital");
-       lbl_route->set_geometry(GLtk::Geometry(10, 58, geom.w-20, 24));
+       lbl_route->set_geometry(GLtk::Geometry(10, 65, geom.w-20, 20));
        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));
+       lbl_status->set_geometry(GLtk::Geometry(10, 40, geom.w-20, 20));
        train.signal_status_changed.connect(sigc::mem_fun(this, &TrainPanel::train_status_changed));
 
        const map<unsigned, string> &funcs = train.get_locomotive_type().get_functions();
@@ -75,7 +75,7 @@ TrainPanel::TrainPanel(Engineer &e, const GLtk::Resources &r, Train &t):
                GLtk::Toggle *tgl;
                add(*(tgl=new GLtk::Toggle(res)));
                tgl->set_text(fname);
-               tgl->set_geometry(GLtk::Geometry(x, geom.h-85, 36, 27));
+               tgl->set_geometry(GLtk::Geometry(x, geom.h-87, 36, 27));
                tgl->set_value(train.get_function(i->first));
                tgl->signal_toggled.connect(sigc::bind(sigc::mem_fun(this, &TrainPanel::func_toggled), i->first));
 
@@ -86,44 +86,36 @@ TrainPanel::TrainPanel(Engineer &e, const GLtk::Resources &r, Train &t):
        GLtk::Button *btn;
 
        add(*(btn=new GLtk::Button(res, "Edit")));
-       btn->set_geometry(GLtk::Geometry(geom.w-46, 10, 36, 24));
+       btn->set_geometry(GLtk::Geometry(geom.w-46, 10, 36, 25));
        btn->signal_clicked.connect(sigc::mem_fun(this, &TrainPanel::edit_clicked));
 
        add(*(btn=new GLtk::Button(res, "Place")));
-       btn->set_geometry(GLtk::Geometry(geom.w-82, 10, 36, 24));
+       btn->set_geometry(GLtk::Geometry(geom.w-82, 10, 36, 25));
        btn->signal_clicked.connect(sigc::mem_fun(this, &TrainPanel::place_clicked));
 
        add(*(btn=new GLtk::Button(res, "GoTo")));
-       btn->set_geometry(GLtk::Geometry(geom.w-118, 10, 36, 24));
+       btn->set_geometry(GLtk::Geometry(geom.w-118, 10, 36, 25));
        btn->signal_clicked.connect(sigc::mem_fun(this, &TrainPanel::goto_clicked));
 
        add(*(btn=new GLtk::Button(res, "Route")));
-       btn->set_geometry(GLtk::Geometry(geom.w-154, 10, 36, 24));
+       btn->set_geometry(GLtk::Geometry(geom.w-154, 10, 36, 25));
        btn->signal_clicked.connect(sigc::mem_fun(this, &TrainPanel::route_clicked));
 
        add(*(btn=new GLtk::Button(res, "TTbl")));
-       btn->set_geometry(GLtk::Geometry(geom.w-190, 10, 36, 24));
+       btn->set_geometry(GLtk::Geometry(geom.w-190, 10, 36, 25));
        btn->signal_clicked.connect(sigc::mem_fun(this, &TrainPanel::timetable_clicked));
 }
 
-void TrainPanel::speed_slider_changed(double value)
-{
-       float speed = value/3.6*engineer.get_layout().get_catalogue().get_scale();
-       if(!tgl_forward->get_value())
-               speed = -speed;
-       train.set_control("speed", speed);
-}
-
 void TrainPanel::train_control_changed(const string &control, float value)
 {
        if(control=="speed")
        {
-               float speed = abs(value)/engineer.get_layout().get_catalogue().get_scale()*3.6;
+               float speed = value/engineer.get_layout().get_catalogue().get_scale()*3.6;
                sld_speed->set_value(speed);
                lbl_speed->set_text(format("%3.0f", speed));
-               if(value)
-                       tgl_forward->set_value(value>0);
        }
+       else if(control=="reverse")
+               tgl_forward->set_value(value==0);
 }
 
 void TrainPanel::train_function_changed(unsigned func, bool value)
@@ -188,9 +180,21 @@ void TrainPanel::timetable_clicked()
        dialog->set_position(geom.x+geom.w, geom.y+geom.h-dialog->get_geometry().h);
 }
 
-void TrainPanel::forward_toggled(bool /*value*/)
+void TrainPanel::speed_slider_changed(double value)
 {
-       train.set_control("speed", 0);
+       float speed = value/3.6*engineer.get_layout().get_catalogue().get_scale();
+       train.set_control("speed", speed);
+}
+
+void TrainPanel::forward_toggled(bool value)
+{
+       if(train.get_speed() || sld_speed->get_value())
+       {
+               train.set_control("speed", 0);
+               tgl_forward->set_value(!train.get_control("reverse"));
+       }
+       else
+               train.set_control("reverse", !value);
 }
 
 void TrainPanel::func_toggled(bool value, unsigned func)