]> git.tdb.fi Git - r2c2.git/blob - source/engineer/departuresdialog.cpp
Persist most dialogs across runs
[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 #include "engineer.h"
9
10 using namespace std;
11 using namespace Msp;
12 using namespace R2C2;
13
14 DeparturesDialog::DeparturesDialog(Engineer &engineer, const string &group):
15         DynamicDialog(engineer.get_user_interface()),
16         layout(engineer.get_layout()),
17         departures(0)
18 {
19         Loader::WidgetMap widgets;
20         DataFile::load(*this, "data/departuresdialog.ui", widgets);
21
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"));
27
28         GLtk::Grid grid(*pnl_departures->get_layout(), 2);
29         rows.resize(8);
30         for(unsigned i=0; i<rows.size(); ++i)
31         {
32                 Row &row = rows[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");
37         }
38
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());
43
44         for(set<string>::const_iterator i=group_set.begin(); i!=group_set.end(); ++i)
45         {
46                 groups.append(*i);
47                 if(*i==group)
48                         drp_groups->set_selected_index(groups.size()-1);
49         }
50 }
51
52 void DeparturesDialog::set_group(const string &group)
53 {
54         int index = groups.find(group);
55         if(index<0)
56                 throw key_error(group);
57         drp_groups->set_selected_index(index);
58
59         lbl_title->set_text("Departures from "+group);
60
61         for(vector<Row>::iterator i=rows.begin(); i!=rows.end(); ++i)
62                 i->set_departure(0);
63
64         delete departures;
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)));
68
69         update_rows();
70 }
71
72 void DeparturesDialog::group_selected(unsigned index)
73 {
74         set_group(groups.get(index));
75 }
76
77 void DeparturesDialog::update_rows()
78 {
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)
82         {
83                 if(i!=deps.end())
84                         rows[j].set_departure(&*i++);
85                 else
86                         rows[j].set_departure(0);
87         }
88 }
89
90 bool DeparturesDialog::save_state(DataFile::Statement &st) const
91 {
92         st.keyword = "departuresdialog";
93         int sel = drp_groups->get_selected_index();
94         if(sel>=0)
95                 st.sub.push_back((DataFile::Statement("group"), groups.get(sel)));
96         save_position(st.sub);
97
98         return true;
99 }
100
101
102 DeparturesDialog::Row::Row():
103         departure(0),
104         lbl_time(0),
105         lbl_train(0)
106 { }
107
108 void DeparturesDialog::Row::set_departure(const Departures::Departure *d)
109 {
110         departure = d;
111         if(departure)
112         {
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());
118         }
119         else
120         {
121                 lbl_time->set_text(string());
122                 lbl_train->set_text(string());
123         }
124 }
125
126
127 DeparturesDialog::StateLoader::StateLoader(DeparturesDialog &dd):
128         DataFile::DerivedObjectLoader<DeparturesDialog, DynamicDialog::StateLoader>(dd)
129 {
130         add("group", &StateLoader::group);
131 }
132
133 void DeparturesDialog::StateLoader::group(const string &g)
134 {
135         obj.set_group(g);
136 }