/* 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; button_commandtype = CommandNone; } ButtonDescription::~ButtonDescription() { } void ButtonDescription::set_text(const std::string &text) { button_text.assign(text); } void ButtonDescription::set_command(const std::string &command, const CommandType command_type) { button_commandtype = command_type; 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_type() << " " << "\"" << button->command() << "\" " << "\"" << button->modelname() << "\" "; } } MenuDescription * Descriptions::receive(std::istream &is) { MenuDescription *menu = new MenuDescription(); int a; int t; 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 type is >> t; // button command n.clear(); while ((is.get(c)) && (c != '"')); while ((is.get(c)) && (c != '"')) n += c; if (n.size()) { if (t == ButtonDescription::CommandGame) { button->set_command(n, ButtonDescription::CommandGame); } else if (t == ButtonDescription::CommandMenu) { button->set_command(n, ButtonDescription::CommandMenu); } } // 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); // default command is a game command button->set_command(strval, ButtonDescription::CommandGame); } 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; } }