--- /dev/null
+// SuperTux
+// Copyright (C) 2014 Ingo Ruhnke <grumbel@gmail.com>
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+#include "gui/dialog.hpp"
+
+#include "control/controller.hpp"
+#include "supertux/resources.hpp"
+#include "video/drawing_context.hpp"
+
+Dialog::Dialog() :
+ m_text("<no-text>"),
+ m_buttons(),
+ m_selected_button()
+{
+}
+
+void
+Dialog::add_button(const std::string& text)
+{
+ m_buttons.push_back(text);
+}
+
+void
+Dialog::process_input(const Controller& controller)
+{
+ if (controller.pressed(Controller::LEFT))
+ {
+ m_selected_button -= 1;
+ m_selected_button = std::max(m_selected_button, 0);
+ }
+
+ if (controller.pressed(Controller::RIGHT))
+ {
+ m_selected_button += 1;
+ m_selected_button = std::min(m_selected_button, static_cast<int>(m_buttons.size()) - 1);
+ }
+}
+
+void
+Dialog::draw(DrawingContext& ctx)
+{
+ for(int i = 0; i < static_cast<int>(m_buttons.size()); ++i)
+ {
+ if (i == m_selected_button)
+ {
+ // highlight
+ }
+ ctx.draw_text(Resources::normal_font, m_buttons[i],
+ Vector(100, 100),
+ ALIGN_CENTER, LAYER_GUI);
+ }
+}
+
+/* EOF */
--- /dev/null
+// SuperTux
+// Copyright (C) 2014 Ingo Ruhnke <grumbel@gmail.com>
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+#ifndef HEADER_SUPERTUX_GUI_DIALOG_HPP
+#define HEADER_SUPERTUX_GUI_DIALOG_HPP
+
+#include <string>
+#include <vector>
+
+class Controller;
+class DrawingContext;
+
+class Dialog
+{
+private:
+ std::string m_text;
+ std::vector<std::string> m_buttons;
+ int m_selected_button;
+
+public:
+ Dialog();
+
+ void add_button(const std::string& text);
+
+ void process_input(const Controller& controller);
+ void draw(DrawingContext& context);
+
+private:
+ Dialog(const Dialog&) = delete;
+ Dialog& operator=(const Dialog&) = delete;
+};
+
+#endif
+
+/* EOF */
#include <assert.h>
#include "control/input_manager.hpp"
+#include "gui/dialog.hpp"
#include "gui/menu.hpp"
#include "gui/mousecursor.hpp"
#include "math/sizef.hpp"
};
MenuManager::MenuManager() :
+ m_dialog(),
m_menu_stack(),
m_transition(new MenuTransition)
{
void
MenuManager::process_input()
{
- if (current())
+ if (m_dialog)
+ {
+ m_dialog->process_input(*InputManager::current()->get_controller());
+ }
+ else if (current())
{
current()->process_input();
}
}
else
{
- if (current())
+ if (m_dialog)
+ {
+ m_dialog->draw(context);
+ }
+ else if (current())
{
// brute force the transition into the right shape in case the
// menu has changed sizes
}
void
+MenuManager::set_dialog(std::unique_ptr<Dialog> dialog)
+{
+ m_dialog = std::move(dialog);
+}
+
+void
MenuManager::push_menu(int id)
{
push_menu(MenuStorage::instance().create(static_cast<MenuStorage::MenuId>(id)));
#include "SDL.h"
+class Dialog;
class DrawingContext;
class Menu;
class MenuTransition;
static MenuManager& instance();
private:
+ std::unique_ptr<Dialog> m_dialog;
std::vector<std::unique_ptr<Menu> > m_menu_stack;
std::unique_ptr<MenuTransition> m_transition;
void draw(DrawingContext& context);
+ void set_dialog(std::unique_ptr<Dialog> dialog);
+
void set_menu(int id);
void set_menu(std::unique_ptr<Menu> menu);
void push_menu(int id);