add DPAD selector for gamepad in ListChooser

also add a way to select player using back button (select button on ds4), highlight player using left analog down, then press the back button to select player
This commit is contained in:
Anthony Calosa
2022-09-01 19:02:31 +08:00
parent aa12e751a1
commit 4bde4911ea
3 changed files with 62 additions and 41 deletions

View File

@@ -288,6 +288,9 @@ public class Forge implements ApplicationListener {
if (controller.getMapping().buttonB == buttonIndex) { if (controller.getMapping().buttonB == buttonIndex) {
container.keyDown(Keys.BUTTON_B); container.keyDown(Keys.BUTTON_B);
} }
if (controller.getMapping().buttonBack == buttonIndex) { //selecting player
container.keyDown(Keys.BUTTON_SELECT);
}
} else {//Others } else {//Others
/*if (controller.getMapping().buttonL2 == buttonIndex) {//others are axis-4 /*if (controller.getMapping().buttonL2 == buttonIndex) {//others are axis-4
container.keyDown(Keys.ENTER); container.keyDown(Keys.ENTER);

View File

@@ -1,5 +1,6 @@
package forge.screens.match.views; package forge.screens.match.views;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector2;
@@ -96,12 +97,8 @@ public class VAvatar extends FDisplayObject {
} }
@Override @Override
public boolean tap(float x, float y, int count) { public boolean tap(float x, float y, int count) {
ThreadUtil.invokeInGameThread(new Runnable() { //must invoke in game thread in case a dialog needs to be shown //must invoke in game thread in case a dialog needs to be shown
@Override ThreadUtil.invokeInGameThread(() -> MatchController.instance.getGameController().selectPlayer(player, null));
public void run() {
MatchController.instance.getGameController().selectPlayer(player, null);
}
});
return true; return true;
} }
@@ -170,5 +167,27 @@ public class VAvatar extends FDisplayObject {
if (MatchController.instance.isHighlighted(player)) { if (MatchController.instance.isHighlighted(player)) {
g.drawRect(w / 16f, Color.MAGENTA, 0, 0, w, h); g.drawRect(w / 16f, Color.MAGENTA, 0, 0, w, h);
} }
//selector
if (Forge.hasGamepad()) {
if (MatchController.getView().selectedPlayerPanel() != null) {
if (MatchController.getView().selectedPlayerPanel().getPlayer() == player) {
g.drawRect(w / 16f, Color.ORANGE, 0, 0, w, h);
}
}
}
}
@Override
public boolean keyDown(int keyCode) {
if (keyCode == Input.Keys.BUTTON_SELECT) {
//must invoke in game thread in case a dialog needs to be shown
if (MatchController.getView().selectedPlayerPanel() != null) {
PlayerView selected = MatchController.getView().selectedPlayerPanel().getPlayer();
if (selected != null)
ThreadUtil.invokeInGameThread(() -> MatchController.instance.getGameController().selectPlayer(selected, null));
}
return true;
}
return super.keyDown(keyCode);
} }
} }

View File

@@ -22,6 +22,7 @@ import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import com.badlogic.gdx.Input;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.base.Predicates; import com.google.common.base.Predicates;
@@ -39,7 +40,6 @@ import forge.itemmanager.filters.ItemFilter;
import forge.itemmanager.filters.ListLabelFilter; import forge.itemmanager.filters.ListLabelFilter;
import forge.menu.FMenuItem; import forge.menu.FMenuItem;
import forge.menu.FPopupMenu; import forge.menu.FPopupMenu;
import forge.toolbox.FEvent.FEventHandler;
import forge.util.Callback; import forge.util.Callback;
import forge.util.Utils; import forge.util.Utils;
@@ -95,38 +95,20 @@ public class ListChooser<T> extends FContainer {
txtSearch = add(new FTextField()); txtSearch = add(new FTextField());
txtSearch.setFont(FSkinFont.get(12)); txtSearch.setFont(FSkinFont.get(12));
txtSearch.setGhostText(Forge.getLocalizer().getMessage("lblSearch")); txtSearch.setGhostText(Forge.getLocalizer().getMessage("lblSearch"));
txtSearch.setChangedHandler(new FEventHandler() { txtSearch.setChangedHandler(e -> applyFilters());
@Override
public void handleEvent(FEvent e) {
applyFilters();
}
});
advancedSearchFilter = lstChoices.getListItemRenderer().getAdvancedSearchFilter(this); advancedSearchFilter = lstChoices.getListItemRenderer().getAdvancedSearchFilter(this);
if (advancedSearchFilter != null) { if (advancedSearchFilter != null) {
btnSearch = add(new FLabel.ButtonBuilder() btnSearch = add(new FLabel.ButtonBuilder()
.icon(Forge.hdbuttons ? FSkinImage.HDSEARCH : FSkinImage.SEARCH).iconScaleFactor(0.9f).command(new FEventHandler() { .icon(Forge.hdbuttons ? FSkinImage.HDSEARCH : FSkinImage.SEARCH).iconScaleFactor(0.9f).command(e -> {
@Override FPopupMenu menu = new FPopupMenu() {
public void handleEvent(FEvent e) { @Override
FPopupMenu menu = new FPopupMenu() { protected void buildMenu() {
@Override addItem(new FMenuItem(Forge.getLocalizer().getMessage("lblAdvancedSearch"), Forge.hdbuttons ? FSkinImage.HDSEARCH : FSkinImage.SEARCH, e1 -> advancedSearchFilter.edit()));
protected void buildMenu() { addItem(new FMenuItem(Forge.getLocalizer().getMessage("lblResetFilters"), Forge.hdbuttons ? FSkinImage.HDDELETE : FSkinImage.DELETE, e2 -> resetFilters()));
addItem(new FMenuItem(Forge.getLocalizer().getMessage("lblAdvancedSearch"), Forge.hdbuttons ? FSkinImage.HDSEARCH : FSkinImage.SEARCH, new FEventHandler() { }
@Override };
public void handleEvent(FEvent e) { menu.show(btnSearch, 0, btnSearch.getHeight());
advancedSearchFilter.edit();
}
}));
addItem(new FMenuItem(Forge.getLocalizer().getMessage("lblResetFilters"), Forge.hdbuttons ? FSkinImage.HDDELETE : FSkinImage.DELETE, new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
resetFilters();
}
}));
}
};
menu.show(btnSearch, 0, btnSearch.getHeight());
}
}).build()); }).build());
add(advancedSearchFilter.getWidget()); add(advancedSearchFilter.getWidget());
} }
@@ -184,12 +166,7 @@ public class ListChooser<T> extends FContainer {
final String pattern = txtSearch.getText().toLowerCase(); final String pattern = txtSearch.getText().toLowerCase();
if (!pattern.isEmpty()) { if (!pattern.isEmpty()) {
predicates.add(new Predicate<T>() { predicates.add(input -> lstChoices.getChoiceText(input).toLowerCase().contains(pattern));
@Override
public boolean apply(T input) {
return lstChoices.getChoiceText(input).toLowerCase().contains(pattern);
}
});
} }
if (advancedSearchFilter != null && !advancedSearchFilter.isEmpty()) { if (advancedSearchFilter != null && !advancedSearchFilter.isEmpty()) {
predicates.add((Predicate<? super T>)advancedSearchFilter.getPredicate()); predicates.add((Predicate<? super T>)advancedSearchFilter.getPredicate());
@@ -319,4 +296,26 @@ public class ListChooser<T> extends FContainer {
//don't draw border //don't draw border
} }
} }
@Override
public boolean keyDown(int keyCode) {
if (Forge.hasGamepad()) {
if (keyCode == Input.Keys.DPAD_DOWN) {
setNextSelected();
} else if (keyCode == Input.Keys.DPAD_UP) {
setPreviousSelected();
}
return true;
}
return super.keyDown(keyCode);
}
public void setNextSelected() {
if ((lstChoices.getSelectedIndex()+1) < lstChoices.getCount())
lstChoices.setSelectedIndex(lstChoices.getSelectedIndex()+1);
}
public void setPreviousSelected() {
if ((lstChoices.getSelectedIndex()-1) > -1) {
lstChoices.setSelectedIndex(lstChoices.getSelectedIndex() - 1);
}
}
} }