aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephen Kennedy2008-07-19 19:12:49 +0000
committerStephen Kennedy2008-07-19 19:12:49 +0000
commit0b8203b0e500bb448233b618edf45ba9e28fe738 (patch)
tree47730de6f9709d2deb1f15064ef41112d58e1d74
parent19345b5a624570dd673bdcaf86188e93110f0e5c (diff)
downloadscummvm-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.cpp49
-rw-r--r--backends/common/keymap.h55
-rw-r--r--backends/common/keymapper.h9
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