forked from DFOnline/CodeClient
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathItemSelector.java
More file actions
134 lines (118 loc) · 4.74 KB
/
ItemSelector.java
File metadata and controls
134 lines (118 loc) · 4.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package dev.dfonline.codeclient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder;
import net.minecraft.client.gui.widget.ClickableWidget;
import net.minecraft.client.gui.widget.TextFieldWidget;
import net.minecraft.item.ItemGroups;
import net.minecraft.item.ItemStack;
import net.minecraft.resource.featuretoggle.FeatureFlags;
import net.minecraft.text.Text;
import java.util.ArrayList;
import java.util.function.Consumer;
public class ItemSelector extends ClickableWidget {
private final TextFieldWidget search;
private final ArrayList<Search> items = new ArrayList<>();
private final int itemsWidth;
private final int screenX;
private final int screenY;
private final TextRenderer textRenderer;
private final Consumer<ItemStack> consumer;
private final int maxItems;
private static final int searchHeight = 16;
private static final int searchItemGap = 2;
private static final int itemSize = 16;
public ItemSelector(TextRenderer textRenderer, int x, int y, int width, int height, int screenX, int screenY, Consumer<ItemStack> consumer) {
super(x, y, width, height, Text.literal("Select a message"));
this.textRenderer = textRenderer;
this.screenX = screenX;
this.screenY = screenY;
this.consumer = consumer;
search = new TextFieldWidget(textRenderer, x, y, width, searchHeight, Text.translatable("itemGroup.search"));
search.setPlaceholder(Text.translatable("itemGroup.search"));
search.setFocused(true);
if (CodeClient.MC.player != null && CodeClient.MC.player.getWorld() != null) {
ItemGroups.updateDisplayContext(FeatureFlags.DEFAULT_ENABLED_FEATURES, true, CodeClient.MC.player.getWorld().getRegistryManager());
}
this.itemsWidth = width / itemSize;
int itemsHeight = (height - searchHeight - searchItemGap) / itemSize;
this.maxItems = itemsWidth * itemsHeight;
search();
}
private void search() {
int count = 0;
items.clear();
int x = 0;
int y = 0;
for (ItemStack item : ItemGroups.getSearchGroup().getSearchTabStacks()) {
if ((item.getName().getString().toLowerCase().contains(search.getText().toLowerCase().trim()))) {
items.add(new Search(item, x * itemSize, y * itemSize + searchItemGap + searchHeight));
if (++x >= itemsWidth) {
x = 0;
y++;
}
if (count++ > maxItems) break;
}
}
}
@Override
protected void renderWidget(DrawContext context, int mouseX, int mouseY, float delta) {
search.renderWidget(context, mouseX, mouseY, delta);
int i = 0;
while (i < maxItems && i != items.size()) {
var item = items.get(i);
context.drawItem(item.item,
this.getX() + item.x,
this.getY() + item.y
);
if (
mouseX - this.getX() - screenX > item.x &&
mouseX - this.getX() - screenX < item.x + itemSize &&
mouseY - this.getY() - screenY > item.y &&
mouseY - this.getY() - screenY < item.y + itemSize
) {
context.drawItemTooltip(textRenderer, item.item, mouseX - screenX, mouseY - screenY);
}
i++;
}
}
@Override
public boolean mouseClicked(double mouseX, double mouseY, int button) {
if (search.mouseClicked(mouseX, mouseY, button)) return true;
for (Search item : items)
if (mouseX - this.getX() > item.x &&
mouseX - this.getX() < item.x + itemSize &&
mouseY - this.getY() > item.y &&
mouseY - this.getY() < item.y + itemSize) {
consumer.accept(item.item);
return true;
}
return true;
}
@Override
public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
if (search.keyPressed(keyCode, scanCode, modifiers)) {
search();
return true;
}
return false;
}
@Override
public boolean keyReleased(int keyCode, int scanCode, int modifiers) {
search();
return true;
}
@Override
public boolean charTyped(char chr, int modifiers) {
if (search.charTyped(chr, modifiers)) {
search();
return true;
}
return false;
}
@Override
protected void appendClickableNarrations(NarrationMessageBuilder builder) {
}
private record Search(ItemStack item, int x, int y) {
}
}