1 #include <msp/datafile/writer.h>
2 #include <msp/gltk/floatingarrangement.h>
3 #include <msp/time/utils.h>
4 #include "clockdialog.h"
5 #include "departuresdialog.h"
7 #include "newtraindialog.h"
8 #include "telemetrydialog.h"
9 #include "traindialog.h"
10 #include "trainlistdialog.h"
11 #include "userinterface.h"
17 UserInterface::UserInterface(Engineer &e, Graphics::Window &window, Input::Keyboard &keyboard, Input::Mouse &mouse):
19 resources("data/r2c2.res"),
20 root(resources, &window, &keyboard, &mouse),
24 GLtk::Layout *root_layout = new GLtk::Layout;
25 root.set_layout(root_layout);
26 root_layout->set_margin(GLtk::Sides());
27 root_arrangement = new GLtk::FloatingArrangement(*root_layout);
28 root.set_visible(true);
32 main_wnd.set_position(0, window.get_height()-main_wnd.get_geometry().h);
34 Layout &layout = engineer.get_layout();
35 if(layout.has_driver())
37 Driver &driver = layout.get_driver();
38 driver.signal_locomotive_detected.connect(sigc::mem_fun(this, &UserInterface::locomotive_detected));
41 engineer.get_layout().signal_emergency.connect(sigc::hide<0>(sigc::mem_fun(this, &UserInterface::set_status)));
44 UserInterface::~UserInterface()
46 while(!dyn_dialogs.empty())
47 delete *dyn_dialogs.begin();
48 delete root_arrangement;
51 void UserInterface::set_status(const string &text)
53 main_wnd.set_status_text(text);
54 status_timeout = Time::now()+10*Time::sec;
57 void UserInterface::add_dynamic_dialog(DynamicDialog &dd)
59 dyn_dialogs.insert(&dd);
62 void UserInterface::remove_dynamic_dialog(DynamicDialog &dd)
64 dyn_dialogs.erase(&dd);
67 void UserInterface::show_train(Train &train)
69 TrainDialog *dlg = new TrainDialog(engineer, train);
73 void UserInterface::show_zone(Zone &zone)
75 DeparturesDialog *dlg = new DeparturesDialog(engineer, zone.get_group());
79 void UserInterface::locomotive_detected(const Driver::DetectedLocomotive &loco)
83 NewTrainDialog *dlg = new NewTrainDialog(engineer);
85 dlg->signal_response.connect(sigc::mem_fun(this, &UserInterface::import_finished));
91 void UserInterface::import_finished(int)
93 import_active = false;
96 void UserInterface::tick()
98 Time::TimeStamp t = Time::now();
99 if(status_timeout && t>status_timeout)
101 main_wnd.set_status_text(string());
102 status_timeout = Time::TimeStamp();
105 for(set<DynamicDialog *>::iterator i=dyn_dialogs.begin(); i!=dyn_dialogs.end(); ++i)
109 void UserInterface::render() const
114 void UserInterface::save_state(const string &fn) const
116 IO::BufferedFile out(fn, IO::M_WRITE);
117 DataFile::Writer writer(out);
119 for(set<DynamicDialog *>::const_iterator i=dyn_dialogs.begin(); i!=dyn_dialogs.end(); ++i)
121 DataFile::Statement st;
122 if((*i)->save_state(st))
128 UserInterface::Loader::Loader(UserInterface &ui):
129 DataFile::ObjectLoader<UserInterface>(ui)
131 add("clockdialog", &Loader::basic_dialog<ClockDialog>);
132 add("departuresdialog", &Loader::basic_dialog<DeparturesDialog>);
133 add("telemetrydialog", &Loader::basic_dialog<TelemetryDialog>);
134 add("traindialog", &Loader::traindialog);
135 add("trainlistdialog", &Loader::basic_dialog<TrainListDialog>);
139 void UserInterface::Loader::dialog(T &dlg)
142 typename T::StateLoader ldr(dlg);
147 void UserInterface::Loader::basic_dialog()
149 dialog(*(new T(obj.engineer)));
152 void UserInterface::Loader::traindialog(unsigned a)
154 Train &train = obj.engineer.get_layout().get_train(a);
155 dialog(*(new TrainDialog(obj.engineer, train)));