supertux
dialog.hpp
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 
29 class Controller;
30 class DrawingContext;
31 
32 class Dialog
33 {
34 private:
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 
49 public:
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 
58  void add_default_button(const std::string& text, const std::function<void ()>& callback = {});
59 
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 
94 private:
95  void on_button_click(int button) const;
96  int get_button_at(const Vector& pos) const;
97 
98 private:
99  Dialog(const Dialog&) = delete;
100  Dialog& operator=(const Dialog&) = delete;
101 };
102 
103 #endif
104 
105 /* EOF */
Definition: dialog.hpp:32
Definition: controller.hpp:56
Simple two dimensional vector.
Definition: vector.hpp:24
void add_cancel_button(const std::string &text, const std::function< void()> &callback={})
The cancel button can not only be activated by selecting it, but via the MENU_BACK button...
Definition: dialog.cpp:72
This class provides functions for drawing things on screen.
Definition: drawing_context.hpp:42
void add_default_button(const std::string &text, const std::function< void()> &callback={})
The default gets focused when the dialog is first shown.
Definition: dialog.cpp:65
Definition: sizef.hpp:26