]> git.tdb.fi Git - r2c2.git/blob - source/engineer/departuresdialog.cpp
Remove some unnecessary proxy functions
[r2c2.git] / source / engineer / departuresdialog.cpp
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"
8
9 using namespace std;
10 using namespace Msp;
11 using namespace R2C2;
12
13 DeparturesDialog::DeparturesDialog(const Layout &l, const string &group):
14         layout(l),
15         departures(0)
16 {
17         Loader::WidgetMap widgets;
18         DataFile::load(*this, "data/departuresdialog.ui", widgets);
19
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"));
25
26         GLtk::Grid grid(*pnl_departures->get_layout(), 2);
27         rows.resize(8);
28         for(unsigned i=0; i<rows.size(); ++i)
29         {
30                 Row &row = rows[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");
35         }
36
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());
41
42         for(set<string>::const_iterator i=group_set.begin(); i!=group_set.end(); ++i)
43         {
44                 groups.append(*i);
45                 if(*i==group)
46                         drp_groups->set_selected_index(groups.size()-1);
47         }
48 }
49
50 void DeparturesDialog::group_selected(unsigned index)
51 {
52         const string &group = groups.get(index);
53         lbl_title->set_text("Departures from "+group);
54
55         for(vector<Row>::iterator i=rows.begin(); i!=rows.end(); ++i)
56                 i->set_departure(0);
57
58         delete departures;
59         departures = new Departures(layout, group);
60         departures->signal_departure_added.connect(sigc::hide<0>(sigc::mem_fun(this, &DeparturesDialog::update_rows)));
61         departures->signal_departure_removed.connect(sigc::hide<0>(sigc::mem_fun(this, &DeparturesDialog::update_rows)));
62
63         update_rows();
64 }
65
66 void DeparturesDialog::update_rows()
67 {
68         const list<Departures::Departure> &deps = departures->get_departures();
69         list<Departures::Departure>::const_iterator i = deps.begin();
70         for(unsigned j=0; j<rows.size(); ++j)
71         {
72                 if(i!=deps.end())
73                         rows[j].set_departure(&*i++);
74                 else
75                         rows[j].set_departure(0);
76         }
77 }
78
79
80 DeparturesDialog::Row::Row():
81         departure(0),
82         lbl_time(0),
83         lbl_train(0)
84 { }
85
86 void DeparturesDialog::Row::set_departure(const Departures::Departure *d)
87 {
88         departure = d;
89         if(departure)
90         {
91                 unsigned secs = departure->time/Time::sec;
92                 unsigned hour = secs/3600%24;
93                 unsigned min = secs/60%60;
94                 lbl_time->set_text(format("%2d:%02d", hour, min));
95                 lbl_train->set_text(departure->train->get_name());
96         }
97         else
98         {
99                 lbl_time->set_text(string());
100                 lbl_train->set_text(string());
101         }
102 }