feat: easy switching between virtual keyboard layouts

This commit is contained in:
Martin Prokoph
2025-05-19 19:18:18 +02:00
parent 0dfd1994dc
commit 7b723513ae
4 changed files with 27 additions and 1 deletions

View File

@@ -14,6 +14,7 @@ import com.mojang.blaze3d.systems.RenderSystem;
import eu.midnightdust.midnightcontrols.MidnightControlsConstants;
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
import eu.midnightdust.midnightcontrols.client.util.platform.NetworkUtil;
import eu.midnightdust.midnightcontrols.client.virtualkeyboard.KeyboardLayoutManager;
import org.thinkingstudio.obsidianui.background.Background;
import org.thinkingstudio.obsidianui.mixin.DrawContextAccessor;
import org.thinkingstudio.obsidianui.widget.SpruceWidget;
@@ -140,6 +141,15 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
maxAnalogValueOption("midnightcontrols.menu.max_right_x_value", GLFW.GLFW_GAMEPAD_AXIS_RIGHT_X),
maxAnalogValueOption("midnightcontrols.menu.max_right_y_value", GLFW.GLFW_GAMEPAD_AXIS_RIGHT_Y)
};
// Controller options
public final static SpruceOption virtualKeyboardLayoutOption =
new SpruceCyclingOption("midnightcontrols.menu.virtual_keyboard_layout",
amount -> {
MidnightControlsConfig.keyboardLayout = KeyboardLayoutManager.getNext(KeyboardLayoutManager.getById(MidnightControlsConfig.keyboardLayout)).getId();
},
option -> {
return option.getDisplayText(Text.translatable(KeyboardLayoutManager.getById(MidnightControlsConfig.keyboardLayout).getTranslationKey()));
}, null);
private static SpruceOption maxAnalogValueOption(String key, int axis) {
return new SpruceDoubleOption(key, .25f, 1.f, 0.05f,
@@ -395,6 +405,7 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
list.addSingleOptionEntry(this.mouseSpeedOption);
list.addSingleOptionEntry(this.virtualMouseOption);
list.addSingleOptionEntry(this.virtualKeyboardOption);
list.addSingleOptionEntry(this.virtualKeyboardLayoutOption);
list.addSingleOptionEntry(this.hideCursorOption);
list.addSingleOptionEntry(this.joystickAsMouseOption);
list.addSingleOptionEntry(this.eyeTrackingAsMouseOption);

View File

@@ -52,6 +52,12 @@ public class KeyboardLayout {
return id;
}
public String getTranslationKey() {
String[] identifier = id.split(":");
if (identifier.length != 2) return "Invalid Keyboard ID: %s".formatted(id);
return "midnightcontrols.virtual_keyboard.layout.%s.%s".formatted(identifier[0], identifier[1]);
}
public List<List<String>> getLetters() {
return letters;
}

View File

@@ -24,4 +24,13 @@ public class KeyboardLayoutManager {
public static KeyboardLayout getById(String id) {
return KEYBOARD_LAYOUTS.get(id) == null ? KeyboardLayout.QWERTY : KEYBOARD_LAYOUTS.get(id);
}
public static KeyboardLayout getNext(KeyboardLayout current) {
KeyboardLayout[] layouts = KEYBOARD_LAYOUTS.values().toArray(KeyboardLayout[]::new);
int currentIndex = -1;
for (int i = 0; i < layouts.length; i++) {
if (layouts[i] == current) currentIndex = i;
}
currentIndex = currentIndex+1 >= layouts.length ? 0 : currentIndex + 1;
return layouts[currentIndex];
}
}

View File

@@ -15,7 +15,7 @@ modrinth_id = bXX9h73M
curseforge_id = 621768
# Configure the IDs here after creating the projects on the websites
midnightlib_version=1.7.0+1.21.4
midnightlib_version=1.7.3+1.21.4
fabric_loader_version=0.16.10
fabric_api_version=0.119.5+1.21.5