forked from SteamWar/AdvancedScripts
Add basic Script visualization and colorization
This commit is contained in:
@ -0,0 +1,111 @@
|
||||
package de.zonlykroks.advancedscripts.screen;
|
||||
|
||||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
import de.zonlykroks.advancedscripts.lexer.ScriptColorizer;
|
||||
import de.zonlykroks.advancedscripts.lexer.Token;
|
||||
import de.zonlykroks.advancedscripts.lexer.TokenTypeColors;
|
||||
import net.minecraft.client.font.TextHandler;
|
||||
import net.minecraft.client.gui.screen.Screen;
|
||||
import net.minecraft.client.gui.screen.ingame.BookScreen;
|
||||
import net.minecraft.client.render.GameRenderer;
|
||||
import net.minecraft.client.util.NarratorManager;
|
||||
import net.minecraft.client.util.math.MatrixStack;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NbtCompound;
|
||||
import net.minecraft.text.Style;
|
||||
import net.minecraft.util.Hand;
|
||||
import org.apache.commons.lang3.mutable.MutableInt;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
public class ScriptEditScreen extends Screen {
|
||||
|
||||
private PlayerEntity player;
|
||||
private ItemStack itemStack;
|
||||
private Hand hand;
|
||||
|
||||
private List<String> lines = new ArrayList<>();
|
||||
|
||||
public ScriptEditScreen(PlayerEntity player, ItemStack itemStack, Hand hand) {
|
||||
super(NarratorManager.EMPTY);
|
||||
this.player = player;
|
||||
this.itemStack = itemStack;
|
||||
this.hand = hand;
|
||||
|
||||
NbtCompound nbtCompound = itemStack.getNbt();
|
||||
if (nbtCompound != null) {
|
||||
BookScreen.filterPages(nbtCompound, s -> {
|
||||
lines.addAll(Arrays.asList(s.split("\n")));
|
||||
});
|
||||
}
|
||||
if (lines.isEmpty()) {
|
||||
lines.add("");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) {
|
||||
this.renderBackground(matrices);
|
||||
RenderSystem.setShader(GameRenderer::getPositionTexProgram);
|
||||
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
|
||||
fill(matrices, 23, 23, this.width - 23, this.height - 72, TokenTypeColors.BACKGROUND);
|
||||
|
||||
int lineNumberLength = textRenderer.getWidth(lines.size() + "");
|
||||
|
||||
// TODO: Implement text rendering
|
||||
int lineNumberText = 1;
|
||||
MutableInt lineNumber = new MutableInt();
|
||||
TextHandler textHandler = this.textRenderer.getTextHandler();
|
||||
for (String s : lines) {
|
||||
if (lineNumber.getValue() * 9 + 25 > this.height - 75) {
|
||||
break;
|
||||
}
|
||||
|
||||
// Line number
|
||||
this.textRenderer.draw(matrices, lineNumberText + "", 25 + lineNumberLength - textRenderer.getWidth(lineNumberText + ""), 25 + lineNumber.getValue() * 9, 0xFFFFFF);
|
||||
lineNumberText++;
|
||||
|
||||
// Line text
|
||||
List<Token> tokens = ScriptColorizer.colorize(lineNumber.getValue(), s);
|
||||
AtomicInteger x = new AtomicInteger(25 + lineNumberLength + 5);
|
||||
for (Token token : tokens) {
|
||||
textHandler.wrapLines(token.text, this.width - x.get() - 25, Style.EMPTY, true, (style, start, end) -> {
|
||||
int y = lineNumber.getValue() * 9;
|
||||
if (y + 25 > this.height - 75) {
|
||||
return;
|
||||
}
|
||||
|
||||
String line = token.text.substring(start, end);
|
||||
this.textRenderer.draw(matrices, line, x.get(), 25 + y, token.color);
|
||||
x.addAndGet(textRenderer.getWidth(line));
|
||||
if (x.get() > this.width - 50 - lineNumberLength - 5) {
|
||||
x.set(25 + lineNumberLength + 5);
|
||||
lineNumber.increment();
|
||||
}
|
||||
});
|
||||
}
|
||||
lineNumber.increment();
|
||||
}
|
||||
|
||||
super.render(matrices, mouseX, mouseY, delta);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean keyReleased(int keyCode, int scanCode, int modifiers) {
|
||||
return super.keyReleased(keyCode, scanCode, modifiers);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean charTyped(char chr, int modifiers) {
|
||||
return super.charTyped(chr, modifiers);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean mouseClicked(double mouseX, double mouseY, int button) {
|
||||
return super.mouseClicked(mouseX, mouseY, button);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user