]> git.tdb.fi Git - r2c2.git/blob - source/engineer/timetabledialog.cpp
fcb06f84fceba54e736834ee706adc1f0a52f8c6
[r2c2.git] / source / engineer / timetabledialog.cpp
1 /* $Id$
2
3 This file is part of the MSP Märklin suite
4 Copyright © 2010  Mikkosoft Productions, Mikko Rasa
5 Distributed under the GPL
6 */
7
8 #include <msp/gltk/button.h>
9 #include <msp/io/print.h>
10 #include <msp/strings/utils.h>
11 #include "timetabledialog.h"
12
13 using namespace std;
14 using namespace Msp;
15 using namespace Marklin;
16
17 TimetableDialog::TimetableDialog(const GLtk::Resources &r, Timetable &tt):
18         GLtk::Widget(r),
19         GLtk::Dialog(r),
20         timetable(tt)
21 {
22         set_size(200, 200);
23
24         GLtk::Button *btn;
25
26         add_button(*(btn = new GLtk::Button(res, "Cncl")), 0);
27         btn->set_geometry(GLtk::Geometry(geom.w-80, 10, 30, 25));
28         btn->set_style("red");
29
30         add_button(*(btn = new GLtk::Button(res, "OK")), 1);
31         btn->set_geometry(GLtk::Geometry(geom.w-40, 10, 30, 25));
32         btn->set_style("green");
33
34         add(*(tgl_enabled = new GLtk::Toggle(res, "On")));
35         tgl_enabled->set_geometry(GLtk::Geometry(10, 10, 40, 27));
36         tgl_enabled->set_value(timetable.is_enabled());
37         tgl_enabled->signal_toggled.connect(sigc::mem_fun(this, &TimetableDialog::enabled_toggled));
38
39         add(*(ent_timetable = new GLtk::Entry(res)));
40         ent_timetable->set_geometry(GLtk::Geometry(10, 45, geom.w-20, geom.h-55));
41         ent_timetable->set_multiline(true);
42
43         string text;
44         for(unsigned i=0; i<timetable.get_n_rows(); ++i)
45         {
46                 if(!text.empty())
47                         text += '\n';
48                 text += timetable.get_row(i).str();
49         }
50         ent_timetable->set_text(text);
51 }
52
53 void TimetableDialog::enabled_toggled(bool value)
54 {
55         timetable.set_enabled(value);
56         timetable.reset();
57 }
58
59 void TimetableDialog::on_response(int code)
60 {
61         if(code)
62         {
63                 vector<string> lines = split(ent_timetable->get_text(), '\n');
64                 vector<Timetable::Row> rows;
65                 rows.reserve(lines.size());
66                 try
67                 {
68                         for(vector<string>::const_iterator i=lines.begin(); i!=lines.end(); ++i)
69                                 rows.push_back(Timetable::Row::parse(*i));
70                         timetable.clear();
71                         for(vector<Timetable::Row>::const_iterator i=rows.begin(); i!=rows.end(); ++i)
72                                 timetable.append(*i);
73                 }
74                 catch(const Exception &e)
75                 {
76                         // XXX Need a better way to report errors.  Also, should not let the dialog close.
77                         IO::print("%s\n", e.what());
78                 }
79         }
80 }