X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;ds=inline;f=src%2Fgui%2Fmenu.cpp;h=cc062a08af63139d45f386a7beb6b6d89f2dbb5a;hb=ba5f95533903ed6190b0fddede258c86540afffa;hp=6d6c2f6a86deeae56e0afc42ed410d1e9175702b;hpb=38105c22495d9439b30221732dd5d7b89f328a0c;p=supertux.git diff --git a/src/gui/menu.cpp b/src/gui/menu.cpp index 6d6c2f6a8..cc062a08a 100644 --- a/src/gui/menu.cpp +++ b/src/gui/menu.cpp @@ -51,11 +51,6 @@ std::vector Menu::last_menus; std::list Menu::all_menus; Menu* Menu::current_ = 0; Menu* Menu::previous = 0; -Font* Menu::default_font; -Font* Menu::active_font; -Font* Menu::inactive_font; -Font* Menu::label_font; -Font* Menu::field_font; /* just displays a Yes/No text that can be used to confirm stuff */ bool confirm_dialog(Surface *background, std::string text) @@ -117,7 +112,7 @@ bool confirm_dialog(Surface *background, std::string text) return false; } - + void Menu::push_current(Menu* pmenu) { @@ -142,23 +137,30 @@ Menu::pop_current() current_->effect_progress = 0.0f; last_menus.pop_back(); } else { - current_ = 0; + set_current(NULL); } } void Menu::set_current(Menu* menu) { + if (current_ && current_->close == true) + return; + previous = current_; - last_menus.clear(); + if (menu) { + menu->effect_start_time = real_time; + menu->effect_progress = 0.0f; + current_ = menu; + } + else if (current_) { + last_menus.clear(); //NULL new menu pointer => close all menus + current_->effect_start_time = real_time; + current_->effect_progress = 0.0f; + current_->close = true; + } - if (menu) - { - menu->effect_start_time = real_time; - menu->effect_progress = 0.0f; - } - current_ = menu; // just to be sure... main_controller->reset(); } @@ -175,7 +177,7 @@ Menu::recalc_pos() (*i)->set_pos(SCREEN_WIDTH/2, SCREEN_HEIGHT/2); } } - + MenuItem::MenuItem(MenuItemKind _kind, int _id) : kind(_kind) , id(_id) { @@ -200,11 +202,11 @@ void MenuItem::set_help(const std::string& help_text) { std::string overflow; - help = Menu::default_font->wrap_to_width(help_text, 600, &overflow); + help = normal_font->wrap_to_width(help_text, 600, &overflow); while (!overflow.empty()) { help += "\n"; - help += Menu::default_font->wrap_to_width(overflow, 600, &overflow); + help += normal_font->wrap_to_width(overflow, 600, &overflow); } } @@ -226,7 +228,7 @@ std::string MenuItem::get_input_with_symbol(bool active_item) return string; } - + Menu::~Menu() { all_menus.remove(this); @@ -243,6 +245,7 @@ Menu::~Menu() } Menu::Menu() + : close(false) { all_menus.push_back(this); @@ -401,7 +404,13 @@ Menu::update() if(effect_progress >= 1.0f) { effect_progress = 1.0f; - } else if (effect_progress <= 0.0f) { + + if (close) { + current_ = 0; + close = false; + } + } + else if (effect_progress <= 0.0f) { effect_progress = 0.0f; } @@ -612,19 +621,19 @@ Menu::draw_item(DrawingContext& context, int index) MenuItem& pitem = *(items[index]); - Font* text_font = default_font; + Color text_color = default_color; float x_pos = pos_x; float y_pos = pos_y + 24*index - menu_height/2 + 12; int shadow_size = 2; - int text_width = int(text_font->get_text_width(pitem.text)); - int input_width = int(text_font->get_text_width(pitem.input) + 10); + int text_width = int(normal_font->get_text_width(pitem.text)); + int input_width = int(normal_font->get_text_width(pitem.input) + 10); int list_width = 0; float left = pos_x - menu_width/2 + 16; float right = pos_x + menu_width/2 - 16; if(pitem.list.size() > 0) { - list_width = (int) text_font->get_text_width(pitem.list[pitem.selected]); + list_width = (int) normal_font->get_text_width(pitem.list[pitem.selected]); } if (arrange_left) @@ -633,7 +642,7 @@ Menu::draw_item(DrawingContext& context, int index) if(index == active_item) { shadow_size = 3; - text_font = active_font; + text_color = active_color; } if(active_item == index) @@ -655,9 +664,9 @@ Menu::draw_item(DrawingContext& context, int index) { case MN_INACTIVE: { - context.draw_text(inactive_font, pitem.text, - Vector(pos_x, y_pos - int(inactive_font->get_height()/2)), - ALIGN_CENTER, LAYER_GUI); + context.draw_text(normal_font, pitem.text, + Vector(pos_x, y_pos - int(normal_font->get_height()/2)), + ALIGN_CENTER, LAYER_GUI, inactive_color); break; } @@ -677,9 +686,9 @@ Menu::draw_item(DrawingContext& context, int index) } case MN_LABEL: { - context.draw_text(label_font, pitem.text, - Vector(pos_x, y_pos - int(label_font->get_height()/2)), - ALIGN_CENTER, LAYER_GUI); + context.draw_text(big_font, pitem.text, + Vector(pos_x, y_pos - int(big_font->get_height()/2)), + ALIGN_CENTER, LAYER_GUI, label_color); break; } case MN_TEXTFIELD: @@ -689,33 +698,33 @@ Menu::draw_item(DrawingContext& context, int index) if(pitem.kind == MN_TEXTFIELD || pitem.kind == MN_NUMFIELD) { if(active_item == index) - context.draw_text(field_font, + context.draw_text(normal_font, pitem.get_input_with_symbol(true), - Vector(right, y_pos - int(field_font->get_height()/2)), - ALIGN_RIGHT, LAYER_GUI); + Vector(right, y_pos - int(normal_font->get_height()/2)), + ALIGN_RIGHT, LAYER_GUI, field_color); else - context.draw_text(field_font, + context.draw_text(normal_font, pitem.get_input_with_symbol(false), - Vector(right, y_pos - int(field_font->get_height()/2)), - ALIGN_RIGHT, LAYER_GUI); + Vector(right, y_pos - int(normal_font->get_height()/2)), + ALIGN_RIGHT, LAYER_GUI, field_color); } else - context.draw_text(field_font, pitem.input, - Vector(right, y_pos - int(field_font->get_height()/2)), - ALIGN_RIGHT, LAYER_GUI); + context.draw_text(normal_font, pitem.input, + Vector(right, y_pos - int(normal_font->get_height()/2)), + ALIGN_RIGHT, LAYER_GUI, field_color); - context.draw_text(text_font, pitem.text, - Vector(left, y_pos - int(text_font->get_height()/2)), - ALIGN_LEFT, LAYER_GUI); + context.draw_text(normal_font, pitem.text, + Vector(left, y_pos - int(normal_font->get_height()/2)), + ALIGN_LEFT, LAYER_GUI, text_color); break; } case MN_STRINGSELECT: { float roff = arrow_left->get_width(); // Draw left side - context.draw_text(text_font, pitem.text, - Vector(left, y_pos - int(text_font->get_height()/2)), - ALIGN_LEFT, LAYER_GUI); + context.draw_text(normal_font, pitem.text, + Vector(left, y_pos - int(normal_font->get_height()/2)), + ALIGN_LEFT, LAYER_GUI, text_color); // Draw right side context.draw_surface(arrow_left.get(), @@ -724,16 +733,16 @@ Menu::draw_item(DrawingContext& context, int index) context.draw_surface(arrow_right.get(), Vector(right - roff, y_pos - 8), LAYER_GUI); - context.draw_text(field_font, pitem.list[pitem.selected], - Vector(right - roff, y_pos - int(text_font->get_height()/2)), - ALIGN_RIGHT, LAYER_GUI); + context.draw_text(normal_font, pitem.list[pitem.selected], + Vector(right - roff, y_pos - int(normal_font->get_height()/2)), + ALIGN_RIGHT, LAYER_GUI, text_color); break; } case MN_BACK: { - context.draw_text(text_font, pitem.text, - Vector(pos_x, y_pos - int(text_font->get_height()/2)), - ALIGN_CENTER, LAYER_GUI); + context.draw_text(normal_font, pitem.text, + Vector(pos_x, y_pos - int(normal_font->get_height()/2)), + ALIGN_CENTER, LAYER_GUI, text_color); context.draw_surface(back.get(), Vector(x_pos + text_width/2 + 16, y_pos - 8), LAYER_GUI); @@ -742,9 +751,9 @@ Menu::draw_item(DrawingContext& context, int index) case MN_TOGGLE: { - context.draw_text(text_font, pitem.text, - Vector(pos_x - menu_width/2 + 16, y_pos - (text_font->get_height()/2)), - ALIGN_LEFT, LAYER_GUI); + context.draw_text(normal_font, pitem.text, + Vector(pos_x - menu_width/2 + 16, y_pos - (normal_font->get_height()/2)), + ALIGN_LEFT, LAYER_GUI, text_color); if(pitem.toggled) context.draw_surface(checkbox_checked.get(), @@ -757,15 +766,15 @@ Menu::draw_item(DrawingContext& context, int index) break; } case MN_ACTION: - context.draw_text(text_font, pitem.text, - Vector(pos_x, y_pos - int(text_font->get_height()/2)), - ALIGN_CENTER, LAYER_GUI); + context.draw_text(normal_font, pitem.text, + Vector(pos_x, y_pos - int(normal_font->get_height()/2)), + ALIGN_CENTER, LAYER_GUI, text_color); break; case MN_GOTO: - context.draw_text(text_font, pitem.text, - Vector(pos_x, y_pos - int(text_font->get_height()/2)), - ALIGN_CENTER, LAYER_GUI); + context.draw_text(normal_font, pitem.text, + Vector(pos_x, y_pos - int(normal_font->get_height()/2)), + ALIGN_CENTER, LAYER_GUI, text_color); break; } } @@ -778,12 +787,12 @@ Menu::get_width() const float menu_width = 0; for(unsigned int i = 0; i < items.size(); ++i) { - Font* font = default_font; + Font* font = normal_font; if(items[i]->kind == MN_LABEL) - font = label_font; + font = big_font; float w = font->get_text_width(items[i]->text) + - label_font->get_text_width(items[i]->input) + 16; + big_font->get_text_width(items[i]->input) + 16; if(items[i]->kind == MN_TOGGLE) w += 32; @@ -813,7 +822,12 @@ Menu::draw(DrawingContext& context) if (effect_progress != 1.0f) { - if (Menu::previous) + if (close) + { + menu_width = (current_->get_width() * (1.0f - effect_progress)); + menu_height = (current_->get_height() * (1.0f - effect_progress)); + } + else if (Menu::previous) { menu_width = (menu_width * effect_progress) + (Menu::previous->get_width() * (1.0f - effect_progress)); menu_height = (menu_height * effect_progress) + (Menu::previous->get_height() * (1.0f - effect_progress)); @@ -841,8 +855,8 @@ Menu::draw(DrawingContext& context) if (!items[active_item]->help.empty()) { - int text_width = (int) default_font->get_text_width(items[active_item]->help); - int text_height = (int) default_font->get_text_height(items[active_item]->help); + int text_width = (int) normal_font->get_text_width(items[active_item]->help); + int text_height = (int) normal_font->get_text_height(items[active_item]->help); Rect text_rect(pos_x - text_width/2 - 8, SCREEN_HEIGHT - 48 - text_height/2 - 4, @@ -860,7 +874,7 @@ Menu::draw(DrawingContext& context) 16.0f, LAYER_GUI-10); - context.draw_text(default_font, items[active_item]->help, + context.draw_text(normal_font, items[active_item]->help, Vector(pos_x, SCREEN_HEIGHT - 48 - text_height/2), ALIGN_CENTER, LAYER_GUI); }