Skip to content

Commit ea933fe

Browse files
committed
added function headers and you can change the function name and icon atm
1 parent 92e95bd commit ea933fe

File tree

11 files changed

+498
-7
lines changed

11 files changed

+498
-7
lines changed
Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
package io.github.techstreet.dfscript.screen.script;
2+
3+
import io.github.techstreet.dfscript.DFScript;
4+
import io.github.techstreet.dfscript.screen.CReloadableScreen;
5+
import io.github.techstreet.dfscript.screen.ContextMenuButton;
6+
import io.github.techstreet.dfscript.screen.util.ItemMaterialSelectMenu;
7+
import io.github.techstreet.dfscript.screen.widget.*;
8+
import io.github.techstreet.dfscript.script.Script;
9+
import io.github.techstreet.dfscript.script.event.ScriptFunction;
10+
import net.minecraft.client.font.TextRenderer;
11+
12+
import java.util.ArrayList;
13+
import java.util.List;
14+
15+
public class ScriptEditFunctionScreen extends CReloadableScreen {
16+
17+
private final Script script;
18+
private final ScriptFunction function;
19+
private final CScrollPanel panel;
20+
private final List<CWidget> contextMenu = new ArrayList<>();
21+
22+
public ScriptEditFunctionScreen(ScriptFunction function, Script script) {
23+
super(90, 100);
24+
panel = new CScrollPanel(0, 0, 90, 100);
25+
26+
widgets.add(panel);
27+
28+
this.script = script;
29+
this.function = function;
30+
31+
reload();
32+
}
33+
34+
@Override
35+
public void close() {
36+
DFScript.MC.setScreen(new ScriptEditScreen(script));
37+
}
38+
39+
@Override
40+
public boolean mouseClicked(double mouseX, double mouseY, int button) {
41+
boolean b = super.mouseClicked(mouseX, mouseY, button);
42+
clearContextMenu();
43+
return b;
44+
}
45+
46+
private void clearContextMenu() {
47+
for (CWidget w : contextMenu) {
48+
panel.remove(w);
49+
}
50+
contextMenu.clear();
51+
}
52+
53+
public void contextMenu(int x, int y, List<ContextMenuButton> contextMenuButtons) {
54+
clearContextMenu();
55+
56+
int maxWidth = 0;
57+
58+
for(ContextMenuButton w : contextMenuButtons)
59+
{
60+
TextRenderer t = DFScript.MC.textRenderer;
61+
int width = t.getWidth(w.getName())/2 + 4;
62+
63+
if(width > maxWidth) maxWidth = width;
64+
}
65+
66+
for(ContextMenuButton w : contextMenuButtons)
67+
{
68+
CButton button = new CButton(x, y, maxWidth, 8, w.getName(), w.getOnClick());
69+
y += 8;
70+
71+
panel.add(button);
72+
contextMenu.add(button);
73+
}
74+
}
75+
76+
@Override
77+
public void reload() {
78+
clearContextMenu();
79+
panel.clear();
80+
81+
CTextField nameField = new CTextField(function.getName(), 15, 3, 90-10-10, 8, true);
82+
nameField.setMultiline(false);
83+
nameField.setChangedListener(() -> {
84+
if(script.functionExists(nameField.getText())) {
85+
nameField.textColor = 0xFF0000;
86+
}
87+
else {
88+
nameField.textColor = 0xFFFFFF;
89+
function.setName(nameField.getText());
90+
script.replaceFunction(function.getName(), nameField.getText());
91+
}
92+
});
93+
94+
CItem icon = new CItem(5, 3, function.getIcon());
95+
96+
icon.setClickListener((button) -> {
97+
DFScript.MC.setScreen(new ItemMaterialSelectMenu(function.getRawIcon(), (newIcon) -> {
98+
function.setIcon(newIcon);
99+
DFScript.MC.setScreen(new ScriptEditFunctionScreen(function, script));
100+
}));
101+
});
102+
103+
panel.add(icon);
104+
panel.add(nameField);
105+
106+
/*int y = 15;
107+
int index = 0;
108+
for (ScriptArgument arg : action.getArguments()) {
109+
ItemStack icon = arg.getArgIcon();
110+
String text = arg.getArgText();
111+
112+
panel.add(new CItem(5, y, icon));
113+
panel.add(new CText(15, y + 2, Text.literal(text)));
114+
115+
int currentIndex = index;
116+
117+
118+
panel.add(new CButton(5, y-1, 85, 10, "",() -> {}) {
119+
@Override
120+
public void render(MatrixStack stack, int mouseX, int mouseY, float tickDelta) {
121+
Rectangle b = getBounds();
122+
if (b.contains(mouseX, mouseY)) {
123+
DrawableHelper.fill(stack, b.x, b.y, b.x + b.width, b.y + b.height, 0x33000000);
124+
}
125+
}
126+
127+
@Override
128+
public boolean mouseClicked(double x, double y, int button) {
129+
if (getBounds().contains(x, y)) {
130+
DFScript.MC.getSoundManager().play(PositionedSoundInstance.ambient(SoundEvents.UI_BUTTON_CLICK, 1f,1f));
131+
132+
if (button == 0) {
133+
ScriptArgument argument = action.getArguments().get(currentIndex);
134+
String value = "~";
135+
if(argument instanceof ScriptClientValueArgument clientValue) value = clientValue.getName();
136+
if(argument instanceof ScriptConfigArgument configArgument) value = configArgument.getName();
137+
if(argument instanceof ScriptNumberArgument number) value = String.valueOf(number.value());
138+
if(argument instanceof ScriptTextArgument text) value = text.value();
139+
if(argument instanceof ScriptVariableArgument var) value = var.name();
140+
DFScript.MC.setScreen(new ScriptAddArgumentScreen(script, action, currentIndex, value));
141+
}
142+
143+
if (button != 0) {
144+
List<ContextMenuButton> contextMenuButtons = new ArrayList<>();
145+
contextMenuButtons.add(new ContextMenuButton("Insert Before", () -> {
146+
DFScript.MC.setScreen(new ScriptAddArgumentScreen(script, action, currentIndex));
147+
}, false));
148+
contextMenuButtons.add(new ContextMenuButton("Insert After", () -> {
149+
DFScript.MC.setScreen(new ScriptAddArgumentScreen(script, action, currentIndex+1));
150+
}, false));
151+
contextMenuButtons.add(new ContextMenuButton("Delete", () -> {
152+
action.getArguments().remove(currentIndex);
153+
}));
154+
contextMenuButtons.addAll(action.getArguments().get(currentIndex).getContextMenu());
155+
DFScript.MC.send(() -> {
156+
if(DFScript.MC.currentScreen instanceof ScriptEditFunctionScreen screen) {
157+
screen.contextMenu((int) x, (int) y, contextMenuButtons);
158+
}
159+
});
160+
}
161+
return true;
162+
}
163+
return false;
164+
}
165+
});
166+
167+
y += 10;
168+
index++;
169+
170+
}
171+
172+
CButton add = new CButton(25, y, 40, 8, "Add", () -> {
173+
DFScript.MC.setScreen(new ScriptAddArgumentScreen(script, action, action.getArguments().size()));
174+
});
175+
panel.add(add);*/
176+
}
177+
}

