Skip to content

Commit

Permalink
separate forge event code from event handlers
Browse files Browse the repository at this point in the history
  • Loading branch information
mezz committed Apr 6, 2022
1 parent 0933692 commit 8c9ce90
Show file tree
Hide file tree
Showing 18 changed files with 299 additions and 234 deletions.
@@ -1,4 +1,4 @@
package mezz.jei.common.gui.overlay;
package mezz.jei.common.filter;

import java.util.ArrayList;
import java.util.List;
Expand Down
@@ -1,4 +1,4 @@
package mezz.jei.common.gui.overlay;
package mezz.jei.common.filter;

public interface IFilterTextSource {
String getFilterText();
Expand Down
7 changes: 7 additions & 0 deletions Common/src/main/java/mezz/jei/common/filter/package-info.java
@@ -0,0 +1,7 @@
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
package mezz.jei.common.filter;

import net.minecraft.MethodsReturnNonnullByDefault;

import javax.annotation.ParametersAreNonnullByDefault;
@@ -1,22 +1,17 @@
package mezz.jei.forge.events;
package mezz.jei.common.gui;

import com.mojang.blaze3d.vertex.PoseStack;
import mezz.jei.api.gui.handlers.IGuiClickableArea;
import mezz.jei.common.util.LimitedLogger;
import mezz.jei.common.gui.GuiScreenHelper;
import mezz.jei.common.gui.TooltipRenderer;
import mezz.jei.common.gui.overlay.IngredientListOverlay;
import mezz.jei.common.gui.overlay.bookmarks.LeftAreaDispatcher;
import mezz.jei.common.input.MouseUtil;
import mezz.jei.common.platform.IPlatformScreenHelper;
import mezz.jei.common.platform.Services;
import mezz.jei.common.util.LimitedLogger;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
import net.minecraft.network.chat.TranslatableComponent;
import net.minecraftforge.client.event.ContainerScreenEvent;
import net.minecraftforge.client.event.ScreenEvent;
import net.minecraftforge.client.event.ScreenOpenEvent;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.eventbus.api.Event;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
Expand All @@ -43,56 +38,39 @@ public GuiEventHandler(
this.ingredientListOverlay = ingredientListOverlay;
}

public void register(RuntimeEventSubscriptions subscriptions) {
subscriptions.register(ScreenEvent.InitScreenEvent.Post.class, this::onGuiInit);
subscriptions.register(ScreenOpenEvent.class, this::onGuiOpen);
subscriptions.register(ScreenEvent.BackgroundDrawnEvent.class, this::onDrawBackgroundEventPost);
subscriptions.register(ContainerScreenEvent.DrawForeground.class, this::onDrawForegroundEvent);
subscriptions.register(ScreenEvent.DrawScreenEvent.Post.class, this::onDrawScreenEventPost);
subscriptions.register(TickEvent.ClientTickEvent.class, this::onClientTick);
subscriptions.register(ScreenEvent.PotionSizeEvent.class, this::onPotionSizeEvent);
}

public void onGuiInit(ScreenEvent.InitScreenEvent.Post event) {
Screen screen = event.getScreen();
public void onGuiInit(Screen screen) {
ingredientListOverlay.updateScreen(screen, false);
leftAreaDispatcher.updateScreen(screen, false);
}

public void onGuiOpen(ScreenOpenEvent event) {
Screen screen = event.getScreen();
public void onGuiOpen(Screen screen) {
ingredientListOverlay.updateScreen(screen, false);
leftAreaDispatcher.updateScreen(screen, false);
}

public void onDrawBackgroundEventPost(ScreenEvent.BackgroundDrawnEvent event) {
Screen screen = event.getScreen();
Minecraft minecraft = screen.getMinecraft();
public void onDrawBackgroundPost(Screen screen, PoseStack poseStack) {
Minecraft minecraft = Minecraft.getInstance();
boolean exclusionAreasChanged = guiScreenHelper.updateGuiExclusionAreas(screen);
ingredientListOverlay.updateScreen(screen, exclusionAreasChanged);
leftAreaDispatcher.updateScreen(screen, exclusionAreasChanged);

drawnOnBackground = true;
double mouseX = MouseUtil.getX();
double mouseY = MouseUtil.getY();
PoseStack poseStack = event.getPoseStack();
ingredientListOverlay.drawScreen(minecraft, poseStack, (int) mouseX, (int) mouseY, minecraft.getFrameTime());
leftAreaDispatcher.drawScreen(minecraft, poseStack, (int) mouseX, (int) mouseY, minecraft.getFrameTime());
}

/**
* Draws above most ContainerScreen elements, but below the tooltips.
*/
public void onDrawForegroundEvent(ContainerScreenEvent.DrawForeground event) {
AbstractContainerScreen<?> screen = event.getContainerScreen();
Minecraft minecraft = screen.getMinecraft();
ingredientListOverlay.drawOnForeground(minecraft, event.getPoseStack(), screen, event.getMouseX(), event.getMouseY());
public void onDrawForeground(AbstractContainerScreen<?> screen, PoseStack poseStack, int mouseX, int mouseY) {
Minecraft minecraft = Minecraft.getInstance();
ingredientListOverlay.drawOnForeground(minecraft, poseStack, screen, mouseX, mouseY);
}

public void onDrawScreenEventPost(ScreenEvent.DrawScreenEvent.Post event) {
Screen screen = event.getScreen();
Minecraft minecraft = screen.getMinecraft();
PoseStack poseStack = event.getPoseStack();
public void onDrawScreenPost(Screen screen, PoseStack poseStack, int mouseX, int mouseY) {
Minecraft minecraft = Minecraft.getInstance();

ingredientListOverlay.updateScreen(screen, false);
leftAreaDispatcher.updateScreen(screen, false);
Expand All @@ -102,39 +80,34 @@ public void onDrawScreenEventPost(ScreenEvent.DrawScreenEvent.Post event) {
String guiName = screen.getClass().getName();
missingBackgroundLogger.log(Level.WARN, guiName, "GUI did not draw the dark background layer behind itself, this may result in display issues: {}", guiName);
}
ingredientListOverlay.drawScreen(minecraft, poseStack, event.getMouseX(), event.getMouseY(), minecraft.getFrameTime());
leftAreaDispatcher.drawScreen(minecraft, poseStack, event.getMouseX(), event.getMouseY(), minecraft.getFrameTime());
ingredientListOverlay.drawScreen(minecraft, poseStack, mouseX, mouseY, minecraft.getFrameTime());
leftAreaDispatcher.drawScreen(minecraft, poseStack, mouseX, mouseY, minecraft.getFrameTime());
}
drawnOnBackground = false;

if (screen instanceof AbstractContainerScreen<?> guiContainer) {
guiScreenHelper.getGuiClickableArea(guiContainer, event.getMouseX() - guiContainer.getGuiLeft(), event.getMouseY() - guiContainer.getGuiTop())
IPlatformScreenHelper screenHelper = Services.PLATFORM.getScreenHelper();
int guiLeft = screenHelper.getGuiLeft(guiContainer);
int guiTop = screenHelper.getGuiTop(guiContainer);
guiScreenHelper.getGuiClickableArea(guiContainer, mouseX - guiLeft, mouseY - guiTop)
.map(IGuiClickableArea::getTooltipStrings)
.ifPresent(tooltipStrings -> {
if (tooltipStrings.isEmpty()) {
tooltipStrings = List.of(new TranslatableComponent("jei.tooltip.show.recipes"));
}
TooltipRenderer.drawHoveringText(poseStack, tooltipStrings, event.getMouseX(), event.getMouseY());
TooltipRenderer.drawHoveringText(poseStack, tooltipStrings, mouseX, mouseY);
});
}

ingredientListOverlay.drawTooltips(minecraft, poseStack, event.getMouseX(), event.getMouseY());
leftAreaDispatcher.drawTooltips(minecraft, poseStack, event.getMouseX(), event.getMouseY());
ingredientListOverlay.drawTooltips(minecraft, poseStack, mouseX, mouseY);
leftAreaDispatcher.drawTooltips(minecraft, poseStack, mouseX, mouseY);
}

public void onClientTick(TickEvent.ClientTickEvent event) {
if (event.phase == TickEvent.Phase.END) {
return;
}

public void onClientTick() {
ingredientListOverlay.handleTick();
}

public void onPotionSizeEvent(ScreenEvent.PotionSizeEvent event) {
if (ingredientListOverlay.isListDisplayed()) {
// Forcibly renders the potion indicators in compact mode.
// This gives the ingredient list overlay more room to display ingredients.
event.setResult(Event.Result.ALLOW);
}
public boolean renderCompactPotionIndicators() {
return ingredientListOverlay.isListDisplayed();
}
}
Expand Up @@ -5,6 +5,7 @@
import mezz.jei.api.ingredients.IIngredientType;
import mezz.jei.api.ingredients.ITypedIngredient;
import mezz.jei.api.runtime.IIngredientListOverlay;
import mezz.jei.common.filter.IFilterTextSource;
import mezz.jei.common.gui.GuiProperties;
import mezz.jei.common.gui.GuiScreenHelper;
import mezz.jei.common.gui.elements.GuiIconToggleButton;
Expand Down
Expand Up @@ -11,7 +11,7 @@
import mezz.jei.core.config.IClientConfig;
import mezz.jei.common.config.IIngredientFilterConfig;
import mezz.jei.common.gui.ingredients.IListElement;
import mezz.jei.common.gui.overlay.IFilterTextSource;
import mezz.jei.common.filter.IFilterTextSource;
import mezz.jei.common.gui.overlay.IIngredientGridSource;
import mezz.jei.common.search.ElementSearch;
import mezz.jei.common.search.ElementSearchLowMem;
Expand Down
Expand Up @@ -2,8 +2,7 @@

import mezz.jei.api.ingredients.IIngredientType;
import mezz.jei.api.runtime.IIngredientFilter;
import mezz.jei.common.gui.overlay.IFilterTextSource;
import mezz.jei.common.ingredients.IngredientFilter;
import mezz.jei.common.filter.IFilterTextSource;
import mezz.jei.common.util.ErrorUtil;

import java.util.List;
Expand Down
104 changes: 104 additions & 0 deletions Common/src/main/java/mezz/jei/common/input/ClientInputHandler.java
@@ -0,0 +1,104 @@
package mezz.jei.common.input;

import mezz.jei.common.input.handlers.CombinedInputHandler;
import mezz.jei.core.util.ReflectionUtil;
import net.minecraft.client.gui.components.EditBox;
import net.minecraft.client.gui.screens.Screen;

import java.util.List;

public class ClientInputHandler {
private final List<ICharTypedHandler> charTypedHandlers;
private final CombinedInputHandler inputHandler;
private final IKeyBindings keybindings;
private final ReflectionUtil reflectionUtil = new ReflectionUtil();

public ClientInputHandler(List<ICharTypedHandler> charTypedHandlers, CombinedInputHandler inputHandler, IKeyBindings keybindings) {
this.charTypedHandlers = charTypedHandlers;
this.inputHandler = inputHandler;
this.keybindings = keybindings;
}

public void onInitGui() {
this.inputHandler.handleGuiChange();
}

/**
* When we have keyboard focus, use Pre
*/
public boolean onKeyboardKeyPressedPre(Screen screen, UserInput input) {
if (!isContainerTextFieldFocused(screen)) {
return this.inputHandler.handleUserInput(screen, input, keybindings)
.isPresent();
}
return false;
}

/**
* Without keyboard focus, use Post
*/
public boolean onKeyboardKeyPressed(Screen screen, UserInput input) {
if (isContainerTextFieldFocused(screen)) {
return this.inputHandler.handleUserInput(screen, input, keybindings)
.isPresent();
}
return false;
}

/**
* When we have keyboard focus, use Pre
*/
public boolean onKeyboardCharTypedPre(Screen screen, char codePoint, int modifiers) {
if (!isContainerTextFieldFocused(screen)) {
return handleCharTyped(codePoint, modifiers);
}
return false;
}

/**
* Without keyboard focus, use Post
*/
public boolean onKeyboardCharTypedPost(Screen screen, char codePoint, int modifiers) {
if (isContainerTextFieldFocused(screen)) {
return handleCharTyped(codePoint, modifiers);
}
return false;
}

public boolean onGuiMouseClicked(Screen screen, UserInput input) {
boolean handled = this.inputHandler.handleUserInput(screen, input, keybindings)
.isPresent();

if (input.is(keybindings.getLeftClick())) {
handled |= this.inputHandler.handleDragStart(screen, input)
.isPresent();
}
return handled;
}

public boolean onGuiMouseReleased(Screen screen, UserInput input) {
boolean handled = this.inputHandler.handleUserInput(screen, input, keybindings)
.isPresent();

if (input.is(keybindings.getLeftClick())) {
handled |= this.inputHandler.handleDragComplete(screen, input)
.isPresent();
}
return handled;
}

public boolean onGuiMouseScroll(double mouseX, double mouseY, double scrollDelta) {
return this.inputHandler.handleMouseScrolled(mouseX, mouseY, scrollDelta);
}

private boolean handleCharTyped(char codePoint, int modifiers) {
return this.charTypedHandlers.stream()
.filter(ICharTypedHandler::hasKeyboardFocus)
.anyMatch(handler -> handler.onCharTyped(codePoint, modifiers));
}

private boolean isContainerTextFieldFocused(Screen screen) {
return reflectionUtil.getFieldWithClass(screen, EditBox.class)
.anyMatch(textField -> textField.isActive() && textField.isFocused());
}
}
Expand Up @@ -19,7 +19,7 @@
import mezz.jei.common.gui.GuiHelper;
import mezz.jei.common.gui.GuiScreenHelper;
import mezz.jei.common.gui.ingredients.IListElement;
import mezz.jei.common.gui.overlay.IFilterTextSource;
import mezz.jei.common.filter.IFilterTextSource;
import mezz.jei.common.ingredients.IngredientBlacklistInternal;
import mezz.jei.common.ingredients.IngredientFilter;
import mezz.jei.common.ingredients.IngredientListElementFactory;
Expand Down
Expand Up @@ -4,7 +4,7 @@
import mezz.jei.common.config.IIngredientGridConfig;
import mezz.jei.common.gui.GuiScreenHelper;
import mezz.jei.common.gui.elements.DrawableNineSliceTexture;
import mezz.jei.common.gui.overlay.IFilterTextSource;
import mezz.jei.common.filter.IFilterTextSource;
import mezz.jei.common.gui.overlay.IIngredientGridSource;
import mezz.jei.common.gui.overlay.IngredientGrid;
import mezz.jei.common.gui.overlay.IngredientGridWithNavigation;
Expand Down
18 changes: 0 additions & 18 deletions Forge/src/main/java/mezz/jei/forge/events/EditModeToggleEvent.java

This file was deleted.

6 changes: 0 additions & 6 deletions Forge/src/main/java/mezz/jei/forge/events/JeiEvent.java

This file was deleted.

0 comments on commit 8c9ce90

Please sign in to comment.