More -Weffc++ cleanup
[supertux.git] / src / control / joystickkeyboardcontroller.hpp
1 //  SuperTux
2 //  Copyright (C) 2006 Matthias Braun <matze@braunis.de>
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_CONTROL_JOYSTICKKEYBOARDCONTROLLER_HPP
18 #define HEADER_SUPERTUX_CONTROL_JOYSTICKKEYBOARDCONTROLLER_HPP
19
20 #include "control/controller.hpp"
21
22 #include <SDL.h>
23
24 #include <map>
25 #include <string>
26 #include <vector>
27
28 #include "util/reader_fwd.hpp"
29 #include "util/writer_fwd.hpp"
30
31 class Menu;
32
33 class JoystickKeyboardController : public Controller
34 {
35 public:
36   JoystickKeyboardController();
37   virtual ~JoystickKeyboardController();
38
39   /** Process an SDL Event and return true if the event has been used
40    */
41   void process_event(const SDL_Event& event);
42
43   void write(lisp::Writer& writer);
44   void read(const Reader& lisp);
45   void reset();
46
47   Menu* get_key_options_menu();
48   Menu* get_joystick_options_menu();
49   void updateAvailableJoysticks();
50
51 private:
52   void process_key_event(const SDL_Event& event);
53   void process_hat_event(const SDL_JoyHatEvent& jhat);
54   void process_axis_event(const SDL_JoyAxisEvent& jaxis);
55   void process_button_event(const SDL_JoyButtonEvent& jbutton);
56   void process_console_key_event(const SDL_Event& event);
57   void process_menu_key_event(const SDL_Event& event);
58
59   void print_joystick_mappings();
60
61   SDLKey reversemap_key(Control c);
62   int    reversemap_joybutton(Control c);
63   int    reversemap_joyaxis(Control c);
64   int    reversemap_joyhat(Control c);
65
66   void unbind_joystick_control(Control c);
67
68   void bind_joybutton(int button, Control c);
69   void bind_joyaxis(int axis, Control c);
70   void bind_joyhat(int dir, Control c);
71   void bind_key(SDLKey key, Control c);
72
73   void set_joy_controls(Control id, bool value);
74
75 private:
76   class KeyboardMenu;
77   class JoystickMenu;
78
79   friend class KeyboardMenu;
80   friend class JoystickMenu;
81
82   typedef std::map<SDLKey, Control> KeyMap;
83   typedef std::map<int, Control> ButtonMap;
84   typedef std::map<int, Control> AxisMap;
85   typedef std::map<int, Control> HatMap;
86
87 private:
88   KeyMap keymap;
89
90   ButtonMap joy_button_map;
91
92   AxisMap joy_axis_map;
93
94   HatMap joy_hat_map;
95
96   std::vector<SDL_Joystick*> joysticks;
97
98   std::string name;
99
100   int dead_zone;
101   /// the number of buttons all joysticks have
102   int min_joybuttons;
103   /// the max number of buttons a joystick has
104   int max_joybuttons;
105
106   int max_joyaxis;
107
108   int max_joyhats;
109
110   Uint8 hat_state;
111
112   bool jump_with_up_joy; // Joystick up jumps
113   bool jump_with_up_kbd; // Keyboard up jumps
114
115   int wait_for_key;
116   int wait_for_joystick;
117
118   KeyboardMenu* key_options_menu;
119   JoystickMenu* joystick_options_menu;
120
121 private:
122   JoystickKeyboardController(const JoystickKeyboardController&);
123   JoystickKeyboardController& operator=(const JoystickKeyboardController&);
124 };
125
126 #endif
127
128 /* EOF */