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"
14 DeparturesDialog::DeparturesDialog(Engineer &engineer, const string &group):
15 DynamicDialog(engineer.get_user_interface()),
16 layout(engineer.get_layout()),
19 Loader::WidgetMap widgets;
20 DataFile::load(*this, "data/departuresdialog.ui", widgets);
22 lbl_title = dynamic_cast<GLtk::Label *>(get_item(widgets, "lbl_title"));
23 drp_groups = dynamic_cast<GLtk::Dropdown *>(get_item(widgets, "drp_groups"));
24 drp_groups->set_data(groups);
25 drp_groups->signal_item_selected.connect(sigc::mem_fun(this, &DeparturesDialog::group_selected));
26 pnl_departures = dynamic_cast<GLtk::Panel *>(get_item(widgets, "pnl_departures"));
28 GLtk::Grid grid(*pnl_departures->get_layout(), 2);
30 for(unsigned i=0; i<rows.size(); ++i)
33 pnl_departures->add(*(row.lbl_time = new GLtk::Label));
34 row.lbl_time->set_style("digital_borderless");
35 pnl_departures->add(*(row.lbl_train = new GLtk::Label));
36 row.lbl_train->set_style("digital_borderless");
39 const set<Zone *> &zones = layout.get_all<Zone>();
40 set<string> group_set;
41 for(set<Zone *>::const_iterator i=zones.begin(); i!=zones.end(); ++i)
42 group_set.insert((*i)->get_group());
44 for(set<string>::const_iterator i=group_set.begin(); i!=group_set.end(); ++i)
48 drp_groups->set_selected_index(groups.size()-1);
52 void DeparturesDialog::set_group(const string &group)
54 int index = groups.find(group);
56 throw key_error(group);
57 drp_groups->set_selected_index(index);
59 lbl_title->set_text("Departures from "+group);
61 for(vector<Row>::iterator i=rows.begin(); i!=rows.end(); ++i)
65 departures = new Departures(layout, group);
66 departures->signal_departure_added.connect(sigc::hide<0>(sigc::mem_fun(this, &DeparturesDialog::update_rows)));
67 departures->signal_departure_removed.connect(sigc::hide<0>(sigc::mem_fun(this, &DeparturesDialog::update_rows)));
72 void DeparturesDialog::group_selected(unsigned index)
74 set_group(groups.get(index));
77 void DeparturesDialog::update_rows()
79 const list<Departures::Departure> &deps = departures->get_departures();
80 list<Departures::Departure>::const_iterator i = deps.begin();
81 for(unsigned j=0; j<rows.size(); ++j)
84 rows[j].set_departure(&*i++);
86 rows[j].set_departure(0);
90 bool DeparturesDialog::save_state(DataFile::Statement &st) const
92 st.keyword = "departuresdialog";
93 int sel = drp_groups->get_selected_index();
95 st.sub.push_back((DataFile::Statement("group"), groups.get(sel)));
96 save_position(st.sub);
102 DeparturesDialog::Row::Row():
108 void DeparturesDialog::Row::set_departure(const Departures::Departure *d)
113 unsigned secs = departure->time/Time::sec;
114 unsigned hour = secs/3600%24;
115 unsigned min = secs/60%60;
116 lbl_time->set_text(format("%2d:%02d", hour, min));
117 lbl_train->set_text(departure->train->get_name());
121 lbl_time->set_text(string());
122 lbl_train->set_text(string());
127 DeparturesDialog::StateLoader::StateLoader(DeparturesDialog &dd):
128 DataFile::DerivedObjectLoader<DeparturesDialog, DynamicDialog::StateLoader>(dd)
130 add("group", &StateLoader::group);
133 void DeparturesDialog::StateLoader::group(const string &g)