aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2019-12-10 23:31:09 +0800
committershedaniel <daniel@shedaniel.me>2019-12-10 23:31:09 +0800
commit977350c12271246c2f220761fb33d58bab872357 (patch)
tree4de8f3bf4186d532fc9cb3ef130c1e63fff27bd3 /src/main/java
parent1b055888a74e68f5a287068428dc80196558fc98 (diff)
downloadRoughlyEnoughItems-977350c12271246c2f220761fb33d58bab872357.tar.gz
RoughlyEnoughItems-977350c12271246c2f220761fb33d58bab872357.tar.bz2
RoughlyEnoughItems-977350c12271246c2f220761fb33d58bab872357.zip
Semi working favorites
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java36
-rw-r--r--src/main/java/me/shedaniel/rei/api/ClientHelper.java2
-rw-r--r--src/main/java/me/shedaniel/rei/api/ConfigManager.java4
-rw-r--r--src/main/java/me/shedaniel/rei/api/ConfigObject.java10
-rw-r--r--src/main/java/me/shedaniel/rei/api/EntryStack.java52
-rw-r--r--src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java16
-rw-r--r--src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java178
-rw-r--r--src/main/java/me/shedaniel/rei/gui/widget/QueuedTooltip.java2
-rw-r--r--src/main/java/me/shedaniel/rei/impl/ClientHelperImpl.java8
-rw-r--r--src/main/java/me/shedaniel/rei/impl/ConfigManagerImpl.java65
-rw-r--r--src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java24
-rw-r--r--src/main/java/me/shedaniel/rei/impl/ScreenHelper.java2
-rw-r--r--src/main/java/me/shedaniel/rei/utils/ExecutorUtil.java13
13 files changed, 349 insertions, 63 deletions
diff --git a/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java b/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java
index 9ab33a147..2ca21b884 100644
--- a/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java
+++ b/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java
@@ -141,6 +141,24 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer {
return ClientSidePacketRegistry.INSTANCE.canServerReceive(RoughlyEnoughItemsNetwork.CREATE_ITEMS_PACKET) && ClientSidePacketRegistry.INSTANCE.canServerReceive(RoughlyEnoughItemsNetwork.DELETE_ITEMS_PACKET);
}
+ @Internal
+ @Deprecated
+ public static void syncRecipes(AtomicLong lastSync) {
+ if (lastSync != null) {
+ if (lastSync.get() > 0 && System.currentTimeMillis() - lastSync.get() <= 5000) {
+ RoughlyEnoughItemsCore.LOGGER.warn("[REI] Suppressing Sync Recipes!");
+ return;
+ }
+ lastSync.set(System.currentTimeMillis());
+ }
+ RecipeManager recipeManager = MinecraftClient.getInstance().getNetworkHandler().getRecipeManager();
+ if (ConfigManager.getInstance().getConfig().doesRegisterRecipesInAnotherThread()) {
+ CompletableFuture.runAsync(() -> ((RecipeHelperImpl) RecipeHelper.getInstance()).recipesLoaded(recipeManager), SYNC_RECIPES);
+ } else {
+ ((RecipeHelperImpl) RecipeHelper.getInstance()).recipesLoaded(recipeManager);
+ }
+ }
+
@SuppressWarnings("deprecation")
@Override
public void onInitializeClient() {
@@ -221,24 +239,6 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer {
}
}
- @Internal
- @Deprecated
- public static void syncRecipes(AtomicLong lastSync) {
- if (lastSync != null) {
- if (lastSync.get() > 0 && System.currentTimeMillis() - lastSync.get() <= 5000) {
- RoughlyEnoughItemsCore.LOGGER.warn("[REI] Suppressing Sync Recipes!");
- return;
- }
- lastSync.set(System.currentTimeMillis());
- }
- RecipeManager recipeManager = MinecraftClient.getInstance().getNetworkHandler().getRecipeManager();
- if (ConfigManager.getInstance().getConfig().doesRegisterRecipesInAnotherThread()) {
- CompletableFuture.runAsync(() -> ((RecipeHelperImpl) RecipeHelper.getInstance()).recipesLoaded(recipeManager), SYNC_RECIPES);
- } else {
- ((RecipeHelperImpl) RecipeHelper.getInstance()).recipesLoaded(recipeManager);
- }
- }
-
@SuppressWarnings("deprecation")
private void registerClothEvents() {
final Identifier recipeButtonTex = new Identifier("textures/gui/recipe_button.png");
diff --git a/src/main/java/me/shedaniel/rei/api/ClientHelper.java b/src/main/java/me/shedaniel/rei/api/ClientHelper.java
index 331ab73d9..0d35f2e45 100644
--- a/src/main/java/me/shedaniel/rei/api/ClientHelper.java
+++ b/src/main/java/me/shedaniel/rei/api/ClientHelper.java
@@ -132,6 +132,8 @@ public interface ClientHelper {
*/
String getModFromIdentifier(Identifier identifier);
+ FabricKeyBinding[] getREIKeyBindings();
+
/**
* @return the recipe keybind, defaulted R
*/
diff --git a/src/main/java/me/shedaniel/rei/api/ConfigManager.java b/src/main/java/me/shedaniel/rei/api/ConfigManager.java
index 277836859..75cb0ab1b 100644
--- a/src/main/java/me/shedaniel/rei/api/ConfigManager.java
+++ b/src/main/java/me/shedaniel/rei/api/ConfigManager.java
@@ -8,7 +8,7 @@ package me.shedaniel.rei.api;
import me.shedaniel.rei.RoughlyEnoughItemsCore;
import net.minecraft.client.gui.screen.Screen;
-import java.io.IOException;
+import java.util.List;
public interface ConfigManager {
@@ -17,6 +17,8 @@ public interface ConfigManager {
return RoughlyEnoughItemsCore.getConfigManager();
}
+ List<EntryStack> getFavorites();
+
/**
* Saves the config.
*/
diff --git a/src/main/java/me/shedaniel/rei/api/ConfigObject.java b/src/main/java/me/shedaniel/rei/api/ConfigObject.java
index f4c3539f6..1b9ad64db 100644
--- a/src/main/java/me/shedaniel/rei/api/ConfigObject.java
+++ b/src/main/java/me/shedaniel/rei/api/ConfigObject.java
@@ -9,6 +9,7 @@ import me.shedaniel.rei.gui.config.ItemCheatingMode;
import me.shedaniel.rei.gui.config.ItemListOrdering;
import me.shedaniel.rei.gui.config.RecipeScreenType;
import me.shedaniel.rei.gui.config.SearchFieldLocation;
+import net.minecraft.client.util.InputUtil;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
@@ -81,6 +82,15 @@ public interface ConfigObject {
boolean doesSnapToRows();
+ boolean isFavoritesEnabled();
+
+ InputUtil.KeyCode getFavoriteKeybind();
+
+ @Retention(RetentionPolicy.RUNTIME)
+ @Target({ElementType.FIELD})
+ public @interface AddInFrontKeyCode {
+ }
+
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface DontApplyFieldName {
diff --git a/src/main/java/me/shedaniel/rei/api/EntryStack.java b/src/main/java/me/shedaniel/rei/api/EntryStack.java
index 7d94fb27c..0fc06dfd4 100644
--- a/src/main/java/me/shedaniel/rei/api/EntryStack.java
+++ b/src/main/java/me/shedaniel/rei/api/EntryStack.java
@@ -5,6 +5,8 @@
package me.shedaniel.rei.api;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
import me.shedaniel.math.api.Rectangle;
import me.shedaniel.rei.gui.widget.QueuedTooltip;
import me.shedaniel.rei.impl.EmptyEntryStack;
@@ -15,7 +17,10 @@ import net.minecraft.fluid.Fluid;
import net.minecraft.item.Item;
import net.minecraft.item.ItemConvertible;
import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.CompoundTag;
+import net.minecraft.nbt.StringNbtReader;
import net.minecraft.util.Identifier;
+import net.minecraft.util.registry.Registry;
import javax.annotation.Nullable;
import java.util.Collections;
@@ -47,6 +52,53 @@ public interface EntryStack {
return new ItemEntryStack(new ItemStack(item));
}
+ static EntryStack readFromJson(JsonElement jsonElement) {
+ try {
+ JsonObject obj = jsonElement.getAsJsonObject();
+ switch (obj.get("type").getAsString()) {
+ case "stack":
+ return EntryStack.create(ItemStack.fromTag(StringNbtReader.parse(obj.get("nbt").getAsString())));
+ case "fluid":
+ return EntryStack.create(Registry.FLUID.get(Identifier.tryParse(obj.get("id").getAsString())));
+ case "empty":
+ return EntryStack.empty();
+ default:
+ throw new IllegalArgumentException("Invalid Entry Type!");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ return EntryStack.empty();
+ }
+ }
+
+ @Nullable
+ default JsonElement toJson() {
+ try {
+ switch (getType()) {
+ case ITEM:
+ JsonObject obj1 = new JsonObject();
+ obj1.addProperty("type", "stack");
+ obj1.addProperty("nbt", getItemStack().toTag(new CompoundTag()).toString());
+ return obj1;
+ case FLUID:
+ JsonObject obj2 = new JsonObject();
+ obj2.addProperty("type", "fluid");
+ obj2.addProperty("id", getIdentifier().get().toString());
+ return obj2;
+ case RENDER:
+ case EMPTY:
+ JsonObject obj3 = new JsonObject();
+ obj3.addProperty("type", "empty");
+ return obj3;
+ default:
+ throw new IllegalArgumentException("Invalid Entry Type!");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
Optional<Identifier> getIdentifier();
EntryStack.Type getType();
diff --git a/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java b/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java
index 904832392..260489abb 100644
--- a/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java
+++ b/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java
@@ -23,7 +23,6 @@ import net.minecraft.client.gui.Element;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.ingame.AbstractContainerScreen;
import net.minecraft.client.render.DiffuseLighting;
-import net.minecraft.client.render.DiffuseLighting;
import net.minecraft.client.render.Tessellator;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.resource.language.I18n;
@@ -89,12 +88,12 @@ public class ContainerScreenOverlay extends WidgetWithBounds {
return ENTRY_LIST_WIDGET;
}
- public void init() {
- init(false);
+ public void init(boolean useless) {
+ init();
}
@SuppressWarnings("deprecation")
- public void init(boolean setPage) {
+ public void init() {
this.shouldReInit = false;
//Update Variables
this.children().clear();
@@ -103,9 +102,10 @@ public class ContainerScreenOverlay extends WidgetWithBounds {
DisplayHelper.DisplayBoundsHandler boundsHandler = DisplayHelper.getInstance().getResponsibleBoundsHandler(MinecraftClient.getInstance().currentScreen.getClass());
this.rectangle = ConfigManager.getInstance().getConfig().isLeftHandSidePanel() ? boundsHandler.getLeftBounds(MinecraftClient.getInstance().currentScreen) : boundsHandler.getRightBounds(MinecraftClient.getInstance().currentScreen);
widgets.add(ENTRY_LIST_WIDGET);
- if (ScreenHelper.getSearchField() == null)
+ ENTRY_LIST_WIDGET.updateArea(boundsHandler, ScreenHelper.getSearchField() == null ? "" : null);
+ if (ScreenHelper.getSearchField() == null) {
ScreenHelper.setSearchField(new OverlaySearchField(0, 0, 0, 0));
- ENTRY_LIST_WIDGET.updateArea(boundsHandler, ScreenHelper.getSearchField().getText());
+ }
ScreenHelper.getSearchField().getBounds().setBounds(getTextFieldArea());
this.widgets.add(ScreenHelper.getSearchField());
ScreenHelper.getSearchField().setChangedListener(s -> {
@@ -414,11 +414,11 @@ public class ContainerScreenOverlay extends WidgetWithBounds {
public void render(int mouseX, int mouseY, float delta) {
List<ItemStack> currentStacks = ClientHelper.getInstance().getInventoryItemsTypes();
if (shouldReInit)
- init(true);
+ init();
else {
for (DisplayHelper.DisplayBoundsHandler<?> handler : DisplayHelper.getInstance().getSortedBoundsHandlers(minecraft.currentScreen.getClass())) {
if (handler != null && handler.shouldRecalculateArea(!ConfigManager.getInstance().getConfig().isLeftHandSidePanel(), rectangle)) {
- init(true);
+ init();
break;
}
}
diff --git a/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java
index c3d93bf7e..9804cabc5 100644
--- a/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java
+++ b/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java
@@ -14,6 +14,7 @@ import me.shedaniel.math.api.Rectangle;
import me.shedaniel.math.impl.PointHelper;
import me.shedaniel.rei.RoughlyEnoughItemsCore;
import me.shedaniel.rei.api.*;
+import me.shedaniel.rei.gui.ContainerScreenOverlay;
import me.shedaniel.rei.gui.config.ItemCheatingMode;
import me.shedaniel.rei.gui.config.ItemListOrdering;
import me.shedaniel.rei.impl.ScreenHelper;
@@ -24,6 +25,8 @@ import net.minecraft.client.render.BufferBuilder;
import net.minecraft.client.render.DiffuseLighting;
import net.minecraft.client.render.Tessellator;
import net.minecraft.client.render.VertexFormats;
+import net.minecraft.client.resource.language.I18n;
+import net.minecraft.client.util.InputUtil;
import net.minecraft.item.ItemGroup;
import net.minecraft.util.ActionResult;
import net.minecraft.util.Identifier;
@@ -31,10 +34,7 @@ import net.minecraft.util.math.MathHelper;
import org.apache.commons.lang3.StringUtils;
import javax.annotation.Nullable;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Locale;
+import java.util.*;
import java.util.function.Supplier;
import java.util.stream.Collectors;
@@ -60,13 +60,26 @@ public class EntryListWidget extends WidgetWithBounds {
protected int blockedCount;
private Rectangle bounds, innerBounds;
private List<EntryStack> allStacks = null;
+ private List<EntryStack> favorites = null;
private List<EntryListEntry> entries = Collections.emptyList();
@SuppressWarnings("deprecation")
private List<SearchArgument.SearchArguments> lastSearchArguments = Collections.emptyList();
private boolean draggingScrollBar = false;
+ protected final int getSlotsHeightNumberForFavorites() {
+ if (favorites.isEmpty()) return 0;
+ return MathHelper.ceil(2 + favorites.size() / (innerBounds.width / 18f));
+ }
+
+ protected final int getScrollNumberForFavorites() {
+ if (favorites.isEmpty()) return 0;
+ return (innerBounds.width / 18) * getSlotsHeightNumberForFavorites();
+ }
+
protected final int getMaxScrollPosition() {
- return MathHelper.ceil((allStacks.size() + blockedCount) / (innerBounds.width / 18f)) * 18;
+ if (favorites.isEmpty())
+ return MathHelper.ceil((allStacks.size() + blockedCount) / (innerBounds.width / 18f)) * 18;
+ return MathHelper.ceil((allStacks.size() + blockedCount + getScrollNumberForFavorites()) / (innerBounds.width / 18f)) * 18 - 12;
}
protected final int getMaxScroll() {
@@ -139,20 +152,48 @@ public class EntryListWidget extends WidgetWithBounds {
if (ConfigManager.getInstance().getConfig().isEntryListWidgetScrolled()) {
for (EntryListEntry entry : entries) entry.clearStacks();
ScissorsHandler.INSTANCE.scissor(bounds);
- int skip = Math.max(0, MathHelper.floor(scroll / 18f));
+ int sizeForFavorites = getSlotsHeightNumberForFavorites();
+ int skip = Math.max(0, MathHelper.floor(scroll / 18f) - sizeForFavorites);
int nextIndex = skip * innerBounds.width / 18;
int i = nextIndex;
blockedCount = 0;
+ if (sizeForFavorites > 0) {
+ drawString(font, I18n.translate("text.rei.favorites"), innerBounds.x + 2, (int) (innerBounds.y + 6 - scroll), -1);
+ nextIndex += innerBounds.width / 18;
+ for (int i1 = 0; i1 < favorites.size(); i1++) {
+ EntryStack stack = favorites.get(i1);
+ back1:
+ while (true) {
+ EntryListEntry entry = entries.get(nextIndex);
+ entry.getBounds().y = (int) (entry.backupY - scroll);
+ if (entry.getBounds().y > bounds.getMaxY())
+ break back1;
+ if (notSteppingOnExclusionZones(entry.getBounds().x, entry.getBounds().y, innerBounds)) {
+ entry.entry(stack);
+ entry.isFavorites = true;
+ entry.render(mouseX, mouseY, delta);
+ nextIndex++;
+ break;
+ } else {
+ blockedCount++;
+ nextIndex++;
+ }
+ }
+ }
+ nextIndex += innerBounds.width / -18 + getScrollNumberForFavorites() - favorites.size();
+ }
+ int offset = sizeForFavorites > 0 ? -12 : 0;
back:
for (; i < allStacks.size(); i++) {
EntryStack stack = allStacks.get(i);
while (true) {
EntryListEntry entry = entries.get(nextIndex);
- entry.getBounds().y = (int) (entry.backupY - scroll);
+ entry.getBounds().y = (int) (entry.backupY - scroll + offset);
if (entry.getBounds().y > bounds.getMaxY())
break back;
if (notSteppingOnExclusionZones(entry.getBounds().x, entry.getBounds().y, innerBounds)) {
entry.entry(stack);
+ entry.isFavorites = false;
entry.render(mouseX, mouseY, delta);
nextIndex++;
break;
@@ -166,7 +207,8 @@ public class EntryListWidget extends WidgetWithBounds {
ScissorsHandler.INSTANCE.removeLastScissor();
renderScrollbar();
} else {
- for (Widget widget : entries) {
+ for (EntryListEntry widget : entries) {
+ widget.isFavorites = false;
widget.render(mouseX, mouseY, delta);
}
}
@@ -272,7 +314,7 @@ public class EntryListWidget extends WidgetWithBounds {
this.bounds = boundsHandler.getItemListArea(ScreenHelper.getLastOverlay().getBounds());
if (searchTerm != null)
updateSearch(searchTerm);
- else if (allStacks == null)
+ else if (allStacks == null || favorites == null)
updateSearch("");
else updateEntriesPosition();
}
@@ -302,7 +344,8 @@ public class EntryListWidget extends WidgetWithBounds {
page = 0;
int width = innerBounds.width / 18;
int pageHeight = innerBounds.height / 18;
- int slotsToPrepare = allStacks.size();
+ int sizeForFavorites = getScrollNumberForFavorites();
+ int slotsToPrepare = allStacks.size() + sizeForFavorites;
int currentX = 0;
int currentY = 0;
List<EntryListEntry> entries = Lists.newLinkedList();
@@ -350,22 +393,42 @@ public class EntryListWidget extends WidgetWithBounds {
@SuppressWarnings("deprecation")
public void updateSearch(String searchTerm) {
lastSearchArguments = processSearchTerm(searchTerm);
- List<EntryStack> list = Lists.newLinkedList();
- boolean checkCraftable = ConfigManager.getInstance().isCraftableOnlyEnabled() && !ScreenHelper.inventoryStacks.isEmpty();
- List<EntryStack> workingItems = checkCraftable ? RecipeHelper.getInstance().findCraftableEntriesByItems(CollectionUtils.map(ScreenHelper.inventoryStacks, EntryStack::create)) : null;
- for (EntryStack stack : EntryRegistry.getInstance().getStacksList()) {
- if (lastSearchArguments.isEmpty() || canSearchTermsBeAppliedTo(stack, lastSearchArguments)) {
- if (workingItems != null && CollectionUtils.findFirstOrNullEquals(workingItems, stack) == null)
- continue;
- list.add(stack.copy().setting(EntryStack.Settings.RENDER_COUNTS, EntryStack.Settings.FALSE)
- .setting(EntryStack.Settings.Item.RENDER_OVERLAY, RENDER_EXTRA_CONFIG));
+ {
+ List<EntryStack> list = Lists.newLinkedList();
+ boolean checkCraftable = ConfigManager.getInstance().isCraftableOnlyEnabled() && !ScreenHelper.inventoryStacks.isEmpty();
+ List<EntryStack> workingItems = checkCraftable ? RecipeHelper.getInstance().findCraftableEntriesByItems(CollectionUtils.map(ScreenHelper.inventoryStacks, EntryStack::create)) : null;
+ for (EntryStack stack : EntryRegistry.getInstance().getStacksList()) {
+ if (lastSearchArguments.isEmpty() || canSearchTermsBeAppliedTo(stack, lastSearchArguments)) {
+ if (workingItems != null && CollectionUtils.findFirstOrNullEquals(workingItems, stack) == null)
+ continue;
+ list.add(stack.copy().setting(EntryStack.Settings.RENDER_COUNTS, EntryStack.Settings.FALSE)
+ .setting(EntryStack.Settings.Item.RENDER_OVERLAY, RENDER_EXTRA_CONFIG));
+ }
}
+ ItemListOrdering ordering = ConfigManager.getInstance().getConfig().getItemListOrdering();
+ if (ordering == ItemListOrdering.name) list.sort(ENTRY_NAME_COMPARER);
+ if (ordering == ItemListOrdering.item_groups) list.sort(ENTRY_GROUP_COMPARER);
+ if (!ConfigManager.getInstance().getConfig().isItemListAscending()) Collections.reverse(list);
+ allStacks = list;
}
- ItemListOrdering ordering = ConfigManager.getInstance().getConfig().getItemListOrdering();
- if (ordering == ItemListOrdering.name) list.sort(ENTRY_NAME_COMPARER);
- if (ordering == ItemListOrdering.item_groups) list.sort(ENTRY_GROUP_COMPARER);
- if (!ConfigManager.getInstance().getConfig().isItemListAscending()) Collections.reverse(list);
- allStacks = list;
+ if (ConfigManager.getInstance().getConfig().isFavoritesEnabled()) {
+ List<EntryStack> list = Lists.newLinkedList();
+ boolean checkCraftable = ConfigManager.getInstance().isCraftableOnlyEnabled() && !ScreenHelper.inventoryStacks.isEmpty();
+ List<EntryStack> workingItems = checkCraftable ? RecipeHelper.getInstance().findCraftableEntriesByItems(CollectionUtils.map(ScreenHelper.inventoryStacks, EntryStack::create)) : null;
+ for (EntryStack stack : ConfigManager.getInstance().getFavorites()) {
+ if (lastSearchArguments.isEmpty() || canSearchTermsBeAppliedTo(stack, lastSearchArguments)) {
+ if (workingItems != null && CollectionUtils.findFirstOrNullEquals(workingItems, stack) == null)
+ continue;
+ list.add(stack.copy().setting(EntryStack.Settings.RENDER_COUNTS, EntryStack.Settings.FALSE)
+ .setting(EntryStack.Settings.Item.RENDER_OVERLAY, RENDER_EXTRA_CONFIG));
+ }
+ }
+ ItemListOrdering ordering = ConfigManager.getInstance().getConfig().getItemListOrdering();
+ if (ordering == ItemListOrdering.name) list.sort(ENTRY_NAME_COMPARER);
+ if (ordering == ItemListOrdering.item_groups) list.sort(ENTRY_GROUP_COMPARER);
+ if (!ConfigManager.getInstance().getConfig().isItemListAscending()) Collections.reverse(list);
+ favorites = list;
+ } else favorites = Collections.emptyList();
updateEntriesPosition();
}
@@ -475,6 +538,7 @@ public class EntryListWidget extends WidgetWithBounds {
private class EntryListEntry extends EntryWidget {
private int backupY;
+ private boolean isFavorites;
private EntryListEntry(int x, int y) {
super(x, y);
@@ -491,10 +555,72 @@ public class EntryListWidget extends WidgetWithBounds {
if (getCurrentEntry().getType() != EntryStack.Type.EMPTY) super.drawHighlighted(mouseX, mouseY, delta);
}
+ private String getLocalizedName(InputUtil.KeyCode value) {
+ String string_1 = value.getName();
+ int int_1 = value.getKeyCode();
+ String string_2 = null;
+ switch (value.getCategory()) {
+ case KEYSYM:
+ string_2 = InputUtil.getKeycodeName(int_1);
+ break;
+ case SCANCODE:
+ string_2 = InputUtil.getScancodeName(int_1);
+ break;
+ case MOUSE:
+ String string_3 = I18n.translate(string_1, new Object[0]);
+ string_2 = Objects.equals(string_3, string_1) ? I18n.translate(InputUtil.Type.MOUSE.getName(), new Object[]{int_1 + 1}) : string_3;
+ }
+
+ return string_2 == null ? I18n.translate(string_1, new Object[0]) : string_2;
+ }
+
@Override
protected void queueTooltip(int mouseX, int mouseY, float delta) {
- if (!ClientHelper.getInstance().isCheating() || minecraft.player.inventory.getCursorStack().isEmpty())
- super.queueTooltip(mouseX, mouseY, delta);
+ if (!ClientHelper.getInstance().isCheating() || minecraft.player.inventory.getCursorStack().isEmpty()) {
+ QueuedTooltip tooltip = getCurrentTooltip(mouseX, mouseY);
+ if (tooltip != null) {
+ // TODO Finalize favorites
+// if (ConfigManager.getInstance().getConfig().isFavoritesEnabled()) {
+// String name = getLocalizedName(ConfigManager.getInstance().getConfig().getFavoriteKeybind());
+// if (!isFavorites)
+// tooltip.getText().addAll(Arrays.asList(I18n.translate("text.rei.favorites_tooltip", name).split("\n")));
+// else
+// tooltip.getText().addAll(Arrays.asList(I18n.translate("text.rei.remove_favorites_tooltip", name).split("\n")));
+// }
+ ScreenHelper.getLastOverlay().addTooltip(tooltip);
+ }
+ }
+ }
+
+ @Override
+ public boolean keyPressed(int int_1, int int_2, int int_3) {
+ if (!interactable)
+ return false;
+ if (containsMouse(PointHelper.fromMouse()) && !getCurrentEntry().isEmpty()) {
+ InputUtil.KeyCode keyCode = ConfigManager.getInstance().getConfig().getFavoriteKeybind();
+ if (int_1 == InputUtil.UNKNOWN_KEYCODE.getKeyCode()) {
+ if (keyCode.getCategory() == InputUtil.Type.SCANCODE && keyCode.getKeyCode() == int_2) {
+ if (!isFavorites) {
+ ConfigManager.getInstance().getFavorites().add(getCurrentEntry().copy());
+ ContainerScreenOverlay.getEntryListWidget().updateSearch(ScreenHelper.getSearchField().getText());
+ } else {
+ ConfigManager.getInstance().getFavorites().remove(getCurrentEntry());
+ ContainerScreenOverlay.getEntryListWidget().updateSearch(ScreenHelper.getSearchField().getText());
+ }
+ return true;
+ }
+ } else if (keyCode.getCategory() == InputUtil.Type.KEYSYM && keyCode.getKeyCode() == int_1) {
+ if (!isFavorites) {
+ ConfigManager.getInstance().getFavorites().add(getCurrentEntry().copy());
+ ContainerScreenOverlay.getEntryListWidget().updateSearch(ScreenHelper.getSearchField().getText());
+ } else {
+ ConfigManager.getInstance().getFavorites().remove(getCurrentEntry());
+ ContainerScreenOverlay.getEntryListWidget().updateSearch(ScreenHelper.getSearchField().getText());
+ }
+ return true;
+ }
+ }
+ return super.keyPressed(int_1, int_2, int_3);
}
@Override
diff --git a/src/main/java/me/shedaniel/rei/gui/widget/QueuedTooltip.java b/src/main/java/me/shedaniel/rei/gui/widget/QueuedTooltip.java
index 5b61a4e66..2a0b1bde4 100644
--- a/src/main/java/me/shedaniel/rei/gui/widget/QueuedTooltip.java
+++ b/src/main/java/me/shedaniel/rei/gui/widget/QueuedTooltip.java
@@ -22,7 +22,7 @@ public class QueuedTooltip {
private QueuedTooltip(Point location, List<String> text) {
this.location = location;
- this.text = Collections.unmodifiableList(text);
+ this.text = Lists.newArrayList(text);
}
public static QueuedTooltip create(Point location, List<String> text) {
diff --git a/src/main/java/me/shedaniel/rei/impl/ClientHelperImpl.java b/src/main/java/me/shedaniel/rei/impl/ClientHelperImpl.java
index a4f6cfe16..7ebcdea23 100644
--- a/src/main/java/me/shedaniel/rei/impl/ClientHelperImpl.java
+++ b/src/main/java/me/shedaniel/rei/impl/ClientHelperImpl.java
@@ -54,6 +54,7 @@ public class ClientHelperImpl implements ClientHelper, ClientModInitializer {
private final Identifier nextPageKeybind = new Identifier("roughlyenoughitems", "next_page");
private final Identifier focusSearchFieldKeybind = new Identifier("roughlyenoughitems", "focus_search");
private final Identifier copyRecipeIdentifierKeybind = new Identifier("roughlyenoughitems", "copy_recipe_id");
+ private final Identifier favoriteEntryKeybind = new Identifier("roughlyenoughitems", "favorite_entry");
private final Map<String, String> modNameCache = Maps.newHashMap();
public FabricKeyBinding recipe, usage, hide, previousPage, nextPage, focusSearchField, copyRecipeIdentifier;
@@ -74,6 +75,13 @@ public class ClientHelperImpl implements ClientHelper, ClientModInitializer {
}
@Override
+ public FabricKeyBinding[] getREIKeyBindings() {
+ return new FabricKeyBinding[]{
+ recipe, usage, hide, previousPage, nextPage, focusSearchField, copyRecipeIdentifier
+ };
+ }
+
+ @Override
public FabricKeyBinding getRecipeKeyBinding() {
return recipe;
}
diff --git a/src/main/java/me/shedaniel/rei/impl/ConfigManagerImpl.java b/src/main/java/me/shedaniel/rei/impl/ConfigManagerImpl.java
index 9271785e0..a5f06e8d2 100644
--- a/src/main/java/me/shedaniel/rei/impl/ConfigManagerImpl.java
+++ b/src/main/java/me/shedaniel/rei/impl/ConfigManagerImpl.java
@@ -5,26 +5,35 @@
package me.shedaniel.rei.impl;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonElement;
import me.sargunvohra.mcmods.autoconfig1u.AutoConfig;
import me.sargunvohra.mcmods.autoconfig1u.gui.ConfigScreenProvider;
import me.sargunvohra.mcmods.autoconfig1u.gui.registry.GuiRegistry;
import me.sargunvohra.mcmods.autoconfig1u.serializer.JanksonConfigSerializer;
+import me.sargunvohra.mcmods.autoconfig1u.shadowed.blue.endless.jankson.Jankson;
+import me.sargunvohra.mcmods.autoconfig1u.shadowed.blue.endless.jankson.JsonPrimitive;
import me.shedaniel.cloth.hooks.ScreenHooks;
+import me.shedaniel.clothconfig2.api.AbstractConfigListEntry;
import me.shedaniel.clothconfig2.api.ConfigEntryBuilder;
+import me.shedaniel.clothconfig2.gui.entries.KeyCodeEntry;
import me.shedaniel.rei.RoughlyEnoughItemsCore;
-import me.shedaniel.rei.api.ConfigManager;
-import me.shedaniel.rei.api.ConfigObject;
-import me.shedaniel.rei.api.RecipeHelper;
+import me.shedaniel.rei.api.*;
import me.shedaniel.rei.api.annotations.Internal;
import me.shedaniel.rei.gui.ConfigReloadingScreen;
+import me.shedaniel.rei.gui.ContainerScreenOverlay;
import me.shedaniel.rei.gui.credits.CreditsScreen;
import me.shedaniel.rei.gui.widget.ReloadConfigButtonWidget;
+import net.fabricmc.fabric.api.client.keybinding.FabricKeyBinding;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.widget.AbstractPressableButtonWidget;
import net.minecraft.client.resource.language.I18n;
+import net.minecraft.client.util.InputUtil;
import net.minecraft.text.LiteralText;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -36,10 +45,18 @@ import static me.sargunvohra.mcmods.autoconfig1u.util.Utils.setUnsafely;
public class ConfigManagerImpl implements ConfigManager {
private boolean craftableOnly;
+ private List<EntryStack> favorites = new ArrayList<>();
public ConfigManagerImpl() {
this.craftableOnly = false;
- AutoConfig.register(ConfigObjectImpl.class, JanksonConfigSerializer::new);
+ AutoConfig.register(ConfigObjectImpl.class, (definition, configClass) -> {
+ return new JanksonConfigSerializer<ConfigObjectImpl>(definition, configClass, Jankson.builder()
+ .registerPrimitiveTypeAdapter(InputUtil.KeyCode.class, it -> {
+ return it instanceof String ? InputUtil.fromName((String) it) : null;
+ })
+ .registerSerializer(InputUtil.KeyCode.class, (it, marshaller) -> new JsonPrimitive(it.getName()))
+ .build());
+ });
GuiRegistry guiRegistry = AutoConfig.getGuiRegistry(ConfigObjectImpl.class);
//noinspection rawtypes
guiRegistry.r