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:
parent
24453cf1a0
commit
7a2e6e2e74
@ -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));
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
@ -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()
|
||||
|
234
src/main/java/net/wurstclient/options/KeybindProfilesScreen.java
Normal file
234
src/main/java/net/wurstclient/options/KeybindProfilesScreen.java
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user