1 #include <msp/core/maputils.h>
2 #include <msp/gltk/grid.h>
3 #include <msp/strings/format.h>
4 #include "libr2c2/layout.h"
5 #include "libr2c2/train.h"
6 #include "libr2c2/zone.h"
7 #include "departuresdialog.h"
13 DeparturesDialog::DeparturesDialog(const Layout &l, const string &group):
17 Loader::WidgetMap widgets;
18 DataFile::load(*this, "data/departuresdialog.ui", widgets);
20 lbl_title = dynamic_cast<GLtk::Label *>(get_item(widgets, "lbl_title"));
21 drp_groups = dynamic_cast<GLtk::Dropdown *>(get_item(widgets, "drp_groups"));
22 drp_groups->set_data(groups);
23 drp_groups->signal_item_selected.connect(sigc::mem_fun(this, &DeparturesDialog::group_selected));
24 pnl_departures = dynamic_cast<GLtk::Panel *>(get_item(widgets, "pnl_departures"));
26 GLtk::Grid grid(*pnl_departures->get_layout(), 2);
28 for(unsigned i=0; i<rows.size(); ++i)
31 pnl_departures->add(*(row.lbl_time = new GLtk::Label));
32 row.lbl_time->set_style("digital_borderless");
33 pnl_departures->add(*(row.lbl_train = new GLtk::Label));
34 row.lbl_train->set_style("digital_borderless");
37 const set<Zone *> &zones = layout.get_all<Zone>();
38 set<string> group_set;
39 for(set<Zone *>::const_iterator i=zones.begin(); i!=zones.end(); ++i)
40 group_set.insert((*i)->get_group());
42 for(set<string>::const_iterator i=group_set.begin(); i!=group_set.end(); ++i)
46 drp_groups->set_selected_index(groups.size()-1);
50 void DeparturesDialog::set_group(const string &group)
52 int index = groups.find(group);
54 throw key_error(group);
55 drp_groups->set_selected_index(index);
57 lbl_title->set_text("Departures from "+group);
59 for(vector<Row>::iterator i=rows.begin(); i!=rows.end(); ++i)
63 departures = new Departures(layout, group);
64 departures->signal_departure_added.connect(sigc::hide<0>(sigc::mem_fun(this, &DeparturesDialog::update_rows)));
65 departures->signal_departure_removed.connect(sigc::hide<0>(sigc::mem_fun(this, &DeparturesDialog::update_rows)));
70 void DeparturesDialog::group_selected(unsigned index)
72 set_group(groups.get(index));
75 void DeparturesDialog::update_rows()
77 const list<Departures::Departure> &deps = departures->get_departures();
78 list<Departures::Departure>::const_iterator i = deps.begin();
79 for(unsigned j=0; j<rows.size(); ++j)
82 rows[j].set_departure(&*i++);
84 rows[j].set_departure(0);
89 DeparturesDialog::Row::Row():
95 void DeparturesDialog::Row::set_departure(const Departures::Departure *d)
100 unsigned secs = departure->time/Time::sec;
101 unsigned hour = secs/3600%24;
102 unsigned min = secs/60%60;
103 lbl_time->set_text(format("%2d:%02d", hour, min));
104 lbl_train->set_text(departure->train->get_name());
108 lbl_time->set_text(string());
109 lbl_train->set_text(string());