]> git.tdb.fi Git - r2c2.git/blobdiff - source/engineer/newvehicledialog.cpp
Complete rewrite of the engineer UI
[r2c2.git] / source / engineer / newvehicledialog.cpp
diff --git a/source/engineer/newvehicledialog.cpp b/source/engineer/newvehicledialog.cpp
new file mode 100644 (file)
index 0000000..f27370f
--- /dev/null
@@ -0,0 +1,65 @@
+#include <msp/core/maputils.h>
+#include <msp/gltk/button.h>
+#include <msp/gltk/toggle.h>
+#include <msp/strings/format.h>
+#include "libr2c2/catalogue.h"
+#include "libr2c2/layout.h"
+#include "newvehicledialog.h"
+
+using namespace std;
+using namespace Msp;
+using namespace R2C2;
+
+static string vehicle_type_name(const VehicleType *const &vehtype)
+{
+       return format("%s %s", vehtype->get_article_number(), vehtype->get_name());
+}
+
+NewVehicleDialog::NewVehicleDialog(Train &t):
+       train(t),
+       loco_types(&vehicle_type_name),
+       wagon_types(&vehicle_type_name)
+{
+       Loader::WidgetMap widgets;
+       DataFile::load(*this, "data/newvehicledialog.ui", widgets);
+
+       dynamic_cast<GLtk::Label *>(get_item(widgets, "lbl_title"))->set_text(format("Add vehicle to %s", train.get_name()));
+
+       GLtk::List *lst_loco_types = dynamic_cast<GLtk::List *>(get_item(widgets, "lst_loco_types"));
+       lst_loco_types->set_data(loco_types);
+       active_list = lst_loco_types;
+
+       GLtk::List *lst_wagon_types = dynamic_cast<GLtk::List *>(get_item(widgets, "lst_wagon_types"));
+       lst_wagon_types->set_data(wagon_types);
+
+       dynamic_cast<GLtk::Toggle *>(get_item(widgets, "tgl_loco_types"))->signal_toggled.connect(sigc::bind(sigc::mem_fun(this, &NewVehicleDialog::toggle_list), lst_loco_types));
+       dynamic_cast<GLtk::Toggle *>(get_item(widgets, "tgl_wagon_types"))->signal_toggled.connect(sigc::bind(sigc::mem_fun(this, &NewVehicleDialog::toggle_list), lst_wagon_types));
+
+       dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_add"))->signal_clicked.connect(sigc::mem_fun(this, &NewVehicleDialog::add_clicked));
+
+       const Catalogue::VehicleMap &cat_vtypes = train.get_layout().get_catalogue().get_vehicles();
+       for(Catalogue::VehicleMap::const_iterator i=cat_vtypes.begin(); i!=cat_vtypes.end(); ++i)
+       {
+               if(i->second->is_locomotive())
+                       loco_types.append(i->second);
+               else
+                       wagon_types.append(i->second);
+       }
+}
+
+void NewVehicleDialog::toggle_list(bool show, GLtk::List *lst)
+{
+       lst->set_visible(show);
+       if(show)
+               active_list = lst;
+}
+
+void NewVehicleDialog::add_clicked()
+{
+       int index = active_list->get_selected_index();
+       if(index>=0)
+       {
+               const VehicleType *vtype = static_cast<GLtk::ListDataStore<const R2C2::VehicleType *> &>(active_list->get_data()).get(index);
+               train.add_vehicle(*vtype);
+       }
+}