0
0
mirror of https://github.com/Wurst-Imperium/Wurst7.git synced 2024-09-20 09:16:20 +02:00

Add "Profiles..." button to KeybindManagerScreen

This commit is contained in:
Alexander01998 2020-02-23 17:54:47 +01:00
parent 24453cf1a0
commit 7a2e6e2e74
4 changed files with 368 additions and 0 deletions

View File

@ -8,12 +8,15 @@
package net.wurstclient.keybinds;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import net.wurstclient.WurstClient;
import net.wurstclient.util.json.JsonException;
@ -79,6 +82,27 @@ public final class KeybindList
keybindsFile.save(this);
}
public Path getProfilesFolder()
{
return profilesFolder;
}
public ArrayList<Path> listProfiles()
{
if(!Files.isDirectory(profilesFolder))
return new ArrayList<>();
try(Stream<Path> files = Files.list(profilesFolder))
{
return files.filter(Files::isRegularFile)
.collect(Collectors.toCollection(() -> new ArrayList<>()));
}catch(IOException e)
{
throw new RuntimeException(e);
}
}
public void loadProfile(String fileName) throws IOException, JsonException
{
keybindsFile.loadProfile(this, profilesFolder.resolve(fileName));

View File

@ -0,0 +1,107 @@
/*
* Copyright (C) 2014 - 2020 | Alexander01998 | All rights reserved.
*
* This source code is subject to the terms of the GNU General Public
* License, version 3. If a copy of the GPL was not distributed with this
* file, You can obtain one at: https://www.gnu.org/licenses/gpl-3.0.txt
*/
package net.wurstclient.options;
import java.util.function.Consumer;
import org.lwjgl.glfw.GLFW;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.gui.widget.TextFieldWidget;
import net.minecraft.text.LiteralText;
public final class EnterProfileNameScreen extends Screen
{
private final Screen prevScreen;
private final Consumer<String> callback;
private TextFieldWidget valueField;
private ButtonWidget doneButton;
public EnterProfileNameScreen(Screen prevScreen, Consumer<String> callback)
{
super(new LiteralText(""));
this.prevScreen = prevScreen;
this.callback = callback;
}
@Override
public void init()
{
int x1 = width / 2 - 100;
int y1 = 60;
int y2 = height / 3 * 2;
TextRenderer tr = minecraft.textRenderer;
valueField = new TextFieldWidget(tr, x1, y1, 200, 20, "");
valueField.setText("");
valueField.setSelectionStart(0);
children.add(valueField);
setInitialFocus(valueField);
valueField.setSelected(true);
doneButton = new ButtonWidget(x1, y2, 200, 20, "Done", b -> done());
addButton(doneButton);
}
private void done()
{
callback.accept(valueField.getText());
minecraft.openScreen(prevScreen);
}
@Override
public boolean keyPressed(int keyCode, int scanCode, int int_3)
{
switch(keyCode)
{
case GLFW.GLFW_KEY_ENTER:
done();
break;
case GLFW.GLFW_KEY_ESCAPE:
minecraft.openScreen(prevScreen);
break;
}
return super.keyPressed(keyCode, scanCode, int_3);
}
@Override
public void tick()
{
valueField.tick();
}
@Override
public void render(int mouseX, int mouseY, float partialTicks)
{
renderBackground();
drawCenteredString(minecraft.textRenderer, "Name Your New Profile",
width / 2, 20, 0xFFFFFF);
valueField.render(mouseX, mouseY, partialTicks);
super.render(mouseX, mouseY, partialTicks);
}
@Override
public boolean isPauseScreen()
{
return false;
}
@Override
public boolean shouldCloseOnEsc()
{
return false;
}
}

View File

@ -61,6 +61,9 @@ public final class KeybindManagerScreen extends Screen
minecraft.openScreen(this);
}, new LiteralText("Are you sure you want to reset your keybinds?"),
new LiteralText("This cannot be undone!")))));
addButton(new ButtonWidget(width - 108, 8, 100, 20, "Profiles...",
b -> minecraft.openScreen(new KeybindProfilesScreen(this))));
}
private void edit()

View File

