/* * Custom keyboard shortcuts configuration * Copyright (C) 2007 Joshua Langley * Copyright (C) 2009-2010 The Mana Developers * Copyright (C) 2011-2012 The ManaPlus Developers * * This file is part of The ManaPlus Client. * * 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 2 of the License, or * 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 . */ #ifndef KEYBOARDCONFIG_H #define KEYBOARDCONFIG_H #include #include #include "inputevent.h" #include "keydata.h" #include #include #include union SDL_Event; typedef std::vector KeysVector; typedef KeysVector::iterator KeysVectorIter; typedef KeysVector::const_iterator KeysVectorCIter; typedef std::map KeyToActionMap; typedef KeyToActionMap::iterator KeyToActionMapIter; enum KeyTypes { INPUT_UNKNOWN = 0, INPUT_KEYBOARD = 1, INPUT_MOUSE = 2, INPUT_JOYSTICK = 3 }; struct KeyItem { KeyItem() : type(-1), value(-1) { } KeyItem(int type0, int value0) : type(type0), value(value0) { } int type; int value; }; #define KeyFunctionSize 3 /** * Each key represents a key function. Such as 'Move up', 'Attack' etc. */ struct KeyFunction { KeyItem values[KeyFunctionSize]; }; class Setup_Keyboard; class KeyboardConfig { public: /** * Initializes the keyboard config explicitly. */ void init(); /** * Retrieve the key values from config file. */ void retrieve(); /** * Store the key values to config file. */ void store(); /** * Make the keys their default values. */ void makeDefault(); /** * Determines if any key assignments are the same as each other. */ bool hasConflicts(int &key1, int &key2); /** * Calls a function back so the key re-assignment(s) can be seen. */ void callbackNewKey(); /** * Get the index of the new key to be assigned. */ int getNewKeyIndex() const { return mNewKeyIndex; } /** * Get the enable flag, which will stop the user from doing actions. */ bool isEnabled() const { return mEnabled; } /** * Get the key function index by providing the keys value. */ int getKeyIndex(const SDL_Event &event, int grp = 1) const; /** * Set the enable flag, which will stop the user from doing actions. */ void setEnabled(bool flag) { mEnabled = flag; } /** * Set the index of the new key to be assigned. */ void setNewKeyIndex(int value) { mNewKeyIndex = value; } /** * Set the value of the new key. */ void setNewKey(const SDL_Event &event); /** * Set a reference to the key setup window. */ void setSetupKeyboard(Setup_Keyboard *setupKey) { mSetupKey = setupKey; } /** * Checks if the key is active, by providing the key function index. */ bool isActionActive(int index) const; /** * Takes a snapshot of all the active keys. */ void refreshActiveKeys(); std::string getKeyValueString(int index) const; std::string getKeyShortString(const std::string &key) const; std::string getKeyStringLong(int index) const; SDLKey getKeyFromEvent(const SDL_Event &event) const; int getKeyValueFromEvent(const SDL_Event &event) const; void unassignKey(); void updateKeyActionMap(); bool triggerAction(const SDL_Event &event); private: int mNewKeyIndex; /**< Index of new key to be assigned */ bool mEnabled; /**< Flag to respond to key input */ Setup_Keyboard *mSetupKey; /**< Reference to setup window */ KeyFunction mKey[Input::KEY_TOTAL]; /**< Pointer to all the key data */ Uint8 *mActiveKeys; /**< Stores a list of all the keys */ KeyToActionMap mKeyToAction; }; extern KeyboardConfig keyboard; #endif