diff options
Diffstat (limited to 'src/core/descriptions.cc')
-rw-r--r-- | src/core/descriptions.cc | 245 |
1 files changed, 245 insertions, 0 deletions
diff --git a/src/core/descriptions.cc b/src/core/descriptions.cc new file mode 100644 index 0000000..fe37d2c --- /dev/null +++ b/src/core/descriptions.cc @@ -0,0 +1,245 @@ +/* + core/descriptions.cc + This file is part of the Osirion project and is distributed under + the terms of the GNU General Public License version 2 +*/ + +#include "core/descriptions.h" +#include "auxiliary/functions.h" +#include "sys/sys.h" + +namespace core { + +/* ---- class ButtonDescription ------------------------------------ */ + +ButtonDescription::ButtonDescription() +{ + button_model = 0; + button_align = Center; +} + +ButtonDescription::~ButtonDescription() +{ +} + +void ButtonDescription::set_text(const std::string &text) +{ + button_text.assign(text); +} + +void ButtonDescription::set_command(const std::string &command) +{ + button_command.assign(command); +} + +void ButtonDescription::set_modelname(const std::string &modelname) +{ + button_modelname.assign(modelname); + + button_model = model::Model::load(modelname); +} + +void ButtonDescription::set_alignment(Align align) +{ + button_align = align; +} + +/* ---- class MenuDescription -------------------------------------- */ + +MenuDescription::MenuDescription() +{ +} + +MenuDescription::~MenuDescription() +{ + for (Buttons::iterator it = buttons().begin(); it != buttons().end(); it++) { + delete (*it); + } + + buttons().clear(); +} + +void MenuDescription::set_text(const std::string &text) +{ + menu_text.assign(text); +} + +void MenuDescription::set_label(const std::string &label) +{ + menu_label.assign(label); +} + +void MenuDescription::add_button(ButtonDescription *button) +{ + buttons().push_back(button); +} + +/* ---- class Descriptions ----------------------------------------- */ + + +void Descriptions::serialize(MenuDescription *menu, std::ostream & os) +{ + os << menu->label() << " " + << "\"" << menu->text() << "\" " + << menu->buttons().size() << " "; + + for (MenuDescription::Buttons::iterator it = menu-> buttons().begin(); it != menu->buttons().end(); it++) { + ButtonDescription *button = (*it); + os << "\"" << button->text() << "\" " + << button->alignment() << " " + << "\"" << button->command() << "\" " + << "\"" << button->modelname() << "\" "; + } +} + +MenuDescription * Descriptions::receive(std::istream &is) +{ + MenuDescription *menu = new MenuDescription(); + + int a; + std::string n; + size_t nb; + char c; + + // menu label + is >> n; + menu->set_label(n); + + // menu text + n.clear(); + while ( (is.get(c)) && (c != '"')); + while ( (is.get(c)) && (c != '"')) + n += c; + + if (n.size()) + menu->set_text(n); + + // menu buttons + is >> nb; + for (size_t i=0; i < nb; i++) { + ButtonDescription *button = new ButtonDescription(); + // button text + n.clear(); + while ( (is.get(c)) && (c != '"')); + while ( (is.get(c)) && (c != '"')) + n += c; + if (n.size()) button->set_text(n); + + // button alignment + a = ButtonDescription::Center; + is >> a; + if (a == ButtonDescription::Left) + button->set_alignment(ButtonDescription::Left); + else if (a == ButtonDescription::Right) + button->set_alignment(ButtonDescription::Right); + else + button->set_alignment(ButtonDescription::Center); + + // button command + n.clear(); + while ( (is.get(c)) && (c != '"')); + while ( (is.get(c)) && (c != '"')) + n += c; + if (n.size()) button->set_command(n); + + // button modelname + n.clear(); + while ( (is.get(c)) && (c != '"')); + while ( (is.get(c)) && (c != '"')) + n += c; + if (n.size()) button->set_modelname(n); + + menu->add_button(button); + } + + return menu; + +} + +bool Descriptions::load_entity_menus(core::Entity *entity, const std::string &menufilename) +{ + filesystem::IniFile inifile; + inifile.open(menufilename); + + if (!inifile.is_open()) { + return false; + } + + con_debug << " " << inifile.name() << std::endl; + + std::string strval; + MenuDescription *menu = 0; + ButtonDescription *button = 0; + + while (inifile.getline()) { + + if (inifile.got_section()) { + if (inifile.got_section("menu")) { + menu = new MenuDescription; + entity->add_menu(menu); + + } else if (inifile.got_section("button")) { + if (menu) { + button = new ButtonDescription(); + menu->add_button(button); + } + } else { + inifile.unknown_section(); + } + + } else if (inifile.got_key()) { + + if (inifile.in_section("menu")) { + + if (inifile.got_key_string("label", strval)) { + aux::to_label(strval); + menu->set_label(strval); + } else if (inifile.got_key_string("text", strval)) { + aux::strip_quotes(strval); + menu->set_text(strval); + } else { + inifile.unkown_key(); + } + + } else if (inifile.in_section("button")) { + + if (!button) { + continue; + } else if (inifile.got_key_string("text", strval)) { + aux::strip_quotes(strval); + button->set_text(strval); + } else if (inifile.got_key_string("command", strval)) { + for (size_t i =0; i <= strval.size(); i++) { + if (strval[i] == ',') strval[i] = ';'; + } + aux::strip_quotes(strval); + button->set_command(strval); + } else if (inifile.got_key_string("model", strval)) { + button->set_modelname(strval); + } else if (inifile.got_key_string("align", strval)) { + aux::to_label(strval); + if (strval.compare("left") == 0) { + button->set_alignment(ButtonDescription::Left); + } else if (strval.compare("center") == 0) { + button->set_alignment(ButtonDescription::Center); + } else if (strval.compare("right") == 0) { + button->set_alignment(ButtonDescription::Right); + } else { + inifile.unknown_value(); + } + } else { + inifile.unkown_key(); + } + + } + } + } + + inifile.close(); + return true; +} + +} + + + |