]> git.tdb.fi Git - r2c2.git/blob - source/engineer/clockdialog.cpp
Add a dialog to control the clock
[r2c2.git] / source / engineer / clockdialog.cpp
1 #include <msp/gltk/button.h>
2 #include <msp/gltk/stack.h>
3 #include "libr2c2/layout.h"
4 #include "clockdialog.h"
5 #include "clockwidget.h"
6 #include "engineer.h"
7
8 using namespace std;
9 using namespace Msp;
10 using namespace R2C2;
11
12 ClockDialog::ClockDialog(Engineer &engineer):
13         clock(engineer.get_layout().get_clock())
14 {
15         Loader::WidgetMap widgets;
16         DataFile::load(*this, "data/clockdialog.ui", widgets);
17
18         GLtk::Button *button = dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_rate"));
19         button->signal_clicked.connect(sigc::mem_fun(this, &ClockDialog::set_rate));
20         ent_rate = dynamic_cast<GLtk::Entry *>(get_item(widgets, "ent_rate"));
21
22         button = dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_stop"));
23         button->signal_clicked.connect(sigc::mem_fun(this, &ClockDialog::stop_clicked));
24         ind_stopped = dynamic_cast<GLtk::Indicator *>(get_item(widgets, "ind_stopped"));
25         ind_stopped->set_active(clock.is_stopped());
26
27         button = dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_time"));
28         button->signal_clicked.connect(sigc::mem_fun(this, &ClockDialog::set_time));
29         ent_hour = dynamic_cast<GLtk::Entry *>(get_item(widgets, "ent_hour"));
30         ent_minute = dynamic_cast<GLtk::Entry *>(get_item(widgets, "ent_minute"));
31
32         GLtk::Stack stack(*layout);
33         stack.arrange(*get_item(widgets, "placeholder"));
34         add(*(new ClockWidget(clock)));
35
36         clock.signal_minute.connect(sigc::mem_fun(this, &ClockDialog::minute_changed));
37 }
38
39 void ClockDialog::minute_changed()
40 {
41         Time::TimeDelta time = clock.get_current_time();
42         unsigned hour = time/Time::hour;
43         unsigned minute = static_cast<unsigned>(time/Time::min)%60;
44         ent_hour->set_text(lexical_cast<string>(hour));
45         ent_minute->set_text(lexical_cast<string>(minute));
46 }
47
48 void ClockDialog::set_rate()
49 {
50         try
51         {
52                 float rate = lexical_cast<float>(ent_rate->get_text());
53                 clock.set_rate(rate);
54         }
55         catch(const lexical_error &e)
56         {
57         }
58 }
59
60 void ClockDialog::stop_clicked()
61 {
62         clock.stop(!clock.is_stopped());
63         ind_stopped->set_active(clock.is_stopped());
64 }
65
66 void ClockDialog::set_time()
67 {
68         try
69         {
70                 unsigned hour = lexical_cast<unsigned>(ent_hour->get_text());
71                 unsigned minute = lexical_cast<unsigned>(ent_minute->get_text());
72                 clock.set_current_time(hour*Time::hour+minute*Time::min);
73         }
74         catch(const lexical_error &e)
75         {
76         }
77 }