src/main/java/io/github/techstreet/dfscript/screen/script/ScriptEditScreen.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import java.util.ArrayList;
1717
import java.util.List;
1818

19+
import io.github.techstreet.dfscript.script.event.ScriptFunction;
1920
import io.github.techstreet.dfscript.script.event.ScriptHeader;
2021
import net.minecraft.client.font.TextRenderer;
2122
import net.minecraft.client.gui.DrawableHelper;
@@ -329,6 +330,11 @@ public boolean mouseClicked(double x, double y, int button) {
329330
contextMenu.add(delete);
330331
});
331332
}
333+
else {
334+
if(header instanceof ScriptFunction f) {
335+
DFScript.MC.setScreen(new ScriptEditFunctionScreen(f, script));
336+
}
337+
}
332338
return true;
333339
}
334340
return false;

src/main/java/io/github/techstreet/dfscript/screen/script/ScriptHeaderCategoryScreen.java

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,31 @@
55
import io.github.techstreet.dfscript.screen.widget.CItem;
66
import io.github.techstreet.dfscript.script.Script;
77
import io.github.techstreet.dfscript.script.action.ScriptActionCategory;
8+
import io.github.techstreet.dfscript.script.event.ScriptFunction;
9+
import io.github.techstreet.dfscript.script.event.ScriptHeader;
810
import io.github.techstreet.dfscript.script.event.ScriptHeaderCategory;
911
import net.minecraft.item.ItemStack;
1012
import net.minecraft.item.Items;
1113
import net.minecraft.text.Style;
1214
import net.minecraft.text.Text;
15+
import net.minecraft.util.Formatting;
16+
17+
import java.util.List;
18+
import java.util.Map;
19+
import java.util.function.BiConsumer;
20+
import java.util.function.Consumer;
21+
import java.util.function.Function;
1322

1423
public class ScriptHeaderCategoryScreen extends CScreen {
1524

1625
private static final int size;
26+
private static final List<HeaderExtra> extra;
1727

1828
static {
19-
size = (int) (Math.ceil(Math.sqrt(ScriptHeaderCategory.values().length)) * 10)+4;
29+
extra = List.of(
30+
new HeaderExtra(ScriptFunction.functionIcon, (script, insertIndex) -> script.getHeaders().add(insertIndex, new ScriptFunction(script.getUnnamedFunction(), Items.LAPIS_LAZULI)))
31+
);
32+
size = (int) (Math.ceil(Math.sqrt(ScriptHeaderCategory.values().length+extra.size())) * 10)+4;
2033
}
2134

2235
private final Script script;
@@ -40,10 +53,28 @@ public ScriptHeaderCategoryScreen(Script script, int insertIndex) {
4053
y += 10;
4154
}
4255
}
56+
57+
for(HeaderExtra headerExtra : extra) {
58+
CItem item = new CItem(x, y, headerExtra.icon());
59+
item.setClickListener(button -> {
60+
headerExtra.onClick().accept(script, insertIndex);
61+
close();
62+
});
63+
64+
widgets.add(item);
65+
66+
x += 10;
67+
if (x >= size - 10) {
68+
x = 3;
69+
y += 10;
70+
}
71+
}
4372
}
4473

