Skip to content

Commit 6b89dbf

Browse files
committed
feat: back to SpruceUI!
- SpruceUI is now also available for NeoForge, so I can ditch ObsidianUI and move back to an actively maintained UI library :)
1 parent faf24ce commit 6b89dbf

30 files changed

Lines changed: 328 additions & 239 deletions

build.gradle

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ subprojects {
2424
maven {
2525
url = "https://api.modrinth.com/maven"
2626
}
27+
maven {
28+
name 'Gegy'
29+
url 'https://maven.gegy.dev'
30+
}
2731
maven { url 'https://jitpack.io' }
2832
flatDir {
2933
dirs("../localMaven")

common/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ dependencies {
2929
// Using the Fabric version of midnightlib here to create a common config and get useful utilities
3030
// Just make sure NOT to use classes from the .fabric classpath
3131
modCompileOnlyApi "maven.modrinth:midnightlib:${rootProject.midnightlib_version}-fabric"
32-
modCompileOnlyApi "maven.modrinth:obsidianui:${rootProject.obsidianui_version}-fabric"
32+
modCompileOnlyApi "dev.lambdaurora:spruceui:${project.spruceui_version}"
3333
modCompileOnlyApi ("com.terraformersmc:modmenu:${project.modmenu_version}") {
3434
exclude(group: "net.fabricmc.fabric-api")
3535
}

common/src/main/java/eu/midnightdust/midnightcontrols/ControlsMode.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,9 @@
1111

1212
import net.minecraft.text.Text;
1313
import net.minecraft.text.object.AtlasTextObjectContents;
14-
import net.minecraft.text.object.TextObjectContents;
1514
import net.minecraft.util.Atlases;
16-
import net.minecraft.util.Identifier;
1715
import net.minecraft.util.TranslatableOption;
1816
import org.jetbrains.annotations.NotNull;
19-
import org.thinkingstudio.obsidianui.util.Nameable;
2017

2118
import java.util.Arrays;
2219
import java.util.Optional;

common/src/main/java/eu/midnightdust/midnightcontrols/MidnightControlsFeature.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99

1010
package eu.midnightdust.midnightcontrols;
1111

12-
import org.thinkingstudio.obsidianui.util.Nameable;
1312
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
13+
import org.aperlambda.lambdacommon.utils.Nameable;
1414
import org.jetbrains.annotations.NotNull;
1515

1616
import java.util.ArrayList;

common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
import eu.midnightdust.midnightcontrols.client.util.platform.NetworkUtil;
2929
import eu.midnightdust.midnightcontrols.client.virtualkeyboard.MouseClickInterceptor;
3030
import net.minecraft.client.gui.screen.Screen;
31-
import org.thinkingstudio.obsidianui.hud.HudManager;
3231
import eu.midnightdust.midnightcontrols.client.touch.TouchInput;
3332
import eu.midnightdust.midnightcontrols.client.util.RainbowColor;
3433
import eu.midnightdust.midnightcontrols.packet.ControlsModePayload;
@@ -102,7 +101,6 @@ public void run() {
102101
}
103102
}, delay, period);
104103

105-
HudManager.register(hud = new MidnightControlsHud());
106104
isWayland = GLFW.glfwGetVersionString().contains("Wayland");
107105
}
108106

