Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions xplat/src/main/java/dev/emi/emi/EmiRenderHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,13 @@ public static void renderAmount(EmiDrawContext context, int x, int y, Text amoun
context.pop();
}

public static void renderText(EmiDrawContext context, int x, int y, Text text) {
context.push();
context.matrices().translate(0, 0, 200);
context.drawTextWithShadow(text, x + 1, y + 5, -1);
context.pop();
}

public static void renderIngredient(EmiIngredient ingredient, EmiDrawContext context, int x, int y) {
RenderSystem.enableDepthTest();
context.push();
Expand Down
17 changes: 3 additions & 14 deletions xplat/src/main/java/dev/emi/emi/VanillaPlugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,14 +41,7 @@
import dev.emi.emi.api.recipe.EmiWorldInteractionRecipe;
import dev.emi.emi.api.render.EmiRenderable;
import dev.emi.emi.api.render.EmiTexture;
import dev.emi.emi.api.stack.Comparison;
import dev.emi.emi.api.stack.EmiIngredient;
import dev.emi.emi.api.stack.EmiRegistryAdapter;
import dev.emi.emi.api.stack.EmiStack;
import dev.emi.emi.api.stack.FluidEmiStack;
import dev.emi.emi.api.stack.ItemEmiStack;
import dev.emi.emi.api.stack.ListEmiIngredient;
import dev.emi.emi.api.stack.TagEmiIngredient;
import dev.emi.emi.api.stack.*;
import dev.emi.emi.api.widget.Bounds;
import dev.emi.emi.api.widget.GeneratedSlotWidget;
import dev.emi.emi.config.EffectLocation;
Expand Down Expand Up @@ -95,10 +88,7 @@
import dev.emi.emi.runtime.EmiDrawContext;
import dev.emi.emi.runtime.EmiLog;
import dev.emi.emi.runtime.EmiReloadLog;
import dev.emi.emi.stack.serializer.FluidEmiStackSerializer;
import dev.emi.emi.stack.serializer.ItemEmiStackSerializer;
import dev.emi.emi.stack.serializer.ListEmiIngredientSerializer;
import dev.emi.emi.stack.serializer.TagEmiIngredientSerializer;
import dev.emi.emi.stack.serializer.*;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
Expand All @@ -111,13 +101,11 @@
import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen;
import net.minecraft.component.DataComponentTypes;
import net.minecraft.component.type.DyedColorComponent;
import net.minecraft.component.type.PotionContentsComponent;
import net.minecraft.enchantment.Enchantment;
import net.minecraft.entity.effect.StatusEffectInstance;
import net.minecraft.fluid.FlowableFluid;
import net.minecraft.fluid.Fluid;
import net.minecraft.fluid.Fluids;
import net.minecraft.inventory.Inventory;
import net.minecraft.item.ArmorItem;
import net.minecraft.item.BlockItem;
import net.minecraft.item.DyeItem;
Expand Down Expand Up @@ -217,6 +205,7 @@ public void initialize(EmiInitRegistry registry) {
registry.addIngredientSerializer(FluidEmiStack.class, new FluidEmiStackSerializer());
registry.addIngredientSerializer(TagEmiIngredient.class, new TagEmiIngredientSerializer());
registry.addIngredientSerializer(ListEmiIngredient.class, new ListEmiIngredientSerializer());
registry.addIngredientSerializer(SearchEmiIngredient.class, new SearchEmiIngredientSerializer());

registry.addRegistryAdapter(EmiRegistryAdapter.simple(Item.class, EmiPort.getItemRegistry(), EmiStack::of));
registry.addRegistryAdapter(EmiRegistryAdapter.simple(Fluid.class, EmiPort.getFluidRegistry(), EmiStack::of));
Expand Down
4 changes: 4 additions & 0 deletions xplat/src/main/java/dev/emi/emi/api/stack/EmiIngredient.java
Original file line number Diff line number Diff line change
Expand Up @@ -140,4 +140,8 @@ public static EmiIngredient of(List<? extends EmiIngredient> list, long amount)
return EmiTags.getIngredient(tagType, list.stream().flatMap(i -> i.getEmiStacks().stream()).toList(), amount);
}
}

