X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fgui%2Fmenu.cpp;h=fd253e9beca49bd40746c3535ca6c137ce57ae66;hb=HEAD;hp=f2c55a40717311ee7996c07d4948e5bc0c234ec1;hpb=d1c49badcac1453e6fb40f531a929d5827ed569a;p=supertux.git diff --git a/src/gui/menu.cpp b/src/gui/menu.cpp index f2c55a407..fd253e9be 100644 --- a/src/gui/menu.cpp +++ b/src/gui/menu.cpp @@ -23,6 +23,7 @@ #include "gui/menu_item.hpp" #include "gui/menu_manager.hpp" #include "gui/mousecursor.hpp" +#include "supertux/colorscheme.hpp" #include "supertux/globals.hpp" #include "supertux/resources.hpp" #include "supertux/screen_manager.hpp" @@ -31,14 +32,13 @@ #include "video/drawing_context.hpp" #include "video/font.hpp" #include "video/renderer.hpp" +#include "video/video_system.hpp" static const float MENU_REPEAT_INITIAL = 0.4f; static const float MENU_REPEAT_RATE = 0.1f; Menu::Menu() : - hit_item(), pos(), - menuaction(), delete_character(), mn_input_char(), menu_repeat_time(), @@ -46,8 +46,6 @@ Menu::Menu() : arrange_left(), active_item() { - hit_item = -1; - menuaction = MENU_ACTION_NONE; delete_character = 0; mn_input_char = '\0'; @@ -62,7 +60,7 @@ Menu::~Menu() } void -Menu::set_pos(float x, float y) +Menu::set_center_pos(float x, float y) { pos.x = x; pos.y = y; @@ -172,7 +170,6 @@ Menu::clear() active_item = -1; } -/* Process actions done on the menu */ void Menu::process_input() { @@ -183,7 +180,8 @@ Menu::process_input() pos.y = SCREEN_HEIGHT/2 - scroll_offset * ((float(active_item) / (items.size()-1)) - 0.5f) * 2.0f; } - Controller* controller = g_input_manager->get_controller(); + MenuAction menuaction = MENU_ACTION_NONE; + Controller* controller = InputManager::current()->get_controller(); /** check main input controller... */ if(controller->pressed(Controller::UP)) { menuaction = MENU_ACTION_UP; @@ -229,15 +227,24 @@ Menu::process_input() || controller->pressed(Controller::MENU_SELECT)) { menuaction = MENU_ACTION_HIT; } - if(controller->pressed(Controller::PAUSE_MENU) - || controller->pressed(Controller::MENU_BACK)) { + if(controller->pressed(Controller::ESCAPE) || + controller->pressed(Controller::START) || + controller->pressed(Controller::MENU_BACK)) { menuaction = MENU_ACTION_BACK; } - hit_item = -1; if(items.size() == 0) return; + // The menu_action() call can pop() the menu from the stack and thus + // delete it, so it's important that no further member variables are + // accessed after this call + process_action(menuaction); +} + +void +Menu::process_action(MenuAction menuaction) +{ int last_active_item = active_item; switch(menuaction) { case MENU_ACTION_UP: @@ -289,7 +296,6 @@ Menu::process_input() break; case MENU_ACTION_HIT: { - hit_item = active_item; switch (items[active_item]->kind) { case MN_GOTO: assert(items[active_item]->target_menu != 0); @@ -326,7 +332,8 @@ Menu::process_input() case MN_BACK: MenuManager::instance().pop_menu(); - break; + return; + default: break; } @@ -361,35 +368,14 @@ Menu::process_input() case MENU_ACTION_BACK: MenuManager::instance().pop_menu(); - break; + return; case MENU_ACTION_NONE: break; } - menuaction = MENU_ACTION_NONE; - - assert(active_item < int(items.size())); -} - -int -Menu::check() -{ - if (hit_item != -1) - { - int id = items[hit_item]->id; - // Clear event when checked out.. (we would end up in a loop when we try to leave "fake" submenu like Addons or Contrib) - hit_item = -1; - return id; - } - else - return -1; } void -Menu::menu_action(MenuItem* ) -{} - -void Menu::draw_item(DrawingContext& context, int index) { float menu_height = get_height(); @@ -397,7 +383,7 @@ Menu::draw_item(DrawingContext& context, int index) MenuItem& pitem = *(items[index]); - Color text_color = default_color; + Color text_color = ColorScheme::Menu::default_color; float x_pos = pos.x; float y_pos = pos.y + 24*index - menu_height/2 + 12; int text_width = int(Resources::normal_font->get_text_width(pitem.text)); @@ -416,7 +402,7 @@ Menu::draw_item(DrawingContext& context, int index) if(index == active_item) { - text_color = active_color; + text_color = ColorScheme::Menu::active_color; } if(active_item == index) @@ -440,7 +426,7 @@ Menu::draw_item(DrawingContext& context, int index) { context.draw_text(Resources::normal_font, pitem.text, Vector(pos.x, y_pos - int(Resources::normal_font->get_height()/2)), - ALIGN_CENTER, LAYER_GUI, inactive_color); + ALIGN_CENTER, LAYER_GUI, ColorScheme::Menu::inactive_color); break; } @@ -462,7 +448,7 @@ Menu::draw_item(DrawingContext& context, int index) { context.draw_text(Resources::big_font, pitem.text, Vector(pos.x, y_pos - int(Resources::big_font->get_height()/2)), - ALIGN_CENTER, LAYER_GUI, label_color); + ALIGN_CENTER, LAYER_GUI, ColorScheme::Menu::label_color); break; } case MN_TEXTFIELD: @@ -475,17 +461,17 @@ Menu::draw_item(DrawingContext& context, int index) context.draw_text(Resources::normal_font, pitem.get_input_with_symbol(true), Vector(right, y_pos - int(Resources::normal_font->get_height()/2)), - ALIGN_RIGHT, LAYER_GUI, field_color); + ALIGN_RIGHT, LAYER_GUI, ColorScheme::Menu::field_color); else context.draw_text(Resources::normal_font, pitem.get_input_with_symbol(false), Vector(right, y_pos - int(Resources::normal_font->get_height()/2)), - ALIGN_RIGHT, LAYER_GUI, field_color); + ALIGN_RIGHT, LAYER_GUI, ColorScheme::Menu::field_color); } else context.draw_text(Resources::normal_font, pitem.input, Vector(right, y_pos - int(Resources::normal_font->get_height()/2)), - ALIGN_RIGHT, LAYER_GUI, field_color); + ALIGN_RIGHT, LAYER_GUI, ColorScheme::Menu::field_color); context.draw_text(Resources::normal_font, pitem.text, Vector(left, y_pos - int(Resources::normal_font->get_height()/2)), @@ -586,7 +572,13 @@ Menu::get_height() const return items.size() * 24; } -/* Draw the current menu. */ +void +Menu::on_window_resize() +{ + pos.x = SCREEN_WIDTH / 2; + pos.y = SCREEN_HEIGHT / 2; +} + void Menu::draw(DrawingContext& context) { @@ -633,7 +625,7 @@ Menu::get_item_by_id(int id) } } - throw std::runtime_error("MenuItem not found"); + throw std::runtime_error("MenuItem not found: " + std::to_string(id)); } const MenuItem& @@ -667,15 +659,14 @@ Menu::set_toggled(int id, bool toggled) get_item_by_id(id).toggled = toggled; } -/* Check for menu event */ void -Menu::event(const SDL_Event& event) +Menu::event(const SDL_Event& ev) { - switch(event.type) { + switch(ev.type) { case SDL_MOUSEBUTTONDOWN: - if(event.button.button == SDL_BUTTON_LEFT) + if(ev.button.button == SDL_BUTTON_LEFT) { - Vector mouse_pos = Renderer::instance()->to_logical(event.motion.x, event.motion.y); + Vector mouse_pos = VideoSystem::current()->get_renderer().to_logical(ev.motion.x, ev.motion.y); int x = int(mouse_pos.x); int y = int(mouse_pos.y); @@ -684,14 +675,14 @@ Menu::event(const SDL_Event& event) y > pos.y - get_height()/2 && y < pos.y + get_height()/2) { - menuaction = MENU_ACTION_HIT; + process_action(MENU_ACTION_HIT); } } break; case SDL_MOUSEMOTION: { - Vector mouse_pos = Renderer::instance()->to_logical(event.motion.x, event.motion.y); + Vector mouse_pos = VideoSystem::current()->get_renderer().to_logical(ev.motion.x, ev.motion.y); float x = mouse_pos.x; float y = mouse_pos.y;