]> git.tdb.fi Git - r2c2.git/blobdiff - source/engineer/userinterface.cpp
Persist most dialogs across runs
[r2c2.git] / source / engineer / userinterface.cpp
index aec54ad041331ef79ab44f0ba8090c74b9fa2db3..8eadecc8ed72d67fd4be71f97444211ed82670ef 100644 (file)
@@ -1,9 +1,13 @@
+#include <msp/datafile/writer.h>
 #include <msp/gltk/floatingarrangement.h>
 #include <msp/time/utils.h>
+#include "clockdialog.h"
 #include "departuresdialog.h"
 #include "engineer.h"
 #include "newtraindialog.h"
+#include "telemetrydialog.h"
 #include "traindialog.h"
+#include "trainlistdialog.h"
 #include "userinterface.h"
 
 using namespace std;
@@ -68,7 +72,7 @@ void UserInterface::show_train(Train &train)
 
 void UserInterface::show_zone(Zone &zone)
 {
-       DeparturesDialog *dlg = new DeparturesDialog(engineer.get_layout(), zone.get_group());
+       DeparturesDialog *dlg = new DeparturesDialog(engineer, zone.get_group());
        root.add(*dlg);
 }
 
@@ -106,3 +110,47 @@ void UserInterface::render() const
 {
        root.render();
 }
+
+void UserInterface::save_state(const string &fn) const
+{
+       IO::BufferedFile out(fn, IO::M_WRITE);
+       DataFile::Writer writer(out);
+
+       for(set<DynamicDialog *>::const_iterator i=dyn_dialogs.begin(); i!=dyn_dialogs.end(); ++i)
+       {
+               DataFile::Statement st;
+               if((*i)->save_state(st))
+                       writer.write(st);
+       }
+}
+
+
+UserInterface::Loader::Loader(UserInterface &ui):
+       DataFile::ObjectLoader<UserInterface>(ui)
+{
+       add("clockdialog", &Loader::basic_dialog<ClockDialog>);
+       add("departuresdialog", &Loader::basic_dialog<DeparturesDialog>);
+       add("telemetrydialog", &Loader::basic_dialog<TelemetryDialog>);
+       add("traindialog", &Loader::traindialog);
+       add("trainlistdialog", &Loader::basic_dialog<TrainListDialog>);
+}
+
+template<typename T>
+void UserInterface::Loader::dialog(T &dlg)
+{
+       obj.root.add(dlg);
+       typename T::StateLoader ldr(dlg);
+       load_sub_with(ldr);
+}
+
+template<typename T>
+void UserInterface::Loader::basic_dialog()
+{
+       dialog(*(new T(obj.engineer)));
+}
+
+void UserInterface::Loader::traindialog(unsigned a)
+{
+       Train &train = obj.engineer.get_layout().get_train(a);
+       dialog(*(new TrainDialog(obj.engineer, train)));
+}