X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fgui%2Fmenu.hpp;h=60d48dd6d32f98b294c0cc4f31e1ed6a0edf762f;hb=13c4ea0cbf0bdbadc268f49b3cbc797e4f7a746d;hp=302a402cbe5004066e995ecc78564aee38c7aca3;hpb=70fdbd45026801f0f0f312278c69b383eaca9d3a;p=supertux.git diff --git a/src/gui/menu.hpp b/src/gui/menu.hpp index 302a402cb..60d48dd6d 100644 --- a/src/gui/menu.hpp +++ b/src/gui/menu.hpp @@ -1,7 +1,7 @@ // $Id$ -// +// // SuperTux -// Copyright (C) 2004 Tobias Glaesser +// Copyright (C) 2006 Matthias Braun // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -12,14 +12,17 @@ // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + #ifndef SUPERTUX_MENU_H #define SUPERTUX_MENU_H #include +#include +#include #include #include #include @@ -39,7 +42,7 @@ enum MenuItemKind { MN_GOTO, MN_TOGGLE, MN_BACK, - MN_DEACTIVE, + MN_INACTIVE, MN_TEXTFIELD, MN_NUMFIELD, MN_CONTROLFIELD, @@ -49,28 +52,31 @@ enum MenuItemKind { }; class Menu; - + class MenuItem { public: MenuItem(MenuItemKind kind, int id = -1); MenuItemKind kind; - int id; // item id + int id; // item id bool toggled; std::string text; std::string input; - + std::string help; + std::vector list; // list of values for a STRINGSELECT item size_t selected; // currently selected item - + Menu* target_menu; - + + void set_help(const std::string& help_text); + void change_text (const std::string& text); void change_input(const std::string& text); - + static MenuItem* create(MenuItemKind kind, const std::string& text, int init_toggle, Menu* target_menu, int id, int key); - + std::string get_input_with_symbol(bool active_item); // returns the text with an input symbol private: @@ -82,26 +88,34 @@ private: /// keyboard key or joystick button bool input_flickering; }; - + class Menu { private: static std::vector last_menus; + + /** Pointers to all currently available menus, used to handle repositioning on window resize */ + static std::list all_menus; + + static Menu* previous; static Menu* current_; - - static void push_current(Menu* pmenu); + static void pop_current(); - + public: /** Set the current menu, if pmenu is NULL, hide the current menu */ static void set_current(Menu* pmenu); - + + static void push_current(Menu* pmenu); + + static void recalc_pos(); + /** Return the current active menu or NULL if none is active */ static Menu* current() { return current_; } - + private: /* Action done on the menu */ enum MenuAction { @@ -115,90 +129,97 @@ private: MENU_ACTION_REMOVE, MENU_ACTION_BACK }; - + /** Number of the item that got 'hit' (ie. pressed) in the last event()/update() call, -1 if none */ int hit_item; - + // position of the menu (ie. center of the menu, not top/left) float pos_x; float pos_y; - + /** input event for the menu (up, down, left, right, etc.) */ MenuAction menuaction; - + /* input implementation variables */ - int delete_character; - char mn_input_char; - Uint32 menu_repeat_ticks; + int delete_character; + char mn_input_char; + float menu_repeat_time; + + bool close; public: static Font* default_font; static Font* active_font; - static Font* deactive_font; + static Font* inactive_font; static Font* label_font; static Font* field_font; std::vector items; - + Menu(); virtual ~Menu(); - - void add_hl(); - void add_label(const std::string& text); - void add_entry(int id, const std::string& text); - void add_toggle(int id, const std::string& text, bool toggled = false); - void add_deactive(int id, const std::string& text); - void add_back(const std::string& text); - void add_submenu(const std::string& text, Menu* submenu, int id = -1); - void add_controlfield(int id, const std::string& text, - const std::string& mapping = ""); + + MenuItem* add_hl(); + MenuItem* add_label(const std::string& text); + MenuItem* add_entry(int id, const std::string& text); + MenuItem* add_toggle(int id, const std::string& text, bool toggled = false); + MenuItem* add_inactive(int id, const std::string& text); + MenuItem* add_back(const std::string& text); + MenuItem* add_submenu(const std::string& text, Menu* submenu, int id = -1); + MenuItem* add_controlfield(int id, const std::string& text, + const std::string& mapping = ""); + MenuItem* add_string_select(int id, const std::string& text); virtual void menu_action(MenuItem* item); - + void update(); - + /** Remove all entries from the menu */ void clear(); - + /** Return the index of the menu item that was 'hit' (ie. the user clicked on it) in the last event() call */ int check (); - + MenuItem& get_item(int index) { return *(items[index]); } MenuItem& get_item_by_id(int id); const MenuItem& get_item_by_id(int id) const; - + int get_active_item_id(); void set_active_item(int id); - - void draw(DrawingContext& context); + + void draw(DrawingContext& context); void set_pos(float x, float y, float rw = 0, float rh = 0); - + void event(const SDL_Event& event); bool is_toggled(int id) const; + void set_toggled(int id, bool toggled); + + Menu* get_parent() const; protected: - void additem(MenuItem* pmenu_item); - int get_width() const; - int get_height() const; + void additem(MenuItem* pmenu_item); + float get_width() const; + float get_height() const; private: - void check_controlfield_change_event(const SDL_Event& event); + void check_controlfield_change_event(const SDL_Event& event); void draw_item(DrawingContext& context, int index); - Uint32 effect_ticks; + float effect_progress; + float effect_start_time; int arrange_left; int active_item; -}; -extern Surface* checkbox; -extern Surface* checkbox_checked; -extern Surface* back; -extern Surface* arrow_left; -extern Surface* arrow_right; + std::auto_ptr checkbox; + std::auto_ptr checkbox_checked; + std::auto_ptr back; + std::auto_ptr arrow_left; + std::auto_ptr arrow_right; +}; #endif