2 // Copyright (C) 2006 Matthias Braun <matze@braunis.de>,
3 // 2007,2014 Ingo Ruhnke <grumbel@gmail.com>
5 // This program is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #include "supertux/menu/joystick_menu.hpp"
22 #include "control/joystick_manager.hpp"
23 #include "util/gettext.hpp"
28 MNID_JUMP_WITH_UP = Controller::CONTROLCOUNT,
30 MNID_AUTO_JOYSTICK_CFG
35 JoystickMenu::JoystickMenu(InputManager* input_manager) :
36 m_input_manager(input_manager),
37 m_joysticks_available(false)
42 JoystickMenu::~JoystickMenu()
46 JoystickMenu::recreate_menu()
49 add_label(_("Setup Joystick"));
52 add_toggle(MNID_AUTO_JOYSTICK_CFG, _("Manual Configuration"),
53 !m_input_manager->use_game_controller())
54 ->set_help(_("Use manual configuration instead of SDL2's automatic GameController support"));
56 if (m_input_manager->use_game_controller())
58 m_joysticks_available = false;
62 if (m_input_manager->joystick_manager->joysticks.size() > 0)
64 m_joysticks_available = true;
66 add_controlfield(Controller::UP, _("Up"));
67 add_controlfield(Controller::DOWN, _("Down"));
68 add_controlfield(Controller::LEFT, _("Left"));
69 add_controlfield(Controller::RIGHT, _("Right"));
70 add_controlfield(Controller::JUMP, _("Jump"));
71 add_controlfield(Controller::ACTION, _("Action"));
72 add_controlfield(Controller::PAUSE_MENU, _("Pause/Menu"));
73 add_controlfield(Controller::PEEK_LEFT, _("Peek Left"));
74 add_controlfield(Controller::PEEK_RIGHT, _("Peek Right"));
75 add_controlfield(Controller::PEEK_UP, _("Peek Up"));
76 add_controlfield(Controller::PEEK_DOWN, _("Peek Down"));
78 add_toggle(MNID_JUMP_WITH_UP, _("Jump with Up"), m_input_manager->joystick_manager->jump_with_up_joy);
82 m_joysticks_available = false;
84 add_inactive(-1, _("No Joysticks found"));
85 add_entry(MNID_SCAN_JOYSTICKS, _("Scan for Joysticks"));
95 JoystickMenu::get_button_name(int button)
103 std::ostringstream name;
104 name << "Button " << button;
110 JoystickMenu::menu_action(MenuItem* item)
112 if (0 <= item->id && item->id < Controller::CONTROLCOUNT)
114 item->change_input(_("Press Button"));
115 m_input_manager->joystick_manager->wait_for_joystick = item->id;
117 else if (item->id == MNID_JUMP_WITH_UP)
119 m_input_manager->joystick_manager->jump_with_up_joy = item->toggled;
121 else if (item->id == MNID_AUTO_JOYSTICK_CFG)
123 m_input_manager->use_game_controller(!item->toggled);
124 m_input_manager->reset();
127 else if(item->id == MNID_SCAN_JOYSTICKS)
129 m_input_manager->reset();
135 JoystickMenu::refresh_menu_item(Controller::Control id)
137 int button = m_input_manager->joystick_manager->reversemap_joybutton(id);
138 int axis = m_input_manager->joystick_manager->reversemap_joyaxis(id);
139 int hat_dir = m_input_manager->joystick_manager->reversemap_joyhat(id);
143 get_item_by_id(static_cast<int>(id)).change_input(get_button_name(button));
147 std::ostringstream name;
158 else if (abs(axis) == 2)
160 else if (abs(axis) == 2)
162 else if (abs(axis) == 3)
167 get_item_by_id(static_cast<int>(id)).change_input(name.str());
169 else if (hat_dir != -1)
192 name = "Unknown hat_dir";
196 get_item_by_id(static_cast<int>(id)).change_input(name);
200 get_item_by_id(static_cast<int>(id)).change_input("None");
205 JoystickMenu::refresh()
207 if (m_joysticks_available)
209 refresh_menu_item(Controller::UP);
210 refresh_menu_item(Controller::DOWN);
211 refresh_menu_item(Controller::LEFT);
212 refresh_menu_item(Controller::RIGHT);
214 refresh_menu_item(Controller::JUMP);
215 refresh_menu_item(Controller::ACTION);
216 refresh_menu_item(Controller::PAUSE_MENU);
217 refresh_menu_item(Controller::PEEK_LEFT);
218 refresh_menu_item(Controller::PEEK_RIGHT);
219 refresh_menu_item(Controller::PEEK_UP);
220 refresh_menu_item(Controller::PEEK_DOWN);