]> git.tdb.fi Git - r2c2.git/blobdiff - source/engineer/mainwindow.cpp
Keep UI better in sync with the clock
[r2c2.git] / source / engineer / mainwindow.cpp
index 6e3888c19b81978f476e5f2441fe335723914975..51abbfd771e2993075223329303970ed989ae6b3 100644 (file)
@@ -1,7 +1,11 @@
 #include <msp/gltk/button.h>
+#include <msp/strings/format.h>
+#include "libr2c2/clock.h"
 #include "libr2c2/driver.h"
+#include "clockdialog.h"
 #include "engineer.h"
 #include "mainwindow.h"
+#include "telemetrydialog.h"
 #include "trainlistdialog.h"
 
 using namespace std;
@@ -17,12 +21,15 @@ MainWindow::MainWindow(Engineer &e):
        ind_off = dynamic_cast<GLtk::Indicator *>(get_item(widgets, "ind_off"));
        ind_halt = dynamic_cast<GLtk::Indicator *>(get_item(widgets, "ind_halt"));
        lbl_status = dynamic_cast<GLtk::Label *>(get_item(widgets, "lbl_status"));
+       lbl_clock = dynamic_cast<GLtk::Label *>(get_item(widgets, "lbl_clock"));
 
        dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_on"))->signal_clicked.connect(sigc::mem_fun(this, &MainWindow::on_clicked));
        dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_off"))->signal_clicked.connect(sigc::mem_fun(this, &MainWindow::off_clicked));
        dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_halt"))->signal_clicked.connect(sigc::mem_fun(this, &MainWindow::halt_clicked));
        dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_trains"))->signal_clicked.connect(sigc::mem_fun(this, &MainWindow::trains_clicked));
+       dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_telemetry"))->signal_clicked.connect(sigc::mem_fun(this, &MainWindow::telemetry_clicked));
        dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_quit"))->signal_clicked.connect(sigc::mem_fun(this, &MainWindow::quit_clicked));
+       dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_clock"))->signal_clicked.connect(sigc::mem_fun(this, &MainWindow::clock_clicked));
 
        R2C2::Driver &driver = engineer.get_layout().get_driver();
        if(driver.get_power())
@@ -32,6 +39,9 @@ MainWindow::MainWindow(Engineer &e):
 
        driver.signal_power.connect(sigc::mem_fun(this, &MainWindow::power_event));
        driver.signal_halt.connect(sigc::mem_fun(this, &MainWindow::halt_event));
+
+       engineer.get_layout().get_clock().signal_minute.connect(sigc::mem_fun(this, &MainWindow::update_clock));
+       engineer.get_layout().get_clock().signal_discontinuity.connect(sigc::mem_fun(this, &MainWindow::update_clock));
 }
 
 void MainWindow::set_status_text(const string &txt)
@@ -57,13 +67,14 @@ void MainWindow::halt_clicked()
 
 void MainWindow::trains_clicked()
 {
-       GLtk::Container *root = parent;
-       while(root->get_parent())
-               root = root->get_parent();
-
        TrainListDialog *dlg = new TrainListDialog(engineer);
-       root->add(*dlg);
-       dlg->autosize();
+       find_ancestor<GLtk::Root>()->add(*dlg);
+}
+
+void MainWindow::telemetry_clicked()
+{
+       TelemetryDialog *dlg = new TelemetryDialog(engineer);
+       find_ancestor<GLtk::Root>()->add(*dlg);
 }
 
 void MainWindow::quit_clicked()
@@ -71,6 +82,12 @@ void MainWindow::quit_clicked()
        engineer.quit();
 }
 
+void MainWindow::clock_clicked()
+{
+       ClockDialog *dlg = new ClockDialog(engineer);
+       find_ancestor<GLtk::Root>()->add(*dlg);
+}
+
 void MainWindow::power_event(bool p)
 {
        ind_on->set_active(p);
@@ -81,3 +98,12 @@ void MainWindow::halt_event(bool h)
 {
        ind_halt->set_active(h);
 }
+
+void MainWindow::update_clock()
+{
+       const Time::TimeDelta &time = engineer.get_layout().get_clock().get_current_time();
+       unsigned minute = time/Time::min;
+       unsigned hour = minute/60;
+       minute %= 60;
+       lbl_clock->set_text(format("%02d:%02d", hour, minute));
+}