4574
@Override
4675
public void close() {
4776
DFScript.MC.setScreen(new ScriptEditScreen(script));
4877
}
49-
}
78+
79+
record HeaderExtra(ItemStack icon, BiConsumer<Script, Integer> onClick) {}
80+
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package io.github.techstreet.dfscript.screen.util;
2+
3+
import io.github.techstreet.dfscript.DFScript;
4+
import io.github.techstreet.dfscript.screen.CReloadableScreen;
5+
import io.github.techstreet.dfscript.screen.CScreen;
6+
import io.github.techstreet.dfscript.screen.widget.*;
7+
import net.minecraft.client.gui.DrawableHelper;
8+
import net.minecraft.client.util.math.MatrixStack;
9+
import net.minecraft.item.Item;
10+
import net.minecraft.item.ItemStack;
11+
import net.minecraft.item.Items;
12+
import net.minecraft.util.registry.Registry;
13+
import org.checkerframework.checker.units.qual.C;
14+
15+
import java.awt.*;
16+
import java.util.function.Consumer;
17+
18+
public class ItemMaterialSelectMenu extends CReloadableScreen {
19+
20+
Item material;
21+
Consumer<Item> onClose;
22+
23+
CItem icon;
24+
CScrollPanel panel;
25+
CTextField searchField;
26+
27+
public ItemMaterialSelectMenu(Item currentMaterial, Consumer<Item> onClose) {
28+
super(162, 105);
29+
material = currentMaterial;
30+
this.onClose = onClose;
31+
32+
icon = new CItem(5, 3, new ItemStack(currentMaterial));
33+
34+
searchField = new CTextField("", 15, 2, 162-15-10-5, 8, true);
35+
searchField.setMultiline(false);
36+
searchField.setChangedListener(this::reload);
37+
38+
CTexturedButton finishButton = new CTexturedButton(162-8-5, 2, 8, 8, DFScript.MOD_ID + ":on_button.png", this::close, 0, 0, 1, 0.5f, 0, 0.5f);
39+
40+
panel = new CScrollPanel(2, 12, 160, 100-8);
41+
42+
widgets.add(icon);
43+
widgets.add(searchField);
44+
widgets.add(finishButton);
45+
widgets.add(panel);
46+
47+
reload();
48+
}
49+
50+
@Override
51+
public void close() {
52+
onClose.accept(material);
53+
}
54+
55+
@Override
56+
public void reload() {
57+
panel.clear();
58+
59+
int x = 0;
60+
int y = 0;
61+
62+
int index = 0;
63+
64+
for (Item item : Registry.ITEM) {
65+
if(item == Items.AIR) {
66+
continue;
67+
}
68+
69+
if(!searchField.getText().isBlank() && !item.getName().toString().contains(searchField.getText())) {
70+
continue;
71+
}
72+
73+
ItemStack itemStack = new ItemStack(item);
74+
CItem citem;
75+
if(item == material) {
76+
citem = new CItem(x, y, itemStack) {
77+
@Override
78+
public void render(MatrixStack stack, int mouseX, int mouseY, float tickDelta) {
79+
super.render(stack, mouseX, mouseY, tickDelta);
80+
Rectangle b = getBounds();
81+
DrawableHelper.fill(stack, b.x, b.y, b.x + b.width, b.y + b.height, 0x3300ff00);
82+
}
83+
};
84+
}
85+
else {
86+
citem = new CItem(x, y, itemStack);
87+
}
88+
citem.setClickListener((button) -> {
89+
material = item;
90+
icon.setItemStack(itemStack);
91+
reload();
92+
});
93+
panel.add(citem);
94+
95+
index++;
96+
if(index == 16) {
97+
x = 0;
98+
y += 10;
99+
index = 0;
100+
}
101+
else {
102+
x += 10;
103+
}
104+
}
105+
}
106+
}

src/main/java/io/github/techstreet/dfscript/screen/widget/CItem.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public class CItem implements CWidget {
1717

1818
private final int x;
1919
private final int y;
20-
private final ItemStack item;
20+
private ItemStack item;
2121
private Consumer<Integer> onClick;
2222

2323
public CItem(int x, int y, ItemStack item) {
@@ -75,4 +75,7 @@ public void setClickListener(Consumer<Integer> onClick) {
7575
this.onClick = onClick;
7676
}
7777

78+
public void setItemStack(ItemStack newItem) {
79+
item = newItem;
80+
}
7881
}

0 commit comments

Comments
 (0)