Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add ghost circuit slot scroll input #2373

Merged
merged 6 commits into from
Nov 17, 2024
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,24 @@ public class Tab extends WidgetGroup {
public Tab(IFancyConfigurator configurator) {
super(0, tabs.size() * (getTabSize() + 2), getTabSize(), getTabSize());
this.configurator = configurator;
this.button = new ButtonWidget(0, 0, getTabSize(), getTabSize(), null, this::onClick);
this.button = new ButtonWidget(0, 0, getTabSize(), getTabSize(), null, this::onClick) {

@Override
public boolean mouseWheelMove(double mouseX, double mouseY, double wheelDelta) {
if (!(configurator instanceof IFancyCustomMouseWheelAction hasActions)) return false;
if (isMouseOverElement(mouseX, mouseY))
return hasActions.mouseWheelMove(this::writeClientAction, mouseX, mouseY, wheelDelta);
return false;
}

@Override
public void handleClientAction(int id, FriendlyByteBuf buffer) {
if (configurator instanceof IFancyCustomClientActionHandler handler && id > 1)
handler.handleClientAction(id, buffer);
else
super.handleClientAction(id, buffer);
}
};
if (configurator instanceof IFancyConfiguratorButton) {
this.view = null;
this.addWidget(button);
Expand Down Expand Up @@ -270,7 +287,9 @@ protected void onChildSizeUpdate(Widget child) {
}

private void onClick(ClickData clickData) {
if (configurator instanceof IFancyConfiguratorButton fancyButton) {
if (clickData.button == 2 && configurator instanceof IFancyCustomMiddleClickAction middleAction) {
middleAction.onMiddleClick(this::writeClientAction);
} else if (configurator instanceof IFancyConfiguratorButton fancyButton) {
fancyButton.onClick(clickData);
} else {
if (expanded == this) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.gregtechceu.gtceu.api.gui.fancy;

import net.minecraft.network.FriendlyByteBuf;

public interface IFancyCustomClientActionHandler {

default void handleClientAction(int id, FriendlyByteBuf buffer) {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.gregtechceu.gtceu.api.gui.fancy;

import net.minecraft.network.FriendlyByteBuf;

import java.util.function.BiConsumer;
import java.util.function.Consumer;

public interface IFancyCustomMiddleClickAction extends IFancyCustomClientActionHandler {

default void onMiddleClick(BiConsumer<Integer, Consumer<FriendlyByteBuf>> writeClientAction) {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.gregtechceu.gtceu.api.gui.fancy;

import net.minecraft.network.FriendlyByteBuf;

import java.util.function.BiConsumer;
import java.util.function.Consumer;

public interface IFancyCustomMouseWheelAction extends IFancyCustomClientActionHandler {

default boolean mouseWheelMove(BiConsumer<Integer, Consumer<FriendlyByteBuf>> writeClientAction, double mouseX,
double mouseY, double wheelDelta) {
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import com.gregtechceu.gtceu.api.gui.GuiTextures;
import com.gregtechceu.gtceu.api.gui.fancy.IFancyConfigurator;
import com.gregtechceu.gtceu.api.gui.fancy.IFancyCustomMiddleClickAction;
import com.gregtechceu.gtceu.api.gui.fancy.IFancyCustomMouseWheelAction;
import com.gregtechceu.gtceu.api.gui.widget.SlotWidget;
import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour;
import com.gregtechceu.gtceu.config.ConfigHolder;
Expand All @@ -15,6 +17,8 @@
import com.lowdragmc.lowdraglib.gui.widget.Widget;
import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup;

import net.minecraft.data.models.blockstates.PropertyDispatch;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.world.item.ItemStack;
Expand All @@ -24,13 +28,22 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

/**
* @author KilaBash
* @date 2023/6/30
* @implNote CircuitFancyConfigurator
*/
public class CircuitFancyConfigurator implements IFancyConfigurator {
public class CircuitFancyConfigurator implements IFancyConfigurator, IFancyCustomMouseWheelAction,
IFancyCustomMiddleClickAction {

private static final int SET_TO_ZERO = 2;
private static final int SET_TO_EMPTY = 3;
private static final int SET_TO_N = 4;

private static final int NO_CONFIG = -1;

final ItemStackHandler circuitSlot;

Expand All @@ -52,8 +65,40 @@ public IGuiTexture getIcon() {
new ItemStackTexture(Items.BARRIER));
}

@Override
public boolean mouseWheelMove(BiConsumer<Integer, Consumer<FriendlyByteBuf>> writeClientAction, double mouseX,
double mouseY, double wheelDelta) {
if (wheelDelta == 0) return false;
int nextValue = getNextValue(wheelDelta > 0);
if (nextValue == NO_CONFIG) {
circuitSlot.setStackInSlot(0, ItemStack.EMPTY);
writeClientAction.accept(SET_TO_EMPTY, buf -> {});
} else {
circuitSlot.setStackInSlot(0, IntCircuitBehaviour.stack(nextValue));
writeClientAction.accept(SET_TO_N, buf -> buf.writeVarInt(nextValue));
}
return true;
}

@Override
public void handleClientAction(int id, FriendlyByteBuf buffer) {
switch (id) {
case SET_TO_ZERO -> circuitSlot.setStackInSlot(0, IntCircuitBehaviour.stack(0));
case SET_TO_EMPTY -> circuitSlot.setStackInSlot(0, ItemStack.EMPTY);
case SET_TO_N -> circuitSlot.setStackInSlot(0, IntCircuitBehaviour.stack(buffer.readVarInt()));
}
}

@Override
public void onMiddleClick(BiConsumer<Integer, Consumer<FriendlyByteBuf>> writeClientAction) {
circuitSlot.setStackInSlot(0, ItemStack.EMPTY);
writeClientAction.accept(SET_TO_EMPTY, buf -> {});
}

@Override
public Widget createConfigurator() {
BiConsumer<Integer, FriendlyByteBuf> handleClientActionMethod = this::handleClientAction;
PropertyDispatch.QuadFunction<BiConsumer<Integer, Consumer<FriendlyByteBuf>>, Double, Double, Double, Boolean> mouseWheelMoveMethod = this::mouseWheelMove;
var group = new WidgetGroup(0, 0, 174, 132);
group.addWidget(new LabelWidget(9, 8, "Programmed Circuit Configuration"));
group.addWidget(new SlotWidget(circuitSlot, 0, (group.getSize().width - 18) / 2, 20,
Expand Down Expand Up @@ -116,4 +161,31 @@ public List<Component> getTooltips() {
.toList());
return list;
}

private int getNextValue(boolean increment) {
int currentValue = IntCircuitBehaviour.getCircuitConfiguration(circuitSlot.getStackInSlot(0));
if (increment) {
// if at max, loop around to no circuit
if (currentValue == IntCircuitBehaviour.CIRCUIT_MAX) {
return 0;
}
// if at no circuit, skip 0 and return 1
if (this.circuitSlot.getStackInSlot(0).isEmpty()) {
return 1;
}
// normal case: increment by 1
return currentValue + 1;
} else {
// if at no circuit, loop around to max
if (this.circuitSlot.getStackInSlot(0).isEmpty()) {
return IntCircuitBehaviour.CIRCUIT_MAX;
}
// if at 1, skip 0 and return no circuit
if (currentValue == 1) {
return -1;
}
// normal case: decrement by 1
return currentValue - 1;
}
}
}