Skip to content

Commit bcdbcc7

Browse files
authored
[feat] Prevent misclicks on delete buttons (#5636)
1 parent 22aa269 commit bcdbcc7

12 files changed

Lines changed: 177 additions & 11 deletions

File tree

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,16 @@ public WButton button(GuiTexture texture) {
8888
return button(null, texture);
8989
}
9090

91+
protected abstract WConfirmedButton confirmedButton(String text, String confirmText, GuiTexture texture);
92+
public WConfirmedButton confirmedButton(String text, String confirmText) {
93+
return confirmedButton(text, confirmText, null);
94+
}
95+
public WConfirmedButton confirmedButton(GuiTexture texture) {
96+
return confirmedButton(null, null, texture);
97+
}
98+
9199
public abstract WMinus minus();
100+
public abstract WConfirmedMinus confirmedMinus();
92101
public abstract WPlus plus();
93102

94103
public abstract WCheckbox checkbox(boolean checked);

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import meteordevelopment.meteorclient.gui.tabs.WindowTabScreen;
1414
import meteordevelopment.meteorclient.gui.widgets.containers.WTable;
1515
import meteordevelopment.meteorclient.gui.widgets.pressable.WButton;
16-
import meteordevelopment.meteorclient.gui.widgets.pressable.WMinus;
16+
import meteordevelopment.meteorclient.gui.widgets.pressable.WConfirmedMinus;
1717
import meteordevelopment.meteorclient.settings.Settings;
1818
import meteordevelopment.meteorclient.systems.macros.Macro;
1919
import meteordevelopment.meteorclient.systems.macros.Macros;
@@ -63,7 +63,7 @@ private void initTable(WTable table) {
6363
WButton edit = table.add(theme.button(GuiRenderer.EDIT)).expandCellX().right().widget();
6464
edit.action = () -> mc.setScreen(new EditMacroScreen(theme, macro, this::reload));
6565

66-
WMinus remove = table.add(theme.minus()).widget();
66+
WConfirmedMinus remove = table.add(theme.confirmedMinus()).widget();
6767
remove.action = () -> {
6868
Macros.get().remove(macro);
6969
reload();

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
import meteordevelopment.meteorclient.gui.widgets.containers.WContainer;
1515
import meteordevelopment.meteorclient.gui.widgets.containers.WTable;
1616
import meteordevelopment.meteorclient.gui.widgets.pressable.WButton;
17+
import meteordevelopment.meteorclient.gui.widgets.pressable.WConfirmedButton;
18+
import meteordevelopment.meteorclient.gui.widgets.pressable.WConfirmedMinus;
1719
import meteordevelopment.meteorclient.gui.widgets.pressable.WMinus;
1820
import meteordevelopment.meteorclient.systems.profiles.Profile;
1921
import meteordevelopment.meteorclient.systems.profiles.Profiles;
@@ -65,16 +67,17 @@ private void initTable(WTable table) {
6567
for (Profile profile : Profiles.get()) {
6668
table.add(theme.label(profile.name.get())).expandCellX();
6769

68-
WButton save = table.add(theme.button("Save")).widget();
70+
WConfirmedButton save = theme.confirmedButton("Save", "Confirm");;
6971
save.action = profile::save;
72+
table.add(save).right();
7073

7174
WButton load = table.add(theme.button("Load")).widget();
7275
load.action = profile::load;
7376

7477
WButton edit = table.add(theme.button(GuiRenderer.EDIT)).widget();
7578
edit.action = () -> mc.setScreen(new EditProfileScreen(theme, profile, this::reload));
7679

77-
WMinus remove = table.add(theme.minus()).widget();
80+
WConfirmedMinus remove = table.add(theme.confirmedMinus()).widget();
7881
remove.action = () -> {
7982
Profiles.get().remove(profile);
8083
reload();

src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorGuiTheme.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,11 +210,21 @@ protected WButton button(String text, GuiTexture texture) {
210210
return w(new WMeteorButton(text, texture));
211211
}
212212

213+
@Override
214+
protected WConfirmedButton confirmedButton(String text, String confirmText, GuiTexture texture) {
215+
return w(new WMeteorConfirmedButton(text, confirmText, texture));
216+
}
217+
213218
@Override
214219
public WMinus minus() {
215220
return w(new WMeteorMinus());
216221
}
217222

223+
@Override
224+
public WConfirmedMinus confirmedMinus() {
225+
return w(new WMeteorConfirmedMinus());
226+
}
227+
218228
@Override
219229
public WPlus plus() {
220230
return w(new WMeteorPlus());

src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorWidget.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,20 @@ default MeteorGuiTheme theme() {
1515
return (MeteorGuiTheme) getTheme();
1616
}
1717

18-
default void renderBackground(GuiRenderer renderer, WWidget widget, boolean pressed, boolean mouseOver) {
18+
default void renderBackground(GuiRenderer renderer, WWidget widget, Color outlineColor, Color backgroundColor) {
1919
MeteorGuiTheme theme = theme();
2020
double s = theme.scale(2);
2121

22-
renderer.quad(widget.x + s, widget.y + s, widget.width - s * 2, widget.height - s * 2, theme.backgroundColor.get(pressed, mouseOver));
22+
renderer.quad(widget.x + s, widget.y + s, widget.width - s * 2, widget.height - s * 2, backgroundColor);
2323

24-
Color outlineColor = theme.outlineColor.get(pressed, mouseOver);
2524
renderer.quad(widget.x, widget.y, widget.width, s, outlineColor);
2625
renderer.quad(widget.x, widget.y + widget.height - s, widget.width, s, outlineColor);
2726
renderer.quad(widget.x, widget.y + s, s, widget.height - s * 2, outlineColor);
2827
renderer.quad(widget.x + widget.width - s, widget.y + s, s, widget.height - s * 2, outlineColor);
2928
}
29+
30+
default void renderBackground(GuiRenderer renderer, WWidget widget, boolean pressed, boolean mouseOver) {
31+
MeteorGuiTheme theme = theme();
32+
renderBackground(renderer, widget, theme.outlineColor.get(pressed, mouseOver), theme.backgroundColor.get(pressed, mouseOver));
33+
}
3034
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client).
3+
* Copyright (c) Meteor Development.
4+
*/
5+
6+
package meteordevelopment.meteorclient.gui.themes.meteor.widgets.pressable;
7+
8+
import meteordevelopment.meteorclient.gui.renderer.GuiRenderer;
9+
import meteordevelopment.meteorclient.gui.renderer.packer.GuiTexture;
10+
import meteordevelopment.meteorclient.gui.themes.meteor.MeteorGuiTheme;
11+
import meteordevelopment.meteorclient.gui.themes.meteor.MeteorWidget;
12+
import meteordevelopment.meteorclient.gui.widgets.pressable.WButton;
13+
import meteordevelopment.meteorclient.gui.widgets.pressable.WConfirmedButton;
14+
import meteordevelopment.meteorclient.utils.render.color.Color;
15+
16+
public class WMeteorConfirmedButton extends WConfirmedButton implements MeteorWidget {
17+
public WMeteorConfirmedButton(String text, String confirmText, GuiTexture texture) {
18+
super(text, confirmText, texture);
19+
}
20+
21+
@Override
22+
protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) {
23+
MeteorGuiTheme theme = theme();
24+
double pad = pad();
25+
26+
Color outline = theme.outlineColor.get(pressed, mouseOver);
27+
Color fg = pressedOnce ? theme.backgroundColor.get(pressed, mouseOver) : theme.textColor.get();
28+
Color bg = pressedOnce ? theme.textColor.get() : theme.backgroundColor.get(pressed, mouseOver);
29+
30+
renderBackground(renderer, this, outline, bg);
31+
32+
String text = getText();
33+
34+
if (text != null) {
35+
renderer.text(text, x + width / 2 - textWidth / 2, y + pad, fg, false);
36+
}
37+
else {
38+
double ts = theme.textHeight();
39+
renderer.quad(x + width / 2 - ts / 2, y + pad, ts, ts, texture, fg);
40+
}
41+
}
42+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/*
2+
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client).
3+
* Copyright (c) Meteor Development.
4+
*/
5+
6+
package meteordevelopment.meteorclient.gui.themes.meteor.widgets.pressable;
7+
8+
import meteordevelopment.meteorclient.gui.renderer.GuiRenderer;
9+
import meteordevelopment.meteorclient.gui.themes.meteor.MeteorGuiTheme;
10+
import meteordevelopment.meteorclient.gui.themes.meteor.MeteorWidget;
11+
import meteordevelopment.meteorclient.gui.widgets.pressable.WConfirmedMinus;
12+
import meteordevelopment.meteorclient.utils.render.color.Color;
13+
14+
public class WMeteorConfirmedMinus extends WConfirmedMinus implements MeteorWidget {
15+
@Override
16+
protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) {
17+
MeteorGuiTheme theme = theme();
18+
double pad = pad();
19+
double s = theme.scale(3);
20+
21+
Color outline = theme.outlineColor.get(pressed, mouseOver);
22+
Color fg = pressedOnce ? theme.backgroundColor.get(pressed, mouseOver) : theme().minusColor.get();
23+
Color bg = pressedOnce ? theme().minusColor.get() : theme.backgroundColor.get(pressed, mouseOver);
24+
25+
renderBackground(renderer, this, outline, bg);
26+
renderer.quad(x + pad, y + height / 2 - s / 2, width - pad * 2, s, fg);
27+
}
28+
}

src/main/java/meteordevelopment/meteorclient/gui/widgets/WAccount.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import meteordevelopment.meteorclient.gui.screens.accounts.AccountInfoScreen;
1010
import meteordevelopment.meteorclient.gui.widgets.containers.WHorizontalList;
1111
import meteordevelopment.meteorclient.gui.widgets.pressable.WButton;
12-
import meteordevelopment.meteorclient.gui.widgets.pressable.WMinus;
12+
import meteordevelopment.meteorclient.gui.widgets.pressable.WConfirmedMinus;
1313
import meteordevelopment.meteorclient.systems.accounts.Account;
1414
import meteordevelopment.meteorclient.systems.accounts.Accounts;
1515
import meteordevelopment.meteorclient.systems.accounts.TokenAccount;
@@ -73,7 +73,7 @@ public void init() {
7373
};
7474

7575
// Remove
76-
WMinus remove = add(theme.minus()).widget();
76+
WConfirmedMinus remove = add(theme.confirmedMinus()).widget();
7777
remove.action = () -> {
7878
Accounts.get().remove(account);
7979
if (refreshScreenAction != null) refreshScreenAction.run();

src/main/java/meteordevelopment/meteorclient/gui/widgets/pressable/WButton.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ public WButton(String text, GuiTexture texture) {
2222
protected void onCalculateSize() {
2323
double pad = pad();
2424

25+
String text = getText();
26+
2527
if (text != null) {
2628
textWidth = theme.textWidth(text);
2729

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client).
3+
* Copyright (c) Meteor Development.
4+
*/
5+
6+
package meteordevelopment.meteorclient.gui.widgets.pressable;
7+
8+
import meteordevelopment.meteorclient.gui.renderer.packer.GuiTexture;
9+
10+
public abstract class WConfirmedButton extends WButton {
11+
12+
protected boolean pressedOnce = false;
13+
protected String confirmText;
14+
15+
public WConfirmedButton(String text, String confirmText, GuiTexture texture) {
16+
super(text, texture);
17+
this.confirmText = confirmText;
18+
}
19+
20+
@Override
21+
public boolean onMouseClicked(double mouseX, double mouseY, int button, boolean used) {
22+
boolean pressed = super.onMouseClicked(mouseX, mouseY, button, used);
23+
if (!pressed) {
24+
pressedOnce = false;
25+
invalidate();
26+
}
27+
return pressed;
28+
}
29+
30+
@Override
31+
public boolean onMouseReleased(double mouseX, double mouseY, int button) {
32+
if (pressed && pressedOnce) super.onMouseReleased(mouseX, mouseY, button);
33+
pressedOnce = pressed;
34+
invalidate();
35+
return pressed = false;
36+
}
37+
38+
@Override
39+
public String getText() {
40+
return pressedOnce ? confirmText : text;
41+
}
42+
}

0 commit comments

Comments
 (0)