]> git.tdb.fi Git - r2c2.git/blobdiff - source/engineer/vehiclespanel.cpp
Complete rewrite of the engineer UI
[r2c2.git] / source / engineer / vehiclespanel.cpp
diff --git a/source/engineer/vehiclespanel.cpp b/source/engineer/vehiclespanel.cpp
new file mode 100644 (file)
index 0000000..d906f6c
--- /dev/null
@@ -0,0 +1,70 @@
+#include <msp/core/maputils.h>
+#include <msp/gltk/button.h>
+#include <msp/strings/format.h>
+#include "libr2c2/layout.h"
+#include "libr2c2/vehicle.h"
+#include "newvehicledialog.h"
+#include "vehiclespanel.h"
+
+using namespace std;
+using namespace Msp;
+using namespace R2C2;
+
+static string vehicle_name(Vehicle *const &veh)
+{
+       return format("%s %s", veh->get_type().get_article_number(), veh->get_type().get_name());
+}
+
+VehiclesPanel::VehiclesPanel(Train &t):
+       train(t),
+       vehicles(&vehicle_name)
+{
+       Loader::WidgetMap widgets;
+       DataFile::load(*this, "data/vehiclespanel.ui", widgets);
+
+       lst_vehicles = dynamic_cast<GLtk::List *>(get_item(widgets, "lst_vehicles"));
+       //lst_vehicles->set_data(vehicles);
+
+       dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_add"))->signal_clicked.connect(sigc::mem_fun(this, &VehiclesPanel::add_clicked));
+       dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_remove"))->signal_clicked.connect(sigc::mem_fun(this, &VehiclesPanel::remove_clicked));
+
+       unsigned n_veh = train.get_n_vehicles();
+       for(unsigned i=0; i<n_veh; ++i)
+               vehicles.append(&train.get_vehicle(i));
+
+       train.signal_vehicle_added.connect(sigc::mem_fun(this, &VehiclesPanel::vehicle_added));
+       train.signal_vehicle_removed.connect(sigc::mem_fun(this, &VehiclesPanel::vehicle_removed));
+
+       lst_vehicles->set_data(vehicles);
+}
+
+void VehiclesPanel::add_clicked()
+{
+       GLtk::Container *root = parent;
+       while(root->get_parent())
+               root = root->get_parent();
+
+       NewVehicleDialog *dlg = new NewVehicleDialog(train);
+       root->add(*dlg);
+       dlg->autosize();
+}
+
+void VehiclesPanel::remove_clicked()
+{
+       int index = lst_vehicles->get_selected_index();
+       if(index>0)
+       {
+               train.remove_vehicle(index);
+               lst_vehicles->set_selected_index(static_cast<unsigned>(index)<vehicles.size() ? index : index-1);
+       }
+}
+
+void VehiclesPanel::vehicle_added(unsigned i, Vehicle &veh)
+{
+       vehicles.insert(i, &veh);
+}
+
+void VehiclesPanel::vehicle_removed(unsigned i, Vehicle &)
+{
+       vehicles.remove(i);
+}