@@ -120,7 +118,7 @@ public static void onMcInit(@NotNull MinecraftClient client) {
120118
MidnightControlsConfig.configVersion = 2;
121119
MidnightControlsConfig.write(MidnightControlsConstants.NAMESPACE);
122120
}
123-
hud.setVisible(MidnightControlsConfig.hudEnable);
121+
MidnightControlsHud.isVisible = MidnightControlsConfig.hudEnable;
124122
Controller.updateMappings();
125123
try {
126124
GLFW.glfwSetJoystickCallback((jid, event) -> {
@@ -247,7 +245,7 @@ public static void switchControlsMode() {
247245
*/
248246
public static void setHudEnabled(boolean enabled) {
249247
MidnightControlsConfig.hudEnable = enabled;
250-
hud.setVisible(enabled);
248+
MidnightControlsHud.isVisible = enabled;
251249
}
252250

253251
private static final MidnightControlsClient INSTANCE = new MidnightControlsClient();

common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,12 @@
2929
import eu.midnightdust.midnightcontrols.client.enums.ControllerType;
3030
import eu.midnightdust.midnightcontrols.client.enums.HudSide;
3131
import eu.midnightdust.midnightcontrols.client.enums.VirtualMouseSkin;
32+
import eu.midnightdust.midnightcontrols.client.gui.MidnightControlsSettingsScreen;
3233
import eu.midnightdust.midnightcontrols.client.gui.RingScreen;
3334
import eu.midnightdust.midnightcontrols.client.enums.TouchMode;
3435
import eu.midnightdust.midnightcontrols.client.gui.config.ControllerBindingButton;
3536
import eu.midnightdust.midnightcontrols.client.gui.config.ControllerSelectionButton;
37+
import eu.midnightdust.midnightcontrols.client.gui.config.MappingsStringInputWidget;
3638
import eu.midnightdust.midnightcontrols.client.virtualkeyboard.KeyboardLayoutManager;
3739
import net.minecraft.client.MinecraftClient;
3840
import net.minecraft.client.gui.screen.ChatScreen;
@@ -49,6 +51,7 @@
4951
import java.util.*;
5052
import java.util.regex.Pattern;
5153

54+
import static eu.midnightdust.midnightcontrols.client.MidnightControlsClient.client;
5255
import static org.lwjgl.glfw.GLFW.*;
5356

5457
/**
@@ -62,6 +65,7 @@ public class MidnightControlsConfig extends MidnightConfig {
6265
public static final String VISUAL = "visual";
6366
public static final String MISC = "misc";
6467
public static final String BUTTONS = "buttons";
68+
public static final String MAPPING = "mapping";
6569
public static boolean isEditing = false;
6670
@Hidden @Entry public static int configVersion = 2;
6771

@@ -186,7 +190,12 @@ public class MidnightControlsConfig extends MidnightConfig {
186190
@Comment(category = MISC, centered = true, name="☆ Other Options") public static Comment _otherOptions;
187191
@Entry(category = MISC, name = "Trigger button fix") public static boolean triggerFix = true;
188192
@Entry(category = MISC, name = "Excluded Controllers (Name Regex)") public static List<String> excludedControllers = Lists.newArrayList(".*(Keyboard)$", ".*(Touchpad)$", ".*(Pen)$", ".*(Finger)$");
193+
194+
// Init mapping tab (see #onTabInit())
195+
@Comment(category = MAPPING) @Condition(requiredModId = "thisModDoesNotExist") public static Comment this_spacer_will_never_be_visible_as_well;
196+
189197
@Entry @Hidden public static Map<String, Map<String, String>> controllerBindingProfiles = new HashMap<>();
198+
190199
private static Map<String, String> currentBindingProfile = new HashMap<>();
191200
private static Controller prevController;
192201

@@ -236,6 +245,15 @@ public boolean centered() {
236245
list.addButton(List.of(), Text.of("\uD83C\uDFAE General"), centeredComment);
237246
ControllerSelectionButton.add(list, screen, false);
238247
ControllerSelectionButton.add(list, screen, true);
248+
249+
ButtonWidget editButton = ButtonWidget.builder(Text.of("OPEN"),
250+
button -> {
251+
client.setScreen(new MidnightControlsSettingsScreen(client.currentScreen, false));
252+
}).dimensions(screen.width - 185, 0, 175, 20).build();
253+
list.addButton(List.of(editButton), Text.of("Legacy Config UI"), new EntryInfo(null, screen.modid));
254+
}
255+
if (MAPPING.equals(tabName)) {
256+
MappingsStringInputWidget.add(centeredComment, list, screen);
239257
}
240258
}
241259

@@ -507,17 +525,23 @@ public static void reset() {
507525
* @return the controller name matches a type, else empty
508526
*/
509527
public static @NotNull ControllerType matchControllerToType() {
510-
String controller = getController().getName().toLowerCase();
511-
if (controller.contains("xbox 360")) return ControllerType.XBOX_360;
512-
else if (controller.contains("xbox") || controller.contains("afterglow")) return ControllerType.XBOX;
513-
else if (controller.contains("steam") && GLX._getCpuInfo().contains("AMD Custom APU")) return ControllerType.STEAM_DECK;
514-
else if (controller.contains("steam")) return ControllerType.STEAM_CONTROLLER;
515-
else if (controller.contains("dualsense") || controller.contains("ps5")) return ControllerType.DUALSENSE;
516-
else if (controller.contains("dualshock") || controller.contains("ps4") || controller.contains("sony")) return ControllerType.DUALSHOCK;
517-
else if (controller.contains("switch") || controller.contains("joy-con") || controller.contains("wii") || controller.contains("nintendo")) return ControllerType.SWITCH;
518-
else if (controller.contains("ouya")) return ControllerType.OUYA;
528+
String name = getController().getName().toLowerCase();
529+
if (containsAny(name, "xbox 360")) return ControllerType.XBOX_360;
530+
else if (containsAny(name, "xbox") || name.contains("afterglow")) return ControllerType.XBOX;
531+
else if (containsAny(name, "steam") && GLX._getCpuInfo().contains("AMD Custom APU")) return ControllerType.STEAM_DECK;
532+
else if (containsAny(name, "steam")) return ControllerType.STEAM_CONTROLLER;
533+
else if (containsAny(name, "dualsense", "ps5")) return ControllerType.DUALSENSE;
534+
else if (containsAny(name, "dualshock", "ps4", "sony")) return ControllerType.DUALSHOCK;
535+
else if (containsAny(name, "switch", "joy-con", "wii", "nintendo")) return ControllerType.SWITCH;
536+
else if (containsAny(name, "ouya")) return ControllerType.OUYA;
519537
else return ControllerType.DEFAULT;
520538
}
539+
540+
private static boolean containsAny(String controller, String... substring) {
541+
for (String s : substring) if (controller.contains(s)) return true;
542+
return false;
543+
}
544+
521545
public static boolean doMixedInput() {
522546
return touchInControllerMode && controlsMode == ControlsMode.CONTROLLER;
523547
}

common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsModMenu.java

Lines changed: 0 additions & 28 deletions
This file was deleted.

common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,14 @@
1010
package eu.midnightdust.midnightcontrols.client;
1111

1212
import com.google.common.collect.ImmutableSet;
13+
import dev.lambdaurora.spruceui.navigation.NavigationEvent;
14+
import dev.lambdaurora.spruceui.screen.SpruceScreen;
15+
import dev.lambdaurora.spruceui.widget.AbstractSprucePressableButtonWidget;
16+
import dev.lambdaurora.spruceui.widget.AbstractSpruceWidget;
17+
import dev.lambdaurora.spruceui.widget.SpruceElement;
18+
import dev.lambdaurora.spruceui.widget.SpruceLabelWidget;
19+
import dev.lambdaurora.spruceui.widget.container.SpruceEntryListWidget;
20+
import dev.lambdaurora.spruceui.widget.container.SpruceParentWidget;
1321
import eu.midnightdust.lib.util.PlatformFunctions;
1422
import eu.midnightdust.midnightcontrols.client.compat.EmotecraftCompat;
1523
import eu.midnightdust.midnightcontrols.client.compat.LibGuiCompat;
@@ -24,15 +32,14 @@
2432
import eu.midnightdust.midnightcontrols.client.util.storage.AxisStorage;
2533
import eu.midnightdust.midnightcontrols.client.util.storage.ButtonStorage;
2634
import net.minecraft.client.gui.Click;
35+
import net.minecraft.client.gui.navigation.NavigationDirection;
2736
import net.minecraft.client.gui.screen.option.KeybindsScreen;
2837
import net.minecraft.client.gui.widget.EntryListWidget;
2938
import net.minecraft.client.gui.widget.PressableWidget;
3039
import net.minecraft.client.gui.widget.SliderWidget;
3140
import net.minecraft.client.input.KeyInput;
3241
import net.minecraft.client.input.MouseInput;
3342
import net.minecraft.entity.vehicle.BoatEntity;
34-
import org.thinkingstudio.obsidianui.widget.AbstractSpruceWidget;
35-
import org.thinkingstudio.obsidianui.widget.container.SpruceEntryListWidget;
3643
import eu.midnightdust.midnightcontrols.MidnightControls;
3744
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
3845
import eu.midnightdust.midnightcontrols.client.controller.Controller;
@@ -43,12 +50,6 @@
4350
import eu.midnightdust.midnightcontrols.client.ring.RingPage;
4451
import eu.midnightdust.midnightcontrols.client.util.HandledScreenAccessor;
4552
import eu.midnightdust.midnightcontrols.client.util.MathUtil;
46-
import org.thinkingstudio.obsidianui.navigation.NavigationDirection;
47-
import org.thinkingstudio.obsidianui.screen.SpruceScreen;
48-
import org.thinkingstudio.obsidianui.widget.AbstractSprucePressableButtonWidget;
49-
import org.thinkingstudio.obsidianui.widget.SpruceElement;
50-
import org.thinkingstudio.obsidianui.widget.SpruceLabelWidget;
51-
import org.thinkingstudio.obsidianui.widget.container.SpruceParentWidget;
5253
import eu.midnightdust.midnightcontrols.client.enums.ButtonState;
5354
import net.minecraft.client.MinecraftClient;
5455
import net.minecraft.client.gui.Element;
@@ -603,7 +604,7 @@ public boolean handleListWidgetScrolling(List<? extends Element> children, float
603604
.map(element -> (EntryListWidget<?>) element)
604605
.filter(element -> element.getType().isFocused())
605606
.anyMatch(element -> {
606-
element.mouseScrolled(0.0, 0.0, 0, -value);
607+
element.mouseScrolled(0.0, 0.0, 0, -value / 30);
607608
return true;
608609
});
609610
}
@@ -652,7 +653,7 @@ public boolean handleAButton(@NotNull Screen screen, @NotNull Element focused) {
652653
*/
653654
private boolean handleLeftRight(@NotNull Screen screen, boolean right) {
654655
if (screen instanceof SpruceScreen spruceScreen) {
655-
spruceScreen.onNavigation(right ? NavigationDirection.RIGHT : NavigationDirection.LEFT, false);
656+
spruceScreen.onNavigation(new NavigationEvent(right ? NavigationDirection.RIGHT : NavigationDirection.LEFT, false, false));
656657
this.actionGuiCooldown = 5;
657658
return false;
658659
}
@@ -672,7 +673,7 @@ private boolean handleRightLeftElement(@NotNull Element element, boolean right)
672673
case SpruceElement spruceElement -> {
673674
if (spruceElement.requiresCursor())
674675
return true;
675-
return !spruceElement.onNavigation(right ? NavigationDirection.RIGHT : NavigationDirection.LEFT, false);
676+
return !spruceElement.onNavigation(new NavigationEvent(right ? NavigationDirection.RIGHT : NavigationDirection.LEFT, false, false));
676677
}
677678
case SliderWidget slider -> {
678679
if (slider.active) {
@@ -767,7 +768,7 @@ private boolean changeFocus(@NotNull Screen screen, NavigationDirection directio
767768
if (!isScreenInteractive(screen) && !screen.getClass().getCanonicalName().contains("me.jellysquid.mods.sodium.client.gui")) return false;
768769
try {
769770
if (screen instanceof SpruceScreen spruceScreen) {
770-
if (spruceScreen.onNavigation(direction, false)) {
771+
if (spruceScreen.onNavigation(new NavigationEvent(direction, false, false))) {
771772
this.actionGuiCooldown = 5;
772773
}
773774
return true;

common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MappingsStringInputWidget.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,16 @@
99

1010
package eu.midnightdust.midnightcontrols.client.gui;
1111

12+
import dev.lambdaurora.spruceui.Position;
13+
import dev.lambdaurora.spruceui.option.SpruceOption;
14+
import dev.lambdaurora.spruceui.option.SpruceSimpleActionOption;
15+
import dev.lambdaurora.spruceui.render.SpruceGuiGraphics;
16+
import dev.lambdaurora.spruceui.widget.container.SpruceContainerWidget;
17+
import dev.lambdaurora.spruceui.widget.text.SpruceTextAreaWidget;
1218
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
1319
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
1420
import eu.midnightdust.midnightcontrols.client.controller.Controller;
1521
import net.minecraft.client.gui.DrawContext;
16-
import net.minecraft.client.util.math.MatrixStack;
17-
import org.thinkingstudio.obsidianui.Position;
18-
import org.thinkingstudio.obsidianui.option.SpruceOption;
19-
import org.thinkingstudio.obsidianui.option.SpruceSimpleActionOption;
20-
import org.thinkingstudio.obsidianui.widget.container.SpruceContainerWidget;
21-
import org.thinkingstudio.obsidianui.widget.text.SpruceTextAreaWidget;
2222
import net.minecraft.client.toast.SystemToast;
2323
import net.minecraft.text.Text;
2424

@@ -105,9 +105,9 @@ else if (MidnightControlsClient.MAPPINGS_FILE.exists()) {
105105
}
106106

107107
@Override
108-
public void renderWidget(DrawContext context, int mouseX, int mouseY, float delta) {
108+
public void renderWidget(SpruceGuiGraphics context, int mouseX, int mouseY, float delta) {
109109
super.renderWidget(context, mouseX, mouseY, delta);
110-
context.drawCenteredTextWithShadow(this.client.textRenderer, Text.translatable("midnightcontrols.menu.multiple_mapping_tip"), this.textArea.getX() + this.textArea.getWidth() / 2, this.textArea.getY() + this.textArea.getHeight() - 12, 0xFF888888);
111-
context.drawCenteredTextWithShadow(this.client.textRenderer, Text.translatable("midnightcontrols.menu.current_controller_guid", MidnightControlsConfig.getController().getGuid()), this.textArea.getX() + this.textArea.getWidth() / 2, this.height - 21, 0xFFFFFFFF);
110+
context.vanilla().drawCenteredTextWithShadow(this.client.textRenderer, Text.translatable("midnightcontrols.menu.multiple_mapping_tip"), this.textArea.getX() + this.textArea.getWidth() / 2, this.textArea.getY() + this.textArea.getHeight() - 12, 0xFF888888);
111+
context.vanilla().drawCenteredTextWithShadow(this.client.textRenderer, Text.translatable("midnightcontrols.menu.current_controller_guid", MidnightControlsConfig.getController().getGuid()), this.textArea.getX() + this.textArea.getWidth() / 2, this.height - 21, 0xFFFFFFFF);
112112
}
113113
}

0 commit comments

Comments
 (0)