diff options
author | Stephen Kennedy | 2008-07-19 19:12:49 +0000 |
---|---|---|
committer | Stephen Kennedy | 2008-07-19 19:12:49 +0000 |
commit | 0b8203b0e500bb448233b618edf45ba9e28fe738 (patch) | |
tree | 47730de6f9709d2deb1f15064ef41112d58e1d74 | |
parent | 19345b5a624570dd673bdcaf86188e93110f0e5c (diff) | |
download | scummvm-rg350-0b8203b0e500bb448233b618edf45ba9e28fe738.tar.gz scummvm-rg350-0b8203b0e500bb448233b618edf45ba9e28fe738.tar.bz2 scummvm-rg350-0b8203b0e500bb448233b618edf45ba9e28fe738.zip |
More WIP development of Keymap class
svn-id: r33113
-rw-r--r-- | backends/common/keymap.cpp | 49 | ||||
-rw-r--r-- | backends/common/keymap.h | 55 | ||||
-rw-r--r-- | backends/common/keymapper.h | 9 |
3 files changed, 76 insertions, 37 deletions
diff --git a/backends/common/keymap.cpp b/backends/common/keymap.cpp index 7e6297917b..9fb80bcc58 100644 --- a/backends/common/keymap.cpp +++ b/backends/common/keymap.cpp @@ -3,16 +3,23 @@ namespace Common { Keymap::Keymap(const Keymap& km) : _actions(km._actions), _keymap() { + init(); for (uint i = 0; i < _actions.size(); i++) { - if (_actions[i]._hwKey) { - _keymap[_actions[i]._hwKey->key] = &_actions[i]; + if (_actions[i].hwKey) { + _keymap[_actions[i].hwKey->key] = &_actions[i]; } } } +void Keymap::init() { + _actions.reserve(20); +} + void Keymap::addAction(const UserAction& action) { + if (findUserAction(action.id)) + error("UserAction with id %d already in KeyMap!\n", action.id); _actions.push_back(action); - _actions[_actions.size()-1]._hwKey = 0; + _actions[_actions.size()-1].hwKey = 0; } void Keymap::mapKeyToAction(UserAction *action, HardwareKey *key) { @@ -25,10 +32,10 @@ void Keymap::mapKeyToAction(UserAction *action, HardwareKey *key) { error("UserAction not contained in KeyMap\n"); } -void Keymap::mapKeyToAction(uint idx, HardwareKey *key) { - if (idx >= _actions.size()) - error("Key map index out of bounds!\n"); - internalMapKey(&_actions[idx], key); +void Keymap::mapKeyToAction(int32 id, HardwareKey *key) { + UserAction *act = findUserAction(id); + if (act) + internalMapKey(act, key); } void Keymap::internalMapKey(UserAction *action, HardwareKey *hwKey) { @@ -36,13 +43,35 @@ void Keymap::internalMapKey(UserAction *action, HardwareKey *hwKey) { it = _keymap.find(hwKey->key); // if key is already mapped to an action then un-map it if (it != _keymap.end()) - it->_value->_hwKey = 0; + it->_value->hwKey = 0; - action->_hwKey = hwKey; + action->hwKey = hwKey; _keymap[hwKey->key] = action; } -UserAction *Keymap::getMappedAction(KeyState ks) { +const UserAction *Keymap::getUserAction(int32 id) const { + return findUserAction(id); +} + +UserAction *Keymap::findUserAction(int32 id) { + Array<UserAction>::iterator it; + for (it = _actions.begin(); it != _actions.end(); it++) { + if (it->id == id) + return &*it; + } + return 0; +} + +const UserAction *Keymap::findUserAction(int32 id) const { + Array<UserAction>::const_iterator it; + for (it = _actions.begin(); it != _actions.end(); it++) { + if (it->id == id) + return &*it; + } + return 0; +} + +UserAction *Keymap::getMappedAction(KeyState ks) const { HashMap<KeyState, UserAction*>::iterator it; it = _keymap.find(ks); if (it == _keymap.end()) diff --git a/backends/common/keymap.h b/backends/common/keymap.h index 75350a992b..c03e2e03d5 100644 --- a/backends/common/keymap.h +++ b/backends/common/keymap.h @@ -9,7 +9,6 @@ namespace Common { - enum UserActionType { kGenericUserActionType, @@ -39,18 +38,19 @@ enum UserActionCategory { * Describes an available hardware key */ struct HardwareKey { + /** unique id used for saving/loading to config */ + int32 id; + /** Human readable description */ + String description; /** * The KeyState that is generated by the back-end * when this hardware key is pressed. */ KeyState key; - /** Human readable description */ - String description; - UserActionCategory preferredCategory; UserActionType preferredType; - int group; + int16 group; HardwareKey(KeyState ks = KeyState(), String des = "", UserActionCategory cat = kGenericUserActionCategory, @@ -64,16 +64,20 @@ struct HardwareKey { }; struct UserAction { - /** Events to be sent when mapped key is pressed */ - List<Event> events; + /** unique id used for saving/loading to config */ + int32 id; /** Human readable description */ String description; + /** Events to be sent when mapped key is pressed */ + List<Event> events; UserActionCategory category; UserActionType type; int priority; int group; int flags; + HardwareKey *hwKey; + UserAction( String des = "", UserActionCategory cat = kGenericUserActionCategory, UserActionType ty = kGenericUserActionType, @@ -84,17 +88,8 @@ struct UserAction { priority = pr; group = gr; flags = fl; - _hwKey = 0; + hwKey = 0; } - - friend class Keymap; - - HardwareKey *mappedKey() { return _hwKey; } -private: - /** - * Key that is mapped to this UserAction, only KeyMap can set this - */ - HardwareKey *_hwKey; }; /** @@ -123,10 +118,12 @@ template<> struct Hash<KeyState> class Keymap { public: - - Keymap() {} + Keymap() { init(); } Keymap(const Keymap& km); +private: + void init(); +public: /** * Adds a new UserAction to this Map, * adding it at the back of the internal array @@ -144,25 +141,35 @@ public: void mapKeyToAction(UserAction *action, HardwareKey *key); /** - * Maps a HardwareKey to the UserAction at the given index - * @param index Index of UserAction in the internal array + * Maps a HardwareKey to the UserAction of the given id + * @param id id of the UserAction to map to * @param key pointer to HardwareKey to map */ - void mapKeyToAction(uint index, HardwareKey *key); + void mapKeyToAction(int32 id, HardwareKey *key); + + /** + * Retrieves the UserAction with the given id + * @param id id of UserAction to retrieve + * @return Pointer to the UserAction or 0 if not found + */ + const UserAction *getUserAction(int32 id) const; /** * Get a read-only array of all the UserActions contained in this Keymap */ - const Array<UserAction>& getUserActions() { return _actions; } + const Array<UserAction>& getUserActions() const { return _actions; } /** * Find the UserAction that a key is mapped to * @param key the key that is mapped to the required UserAction * @return a pointer to the UserAction or 0 if no */ - UserAction *getMappedAction(KeyState key); + UserAction *getMappedAction(KeyState key) const; private: + + UserAction *findUserAction(int32 id); + const UserAction *findUserAction(int32 id) const; void internalMapKey(UserAction *action, HardwareKey *hwKey); diff --git a/backends/common/keymapper.h b/backends/common/keymapper.h index fd1e46968e..1b3518c224 100644 --- a/backends/common/keymapper.h +++ b/backends/common/keymapper.h @@ -10,14 +10,17 @@ public: Keymapper(); - + void addHardwareKey(const HardwareKey& key); + void addGlobalKeyMap(const String& name, Keymap& keymap); private: KeymapManager _manager; - List<HardwareKey> _hardwareKeys; + List<HardwareKey*> _hardwareKeys; }; -} // end of namespace Common
\ No newline at end of file +} // end of namespace Common + +#endif
\ No newline at end of file |