]> git.tdb.fi Git - r2c2.git/blobdiff - source/engineer/traindialog.cpp
Persist most dialogs across runs
[r2c2.git] / source / engineer / traindialog.cpp
index 4d1d492099cf69a760eeeaff71a4aa10c4616840..985d4c94ea09eca8bb358e516c19b5641b58619e 100644 (file)
@@ -1,5 +1,7 @@
 #include <msp/core/maputils.h>
 #include <msp/core/raii.h>
+#include <msp/gltk/part.h>
+#include <msp/gltk/root.h>
 #include <msp/gltk/stack.h>
 #include <msp/strings/format.h>
 #include "libr2c2/aicontrol.h"
@@ -7,7 +9,9 @@
 #include "libr2c2/layout.h"
 #include "libr2c2/trainstatus.h"
 #include "controlpanel.h"
+#include "engineer.h"
 #include "routerpanel.h"
+#include "timetablepanel.h"
 #include "traindialog.h"
 #include "vehiclespanel.h"
 
@@ -16,6 +20,7 @@ using namespace Msp;
 using namespace R2C2;
 
 TrainDialog::TrainDialog(Engineer &e, R2C2::Train &t):
+       DynamicDialog(e.get_user_interface()),
        engineer(e),
        train(t),
        updating(false)
@@ -30,6 +35,9 @@ TrainDialog::TrainDialog(Engineer &e, R2C2::Train &t):
        btn_expand->signal_clicked.connect(sigc::mem_fun(this, &TrainDialog::expand_clicked));
        lbl_speed = dynamic_cast<GLtk::Label *>(get_item(widgets, "lbl_speed"));
        sld_speed = dynamic_cast<GLtk::Slider *>(get_item(widgets, "sld_speed"));
+       float max_speed = train.get_maximum_speed();
+       if(max_speed>0)
+               sld_speed->set_range(0, max_speed*3.6/train.get_layout().get_catalogue().get_scale());
        sld_speed->signal_value_changed.connect(sigc::mem_fun(this, &TrainDialog::ui_speed_changed));
        tgl_forward = dynamic_cast<GLtk::Toggle *>(get_item(widgets, "tgl_forward"));
        tgl_forward->signal_toggled.connect(sigc::mem_fun(this, &TrainDialog::ui_forward_toggled));
@@ -55,6 +63,11 @@ TrainDialog::TrainDialog(Engineer &e, R2C2::Train &t):
        panels.push_back(pnl);
        dynamic_cast<GLtk::Toggle *>(get_item(widgets, "tgl_router"))->signal_toggled.connect(sigc::bind(sigc::mem_fun(this, &TrainDialog::toggle_panel), pnl));
 
+       pnl_expander->add(*(pnl = new TimetablePanel(engineer, train)));
+       pnl->set_visible(false);
+       panels.push_back(pnl);
+       dynamic_cast<GLtk::Toggle *>(get_item(widgets, "tgl_timetable"))->signal_toggled.connect(sigc::bind(sigc::mem_fun(this, &TrainDialog::toggle_panel), pnl));
+
        AIControl *control = train.get_ai_of_type<AIControl>();
        if(!control)
                control = new AIControl(train);
@@ -69,6 +82,19 @@ TrainDialog::TrainDialog(Engineer &e, R2C2::Train &t):
        train.signal_ai_event.connect(sigc::mem_fun(this, &TrainDialog::ai_event));
 }
 
+void TrainDialog::autosize_special(const GLtk::Part &part, GLtk::Geometry &ageom) const
+{
+       GLtk::Dialog::autosize_special(part, ageom);
+
+       if(part.get_name()=="children")
+       {
+               GLtk::Geometry egeom;
+               pnl_expander->autosize(egeom);
+               const GLtk::Sides &margin = layout->get_margin();
+               ageom.w = max(ageom.w, margin.left+margin.right+egeom.w);
+       }
+}
+
 void TrainDialog::ai_event(TrainAI &, const TrainAI::Message &msg)
 {
        if(msg.type=="status-changed")
@@ -110,16 +136,40 @@ void TrainDialog::ui_forward_toggled(bool value)
 
 void TrainDialog::expand_clicked()
 {
-       pnl_expander->set_visible(!pnl_expander->is_visible());
-       btn_expand->set_style(pnl_expander->is_visible() ? "arrow_up" : "arrow_down");
-       GLtk::Geometry ageom = geom;
-       ageom.h = 0;
-       layout->autosize(ageom);
-       ageom.y = geom.y+geom.h-ageom.h;
-       set_geometry(ageom);
+       set_expanded(!pnl_expander->is_visible());
+}
+
+void TrainDialog::set_expanded(bool e)
+{
+       pnl_expander->set_visible(e);
+       btn_expand->set_style(e ? "arrow_up" : "arrow_down");
+       signal_autosize_changed.emit();
+       find_ancestor<GLtk::Root>()->get_layout()->update();
 }
 
 void TrainDialog::toggle_panel(bool show, GLtk::Panel *panel)
 {
        panel->set_visible(show);
 }
+
+bool TrainDialog::save_state(DataFile::Statement &st) const
+{
+       st.keyword = "traindialog";
+       st.append(train.get_address());
+       st.sub.push_back((DataFile::Statement("expanded"), pnl_expander->is_visible()));
+       save_position(st.sub);
+
+       return true;
+}
+
+
+TrainDialog::StateLoader::StateLoader(TrainDialog &td):
+       DataFile::DerivedObjectLoader<TrainDialog, DynamicDialog::StateLoader>(td)
+{
+       add("expanded", &StateLoader::expanded);
+}
+
+void TrainDialog::StateLoader::expanded(bool e)
+{
+       obj.set_expanded(e);
+}