1// SuperTux
2// Copyright (C) 2009 Ingo Ruhnke <grumbel@gmail.com>
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_MANAGER_HPP
18#define HEADER_SUPERTUX_GUI_MENU_MANAGER_HPP
19
20#include <memory>
21#include <vector>
22
23class Controller;
24class Dialog;
25class DrawingContext;
26class Menu;
27class MenuTransition;
28union SDL_Event;
29
30class MenuManager final
31{
32private:
33 static MenuManager* s_instance;
34public:
35 static MenuManager& instance();
36
37private:
38 std::unique_ptr<Dialog> m_dialog;
39 bool m_has_next_dialog;
40 std::unique_ptr<Dialog> m_next_dialog;
41
42 std::vector<std::unique_ptr<Menu> > m_menu_stack;
43 std::unique_ptr<MenuTransition> m_transition;
44
45public:
46 MenuManager();
47 ~MenuManager();
48
49 void event(const SDL_Event& event);
50 void process_input(const Controller& controller);
51 void refresh();
52
53 void draw(DrawingContext& context);
54
55 void set_dialog(std::unique_ptr<Dialog> dialog);
56
57 void set_menu(int id);
58 void set_menu(std::unique_ptr<Menu> menu);
59 void push_menu(int id);
60 void push_menu(std::unique_ptr<Menu> menu);
61 void pop_menu();
62 void clear_menu_stack();
63
64 void on_window_resize();
65 bool is_active() const
66 {
67 return !m_menu_stack.empty();
68 }
69
70 Menu* current_menu() const;
71
72private:
73 void transition(Menu* from, Menu* to);
74
75private:
76 MenuManager(const MenuManager&) = delete;
77 MenuManager& operator=(const MenuManager&) = delete;
78};
79
80#endif
81
82/* EOF */
83