/* client/entitymenu.cc This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #include "ui/ui.h" #include "ui/button.h" #include "ui/paint.h" #include "client/entitymenu.h" namespace client { EntityMenu::EntityMenu(ui::Widget *parent, const char * label) : ui::Widget(parent) { set_border(false); set_background(false); if (label) set_label(label); else set_label("entitymenu"); menu_container = new ui::Container(this); menu_generated_entity = 0; hide(); } EntityMenu::~EntityMenu() { } void EntityMenu::resize() { set_size(parent()->size()); menu_container->set_location(ui::UI::elementsize.height(), (height() - menu_container->height()) / 2.0f); } void EntityMenu::clear() { remove_children(); } void EntityMenu::generate(core::Entity *entity, const char *menulabel) { using namespace ui; menu_generated_menu.clear(); menu_generated_entity = entity; if (!entity) return; if (!menulabel) { return; } menu_generated_menu.assign(menulabel); if (!menu_generated_menu.size()) return; //con_debug << "generating menu " << entity->label() << " " << menulabel << std::endl; clear(); menu_container = new Container(this); core::MenuDescription *menudescr = 0; for (core::Entity::Menus::iterator it = entity->menus().begin(); it != entity->menus().end(); it++) { if ((*it)->label().compare(menulabel) == 0) { menudescr = (*it); } } if (!menudescr) { menu_container->event_resize(); resize(); return; } if (menudescr->text().size()) { Label *label = new Label(menu_container); label->set_text(menudescr->text()); label->set_alignment(AlignCenter); label->set_border(false); label->set_font(ui::root()->font_large()); } for (core::MenuDescription::Buttons::iterator it = menudescr->buttons().begin(); it != menudescr->buttons().end(); it++) { core::ButtonDescription *buttondescr = (*it); // parse the command sequence size_t i = 0; std::string result; std::string current; bool quote = false; while (i < buttondescr->command().size()) { const char c = buttondescr->command()[i]; if (c == '"') { quote = !quote; result += c; } else if (c == ';') { if (quote) { current += c; } else if (current.size()) { if (buttondescr->command_type() == core::ButtonDescription::CommandGame) { if (result.size()) { result += ';'; } result.append("remote "); result.append(current); } else if (buttondescr->command_type() == core::ButtonDescription::CommandMenu) { if (result.size()) { result += ';'; } result.append("view "); result.append(current); } current.clear(); } } else { current += c; } i++; } if (current.size()) { if (buttondescr->command_type() == core::ButtonDescription::CommandGame) { if (result.size()) { result += ';'; } result.append("remote "); result.append(current); } else if (buttondescr->command_type() == core::ButtonDescription::CommandMenu) { if (result.size()) { result += ';'; } result.append("view "); result.append(current); } } Button *button = new Button(menu_container, buttondescr->text().c_str(), result.c_str()); switch (buttondescr->alignment()) { case core::ButtonDescription::Center: button->set_alignment(AlignCenter); break; case core::ButtonDescription::Left: button->set_alignment(AlignLeft | AlignVCenter); break; case core::ButtonDescription::Right: button->set_alignment(AlignRight | AlignVCenter); break; } } menu_container->event_resize(); resize(); } bool EntityMenu::on_keypress(const int key, const unsigned int modifier) { switch (key) { case SDLK_ESCAPE: if (visible()) { if (menu_generated_menu.compare("main") != 0) { generate(menu_generated_entity, "main"); } else { this->hide(); ui::root()->show_menu("game"); } return true; } break; default: break; } return Widget::on_keypress(key, modifier); } }