/*
|
|
* Copyright (C) 2017 Christopher J. Howard
|
|
*
|
|
* This file is part of Antkeeper Source Code.
|
|
*
|
|
* Antkeeper Source Code 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.
|
|
*
|
|
* Antkeeper Source Code 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 Antkeeper Source Code. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef CONTROLS_HPP
|
|
#define CONTROLS_HPP
|
|
|
|
#include "input.hpp"
|
|
#include <list>
|
|
#include <utility>
|
|
#include <tuple>
|
|
#include <map>
|
|
|
|
enum class MouseWheelAxis
|
|
{
|
|
POSITIVE_X,
|
|
NEGATIVE_X,
|
|
POSITIVE_Y,
|
|
NEGATIVE_Y
|
|
};
|
|
|
|
class Control:
|
|
public KeyObserver,
|
|
public MouseButtonObserver,
|
|
public MouseWheelObserver,
|
|
public GamepadButtonObserver,
|
|
public GamepadAxisObserver
|
|
{
|
|
public:
|
|
Control();
|
|
virtual ~Control();
|
|
void setDeadzone(float value);
|
|
void update();
|
|
|
|
float getDeadzone() const;
|
|
float getCurrentValue() const;
|
|
float getPreviousValue() const;
|
|
bool isTriggered() const;
|
|
bool wasTriggered() const;
|
|
bool isUnbound() const;
|
|
|
|
void bindKey(Keyboard* keyboard, int scancode);
|
|
void bindMouseButton(Mouse* mouse, int button);
|
|
void bindMouseWheelAxis(Mouse* mouse, MouseWheelAxis axis);
|
|
void bindGamepadButton(Gamepad* gamepad, int button);
|
|
void bindGamepadAxis(Gamepad* gamepad, int axis, bool negative);
|
|
void bind(const InputEvent& event);
|
|
|
|
void unbind();
|
|
|
|
virtual void keyPressed(int scancode);
|
|
virtual void keyReleased(int scancode);
|
|
virtual void mouseButtonPressed(int button, int x, int y);
|
|
virtual void mouseButtonReleased(int button, int x, int y);
|
|
virtual void mouseWheelScrolled(int x, int y);
|
|
virtual void gamepadButtonPressed(int button);
|
|
virtual void gamepadButtonReleased(int button);
|
|
virtual void gamepadAxisMoved(int axis, bool negative, float value);
|
|
|
|
const std::list<std::pair<Keyboard*, int>>* getBoundKeys() const;
|
|
const std::list<std::pair<Mouse*, int>>* getBoundMouseButtons() const;
|
|
const std::list<std::pair<Mouse*, MouseWheelAxis>>* getBoundMouseWheelAxes() const;
|
|
const std::list<std::pair<Gamepad*, int>>* getBoundGamepadButtons() const;
|
|
const std::list<std::tuple<Gamepad*, int, bool>>* getBoundGamepadAxes() const;
|
|
|
|
private:
|
|
float deadzone;
|
|
float currentValue;
|
|
float previousValue;
|
|
|
|
std::list<std::pair<Keyboard*, int>> boundKeys;
|
|
std::list<std::pair<Mouse*, int>> boundMouseButtons;
|
|
std::list<std::pair<Mouse*, MouseWheelAxis>> boundMouseWheelAxes;
|
|
std::list<std::pair<Gamepad*, int>> boundGamepadButtons;
|
|
std::list<std::tuple<Gamepad*, int, bool>> boundGamepadAxes;
|
|
};
|
|
|
|
inline float Control::getDeadzone() const
|
|
{
|
|
return deadzone;
|
|
}
|
|
|
|
inline float Control::getCurrentValue() const
|
|
{
|
|
return currentValue;
|
|
}
|
|
|
|
inline float Control::getPreviousValue() const
|
|
{
|
|
return previousValue;
|
|
}
|
|
|
|
class ControlProfile
|
|
{
|
|
public:
|
|
ControlProfile(InputManager* inputManager);
|
|
|
|
void registerControl(const std::string& name, Control* control);
|
|
|
|
bool save(const std::string& filename);
|
|
bool load(const std::string& filename);
|
|
|
|
// Calls Control::update() on each control registered with this profile
|
|
void update();
|
|
|
|
const std::map<std::string, Control*>* getControlMap() const;
|
|
|
|
private:
|
|
InputManager* inputManager;
|
|
std::map<std::string, Control*> controls;
|
|
};
|
|
|
|
inline const std::map<std::string, Control*>* ControlProfile::getControlMap() const
|
|
{
|
|
return &controls;
|
|
}
|
|
|
|
#endif
|
|
|