#303: Typo fixes from mathnerd314
[supertux.git] / src / gui / menu.hpp
1 //  $Id$
2 //
3 //  SuperTux
4 //  Copyright (C) 2006 Matthias Braun <matze@braunis.de>
5 //
6 //  This program is free software; you can redistribute it and/or
7 //  modify it under the terms of the GNU General Public License
8 //  as published by the Free Software Foundation; either version 2
9 //  of the License, or (at your option) any later version.
10 //
11 //  This program is distributed in the hope that it will be useful,
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 //  GNU General Public License for more details.
15 //
16 //  You should have received a copy of the GNU General Public License
17 //  along with this program; if not, write to the Free Software
18 //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19
20 #ifndef SUPERTUX_MENU_H
21 #define SUPERTUX_MENU_H
22
23 #include <vector>
24 #include <list>
25 #include <memory>
26 #include <set>
27 #include <string>
28 #include <utility>
29 #include <assert.h>
30
31 #include <SDL.h>
32
33 #include "video/surface.hpp"
34 #include "video/font.hpp"
35 #include "mousecursor.hpp"
36
37 bool confirm_dialog(Surface* background, std::string text);
38
39 /* Kinds of menu items */
40 enum MenuItemKind {
41   MN_ACTION,
42   MN_GOTO,
43   MN_TOGGLE,
44   MN_BACK,
45   MN_INACTIVE,
46   MN_TEXTFIELD,
47   MN_NUMFIELD,
48   MN_CONTROLFIELD,
49   MN_STRINGSELECT,
50   MN_LABEL,
51   MN_HL, /* horizontal line */
52 };
53
54 class Menu;
55 \f
56 class MenuItem
57 {
58 public:
59   MenuItem(MenuItemKind kind, int id = -1);
60   MenuItemKind kind;
61   int id;   // item id
62   bool toggled;
63   std::string text;
64   std::string input;
65   std::string help;
66
67   std::vector<std::string> list; // list of values for a STRINGSELECT item
68   size_t selected; // currently selected item
69
70   Menu* target_menu;
71
72   void set_help(const std::string& help_text);
73
74   void change_text (const std::string& text);
75   void change_input(const std::string& text);
76
77   static MenuItem* create(MenuItemKind kind, const std::string& text,
78                           int init_toggle, Menu* target_menu, int id, int key);
79
80   std::string get_input_with_symbol(bool active_item);   // returns the text with an input symbol
81
82 private:
83   /// copy-construction not allowed
84   MenuItem(const MenuItem& ) { assert(false); }
85   /// assignment not allowed
86   void operator= (const MenuItem& ) { assert(false); }
87
88   /// keyboard key or joystick button
89   bool input_flickering;
90 };
91 \f
92 class Menu
93 {
94 private:
95   static std::vector<Menu*> last_menus;
96
97   /** Pointers to all currently available menus, used to handle repositioning on window resize */
98   static std::list<Menu*>   all_menus;
99
100   static Menu* previous;
101   static Menu* current_;
102
103   static void pop_current();
104
105 public:
106   /** Set the current menu, if pmenu is NULL, hide the current menu */
107   static void set_current(Menu* pmenu);
108
109   static void push_current(Menu* pmenu);
110
111   static void recalc_pos();
112
113   /** Return the current active menu or NULL if none is active */
114   static Menu* current()
115   {
116     return current_;
117   }
118
119 private:
120   /* Action done on the menu */
121   enum MenuAction {
122     MENU_ACTION_NONE = -1,
123     MENU_ACTION_UP,
124     MENU_ACTION_DOWN,
125     MENU_ACTION_LEFT,
126     MENU_ACTION_RIGHT,
127     MENU_ACTION_HIT,
128     MENU_ACTION_INPUT,
129     MENU_ACTION_REMOVE,
130     MENU_ACTION_BACK
131   };
132
133   /** Number of the item that got 'hit' (ie. pressed) in the last
134       event()/update() call, -1 if none */
135   int hit_item;
136
137   // position of the menu (ie. center of the menu, not top/left)
138   float pos_x;
139   float pos_y;
140
141   /** input event for the menu (up, down, left, right, etc.) */
142   MenuAction menuaction;
143
144   /* input implementation variables */
145   int   delete_character;
146   char  mn_input_char;
147   float menu_repeat_time;
148
149 public:
150   static Font* default_font;
151   static Font* active_font;
152   static Font* inactive_font;
153   static Font* label_font;
154   static Font* field_font;
155
156   std::vector<MenuItem*> items;
157
158   Menu();
159   virtual ~Menu();
160
161   MenuItem* add_hl();
162   MenuItem* add_label(const std::string& text);
163   MenuItem* add_entry(int id, const std::string& text);
164   MenuItem* add_toggle(int id, const std::string& text, bool toggled = false);
165   MenuItem* add_inactive(int id, const std::string& text);
166   MenuItem* add_back(const std::string& text);
167   MenuItem* add_submenu(const std::string& text, Menu* submenu, int id = -1);
168   MenuItem* add_controlfield(int id, const std::string& text,
169                              const std::string& mapping = "");
170   MenuItem* add_string_select(int id, const std::string& text);
171
172   virtual void menu_action(MenuItem* item);
173
174   void update();
175
176   /** Remove all entries from the menu */
177   void clear();
178
179   /** Return the index of the menu item that was 'hit' (ie. the user
180       clicked on it) in the last event() call */
181   int check ();
182
183   MenuItem& get_item(int index)
184   {
185     return *(items[index]);
186   }
187   MenuItem& get_item_by_id(int id);
188   const MenuItem& get_item_by_id(int id) const;
189
190   int get_active_item_id();
191   void set_active_item(int id);
192
193   void draw(DrawingContext& context);
194   void set_pos(float x, float y, float rw = 0, float rh = 0);
195
196   void event(const SDL_Event& event);
197
198   bool is_toggled(int id) const;
199   void set_toggled(int id, bool toggled);
200
201   Menu* get_parent() const;
202
203 protected:
204   void additem(MenuItem* pmenu_item);
205   float get_width() const;
206   float get_height() const;
207
208 private:
209   void check_controlfield_change_event(const SDL_Event& event);
210   void draw_item(DrawingContext& context, int index);
211   float effect_progress;
212   float effect_start_time;
213   int arrange_left;
214   int active_item;
215
216   std::auto_ptr<Surface> checkbox;
217   std::auto_ptr<Surface> checkbox_checked;
218   std::auto_ptr<Surface> back;
219   std::auto_ptr<Surface> arrow_left;
220   std::auto_ptr<Surface> arrow_right;
221 };
222
223 #endif