Browse Source

key name capture

Laserlicht 3 months ago
parent
commit
21df285e5a

+ 0 - 1
Mods/vcmi/Content/config/english.json

@@ -262,7 +262,6 @@
 	"vcmi.shortcuts.button.hover" : "Shortcuts",
 	"vcmi.shortcuts.button.help"  : "{Shortcuts}\n\nShow menu for viewing and adjusting shortcuts and keybindings",
 	"vcmi.shortcuts.editButton.help" : "Edit key binding",
-	"vcmi.shortcuts.editButton.popup" : "You want to change keybinding for {%s}?\n\nSadly setting the key binding here is not supported yet. Bindings has to configured over {shortcutsConfig.json} in config folder. You need to add the key {%s}.",
 	"vcmi.shortcuts.group.keyboard" : "Keyboard",
 	"vcmi.shortcuts.group.joystickAxes" : "Joystick Axes",
 	"vcmi.shortcuts.group.joystickButtons" : "Joystick Buttons",

+ 0 - 1
Mods/vcmi/Content/config/german.json

@@ -262,7 +262,6 @@
 	"vcmi.shortcuts.button.hover" : "Tastenkürzel",
 	"vcmi.shortcuts.button.help"  : "{Tastenkürzel}\n\nMenü zum Anzeigen und Anpassen von Tastenkürzeln und Tastenbelegungen anzeigen",
 	"vcmi.shortcuts.editButton.help" : "Tastenbelegung bearbeiten",
-	"vcmi.shortcuts.editButton.popup" : "Möchten Sie die Tastenbelegung für {%s} ändern?\n\nLeider wird das Festlegen der Tastenbelegung hier noch nicht unterstützt. Die Belegung muss über die {shortcutsConfig.json} im Konfigurationsordner eingestellt werden. Sie müssen den Schlüssel {%s} hinzufügen.",
 	"vcmi.shortcuts.group.keyboard" : "Tastatur",
 	"vcmi.shortcuts.group.joystickAxes" : "Joystick-Achsen",
 	"vcmi.shortcuts.group.joystickButtons" : "Joystick-Tasten",

+ 7 - 2
client/eventsSDL/InputSourceGameController.cpp

@@ -140,12 +140,13 @@ double InputSourceGameController::getRealAxisValue(int value) const
 	return clampedValue;
 }
 
