Code/net/minecraft/client/gui/screens/ConfirmScreen.java

117 lines
3.9 KiB
Java

package net.minecraft.client.gui.screens;
import com.google.common.collect.Lists;
import it.unimi.dsi.fastutil.booleans.BooleanConsumer;
import java.util.List;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.components.MultiLineLabel;
import net.minecraft.network.chat.CommonComponents;
import net.minecraft.network.chat.Component;
import net.minecraft.util.Mth;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
@OnlyIn(Dist.CLIENT)
public class ConfirmScreen extends Screen {
private static final int MARGIN = 20;
private final Component message;
private MultiLineLabel multilineMessage = MultiLineLabel.EMPTY;
protected Component yesButton;
protected Component noButton;
private int delayTicker;
protected final BooleanConsumer callback;
private final List<Button> exitButtons = Lists.newArrayList();
public ConfirmScreen(BooleanConsumer p_95654_, Component p_95655_, Component p_95656_) {
this(p_95654_, p_95655_, p_95656_, CommonComponents.GUI_YES, CommonComponents.GUI_NO);
}
public ConfirmScreen(BooleanConsumer p_95658_, Component p_95659_, Component p_95660_, Component p_95661_, Component p_95662_) {
super(p_95659_);
this.callback = p_95658_;
this.message = p_95660_;
this.yesButton = p_95661_;
this.noButton = p_95662_;
}
@Override
public Component getNarrationMessage() {
return CommonComponents.joinForNarration(super.getNarrationMessage(), this.message);
}
@Override
protected void init() {
super.init();
this.multilineMessage = MultiLineLabel.create(this.font, this.message, this.width - 50);
int i = Mth.clamp(this.messageTop() + this.messageHeight() + 20, this.height / 6 + 96, this.height - 24);
this.exitButtons.clear();
this.addButtons(i);
}
protected void addButtons(int p_169252_) {
this.addExitButton(
Button.builder(this.yesButton, p_169259_ -> this.callback.accept(true)).bounds(this.width / 2 - 155, p_169252_, 150, 20).build()
);
this.addExitButton(
Button.builder(this.noButton, p_169257_ -> this.callback.accept(false)).bounds(this.width / 2 - 155 + 160, p_169252_, 150, 20).build()
);
}
protected void addExitButton(Button p_169254_) {
this.exitButtons.add(this.addRenderableWidget(p_169254_));
}
@Override
public void render(GuiGraphics p_281588_, int p_283592_, int p_283446_, float p_282443_) {
super.render(p_281588_, p_283592_, p_283446_, p_282443_);
p_281588_.drawCenteredString(this.font, this.title, this.width / 2, this.titleTop(), 16777215);
this.multilineMessage.renderCentered(p_281588_, this.width / 2, this.messageTop());
}
private int titleTop() {
int i = (this.height - this.messageHeight()) / 2;
return Mth.clamp(i - 20 - 9, 10, 80);
}
private int messageTop() {
return this.titleTop() + 20;
}
private int messageHeight() {
return this.multilineMessage.getLineCount() * 9;
}
public void setDelay(int p_95664_) {
this.delayTicker = p_95664_;
for (Button button : this.exitButtons) {
button.active = false;
}
}
@Override
public void tick() {
super.tick();
if (--this.delayTicker == 0) {
for (Button button : this.exitButtons) {
button.active = true;
}
}
}
@Override
public boolean shouldCloseOnEsc() {
return false;
}
@Override
public boolean keyPressed(int p_95666_, int p_95667_, int p_95668_) {
if (p_95666_ == 256) {
this.callback.accept(false);
return true;
} else {
return super.keyPressed(p_95666_, p_95667_, p_95668_);
}
}
}