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) {
container.keyDown(Keys.BUTTON_B);
}
if (controller.getMapping().buttonBack == buttonIndex) { //selecting player
container.keyDown(Keys.BUTTON_SELECT);
}
} else {//Others
/*if (controller.getMapping().buttonL2 == buttonIndex) {//others are axis-4
container.keyDown(Keys.ENTER);

View File

@@ -1,5 +1,6 @@
package forge.screens.match.views;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.math.Vector2;
@@ -96,12 +97,8 @@ public class VAvatar extends FDisplayObject {
}
@Override
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
@Override
public void run() {
MatchController.instance.getGameController().selectPlayer(player, null);
}
});
//must invoke in game thread in case a dialog needs to be shown
ThreadUtil.invokeInGameThread(() -> MatchController.instance.getGameController().selectPlayer(player, null));
return true;
}
@@ -170,5 +167,27 @@ public class VAvatar extends FDisplayObject {
if (MatchController.instance.isHighlighted(player)) {
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.List;
import com.badlogic.gdx.Input;
import com.google.common.base.Function;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
@@ -39,7 +40,6 @@ import forge.itemmanager.filters.ItemFilter;
import forge.itemmanager.filters.ListLabelFilter;
import forge.menu.FMenuItem;
import forge.menu.FPopupMenu;
import forge.toolbox.FEvent.FEventHandler;
import forge.util.Callback;
import forge.util.Utils;
@@ -95,38 +95,20 @@ public class ListChooser<T> extends FContainer {
txtSearch = add(new FTextField());
txtSearch.setFont(FSkinFont.get(12));
txtSearch.setGhostText(Forge.getLocalizer().getMessage("lblSearch"));
txtSearch.setChangedHandler(new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
applyFilters();
}
});
txtSearch.setChangedHandler(e -> applyFilters());
advancedSearchFilter = lstChoices.getListItemRenderer().getAdvancedSearchFilter(this);
if (advancedSearchFilter != null) {
btnSearch = add(new FLabel.ButtonBuilder()
.icon(Forge.hdbuttons ? FSkinImage.HDSEARCH : FSkinImage.SEARCH).iconScaleFactor(0.9f).command(new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
FPopupMenu menu = new FPopupMenu() {
@Override
protected void buildMenu() {
addItem(new FMenuItem(Forge.getLocalizer().getMessage("lblAdvancedSearch"), Forge.hdbuttons ? FSkinImage.HDSEARCH : FSkinImage.SEARCH, new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
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());
}
.icon(Forge.hdbuttons ? FSkinImage.HDSEARCH : FSkinImage.SEARCH).iconScaleFactor(0.9f).command(e -> {
FPopupMenu menu = new FPopupMenu() {
@Override
protected void buildMenu() {
addItem(new FMenuItem(Forge.getLocalizer().getMessage("lblAdvancedSearch"), Forge.hdbuttons ? FSkinImage.HDSEARCH : FSkinImage.SEARCH, e1 -> advancedSearchFilter.edit()));
addItem(new FMenuItem(Forge.getLocalizer().getMessage("lblResetFilters"), Forge.hdbuttons ? FSkinImage.HDDELETE : FSkinImage.DELETE, e2 -> resetFilters()));
}
};
menu.show(btnSearch, 0, btnSearch.getHeight());
}).build());
add(advancedSearchFilter.getWidget());
}
@@ -184,12 +166,7 @@ public class ListChooser<T> extends FContainer {
final String pattern = txtSearch.getText().toLowerCase();
if (!pattern.isEmpty()) {
predicates.add(new Predicate<T>() {
@Override
public boolean apply(T input) {
return lstChoices.getChoiceText(input).toLowerCase().contains(pattern);
}
});
predicates.add(input -> lstChoices.getChoiceText(input).toLowerCase().contains(pattern));
}
if (advancedSearchFilter != null && !advancedSearchFilter.isEmpty()) {
predicates.add((Predicate<? super T>)advancedSearchFilter.getPredicate());
@@ -319,4 +296,26 @@ public class ListChooser<T> extends FContainer {
//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);
}
}
}