Instruction type search bar + add hotkeys in logic dialog

This commit is contained in:
Anuken
2024-11-09 13:11:12 -05:00
parent 4066e4e28e
commit e4aa633982

View File

@@ -3,6 +3,7 @@ package mindustry.logic;
import arc.*; import arc.*;
import arc.func.*; import arc.func.*;
import arc.graphics.*; import arc.graphics.*;
import arc.input.*;
import arc.scene.actions.*; import arc.scene.actions.*;
import arc.scene.ui.*; import arc.scene.ui.*;
import arc.scene.ui.TextButton.*; import arc.scene.ui.TextButton.*;
@@ -19,6 +20,8 @@ import mindustry.ui.*;
import mindustry.ui.dialogs.*; import mindustry.ui.dialogs.*;
import mindustry.world.blocks.logic.*; import mindustry.world.blocks.logic.*;
import java.util.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
import static mindustry.logic.LCanvas.*; import static mindustry.logic.LCanvas.*;
@@ -55,6 +58,13 @@ public class LogicDialog extends BaseDialog{
} }
}); });
//show add instruction on shift+enter
keyDown(KeyCode.enter, () -> {
if(Core.input.shift()){
showAddDialog();
}
});
add(canvas).grow().name("canvas"); add(canvas).grow().name("canvas");
row(); row();
@@ -213,13 +223,55 @@ public class LogicDialog extends BaseDialog{
}).name("variables").disabled(b -> executor == null || executor.vars.length == 0); }).name("variables").disabled(b -> executor == null || executor.vars.length == 0);
buttons.button("@add", Icon.add, () -> { buttons.button("@add", Icon.add, () -> {
BaseDialog dialog = new BaseDialog("@add"); showAddDialog();
dialog.cont.table(table -> { }).disabled(t -> canvas.statements.getChildren().size >= LExecutor.maxInstructions);
table.background(Tex.button); }
table.pane(t -> {
public void showAddDialog(){
BaseDialog dialog = new BaseDialog("@add");
dialog.cont.table(table -> {
String[] searchText = {""};
Prov[] matched = {null};
Runnable[] rebuild = {() -> {}};
table.background(Tex.button);
table.table(s -> {
s.image(Icon.zoom).padRight(8);
var search = s.field(null, text -> {
searchText[0] = text;
rebuild[0].run();
}).growX().get();
search.setMessageText("@players.search");
search.requestKeyboard();
Core.app.post(search::requestKeyboard);
//auto add first match on enter key
if(!mobile){
search.keyDown(KeyCode.enter, () -> {
if(!searchText[0].isEmpty() && matched[0] != null){
canvas.add((LStatement)matched[0].get());
dialog.hide();
}
});
}
}).growX().padBottom(4).row();
table.pane(t -> {
rebuild[0] = () -> {
t.clear();
var text = searchText[0].toLowerCase();
matched[0] = null;
for(Prov<LStatement> prov : LogicIO.allStatements){ for(Prov<LStatement> prov : LogicIO.allStatements){
LStatement example = prov.get(); LStatement example = prov.get();
if(example instanceof InvalidStatement || example.hidden() || (example.privileged() && !privileged) || (example.nonPrivileged() && privileged)) continue; if(example instanceof InvalidStatement || example.hidden() || (example.privileged() && !privileged) || (example.nonPrivileged() && privileged) || (!text.isEmpty() && !example.name().toLowerCase(Locale.ROOT).contains(text))) continue;
if(matched[0] == null){
matched[0] = prov;
}
LCategory category = example.category(); LCategory category = example.category();
Table cat = t.find(category.name); Table cat = t.find(category.name);
@@ -251,11 +303,13 @@ public class LogicDialog extends BaseDialog{
if(cat.getChildren().size % 3 == 0) cat.row(); if(cat.getChildren().size % 3 == 0) cat.row();
} }
}).grow(); };
}).fill().maxHeight(Core.graphics.getHeight() * 0.8f);
dialog.addCloseButton(); rebuild[0].run();
dialog.show(); }).grow();
}).disabled(t -> canvas.statements.getChildren().size >= LExecutor.maxInstructions); }).fill().maxHeight(Core.graphics.getHeight() * 0.8f);
dialog.addCloseButton();
dialog.show();
} }
public void show(String code, LExecutor executor, boolean privileged, Cons<String> modified){ public void show(String code, LExecutor executor, boolean privileged, Cons<String> modified){