]> git.tdb.fi Git - r2c2.git/blob - source/engineer/mainwindow.cpp
Add a dialog to display telemetry data from the driver
[r2c2.git] / source / engineer / mainwindow.cpp
1 #include <msp/gltk/button.h>
2 #include <msp/strings/format.h>
3 #include "libr2c2/clock.h"
4 #include "libr2c2/driver.h"
5 #include "clockdialog.h"
6 #include "engineer.h"
7 #include "mainwindow.h"
8 #include "telemetrydialog.h"
9 #include "trainlistdialog.h"
10
11 using namespace std;
12 using namespace Msp;
13
14 MainWindow::MainWindow(Engineer &e):
15         engineer(e)
16 {
17         Loader::WidgetMap widgets;
18         DataFile::load(*this, "data/mainwindow.ui", widgets);
19
20         ind_on = dynamic_cast<GLtk::Indicator *>(get_item(widgets, "ind_on"));
21         ind_off = dynamic_cast<GLtk::Indicator *>(get_item(widgets, "ind_off"));
22         ind_halt = dynamic_cast<GLtk::Indicator *>(get_item(widgets, "ind_halt"));
23         lbl_status = dynamic_cast<GLtk::Label *>(get_item(widgets, "lbl_status"));
24         lbl_clock = dynamic_cast<GLtk::Label *>(get_item(widgets, "lbl_clock"));
25
26         dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_on"))->signal_clicked.connect(sigc::mem_fun(this, &MainWindow::on_clicked));
27         dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_off"))->signal_clicked.connect(sigc::mem_fun(this, &MainWindow::off_clicked));
28         dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_halt"))->signal_clicked.connect(sigc::mem_fun(this, &MainWindow::halt_clicked));
29         dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_trains"))->signal_clicked.connect(sigc::mem_fun(this, &MainWindow::trains_clicked));
30         dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_telemetry"))->signal_clicked.connect(sigc::mem_fun(this, &MainWindow::telemetry_clicked));
31         dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_quit"))->signal_clicked.connect(sigc::mem_fun(this, &MainWindow::quit_clicked));
32         dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_clock"))->signal_clicked.connect(sigc::mem_fun(this, &MainWindow::clock_clicked));
33
34         R2C2::Driver &driver = engineer.get_layout().get_driver();
35         if(driver.get_power())
36                 ind_on->set_active(true);
37         else
38                 ind_off->set_active(true);
39
40         driver.signal_power.connect(sigc::mem_fun(this, &MainWindow::power_event));
41         driver.signal_halt.connect(sigc::mem_fun(this, &MainWindow::halt_event));
42
43         engineer.get_layout().get_clock().signal_minute.connect(sigc::mem_fun(this, &MainWindow::clock_minute));
44 }
45
46 void MainWindow::set_status_text(const string &txt)
47 {
48         lbl_status->set_text(txt);
49 }
50
51 void MainWindow::on_clicked()
52 {
53         engineer.get_layout().get_driver().set_power(true);
54 }
55
56 void MainWindow::off_clicked()
57 {
58         engineer.get_layout().get_driver().set_power(false);
59 }
60
61 void MainWindow::halt_clicked()
62 {
63         R2C2::Driver &driver = engineer.get_layout().get_driver();
64         driver.halt(!driver.is_halted());
65 }
66
67 void MainWindow::trains_clicked()
68 {
69         TrainListDialog *dlg = new TrainListDialog(engineer);
70         find_ancestor<GLtk::Root>()->add(*dlg);
71 }
72
73 void MainWindow::telemetry_clicked()
74 {
75         TelemetryDialog *dlg = new TelemetryDialog(engineer);
76         find_ancestor<GLtk::Root>()->add(*dlg);
77 }
78
79 void MainWindow::quit_clicked()
80 {
81         engineer.quit();
82 }
83
84 void MainWindow::clock_clicked()
85 {
86         ClockDialog *dlg = new ClockDialog(engineer);
87         find_ancestor<GLtk::Root>()->add(*dlg);
88 }
89
90 void MainWindow::power_event(bool p)
91 {
92         ind_on->set_active(p);
93         ind_off->set_active(!p);
94 }
95
96 void MainWindow::halt_event(bool h)
97 {
98         ind_halt->set_active(h);
99 }
100
101 void MainWindow::clock_minute()
102 {
103         const Time::TimeDelta &time = engineer.get_layout().get_clock().get_current_time();
104         unsigned minute = time/Time::min;
105         unsigned hour = minute/60;
106         minute %= 60;
107         lbl_clock->set_text(format("%02d:%02d", hour, minute));
108 }