diff options
author | Andrei Karas <akaras@inbox.ru> | 2012-04-08 21:05:01 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2012-04-08 21:05:01 +0300 |
commit | bb258f09a0b50f6382be2ff36637191a8b103c3f (patch) | |
tree | 419eb77c8c1502968e89fddff7f1e7c167d86a11 | |
parent | 30ef016b0a14f36dc480284e2d775295b5501dd4 (diff) | |
download | manaplus-bb258f09a0b50f6382be2ff36637191a8b103c3f.tar.gz manaplus-bb258f09a0b50f6382be2ff36637191a8b103c3f.tar.bz2 manaplus-bb258f09a0b50f6382be2ff36637191a8b103c3f.tar.xz manaplus-bb258f09a0b50f6382be2ff36637191a8b103c3f.zip |
Move some more code from keyboardconfig to inputmanager.
-rw-r--r-- | src/inputevent.h | 10 | ||||
-rw-r--r-- | src/inputmanager.cpp | 60 | ||||
-rw-r--r-- | src/inputmanager.h | 5 | ||||
-rw-r--r-- | src/keyboardconfig.cpp | 59 | ||||
-rw-r--r-- | src/keyboardconfig.h | 11 |
5 files changed, 81 insertions, 64 deletions
diff --git a/src/inputevent.h b/src/inputevent.h index 7b73bba11..b03c59669 100644 --- a/src/inputevent.h +++ b/src/inputevent.h @@ -21,6 +21,16 @@ #ifndef INPUTEVENT_H #define INPUTEVENT_H +#include <map> +#include <vector> + +typedef std::vector<int> KeysVector; +typedef KeysVector::iterator KeysVectorIter; +typedef KeysVector::const_iterator KeysVectorCIter; + +typedef std::map<int, KeysVector> KeyToActionMap; +typedef KeyToActionMap::iterator KeyToActionMapIter; + struct InputEvent { InputEvent(int action0, int mask0); diff --git a/src/inputmanager.cpp b/src/inputmanager.cpp index 3a0b22f3e..cc45a79cf 100644 --- a/src/inputmanager.cpp +++ b/src/inputmanager.cpp @@ -39,12 +39,27 @@ #include <guichan/exception.hpp> #include <guichan/focushandler.hpp> +#include <algorithm> + #include "debug.h" InputManager inputManager; extern QuitDialog *quitDialog; +class KeyFunctor +{ + public: + bool operator() (int key1, int key2) + { + return keys[key1].priority >= keys[key2].priority; + } + + const KeyData *keys; + +} keySorter; + + InputManager::InputManager() : mSetupKey(nullptr), mNewKeyIndex(Input::KEY_NO_VALUE) @@ -66,7 +81,7 @@ void InputManager::init() makeDefault(); retrieve(); - keyboard.updateKeyActionMap(); + keyboard.update(); } void InputManager::retrieve() @@ -332,7 +347,7 @@ void InputManager::setNewKey(const SDL_Event &event) addActionKey(mNewKeyIndex, INPUT_KEYBOARD, val); - keyboard.updateKeyActionMap(); + keyboard.update(); } void InputManager::unassignKey() @@ -343,7 +358,7 @@ void InputManager::unassignKey() key.values[i].type = INPUT_UNKNOWN; key.values[i].value = -1; } - keyboard.updateKeyActionMap(); + keyboard.update(); } bool InputManager::handleEvent(const SDL_Event &event) @@ -459,3 +474,42 @@ bool InputManager::checkKey(const KeyData *key, int mask) return (key->modKeyIndex == Input::KEY_NO_VALUE || isActionActive(key->modKeyIndex)); } + +bool InputManager::invokeKey(const KeyData *key, int keyNum, int mask) +{ + if (checkKey(key, mask)) + { + InputEvent evt(keyNum, mask); + if ((*(keyData[keyNum].action))(evt)) + return true; + } + return false; +} + +void InputManager::updateKeyActionMap(KeyToActionMap &actionMap, int type) +{ + actionMap.clear(); + + for (size_t i = 0; i < Input::KEY_TOTAL; i ++) + { + if (keyData[i].action) + { + KeyFunction &key = mKey[i]; + for (size_t i2 = 0; i2 < KeyFunctionSize; i2 ++) + { + if (key.values[i2].type == INPUT_KEYBOARD) + actionMap[key.values[i2].value].push_back(i); + } + } + } + + keySorter.keys = &keyData[0]; + KeyToActionMapIter it = actionMap.begin(); + KeyToActionMapIter it_end = actionMap.end(); + for (; it != it_end; ++ it) + { + KeysVector *keys = &it->second; + if (keys->size() > 1) + sort(keys->begin(), keys->end(), keySorter); + } +} diff --git a/src/inputmanager.h b/src/inputmanager.h index b04f15726..0efe2d85e 100644 --- a/src/inputmanager.h +++ b/src/inputmanager.h @@ -21,6 +21,7 @@ #ifndef INPUTMANAGER_H #define INPUTMANAGER_H +#include "inputevent.h" #include "keydata.h" #include "gui/sdlinput.h" @@ -134,6 +135,10 @@ class InputManager int getNewKeyIndex() const { return mNewKeyIndex; } + void updateKeyActionMap(KeyToActionMap &actionMap, int type); + + bool invokeKey(const KeyData *key, int keyNum, int mask); + protected: Setup_Keyboard *mSetupKey; /**< Reference to setup window */ diff --git a/src/keyboardconfig.cpp b/src/keyboardconfig.cpp index a56f2cfa6..4dfab8852 100644 --- a/src/keyboardconfig.cpp +++ b/src/keyboardconfig.cpp @@ -35,27 +35,11 @@ #include <SDL_events.h> -#include <algorithm> - #include "debug.h" -class KeyFunctor -{ - public: - bool operator() (int key1, int key2) - { - return keys[key1].priority >= keys[key2].priority; - } - - const KeyData *keys; - -} keySorter; - void KeyboardConfig::init() { mEnabled = true; - - updateKeyActionMap(); } int KeyboardConfig::getKeyValueFromEvent(const SDL_Event &event) const @@ -120,34 +104,6 @@ SDLKey KeyboardConfig::getKeyFromEvent(const SDL_Event &event) const return event.key.keysym.sym; } -void KeyboardConfig::updateKeyActionMap() -{ - mKeyToAction.clear(); - - for (size_t i = 0; i < Input::KEY_TOTAL; i ++) - { - if (keyData[i].action) - { - KeyFunction &key = inputManager.getKey(i); - for (size_t i2 = 0; i2 < KeyFunctionSize; i2 ++) - { - if (key.values[i2].type == INPUT_KEYBOARD) - mKeyToAction[key.values[i2].value].push_back(i); - } - } - } - - keySorter.keys = &keyData[0]; - KeyToActionMapIter it = mKeyToAction.begin(); - KeyToActionMapIter it_end = mKeyToAction.end(); - for (; it != it_end; ++ it) - { - KeysVector *keys = &it->second; - if (keys->size() > 1) - sort(keys->begin(), keys->end(), keySorter); - } -} - bool KeyboardConfig::triggerAction(const SDL_Event &event) { const int i = getKeyValueFromEvent(event); @@ -167,14 +123,8 @@ bool KeyboardConfig::triggerAction(const SDL_Event &event) if (keyNum < 0 || keyNum >= Input::KEY_TOTAL) continue; - if (inputManager.checkKey(&keyData[keyNum], mask)) - { - InputEvent evt(keyNum, mask); - if ((*(keyData[keyNum].action))(evt)) - { - return true; - } - } + if (inputManager.invokeKey(&keyData[keyNum], keyNum, mask)) + return true; } } return false; @@ -193,3 +143,8 @@ bool KeyboardConfig::isActionActive(int index) const } return false; } + +void KeyboardConfig::update() +{ + inputManager.updateKeyActionMap(mKeyToAction, INPUT_KEYBOARD); +} diff --git a/src/keyboardconfig.h b/src/keyboardconfig.h index 3f3e5f95d..71e43c230 100644 --- a/src/keyboardconfig.h +++ b/src/keyboardconfig.h @@ -35,13 +35,6 @@ union SDL_Event; -typedef std::vector<int> KeysVector; -typedef KeysVector::iterator KeysVectorIter; -typedef KeysVector::const_iterator KeysVectorCIter; - -typedef std::map<int, KeysVector> KeyToActionMap; -typedef KeyToActionMap::iterator KeyToActionMapIter; - class KeyboardConfig { public: @@ -78,14 +71,14 @@ class KeyboardConfig int getKeyValueFromEvent(const SDL_Event &event) const; - void updateKeyActionMap(); - bool triggerAction(const SDL_Event &event); std::string getKeyName(int key); bool isActionActive(int index) const; + void update(); + private: bool mEnabled; /**< Flag to respond to key input */ |