]> git.tdb.fi Git - r2c2.git/blobdiff - source/engineer/trainview.cpp
Complete rewrite of the engineer UI
[r2c2.git] / source / engineer / trainview.cpp
index dffa04dde651be1768bda8b6ee20ed9cf4840ab6..ad534acee085872161d030ae6742fc909029a330 100644 (file)
@@ -1,6 +1,9 @@
+#include <msp/core/maputils.h>
 #include <msp/gl/tests.h>
 #include <msp/gltk/button.h>
 #include <msp/gltk/image.h>
+#include <msp/gltk/label.h>
+#include <msp/strings/format.h>
 #include "libr2c2/vehicle.h"
 #include "libr2c2/vehicletype.h"
 #include "engineer.h"
@@ -14,16 +17,22 @@ TrainView::TrainView(Engineer &e, const Train &t):
        train(t),
        mode(SIDE),
        forward(true),
-       pipeline(280, 280, false),
-       stale(false)
+       pipeline(400, 300, false)
 {
-       set_size(300, 330);
+       Loader::WidgetMap widgets;
+       DataFile::load(*this, "data/trainview.ui", widgets);
+
+       dynamic_cast<GLtk::Label *>(get_item(widgets, "lbl_title"))->set_text(format("View of %s", train.get_name()));
+       dynamic_cast<GLtk::Toggle *>(get_item(widgets, "tgl_forward"))->signal_toggled.connect(sigc::mem_fun(this, &TrainView::set_forward));
+       dynamic_cast<GLtk::Toggle *>(get_item(widgets, "tgl_roof"))->signal_toggled.connect(sigc::bind(sigc::mem_fun(this, &TrainView::ui_mode_toggled), ROOF));
+       dynamic_cast<GLtk::Toggle *>(get_item(widgets, "tgl_side"))->signal_toggled.connect(sigc::bind(sigc::mem_fun(this, &TrainView::ui_mode_toggled), SIDE));
+       dynamic_cast<GLtk::Toggle *>(get_item(widgets, "tgl_head"))->signal_toggled.connect(sigc::bind(sigc::mem_fun(this, &TrainView::ui_mode_toggled), HEAD));
 
        tex.set_min_filter(GL::LINEAR);
-       tex.storage(GL::RGB, 280, 280);
+       tex.storage(GL::RGB, 400, 300);
        tex.image(0, GL::RGB, GL::UNSIGNED_BYTE, 0);
        fbo.attach(GL::COLOR_ATTACHMENT0, tex, 0);
-       depth.storage(GL::DEPTH_COMPONENT, 280, 280);
+       depth.storage(GL::DEPTH_COMPONENT, 400, 300);
        fbo.attach(GL::DEPTH_ATTACHMENT, depth);
 
        camera.set_up_direction(GL::Vector3(0, 0, 1));
@@ -37,32 +46,7 @@ TrainView::TrainView(Engineer &e, const Train &t):
        pass->set_depth_test(&GL::DepthTest::lequal());
        pass->set_lighting(&engineer.get_lighting());
 
-       GLtk::Image *image;
-       add(*(image = new GLtk::Image(&tex)));
-       image->set_geometry(GLtk::Geometry(10, 40, geom.w-20, geom.h-50));
-
-       GLtk::Button *btn;
-
-       add(*(btn = new GLtk::Button("Roof")));
-       btn->set_geometry(GLtk::Geometry(10, 10, 36, 25));
-       btn->signal_clicked.connect(sigc::bind(sigc::mem_fun(this, &TrainView::set_mode), ROOF));
-
-       add(*(btn = new GLtk::Button("Side")));
-       btn->set_geometry(GLtk::Geometry(46, 10, 36, 25));
-       btn->signal_clicked.connect(sigc::bind(sigc::mem_fun(this, &TrainView::set_mode), SIDE));
-
-       add(*(btn = new GLtk::Button("Head")));
-       btn->set_geometry(GLtk::Geometry(82, 10, 36, 25));
-       btn->signal_clicked.connect(sigc::bind(sigc::mem_fun(this, &TrainView::set_mode), HEAD));
-
-       add(*(tgl_forward = new GLtk::Toggle("Fwd")));
-       tgl_forward->set_geometry(GLtk::Geometry(118, 8, 36, 27));
-       tgl_forward->set_value(true);
-       tgl_forward->signal_toggled.connect(sigc::mem_fun(this, &TrainView::set_forward));
-
-       add(*(btn = new GLtk::Button("Close")));
-       btn->set_geometry(GLtk::Geometry(geom.w-46, 10, 36, 25));
-       btn->signal_clicked.connect(sigc::mem_fun(this, &TrainView::close_clicked));
+       dynamic_cast<GLtk::Image *>(get_item(widgets, "img_view"))->set_image(&tex);
 
        engineer.add_train_view(*this);
 }
@@ -77,6 +61,12 @@ void TrainView::set_mode(Mode m)
        mode = m;
 }
 
+void TrainView::ui_mode_toggled(bool v, Mode m)
+{
+       if(v)
+               set_mode(m);
+}
+
 void TrainView::set_forward(bool f)
 {
        forward = f;
@@ -113,15 +103,3 @@ void TrainView::prepare()
        fbo.clear(GL::COLOR_BUFFER_BIT|GL::DEPTH_BUFFER_BIT);
        pipeline.render();
 }
-
-void TrainView::button_release(int x, int y, unsigned btn)
-{
-       GLtk::Panel::button_release(x, y, btn);
-       if(stale)
-               delete this;
-}
-
-void TrainView::close_clicked()
-{
-       stale = true;
-}