X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fengineer%2Fuserinterface.cpp;h=8eadecc8ed72d67fd4be71f97444211ed82670ef;hb=abed4a255060d5a233ec0ac2dd60af9132e29201;hp=95f064a9ce080181490fc1393258395e2c10db75;hpb=c0e076401ee76fd9a5a96ff919a8e7b4d058c51b;p=r2c2.git diff --git a/source/engineer/userinterface.cpp b/source/engineer/userinterface.cpp index 95f064a..8eadecc 100644 --- a/source/engineer/userinterface.cpp +++ b/source/engineer/userinterface.cpp @@ -1,9 +1,13 @@ +#include #include #include +#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; @@ -40,7 +44,7 @@ UserInterface::UserInterface(Engineer &e, Graphics::Window &window, Input::Keybo UserInterface::~UserInterface() { while(!dyn_dialogs.empty()) - delete dyn_dialogs.front(); + delete *dyn_dialogs.begin(); delete root_arrangement; } @@ -52,24 +56,23 @@ void UserInterface::set_status(const string &text) void UserInterface::add_dynamic_dialog(DynamicDialog &dd) { - dyn_dialogs.push_back(&dd); + dyn_dialogs.insert(&dd); } void UserInterface::remove_dynamic_dialog(DynamicDialog &dd) { - dyn_dialogs.erase(remove(dyn_dialogs.begin(), dyn_dialogs.end(), &dd), dyn_dialogs.end()); + dyn_dialogs.erase(&dd); } void UserInterface::show_train(Train &train) { TrainDialog *dlg = new TrainDialog(engineer, train); root.add(*dlg); - dlg->autosize(); } 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); } @@ -99,7 +102,7 @@ void UserInterface::tick() status_timeout = Time::TimeStamp(); } - for(list::iterator i=dyn_dialogs.begin(); i!=dyn_dialogs.end(); ++i) + for(set::iterator i=dyn_dialogs.begin(); i!=dyn_dialogs.end(); ++i) (*i)->update(); } @@ -107,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::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(ui) +{ + add("clockdialog", &Loader::basic_dialog); + add("departuresdialog", &Loader::basic_dialog); + add("telemetrydialog", &Loader::basic_dialog); + add("traindialog", &Loader::traindialog); + add("trainlistdialog", &Loader::basic_dialog); +} + +template +void UserInterface::Loader::dialog(T &dlg) +{ + obj.root.add(dlg); + typename T::StateLoader ldr(dlg); + load_sub_with(ldr); +} + +template +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))); +}