Skip to content

Commit

Permalink
Added support for Controlling, in the Pick Key Screen
Browse files Browse the repository at this point in the history
  • Loading branch information
GirafiStudios committed Dec 7, 2023
1 parent 775205c commit 07d60c7
Show file tree
Hide file tree
Showing 8 changed files with 163 additions and 23 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package dmillerw.menu.gui.controlling;

import com.blamejared.controlling.mixin.AccessKeyMapping;
import net.minecraft.client.KeyMapping;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.controls.KeyBindsList;

import java.util.function.Predicate;

/**
* Copy of Controlling by Jaredlll08's ControllingDisplayMode, but with a different KeyEntry
* Temporary workaround, until an interface for the CategoryEntry and KeyEntry in Controlling can be implemented in 1.20.3
*/
@Deprecated
public enum ControllingDisplayMode {
ALL(keyEntry -> true), NONE(keyEntry -> keyEntry.getKey().isUnbound()), CONFLICTING(keyEntry -> {

for(KeyMapping key : Minecraft.getInstance().options.keyMappings) {
if(!key.getName().equals(keyEntry.getKey().getName()) && !key.isUnbound()) {
if(((AccessKeyMapping) key).controlling$getKey()
.getValue() == ((AccessKeyMapping) keyEntry.getKey()).controlling$getKey().getValue()) {
return true;
}
}
}
System.out.println("Hi");
return false;
});


private final Predicate<ControllingGuiControlList.KeyEntry> predicate;

ControllingDisplayMode(Predicate<ControllingGuiControlList.KeyEntry> predicate) {
this.predicate = predicate;
}

public Predicate<KeyBindsList.Entry> getPredicate() {
return entry -> entry instanceof ControllingGuiControlList.KeyEntry keyEntry && predicate.test(keyEntry);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package dmillerw.menu.gui.menu.list;
package dmillerw.menu.gui.controlling;

import com.blamejared.controlling.platform.Services;
import com.google.common.collect.ImmutableList;
Expand Down Expand Up @@ -59,7 +59,6 @@ public ControllingGuiControlList(Screen parent, Minecraft mc) {
addEntry(new ControllingGuiControlList.KeyEntry(keybinding, component));
}
}

}

public List<KeyBindsList.Entry> getAllEntries() {
Expand Down Expand Up @@ -127,16 +126,14 @@ public List<? extends GuiEventListener> children() {
@Override
protected void refreshEntry() {
}

public Component getName() {
return name;
}
}

public class KeyEntry extends KeyBindsList.Entry {
/**
* The keybinding specified for this KeyEntry
*/
private final KeyMapping key;
/**
* The localized key description for this KeyEntry
*/
private final Component keyDesc;
private boolean hasCollision;
private final Component categoryName;
Expand Down Expand Up @@ -225,5 +222,17 @@ protected void refreshEntry() {
tooltip.append(Component.translatable("controls.keybinds.duplicateKeybinds", duplicates));
}
}

public KeyMapping getKey() {
return key;
}

public Component getCategoryName() {
return categoryName;
}

public Component getKeyDesc() {
return keyDesc;
}
}
}
14 changes: 14 additions & 0 deletions src/main/java/dmillerw/menu/gui/controlling/ControllingISort.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package dmillerw.menu.gui.controlling;

import net.minecraft.client.gui.screens.controls.KeyBindsList;

import java.util.List;

