From dd07ff4d686f07cdc9736627dd0ef099ef5e4e4f Mon Sep 17 00:00:00 2001 From: troido Date: Fri, 6 Mar 2020 11:26:59 +0100 Subject: new directory structure for the separate client repo --- asciifarmclient/inputhandler.py | 98 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 asciifarmclient/inputhandler.py (limited to 'asciifarmclient/inputhandler.py') diff --git a/asciifarmclient/inputhandler.py b/asciifarmclient/inputhandler.py new file mode 100644 index 0000000..4281c01 --- /dev/null +++ b/asciifarmclient/inputhandler.py @@ -0,0 +1,98 @@ + +import string + +from .commandhandler import CommandHandler, InvalidCommandException + +import ratuil.inputs as inp + + +class InputHandler: + + def __init__(self, client, keybindings): + self.client = client + self.keybindings = keybindings + self.commandHandler = CommandHandler(self.client) + + self.typing = False + self.string = "" + self.cursor = 0 + + + def onInput(self, key): + if not self.typing: + keyName = key + if keyName in self.keybindings: + self.commandHandler.execute(self.keybindings[keyName]) + else: + self.addKey(key) + + + def processString(self, message): + if message: + if message[0] == '/': + if len(message) == 1: + return + if message[1] == '/': + self.commandHandler.chat(message[1:]) + else: + try: + command, _sep, arg = message[1:].partition(' ') + try: + self.commandHandler.execute([command, arg]) + except Exception as e: + self.log(e) + except InvalidCommandException as e: + self.client.log(", ".join(e.args)) + else: + self.commandHandler.chat(message) + + def startTyping(self, startText=""): + self.typing = True + if startText and not self.string: + self.string = startText + self.cursor = len(self.string) + + self.showString() + + def showString(self): + self.client.display.setInputString(self.string, self.cursor if self.typing else None) + + def addKey(self, key): + if key == inp.BACKSPACE: + self.string = self.string[:self.cursor-1] + self.string[self.cursor:] + self.cursor = max(self.cursor - 1, 0) + elif key == inp.RIGHT: + self.cursor = min(self.cursor + 1, len(self.string)) + elif key == inp.LEFT: + self.cursor = max(self.cursor - 1, 0) + elif key == inp.DELETE: + self.string = self.string[:self.cursor] + self.string[self.cursor+1:] + elif key == inp.HOME: + self.cursor = 0 + elif key == inp.END: + self.cursor = len(self.string) + + elif key == inp.ESCAPE: + # throw away entered string and go back to game + self.typing = False + self.string = "" + self.cursor = 0 + elif key == inp.ENTER: + # process entered string and reset it + message = self.string + self.string = "" + self.cursor = 0 + self.typing = False + self.processString(message) + elif key == "^I": # tab + # return to game but keep entered string + self.typing = False + elif key.isprintable() and len(key) == 1: + self.string = self.string[:self.cursor] + key + self.string[self.cursor:] + self.cursor += len(key) + + self.showString() + + + + -- cgit