Files
Mindustry/core/src/mindustry/ui/dialogs/KeybindDialog.java
2025-04-28 22:13:32 -04:00

184 lines
6.1 KiB
Java

package mindustry.ui.dialogs;
import arc.*;
import arc.graphics.*;
import arc.input.*;
import arc.input.KeyBind.*;
import arc.scene.event.*;
import arc.scene.ui.*;
import arc.scene.ui.layout.*;
import arc.util.*;
import mindustry.gen.*;
import mindustry.graphics.*;
import mindustry.ui.*;
import java.util.*;
import static arc.Core.*;
public class KeybindDialog extends Dialog{
protected KeyBind rebindKey = null;
protected boolean rebindAxis = false;
protected boolean rebindMin = true;
protected KeyCode minKey = null;
protected Dialog rebindDialog;
protected Table bindsTable;
private String searchText = "";
public KeybindDialog(){
super(bundle.get("keybind.title"));
addCloseButton();
setFillParent(true);
title.setAlignment(Align.center);
titleTable.row();
titleTable.add(new Image()).growX().height(3f).pad(4f).get().setColor(Pal.accent);
bindsTable = new Table();
ScrollPane pane = new ScrollPane(bindsTable);
pane.setFadeScrollBars(false);
top();
cont.table(table -> {
table.left();
table.image(Icon.zoom);
var field = table.field(searchText, res -> {
searchText = res;
rebuildBinds();
}).growX().get();
shown(() -> {
field.setText(searchText = "");
rebuildBinds();
app.post(field::requestKeyboard);
});
}).fillX().padBottom(4).top();
cont.row();
cont.add(pane).grow();
rebuildBinds();
}
@Override
public void addCloseButton(){
buttons.button("@back", Icon.left, this::hide).size(210f, 64f);
keyDown(key -> {
if(key == KeyCode.escape || key == KeyCode.back) hide();
});
}
private void rebuildBinds(){
Table table = bindsTable;
bindsTable.clear();
table.add().height(10);
table.row();
String lastCategory = null;
var tstyle = Styles.grayt;
float bw = 140f, bh = 40f;
for(KeyBind keybind : KeyBind.all){
if(!searchText.isEmpty() && !bundle.get("keybind." + keybind.name + ".name", keybind.name).toLowerCase(Locale.ROOT).contains(searchText.toLowerCase(Locale.ROOT))){
continue;
}
if(lastCategory != keybind.category && keybind.category != null){
table.add(bundle.get("category." + keybind.category + ".name", Strings.capitalize(keybind.category))).color(Color.gray).colspan(4).pad(10).padBottom(4).row();
table.image().color(Color.gray).fillX().height(3).pad(6).colspan(4).padTop(0).padBottom(10).row();
lastCategory = keybind.category;
}
if(keybind.defaultValue instanceof Axis){
table.add(bundle.get("keybind." + keybind.name + ".name", Strings.capitalize(keybind.name)), Color.white).left().padRight(40).padLeft(8);
table.labelWrap(() -> {
Axis axis = keybind.value;
return axis.key != null ? axis.key.toString() : axis.min + " [red]/[] " + axis.max;
}).color(Pal.accent).left().minWidth(90).fillX().padRight(20);
table.button("@settings.rebind", tstyle, () -> {
rebindAxis = true;
rebindMin = true;
openDialog(keybind);
}).size(bw, bh);
}else{
table.add(bundle.get("keybind." + keybind.name + ".name", Strings.capitalize(keybind.name)), Color.white).left().padRight(40).padLeft(8);
table.label(() -> keybind.value.key.toString()).color(Pal.accent).left().minWidth(90).padRight(20);
table.button("@settings.rebind", tstyle, () -> {
rebindAxis = false;
rebindMin = false;
openDialog(keybind);
}).size(bw, bh);
}
table.button("@settings.resetKey", tstyle, keybind::resetToDefault).disabled(t -> keybind.isDefault()).size(bw, bh).pad(2f).padLeft(4f);
table.row();
}
table.button("@settings.reset", Icon.refresh, tstyle, KeyBind::resetAll).minWidth(200f).colspan(4).padTop(4).margin(10f).height(50f).fill();
}
void rebind(KeyBind bind, KeyCode newKey){
if(rebindKey == null) return;
rebindDialog.hide();
boolean isAxis = bind.defaultValue instanceof Axis;
if(isAxis){
if(newKey.axis || !rebindMin){
bind.value = newKey.axis ? new Axis(newKey) : new Axis(minKey, newKey);
}
}else{
bind.value = new Axis(newKey);
}
bind.save();
if(rebindAxis && isAxis && rebindMin && !newKey.axis){
rebindMin = false;
minKey = newKey;
openDialog(rebindKey);
}else{
rebindKey = null;
rebindAxis = false;
}
}
private void openDialog( KeyBind name){
rebindDialog = new Dialog(rebindAxis ? bundle.get("keybind.press.axis") : bundle.get("keybind.press"));
rebindKey = name;
rebindDialog.titleTable.getCells().first().pad(4);
rebindDialog.addListener(new InputListener(){
@Override
public boolean touchDown(InputEvent event, float x, float y, int pointer, KeyCode button){
if(Core.app.isAndroid()) return false;
rebind(name, button);
return false;
}
@Override
public boolean keyDown(InputEvent event, KeyCode keycode){
rebindDialog.hide();
rebind(name, keycode);
return false;
}
@Override
public boolean scrolled(InputEvent event, float x, float y, float amountX, float amountY){
if(!rebindAxis) return false;
rebindDialog.hide();
rebind(name, KeyCode.scroll);
return false;
}
});
rebindDialog.show();
Time.runTask(1f, () -> getScene().setScrollFocus(rebindDialog));
}
}