mirror of
https://github.com/TeamMidnightDust/MidnightControls.git
synced 2025-12-14 07:35:10 +01:00
feat: add more functionality to MidnightLib-based config
- The plan is to slowly phase out ObsidianUI, as it is not updated fast enough
This commit is contained in:
@@ -21,6 +21,7 @@ import eu.midnightdust.midnightcontrols.MidnightControls;
|
|||||||
import eu.midnightdust.midnightcontrols.MidnightControlsConstants;
|
import eu.midnightdust.midnightcontrols.MidnightControlsConstants;
|
||||||
import eu.midnightdust.midnightcontrols.MidnightControlsFeature;
|
import eu.midnightdust.midnightcontrols.MidnightControlsFeature;
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
||||||
|
import eu.midnightdust.midnightcontrols.client.controller.ButtonCategory;
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.Controller;
|
import eu.midnightdust.midnightcontrols.client.controller.Controller;
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.InputManager;
|
import eu.midnightdust.midnightcontrols.client.controller.InputManager;
|
||||||
import eu.midnightdust.midnightcontrols.client.enums.ButtonState;
|
import eu.midnightdust.midnightcontrols.client.enums.ButtonState;
|
||||||
@@ -30,17 +31,29 @@ import eu.midnightdust.midnightcontrols.client.enums.HudSide;
|
|||||||
import eu.midnightdust.midnightcontrols.client.enums.VirtualMouseSkin;
|
import eu.midnightdust.midnightcontrols.client.enums.VirtualMouseSkin;
|
||||||
import eu.midnightdust.midnightcontrols.client.gui.RingScreen;
|
import eu.midnightdust.midnightcontrols.client.gui.RingScreen;
|
||||||
import eu.midnightdust.midnightcontrols.client.enums.TouchMode;
|
import eu.midnightdust.midnightcontrols.client.enums.TouchMode;
|
||||||
|
import eu.midnightdust.midnightcontrols.client.gui.config.ControllerBindingButton;
|
||||||
|
import eu.midnightdust.midnightcontrols.client.gui.config.ControllerSelectionButton;
|
||||||
|
import eu.midnightdust.midnightcontrols.client.virtualkeyboard.KeyboardLayoutManager;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.gui.screen.ChatScreen;
|
import net.minecraft.client.gui.screen.ChatScreen;
|
||||||
import net.minecraft.client.gui.screen.advancement.AdvancementsScreen;
|
import net.minecraft.client.gui.screen.advancement.AdvancementsScreen;
|
||||||
|
import net.minecraft.client.gui.widget.ButtonWidget;
|
||||||
|
import net.minecraft.client.gui.widget.PressableTextWidget;
|
||||||
|
import net.minecraft.client.gui.widget.PressableWidget;
|
||||||
|
import net.minecraft.client.gui.widget.TextIconButtonWidget;
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.util.Formatting;
|
||||||
|
import net.minecraft.util.Identifier;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.lwjgl.glfw.GLFW;
|
import org.lwjgl.glfw.GLFW;
|
||||||
|
|
||||||
|
import java.lang.annotation.Annotation;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import static eu.midnightdust.midnightcontrols.client.MidnightControlsClient.client;
|
||||||
|
import static eu.midnightdust.midnightcontrols.client.gui.MidnightControlsSettingsScreen.searchNextAvailableController;
|
||||||
import static org.lwjgl.glfw.GLFW.*;
|
import static org.lwjgl.glfw.GLFW.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -53,6 +66,7 @@ public class MidnightControlsConfig extends MidnightConfig {
|
|||||||
public static final String SCREENS = "screens";
|
public static final String SCREENS = "screens";
|
||||||
public static final String VISUAL = "visual";
|
public static final String VISUAL = "visual";
|
||||||
public static final String MISC = "misc";
|
public static final String MISC = "misc";
|
||||||
|
public static final String BUTTONS = "buttons";
|
||||||
public static boolean isEditing = false;
|
public static boolean isEditing = false;
|
||||||
@Hidden @Entry public static int configVersion = 2;
|
@Hidden @Entry public static int configVersion = 2;
|
||||||
// General
|
// General
|
||||||
@@ -152,7 +166,7 @@ public class MidnightControlsConfig extends MidnightConfig {
|
|||||||
@Comment(category = SCREENS, centered = true, name="\uD83D\uDD27 UI Modifications") public static Comment _uiMods;
|
@Comment(category = SCREENS, centered = true, name="\uD83D\uDD27 UI Modifications") public static Comment _uiMods;
|
||||||
@Entry(category = SCREENS, name = "midnightcontrols.menu.move_chat") public static boolean moveChat = false;
|
@Entry(category = SCREENS, name = "midnightcontrols.menu.move_chat") public static boolean moveChat = false;
|
||||||
@Entry(category = SCREENS, name = "Enable Shortcut in Controls Options") public static boolean shortcutInControls = true;
|
@Entry(category = SCREENS, name = "Enable Shortcut in Controls Options") public static boolean shortcutInControls = true;
|
||||||
@Entry(category = MISC, name = "midnightcontrols.menu.virtual_keyboard_layout") public static String keyboardLayout = "en_US:qwerty";
|
@Entry(category = MISC) @Hidden public static String keyboardLayout = "en_US:qwerty";
|
||||||
@Entry(category = MISC, name = "Debug") public static boolean debug = false;
|
@Entry(category = MISC, name = "Debug") public static boolean debug = false;
|
||||||
@Entry(category = MISC, name = "Excluded Keybindings") public static List<String> excludedKeybindings = Lists.newArrayList("key.forward", "key.left", "key.back", "key.right", "key.jump", "key.sneak", "key.sprint", "key.inventory",
|
@Entry(category = MISC, name = "Excluded Keybindings") public static List<String> excludedKeybindings = Lists.newArrayList("key.forward", "key.left", "key.back", "key.right", "key.jump", "key.sneak", "key.sprint", "key.inventory",
|
||||||
"key.swapOffhand", "key.drop", "key.use", "key.attack", "key.chat", "key.playerlist", "key.screenshot", "key.togglePerspective", "key.smoothCamera", "key.fullscreen", "key.saveToolbarActivator", "key.loadToolbarActivator",
|
"key.swapOffhand", "key.drop", "key.use", "key.attack", "key.chat", "key.playerlist", "key.screenshot", "key.togglePerspective", "key.smoothCamera", "key.fullscreen", "key.saveToolbarActivator", "key.loadToolbarActivator",
|
||||||
@@ -163,6 +177,55 @@ public class MidnightControlsConfig extends MidnightConfig {
|
|||||||
private static Map<String, String> currentBindingProfile = new HashMap<>();
|
private static Map<String, String> currentBindingProfile = new HashMap<>();
|
||||||
private static Controller prevController;
|
private static Controller prevController;
|
||||||
|
|
||||||
|
@Comment(category = BUTTONS) @Condition(requiredModId = "thisModDoesNotExist") public static Comment this_spacer_will_never_be_visible;
|
||||||
|
public void onTabInit(String tabName, MidnightConfigListWidget list, MidnightConfigScreen screen) {
|
||||||
|
EntryInfo centeredComment = new EntryInfo(null, "midnightcontrols");
|
||||||
|
centeredComment.comment = new Comment() {
|
||||||
|
public Class<? extends Annotation> annotationType() {return null;}
|
||||||
|
public String category() {return "";}
|
||||||
|
public String name() {return "";}
|
||||||
|
public String url() {return "";}
|
||||||
|
public String requiredMod() {return "";}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean centered() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if (BUTTONS.equals(tabName)) {
|
||||||
|
InputManager.streamCategories()
|
||||||
|
.sorted(Comparator.comparingInt(ButtonCategory::getPriority))
|
||||||
|
.forEach(category -> {
|
||||||
|
|
||||||
|
list.addButton(Lists.newArrayList(), Text.literal(category.getTranslatedName()), centeredComment);
|
||||||
|
|
||||||
|
category.getBindings().forEach(binding -> {
|
||||||
|
ControllerBindingButton.add(binding, list, screen);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (MISC.equals(tabName)) {
|
||||||
|
TextIconButtonWidget resetButton = TextIconButtonWidget.builder(Text.translatable("controls.reset"), (button -> {
|
||||||
|
MidnightControlsConfig.keyboardLayout = "en_US:qwerty";
|
||||||
|
screen.updateList();
|
||||||
|
}), true).texture(Identifier.of("midnightlib","icon/reset"), 12, 12).dimension(20, 20).build();
|
||||||
|
resetButton.setPosition(screen.width - 205 + 150 + 25, 0);
|
||||||
|
ButtonWidget editButton = ButtonWidget.builder(Text.translatable(KeyboardLayoutManager.getById(MidnightControlsConfig.keyboardLayout).getTranslationKey()),
|
||||||
|
button -> {
|
||||||
|
MidnightControlsConfig.keyboardLayout = KeyboardLayoutManager.getNext(KeyboardLayoutManager.getById(MidnightControlsConfig.keyboardLayout)).getId();
|
||||||
|
resetButton.active = !MidnightControlsConfig.keyboardLayout.equals("en_US:qwerty");
|
||||||
|
button.setMessage(Text.translatable(KeyboardLayoutManager.getById(MidnightControlsConfig.keyboardLayout).getTranslationKey()));
|
||||||
|
}).dimensions(screen.width - 185, 0, 150, 20).build();
|
||||||
|
resetButton.active = !MidnightControlsConfig.keyboardLayout.equals("en_US:qwerty");
|
||||||
|
|
||||||
|
list.addButton(List.of(editButton, resetButton), Text.translatable("midnightcontrols.menu.virtual_keyboard_layout"), new EntryInfo(null, screen.modid));
|
||||||
|
}
|
||||||
|
if (CONTROLLER.equals(tabName)) {
|
||||||
|
ControllerSelectionButton.add(list, screen, false);
|
||||||
|
ControllerSelectionButton.add(list, screen, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loads the configuration
|
* Loads the configuration
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import eu.midnightdust.midnightcontrols.client.compat.EmotecraftCompat;
|
|||||||
import eu.midnightdust.midnightcontrols.client.compat.LibGuiCompat;
|
import eu.midnightdust.midnightcontrols.client.compat.LibGuiCompat;
|
||||||
import eu.midnightdust.midnightcontrols.client.compat.MidnightControlsCompat;
|
import eu.midnightdust.midnightcontrols.client.compat.MidnightControlsCompat;
|
||||||
import eu.midnightdust.midnightcontrols.client.compat.YACLCompat;
|
import eu.midnightdust.midnightcontrols.client.compat.YACLCompat;
|
||||||
|
import eu.midnightdust.midnightcontrols.client.gui.config.ControlsInput;
|
||||||
import eu.midnightdust.midnightcontrols.client.mixin.AdvancementsScreenAccessor;
|
import eu.midnightdust.midnightcontrols.client.mixin.AdvancementsScreenAccessor;
|
||||||
import eu.midnightdust.midnightcontrols.client.mixin.CreativeInventoryScreenAccessor;
|
import eu.midnightdust.midnightcontrols.client.mixin.CreativeInventoryScreenAccessor;
|
||||||
import eu.midnightdust.midnightcontrols.client.mixin.KeyboardAccessor;
|
import eu.midnightdust.midnightcontrols.client.mixin.KeyboardAccessor;
|
||||||
@@ -98,7 +99,7 @@ public class MidnightInput {
|
|||||||
public int inventoryInteractionCooldown = 0;
|
public int inventoryInteractionCooldown = 0;
|
||||||
public int screenCloseCooldown = 0;
|
public int screenCloseCooldown = 0;
|
||||||
|
|
||||||
private ControllerControlsWidget controlsInput = null;
|
private ControlsInput controlsInput = null;
|
||||||
|
|
||||||
public MidnightInput() {}
|
public MidnightInput() {}
|
||||||
|
|
||||||
@@ -156,7 +157,7 @@ public class MidnightInput {
|
|||||||
this.fetchJoystickInput(state, true, false);
|
this.fetchJoystickInput(state, true, false);
|
||||||
});
|
});
|
||||||
|
|
||||||
boolean allowInput = this.controlsInput == null || this.controlsInput.focusedBinding == null;
|
boolean allowInput = this.controlsInput == null || this.controlsInput.getFocusedBinding() == null;
|
||||||
|
|
||||||
if (allowInput)
|
if (allowInput)
|
||||||
InputManager.updateBindings();
|
InputManager.updateBindings();
|
||||||
@@ -167,11 +168,11 @@ public class MidnightInput {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (this.controlsInput != null && InputManager.STATES.int2ObjectEntrySet().parallelStream().map(Map.Entry::getValue).allMatch(ButtonState::isUnpressed)) {
|
if (this.controlsInput != null && InputManager.STATES.int2ObjectEntrySet().parallelStream().map(Map.Entry::getValue).allMatch(ButtonState::isUnpressed)) {
|
||||||
if (MidnightControlsConfig.debug) MidnightControls.log("Starting MidnightInput Button Edit");
|
//if (MidnightControlsConfig.debug) MidnightControls.log("Starting MidnightInput Button Edit");
|
||||||
if (this.controlsInput.focusedBinding != null && !this.controlsInput.waiting) {
|
if (this.controlsInput.getFocusedBinding() != null && !this.controlsInput.isWaiting()) {
|
||||||
int[] buttons = new int[this.controlsInput.currentButtons.size()];
|
int[] buttons = new int[this.controlsInput.getCurrentButtons().size()];
|
||||||
for (int i = 0; i < this.controlsInput.currentButtons.size(); i++)
|
for (int i = 0; i < this.controlsInput.getCurrentButtons().size(); i++)
|
||||||
buttons[i] = this.controlsInput.currentButtons.get(i);
|
buttons[i] = this.controlsInput.getCurrentButtons().get(i);
|
||||||
this.controlsInput.finishBindingEdit(buttons);
|
this.controlsInput.finishBindingEdit(buttons);
|
||||||
this.controlsInput = null;
|
this.controlsInput = null;
|
||||||
}
|
}
|
||||||
@@ -246,11 +247,11 @@ public class MidnightInput {
|
|||||||
this.inventoryInteractionCooldown = 5;
|
this.inventoryInteractionCooldown = 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void beginControlsInput(ControllerControlsWidget widget) {
|
public void beginControlsInput(ControlsInput widget) {
|
||||||
this.controlsInput = widget;
|
this.controlsInput = widget;
|
||||||
if (widget != null) {
|
if (widget != null) {
|
||||||
this.controlsInput.currentButtons.clear();
|
this.controlsInput.getCurrentButtons().clear();
|
||||||
this.controlsInput.waiting = true;
|
this.controlsInput.setWaiting(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -332,16 +333,17 @@ public class MidnightInput {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void handleButton(ButtonStorage storage) {
|
public void handleButton(ButtonStorage storage) {
|
||||||
if (this.controlsInput != null && this.controlsInput.focusedBinding != null) {
|
if (this.controlsInput != null && this.controlsInput.getFocusedBinding() != null) {
|
||||||
if (storage.state == ButtonState.PRESS && !this.controlsInput.currentButtons.contains(storage.button)) {
|
if (storage.state == ButtonState.PRESS && !this.controlsInput.getCurrentButtons().contains(storage.button)) {
|
||||||
this.controlsInput.currentButtons.add(storage.button);
|
this.controlsInput.getCurrentButtons().add(storage.button);
|
||||||
|
|
||||||
var buttons = new int[this.controlsInput.currentButtons.size()];
|
var buttons = new int[this.controlsInput.getCurrentButtons().size()];
|
||||||
for (int i = 0; i < this.controlsInput.currentButtons.size(); i++)
|
for (int i = 0; i < this.controlsInput.getCurrentButtons().size(); i++)
|
||||||
buttons[i] = this.controlsInput.currentButtons.get(i);
|
buttons[i] = this.controlsInput.getCurrentButtons().get(i);
|
||||||
this.controlsInput.focusedBinding.setButton(buttons);
|
this.controlsInput.getFocusedBinding().setButton(buttons);
|
||||||
|
this.controlsInput.update();
|
||||||
|
|
||||||
this.controlsInput.waiting = false;
|
this.controlsInput.setWaiting(false);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -517,17 +519,18 @@ public class MidnightInput {
|
|||||||
// @TODO allow rebinding to left stick
|
// @TODO allow rebinding to left stick
|
||||||
int preferredAxis = true ? GLFW_GAMEPAD_AXIS_RIGHT_Y : GLFW_GAMEPAD_AXIS_LEFT_Y;
|
int preferredAxis = true ? GLFW_GAMEPAD_AXIS_RIGHT_Y : GLFW_GAMEPAD_AXIS_LEFT_Y;
|
||||||
|
|
||||||
if (this.controlsInput != null && this.controlsInput.focusedBinding != null) {
|
if (this.controlsInput != null && this.controlsInput.getFocusedBinding() != null) {
|
||||||
if (storage.buttonState != ButtonState.NONE && !this.controlsInput.currentButtons.contains(storage.getButtonId(storage.buttonState == ButtonState.PRESS))) {
|
if (storage.buttonState != ButtonState.NONE && !this.controlsInput.getCurrentButtons().contains(storage.getButtonId(storage.buttonState == ButtonState.PRESS))) {
|
||||||
|
|
||||||
this.controlsInput.currentButtons.add(storage.getButtonId(storage.buttonState == ButtonState.PRESS));
|
this.controlsInput.getCurrentButtons().add(storage.getButtonId(storage.buttonState == ButtonState.PRESS));
|
||||||
|
|
||||||
int[] buttons = new int[this.controlsInput.currentButtons.size()];
|
int[] buttons = new int[this.controlsInput.getCurrentButtons().size()];
|
||||||
for (int i = 0; i < this.controlsInput.currentButtons.size(); i++)
|
for (int i = 0; i < this.controlsInput.getCurrentButtons().size(); i++)
|
||||||
buttons[i] = this.controlsInput.currentButtons.get(i);
|
buttons[i] = this.controlsInput.getCurrentButtons().get(i);
|
||||||
this.controlsInput.focusedBinding.setButton(buttons);
|
this.controlsInput.getFocusedBinding().setButton(buttons);
|
||||||
|
this.controlsInput.update();
|
||||||
|
|
||||||
this.controlsInput.waiting = false;
|
this.controlsInput.setWaiting(false);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
} else if (storage.absValue >= storage.deadZone) {
|
} else if (storage.absValue >= storage.deadZone) {
|
||||||
|
|||||||
@@ -163,7 +163,7 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
|
|||||||
.append(Text.literal(GAMEPAD_TOOL_URL).formatted(Formatting.GOLD))
|
.append(Text.literal(GAMEPAD_TOOL_URL).formatted(Formatting.GOLD))
|
||||||
.append("),");
|
.append("),");
|
||||||
|
|
||||||
private static int searchNextAvailableController(int newId, boolean allowNone) {
|
public static int searchNextAvailableController(int newId, boolean allowNone) {
|
||||||
if ((allowNone && newId == -1) || newId == 0) return newId;
|
if ((allowNone && newId == -1) || newId == 0) return newId;
|
||||||
|
|
||||||
Controller candidate = Controller.byId(newId);
|
Controller candidate = Controller.byId(newId);
|
||||||
|
|||||||
@@ -0,0 +1,154 @@
|
|||||||
|
package eu.midnightdust.midnightcontrols.client.gui.config;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
import eu.midnightdust.lib.config.EntryInfo;
|
||||||
|
import eu.midnightdust.lib.config.MidnightConfigListWidget;
|
||||||
|
import eu.midnightdust.lib.config.MidnightConfigScreen;
|
||||||
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
||||||
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
||||||
|
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
||||||
|
import eu.midnightdust.midnightcontrols.client.controller.InputManager;
|
||||||
|
import eu.midnightdust.midnightcontrols.client.gui.MidnightControlsRenderer;
|
||||||
|
import net.minecraft.client.MinecraftClient;
|
||||||
|
import net.minecraft.client.font.TextRenderer;
|
||||||
|
import net.minecraft.client.gui.DrawContext;
|
||||||
|
import net.minecraft.client.gui.tooltip.Tooltip;
|
||||||
|
import net.minecraft.client.gui.widget.ButtonWidget;
|
||||||
|
import net.minecraft.client.gui.widget.ClickableWidget;
|
||||||
|
import net.minecraft.client.gui.widget.TextIconButtonWidget;
|
||||||
|
import net.minecraft.client.input.AbstractInput;
|
||||||
|
import net.minecraft.text.MutableText;
|
||||||
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.util.Formatting;
|
||||||
|
import net.minecraft.util.Identifier;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.thinkingstudio.obsidianui.SpruceTexts;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
|
public class ControllerBindingButton extends ButtonWidget implements ControlsInput {
|
||||||
|
private static final int[] UNBOUND = new int[]{-1};
|
||||||
|
static boolean waiting = false;
|
||||||
|
static List<Integer> currentButtons = new ArrayList<>();
|
||||||
|
private int iconWidth;
|
||||||
|
|
||||||
|
public static void add(ButtonBinding binding, MidnightConfigListWidget list, MidnightConfigScreen screen) {
|
||||||
|
ControllerBindingButton editButton = new ControllerBindingButton(screen.width - 185 + 22, 0, 128, 20, binding);
|
||||||
|
TextIconButtonWidget resetButton = TextIconButtonWidget.builder(Text.translatable("controls.reset"), (button -> {
|
||||||
|
MidnightControlsConfig.setButtonBinding(binding, binding.getDefaultButton());
|
||||||
|
screen.updateList();
|
||||||
|
}), true).texture(Identifier.of("midnightlib","icon/reset"), 12, 12).dimension(20, 20).build();
|
||||||
|
resetButton.setPosition(screen.width - 205 + 150 + 25, 0);
|
||||||
|
editButton.resetButton = resetButton;
|
||||||
|
editButton.updateMessage(false);
|
||||||
|
EntryInfo info = new EntryInfo(null, screen.modid);
|
||||||
|
|
||||||
|
TextIconButtonWidget unbindButton = TextIconButtonWidget.builder(Text.translatable("midnightcontrols.narrator.unbound", binding.getText()), (button -> {
|
||||||
|
MidnightControlsConfig.setButtonBinding(binding, UNBOUND);
|
||||||
|
screen.updateList();
|
||||||
|
}), true).texture(Identifier.of("midnightcontrols","icon/unbind"), 12, 12).dimension(20, 20).build();
|
||||||
|
unbindButton.setPosition(screen.width - 205 + 20, 0);
|
||||||
|
unbindButton.setTooltip(Tooltip.of(SpruceTexts.GUI_UNBIND));
|
||||||
|
|
||||||
|
list.addButton(Lists.newArrayList(editButton, resetButton, unbindButton), Text.translatable(binding.getTranslationKey()), info);
|
||||||
|
}
|
||||||
|
|
||||||
|
private final ButtonBinding binding;
|
||||||
|
private @Nullable ClickableWidget resetButton;
|
||||||
|
public ControllerBindingButton(int x, int y, int width, int height, ButtonBinding binding) {
|
||||||
|
super(x, y, width, height, binding.getText(), (button) -> {},
|
||||||
|
(textSupplier) -> binding.isNotBound() ? Text.translatable("narrator.controls.unbound", binding.getTranslationKey()) : Text.translatable("narrator.controls.bound", binding.getTranslationKey(), textSupplier.get()));
|
||||||
|
this.binding = binding;
|
||||||
|
updateMessage(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPress(AbstractInput input) {
|
||||||
|
MidnightControlsClient.input.beginControlsInput(this);
|
||||||
|
this.updateMessage(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void updateMessage(boolean focused) {
|
||||||
|
AtomicBoolean hasConflicts = new AtomicBoolean(false);
|
||||||
|
MutableText conflictingBindings = Text.empty();
|
||||||
|
if (focused) this.setMessage(Text.literal("> ").append(getTranslatedButtons().copy().formatted(Formatting.WHITE, Formatting.UNDERLINE)).append(" <").formatted(Formatting.YELLOW));
|
||||||
|
else {
|
||||||
|
this.setMessage(getTranslatedButtons());
|
||||||
|
|
||||||
|
if (!this.binding.isNotBound()) {
|
||||||
|
InputManager.streamBindings().forEach(keyBinding -> {
|
||||||
|
if (keyBinding != this.binding && this.binding.equals(keyBinding)) {
|
||||||
|
if (hasConflicts.get()) conflictingBindings.append(", ");
|
||||||
|
|
||||||
|
hasConflicts.set(true);
|
||||||
|
conflictingBindings.append(Text.translatable(keyBinding.getTranslationKey()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.resetButton != null) this.resetButton.active = !this.binding.isDefault();
|
||||||
|
|
||||||
|
if (hasConflicts.get()) {
|
||||||
|
this.setMessage(Text.literal("[ ").append(this.getMessage().copy().formatted(Formatting.WHITE)).append(" ]").formatted(Formatting.RED));
|
||||||
|
this.setTooltip(Tooltip.of(Text.translatable("controls.keybinds.duplicateKeybinds", conflictingBindings)));
|
||||||
|
} else {
|
||||||
|
this.setTooltip(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Text getTranslatedButtons() {
|
||||||
|
return this.binding.isNotBound() ? SpruceTexts.NOT_BOUND.copy() :
|
||||||
|
(binding.getButton().length > 0 ? ButtonBinding.getLocalizedButtonName(binding.getButton()[0]) : Text.literal("..."));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawMessage(DrawContext context, TextRenderer textRenderer, int color) {
|
||||||
|
if (this.binding.getButton().length < 2) super.drawMessage(context, textRenderer, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void renderWidget(DrawContext context, int mouseX, int mouseY, float deltaTicks) {
|
||||||
|
super.renderWidget(context, mouseX, mouseY, deltaTicks);
|
||||||
|
int x = this.getX();
|
||||||
|
if (this.binding.getButton().length > 1) {
|
||||||
|
x += (this.width / 2 - iconWidth / 2) - 4;
|
||||||
|
}
|
||||||
|
var size = MidnightControlsRenderer.drawButton(context, x, this.getY(), this.binding, MinecraftClient.getInstance());
|
||||||
|
iconWidth = size.length();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void finishBindingEdit(int... buttons) {
|
||||||
|
MidnightControlsConfig.setButtonBinding(binding, buttons);
|
||||||
|
updateMessage(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void update() {
|
||||||
|
this.updateMessage(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setWaiting(boolean value) {
|
||||||
|
waiting = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isWaiting() {
|
||||||
|
return waiting;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Integer> getCurrentButtons() {
|
||||||
|
return currentButtons;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ButtonBinding getFocusedBinding() {
|
||||||
|
return this.binding;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
package eu.midnightdust.midnightcontrols.client.gui.config;
|
||||||
|
|
||||||
|
import eu.midnightdust.lib.config.EntryInfo;
|
||||||
|
import eu.midnightdust.lib.config.MidnightConfigListWidget;
|
||||||
|
import eu.midnightdust.lib.config.MidnightConfigScreen;
|
||||||
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
||||||
|
import eu.midnightdust.midnightcontrols.client.controller.Controller;
|
||||||
|
import net.minecraft.client.gui.widget.ButtonWidget;
|
||||||
|
import net.minecraft.client.gui.widget.TextIconButtonWidget;
|
||||||
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.util.Formatting;
|
||||||
|
import net.minecraft.util.Identifier;
|
||||||
|
import org.lwjgl.glfw.GLFW;
|
||||||
|
import org.thinkingstudio.obsidianui.SpruceTexts;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static eu.midnightdust.midnightcontrols.client.gui.MidnightControlsSettingsScreen.searchNextAvailableController;
|
||||||
|
|
||||||
|
public class ControllerSelectionButton {
|
||||||
|
public static void add(MidnightConfigListWidget list, MidnightConfigScreen screen, boolean second) {
|
||||||
|
TextIconButtonWidget resetButton = TextIconButtonWidget.builder(Text.translatable("controls.reset"), (button -> {
|
||||||
|
if (second) MidnightControlsConfig.secondControllerID = -1;
|
||||||
|
else MidnightControlsConfig.controllerID = 0;
|
||||||
|
screen.updateList();
|
||||||
|
}), true).texture(Identifier.of("midnightlib","icon/reset"), 12, 12).dimension(20, 20).build();
|
||||||
|
resetButton.setPosition(screen.width - 205 + 150 + 25, 0);
|
||||||
|
ButtonWidget editButton = ButtonWidget.builder(getControllerName(second),
|
||||||
|
button -> {
|
||||||
|
int id = second ? MidnightControlsConfig.getSecondController().map(Controller::id).orElse(-1) : MidnightControlsConfig.getController().id();
|
||||||
|
id += 1;
|
||||||
|
if (id > GLFW.GLFW_JOYSTICK_LAST)
|
||||||
|
id = GLFW.GLFW_JOYSTICK_1;
|
||||||
|
id = searchNextAvailableController(id, second);
|
||||||
|
if (second) {
|
||||||
|
MidnightControlsConfig.setSecondController(Controller.byId(id));
|
||||||
|
} else {
|
||||||
|
MidnightControlsConfig.setController(Controller.byId(id));
|
||||||
|
}
|
||||||
|
if (MidnightControlsConfig.debug && id != -1) System.out.println(Controller.byId(id).getName() + "'s Controller GUID: " + Controller.byId(id).getGuid());
|
||||||
|
|
||||||
|
resetButton.active = second ? MidnightControlsConfig.getSecondController().isPresent() : false;
|
||||||
|
button.setMessage(getControllerName(second));
|
||||||
|
}).dimensions(screen.width - 185, 0, 150, 20).build();
|
||||||
|
resetButton.active = second ? MidnightControlsConfig.getSecondController().isPresent() : false;
|
||||||
|
|
||||||
|
list.addButton(List.of(editButton, resetButton), Text.translatable(second ? "midnightcontrols.menu.controller2" : "midnightcontrols.menu.controller"), new EntryInfo(null, screen.modid));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Text getControllerName(boolean second) {
|
||||||
|
if (second && MidnightControlsConfig.getSecondController().isEmpty()) return SpruceTexts.OPTIONS_OFF.copyContentOnly().formatted(Formatting.RED);
|
||||||
|
|
||||||
|
var controller = second ? MidnightControlsConfig.getSecondController().get() : MidnightControlsConfig.getController();
|
||||||
|
var controllerName = controller.getName();
|
||||||
|
if (!controller.isConnected())
|
||||||
|
return Text.literal(controllerName).formatted(Formatting.RED);
|
||||||
|
else if (!controller.isGamepad())
|
||||||
|
return Text.literal(controllerName).formatted(Formatting.GOLD);
|
||||||
|
else
|
||||||
|
return Text.literal(controllerName);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package eu.midnightdust.midnightcontrols.client.gui.config;
|
||||||
|
|
||||||
|
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface ControlsInput {
|
||||||
|
void setWaiting(boolean value);
|
||||||
|
boolean isWaiting();
|
||||||
|
|
||||||
|
List<Integer> getCurrentButtons();
|
||||||
|
|
||||||
|
ButtonBinding getFocusedBinding();
|
||||||
|
|
||||||
|
void finishBindingEdit(int[] buttons);
|
||||||
|
|
||||||
|
default void update() {};
|
||||||
|
}
|
||||||
@@ -12,6 +12,7 @@ package eu.midnightdust.midnightcontrols.client.gui.widget;
|
|||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.InputManager;
|
import eu.midnightdust.midnightcontrols.client.controller.InputManager;
|
||||||
|
import eu.midnightdust.midnightcontrols.client.gui.config.ControlsInput;
|
||||||
import org.thinkingstudio.obsidianui.Position;
|
import org.thinkingstudio.obsidianui.Position;
|
||||||
import org.thinkingstudio.obsidianui.SpruceTexts;
|
import org.thinkingstudio.obsidianui.SpruceTexts;
|
||||||
import org.thinkingstudio.obsidianui.widget.SpruceButtonWidget;
|
import org.thinkingstudio.obsidianui.widget.SpruceButtonWidget;
|
||||||
@@ -29,11 +30,11 @@ import java.util.stream.Collectors;
|
|||||||
/**
|
/**
|
||||||
* Represents the controls screen.
|
* Represents the controls screen.
|
||||||
*/
|
*/
|
||||||
public class ControllerControlsWidget extends SpruceContainerWidget {
|
public class ControllerControlsWidget extends SpruceContainerWidget implements ControlsInput {
|
||||||
private SpruceButtonWidget resetButton;
|
private SpruceButtonWidget resetButton;
|
||||||
public ButtonBinding focusedBinding;
|
ButtonBinding focusedBinding = null;
|
||||||
public boolean waiting = false;
|
boolean waiting = false;
|
||||||
public List<Integer> currentButtons = new ArrayList<>();
|
List<Integer> currentButtons = new ArrayList<>();
|
||||||
|
|
||||||
public ControllerControlsWidget(Position position, int width, int height) {
|
public ControllerControlsWidget(Position position, int width, int height) {
|
||||||
super(position, width, height);
|
super(position, width, height);
|
||||||
@@ -66,4 +67,24 @@ public class ControllerControlsWidget extends SpruceContainerWidget {
|
|||||||
MidnightControlsConfig.setButtonBinding(this.focusedBinding, buttons);
|
MidnightControlsConfig.setButtonBinding(this.focusedBinding, buttons);
|
||||||
this.focusedBinding = null;
|
this.focusedBinding = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setWaiting(boolean value) {
|
||||||
|
this.waiting = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isWaiting() {
|
||||||
|
return this.waiting;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Integer> getCurrentButtons() {
|
||||||
|
return currentButtons;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ButtonBinding getFocusedBinding() {
|
||||||
|
return focusedBinding;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user