/**
* Copy of Controlling by Jaredlll08's ISort, but with a different KeyEntry
* Temporary workaround, until an interface for the CategoryEntry and KeyEntry in Controlling can be implemented in 1.20.3
*/
@Deprecated
public interface ControllingISort {
void sort(List<KeyBindsList.Entry> entries);
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
package dmillerw.menu.gui.menu;
package dmillerw.menu.gui.controlling;

import com.blamejared.controlling.ControllingConstants;
import com.blamejared.controlling.api.DisplayMode;
import com.blamejared.controlling.api.SortOrder;
import com.blamejared.searchables.api.SearchableComponent;
import com.blamejared.searchables.api.SearchableType;
import com.blamejared.searchables.api.autcomplete.AutoCompletingEditBox;
import com.mojang.blaze3d.platform.InputConstants;
import dmillerw.menu.gui.ScreenStack;
import dmillerw.menu.gui.menu.list.ControllingGuiControlList;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.components.Button;
Expand All @@ -19,18 +18,45 @@
import javax.annotation.Nonnull;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.function.ToIntFunction;

/**
* Mostly a copy of Controlling by Jaredlll08's PickKeyScreen. Most of this will not be needed in the future, when interface can be implemented
* Temporary workaround, until an interface for the CategoryEntry and KeyEntry in Controlling can be implemented in 1.20.3
*/
public class ControllingPickKeyScreen extends Screen {
private ControllingGuiControlList controlList;
private AutoCompletingEditBox<KeyBindsList.Entry> search;
private DisplayMode displayMode;
private SortOrder sortOrder = SortOrder.NONE;
private ControllingDisplayMode displayMode;
private ControllingSortOrder sortOrder = ControllingSortOrder.NONE;
private Button buttonNone;
private Button buttonSort;
public static final SearchableType<KeyBindsList.Entry> SEARCHABLE_KEYBINDINGS = new SearchableType.Builder<KeyBindsList.Entry>()
.component(SearchableComponent.create("category", entry -> {
if(entry instanceof ControllingGuiControlList.CategoryEntry cat) {
return Optional.of(cat.getName().getString());
} else if(entry instanceof ControllingGuiControlList.KeyEntry key) {
return Optional.of(key.getCategoryName().getString());
}
return Optional.empty();
}))
.component(SearchableComponent.create("key", entry -> {
if(entry instanceof ControllingGuiControlList.KeyEntry key) {
return Optional.of(key.getKey().getTranslatedKeyMessage().getString());
}
return Optional.empty();
}))
.defaultComponent(SearchableComponent.create("name", entry -> {
if(entry instanceof ControllingGuiControlList.KeyEntry key) {
return Optional.of(key.getKeyDesc().getString());
}
return Optional.empty();
}))
.build();

public ControllingPickKeyScreen() {
super(Component.translatable("mine_menu.keyScreen.title"));
Expand All @@ -52,7 +78,7 @@ protected void init() {
int topRowY = bottomY - rowSpacing;

Supplier<List<KeyBindsList.Entry>> listSupplier = () -> this.controlList.getAllEntries();
this.search = addRenderableWidget(new AutoCompletingEditBox<>(font, centerX - searchX / 2, 22, searchX, Button.DEFAULT_HEIGHT, search, Component.translatable("selectWorld.search"), ControllingConstants.SEARCHABLE_KEYBINDINGS, listSupplier));
this.search = addRenderableWidget(new AutoCompletingEditBox<>(font, centerX - searchX / 2, 22, searchX, Button.DEFAULT_HEIGHT, search, Component.translatable("selectWorld.search"), SEARCHABLE_KEYBINDINGS, listSupplier));
this.search.addResponder(this::filterKeys);
this.addRenderableOnly(this.search.autoComplete());

Expand All @@ -66,7 +92,7 @@ protected void init() {
.bounds(rightX, topRowY, btnWidth, Button.DEFAULT_HEIGHT)
.build());

displayMode = DisplayMode.ALL;
displayMode = ControllingDisplayMode.ALL;
setInitialFocus(this.search);
// Trigger an initial auto complete
this.search.moveCursor(0);
Expand All @@ -89,7 +115,7 @@ public void filterKeys() {
public void filterKeys(String lastSearch) {
this.controlList.children().clear();
this.controlList.setScrollAmount(0);
if(lastSearch.isEmpty() && displayMode == DisplayMode.ALL && sortOrder == SortOrder.NONE) {
if(lastSearch.isEmpty() && displayMode == ControllingDisplayMode.ALL && sortOrder == ControllingSortOrder.NONE) {
this.controlList.children().addAll(this.controlList.getAllEntries());
return;
}
Expand All @@ -102,8 +128,8 @@ public void filterKeys(String lastSearch) {
extraPredicate = displayMode.getPredicate();
postConsumer = entries -> sortOrder.sort(entries);
}
list.children()
.addAll(ControllingConstants.SEARCHABLE_KEYBINDINGS.filterEntries(list.getAllEntries(), lastSearch, extraPredicate));

list.children().addAll(SEARCHABLE_KEYBINDINGS.filterEntries(list.getAllEntries(), lastSearch, extraPredicate));
postConsumer.accept(list.children());
}

Expand Down Expand Up @@ -163,11 +189,11 @@ public void render(@Nonnull GuiGraphics guiGraphics, int mouseX, int mouseY, flo
}

private final Button.OnPress PRESS_NONE = btn -> {
if(displayMode == DisplayMode.NONE) {
if(displayMode == ControllingDisplayMode.NONE) {
buttonNone.setMessage(ControllingConstants.COMPONENT_OPTIONS_SHOW_NONE);
displayMode = DisplayMode.ALL;
displayMode = ControllingDisplayMode.ALL;
} else {
displayMode = DisplayMode.NONE;
displayMode = ControllingDisplayMode.NONE;
buttonNone.setMessage(ControllingConstants.COMPONENT_OPTIONS_SHOW_ALL);
}
filterKeys();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package dmillerw.menu.gui.controlling;

import com.blamejared.controlling.ControllingConstants;
import net.minecraft.client.gui.screens.controls.KeyBindsList;
import net.minecraft.network.chat.Component;

import java.util.Comparator;
import java.util.List;

/**
* Copy of Controlling by Jaredlll08's SortOrder, but with a different KeyEntry
* Temporary workaround, until an interface for the CategoryEntry and KeyEntry in Controlling can be implemented in 1.20.3
*/
@Deprecated
public enum ControllingSortOrder {
NONE("options.sortNone", entries -> {}),
AZ("options.sortAZ", entries -> entries.sort(Comparator.comparing(o -> ((ControllingGuiControlList.KeyEntry) o).getKeyDesc().getString()))),
ZA("options.sortZA", entries -> entries.sort(Comparator.comparing(o -> ((ControllingGuiControlList.KeyEntry) o).getKeyDesc().getString()).reversed()));

private final ControllingISort sorter;
private final Component display;

ControllingSortOrder(String key, ControllingISort sorter) {
this.sorter = sorter;
this.display = ControllingConstants.COMPONENT_OPTIONS_SORT.copy().append(": ").append(Component.translatable(key));
}

public ControllingSortOrder cycle() {
return ControllingSortOrder.values()[(this.ordinal() + 1) % ControllingSortOrder.values().length];
}

public void sort(List<KeyBindsList.Entry> list) {
list.removeIf(entry -> !(entry instanceof ControllingGuiControlList.KeyEntry));
this.sorter.sort(list);
}

public Component getDisplay() {
return this.display;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import dmillerw.menu.data.click.*;
import dmillerw.menu.data.session.EditSessionData;
import dmillerw.menu.gui.ScreenStack;
import dmillerw.menu.gui.controlling.ControllingPickKeyScreen;
import dmillerw.menu.gui.menu.button.ItemButton;
import dmillerw.menu.helper.GuiRenderHelper;
import net.minecraft.client.KeyMapping;
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/dmillerw/menu/gui/menu/list/GuiControlList.java
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,10 @@ protected void refreshEntry() {
}
}
}
}

public KeyMapping getKey() {
return this.key;
}
}
}
9 changes: 8 additions & 1 deletion src/main/resources/META-INF/mods.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,11 @@ license="MIT"
mandatory=true
versionRange="${forge_version_range}"
ordering="NONE"
side="BOTH"
side="BOTH"

[[dependencies.minemenu]]
modId="controlling"
mandatory=false
versionRange="[12.0.0,13.0.0)"
ordering="NONE"
side="BOTH"

0 comments on commit 07d60c7

Please sign in to comment.