Skip to content
This repository was archived by the owner on Nov 28, 2025. It is now read-only.

Commit f0b2e85

Browse files
committed
a few changes to context menus
1 parent e6f8f74 commit f0b2e85

File tree

29 files changed

+310
-223
lines changed

29 files changed

+310
-223
lines changed

1.16_combat-6/src/main/java/io/github/axolotlclient/api/ContextMenu.java

Lines changed: 40 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import net.minecraft.client.gui.widget.ButtonWidget;
3838
import net.minecraft.client.util.math.MatrixStack;
3939
import net.minecraft.text.LiteralText;
40+
import net.minecraft.text.MutableText;
4041
import net.minecraft.text.Text;
4142
import net.minecraft.util.math.MathHelper;
4243
import org.jetbrains.annotations.Nullable;
@@ -49,10 +50,20 @@ public class ContextMenu implements ParentElement, Drawable {
4950

5051
private int x;
5152
private int y;
53+
private final int width, height;
5254
private boolean rendering;
5355

5456
protected ContextMenu(List<AbstractButtonWidget> items) {
5557
children = items;
58+
int width = 0;
59+
int height = 0;
60+
for (AbstractButtonWidget d : children) {
61+
d.y = height;
62+
height += d.getHeight();
63+
width = Math.max(width, d.getWidth());
64+
}
65+
this.width = width;
66+
this.height = height;
5667
}
5768

5869
public static Builder builder() {
@@ -100,8 +111,8 @@ public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) {
100111
x = mouseX;
101112
rendering = true;
102113
}
103-
final int yStart = y + 2;
104-
final int xStart = x + 2;
114+
final int yStart = Math.min(y + 2, MinecraftClient.getInstance().getWindow().getScaledHeight() - height - 2);
115+
final int xStart = Math.min(x + 2, MinecraftClient.getInstance().getWindow().getScaledWidth() - width - 2);
105116
int y = yStart + 1;
106117
int width = 0;
107118
for (AbstractButtonWidget d : children) {
@@ -112,12 +123,6 @@ public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) {
112123
}
113124
matrices.push();
114125
matrices.translate(0, 0, 200);
115-
if (xStart + width + 1 > MinecraftClient.getInstance().getWindow().getScaledWidth()) {
116-
matrices.translate(Math.min(MinecraftClient.getInstance().getWindow().getScaledWidth() - (xStart + width + 1) - 2, 0), 0, 0);
117-
}
118-
if (y > MinecraftClient.getInstance().getWindow().getScaledHeight()) {
119-
matrices.translate(0, Math.min(MinecraftClient.getInstance().getWindow().getScaledHeight() - y - 2, 0), 0);
120-
}
121126
DrawableHelper.fill(matrices, xStart, yStart, xStart + width + 1, y, 0xDD1E1F22);
122127
DrawUtil.outlineRect(matrices, xStart, yStart, width + 1, y - yStart + 1, -1);
123128
for (AbstractButtonWidget c : children) {
@@ -127,6 +132,11 @@ public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) {
127132
matrices.pop();
128133
}
129134

135+
@Override
136+
public boolean isMouseOver(double mouseX, double mouseY) {
137+
return hoveredElement(mouseX, mouseY).isPresent();
138+
}
139+
130140
public static class Builder {
131141

132142
private final MinecraftClient client = MinecraftClient.getInstance();
@@ -138,7 +148,7 @@ public Builder() {
138148
}
139149

140150
public Builder entry(Text name, ButtonWidget.PressAction action) {
141-
elements.add(new ContextMenuEntryWidget(name, action));
151+
elements.add(new ContextMenuEntryWithAction(name, action));
142152
return this;
143153
}
144154

@@ -148,7 +158,17 @@ public Builder entry(AbstractButtonWidget widget) {
148158
}
149159

150160
public Builder spacer() {
151-
elements.add(new ContextMenuEntrySpacer());
161+
elements.add(new ContextMenuEntry(new LiteralText("-----")){
162+
@Override
163+
protected MutableText getNarrationMessage() {
164+
return LiteralText.EMPTY.copy();
165+
}
166+
});
167+
return this;
168+
}
169+
170+
public Builder title(Text title) {
171+
elements.add(new ContextMenuEntry(title));
152172
return this;
153173
}
154174

@@ -158,34 +178,33 @@ public ContextMenu build() {
158178

159179
}
160180

161-
public static class ContextMenuEntrySpacer extends AbstractButtonWidget {
181+
public static class ContextMenuEntry extends AbstractButtonWidget {
162182

163183
private final MinecraftClient client = MinecraftClient.getInstance();
164184

165-
public ContextMenuEntrySpacer() {
166-
super(0, 0, 50, 11, new LiteralText("-----"));
185+
public ContextMenuEntry(Text content) {
186+
super(0, 0, MinecraftClient.getInstance().textRenderer.getWidth(content), 11, content);
167187
}
168188

169189
@Override
170190
public void renderButton(MatrixStack matrices, int mouseX, int mouseY, float delta) {
171191
drawCenteredText(matrices, client.textRenderer, getMessage(), x + getWidth() / 2, y, 0xDDDDDD);
172192
}
173193

194+
@Override
195+
protected MutableText getNarrationMessage() {
196+
return getMessage().copy();
197+
}
198+
174199
@Override
175200
protected boolean clicked(double mouseX, double mouseY) {
176201
return false;
177202
}
178203
}
179204

180-
public static class ContextMenuEntryWidget extends ButtonWidget {
181-
182-
private final MinecraftClient client = MinecraftClient.getInstance();
183-
184-
protected ContextMenuEntryWidget(int x, int y, int width, int height, Text message, PressAction onPress) {
185-
super(x, y, width, height, message, onPress);
186-
}
205+
public static class ContextMenuEntryWithAction extends ButtonWidget {
187206

188-
public ContextMenuEntryWidget(Text message, PressAction onPress) {
207+
public ContextMenuEntryWithAction(Text message, PressAction onPress) {
189208
super(0, 0, MinecraftClient.getInstance().textRenderer.getWidth(message) + 4, 11, message, onPress);
190209
}
191210

1.16_combat-6/src/main/java/io/github/axolotlclient/api/ContextMenuContainer.java

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -65,65 +65,68 @@ public void mouseMoved(double mouseX, double mouseY) {
6565
@Override
6666
public boolean mouseClicked(double mouseX, double mouseY, int button) {
6767
if (menu != null) {
68-
boolean bl = menu.mouseClicked(mouseX, mouseY, button);
69-
removeMenu();
70-
return bl;
68+
if (!menu.isMouseOver(mouseX, mouseY)) {
69+
removeMenu();
70+
return true;
71+
}
72+
if (menu.mouseClicked(mouseX, mouseY, button)) removeMenu();
73+
return true;
7174
}
7275
return false;
7376
}
7477

7578
@Override
7679
public boolean mouseReleased(double mouseX, double mouseY, int button) {
7780
if (menu != null) {
78-
menu.mouseReleased(mouseX, mouseY, button);
81+
return menu.mouseReleased(mouseX, mouseY, button);
7982
}
8083
return false;
8184
}
8285

8386
@Override
8487
public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) {
8588
if (menu != null) {
86-
menu.mouseDragged(mouseX, mouseY, button, deltaX, deltaY);
89+
return menu.mouseDragged(mouseX, mouseY, button, deltaX, deltaY);
8790
}
8891
return false;
8992
}
9093

9194
@Override
9295
public boolean mouseScrolled(double mouseX, double mouseY, double amount) {
9396
if (menu != null) {
94-
menu.mouseScrolled(mouseX, mouseY, amount);
97+
return menu.mouseScrolled(mouseX, mouseY, amount);
9598
}
9699
return false;
97100
}
98101

99102
@Override
100103
public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
101104
if (menu != null) {
102-
menu.keyPressed(keyCode, scanCode, modifiers);
105+
return menu.keyPressed(keyCode, scanCode, modifiers);
103106
}
104107
return false;
105108
}
106109

107110
@Override
108111
public boolean keyReleased(int keyCode, int scanCode, int modifiers) {
109112
if (menu != null) {
110-
menu.keyReleased(keyCode, scanCode, modifiers);
113+
return menu.keyReleased(keyCode, scanCode, modifiers);
111114
}
112115
return false;
113116
}
114117

115118
@Override
116119
public boolean charTyped(char chr, int modifiers) {
117120
if (menu != null) {
118-
menu.charTyped(chr, modifiers);
121+
return menu.charTyped(chr, modifiers);
119122
}
120123
return false;
121124
}
122125

123126
@Override
124127
public boolean isMouseOver(double mouseX, double mouseY) {
125128
if (menu != null) {
126-
menu.isMouseOver(mouseX, mouseY);
129+
return menu.isMouseOver(mouseX, mouseY);
127130
}
128131
return false;
129132
}

1.16_combat-6/src/main/java/io/github/axolotlclient/api/chat/ChatListWidget.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,7 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) {
106106
return widget.mouseClicked(mouseX, mouseY, button);
107107
} else if (button == 1) {
108108
ContextMenu.Builder builder = ContextMenu.builder()
109-
.entry(Text.of(channel.getName()), w -> {
110-
})
109+
.title(Text.of(channel.getName()))
111110
.spacer()
112111
.entry(new TranslatableText("api.channel.configure"), w -> client.openScreen(new ChannelSettingsScreen(ChatListWidget.this.screen.getSelf(), channel)))
113112
.spacer();

1.16_combat-6/src/main/java/io/github/axolotlclient/api/chat/ChatUserListWidget.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,7 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) {
124124
} else if (button == 1) { // right click
125125

126126
if (!user.equals(API.getInstance().getSelf())) {
127-
ContextMenu.Builder menu = ContextMenu.builder().entry(Text.of(user.getName()), buttonWidget -> {
128-
}).spacer();
127+
ContextMenu.Builder menu = ContextMenu.builder().title(Text.of(user.getName())).spacer();
129128
if (!channel.isDM()) {
130129
menu.entry(new TranslatableText("api.friends.chat"), buttonWidget -> {
131130
ChannelRequest.getOrCreateDM(user).whenCompleteAsync(((channel, throwable) ->

1.16_combat-6/src/main/java/io/github/axolotlclient/api/chat/ChatWidget.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,8 +178,7 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) {
178178
}
179179
if (button == 1) {
180180
ContextMenu.Builder builder = ContextMenu.builder()
181-
.entry(Text.of(origin.sender().getName()), buttonWidget -> {
182-
})
181+
.title(Text.of(origin.sender().getName()))
183182
.spacer();
184183
if (!origin.sender().equals(API.getInstance().getSelf())) {
185184
builder.entry(new TranslatableText("api.friends.chat"), buttonWidget -> {

1.20/src/main/java/io/github/axolotlclient/api/ContextMenu.java

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import net.minecraft.client.MinecraftClient;
3030
import net.minecraft.client.gui.*;
3131
import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder;
32+
import net.minecraft.client.gui.screen.narration.NarrationPart;
3233
import net.minecraft.client.gui.widget.ButtonWidget;
3334
import net.minecraft.client.gui.widget.ClickableWidget;
3435
import net.minecraft.text.Text;
@@ -43,10 +44,20 @@ public class ContextMenu implements ParentElement, Drawable, Selectable {
4344

4445
private int x;
4546
private int y;
47+
private final int width, height;
4648
private boolean rendering;
4749

4850
protected ContextMenu(List<ClickableWidget> items) {
4951
children = items;
52+
int width = 0;
53+
int height = 0;
54+
for (ClickableWidget d : children) {
55+
d.setY(height);
56+
height += d.getHeight();
57+
width = Math.max(width, d.getWidth());
58+
}
59+
this.width = width;
60+
this.height = height;
5061
}
5162

5263
public static Builder builder() {
@@ -100,8 +111,8 @@ public void render(GuiGraphics graphics, int mouseX, int mouseY, float delta) {
100111
x = mouseX;
101112
rendering = true;
102113
}
103-
final int yStart = y + 2;
104-
final int xStart = x + 2;
114+
final int yStart = Math.min(y + 2, graphics.getScaledWindowHeight() - height - 2);
115+
final int xStart = Math.min(x + 2, graphics.getScaledWindowWidth() - width - 2);
105116
int y = yStart + 1;
106117
int width = 0;
107118
for (ClickableWidget d : children) {
@@ -112,12 +123,6 @@ public void render(GuiGraphics graphics, int mouseX, int mouseY, float delta) {
112123
}
113124
graphics.getMatrices().push();
114125
graphics.getMatrices().translate(0, 0, 200);
115-
if (xStart + width + 1 > graphics.getScaledWindowWidth()) {
116-
graphics.getMatrices().translate(Math.min(graphics.getScaledWindowWidth() - (xStart + width + 1) - 2, 0), 0, 0);
117-
}
118-
if (y > graphics.getScaledWindowHeight()) {
119-
graphics.getMatrices().translate(0, Math.min(graphics.getScaledWindowHeight() - y - 2, 0), 0);
120-
}
121126
graphics.fill(xStart, yStart, xStart + width + 1, y, 0xDD1E1F22);
122127
graphics.drawBorder(xStart, yStart, width + 1, y - yStart + 1, -1);
123128
for (ClickableWidget c : children) {
@@ -127,6 +132,11 @@ public void render(GuiGraphics graphics, int mouseX, int mouseY, float delta) {
127132
graphics.getMatrices().pop();
128133
}
129134

135+
@Override
136+
public boolean isMouseOver(double mouseX, double mouseY) {
137+
return hoveredElement(mouseX, mouseY).isPresent();
138+
}
139+
130140
@Override
131141
public void appendNarrations(NarrationMessageBuilder builder) {
132142

@@ -148,7 +158,7 @@ public Builder() {
148158
}
149159

150160
public Builder entry(Text name, ButtonWidget.PressAction action) {
151-
elements.add(new ContextMenuEntryWidget(name, action));
161+
elements.add(new ContextMenuEntryWithAction(name, action));
152162
return this;
153163
}
154164

@@ -158,7 +168,17 @@ public Builder entry(ClickableWidget widget) {
158168
}
159169

160170
public Builder spacer() {
161-
elements.add(new ContextMenuEntrySpacer());
171+
elements.add(new ContextMenuEntry(Text.literal("-----")){
172+
@Override
173+
protected void updateNarration(NarrationMessageBuilder builder) {
174+
175+
}
176+
});
177+
return this;
178+
}
179+
180+
public Builder title(Text title) {
181+
elements.add(new ContextMenuEntry(title));
162182
return this;
163183
}
164184

@@ -168,12 +188,12 @@ public ContextMenu build() {
168188

169189
}
170190

171-
public static class ContextMenuEntrySpacer extends ClickableWidget {
191+
public static class ContextMenuEntry extends ClickableWidget {
172192

173193
private final MinecraftClient client = MinecraftClient.getInstance();
174194

175-
public ContextMenuEntrySpacer() {
176-
super(0, 0, 50, 11, Text.literal("-----"));
195+
public ContextMenuEntry(Text content) {
196+
super(0, 0, MinecraftClient.getInstance().textRenderer.getWidth(content), 11, content);
177197
}
178198

179199
@Override
@@ -183,7 +203,7 @@ public void drawWidget(GuiGraphics graphics, int mouseX, int mouseY, float delta
183203

184204
@Override
185205
protected void updateNarration(NarrationMessageBuilder builder) {
186-
206+
builder.put(NarrationPart.TITLE, getMessage());
187207
}
188208

189209
@Override
@@ -192,15 +212,9 @@ protected boolean clicked(double mouseX, double mouseY) {
192212
}
193213
}
194214

195-
public static class ContextMenuEntryWidget extends ButtonWidget {
196-
197-
private final MinecraftClient client = MinecraftClient.getInstance();
198-
199-
protected ContextMenuEntryWidget(int x, int y, int width, int height, Text message, PressAction onPress, NarrationFactory narrationFactory) {
200-
super(x, y, width, height, message, onPress, narrationFactory);
201-
}
215+
public static class ContextMenuEntryWithAction extends ButtonWidget {
202216

203-
public ContextMenuEntryWidget(Text message, PressAction onPress) {
217+
public ContextMenuEntryWithAction(Text message, PressAction onPress) {
204218
super(0, 0, MinecraftClient.getInstance().textRenderer.getWidth(message) + 4, 11, message, onPress, DEFAULT_NARRATION);
205219
}
206220

0 commit comments

Comments
 (0)