diff options
| author | shedaniel <daniel@shedaniel.me> | 2022-05-27 20:22:53 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2022-05-27 20:22:53 +0800 |
| commit | 1d0a4480f881350cef45f0f1f76f48cd293a7db8 (patch) | |
| tree | 738e981e5ed1eee28754660aed4b23269898959c | |
| parent | 87e9a9de92ee0b4d8045be497f72a79fc0a0c4c6 (diff) | |
| download | RoughlyEnoughItems-1d0a4480f881350cef45f0f1f76f48cd293a7db8.tar.gz RoughlyEnoughItems-1d0a4480f881350cef45f0f1f76f48cd293a7db8.tar.bz2 RoughlyEnoughItems-1d0a4480f881350cef45f0f1f76f48cd293a7db8.zip | |
Fix clicking pinned JEI slots
9 files changed, 80 insertions, 20 deletions
diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widget.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widget.java index 1e88199b4..3c753e747 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widget.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widget.java @@ -24,8 +24,11 @@ package me.shedaniel.rei.api.client.gui.widgets; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Matrix4f; +import com.mojang.math.Vector4f; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; +import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.api.client.gui.AbstractContainerEventHandler; import me.shedaniel.rei.api.client.gui.Renderer; import net.fabricmc.api.EnvType; @@ -33,6 +36,8 @@ import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; +import java.util.Stack; + /** * The base class for a screen widget * @@ -49,6 +54,34 @@ public abstract class Widget extends AbstractContainerEventHandler implements ne * The font for rendering text */ protected final Font font = minecraft.font; + private static final Stack<Point> mouseStack = new Stack<>(); + + public static Point mouse() { + return mouseStack.empty() ? PointHelper.ofMouse() : mouseStack.peek(); + } + + public static Point pushMouse(Point mouse) { + return mouseStack.push(mouse); + } + + public static Point popMouse() { + return mouseStack.pop(); + } + + public static Point translateMouse(PoseStack poses) { + return translateMouse(poses.last().pose()); + } + + public static Point translateMouse(double x, double y, double z) { + return translateMouse(Matrix4f.createTranslateMatrix((float) x, (float) y, (float) z)); + } + + public static Point translateMouse(Matrix4f pose) { + Point mouse = mouse(); + Vector4f mouseVec = new Vector4f(mouse.x, mouse.y, 0, 1); + mouseVec.transform(pose); + return pushMouse(mouse); + } public int getZ() { return this.getBlitOffset(); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DelegateWidgetWithTranslate.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DelegateWidgetWithTranslate.java index 5867f4232..c03cd3fb3 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DelegateWidgetWithTranslate.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DelegateWidgetWithTranslate.java @@ -27,6 +27,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Matrix4f; import com.mojang.math.Vector4f; import me.shedaniel.rei.api.client.gui.widgets.DelegateWidget; +import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; import java.util.function.Supplier; @@ -83,4 +84,34 @@ public class DelegateWidgetWithTranslate extends DelegateWidget { Vector4f mouse = transformMouse(d, e); return super.mouseScrolled(mouse.x(), mouse.y(), f); } + + @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + try { + Widget.translateMouse(translate.get()); + return super.keyPressed(keyCode, scanCode, modifiers); + } finally { + Widget.popMouse(); + } + } + + @Override + public boolean keyReleased(int keyCode, int scanCode, int modifiers) { + try { + Widget.translateMouse(translate.get()); + return super.keyReleased(keyCode, scanCode, modifiers); + } finally { + Widget.popMouse(); + } + } + + @Override + public boolean charTyped(char character, int modifiers) { + try { + Widget.translateMouse(translate.get()); + return super.charTyped(character, modifiers); + } finally { + Widget.popMouse(); + } + } }
\ No newline at end of file diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayCompositeWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayCompositeWidget.java index 1a02fbae3..6f65bc525 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayCompositeWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayCompositeWidget.java @@ -83,7 +83,7 @@ public class DisplayCompositeWidget extends DelegateWidgetWithBounds implements return true; } - if (ConfigObject.getInstance().isFavoritesEnabled() && containsMouse(PointHelper.ofMouse())) { + if (ConfigObject.getInstance().isFavoritesEnabled() && containsMouse(mouse())) { if (ConfigObject.getInstance().getFavoriteKeyCode().matchesKey(keyCode, scanCode)) { FavoritesListWidget favoritesListWidget = ScreenOverlayImpl.getFavoritesListWidget(); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java index 746324a33..ebb2a87b8 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java @@ -487,7 +487,7 @@ public class EntryWidget extends Slot implements DraggableStackProviderWidget { } protected boolean doAction(double mouseX, double mouseY, int button) { - if (interactableFavorites && ConfigObject.getInstance().isFavoritesEnabled() && containsMouse(PointHelper.ofMouse()) && !getCurrentEntry().isEmpty()) { + if (interactableFavorites && ConfigObject.getInstance().isFavoritesEnabled() && !getCurrentEntry().isEmpty()) { ModifierKeyCode keyCode = ConfigObject.getInstance().getFavoriteKeyCode(); if (keyCode.matchesMouse(button)) { FavoriteEntry favoriteEntry = asFavoriteEntry(); @@ -561,7 +561,7 @@ public class EntryWidget extends Slot implements DraggableStackProviderWidget { @Override public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - if (containsMouse(PointHelper.ofMouse())) { + if (containsMouse(mouse())) { return keyPressedIgnoreContains(keyCode, scanCode, modifiers); } @@ -571,7 +571,7 @@ public class EntryWidget extends Slot implements DraggableStackProviderWidget { public boolean keyPressedIgnoreContains(int keyCode, int scanCode, int modifiers) { if (!interactable) return false; - if (interactableFavorites && ConfigObject.getInstance().isFavoritesEnabled() && containsMouse(PointHelper.ofMouse()) && !getCurrentEntry().isEmpty()) { + if (interactableFavorites && ConfigObject.getInstance().isFavoritesEnabled() && !getCurrentEntry().isEmpty()) { if (ConfigObject.getInstance().getFavoriteKeyCode().matchesKey(keyCode, scanCode)) { FavoriteEntry favoriteEntry = asFavoriteEntry(); if (favoriteEntry != null) { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TextFieldWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TextFieldWidget.java index aa9656cc0..8f3d79114 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TextFieldWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TextFieldWidget.java @@ -407,7 +407,7 @@ public class TextFieldWidget extends WidgetWithBounds implements TickableWidget, public void renderBorder(PoseStack matrices) { if (this.hasBorder()) { - if (containsMouse(PointHelper.ofMouse()) || focused) + if (containsMouse(mouse()) || focused) fill(matrices, this.bounds.x - 1, this.bounds.y - 1, this.bounds.x + this.bounds.width + 1, this.bounds.y + this.bounds.height + 1, -1); else fill(matrices, this.bounds.x - 1, this.bounds.y - 1, this.bounds.x + this.bounds.width + 1, this.bounds.y + this.bounds.height + 1, -6250336); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java index ce35d9c07..ff338307b 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java @@ -354,7 +354,7 @@ public class EntryListWidget extends WidgetWithBounds implements OverlayListWidg @Override public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - if (containsChecked(PointHelper.ofMouse(), false)) + if (containsChecked(mouse(), false)) for (Widget widget : children) if (widget.keyPressed(keyCode, scanCode, modifiers)) return true; @@ -498,7 +498,7 @@ public class EntryListWidget extends WidgetWithBounds implements OverlayListWidg @Override public EntryStack<?> getFocusedStack() { - Point mouse = PointHelper.ofMouse(); + Point mouse = mouse(); if (containsChecked(mouse, false)) { for (EntryListStackEntry entry : entries) { EntryStack<?> currentEntry = entry.getCurrentEntry(); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidget.java index 0c19e7bff..dc486b3ac 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidget.java @@ -155,7 +155,7 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableCo @Override public EntryStack<?> getFocusedStack() { - Point mouse = PointHelper.ofMouse(); + Point mouse = mouse(); EntryStack<?> stack = region.getFocusedStack(); if (stack != null && !stack.isEmpty()) return stack; stack = systemRegion.getFocusedStack(); @@ -264,7 +264,7 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableCo @Override public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - if (containsMouse(PointHelper.ofMouse())) + if (containsMouse(mouse())) for (Widget widget : children()) if (widget.keyPressed(keyCode, scanCode, modifiers)) return true; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayEntry.java index 35beb1432..e21d81e3f 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayEntry.java @@ -210,18 +210,15 @@ public class DisplayEntry extends WidgetWithBounds { @Override public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - for (Widget widget : widgets.get()) { - if (widget instanceof EntryWidget) { - double mouseX = PointHelper.getMouseFloatingX(), mouseY = PointHelper.getMouseFloatingY(); - if (widget.containsMouse(transformMouseX(mouseX), transformMouseY(mouseY)) - && ((EntryWidget) widget).keyPressedIgnoreContains(keyCode, scanCode, modifiers)) { - return true; - } - } else { + try { + Widget.translateMouse(xOffset, 0, 0); + for (Widget widget : widgets.get()) { if (widget.keyPressed(keyCode, scanCode, modifiers)) { return true; } } + } finally { + Widget.popMouse(); } return super.keyPressed(keyCode, scanCode, modifiers); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/EntryStacksRegionWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/EntryStacksRegionWidget.java index 6fecb94c3..57c80090c 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/EntryStacksRegionWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/EntryStacksRegionWidget.java @@ -34,7 +34,6 @@ import me.shedaniel.clothconfig2.api.scroll.ScrollingContainer; import me.shedaniel.math.FloatingPoint; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; -import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.entry.region.RegionEntry; @@ -170,7 +169,7 @@ public class EntryStacksRegionWidget<T extends RegionEntry<T>> extends WidgetWit @Override public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - if (containsMouse(PointHelper.ofMouse())) + if (containsMouse(mouse())) for (Widget widget : children()) if (widget.keyPressed(keyCode, scanCode, modifiers)) return true; @@ -191,7 +190,7 @@ public class EntryStacksRegionWidget<T extends RegionEntry<T>> extends WidgetWit } public EntryStack<?> getFocusedStack() { - Point mouse = PointHelper.ofMouse(); + Point mouse = mouse(); if (innerBounds.contains(mouse)) { for (RealRegionEntry<T> entry : entries.values()) { if (entry.getWidget().containsMouse(mouse)) { |
