aboutsummaryrefslogtreecommitdiff
path: root/backends/keymapper
diff options
context:
space:
mode:
authorStephen Kennedy2008-08-08 14:23:59 +0000
committerStephen Kennedy2008-08-08 14:23:59 +0000
commit4eacc09024515dc95e0afbb1ca9a8f610c55a84d (patch)
tree5ba3182cc818e7ff0e3957536f8af48c30e14da2 /backends/keymapper
parent2645ca48ad9bc219b43ab88cc5b071952297a992 (diff)
downloadscummvm-rg350-4eacc09024515dc95e0afbb1ca9a8f610c55a84d.tar.gz
scummvm-rg350-4eacc09024515dc95e0afbb1ca9a8f610c55a84d.tar.bz2
scummvm-rg350-4eacc09024515dc95e0afbb1ca9a8f610c55a84d.zip
Keymapper WIP:
* Got rid of default keymaps as they over-complicated the API * Remapping dialog WIP svn-id: r33699
Diffstat (limited to 'backends/keymapper')
-rw-r--r--backends/keymapper/keymap-manager.cpp55
-rw-r--r--backends/keymapper/keymap-manager.h35
-rw-r--r--backends/keymapper/keymap.cpp28
-rw-r--r--backends/keymapper/keymap.h15
-rw-r--r--backends/keymapper/keymapper.cpp31
-rw-r--r--backends/keymapper/keymapper.h35
-rw-r--r--backends/keymapper/remap-dialog.cpp174
-rw-r--r--backends/keymapper/remap-dialog.h78
8 files changed, 340 insertions, 111 deletions
diff --git a/backends/keymapper/keymap-manager.cpp b/backends/keymapper/keymap-manager.cpp
index c8b4420289..527d0a103a 100644
--- a/backends/keymapper/keymap-manager.cpp
+++ b/backends/keymapper/keymap-manager.cpp
@@ -28,16 +28,11 @@
namespace Common {
-void KeymapManager::Domain::setDefaultKeymap(Keymap *map) {
- delete _defaultKeymap;
- _defaultKeymap = map;
-}
-
-void KeymapManager::Domain::addKeymap(const String& name, Keymap *map) {
- KeymapMap::iterator it = _keymaps.find(name);
+void KeymapManager::Domain::addKeymap(Keymap *map) {
+ KeymapMap::iterator it = _keymaps.find(map->getName());
if (it != _keymaps.end())
- delete _keymaps[name];
- _keymaps[name] = map;
+ delete _keymaps[map->getName()];
+ _keymaps[map->getName()] = map;
}
void KeymapManager::Domain::deleteAllKeyMaps() {
@@ -47,14 +42,6 @@ void KeymapManager::Domain::deleteAllKeyMaps() {
delete it->_value;
}
_keymaps.clear();
- if (_defaultKeymap) {
- //_defaultKeymap->saveMappings(_configDomain, "default");
- delete _defaultKeymap;
- }
-}
-
-Keymap *KeymapManager::Domain::getDefaultKeymap() {
- return _defaultKeymap;
}
Keymap *KeymapManager::Domain::getKeymap(const String& name) {
@@ -80,20 +67,9 @@ void KeymapManager::registerHardwareKeySet(HardwareKeySet *keys) {
_hardwareKeys = keys;
}
-void KeymapManager::registerDefaultGlobalKeymap(Keymap *map) {
- ConfigManager::Domain *dom = ConfMan.getDomain(ConfigManager::kApplicationDomain);
- assert(dom);
-
- initKeymap(dom, "default", map);
- _globalDomain.setDefaultKeymap(map);
-}
-
-void KeymapManager::registerGlobalKeymap(const String& name, Keymap *map) {
- ConfigManager::Domain *dom = ConfMan.getDomain(ConfigManager::kApplicationDomain);
- assert(dom);
-
- initKeymap(dom, name, map);
- _globalDomain.addKeymap(name, map);
+void KeymapManager::registerGlobalKeymap(Keymap *map) {
+ initKeymap(_globalDomain.getConfigDomain(), map);
+ _globalDomain.addKeymap(map);
}
void KeymapManager::refreshGameDomain() {
@@ -103,22 +79,15 @@ void KeymapManager::refreshGameDomain() {
}
}
-void KeymapManager::registerDefaultGameKeymap(Keymap *map) {
- refreshGameDomain();
- initKeymap(_gameDomain.getConfigDomain(), "default", map);
- _gameDomain.setDefaultKeymap(map);
-}
-
-void KeymapManager::registerGameKeymap(const String& name, Keymap *map) {
+void KeymapManager::registerGameKeymap(Keymap *map) {
refreshGameDomain();
- initKeymap(_gameDomain.getConfigDomain(), name, map);
- _gameDomain.addKeymap(name, map);
+ initKeymap(_gameDomain.getConfigDomain(), map);
+ _gameDomain.addKeymap(map);
}
void KeymapManager::initKeymap(ConfigManager::Domain *domain,
- const String& name,
Keymap *map) {
- map->loadMappings(domain, name, _hardwareKeys);
+ map->loadMappings(domain, _hardwareKeys);
if (map->isComplete(_hardwareKeys) == false)
automaticMap(map);
}
@@ -161,7 +130,7 @@ void KeymapManager::automaticMap(Keymap *map) {
Keymap *KeymapManager::getKeymap(const String& name) {
Keymap *keymap = _gameDomain.getKeymap(name);
if (!keymap)
- _globalDomain.getKeymap(name);
+ keymap = _globalDomain.getKeymap(name);
return keymap;
}
diff --git a/backends/keymapper/keymap-manager.h b/backends/keymapper/keymap-manager.h
index 171da3ac5e..6bcb71c0f5 100644
--- a/backends/keymapper/keymap-manager.h
+++ b/backends/keymapper/keymap-manager.h
@@ -37,8 +37,11 @@ class KeymapManager {
public:
class Domain {
+ typedef HashMap<String, Keymap*,
+ IgnoreCase_Hash, IgnoreCase_EqualTo> KeymapMap;
+
public:
- Domain() : _defaultKeymap(0), _configDomain(0) {}
+ Domain() : _configDomain(0) {}
~Domain() {
deleteAllKeyMaps();
}
@@ -50,20 +53,22 @@ public:
return _configDomain;
}
- void setDefaultKeymap(Keymap *map);
- void addKeymap(const String& name, Keymap *map);
+ void addKeymap(Keymap *map);
void deleteAllKeyMaps();
- Keymap *getDefaultKeymap();
Keymap *getKeymap(const String& name);
-
+
+ typedef KeymapMap::iterator iterator;
+ typedef KeymapMap::const_iterator const_iterator;
+ iterator begin() { return _keymaps.begin(); }
+ const_iterator begin() const { return _keymaps.begin(); }
+ iterator end() { return _keymaps.end(); }
+ const_iterator end() const { return _keymaps.end(); }
+
+ uint32 count() { return _keymaps.size(); }
private:
- typedef HashMap<String, Keymap*,
- IgnoreCase_Hash, IgnoreCase_EqualTo> KeymapMap;
-
ConfigManager::Domain *_configDomain;
- Keymap *_defaultKeymap;
KeymapMap _keymaps;
};
@@ -71,19 +76,21 @@ public:
~KeymapManager();
void registerHardwareKeySet(HardwareKeySet *keys);
+ HardwareKeySet *getHardwareKeySet() { return _hardwareKeys; }
- void registerDefaultGlobalKeymap(Keymap *map);
- void registerGlobalKeymap(const String& name, Keymap *map);
+ void registerGlobalKeymap(Keymap *map);
void refreshGameDomain();
- void registerDefaultGameKeymap(Keymap *map);
- void registerGameKeymap(const String& name, Keymap *map);
+ void registerGameKeymap(Keymap *map);
Keymap *getKeymap(const String& name);
+ Domain& getGlobalDomain() { return _globalDomain; }
+ Domain& getGameDomain() { return _gameDomain; }
+
private:
- void initKeymap(ConfigManager::Domain *domain, const String& name, Keymap *keymap);
+ void initKeymap(ConfigManager::Domain *domain, Keymap *keymap);
void automaticMap(Keymap *map);
Domain _globalDomain;
diff --git a/backends/keymapper/keymap.cpp b/backends/keymapper/keymap.cpp
index 3f190dcd48..8af1d266e8 100644
--- a/backends/keymapper/keymap.cpp
+++ b/backends/keymapper/keymap.cpp
@@ -48,17 +48,23 @@ void Keymap::addAction(Action *action) {
void Keymap::registerMapping(Action *action, const HardwareKey *hwKey) {
HashMap<KeyState, Action*>::iterator it;
it = _keymap.find(hwKey->key);
- // if key is already mapped to an action then un-map it
- if (it != _keymap.end())
+ // if key is already mapped to a different action then un-map it
+ if (it != _keymap.end() && action != it->_value) {
+ HashMap<KeyState, Action*>::iterator it2;
+ for (it2 = _keymap.begin(); it2 != _keymap.end(); it2++) {
+ printf("%d\n", it2->_value);
+ }
it->_value->mapKey(0);
+ }
_keymap[hwKey->key] = action;
}
void Keymap::unregisterMapping(Action *action) {
const HardwareKey *hwKey = action->getMappedKey();
- if (hwKey)
- _keymap[hwKey->key] = 0;
+ if (hwKey) {
+ _keymap.erase(hwKey->key);
+ }
}
Action *Keymap::getAction(int32 id) {
@@ -92,9 +98,9 @@ Action *Keymap::getMappedAction(const KeyState& ks) const {
return it->_value;
}
-void Keymap::loadMappings(ConfigManager::Domain *domain, const String& name, const HardwareKeySet *hwKeys) {
+void Keymap::loadMappings(ConfigManager::Domain *domain, const HardwareKeySet *hwKeys) {
ConfigManager::Domain::iterator it;
- String prefix = "km_" + name + "_";
+ String prefix = "km_" + _name + "_";
for (it = domain->begin(); it != domain->end(); it++) {
const String& key = it->_key;
if (!key.hasPrefix(prefix.c_str()))
@@ -111,7 +117,7 @@ void Keymap::loadMappings(ConfigManager::Domain *domain, const String& name, con
Action *ua = getAction(actionId);
if (!ua) {
warning("'%s' keymap does not contain Action with ID %d",
- name.c_str(), (int)actionId);
+ _name.c_str(), (int)actionId);
continue;
}
@@ -131,14 +137,14 @@ void Keymap::loadMappings(ConfigManager::Domain *domain, const String& name, con
}
}
-void Keymap::saveMappings(ConfigManager::Domain *domain, const String& name) {
+void Keymap::saveMappings(ConfigManager::Domain *domain) {
if (!domain) return;
List<Action*>::const_iterator it;
- char buf[11];
+ char buf[12];
+ String prefix = "km_" + _name + "_";
for (it = _actions.begin(); it != _actions.end(); it++) {
- String key("km_");
sprintf(buf, "%d", (*it)->id);
- key += name + "_" + buf;
+ String key = prefix + buf;
if ((*it)->getMappedKey())
sprintf(buf, "%d", (*it)->getMappedKey()->id);
else
diff --git a/backends/keymapper/keymap.h b/backends/keymapper/keymap.h
index 21904397a1..349010ccf0 100644
--- a/backends/keymapper/keymap.h
+++ b/backends/keymapper/keymap.h
@@ -51,7 +51,7 @@ template<> struct Hash<KeyState>
class Keymap {
public:
- Keymap() {}
+ Keymap(const String& na) : _name(na) {}
Keymap(const Keymap& km);
public:
@@ -70,9 +70,9 @@ public:
Action *getAction(int32 id);
/**
- * Get a read-only array of all the Actions contained in this Keymap
+ * Get the list of all the Actions contained in this Keymap
*/
- const List<Action*>& getActions() const { return _actions; }
+ List<Action*>& getActions() { return _actions; }
/**
* Find the Action that a key is mapped to
@@ -84,17 +84,15 @@ public:
/**
* Load this keymap's mappings from the given config domain and hardware key set
* @param domain config domain to load keymap from
- * @param name name of the keymap to load
* @param hwKeys the set to retrieve hardware key pointers from
*/
- void loadMappings(ConfigManager::Domain *domain, const String& name, const HardwareKeySet *hwKeys);
+ void loadMappings(ConfigManager::Domain *domain, const HardwareKeySet *hwKeys);
/**
* Save this keymap's mappings to the given config domain
* @param domain config domain to save keymap to
- * @param name name to save the keymap under
*/
- void saveMappings(ConfigManager::Domain *domain, const String& name);
+ void saveMappings(ConfigManager::Domain *domain);
/**
* Returns true if all UserAction's in Keymap are mapped, or,
@@ -102,6 +100,8 @@ public:
*/
bool isComplete(const HardwareKeySet *hwKeys);
+ const String& getName() { return _name; }
+
private:
friend struct Action;
/**
@@ -124,6 +124,7 @@ private:
void internalMapKey(Action *action, HardwareKey *hwKey);
+ String _name;
List<Action*> _actions;
HashMap<KeyState, Action*> _keymap;
diff --git a/backends/keymapper/keymapper.cpp b/backends/keymapper/keymapper.cpp
index fb1f72e84e..c41d74c1cf 100644
--- a/backends/keymapper/keymapper.cpp
+++ b/backends/keymapper/keymapper.cpp
@@ -30,6 +30,7 @@ namespace Common {
Keymapper::Keymapper(EventManager *evtMgr) {
_eventMan = evtMgr;
_keymapMan = new KeymapManager();
+ _enabled = true;
}
Keymapper::~Keymapper() {
@@ -40,28 +41,15 @@ void Keymapper::registerHardwareKeySet(HardwareKeySet *keys) {
_keymapMan->registerHardwareKeySet(keys);
}
-void Keymapper::addGlobalKeymap(const String& name, Keymap *keymap) {
- _keymapMan->registerGlobalKeymap(name, keymap);
+void Keymapper::addGlobalKeymap(Keymap *keymap) {
+ _keymapMan->registerGlobalKeymap(keymap);
}
-void Keymapper::setDefaultGlobalKeymap(Keymap *keymap) {
- _keymapMan->registerDefaultGlobalKeymap(keymap);
- pushKeymap(keymap, false);
-}
-
-void Keymapper::addGameKeymap(const String& name, Keymap *keymap) {
+void Keymapper::addGameKeymap(Keymap *keymap) {
if (ConfMan.getActiveDomain() == 0)
- error("Call to Keymapper::initGame when no game loaded");
+ error("Call to Keymapper::addGameKeymap when no game loaded");
- _keymapMan->registerGameKeymap(name, keymap);
-}
-
-void Keymapper::setDefaultGameKeymap(Keymap *keymap) {
- if (ConfMan.getActiveDomain() == 0)
- error("Call to Keymapper::initGame when no game loaded");
-
- _keymapMan->registerDefaultGameKeymap(keymap);
- pushKeymap(keymap, true);
+ _keymapMan->registerGameKeymap(keymap);
}
bool Keymapper::pushKeymap(const String& name, bool inherit) {
@@ -95,6 +83,7 @@ bool Keymapper::mapKeyUp(const KeyState& key) {
}
bool Keymapper::mapKey(const KeyState& key, bool isKeyDown) {
+ if (!_enabled) return false;
if (_activeMaps.empty()) return false;
Action *action = 0;
@@ -143,4 +132,10 @@ bool Keymapper::mapKey(const KeyState& key, bool isKeyDown) {
return true;
}
+const HardwareKey *Keymapper::getHardwareKey(const KeyState& key) {
+ HardwareKeySet *keyset = _keymapMan->getHardwareKeySet();
+ if (!keyset) return 0;
+ return keyset->findHardwareKey(key);
+}
+
} // end of namespace Common
diff --git a/backends/keymapper/keymapper.h b/backends/keymapper/keymapper.h
index 1052903b77..b5985470fe 100644
--- a/backends/keymapper/keymapper.h
+++ b/backends/keymapper/keymapper.h
@@ -36,6 +36,8 @@
namespace Common {
class Keymapper {
+ friend class RemapDialog;
+
public:
Keymapper(EventManager *eventMan);
@@ -49,39 +51,31 @@ public:
/**
- * Add a general keymap to the global domain.
+ * Add a keymap to the global domain.
* If a saved key setup exists for it in the ini file it will be used.
* Else, the key setup will be automatically mapped.
*/
- void addGlobalKeymap(const String& name, Keymap *keymap);
+ void addGlobalKeymap(Keymap *keymap);
/**
- * Sets the default keymap for the global domain.
- */
- void setDefaultGlobalKeymap(Keymap *keymap);
-
- /**
- * Add a general keymap to the game domain.
+ * Add a keymap to the game domain.
* @see addGlobalKeyMap
* @note initGame() should be called before any game keymaps are added.
*/
- void addGameKeymap(const String& name, Keymap *keymap);
+ void addGameKeymap(Keymap *keymap);
/**
- * Sets the default keymap for the game domain.
- */
- void setDefaultGameKeymap(Keymap *keymap);
-
- /**
- * Push a new keymap to the top of the active stack, activating it for use.
+ * Push a new keymap to the top of the active stack, activating
+ * it for use.
* @param name name of the keymap to push
- * @param inherit if true
- * @return true if successful
+ * @param inherit if true keymapper will iterate down the
+ * stack it cannot find a key in the new map
+ * @return true if succesful
*/
bool pushKeymap(const String& name, bool inherit = false);
/**
- * Pop the active keymap off the stack.
+ * Pop the top keymap off the active stack.
*/
void popKeymap();
@@ -107,6 +101,10 @@ public:
*/
bool mapKeyUp(const KeyState& key);
+ const HardwareKey *getHardwareKey(const KeyState& key);
+
+ void setEnabled(bool enabled) { _enabled = enabled; }
+
private:
void pushKeymap(Keymap *newMap, bool inherit);
@@ -116,6 +114,7 @@ private:
EventManager *_eventMan;
KeymapManager *_keymapMan;
+ bool _enabled;
struct MapRecord {
Keymap* keymap;
diff --git a/backends/keymapper/remap-dialog.cpp b/backends/keymapper/remap-dialog.cpp
new file mode 100644
index 0000000000..8bd36fe952
--- /dev/null
+++ b/backends/keymapper/remap-dialog.cpp
@@ -0,0 +1,174 @@
+#include "backends/keymapper/remap-dialog.h"
+#include "gui/eval.h"
+#include "gui/newgui.h"
+#include "gui/PopUpWidget.h"
+
+namespace Common {
+
+enum {
+ kRemapCmd = 'REMP'
+};
+
+RemapDialog::RemapDialog()
+ : Dialog("remap"), _activeRemap(0) {
+
+ const int screenW = g_system->getOverlayWidth();
+ const int screenH = g_system->getOverlayHeight();
+
+ _keymapper = g_system->getEventManager()->getKeymapper();
+ assert(_keymapper);
+ _activeKeymaps = &_keymapper->_activeMaps;
+
+ int keymapCount = 0;
+ _globalKeymaps = &_keymapper->_keymapMan->getGlobalDomain();
+ if (_globalKeymaps->count() == 0)
+ _globalKeymaps = 0;
+ else
+ keymapCount += _globalKeymaps->count();
+ if (ConfMan.getActiveDomain() != 0) {
+ _gameKeymaps = &_keymapper->_keymapMan->getGameDomain();
+ if (_gameKeymaps->count() == 0)
+ _gameKeymaps = 0;
+ else
+ keymapCount += _gameKeymaps->count();
+ } else
+ _gameKeymaps = 0;
+
+ _keymapTable = (Keymap**)malloc(sizeof(Keymap*) * keymapCount);
+
+ int labelWidth = g_gui.evaluator()->getVar("remap_popup_labelW");
+ _kmPopUp = new GUI::PopUpWidget(this, "remap_popup", "Keymap:", labelWidth);
+
+ if (_activeKeymaps->size() > 0) {
+ _kmPopUp->appendEntry(_activeKeymaps->top().keymap->getName() + " (Active)");
+ }
+ KeymapManager::Domain::iterator it;
+ uint32 idx = 0;
+
+ if (_globalKeymaps) {
+ _kmPopUp->appendEntry("");
+ for (it = _globalKeymaps->begin(); it != _globalKeymaps->end(); it++) {
+ _kmPopUp->appendEntry(it->_value->getName() + " (Global)", idx);
+ _keymapTable[idx++] = it->_value;
+ }
+ }
+ if (_gameKeymaps) {
+ _kmPopUp->appendEntry("");
+ for (it = _gameKeymaps->begin(); it != _gameKeymaps->end(); it++) {
+ _kmPopUp->appendEntry(it->_value->getName() + " (Game)", idx);
+ _keymapTable[idx++] = it->_value;
+ }
+ }
+
+ _w = screenW - 2 * 20;
+ _h = screenH - 2 * 20;
+ // Center the dialog
+ _x = (screenW - _w) / 2;
+ _y = (screenH - _h) / 2;
+
+ _colCount = 2;
+ _spacing = 10;
+ _colWidth = (_w - (_colCount - 1) * _spacing) / _colCount;
+ _widgetsY = g_gui.evaluator()->getVar("remap_widgetsY");
+ if (g_gui.getWidgetSize() == GUI::kBigWidgetSize)
+ _buttonHeight = GUI::kBigButtonHeight;
+ else
+ _buttonHeight = GUI::kButtonHeight;
+
+}
+
+RemapDialog::~RemapDialog() {
+ free(_keymapTable);
+}
+
+void RemapDialog::open() {
+ Dialog::open();
+
+ _kmPopUp->setSelected(0);
+ refreshKeymap();
+}
+
+void RemapDialog::handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data) {
+ if (cmd >= kRemapCmd && cmd < kRemapCmd + _keymapMappings.size()) {
+ startRemapping(&_keymapMappings[cmd - kRemapCmd]);
+ } else if (cmd == GUI::kPopUpItemSelectedCmd) {
+ refreshKeymap();
+ } else {
+ GUI::Dialog::handleCommand(sender, cmd, data);
+ }
+}
+
+void RemapDialog::startRemapping(Mapping *remap) {
+ _activeRemap = remap;
+ _activeRemap->keyButton->setLabel("...");
+ _keymapper->setEnabled(false);
+}
+
+void RemapDialog::stopRemapping() {
+ refreshKeymap();
+ _activeRemap = 0;
+ _keymapper->setEnabled(true);
+}
+
+void RemapDialog::handleKeyDown(Common::KeyState state) {
+ if (_activeRemap) {
+ const HardwareKey *hwkey = _keymapper->getHardwareKey(state);
+ if (hwkey) {
+ _activeRemap->action->mapKey(hwkey);
+ stopRemapping();
+ }
+ } else {
+ GUI::Dialog::handleKeyDown(state);
+ }
+
+}
+
+void RemapDialog::refreshKeymap() {
+ if (_activeKeymaps->size() > 0 && _kmPopUp->getSelected() == 0) {
+ // TODO: show active keymaps (with inherited mappings)
+ } else {
+ Keymap *km = _keymapTable[_kmPopUp->getSelectedTag()];
+ List<Action*>& actions = km->getActions();
+ setNumOfWidgets(actions.size());
+ uint idx = 0;
+ List<Action*>::iterator it;
+ for (it = actions.begin(); it != actions.end(); it++, idx++) {
+ Mapping& ma = _keymapMappings[idx];
+ ma.action = *it;
+ ma.actionText->setLabel(ma.action->description + ":");
+ ma.keyButton->setLabel(ma.action->getMappedKey()->description);
+ }
+ }
+
+}
+
+void RemapDialog::setNumOfWidgets(uint newNum) {
+ uint num = _keymapMappings.size();
+ if (num < newNum) {
+ uint textYOff = (_buttonHeight - kLineHeight) / 2;
+ while (num < newNum) {
+ uint x = (num % _colCount) * (_colWidth + _spacing);
+ uint y = _widgetsY + (num / _colCount) * (_buttonHeight + _spacing);
+ Mapping ma;
+ ma.action = 0;
+ ma.actionText = new GUI::StaticTextWidget(this, x, y + textYOff,
+ _colWidth / 2, kLineHeight, "", Graphics::kTextAlignRight);
+ ma.keyButton = new GUI::ButtonWidget(this, x + _colWidth / 2,
+ y, _colWidth / 2, _buttonHeight, "", kRemapCmd + num);
+ _keymapMappings.push_back(ma);
+ num++;
+ }
+ } else {
+ while (num > newNum) {
+ Mapping ma = _keymapMappings.remove_at(num - 1);
+ removeWidget(ma.actionText);
+ delete ma.actionText;
+ removeWidget(ma.keyButton);
+ delete ma.keyButton;
+ num--;
+ }
+ }
+
+}
+
+} // end of namespace Common
diff --git a/backends/keymapper/remap-dialog.h b/backends/keymapper/remap-dialog.h
new file mode 100644
index 0000000000..3be311c9fa
--- /dev/null
+++ b/backends/keymapper/remap-dialog.h
@@ -0,0 +1,78 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * 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 (at your option) 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ */
+
+#ifndef REMAP_DIALOG_H
+#define REMAP_DIALOG_H
+
+#include "backends/keymapper/keymapper.h"
+#include "gui/dialog.h"
+
+namespace GUI {
+ class PopupWidget;
+}
+
+namespace Common {
+
+class RemapDialog : public GUI::Dialog {
+public:
+ RemapDialog();
+ virtual ~RemapDialog();
+ virtual void open();
+ virtual void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data);
+ virtual void handleKeyDown(Common::KeyState state);
+
+protected:
+ struct Mapping {
+ Action *action;
+ GUI::StaticTextWidget *actionText;
+ GUI::ButtonWidget *keyButton;
+ };
+
+ void refreshKeymap();
+ void setNumOfWidgets(uint num);
+ void startRemapping(Mapping *remap);
+ void stopRemapping();
+
+ Keymapper *_keymapper;
+ Stack<Keymapper::MapRecord> *_activeKeymaps;
+ KeymapManager::Domain *_globalKeymaps;
+ KeymapManager::Domain *_gameKeymaps;
+
+ GUI::PopUpWidget *_kmPopUp;
+ Keymap** _keymapTable;
+
+ uint _colWidth;
+ uint _colCount;
+ uint _spacing;
+ uint _widgetsY;
+ uint _buttonHeight;
+
+ Mapping *_activeRemap;
+ Array<Mapping> _keymapMappings;
+
+};
+
+} // end of namespace Common
+
+#endif