1// SuperTux
2// Copyright (C) 2014 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_DIALOG_HPP
18#define HEADER_SUPERTUX_GUI_DIALOG_HPP
19
20#include <SDL.h>
21#include <functional>
22#include <string>
23#include <vector>
24
25#include "gui/menu_manager.hpp"
26#include "math/sizef.hpp"
27#include "util/gettext.hpp"
28
29class Controller;
30class DrawingContext;
31
32class Dialog
33{
34private:
35 struct Button
36 {
37 std::string text;
38 std::function<void ()> callback;
39 };
40
41 std::string m_text;
42 std::vector<Button> m_buttons;
43 int m_selected_button;
44 int m_cancel_button;
45 bool m_passive;
46
47 Sizef m_text_size;
48
49public:
50 Dialog(bool passive = false);
51 virtual ~Dialog();
52
53 void set_text(const std::string& text);
54
55 void add_button(const std::string& text, const std::function<void ()>& callback = {});
56
57 /** The default gets focused when the dialog is first shown */
58 void add_default_button(const std::string& text, const std::function<void ()>& callback = {});
59
60 /** The cancel button can not only be activated by selecting it, but
61 via the MENU_BACK button */
62 void add_cancel_button(const std::string& text, const std::function<void ()>& callback = {});
63
64 void clear_buttons();
65
66 void event(const SDL_Event& event);
67 void process_input(const Controller& controller);
68 void draw(DrawingContext& context);
69 virtual void update() {}
70 bool is_passive() const
71 {
72 return m_passive;
73 }
74
75 static void show_message(const std::string& text)
76 {
77 auto dialog = std::make_unique<Dialog>();
78 dialog->set_text(text);
79 dialog->clear_buttons();
80 dialog->add_button(_("OK"), [] {});
81 MenuManager::instance().set_dialog(std::move(dialog));
82 }
83
84 static void show_confirmation(const std::string& text, const std::function<void ()>& callback)
85 {
86 auto dialog = std::make_unique<Dialog>();
87 dialog->set_text(text);
88 dialog->clear_buttons();
89 dialog->add_default_button(_("Yes"), callback);
90 dialog->add_cancel_button(_("No"));
91 MenuManager::instance().set_dialog(std::move(dialog));
92 }
93
94private:
95 void on_button_click(int button) const;
96 int get_button_at(const Vector& pos) const;
97
98private:
99 Dialog(const Dialog&) = delete;
100 Dialog& operator=(const Dialog&) = delete;
101};
102
103#endif
104
105/* EOF */
106