@ -0,0 +1,234 @@
/*
* Copyright (C) 2014 - 2020 | Alexander01998 | All rights reserved.
*
* This source code is subject to the terms of the GNU General Public
* License, version 3. If a copy of the GPL was not distributed with this
* file, You can obtain one at: https://www.gnu.org/licenses/gpl-3.0.txt
*/
package net.wurstclient.options;
import java.io.IOException;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import org.lwjgl.glfw.GLFW;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.gui.widget.ListWidget;
import net.minecraft.text.LiteralText;
import net.minecraft.util.Util;
import net.wurstclient.WurstClient;
import net.wurstclient.util.json.JsonException;
public final class KeybindProfilesScreen extends Screen
{
private final Screen prevScreen;
private ListGui listGui;
private ButtonWidget loadButton;
public KeybindProfilesScreen(Screen prevScreen)
{
super(new LiteralText(""));
this.prevScreen = prevScreen;
}
@Override
public void init()
{
listGui = new ListGui(minecraft, this,
WurstClient.INSTANCE.getKeybinds().listProfiles());
addButton(
new ButtonWidget(8, 8, 100, 20, "Open Folder", b -> openFolder()));
addButton(new ButtonWidget(width / 2 - 154, height - 48, 100, 20,
"New Profile", b -> minecraft.openScreen(
new EnterProfileNameScreen(this, this::newProfile))));
loadButton = addButton(new ButtonWidget(width / 2 - 50, height - 48,
100, 20, "Load", b -> loadSelected()));
addButton(new ButtonWidget(width / 2 + 54, height - 48, 100, 20,
"Cancel", b -> openPrevScreen()));
}
private void openFolder()
{
Util.getOperatingSystem().open(
WurstClient.INSTANCE.getKeybinds().getProfilesFolder().toFile());
}
private void newProfile(String name)
{
if(!name.endsWith(".json"))
name += ".json";
try
{
WurstClient.INSTANCE.getKeybinds().saveProfile(name);
}catch(IOException | JsonException e)
{
throw new RuntimeException(e);
}
}
private void loadSelected()
{
if(listGui.selected < 0 || listGui.selected >= listGui.list.size())
{
openPrevScreen();
return;
}
Path path = listGui.list.get(listGui.selected);
String fileName = "" + path.getFileName();
try
{
WurstClient.INSTANCE.getKeybinds().loadProfile(fileName);
openPrevScreen();
}catch(IOException | JsonException e)
{
e.printStackTrace();
return;
}
}
private void openPrevScreen()
{
minecraft.openScreen(prevScreen);
}
@Override
public boolean mouseClicked(double mouseX, double mouseY, int mouseButton)
{
boolean childClicked = super.mouseClicked(mouseX, mouseY, mouseButton);
listGui.mouseClicked(mouseX, mouseY, mouseButton);
if(!childClicked && (mouseX < (width - 220) / 2
|| mouseX > width / 2 + 129 || mouseY < 32 || mouseY > height - 64))
listGui.selected = -1;
return childClicked;
}
@Override
public boolean mouseDragged(double double_1, double double_2, int int_1,
double double_3, double double_4)
{
listGui.mouseDragged(double_1, double_2, int_1, double_3, double_4);
return super.mouseDragged(double_1, double_2, int_1, double_3,
double_4);
}
@Override
public boolean mouseReleased(double double_1, double double_2, int int_1)
{
listGui.mouseReleased(double_1, double_2, int_1);
return super.mouseReleased(double_1, double_2, int_1);
}
@Override
public boolean mouseScrolled(double double_1, double double_2,
double double_3)
{
listGui.mouseScrolled(double_1, double_2, double_3);
return super.mouseScrolled(double_1, double_2, double_3);
}
@Override
public boolean keyPressed(int keyCode, int scanCode, int int_3)
{
if(keyCode == GLFW.GLFW_KEY_ENTER)
loadSelected();
else if(keyCode == GLFW.GLFW_KEY_ESCAPE)
openPrevScreen();
return super.keyPressed(keyCode, scanCode, int_3);
}
@Override
public void tick()
{
loadButton.active =
listGui.selected >= 0 && listGui.selected < listGui.list.size();
}
@Override
public void render(int mouseX, int mouseY, float partialTicks)
{
renderBackground();
listGui.render(mouseX, mouseY, partialTicks);
drawCenteredString(minecraft.textRenderer, "Keybind Profiles",
width / 2, 12, 0xffffff);
super.render(mouseX, mouseY, partialTicks);
if(loadButton.isHovered() && !loadButton.active)
renderTooltip("You must first select a file.", mouseX, mouseY);
}
private static class ListGui extends ListWidget
{
private final MinecraftClient mc;
private final List<Path> list;
private int selected = -1;
public ListGui(MinecraftClient mc, KeybindProfilesScreen screen,
ArrayList<Path> list)
{
super(mc, screen.width, screen.height, 36, screen.height - 64, 20);
this.mc = mc;
this.list = list;
}
@Override
protected int getItemCount()
{
return list.size();
}
@Override
protected boolean selectItem(int index, int int_2, double var3,
double var4)
{
if(index >= 0 && index < list.size())
selected = index;
return true;
}
@Override
protected boolean isSelectedItem(int index)
{
return index == selected;
}
@Override
protected void renderBackground()
{
}
@Override
protected void renderItem(int index, int x, int y, int var4, int var5,
int var6, float partialTicks)
{
TextRenderer fr = mc.textRenderer;
Path path = list.get(index);
fr.draw("" + path.getFileName(), x + 28, y, 0xf0f0f0);
fr.draw("" + minecraft.runDirectory.toPath().relativize(path),
x + 28, y + 9, 0xa0a0a0);
}
}
}