]> git.tdb.fi Git - r2c2.git/blobdiff - source/remote/trainselector.cpp
Add a new remote control program with GLtk-based UI
[r2c2.git] / source / remote / trainselector.cpp
diff --git a/source/remote/trainselector.cpp b/source/remote/trainselector.cpp
new file mode 100644 (file)
index 0000000..ca4ef0a
--- /dev/null
@@ -0,0 +1,44 @@
+#include <msp/core/maputils.h>
+#include "network/client.h"
+#include "trainselector.h"
+
+using namespace std;
+using namespace Msp;
+using namespace R2C2;
+
+string train_name(NetTrain *const &train)
+{
+       if(train)
+               return train->get_name();
+       else
+               return "(no train selected)";
+}
+
+TrainSelector::TrainSelector(Client &client):
+       trains(&train_name)
+{
+       Loader::WidgetMap widgets;
+       DataFile::load(*this, "data/remote/trainselector.ui", widgets);
+
+       drp_trains = dynamic_cast<GLtk::Dropdown *>(get_item(widgets, "drp_trains"));
+       drp_trains->set_data(trains);
+       drp_trains->signal_item_selected.connect(sigc::mem_fun(this, &TrainSelector::train_selected));
+
+       client.signal_train_added.connect(sigc::mem_fun(this, &TrainSelector::train_added));
+
+       trains.append(0);
+       drp_trains->set_selected_index(0);
+       const map<unsigned, NetTrain *> &ctrains = client.get_trains();
+       for(map<unsigned, NetTrain *>::const_iterator i=ctrains.begin(); i!=ctrains.end(); ++i)
+               trains.append(i->second);
+}
+
+void TrainSelector::train_added(NetTrain &train)
+{
+       trains.append(&train);
+}
+
+void TrainSelector::train_selected(unsigned index)
+{
+       signal_train_selected.emit(trains.get(index));
+}