179 lines
8.8 KiB
Java
179 lines
8.8 KiB
Java
package net.minecraft.client.gui.screens.worldselection;
|
|
|
|
import com.mojang.logging.LogUtils;
|
|
import it.unimi.dsi.fastutil.booleans.BooleanConsumer;
|
|
import java.io.IOException;
|
|
import java.nio.file.Files;
|
|
import java.nio.file.Path;
|
|
import net.minecraft.ChatFormatting;
|
|
import net.minecraft.FileUtil;
|
|
import net.minecraft.Util;
|
|
import net.minecraft.client.Minecraft;
|
|
import net.minecraft.client.gui.Font;
|
|
import net.minecraft.client.gui.GuiGraphics;
|
|
import net.minecraft.client.gui.components.AbstractWidget;
|
|
import net.minecraft.client.gui.components.Button;
|
|
import net.minecraft.client.gui.components.EditBox;
|
|
import net.minecraft.client.gui.components.StringWidget;
|
|
import net.minecraft.client.gui.components.events.GuiEventListener;
|
|
import net.minecraft.client.gui.components.toasts.SystemToast;
|
|
import net.minecraft.client.gui.layouts.FrameLayout;
|
|
import net.minecraft.client.gui.layouts.LinearLayout;
|
|
import net.minecraft.client.gui.layouts.SpacerElement;
|
|
import net.minecraft.client.gui.screens.BackupConfirmScreen;
|
|
import net.minecraft.client.gui.screens.Screen;
|
|
import net.minecraft.nbt.NbtException;
|
|
import net.minecraft.nbt.ReportedNbtException;
|
|
import net.minecraft.network.chat.CommonComponents;
|
|
import net.minecraft.network.chat.Component;
|
|
import net.minecraft.util.Mth;
|
|
import net.minecraft.util.StringUtil;
|
|
import net.minecraft.world.level.storage.LevelResource;
|
|
import net.minecraft.world.level.storage.LevelStorageSource;
|
|
import net.minecraft.world.level.storage.LevelSummary;
|
|
import net.minecraftforge.api.distmarker.Dist;
|
|
import net.minecraftforge.api.distmarker.OnlyIn;
|
|
import org.apache.commons.io.FileUtils;
|
|
import org.slf4j.Logger;
|
|
|
|
@OnlyIn(Dist.CLIENT)
|
|
public class EditWorldScreen extends Screen {
|
|
private static final Logger LOGGER = LogUtils.getLogger();
|
|
private static final Component NAME_LABEL = Component.translatable("selectWorld.enterName").withStyle(ChatFormatting.GRAY);
|
|
private static final Component RESET_ICON_BUTTON = Component.translatable("selectWorld.edit.resetIcon");
|
|
private static final Component FOLDER_BUTTON = Component.translatable("selectWorld.edit.openFolder");
|
|
private static final Component BACKUP_BUTTON = Component.translatable("selectWorld.edit.backup");
|
|
private static final Component BACKUP_FOLDER_BUTTON = Component.translatable("selectWorld.edit.backupFolder");
|
|
private static final Component OPTIMIZE_BUTTON = Component.translatable("selectWorld.edit.optimize");
|
|
private static final Component OPTIMIZE_TITLE = Component.translatable("optimizeWorld.confirm.title");
|
|
private static final Component OPTIMIIZE_DESCRIPTION = Component.translatable("optimizeWorld.confirm.description");
|
|
private static final Component OPTIMIIZE_CONFIRMATION = Component.translatable("optimizeWorld.confirm.proceed");
|
|
private static final Component SAVE_BUTTON = Component.translatable("selectWorld.edit.save");
|
|
private static final int DEFAULT_WIDTH = 200;
|
|
private static final int VERTICAL_SPACING = 4;
|
|
private static final int HALF_WIDTH = 98;
|
|
private final LinearLayout layout = LinearLayout.vertical().spacing(5);
|
|
private final BooleanConsumer callback;
|
|
private final LevelStorageSource.LevelStorageAccess levelAccess;
|
|
private final EditBox nameEdit;
|
|
|
|
public static EditWorldScreen create(Minecraft p_312937_, LevelStorageSource.LevelStorageAccess p_310908_, BooleanConsumer p_311675_) throws IOException {
|
|
LevelSummary levelsummary = p_310908_.getSummary(p_310908_.getDataTag());
|
|
return new EditWorldScreen(p_312937_, p_310908_, levelsummary.getLevelName(), p_311675_);
|
|
}
|
|
|
|
private EditWorldScreen(Minecraft p_309397_, LevelStorageSource.LevelStorageAccess p_101253_, String p_312996_, BooleanConsumer p_101252_) {
|
|
super(Component.translatable("selectWorld.edit.title"));
|
|
this.callback = p_101252_;
|
|
this.levelAccess = p_101253_;
|
|
Font font = p_309397_.font;
|
|
this.layout.addChild(new SpacerElement(200, 20));
|
|
this.layout.addChild(new StringWidget(NAME_LABEL, font));
|
|
this.nameEdit = this.layout.addChild(new EditBox(font, 200, 20, NAME_LABEL));
|
|
this.nameEdit.setValue(p_312996_);
|
|
LinearLayout linearlayout = LinearLayout.horizontal().spacing(4);
|
|
Button button = linearlayout.addChild(Button.builder(SAVE_BUTTON, p_325437_ -> this.onRename(this.nameEdit.getValue())).width(98).build());
|
|
linearlayout.addChild(Button.builder(CommonComponents.GUI_CANCEL, p_308233_ -> this.onClose()).width(98).build());
|
|
this.nameEdit.setResponder(p_325436_ -> button.active = !StringUtil.isBlank(p_325436_));
|
|
this.layout.addChild(Button.builder(RESET_ICON_BUTTON, p_308218_ -> {
|
|
p_101253_.getIconFile().ifPresent(p_182594_ -> FileUtils.deleteQuietly(p_182594_.toFile()));
|
|
p_308218_.active = false;
|
|
}).width(200).build()).active = p_101253_.getIconFile().filter(p_182587_ -> Files.isRegularFile(p_182587_)).isPresent();
|
|
this.layout
|
|
.addChild(
|
|
Button.builder(FOLDER_BUTTON, p_340826_ -> Util.getPlatform().openPath(p_101253_.getLevelPath(LevelResource.ROOT))).width(200).build()
|
|
);
|
|
this.layout.addChild(Button.builder(BACKUP_BUTTON, p_308216_ -> {
|
|
boolean flag = makeBackupAndShowToast(p_101253_);
|
|
this.callback.accept(!flag);
|
|
}).width(200).build());
|
|
this.layout.addChild(Button.builder(BACKUP_FOLDER_BUTTON, p_340828_ -> {
|
|
LevelStorageSource levelstoragesource = p_309397_.getLevelSource();
|
|
Path path = levelstoragesource.getBackupPath();
|
|
|
|
try {
|
|
FileUtil.createDirectoriesSafe(path);
|
|
} catch (IOException ioexception) {
|
|
throw new RuntimeException(ioexception);
|
|
}
|
|
|
|
Util.getPlatform().openPath(path);
|
|
}).width(200).build());
|
|
this.layout
|
|
.addChild(
|
|
Button.builder(OPTIMIZE_BUTTON, p_357737_ -> p_309397_.setScreen(new BackupConfirmScreen(() -> p_309397_.setScreen(this), (p_308228_, p_308229_) -> {
|
|
if (p_308228_) {
|
|
makeBackupAndShowToast(p_101253_);
|
|
}
|
|
|
|
p_309397_.setScreen(OptimizeWorldScreen.create(p_309397_, this.callback, p_309397_.getFixerUpper(), p_101253_, p_308229_));
|
|
}, OPTIMIZE_TITLE, OPTIMIIZE_DESCRIPTION, OPTIMIIZE_CONFIRMATION, true))).width(200).build()
|
|
);
|
|
this.layout.addChild(new SpacerElement(200, 20));
|
|
this.layout.addChild(linearlayout);
|
|
this.layout.visitWidgets(p_325434_ -> {
|
|
AbstractWidget abstractwidget = this.addRenderableWidget(p_325434_);
|
|
});
|
|
}
|
|
|
|
@Override
|
|
protected void setInitialFocus() {
|
|
this.setInitialFocus(this.nameEdit);
|
|
}
|
|
|
|
@Override
|
|
protected void init() {
|
|
this.repositionElements();
|
|
}
|
|
|
|
@Override
|
|
protected void repositionElements() {
|
|
this.layout.arrangeElements();
|
|
FrameLayout.centerInRectangle(this.layout, this.getRectangle());
|
|
}
|
|
|
|
@Override
|
|
public void onClose() {
|
|
this.callback.accept(false);
|
|
}
|
|
|
|
private void onRename(String p_312476_) {
|
|
try {
|
|
this.levelAccess.renameLevel(p_312476_);
|
|
} catch (NbtException | ReportedNbtException | IOException ioexception) {
|
|
LOGGER.error("Failed to access world '{}'", this.levelAccess.getLevelId(), ioexception);
|
|
SystemToast.onWorldAccessFailure(this.minecraft, this.levelAccess.getLevelId());
|
|
}
|
|
|
|
this.callback.accept(true);
|
|
}
|
|
|
|
public static boolean makeBackupAndShowToast(LevelStorageSource.LevelStorageAccess p_101259_) {
|
|
long i = 0L;
|
|
IOException ioexception = null;
|
|
|
|
try {
|
|
i = p_101259_.makeWorldBackup();
|
|
} catch (IOException ioexception1) {
|
|
ioexception = ioexception1;
|
|
}
|
|
|
|
if (ioexception != null) {
|
|
Component component2 = Component.translatable("selectWorld.edit.backupFailed");
|
|
Component component3 = Component.literal(ioexception.getMessage());
|
|
Minecraft.getInstance().getToastManager().addToast(new SystemToast(SystemToast.SystemToastId.WORLD_BACKUP, component2, component3));
|
|
return false;
|
|
} else {
|
|
Component component = Component.translatable("selectWorld.edit.backupCreated", p_101259_.getLevelId());
|
|
Component component1 = Component.translatable("selectWorld.edit.backupSize", Mth.ceil(i / 1048576.0));
|
|
Minecraft.getInstance().getToastManager().addToast(new SystemToast(SystemToast.SystemToastId.WORLD_BACKUP, component, component1));
|
|
return true;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void render(GuiGraphics p_281742_, int p_101265_, int p_101266_, float p_101267_) {
|
|
super.render(p_281742_, p_101265_, p_101266_, p_101267_);
|
|
p_281742_.drawCenteredString(this.font, this.title, this.width / 2, 15, 16777215);
|
|
}
|
|
} |