-void InputSourceGameController::dispatchAxisShortcuts(const std::vector<EShortcut> & shortcutsVector, SDL_GameControllerAxis axisID, int axisValue)
+void InputSourceGameController::dispatchAxisShortcuts(const std::vector<EShortcut> & shortcutsVector, SDL_GameControllerAxis axisID, int axisValue, std::string axisName)
 {
 	if(getRealAxisValue(axisValue) > configTriggerThreshold)
 	{
 		if(!pressedAxes.count(axisID))
 		{
+			ENGINE->events().dispatchKeyPressed(axisName);
 			ENGINE->events().dispatchShortcutPressed(shortcutsVector);
 			pressedAxes.insert(axisID);
 		}
@@ -154,6 +155,7 @@ void InputSourceGameController::dispatchAxisShortcuts(const std::vector<EShortcu
 	{
 		if(pressedAxes.count(axisID))
 		{
+			ENGINE->events().dispatchKeyReleased(axisName);
 			ENGINE->events().dispatchShortcutReleased(shortcutsVector);
 			pressedAxes.erase(axisID);
 		}
@@ -189,7 +191,7 @@ void InputSourceGameController::handleEventAxisMotion(const SDL_ControllerAxisEv
 		}
 	}
 
-	dispatchAxisShortcuts(buttonActions, axisID, axis.value);
+	dispatchAxisShortcuts(buttonActions, axisID, axis.value, axisName);
 }
 
 void InputSourceGameController::tryToConvertCursor()
@@ -208,6 +210,8 @@ void InputSourceGameController::handleEventButtonDown(const SDL_ControllerButton
 {
 	std::string buttonName = SDL_GameControllerGetStringForButton(static_cast<SDL_GameControllerButton>(button.button));
 	const auto & shortcutsVector = ENGINE->shortcuts().translateJoystickButton(buttonName);
+	
+	ENGINE->events().dispatchKeyPressed(buttonName);
 	ENGINE->events().dispatchShortcutPressed(shortcutsVector);
 }
 
@@ -215,6 +219,7 @@ void InputSourceGameController::handleEventButtonUp(const SDL_ControllerButtonEv
 {
 	std::string buttonName = SDL_GameControllerGetStringForButton(static_cast<SDL_GameControllerButton>(button.button));
 	const auto & shortcutsVector = ENGINE->shortcuts().translateJoystickButton(buttonName);
+	ENGINE->events().dispatchKeyReleased(buttonName);
 	ENGINE->events().dispatchShortcutReleased(shortcutsVector);
 }
 

+ 1 - 1
client/eventsSDL/InputSourceGameController.h

@@ -48,7 +48,7 @@ class InputSourceGameController
 	void openGameController(int index);
 	int getJoystickIndex(SDL_GameController * controller);
 	double getRealAxisValue(int value) const;
-	void dispatchAxisShortcuts(const std::vector<EShortcut> & shortcutsVector, SDL_GameControllerAxis axisID, int axisValue);
+	void dispatchAxisShortcuts(const std::vector<EShortcut> & shortcutsVector, SDL_GameControllerAxis axisID, int axisValue, std::string axisName);
 	void tryToConvertCursor();
 	void doCursorMove(int deltaX, int deltaY);
 	int getMoveDis(float planDis);

+ 4 - 0
client/eventsSDL/InputSourceKeyboard.cpp

@@ -88,6 +88,8 @@ void InputSourceKeyboard::handleEventKeyDown(const SDL_KeyboardEvent & key)
 
 	auto shortcutsVector = ENGINE->shortcuts().translateKeycode(keyName);
 
+	ENGINE->events().dispatchKeyPressed(keyName);
+
 	if (vstd::contains(shortcutsVector, EShortcut::MAIN_MENU_LOBBY))
 		ENGINE->user().onGlobalLobbyInterfaceActivated();
 
@@ -142,6 +144,8 @@ void InputSourceKeyboard::handleEventKeyUp(const SDL_KeyboardEvent & key)
 	assert(key.state == SDL_RELEASED);
 
 	auto shortcutsVector = ENGINE->shortcuts().translateKeycode(keyName);
+	
+	ENGINE->events().dispatchKeyReleased(keyName);
 
 	ENGINE->events().dispatchShortcutReleased(shortcutsVector);
 }

+ 17 - 0
client/gui/EventDispatcher.cpp

@@ -43,6 +43,7 @@ void EventDispatcher::processLists(ui16 activityFlag, const Functor & cb)
 	processList(AEventsReceiver::TEXTINPUT, textInterested);
 	processList(AEventsReceiver::GESTURE, panningInterested);
 	processList(AEventsReceiver::INPUT_MODE_CHANGE, inputModeChangeInterested);
+	processList(AEventsReceiver::KEY_NAME, keyNameInterested);
 }
 
 void EventDispatcher::activateElement(AEventsReceiver * elem, ui16 activityFlag)
@@ -133,6 +134,22 @@ void EventDispatcher::dispatchShortcutReleased(const std::vector<EShortcut> & sh
 	}
 }
 
+void EventDispatcher::dispatchKeyPressed(const std::string & keyName)
+{
+	EventReceiversList miCopy = keyNameInterested;
+
+	for(auto & i : miCopy)
+		i->keyPressed(keyName);
+}
+
+void EventDispatcher::dispatchKeyReleased(const std::string & keyName)
+{
+	EventReceiversList miCopy = keyNameInterested;
+
+	for(auto & i : miCopy)
+		i->keyReleased(keyName);
+}
+
 void EventDispatcher::dispatchMouseDoubleClick(const Point & position, int tolerance)
 {
 	handleDoubleButtonClick(position, tolerance);

+ 5 - 0
client/gui/EventDispatcher.h

@@ -37,6 +37,7 @@ class EventDispatcher
 	EventReceiversList textInterested;
 	EventReceiversList panningInterested;
 	EventReceiversList inputModeChangeInterested;
+	EventReceiversList keyNameInterested;
 
 	void handleLeftButtonClick(const Point & position, int tolerance, bool isPressed);
 	void handleDoubleButtonClick(const Point & position, int tolerance);
@@ -59,6 +60,10 @@ public:
 	void dispatchShortcutPressed(const std::vector<EShortcut> & shortcuts);
 	void dispatchShortcutReleased(const std::vector<EShortcut> & shortcuts);
 
+	/// Key events (to get keyname of pressed key)
+	void dispatchKeyPressed(const std::string & keyName);
+	void dispatchKeyReleased(const std::string & keyName);
+
 	/// Mouse events
 	void dispatchMouseLeftButtonPressed(const Point & position, int tolerance);
 	void dispatchMouseLeftButtonReleased(const Point & position, int tolerance);

+ 5 - 1
client/gui/EventsReceiver.h

@@ -77,6 +77,9 @@ public:
 	virtual void keyPressed(EShortcut key) {}
 	virtual void keyReleased(EShortcut key) {}
 
+	virtual void keyPressed(const std::string & keyName) {}
+	virtual void keyReleased(const std::string & keyName) {}
+
 	virtual void tick(uint32_t msPassed) {}
 
 	virtual void inputModeChanged(InputMode modi) {}
@@ -101,7 +104,8 @@ public:
 		GESTURE = 1024,
 		DRAG = 2048,
 		INPUT_MODE_CHANGE = 4096,
-		DRAG_POPUP = 8192
+		DRAG_POPUP = 8192,
+		KEY_NAME = 16384
 	};
 
 	/// Returns true if element is currently hovered by mouse

+ 20 - 4
client/windows/settings/ShortcutsWindow.cpp

@@ -11,6 +11,7 @@
 #include "StdInc.h"
 #include "ShortcutsWindow.h"
 
+#include "../../GameEngine.h"
 #include "../../gui/Shortcut.h"
 #include "../../gui/WindowHandler.h"
 #include "../../widgets/Buttons.h"
@@ -110,10 +111,7 @@ ShortcutElement::ShortcutElement(std::string id, JsonNode keys, int elem)
 	buttonEdit = std::make_shared<CButton>(Point(422, 3), AnimationPath::builtin("settingsWindow/button32"), std::make_pair("", MetaString::createFromTextID("vcmi.shortcuts.editButton.help").toString()));
 	buttonEdit->setOverlay(std::make_shared<CPicture>(ImagePath::builtin("settingsWindow/gear")));
 	buttonEdit->addCallback([id](){
-		auto str = MetaString::createFromTextID("vcmi.shortcuts.editButton.popup");
-		str.replaceTextID("vcmi.shortcuts.shortcut." + id);
-		str.replaceRawString(id);
-		CInfoWindow::showInfoDialog(str.toString(), {});
+		ENGINE->windows().createAndPushWindow<ShortcutsEditWindow>(id);
 	});
 	if(elem < MAX_LINES - 1)
 		seperationLine = std::make_shared<TransparentFilledRectangle>(Rect(0, LINE_HEIGHT, 456, 1), ColorRGBA(0, 0, 0, 64), ColorRGBA(128, 100, 75), 1);
@@ -133,3 +131,21 @@ ShortcutElement::ShortcutElement(std::string group, int elem)
 	if(elem < MAX_LINES - 1)
 		seperationLine = std::make_shared<TransparentFilledRectangle>(Rect(0, LINE_HEIGHT, 456, 1), ColorRGBA(0, 0, 0, 64), ColorRGBA(128, 100, 75), 1);
 }
+
+ShortcutsEditWindow::ShortcutsEditWindow(const std::string & id)
+	: CWindowObject(BORDERED)
+{
+	OBJECT_CONSTRUCTION;
+	pos.w = 200;
+	pos.h = 100;
+
+	updateShadow();
+	center();
+
+	addUsedEvents(KEY_NAME);
+}
+
+void ShortcutsEditWindow::keyPressed(const std::string & keyName)
+{
+	std::cout << keyName << "\n";
+}

+ 8 - 0
client/windows/settings/ShortcutsWindow.h

@@ -53,3 +53,11 @@ public:
 	ShortcutsWindow();
 };
 
+class ShortcutsEditWindow : public CWindowObject
+{
+private:
+	void keyPressed(const std::string & keyName) override;
+public:
+	ShortcutsEditWindow(const std::string & id);
+};
+