]> git.tdb.fi Git - r2c2.git/blobdiff - source/engineer/clockdialog.cpp
Add a dialog to control the clock
[r2c2.git] / source / engineer / clockdialog.cpp
diff --git a/source/engineer/clockdialog.cpp b/source/engineer/clockdialog.cpp
new file mode 100644 (file)
index 0000000..18d5b93
--- /dev/null
@@ -0,0 +1,77 @@
+#include <msp/gltk/button.h>
+#include <msp/gltk/stack.h>
+#include "libr2c2/layout.h"
+#include "clockdialog.h"
+#include "clockwidget.h"
+#include "engineer.h"
+
+using namespace std;
+using namespace Msp;
+using namespace R2C2;
+
+ClockDialog::ClockDialog(Engineer &engineer):
+       clock(engineer.get_layout().get_clock())
+{
+       Loader::WidgetMap widgets;
+       DataFile::load(*this, "data/clockdialog.ui", widgets);
+
+       GLtk::Button *button = dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_rate"));
+       button->signal_clicked.connect(sigc::mem_fun(this, &ClockDialog::set_rate));
+       ent_rate = dynamic_cast<GLtk::Entry *>(get_item(widgets, "ent_rate"));
+
+       button = dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_stop"));
+       button->signal_clicked.connect(sigc::mem_fun(this, &ClockDialog::stop_clicked));
+       ind_stopped = dynamic_cast<GLtk::Indicator *>(get_item(widgets, "ind_stopped"));
+       ind_stopped->set_active(clock.is_stopped());
+
+       button = dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_time"));
+       button->signal_clicked.connect(sigc::mem_fun(this, &ClockDialog::set_time));
+       ent_hour = dynamic_cast<GLtk::Entry *>(get_item(widgets, "ent_hour"));
+       ent_minute = dynamic_cast<GLtk::Entry *>(get_item(widgets, "ent_minute"));
+
+       GLtk::Stack stack(*layout);
+       stack.arrange(*get_item(widgets, "placeholder"));
+       add(*(new ClockWidget(clock)));
+
+       clock.signal_minute.connect(sigc::mem_fun(this, &ClockDialog::minute_changed));
+}
+
+void ClockDialog::minute_changed()
+{
+       Time::TimeDelta time = clock.get_current_time();
+       unsigned hour = time/Time::hour;
+       unsigned minute = static_cast<unsigned>(time/Time::min)%60;
+       ent_hour->set_text(lexical_cast<string>(hour));
+       ent_minute->set_text(lexical_cast<string>(minute));
+}
+
+void ClockDialog::set_rate()
+{
+       try
+       {
+               float rate = lexical_cast<float>(ent_rate->get_text());
+               clock.set_rate(rate);
+       }
+       catch(const lexical_error &e)
+       {
+       }
+}
+
+void ClockDialog::stop_clicked()
+{
+       clock.stop(!clock.is_stopped());
+       ind_stopped->set_active(clock.is_stopped());
+}
+
+void ClockDialog::set_time()
+{
+       try
+       {
+               unsigned hour = lexical_cast<unsigned>(ent_hour->get_text());
+               unsigned minute = lexical_cast<unsigned>(ent_minute->get_text());
+               clock.set_current_time(hour*Time::hour+minute*Time::min);
+       }
+       catch(const lexical_error &e)
+       {
+       }
+}