public static EmiIngredient of(String text, List<? extends EmiIngredient> results) {
return new SearchEmiIngredient(text, results);
}
}
106 changes: 106 additions & 0 deletions xplat/src/main/java/dev/emi/emi/api/stack/SearchEmiIngredient.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
package dev.emi.emi.api.stack;

import com.google.common.collect.Lists;
import dev.emi.emi.EmiPort;
import dev.emi.emi.api.render.EmiRender;
import dev.emi.emi.screen.tooltip.EmiTextTooltipWrapper;
import dev.emi.emi.screen.tooltip.IngredientTooltipComponent;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.tooltip.TooltipComponent;
import org.jetbrains.annotations.ApiStatus;

import java.util.List;

@ApiStatus.Internal
public class SearchEmiIngredient implements EmiIngredient {
private final List<? extends EmiIngredient> results;
private final List<EmiStack> fullResults;

public final String content;

public SearchEmiIngredient(String content, List<? extends EmiIngredient> results) {
this.results = results;
this.fullResults = results.stream().flatMap(i -> i.getEmiStacks().stream()).toList();
if (fullResults.isEmpty()) {
throw new IllegalArgumentException("SearchEmiIngredient cannot be and empty search");
}

this.content = content;
}

@Override
public void render(DrawContext draw, int x, int y, float delta, int flags) {
int item = (int) (System.currentTimeMillis() / 1000 % results.size());
EmiIngredient current = results.get(item);
if ((flags & RENDER_ICON) != 0) {
current.render(draw, x, y, delta, -1 ^ RENDER_AMOUNT);
}
if ((flags & RENDER_INGREDIENT) != 0) {
EmiRender.renderIngredientIcon(this, draw, x, y);
}

// // Maybe render a couple of letters of the search above the icon
// EmiDrawContext context = EmiDrawContext.wrap(draw);
// EmiRenderHelper.renderText(context, x, y, EmiPort.literal(content.substring(0, 3)));
}

@Override
public boolean equals(Object obj) {
return obj instanceof SearchEmiIngredient ingredient && ingredient.content.equals(this.content);
}

@Override
public EmiIngredient copy() {
return new SearchEmiIngredient(content, results);
}

@Override
public long getAmount() {
return 1;
}

@Override
public EmiIngredient setAmount(long amount) {
return null;
}

@Override
public float getChance() {
return 1;
}

@Override
public EmiIngredient setChance(float chance) {
return null;
}

@Override
public List<EmiStack> getEmiStacks() {
return EmiStack.EMPTY.getEmiStacks();
}

@Override
public boolean isEmpty() {
return false;
}

@Override
public List<TooltipComponent> getTooltip() {
List<TooltipComponent> tooltip = Lists.newArrayList();
tooltip.add(new EmiTextTooltipWrapper(this, EmiPort.ordered(EmiPort.literal(content))));
tooltip.add(new IngredientTooltipComponent(results));
int item = (int) (System.currentTimeMillis() / 1000 % results.size());
tooltip.addAll(results.get(item).copy().setAmount(1).getTooltip());
return tooltip;
}

@ApiStatus.Internal
public String getContent() {
return content;
}

@ApiStatus.Internal
public List<? extends EmiIngredient> getResults() {
return results;
}
}
4 changes: 4 additions & 0 deletions xplat/src/main/java/dev/emi/emi/config/EmiConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -362,6 +362,10 @@ public class EmiConfig {
@ConfigValue("binds.clear-search")
public static EmiBind clearSearch = new EmiBind("key.emi.clear_search", InputUtil.UNKNOWN_KEY.getCode());

@Comment("Add current search as a Bookmark")
@ConfigValue("binds.add-bookmark")
public static EmiBind addBookmark = new EmiBind("key.emi.add_bookmark", EmiInput.CONTROL_MASK, GLFW.GLFW_KEY_ENTER);

@Comment("Display the recipes for creating a stack.")
@ConfigValue("binds.view-recipes")
public static EmiBind viewRecipes = new EmiBind("key.emi.view_recipes",
Expand Down
1 change: 1 addition & 0 deletions xplat/src/main/java/dev/emi/emi/config/SidebarType.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ public enum SidebarType implements ConfigEnum {
CRAFT_HISTORY("craft-history", 64, 146),
EMPTY("empty", 96, 146),
CHESS("chess", 48, 146),
BOOKMARKS("bookmarks", 112, 146),
;

private final String name;
Expand Down
48 changes: 48 additions & 0 deletions xplat/src/main/java/dev/emi/emi/runtime/EmiBookmarks.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package dev.emi.emi.runtime;

import com.google.common.collect.Lists;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import dev.emi.emi.api.stack.EmiIngredient;
import dev.emi.emi.api.stack.SearchEmiIngredient;
import dev.emi.emi.api.stack.serializer.EmiIngredientSerializer;

import java.util.List;

public class EmiBookmarks {
public static List<SearchEmiIngredient> bookmarks = Lists.newArrayList();

public static JsonArray save() {
JsonArray arr = new JsonArray();
for (SearchEmiIngredient bookmark : bookmarks) {
JsonElement serialized = EmiIngredientSerializer.getSerialized(bookmark);
arr.add(serialized);
}
return arr;
}

public static void load(JsonArray arr) {
bookmarks.clear();
for (JsonElement element : arr) {
EmiIngredient bookmark = EmiIngredientSerializer.getDeserialized(element);

if (bookmark instanceof SearchEmiIngredient) {
bookmarks.add((SearchEmiIngredient) bookmark);
}
}
}

public static void addBookmark(String content, List<? extends EmiIngredient> items) {
SearchEmiIngredient bookmark = new SearchEmiIngredient(content, items);
if (!bookmarks.contains(bookmark)) {
bookmarks.add(bookmark);
}
EmiPersistentData.save();
}

public static void removeBookmark(SearchEmiIngredient bookmark) {
bookmarks.remove(bookmark);
EmiPersistentData.save();
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import java.io.FileWriter;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;

import dev.emi.emi.bom.BoM;
Expand All @@ -18,6 +19,7 @@ public static void save() {
try {
JsonObject json = new JsonObject();
json.add("favorites", EmiFavorites.save());
json.add("bookmarks", EmiBookmarks.save());
EmiSidebars.save(json);
json.add("recipe_defaults", BoM.saveAdded());
json.add("hidden_stacks", EmiHidden.save());
Expand All @@ -38,6 +40,9 @@ public static void load() {
if (JsonHelper.hasArray(json, "favorites")) {
EmiFavorites.load(JsonHelper.getArray(json, "favorites"));
}
if (JsonHelper.hasArray(json, "bookmarks")) {
EmiBookmarks.load(JsonHelper.getArray(json, "bookmarks"));
}
EmiSidebars.load(json);
if (JsonHelper.hasJsonObject(json, "recipe_defaults")) {
BoM.loadAdded(JsonHelper.getObject(json, "recipe_defaults"));
Expand Down
1 change: 1 addition & 0 deletions xplat/src/main/java/dev/emi/emi/runtime/EmiSidebars.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public static List<? extends EmiIngredient> getStacks(SidebarType type) {
case INDEX -> EmiConfig.editMode ? EmiStackList.stacks : EmiStackList.filteredStacks;
case CRAFTABLES -> craftables;
case FAVORITES -> EmiFavorites.favoriteSidebar;
case BOOKMARKS -> EmiBookmarks.bookmarks;
case LOOKUP_HISTORY -> lookupHistory;
case CRAFT_HISTORY -> craftHistory;
case EMPTY -> List.of();
Expand Down
28 changes: 17 additions & 11 deletions xplat/src/main/java/dev/emi/emi/screen/EmiScreenManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
import java.util.stream.Collectors;
import java.util.stream.Stream;

import dev.emi.emi.api.stack.SearchEmiIngredient;
import dev.emi.emi.runtime.*;
import net.minecraft.component.ComponentChanges;
import org.jetbrains.annotations.Nullable;
import org.joml.Matrix4fStack;
Expand Down Expand Up @@ -55,16 +57,6 @@
import dev.emi.emi.registry.EmiRecipeFiller;
import dev.emi.emi.registry.EmiRecipes;
import dev.emi.emi.registry.EmiStackProviders;
import dev.emi.emi.runtime.EmiDrawContext;
import dev.emi.emi.runtime.EmiFavorite;
import dev.emi.emi.runtime.EmiFavorites;
import dev.emi.emi.runtime.EmiHidden;
import dev.emi.emi.runtime.EmiHistory;
import dev.emi.emi.runtime.EmiLog;
import dev.emi.emi.runtime.EmiProfiler;
import dev.emi.emi.runtime.EmiReloadLog;
import dev.emi.emi.runtime.EmiReloadManager;
import dev.emi.emi.runtime.EmiSidebars;
import dev.emi.emi.screen.tooltip.RecipeTooltipComponent;
import dev.emi.emi.screen.widget.EmiSearchWidget;
import dev.emi.emi.screen.widget.SidebarButtonWidget;
Expand All @@ -80,7 +72,6 @@
import net.minecraft.client.gui.tooltip.TooltipComponent;
import net.minecraft.client.gui.widget.TextFieldWidget;
import net.minecraft.client.sound.PositionedSoundInstance;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.screen.slot.Slot;
Expand Down Expand Up @@ -1070,6 +1061,21 @@ public static boolean mouseReleased(double mouseX, double mouseY, int button) {
}
} else {
EmiStackInteraction hovered = getHoveredStack((int) mouseX, (int) mouseY, !isClickClicky(button));

if (panel != null) {
ScreenSpace space = panel.getHoveredSpace(mx, my);
if (space != null && space.getType() == SidebarType.BOOKMARKS && pressedStack instanceof SearchEmiIngredient bookmark) {
if (button == 1) {
EmiBookmarks.removeBookmark(bookmark);
} else if (bookmark.getContent() != null) {
EmiApi.setSearchText(bookmark.getContent());
EmiPort.focus(search, true);
}

return true;
}
}

if (draggedStack.isEmpty() && stackInteraction(hovered, bind -> bind.matchesMouse(button))) {
return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import dev.emi.emi.api.EmiApi;
import dev.emi.emi.api.stack.EmiIngredient;
import dev.emi.emi.runtime.EmiBookmarks;
import dev.emi.emi.screen.EmiScreenManager.SidebarPanel;
import org.joml.Matrix4fStack;
import org.lwjgl.glfw.GLFW;

Expand All @@ -20,7 +24,6 @@
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.widget.TextFieldWidget;
import net.minecraft.client.resource.language.I18n;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.text.MutableText;
import net.minecraft.text.Style;
import net.minecraft.util.Formatting;
Expand Down Expand Up @@ -206,6 +209,23 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
setText("");
return true;
}
if (EmiConfig.addBookmark.matchesKey(keyCode, scanCode)) {
String search = EmiApi.getSearchText();
if (!search.isEmpty()) {
SidebarPanel panel = EmiScreenManager.getSearchPanel();

if (panel != null) {
List<? extends EmiIngredient> list = panel.space.getStacks();

// Limit to at most 8 items for the bookmark
list = list.subList(0, Math.min(list.size(), 8));

if (!list.isEmpty()) {
EmiBookmarks.addBookmark(search, list);
}
}
}
}
if ((EmiConfig.focusSearch.matchesKey(keyCode, scanCode)
|| keyCode == GLFW.GLFW_KEY_ENTER || keyCode == GLFW.GLFW_KEY_ESCAPE)) {
EmiPort.focus(this, false);
Expand Down
Loading