fix records list and add btns

This commit is contained in:
MeexReay 2024-04-22 00:25:43 +03:00
parent b6589b3629
commit 38dad10048
24 changed files with 758 additions and 286 deletions

View file

@ -2,182 +2,99 @@ package themixray.repeating.mod;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.Drawable;
import net.minecraft.client.gui.Element;
import net.minecraft.client.gui.Selectable;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.tooltip.Tooltip;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.gui.widget.SliderWidget;
import net.minecraft.text.Text;
import net.minecraft.util.math.Vec3d;
import themixray.repeating.mod.events.RecordEvent;
import javax.swing.*;
import java.awt.*;
import java.io.File;
import java.nio.file.Files;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.ArrayList;
import java.util.List;
@Environment(EnvType.CLIENT)
public class RepeatingScreen extends Screen {
protected RepeatingScreen() {
super(Text.literal(""));
this.mod = RepeatingMod.me;
}
public RepeatingMod mod;
private static List<RenderListener> render_listeners = new ArrayList<>();
public ButtonWidget record_btn;
public ButtonWidget replay_btn;
public ButtonWidget loop_btn;
public ButtonWidget export_btn;
public ButtonWidget import_btn;
public SliderWidget pos_delay_slider;
public boolean was_build = false;
public void update_btns() {
protected RepeatingScreen() {
super(Text.empty());
}
public static void addRenderListener(RenderListener render) {
render_listeners.add(render);
}
public static void removeRenderListener(RenderListener render) {
render_listeners.remove(render);
}
public void updateButtons() {
if (was_build) {
replay_btn.setMessage(Text.translatable("text.repeating-mod." +
((mod.is_replaying) ? "stop_replay" : "start_replay")));
record_btn.setMessage(Text.translatable("text.repeating-mod." +
((mod.is_recording) ? "stop_record" : "start_record")));
loop_btn.setMessage(Text.of(((mod.loop_replay) ? "\uefff " : "\ueffe ")));
record_btn.setMessage(Text.translatable("text.repeating-mod." + ((Main.me.is_recording) ? "stop_record" : "start_record")));
loop_btn.setMessage(Text.translatable("text.repeating-mod." + ((Main.me.loop_replay) ? "off_loop" : "on_loop")));
}
}
@Override
public void render(DrawContext context, int mouseX, int mouseY, float delta) {
renderBackground(context);
for (RenderListener l : render_listeners) {
if (l.beforeRender()) {
l.render(context, mouseX, mouseY, delta);
}
}
super.render(context, mouseX, mouseY, delta);
for (RenderListener l : render_listeners) {
if (!l.beforeRender()) {
l.render(context, mouseX, mouseY, delta);
}
}
}
@Override
protected void init() {
record_btn = ButtonWidget.builder(
Text.translatable("text.repeating-mod.start_record"), button -> {
if (!mod.is_replaying) {
if (mod.is_recording)
mod.stopRecording();
else mod.startRecording();
update_btns();
if (!Main.me.is_replaying) {
if (Main.me.is_recording)
Main.me.stopRecording();
else Main.me.startRecording();
updateButtons();
}
})
.dimensions(width / 2 - 60, height / 2 - 54, 120, 20)
.dimensions(width / 2 - 60, height / 2 - 76, 120, 20)
.tooltip(Tooltip.of(Text.translatable("text.repeating-mod.record_tooltip")))
.build();
replay_btn = ButtonWidget.builder(
Text.translatable("text.repeating-mod.start_replay"), button -> {
if (!mod.is_recording) {
if (mod.is_replaying)
mod.stopReplay();
else mod.startReplay();
update_btns();
}
loop_btn = ButtonWidget.builder(Text.empty(), button -> {
Main.me.loop_replay = !Main.me.loop_replay;
updateButtons();
})
.dimensions(width / 2 - 60, height / 2 - 32, 98, 20)
.tooltip(Tooltip.of(Text.translatable("text.repeating-mod.replay_tooltip")))
.build();
loop_btn = ButtonWidget.builder(Text.of(""), button -> {
mod.loop_replay = !mod.loop_replay;
update_btns();
})
.dimensions(width / 2 + 40, height / 2 - 32, 20, 20)
.dimensions(width / 2 - 60, height / 2 - 54, 120, 20)
.tooltip(Tooltip.of(Text.translatable("text.repeating-mod.loop_tooltip")))
.build();
export_btn = ButtonWidget.builder(
Text.translatable("text.repeating-mod.export"), button -> {
if (mod.finish_record_pos == null) return;
StringBuilder t = new StringBuilder();
for (int i = 0; i < mod.record.size(); i++) {
t.append(mod.record.get(i).serialize());
t.append("\n");
}
t.append(mod.start_record_pos.getX()+"n"+
mod.start_record_pos.getY()+"n"+
mod.start_record_pos.getZ()+"x"+
mod.finish_record_pos.getX()+"n"+
mod.finish_record_pos.getY()+"n"+
mod.finish_record_pos.getZ());
File p = new File(FabricLoader.getInstance().getGameDir().toFile(),"repeating");
if (!p.exists()) p.mkdir();
File file = new File(p,"export_"+
new SimpleDateFormat("MM_dd_yyyy").format(new Date())
+"_"+RepeatingMod.rand.nextInt(10)+".txt");
try {
if (!file.exists()) file.createNewFile();
Files.write(file.toPath(), t.toString().getBytes());
Runtime.getRuntime().exec("explorer /select,\""+file.getAbsolutePath()+"\"");
} catch (Exception e) {
e.printStackTrace();
}
})
.dimensions(width / 2 - 60, height / 2 - 10, 120, 20)
.tooltip(Tooltip.of(Text.translatable("text.repeating-mod.export_tooltip")))
.build();
import_btn = ButtonWidget.builder(
Text.translatable("text.repeating-mod.import"), button -> {
mod.record.clear();
File p = new File(FabricLoader.getInstance().getGameDir().toFile(),"repeating");
if (!p.exists()) p.mkdir();
JFileChooser fc = new JFileChooser() {
@Override
protected JDialog createDialog(Component parent) throws HeadlessException {
JDialog dialog = super.createDialog(parent);
dialog.setLocationByPlatform(true);
dialog.setAlwaysOnTop(true);
return dialog;
}
};
int retValue = fc.showOpenDialog(null);
if (retValue == JFileChooser.APPROVE_OPTION){
File file = fc.getSelectedFile();
try {
String t = Files.readString(file.toPath());
List<String> ss = List.of(t.split("\n"));
String ls = ss.get(ss.size()-1);
ss = ss.subList(0,ss.size()-1);
for (String s:ss)
mod.record.add(RecordEvent.deserialize(s));
String[] lss0 = ls.split("x");
String[] lss1 = lss0[0].split("n");
String[] lss2 = lss0[1].split("n");
mod.start_record_pos = new Vec3d(
Float.parseFloat(lss1[0]),
Float.parseFloat(lss1[1]),
Float.parseFloat(lss1[2]));
mod.finish_record_pos = new Vec3d(
Float.parseFloat(lss2[0]),
Float.parseFloat(lss2[1]),
Float.parseFloat(lss2[2]));
RepeatingMod.sendMessage(Text.literal(""));
} catch (Exception e) {
e.printStackTrace();
}
}
})
.dimensions(width / 2 - 60, height / 2 + 12, 120, 20)
.tooltip(Tooltip.of(Text.translatable("text.repeating-mod.import_tooltip")))
.build();
pos_delay_slider = new SliderWidget(
width / 2 - 60, height / 2 + 34, 120, 20,
(mod.record_pos_delay < 0) ? Text.translatable("text.repeating-mod.nan_pos_delay") :
Text.translatable("text.repeating-mod.pos_delay", String.valueOf(mod.record_pos_delay)),
(mod.record_pos_delay+1d)/101d) {
width / 2 - 60, height / 2 - 32, 120, 20,
(Main.me.record_pos_delay < 0) ? Text.translatable("text.repeating-mod.nan_pos_delay") :
Text.translatable("text.repeating-mod.pos_delay", String.valueOf(Main.me.record_pos_delay)),
(Main.me.record_pos_delay+1d)/101d) {
@Override
protected void updateMessage() {
@ -191,9 +108,9 @@ public class RepeatingScreen extends Screen {
double v = value*101d-1d;
if (v <= 1) setMessage(Text.translatable("text.repeating-mod.nan_pos_delay"));
else setMessage(Text.translatable("text.repeating-mod.pos_delay", String.valueOf((long) v)));
mod.record_pos_delay = (long) v;
mod.conf.data.put("record_pos_delay",String.valueOf(mod.record_pos_delay));
mod.conf.save();
Main.me.record_pos_delay = (long) v;
Main.me.conf.data.put("record_pos_delay",String.valueOf(Main.me.record_pos_delay));
Main.me.conf.save();
}
@Override
@ -216,15 +133,57 @@ public class RepeatingScreen extends Screen {
};
pos_delay_slider.setTooltip(Tooltip.of(Text.translatable("text.repeating-mod.pos_delay_tooltip")));
import_btn = ButtonWidget.builder(Text.translatable("text.repeating-mod.import"), button -> {
new Thread(() -> {
FileDialog fd = new FileDialog((java.awt.Frame) null);
fd.setMultipleMode(true);
fd.setName("Choose record files");
fd.setTitle("Choose record files");
fd.setFilenameFilter((dir, name) -> name.endsWith(".rrm"));
fd.setVisible(true);
File[] files = fd.getFiles();
if (files != null) {
for (File file : files) {
try {
Main.me.record_list.addRecord(file);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}}).start();
})
.dimensions(width / 2 - 60, height / 2 - 10, 120, 20)
.tooltip(Tooltip.of(Text.translatable("text.repeating-mod.import_tooltip")))
.build();
Main.me.record_list.getWidget().setX(width / 2 - Main.me.record_list.getWidget().getWidth() / 2);
Main.me.record_list.getWidget().setY(height / 2 + 12);
Main.me.record_list.getWidget().init(this);
was_build = true;
update_btns();
updateButtons();
addDrawableChild(replay_btn);
addDrawableChild(loop_btn);
addDrawableChild(record_btn);
addDrawableChild(export_btn);
addDrawableChild(import_btn);
addDrawableChild(pos_delay_slider);
}
public <T extends Element & Drawable & Selectable> T addDrawableChild(T drawableElement) {
return super.addDrawableChild(drawableElement);
}
public <T extends Drawable> T addDrawable(T drawable) {
return super.addDrawable(drawable);
}
public <T extends Element & Selectable> T addSelectableChild(T child) {
return super.addSelectableChild(child);
}
public void remove(Element child) {
super.remove(child);
}
}