#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;
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());
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);
if(status_timeout && Time::now()>status_timeout)
{
- main_panel->set_status_text(string());
+ main_wnd->set_status_text(string());
status_timeout = Time::TimeStamp();
}
if(picking)
{
- Track *track = pick_track(pointer);
+ Track *track = dynamic_cast<Track *>(pick_object(pointer));
if(track && track!=picking_track)
{
picking_track = track;
}
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())
{
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();
+ }
}
}
{
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;
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);
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)));