]> git.tdb.fi Git - r2c2.git/blob - source/engineer/routerpanel.cpp
Complete rewrite of the engineer UI
[r2c2.git] / source / engineer / routerpanel.cpp
1 #include <msp/core/maputils.h>
2 #include <msp/core/raii.h>
3 #include <msp/gltk/button.h>
4 #include <msp/gltk/column.h>
5 #include "libr2c2/layout.h"
6 #include "libr2c2/route.h"
7 #include "libr2c2/trainrouter.h"
8 #include "engineer.h"
9 #include "routerpanel.h"
10
11 using namespace std;
12 using namespace Msp;
13 using namespace R2C2;
14
15 string route_name(const Route *const &route)
16 {
17         return route->get_name();
18 }
19
20 RouterPanel::RouterPanel(Engineer &e, Train &t):
21         engineer(e),
22         train(t),
23         routes(&route_name),
24         updating(false)
25 {
26         Loader::WidgetMap widgets;
27         DataFile::load(*this, "data/routerpanel.ui", widgets);
28
29         lbl_route = dynamic_cast<GLtk::Label *>(get_item(widgets, "lbl_route"));
30         drp_routes = dynamic_cast<GLtk::Dropdown *>(get_item(widgets, "drp_routes"));
31         drp_routes->set_data(routes);
32         drp_routes->signal_item_selected.connect(sigc::mem_fun(this, &RouterPanel::route_selected));
33
34         dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_goto"))->signal_clicked.connect(sigc::mem_fun(this, &RouterPanel::goto_clicked));
35
36         const set<Route *> &lroutes = train.get_layout().get_all<Route>();
37         for(set<Route *>::const_iterator i=lroutes.begin(); i!=lroutes.end(); ++i)
38                 routes.append(*i);
39
40         TrainRouter *router = train.get_ai_of_type<TrainRouter>();
41         if(!router)
42                 router = new TrainRouter(train);
43         update_route(router->get_route());
44
45         train.signal_ai_event.connect(sigc::mem_fun(this, &RouterPanel::ai_event));
46 }
47
48 void RouterPanel::ai_event(TrainAI &, const TrainAI::Message &msg)
49 {
50         if(msg.type=="route-changed")
51                 update_route(msg.value.value<const Route *>());
52 }
53
54 void RouterPanel::update_route(const Route *route)
55 {
56         SetFlag setf(updating);
57         if(route)
58                 lbl_route->set_text(route->get_name());
59         else
60                 lbl_route->set_text("Free run");
61         drp_routes->set_selected_index(routes.find(route));
62 }
63
64 void RouterPanel::route_selected(unsigned index)
65 {
66         if(!updating)
67         {
68                 const Route *route = routes.get(index);
69                 train.ai_message(TrainAI::Message("set-route", route));
70         }
71 }
72
73 void RouterPanel::goto_clicked()
74 {
75         engineer.pick(false);
76         pick_conn = engineer.signal_pick_done.connect(sigc::mem_fun(this, &RouterPanel::goto_pick_done));
77 }
78
79 void RouterPanel::goto_pick_done(Track *track, unsigned)
80 {
81         pick_conn.disconnect();
82         train.ai_message(TrainAI::Message("set-destination-block", &track->get_block()));
83 }