Skip to content

Commit

Permalink
added List Options lmao
Browse files Browse the repository at this point in the history
also improved the loading of options to make adding more option types easier
  • Loading branch information
XTerPL committed Nov 12, 2022
1 parent 59d79ff commit c2ae17f
Show file tree
Hide file tree
Showing 15 changed files with 649 additions and 114 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,19 +23,25 @@ public ScriptAddSettingScreen(Script script, int pos) {
int x = 3;
int y = 3;

for(ScriptOptionEnum option : ScriptOptionEnum.values())
{
for(ScriptOptionEnum option : ScriptOptionEnum.values()) {
CItem citem = new CItem(x, y, option.getIcon());

citem.setClickListener((a) -> {
try {
script.addOption(pos, new ScriptNamedOption(option.getOptionType().getConstructor().newInstance(), script.getUnnamedOption()));
} catch (Exception e) {
ChatUtil.error(String.valueOf(e.getCause()));
}
if(option.getExtraTypes() == 0) {
citem.setClickListener((a) -> {
try {
script.addOption(pos, new ScriptNamedOption(option.getOptionType().getConstructor().newInstance(), script.getUnnamedOption()));
} catch (Exception e) {
ChatUtil.error(String.valueOf(e.getCause()));
}

DFScript.MC.setScreen(new ScriptSettingsScreen(script, true));
});
DFScript.MC.setScreen(new ScriptSettingsScreen(script, true));
});
}
else {
citem.setClickListener((a) -> {
DFScript.MC.setScreen(new ScriptAddSettingSubtypeScreen(script, option, pos));
});
}

widgets.add(citem);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
package io.github.techstreet.dfscript.screen.script;

import io.github.techstreet.dfscript.DFScript;
import io.github.techstreet.dfscript.screen.CScreen;
import io.github.techstreet.dfscript.screen.widget.CItem;
import io.github.techstreet.dfscript.screen.widget.CTexturedButton;
import io.github.techstreet.dfscript.script.Script;
import io.github.techstreet.dfscript.script.options.ScriptNamedOption;
import io.github.techstreet.dfscript.script.options.ScriptOptionEnum;
import io.github.techstreet.dfscript.util.chat.ChatUtil;
import net.minecraft.client.gui.DrawableHelper;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.text.Text;

import java.awt.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class ScriptAddSettingSubtypeScreen extends CScreen {

private int width;
private int height;
private static final List<ScriptOptionEnum> primitiveTypes;

private final Script script;
private final ScriptOptionEnum option;
private final int pos;

private int optionPos;

private List<ScriptOptionEnum> subtypes;

static {
primitiveTypes = Arrays.stream(ScriptOptionEnum.values()).filter(c -> c.getExtraTypes() == 0).toList();
}

public ScriptAddSettingSubtypeScreen(Script script, ScriptOptionEnum option, int pos) {
super(calculateWidth(option.getExtraTypes()),calculateHeight(option.getExtraTypes()));
width = calculateWidth(option.getExtraTypes());
height = calculateHeight(option.getExtraTypes());

this.script = script;
this.option = option;
this.pos = pos;

optionPos = 0;

subtypes = new ArrayList<>(option.getExtraTypes());
for(int i = 0; i < option.getExtraTypes(); i++) subtypes.add(null);

reloadMenu();
}

private static int calculateWidth(int extraTypes) {
return (int) Math.max((Math.ceil(Math.sqrt(primitiveTypes.size())) * 10)+4, 2+8+4+extraTypes*10+2+8+2);
}

private static int calculateHeight(int extraTypes) {
return (int) Math.ceil(primitiveTypes.size()/((calculateWidth(extraTypes)-2)/10f))*10+4+12;
}

public void reloadMenu()
{
widgets.clear();

int x = 3;
int y = 3;

CItem citem = new CItem(x, y, option.getIcon());

widgets.add(citem);

x += 12;

int i = 0;

boolean noNull = true;

for(ScriptOptionEnum o : subtypes) {
ItemStack icon;

if(o == null) {
noNull = false;
icon = new ItemStack(Items.BARRIER).setCustomName(Text.of("None"));
}
else {
icon = o.getIcon();
}

if(optionPos == i) citem = new CItem(x, y, icon) {
@Override
public void render(MatrixStack stack, int mouseX, int mouseY, float tickDelta) {
super.render(stack, mouseX, mouseY, tickDelta);
Rectangle b = getBounds();
DrawableHelper.fill(stack, b.x, b.y, b.x + b.width, b.y + b.height, 0x3300ff00);
}
};
else citem = new CItem(x, y, icon);

int finalI = i;
citem.setClickListener((a) -> {
optionPos = finalI;

reloadMenu();
});

widgets.add(citem);

x += 10;
i++;
}

if(noNull) {
CTexturedButton button = new CTexturedButton(width - 10, 3, 8, 8, DFScript.MOD_ID + ":on_button.png", () -> {
try {
Class<?>[] argTypes = new Class[option.getExtraTypes()];
Arrays.fill(argTypes, ScriptOptionEnum.class);

script.addOption(pos, new ScriptNamedOption(option.getOptionType().getConstructor(argTypes).newInstance(subtypes.toArray()), script.getUnnamedOption()));
} catch (Exception e) {
ChatUtil.error(String.valueOf(e.getCause()));
}

DFScript.MC.setScreen(new ScriptSettingsScreen(script, true));
}, 0,0,1,0.5f,0,0.5f);

widgets.add(button);
}

x = 3;
y = 3+12;

for(ScriptOptionEnum o : primitiveTypes) {
citem = new CItem(x, y, o.getIcon());

citem.setClickListener((a) -> {
if(optionPos < subtypes.size()-1 && subtypes.get(optionPos) == null) {
subtypes.set(optionPos, o);
optionPos++;
}
else
{
subtypes.set(optionPos, o);
}

reloadMenu();
});

widgets.add(citem);

x += 10;
if (x >= width - 10) {
x = 3;
y += 10;
}
}
}

@Override
public void close() {
DFScript.MC.setScreen(new ScriptAddSettingScreen(script, pos));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,15 @@ public ScriptSettingsScreen(Script script, boolean owned) {

widgets.add(panel);

reloadMenu();

panel.setScroll(scroll);
}

public void reloadMenu() {
clearContextMenu();
panel.clear();

int y = 3;
int index = 0;

Expand Down Expand Up @@ -98,14 +107,7 @@ public boolean mouseClicked(double x, double y, int button) {
scroll = panel.getScroll();
DFScript.MC.setScreen(new ScriptSettingsScreen(script, true));
});
DFScript.MC.send(() -> {
panel.add(insertBefore);
panel.add(insertAfter);
panel.add(delete);
contextMenu.add(insertBefore);
contextMenu.add(insertAfter);
contextMenu.add(delete);
});
newContextMenu(new CButton[]{insertBefore, insertAfter, delete});
}
else
{
Expand All @@ -132,8 +134,6 @@ public boolean mouseClicked(double x, double y, int button) {
});
panel.add(add);
}

panel.setScroll(scroll);
}

@Override
Expand All @@ -152,6 +152,17 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) {
clearContextMenu();
return b;
}

public void newContextMenu(CButton[] buttons) {
clearContextMenu();

DFScript.MC.send(() -> {
for(CButton button : buttons) {
panel.add(button);
contextMenu.add(button);
}
});
}
private void clearContextMenu() {
for (CWidget w : contextMenu) {
panel.remove(w);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -283,12 +283,12 @@ public boolean optionExists(String option) {
return false;
}

public ScriptArgument getOption(String option) {
public ScriptValue getOption(String option) {
for(ScriptNamedOption o : getOptions()) {
if(Objects.equals(o.getName(), option)) return o.getValue();
}

return new ScriptUnknownArgument();
return new ScriptUnknownValue();
}

public String getUnnamedOption() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,12 @@ public ScriptConfigArgument(String option, Script script) {

@Override
public ScriptValue getValue(Event event, ScriptContext context) {
return script.getOption(option).getValue(event, context);
return script.getOption(option);
}

@Override
public boolean convertableTo(ScriptActionArgument.ScriptActionArgumentType type) {
return script.getOption(option).convertableTo(type);
return script.getNamedOption(option).getOption().convertableTo(type);
}

public ScriptNamedOption getOption() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,28 +1,35 @@
package io.github.techstreet.dfscript.script.options;

import com.google.gson.JsonElement;
import com.google.gson.JsonPrimitive;
import io.github.techstreet.dfscript.DFScript;
import io.github.techstreet.dfscript.screen.widget.CScrollPanel;
import io.github.techstreet.dfscript.screen.widget.CTextField;
import io.github.techstreet.dfscript.screen.widget.CTexturedButton;
import io.github.techstreet.dfscript.script.argument.ScriptArgument;
import io.github.techstreet.dfscript.script.action.ScriptActionArgument;
import io.github.techstreet.dfscript.script.argument.ScriptTextArgument;
import io.github.techstreet.dfscript.script.values.ScriptTextValue;
import io.github.techstreet.dfscript.script.values.ScriptValue;
import net.minecraft.item.Item;
import net.minecraft.item.Items;

public class ScriptBoolOption implements ScriptOption {

boolean value = false;

public ScriptBoolOption(boolean value) {
this.value = value;
public ScriptBoolOption(JsonElement value) {
this.value = value.getAsBoolean();
}

public ScriptBoolOption() {}

@Override
public ScriptArgument getValue() {
return new ScriptTextArgument(value ? "true" : "false");
public ScriptValue getValue() {
return new ScriptTextValue(value ? "true" : "false");
}

@Override
public boolean convertableTo(ScriptActionArgument.ScriptActionArgumentType arg) {
return ScriptActionArgument.ScriptActionArgumentType.TEXT.convertableTo(arg);
}

@Override
Expand Down Expand Up @@ -50,12 +57,7 @@ public Item getIcon() {
}

@Override
public String getType() {
return "BOOL";
}

@Override
public JsonPrimitive getJsonPrimitive() {
public JsonElement getJsonElement() {
return new JsonPrimitive(value);
}
}
Loading

0 comments on commit c2ae17f

Please sign in to comment.