Skip to content

Commit 194cdac

Browse files
committed
config sharing improvements
- fixed a bug where pasted settings wouldn't copy default setting values - added buttons to copy and paste on module and color setting screens - added a popup to inform about this feature
1 parent a7cd68d commit 194cdac

File tree

12 files changed

+180
-161
lines changed

12 files changed

+180
-161
lines changed

src/main/java/meteordevelopment/meteorclient/gui/WidgetScreen.java

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -217,17 +217,8 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
217217

218218
boolean control = MinecraftClient.IS_SYSTEM_MAC ? modifiers == GLFW_MOD_SUPER : modifiers == GLFW_MOD_CONTROL;
219219

220-
if (control && keyCode == GLFW_KEY_C && toClipboard()) {
221-
return true;
222-
} else if (control && keyCode == GLFW_KEY_V && fromClipboard()) {
223-
reload();
224-
if (parent instanceof WidgetScreen wScreen) {
225-
wScreen.reload();
226-
}
227-
return true;
228-
}
229-
230-
return false;
220+
return (control && keyCode == GLFW_KEY_C && toClipboard())
221+
|| (control && keyCode == GLFW_KEY_V && fromClipboard());
231222
}
232223

233224
public void keyRepeated(int key, int modifiers) {

src/main/java/meteordevelopment/meteorclient/gui/renderer/GuiRenderer.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ public class GuiRenderer {
4242
public static GuiTexture EDIT;
4343
public static GuiTexture RESET;
4444
public static GuiTexture FAVORITE_NO, FAVORITE_YES;
45+
public static GuiTexture COPY, PASTE;
4546

4647
public GuiTheme theme;
4748

@@ -75,6 +76,9 @@ public static void init() {
7576
FAVORITE_NO = addTexture(MeteorClient.identifier("textures/icons/gui/favorite_no.png"));
7677
FAVORITE_YES = addTexture(MeteorClient.identifier("textures/icons/gui/favorite_yes.png"));
7778

79+
COPY = addTexture(MeteorClient.identifier("textures/icons/gui/copy.png"));
80+
PASTE = addTexture(MeteorClient.identifier("textures/icons/gui/paste.png"));
81+
7882
TEXTURE = TEXTURE_PACKER.pack();
7983
}
8084

src/main/java/meteordevelopment/meteorclient/gui/screens/ModuleScreen.java

Lines changed: 41 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import meteordevelopment.meteorclient.events.meteor.ActiveModulesChangedEvent;
1010
import meteordevelopment.meteorclient.events.meteor.ModuleBindChangedEvent;
1111
import meteordevelopment.meteorclient.gui.GuiTheme;
12+
import meteordevelopment.meteorclient.gui.WidgetScreen;
1213
import meteordevelopment.meteorclient.gui.WindowScreen;
1314
import meteordevelopment.meteorclient.gui.renderer.GuiRenderer;
1415
import meteordevelopment.meteorclient.gui.utils.Cell;
@@ -23,6 +24,7 @@
2324
import meteordevelopment.meteorclient.systems.modules.Module;
2425
import meteordevelopment.meteorclient.systems.modules.Modules;
2526
import meteordevelopment.meteorclient.utils.misc.NbtUtils;
27+
import meteordevelopment.meteorclient.utils.render.prompts.OkPrompt;
2628
import meteordevelopment.orbit.EventHandler;
2729
import net.minecraft.nbt.NbtCompound;
2830

@@ -47,6 +49,12 @@ public void initWidgets() {
4749
// Description
4850
add(theme.label(module.description, getWindowWidth() / 2.0));
4951

52+
if (module.addon != null && module.addon != MeteorClient.ADDON) {
53+
WHorizontalList addon = add(theme.horizontalList()).expandX().widget();
54+
addon.add(theme.label("From: ").color(theme.textSecondaryColor())).widget();
55+
addon.add(theme.label(module.addon.name).color(module.addon.color)).widget();
56+
}
57+
5058
// Settings
5159
if (!module.settings.groups.isEmpty()) {
5260
settingsContainer = add(theme.verticalList()).expandX().widget();
@@ -101,10 +109,22 @@ public void initWidgets() {
101109
if (module.isActive() != active.checked) module.toggle();
102110
};
103111

104-
if (module.addon != null && module.addon != MeteorClient.ADDON) {
105-
bottom.add(theme.label("From: ")).right().widget();
106-
bottom.add(theme.label(module.addon.name).color(theme.textSecondaryColor())).right().widget();
107-
}
112+
// Config sharing
113+
WHorizontalList sharing = bottom.add(theme.horizontalList()).right().widget();
114+
WButton copy = sharing.add(theme.button(GuiRenderer.COPY)).widget();
115+
copy.action = () -> {
116+
if (toClipboard()) {
117+
OkPrompt.create()
118+
.title("Module copied!")
119+
.message("The settings for this module are now in your clipboard.")
120+
.message("You can also copy settings using Ctrl+C.")
121+
.message("Settings can be imported using Ctrl+V or the paste button.")
122+
.id("config-sharing-guide")
123+
.show();
124+
}
125+
};
126+
WButton paste = sharing.add(theme.button(GuiRenderer.PASTE)).widget();
127+
paste.action = this::fromClipboard;
108128
}
109129

110130
@Override
@@ -131,18 +151,29 @@ private void onActiveModulesChanged(ActiveModulesChangedEvent event) {
131151

132152
@Override
133153
public boolean toClipboard() {
134-
return NbtUtils.toClipboard(module.title, module.toTag());
154+
NbtCompound tag = new NbtCompound();
155+
156+
tag.putString("name", module.name);
157+
NbtCompound settingsTag = module.settings.toTag();
158+
if (!settingsTag.isEmpty()) tag.put("settings", settingsTag);
159+
160+
return NbtUtils.toClipboard(tag);
135161
}
136162

137163
@Override
138164
public boolean fromClipboard() {
139-
NbtCompound clipboard = NbtUtils.fromClipboard(module.toTag());
165+
NbtCompound tag = NbtUtils.fromClipboard();
166+
if (tag == null
167+
|| !tag.contains("name")
168+
|| !tag.getString("name").equals(module.name)) return false;
169+
170+
module.settings.fromTag(tag.getCompound("settings"));
140171

141-
if (clipboard != null) {
142-
module.fromTag(clipboard);
143-
return true;
172+
if (parent instanceof WidgetScreen p) {
173+
p.reload();
144174
}
175+
reload();
145176

146-
return false;
177+
return true;
147178
}
148179
}

src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ColorSettingScreen.java

Lines changed: 71 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package meteordevelopment.meteorclient.gui.screens.settings;
77

88
import meteordevelopment.meteorclient.gui.GuiTheme;
9+
import meteordevelopment.meteorclient.gui.WidgetScreen;
910
import meteordevelopment.meteorclient.gui.WindowScreen;
1011
import meteordevelopment.meteorclient.gui.renderer.GuiRenderer;
1112
import meteordevelopment.meteorclient.gui.widgets.WQuad;
@@ -16,6 +17,7 @@
1617
import meteordevelopment.meteorclient.gui.widgets.pressable.WButton;
1718
import meteordevelopment.meteorclient.gui.widgets.pressable.WCheckbox;
1819
import meteordevelopment.meteorclient.settings.Setting;
20+
import meteordevelopment.meteorclient.utils.misc.NbtUtils;
1921
import meteordevelopment.meteorclient.utils.render.color.Color;
2022
import meteordevelopment.meteorclient.utils.render.color.SettingColor;
2123
import net.minecraft.util.math.MathHelper;
@@ -45,66 +47,6 @@ public ColorSettingScreen(GuiTheme theme, Setting<SettingColor> setting) {
4547
this.setting = setting;
4648
}
4749

48-
@Override
49-
public boolean toClipboard() {
50-
String color = setting.get().toString().replace(" ", ",");
51-
mc.keyboard.setClipboard(color);
52-
return mc.keyboard.getClipboard().equals(color);
53-
}
54-
55-
@Override
56-
public boolean fromClipboard() {
57-
String clipboard = mc.keyboard.getClipboard().trim();
58-
SettingColor parsed;
59-
60-
if ((parsed = parseRGBA(clipboard)) != null) {
61-
setting.set(parsed);
62-
setting.get().validate();
63-
return true;
64-
}
65-
66-
if ((parsed = parseHex(clipboard)) != null) {
67-
setting.set(parsed);
68-
setting.get().validate();
69-
return true;
70-
}
71-
72-
return false;
73-
}
74-
75-
private SettingColor parseRGBA(String string) {
76-
String[] rgba = string.replaceAll("[^0-9|,]", "").split(",");
77-
if (rgba.length < 3 || rgba.length > 4) return null;
78-
79-
SettingColor color;
80-
try {
81-
color = new SettingColor(Integer.parseInt(rgba[0]), Integer.parseInt(rgba[1]), Integer.parseInt(rgba[2]));
82-
if (rgba.length == 4) color.a = Integer.parseInt(rgba[3]);
83-
}
84-
catch (NumberFormatException e) {
85-
return null;
86-
}
87-
88-
return color;
89-
}
90-
91-
private SettingColor parseHex(String string) {
92-
if (!string.startsWith("#")) return null;
93-
String hex = string.toLowerCase().replaceAll("[^0-9a-f]", "");
94-
if (hex.length() != 6 && hex.length() != 8) return null;
95-
96-
SettingColor color;
97-
try {
98-
color = new SettingColor(Integer.parseInt(hex.substring(0, 2), 16), Integer.parseInt(hex.substring(2, 4), 16), Integer.parseInt(hex.substring(4, 6), 16));
99-
if (hex.length() == 8) color.a = Integer.parseInt(hex.substring(6, 8), 16);
100-
}
101-
catch (NumberFormatException e) {
102-
return null;
103-
}
104-
105-
return color;
106-
}
107-
10850
@Override
10951
public void initWidgets() {
11052
// Top
@@ -152,6 +94,12 @@ public void initWidgets() {
15294
WButton backButton = bottomList.add(theme.button("Back")).expandX().widget();
15395
backButton.action = this::close;
15496

97+
WButton copyButton = bottomList.add(theme.button(GuiRenderer.COPY)).widget();
98+
copyButton.action = this::toClipboard;
99+
100+
WButton pasteButton = bottomList.add(theme.button(GuiRenderer.PASTE)).widget();
101+
pasteButton.action = this::fromClipboard;
102+
155103
WButton resetButton = bottomList.add(theme.button(GuiRenderer.RESET)).widget();
156104
resetButton.action = () -> {
157105
setting.reset();
@@ -404,6 +352,69 @@ protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, doub
404352
}
405353
}
406354

355+
@Override
356+
public boolean toClipboard() {
357+
return NbtUtils.toClipboard(setting.get());
358+
}
359+
360+
@Override
361+
public boolean fromClipboard() {
362+
if (!NbtUtils.fromClipboard(setting.get())) {
363+
String clipboard = mc.keyboard.getClipboard().trim();
364+
SettingColor parsed;
365+
366+
parsed = parseRGBA(clipboard);
367+
if (parsed == null) {
368+
parsed = parseHex(clipboard);
369+
if (parsed == null) return false;
370+
}
371+
372+
setting.set(parsed);
373+
}
374+
375+
setting.get().validate();
376+
377+
if (parent instanceof WidgetScreen p) {
378+
p.reload();
379+
}
380+
reload();
381+
382+
return true;
383+
}
384+
385+
private SettingColor parseRGBA(String string) {
386+
String[] rgba = string.replaceAll("[^0-9|,]", "").split(",");
387+
if (rgba.length < 3 || rgba.length > 4) return null;
388+
389+
SettingColor color;
390+
try {
391+
color = new SettingColor(Integer.parseInt(rgba[0]), Integer.parseInt(rgba[1]), Integer.parseInt(rgba[2]));
392+
if (rgba.length == 4) color.a = Integer.parseInt(rgba[3]);
393+
}
394+
catch (NumberFormatException e) {
395+
return null;
396+
}
397+
398+
return color;
399+
}
400+
401+
private SettingColor parseHex(String string) {
402+
if (!string.startsWith("#")) return null;
403+
String hex = string.toLowerCase().replaceAll("[^0-9a-f]", "");
404+
if (hex.length() != 6 && hex.length() != 8) return null;
405+
406+
SettingColor color;
407+
try {
408+
color = new SettingColor(Integer.parseInt(hex.substring(0, 2), 16), Integer.parseInt(hex.substring(2, 4), 16), Integer.parseInt(hex.substring(4, 6), 16));
409+
if (hex.length() == 8) color.a = Integer.parseInt(hex.substring(6, 8), 16);
410+
}
411+
catch (NumberFormatException e) {
412+
return null;
413+
}
414+
415+
return color;
416+
}
417+
407418
private class WHueQuad extends WWidget {
408419
private double hueAngle;
409420
private double handleX;

src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/GuiTab.java

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@
77

88
import meteordevelopment.meteorclient.gui.GuiTheme;
99
import meteordevelopment.meteorclient.gui.GuiThemes;
10+
import meteordevelopment.meteorclient.gui.renderer.GuiRenderer;
1011
import meteordevelopment.meteorclient.gui.tabs.Tab;
1112
import meteordevelopment.meteorclient.gui.tabs.TabScreen;
1213
import meteordevelopment.meteorclient.gui.tabs.WindowTabScreen;
13-
import meteordevelopment.meteorclient.gui.widgets.containers.WTable;
14-
import meteordevelopment.meteorclient.gui.widgets.pressable.WButton;
14+
import meteordevelopment.meteorclient.gui.widgets.containers.WHorizontalList;
1515
import meteordevelopment.meteorclient.gui.widgets.input.WDropdown;
16+
import meteordevelopment.meteorclient.gui.widgets.pressable.WButton;
1617
import meteordevelopment.meteorclient.utils.misc.NbtUtils;
1718
import net.minecraft.client.gui.screen.Screen;
18-
import net.minecraft.nbt.NbtCompound;
1919

2020
import static meteordevelopment.meteorclient.MeteorClient.mc;
2121

@@ -43,38 +43,44 @@ public GuiScreen(GuiTheme theme, Tab tab) {
4343

4444
@Override
4545
public void initWidgets() {
46-
WTable table = add(theme.table()).expandX().widget();
46+
WHorizontalList opts = add(theme.horizontalList()).expandX().widget();
4747

48-
table.add(theme.label("Theme:"));
49-
WDropdown<String> themeW = table.add(theme.dropdown(GuiThemes.getNames(), GuiThemes.get().name)).widget();
48+
opts.add(theme.label("Theme:"));
49+
WDropdown<String> themeW = opts.add(theme.dropdown(GuiThemes.getNames(), GuiThemes.get().name)).widget();
5050
themeW.action = () -> {
5151
GuiThemes.select(themeW.get());
5252

5353
mc.setScreen(null);
5454
tab.openScreen(GuiThemes.get());
5555
};
5656

57-
WButton reset = add(theme.button("Reset GUI Layout")).widget();
58-
reset.action = theme::clearWindowConfigs;
57+
WButton resetLayout = opts.add(theme.button("Reset Layout")).expandX().widget();
58+
resetLayout.action = theme::clearWindowConfigs;
59+
60+
WButton reset = opts.add(theme.button("Reset Colors")).right().widget();
61+
reset.action = () -> {
62+
theme.settings.reset();
63+
mc.setScreen(null);
64+
tab.openScreen(GuiThemes.get());
65+
};
66+
67+
WButton copyButton = opts.add(theme.button(GuiRenderer.COPY)).widget();
68+
copyButton.action = this::toClipboard;
69+
70+
WButton pasteButton = opts.add(theme.button(GuiRenderer.PASTE)).right().widget();
71+
pasteButton.action = this::fromClipboard;
5972

6073
add(theme.settings(theme.settings)).expandX();
6174
}
6275

6376
@Override
6477
public boolean toClipboard() {
65-
return NbtUtils.toClipboard(theme.name + " GUI Theme", theme.toTag());
78+
return NbtUtils.toClipboard(theme);
6679
}
6780

6881
@Override
6982
public boolean fromClipboard() {
70-
NbtCompound clipboard = NbtUtils.fromClipboard(theme.toTag());
71-
72-
if (clipboard != null) {
73-
theme.fromTag(clipboard);
74-
return true;
75-
}
76-
77-
return false;
83+
return NbtUtils.fromClipboard(theme);
7884
}
7985
}
8086
}

0 commit comments

Comments
 (0)