]> git.tdb.fi Git - r2c2.git/blobdiff - source/engineer/engineer.cpp
Complete rewrite of the engineer UI
[r2c2.git] / source / engineer / engineer.cpp
index 9a3b930a01da1b55137c9a45b9279672f3d44565..61dd49a1c72d86136baa9fd462e05b2458b398e5 100644 (file)
@@ -23,9 +23,8 @@
 #include "3d/track.h"
 #include "3d/vehicle.h"
 #include "engineer.h"
-#include "mainpanel.h"
-#include "trainpanel.h"
-#include "trainproperties.h"
+#include "mainwindow.h"
+#include "traindialog.h"
 #include "trainview.h"
 
 using namespace std;
@@ -52,15 +51,15 @@ Engineer::Engineer(int argc, char **argv):
        window.set_title("Railroad Engineer");
        window.signal_close.connect(sigc::bind(sigc::mem_fun(this, &Engineer::exit), 0));
 
-       root = new GLtk::Root(ui_res, window);
+       root = new GLtk::Root(ui_res, &window, &keyboard, &mouse);
        mouse.signal_button_press.connect(sigc::bind_return(sigc::mem_fun(this, &Engineer::button_press), false));
        mouse.signal_axis_motion.connect(sigc::bind_return(sigc::mem_fun(this, &Engineer::axis_motion), false));
        root->set_visible(true);
 
-       main_panel = new MainPanel(*this);
-       root->add(*main_panel);
-       main_panel->set_position(0, window.get_height()-main_panel->get_geometry().h);
-       main_panel->set_visible(true);
+       main_wnd = new MainWindow(*this);
+       root->add(*main_wnd);
+       main_wnd->autosize();
+       main_wnd->set_position(0, window.get_height()-main_wnd->get_geometry().h);
 
        overlay = new Overlay3D(ui_res.get_default_font());
 
@@ -141,20 +140,10 @@ Engineer::~Engineer()
 
 void Engineer::set_status(const string &text)
 {
-       main_panel->set_status_text(text);
+       main_wnd->set_status_text(text);
        status_timeout = Time::now()+10*Time::sec;
 }
 
-void Engineer::rearrange_panels()
-{
-       int y = main_panel->get_geometry().y;
-       for(list<TrainPanel *>::iterator i=train_panels.begin(); i!=train_panels.end(); ++i)
-       {
-               y -= (*i)->get_geometry().h;
-               (*i)->set_position(0, y);
-       }
-}
-
 void Engineer::add_train_view(TrainView &tv)
 {
        train_views.push_back(&tv);
@@ -195,7 +184,7 @@ void Engineer::tick()
 
        if(status_timeout && Time::now()>status_timeout)
        {
-               main_panel->set_status_text(string());
+               main_wnd->set_status_text(string());
                status_timeout = Time::TimeStamp();
        }
 
@@ -209,7 +198,7 @@ void Engineer::tick()
 
                if(picking)
                {
-                       Track *track = pick_track(pointer);
+                       Track *track = dynamic_cast<Track *>(pick_object(pointer));
                        if(track && track!=picking_track)
                        {
                                picking_track = track;
@@ -265,8 +254,8 @@ void Engineer::button_press(unsigned btn)
        }
        else
        {
-               Track *track = pick_track(pointer);
-               if(track)
+               Object *obj = pick_object(pointer);
+               if(Track *track = dynamic_cast<Track *>(obj))
                {
                        if(track->get_turnout_id())
                        {
@@ -295,6 +284,12 @@ void Engineer::button_press(unsigned btn)
                                set_status(format("Sensor %d", sid));
                        }
                }
+               else if(Vehicle *veh = dynamic_cast<Vehicle *>(obj))
+               {
+                       TrainDialog *dlg = new TrainDialog(*this, *veh->get_train());
+                       root->add(*dlg);
+                       dlg->autosize();
+               }
        }
 }
 
@@ -311,7 +306,7 @@ void Engineer::view_all()
 {
        const Layout3D::TrackMap &tracks = layout_3d.get_tracks();
 
-       float view_aspect = float(window.get_width()-200)/window.get_height();
+       float view_aspect = float(window.get_width())/window.get_height();
        float view_height = tan(camera.get_field_of_view()/2.0f)*2.0f;
        float best_score = 0;
        GL::Vector3 pos;
@@ -338,7 +333,7 @@ void Engineer::view_all()
                        float size = max(width/view_aspect, height);
                        float c = cos(angle);
                        float s = sin(angle);
-                       float x = (minp.x+maxp.x)/2-size*105/window.get_height();
+                       float x = (minp.x+maxp.x)/2;
                        float y = (minp.y+maxp.y)/2;
                        float z = max(size*1.05/view_height, 0.15);
 
@@ -383,21 +378,19 @@ void Engineer::reset_block_color(const Block &block)
                set_block_color(block, GL::Color(1));
 }
 
-Track *Engineer::pick_track(const Vector &p)
+Object *Engineer::pick_object(const Vector &p)
 {
        const GL::Vector3 &start = camera.get_position();
        GL::Vector4 ray = camera.unproject(GL::Vector4(p.x, p.y, 0, 0));
 
+       // XXX Do this better; make this function a template?
+       if(Vehicle *veh = layout.pick<Vehicle>(Ray(start, Vector(ray))))
+               return veh;
        return layout.pick<Track>(Ray(start, Vector(ray)));
 }
 
 void Engineer::process_new_train(Train &train)
 {
-       TrainPanel *tpanel = new TrainPanel(*this, train);
-       root->add(*tpanel);
-       train_panels.push_back(tpanel);
-       rearrange_panels();
-
        Vehicle3D &loco3d = layout_3d.get_vehicle(train.get_vehicle(0));
        overlay->set_label(loco3d, train.get_name());
        train.signal_name_changed.connect(sigc::bind<0>(sigc::mem_fun(overlay, &Overlay3D::set_label), sigc::ref(loco3d)));