From ecb7cfd8885dc293aceeefc25ca944e179200cae Mon Sep 17 00:00:00 2001 From: Martin Prokoph Date: Sat, 10 May 2025 10:38:54 +0200 Subject: [PATCH] feat: load virtual keyboard layouts from JSON --- .../virtualkeyboard/KeyboardLayout.java | 47 ++++++++++++++++++- .../keyboard-layouts/de_quertz.json | 16 +++++++ .../keyboard-layouts/en_querty.json | 16 +++++++ 3 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 common/src/main/resources/assets/midnightcontrols/keyboard-layouts/de_quertz.json create mode 100644 common/src/main/resources/assets/midnightcontrols/keyboard-layouts/en_querty.json diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/virtualkeyboard/KeyboardLayout.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/virtualkeyboard/KeyboardLayout.java index 82d9b0b..1c07fe7 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/virtualkeyboard/KeyboardLayout.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/virtualkeyboard/KeyboardLayout.java @@ -1,21 +1,64 @@ package eu.midnightdust.midnightcontrols.client.virtualkeyboard; +import com.google.gson.JsonObject; + import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class KeyboardLayout { - public static KeyboardLayout QWERTY = new KeyboardLayout(createQwertyLetterLayout(), createSymbolLayout()); + public static KeyboardLayout QWERTY = new KeyboardLayout("US (Qwerty)", "en-US", createQwertyLetterLayout(), createSymbolLayout()); + public static final List KEYBOARD_LAYOUTS = new ArrayList<>(); + private final String name; + private final String locale; private final List> letters; private final List> symbols; - private KeyboardLayout(List> letters, List> symbols) { + private KeyboardLayout(String name, String locale, List> letters, List> symbols) { + this.name = name; + this.locale = locale; this.letters = letters; this.symbols = symbols; } + public KeyboardLayout fromJson(JsonObject json) { + try { + return new KeyboardLayout(json.get("metadata").getAsJsonObject().get("name").getAsString(), json.get("metadata").getAsJsonObject().get("locale").getAsString(), getFromJson(json, true), getFromJson(json, false)); + } catch (Exception e) { + throw new RuntimeException("Error loading keyboard definition: %s".formatted(e)); + } + } + public List> getFromJson(JsonObject json, boolean letters) { + String type = letters ? "letters" : "symbols"; + List> arr = new ArrayList<>(); + if (json.has(type)) { + JsonObject lettersJson = json.get(type).getAsJsonObject(); + for (int i = 0; ; i++) { + if (!lettersJson.has("row%s".formatted(i))) break; + var rowJson = lettersJson.get("row%s".formatted(i)).getAsJsonArray(); + List row = new ArrayList<>(); + for (int j = 0; j < rowJson.size(); j++) { + row.add(rowJson.get(j).getAsString()); + } + arr.add(row); + } + return arr; + } + else { + return letters ? createQwertyLetterLayout() : createSymbolLayout(); + } + } + + public String getName() { + return name; + } + + public String getLocale() { + return locale; + } + public List> getLetters() { return letters; } diff --git a/common/src/main/resources/assets/midnightcontrols/keyboard-layouts/de_quertz.json b/common/src/main/resources/assets/midnightcontrols/keyboard-layouts/de_quertz.json new file mode 100644 index 0000000..4a58ed1 --- /dev/null +++ b/common/src/main/resources/assets/midnightcontrols/keyboard-layouts/de_quertz.json @@ -0,0 +1,16 @@ +{ + "metadata": { + "name": "German (Quertz)", + "locale": "de-DE" + }, + "letters": { + "row1": ["q", "w", "e", "r", "t", "z", "u", "i", "o", "p", "ü"], + "row2": ["a", "s", "d", "f", "g", "h", "j", "k", "l", "ö", "ä"], + "row3": ["y", "x", "c", "v", "b", "n", "m", "ß"] + }, + "symbols": { + "row1": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"], + "row2": ["@", "#", "$", "%", "&", "*", "-", "+", "(", ")"], + "row3": ["!", "\"", "'", ":", ";", ",", ".", "?", "/"] + } +} diff --git a/common/src/main/resources/assets/midnightcontrols/keyboard-layouts/en_querty.json b/common/src/main/resources/assets/midnightcontrols/keyboard-layouts/en_querty.json new file mode 100644 index 0000000..e7c5a2f --- /dev/null +++ b/common/src/main/resources/assets/midnightcontrols/keyboard-layouts/en_querty.json @@ -0,0 +1,16 @@ +{ + "metadata": { + "name": "US (Querty)", + "locale": "en-US" + }, + "letters": { + "row1": ["q", "w", "e", "r", "t", "y", "u", "i", "o", "p"], + "row2": ["a", "s", "d", "f", "g", "h", "j", "k", "l"], + "row3": ["z", "x", "c", "v", "b", "n", "m"] + }, + "symbols": { + "row1": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"], + "row2": ["@", "#", "$", "%", "&", "*", "-", "+", "(", ")"], + "row3": ["!", "\"", "'", ":", ";", ",", ".", "?", "/"] + } +}