X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fengineer%2Fengineer.cpp;h=ea87df659d7e3a7b33ccff8ed519a866295cd993;hb=ae0600f7c3df5b6ef46992b1423888dd0e9a5026;hp=3ac7c7682a605cc06942c23cfee7607db157259c;hpb=1d735b80482317fd930eb47ca255ab9f1f120a7d;p=r2c2.git diff --git a/source/engineer/engineer.cpp b/source/engineer/engineer.cpp index 3ac7c76..ea87df6 100644 --- a/source/engineer/engineer.cpp +++ b/source/engineer/engineer.cpp @@ -1,3 +1,10 @@ +/* $Id$ + +This file is part of the MSP Märklin suite +Copyright © 2006-2008 Mikkosoft Productions, Mikko Rasa +Distributed under the GPL +*/ + #include #include #include @@ -71,6 +78,7 @@ Engineer::Engineer(int argc, char **argv): layout_3d.set_quality(quality); catalogue.load("tracks.dat"); + catalogue.load("locos.dat"); const vector &args=getopt.get_args(); if(args.empty()) @@ -92,39 +100,40 @@ Engineer::~Engineer() delete trfc_mgr; } -Train *Engineer::add_train(unsigned addr) +void Engineer::add_train() { - if(addr==0) - { - train_prop=new TrainProperties(*this, ui_res, 0); - root->add(*train_prop); - train_prop->signal_ok.connect(sigc::mem_fun(this, &Engineer::dismiss_train_prop)); - train_prop_stale=false; - train_prop->set_visible(true); + train_prop=new TrainProperties(*this, ui_res, 0); + root->add(*train_prop); + train_prop->signal_ok.connect(sigc::mem_fun(this, &Engineer::dismiss_train_prop)); + train_prop_stale=false; + train_prop->set_visible(true); +} - return 0; - } - else - { - Locomotive *loco=new Locomotive(control, addr); - Train *train=new Train(*trfc_mgr, *loco); - train->set_name(format("Train %d", trfc_mgr->get_trains().size())); - - TrainPanel *tpanel=new TrainPanel(*this, ui_res, *train); - root->add(*tpanel); - int y=main_panel->get_geometry().y; - for(list::iterator i=train_panels.begin(); i!=train_panels.end(); ++i) - y-=(*i)->get_geometry().h; - tpanel->set_position(0, y-tpanel->get_geometry().h); - train_panels.push_back(tpanel); - tpanel->set_visible(true); - - placing_train=train; - placing_block=0; - main_panel->set_status_text("Select location"); - - return train; - } +Train *Engineer::add_train(const LocoType &type, unsigned addr) +{ + Locomotive *loco=new Locomotive(type, control, addr); + Train *train=new Train(*trfc_mgr, *loco); + train->set_name(format("Train %d", trfc_mgr->get_trains().size())); + + TrainPanel *tpanel=new TrainPanel(*this, ui_res, *train); + root->add(*tpanel); + int y=main_panel->get_geometry().y; + for(list::iterator i=train_panels.begin(); i!=train_panels.end(); ++i) + y-=(*i)->get_geometry().h; + tpanel->set_position(0, y-tpanel->get_geometry().h); + train_panels.push_back(tpanel); + tpanel->set_visible(true); + + place_train(*train); + + return train; +} + +void Engineer::place_train(Train &train) +{ + placing_train=&train; + placing_block=0; + main_panel->set_status_text("Select location"); } int Engineer::main() @@ -153,7 +162,7 @@ int Engineer::main() glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - DataFile::load(ui_res, "engineer.res"); + DataFile::load(ui_res, "marklin.res"); root=new GLtk::Root(ui_res, *wnd); root->set_visible(true); @@ -284,7 +293,7 @@ void Engineer::button_press(int x, int y, unsigned btn, unsigned) { if(placing_train) { - if(btn==1 && placing_block) + if(btn==1 && placing_block && !placing_block->get_train()) { set_block_color(*placing_block, GL::Color(1, 1, 1)); @@ -335,7 +344,7 @@ void Engineer::pointer_motion(int x, int y) if(&block!=placing_block) { if(placing_block) - set_block_color(*placing_block, GL::Color(1, 1, 1)); + reset_block_color(*placing_block); placing_block=█ placing_entry=0; set_block_color(*placing_block, GL::Color(0.5, 1, 0.7)); @@ -399,37 +408,37 @@ void Engineer::set_block_color(const Block &block, const GL::Color &color) layout_3d.get_track(**i).set_color(color); } -void Engineer::sensor_event(bool state, Sensor *sensor) -{ - const list <racks=layout_3d.get_tracks(); - for(list::const_iterator i=ltracks.begin(); i!=ltracks.end(); ++i) - if((*i)->get_track().get_sensor_id()==sensor->get_address()) - { - Block &block=trfc_mgr->get_block_by_track((*i)->get_track()); - if(state) - (*i)->set_color(GL::Color(1, 0.5, 0.3)); - else if(block.get_train()) - set_block_color(block, GL::Color(1, 1, 0.3)); - else - (*i)->set_color(GL::Color(1, 1, 1)); - } -} - -void Engineer::block_reserved(const Block &block, const Train *train) +void Engineer::reset_block_color(const Block &block) { if(unsigned sid=block.get_sensor_id()) { Sensor &sensor=control.get_sensor(sid); if(sensor.get_state()) + { + set_block_color(block, GL::Color(1, 0.5, 0.3)); return; + } } - if(train) + if(block.get_train()) set_block_color(block, GL::Color(1, 1, 0.3)); else set_block_color(block, GL::Color(1, 1, 1)); } +void Engineer::sensor_event(bool, Sensor *sensor) +{ + const list &blocks=trfc_mgr->get_blocks(); + for(list::const_iterator i=blocks.begin(); i!=blocks.end(); ++i) + if((*i)->get_sensor_id()==sensor->get_address()) + reset_block_color(**i); +} + +void Engineer::block_reserved(const Block &block, const Train *) +{ + reset_block_color(block); +} + void Engineer::project_3d() { glMatrixMode(GL_PROJECTION);