supertux
menu.hpp
1 // SuperTux
2 // Copyright (C) 2006 Matthias Braun <matze@braunis.de>
3 //
4 // This program is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with this program. If not, see <http://www.gnu.org/licenses/>.
16 
17 #ifndef HEADER_SUPERTUX_GUI_MENU_HPP
18 #define HEADER_SUPERTUX_GUI_MENU_HPP
19 
20 #include <functional>
21 #include <memory>
22 #include <SDL.h>
23 
24 #include "gui/menu_action.hpp"
25 #include "math/vector.hpp"
26 #include "video/color.hpp"
27 
28 class Controller;
29 class DrawingContext;
30 class ItemAction;
31 class ItemBack;
32 class ItemBadguySelect;
33 class ItemColor;
34 class ItemColorChannel;
35 class ItemColorDisplay;
36 class ItemControlField;
37 class ItemFile;
38 class ItemGoTo;
39 class ItemHorizontalLine;
40 class ItemInactive;
41 class ItemIntField;
42 class ItemLabel;
43 class ItemFloatField;
44 class ItemScript;
45 class ItemScriptLine;
46 class ItemStringSelect;
47 class ItemTextField;
48 class ItemToggle;
49 class MenuItem;
50 
51 class Menu
52 {
53 public:
54  Menu();
55  virtual ~Menu();
56 
57  virtual void menu_action(MenuItem& item) = 0;
58 
61  virtual bool on_back_action() { return true; }
62 
64  virtual void refresh() {}
65 
66  virtual void on_window_resize();
67 
68  ItemHorizontalLine& add_hl();
69  ItemLabel& add_label(const std::string& text);
70  ItemAction& add_entry(int id, const std::string& text);
71  ItemAction& add_entry(const std::string& text, std::function<void()> callback);
72  ItemToggle& add_toggle(int id, const std::string& text, bool* toggled);
73  ItemToggle& add_toggle(int id, const std::string& text,
74  std::function<bool()> get_func,
75  std::function<void(bool)> set_func);
76  ItemInactive& add_inactive(const std::string& text);
77  ItemBack& add_back(const std::string& text, int id = -1);
78  ItemGoTo& add_submenu(const std::string& text, int submenu, int id = -1);
79  ItemControlField& add_controlfield(int id, const std::string& text, const std::string& mapping = "");
80  ItemStringSelect& add_string_select(int id, const std::string& text, int* selected, const std::vector<std::string>& strings);
81  ItemTextField& add_textfield(const std::string& text, std::string* input, int id = -1);
82  ItemScript& add_script(const std::string& text, std::string* script, int id = -1);
83  ItemScriptLine& add_script_line(std::string* input, int id = -1);
84  ItemIntField& add_intfield(const std::string& text, int* input, int id = -1);
85  ItemFloatField& add_floatfield(const std::string& text, float* input, int id = -1);
86  ItemBadguySelect& add_badguy_select(const std::string& text, std::vector<std::string>* badguys, int id = -1);
87  ItemFile& add_file(const std::string& text, std::string* input, const std::vector<std::string>& extensions,
88  const std::string& basedir, int id = -1);
89 
90  ItemColor& add_color(const std::string& text, Color* color, int id = -1);
91  ItemColorDisplay& add_color_display(Color* color, int id = -1);
92  ItemColorChannel& add_color_channel(float* input, Color channel, int id = -1);
93 
94  void process_input(const Controller& controller);
95 
97  void clear();
98 
99  MenuItem& get_item(int index) { return *(m_items[index]); }
100 
101  MenuItem& get_item_by_id(int id);
102  const MenuItem& get_item_by_id(int id) const;
103 
104  int get_active_item_id() const;
105  void set_active_item(int id);
106 
107  void draw(DrawingContext& context);
108  Vector get_center_pos() const { return m_pos; }
109  void set_center_pos(float x, float y);
110 
111  void event(const SDL_Event& event);
112 
113  float get_width() const;
114  float get_height() const;
115 
116 protected:
118  virtual bool is_sensitive() const;
119 
120  MenuItem& add_item(std::unique_ptr<MenuItem> menu_item);
121  MenuItem& add_item(std::unique_ptr<MenuItem> menu_item, int pos_);
122  void delete_item(int pos_);
123 
124 private:
125  void process_action(const MenuAction& menuaction);
126  void check_controlfield_change_event(const SDL_Event& event);
127  void draw_item(DrawingContext& context, int index);
129  void calculate_width();
130 
131 private:
133  Vector m_pos;
134 
135  /* input implementation variables */
136  int m_delete_character;
137  char m_mn_input_char;
138  float m_menu_repeat_time;
139  float m_menu_width;
140 
141 public:
142  std::vector<std::unique_ptr<MenuItem> > m_items;
143 
144 private:
145  int m_arrange_left;
146 
147 protected:
148  int m_active_item;
149 
150 private:
151  Menu(const Menu&) = delete;
152  Menu& operator=(const Menu&) = delete;
153 };
154 
155 #endif
156 
157 /* EOF */
Definition: item_stringselect.hpp:24
Definition: item_script.hpp:22
Definition: controller.hpp:56
Definition: item_floatfield.hpp:22
Simple two dimensional vector.
Definition: vector.hpp:24
Definition: item_toggle.hpp:24
Definition: item_badguy_select.hpp:22
Definition: item_label.hpp:22
Definition: item_colordisplay.hpp:24
Definition: item_script_line.hpp:22
Definition: item_textfield.hpp:22
Definition: menu_item.hpp:23
Definition: item_colorchannel.hpp:24
virtual bool is_sensitive() const
returns true when the text is more important than action
Definition: menu.cpp:718
Definition: item_color.hpp:24
Definition: item_controlfield.hpp:22
virtual bool on_back_action()
Executed before the menu is exited.
Definition: menu.hpp:61
Definition: item_inactive.hpp:24
Definition: item_action.hpp:22
void process_input(const Controller &controller)
Definition: menu.cpp:334
void clear()
Remove all entries from the menu.
Definition: menu.cpp:327
Definition: menu.hpp:51
Definition: item_back.hpp:22
virtual void refresh()
Perform actions to bring the menu up to date with configuration changes.
Definition: menu.hpp:64
Definition: item_intfield.hpp:22
Definition: color.hpp:25
Definition: item_goto.hpp:22
Definition: item_file.hpp:22
This class provides functions for drawing things on screen.
Definition: drawing_context.hpp:42
Definition: item_hl.hpp:22