1 #include <msp/core/maputils.h>
2 #include <msp/strings/format.h>
3 #include "libr2c2/catalogue.h"
4 #include "libr2c2/driver.h"
5 #include "libr2c2/layout.h"
6 #include "libr2c2/vehicletype.h"
8 #include "newtraindialog.h"
9 #include "traindialog.h"
15 static string vehicle_type_name(const VehicleType *const &vehtype)
17 return format("%s %s", vehtype->get_article_number(), vehtype->get_name());
20 NewTrainDialog::NewTrainDialog(Engineer &e):
22 loco_types(vehicle_type_name)
24 Loader::WidgetMap widgets;
25 DataFile::load(*this, "data/newtraindialog.ui", widgets);
27 drp_protocol = dynamic_cast<GLtk::Dropdown *>(get_item(widgets, "drp_protocol"));
28 drp_protocol->set_data(protocols);
29 ent_address = dynamic_cast<GLtk::Entry *>(get_item(widgets, "ent_address"));
30 ent_name = dynamic_cast<GLtk::Entry *>(get_item(widgets, "ent_name"));
31 drp_loco_type = dynamic_cast<GLtk::Dropdown *>(get_item(widgets, "drp_loco_type"));
32 drp_loco_type->set_data(loco_types);
34 const Driver &driver = engineer.get_layout().get_driver();
35 for(unsigned i=0;; ++i)
37 if(const char *proto = driver.enumerate_protocols(i))
38 protocols.append(proto);
43 drp_protocol->set_selected_index(0);
45 list<VehicleType *> veh_types = engineer.get_layout().get_catalogue().get_list<VehicleType>();
46 for(list<VehicleType *>::iterator i=veh_types.begin(); i!=veh_types.end(); ++i)
47 if((*i)->is_locomotive())
48 loco_types.append(*i);
51 void NewTrainDialog::prefill(const Driver::DetectedLocomotive &loco)
53 drp_protocol->set_selected_index(protocols.find(loco.protocol));
54 ent_address->set_text(lexical_cast<string>(loco.address));
55 ent_name->set_text(loco.name);
58 void NewTrainDialog::on_response(int code)
62 int index = drp_protocol->get_selected_index();
65 string protocol = protocols.get(index);
67 unsigned address = lexical_cast<unsigned>(ent_address->get_text());
69 index = drp_loco_type->get_selected_index();
72 const VehicleType &type = *loco_types.get(index);
74 Train *train = new Train(engineer.get_layout(), type, address, protocol);
75 train->set_name(ent_name->get_text());
77 TrainDialog *dlg = new TrainDialog(engineer, *train);
78 find_ancestor<GLtk::Root>()->add(*dlg);