]> git.tdb.fi Git - r2c2.git/blob - source/engineer/vehiclespanel.cpp
Complete rewrite of the engineer UI
[r2c2.git] / source / engineer / vehiclespanel.cpp
1 #include <msp/core/maputils.h>
2 #include <msp/gltk/button.h>
3 #include <msp/strings/format.h>
4 #include "libr2c2/layout.h"
5 #include "libr2c2/vehicle.h"
6 #include "newvehicledialog.h"
7 #include "vehiclespanel.h"
8
9 using namespace std;
10 using namespace Msp;
11 using namespace R2C2;
12
13 static string vehicle_name(Vehicle *const &veh)
14 {
15         return format("%s %s", veh->get_type().get_article_number(), veh->get_type().get_name());
16 }
17
18 VehiclesPanel::VehiclesPanel(Train &t):
19         train(t),
20         vehicles(&vehicle_name)
21 {
22         Loader::WidgetMap widgets;
23         DataFile::load(*this, "data/vehiclespanel.ui", widgets);
24
25         lst_vehicles = dynamic_cast<GLtk::List *>(get_item(widgets, "lst_vehicles"));
26         //lst_vehicles->set_data(vehicles);
27
28         dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_add"))->signal_clicked.connect(sigc::mem_fun(this, &VehiclesPanel::add_clicked));
29         dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_remove"))->signal_clicked.connect(sigc::mem_fun(this, &VehiclesPanel::remove_clicked));
30
31         unsigned n_veh = train.get_n_vehicles();
32         for(unsigned i=0; i<n_veh; ++i)
33                 vehicles.append(&train.get_vehicle(i));
34
35         train.signal_vehicle_added.connect(sigc::mem_fun(this, &VehiclesPanel::vehicle_added));
36         train.signal_vehicle_removed.connect(sigc::mem_fun(this, &VehiclesPanel::vehicle_removed));
37
38         lst_vehicles->set_data(vehicles);
39 }
40
41 void VehiclesPanel::add_clicked()
42 {
43         GLtk::Container *root = parent;
44         while(root->get_parent())
45                 root = root->get_parent();
46
47         NewVehicleDialog *dlg = new NewVehicleDialog(train);
48         root->add(*dlg);
49         dlg->autosize();
50 }
51
52 void VehiclesPanel::remove_clicked()
53 {
54         int index = lst_vehicles->get_selected_index();
55         if(index>0)
56         {
57                 train.remove_vehicle(index);
58                 lst_vehicles->set_selected_index(static_cast<unsigned>(index)<vehicles.size() ? index : index-1);
59         }
60 }
61
62 void VehiclesPanel::vehicle_added(unsigned i, Vehicle &veh)
63 {
64         vehicles.insert(i, &veh);
65 }
66
67 void VehiclesPanel::vehicle_removed(unsigned i, Vehicle &)
68 {
69         vehicles.remove(i);
70 }