[Scummvm-cvs-logs] SF.net SVN: scummvm:[33113] scummvm/branches/gsoc2008-vkeybd/backends/ common

kenny-d at users.sourceforge.net kenny-d at users.sourceforge.net
Sat Jul 19 21:15:31 CEST 2008


Revision: 33113
          http://scummvm.svn.sourceforge.net/scummvm/?rev=33113&view=rev
Author:   kenny-d
Date:     2008-07-19 19:12:49 +0000 (Sat, 19 Jul 2008)

Log Message:
-----------
More WIP development of Keymap class

Modified Paths:
--------------
    scummvm/branches/gsoc2008-vkeybd/backends/common/keymap.cpp
    scummvm/branches/gsoc2008-vkeybd/backends/common/keymap.h
    scummvm/branches/gsoc2008-vkeybd/backends/common/keymapper.h

Modified: scummvm/branches/gsoc2008-vkeybd/backends/common/keymap.cpp
===================================================================
--- scummvm/branches/gsoc2008-vkeybd/backends/common/keymap.cpp	2008-07-19 15:49:08 UTC (rev 33112)
+++ scummvm/branches/gsoc2008-vkeybd/backends/common/keymap.cpp	2008-07-19 19:12:49 UTC (rev 33113)
@@ -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 @@
 	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 @@
 	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())

Modified: scummvm/branches/gsoc2008-vkeybd/backends/common/keymap.h
===================================================================
--- scummvm/branches/gsoc2008-vkeybd/backends/common/keymap.h	2008-07-19 15:49:08 UTC (rev 33112)
+++ scummvm/branches/gsoc2008-vkeybd/backends/common/keymap.h	2008-07-19 19:12:49 UTC (rev 33113)
@@ -9,7 +9,6 @@
 
 namespace Common {
 
-
 enum UserActionType {
 	kGenericUserActionType,
 
@@ -39,18 +38,19 @@
 * 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 UserAction {
+	/** 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;
-	/** Human readable description */
-	String description;
 	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 @@
 		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 @@
 
 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 @@
 	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);
 

Modified: scummvm/branches/gsoc2008-vkeybd/backends/common/keymapper.h
===================================================================
--- scummvm/branches/gsoc2008-vkeybd/backends/common/keymapper.h	2008-07-19 15:49:08 UTC (rev 33112)
+++ scummvm/branches/gsoc2008-vkeybd/backends/common/keymapper.h	2008-07-19 19:12:49 UTC (rev 33113)
@@ -10,14 +10,17 @@
 
 	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


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list