Merge pull request #1441 from kevlahnota/master

add DPAD selector for gamepad in ListChooser
This commit is contained in:
Anthony Calosa
2022-09-01 20:14:32 +08:00
committed by GitHub
6 changed files with 71 additions and 47 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) {
container.keyDown(Keys.BUTTON_SELECT);
}
} else {//Others
/*if (controller.getMapping().buttonL2 == buttonIndex) {//others are axis-4
container.keyDown(Keys.ENTER);

View File

@@ -105,7 +105,7 @@ public class FMenuBar extends Header {
@Override
public boolean keyDown(int keyCode) {
if (keyCode == Input.Keys.BUTTON_L1) {
if (keyCode == Input.Keys.BUTTON_SELECT) { //show menu tabs
setNextSelected();
return true;
}

View File

@@ -579,14 +579,16 @@ public class MatchScreen extends FScreen {
} catch (Exception e) {}
}
break;
case Keys.PAGE_DOWN:
case Keys.BUTTON_L1: //switch selected panels
if (Forge.hasGamepad()) {
//nullPotentialListener();
selectedPlayerPanel().hideSelectedTab();
selectedPlayer--;
if (selectedPlayer < 0)
selectedPlayer=playerPanelsList.size()-1;
selectedPlayerPanel().setNextSelectedTab(true);
selectedPlayerPanel().closeSelectedTab();
selectedPlayerPanel().getSelectedRow().unselectCurrent();
//selectedPlayerPanel().setNextSelectedTab(true);
}
break;
case 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.PAGE_DOWN) { // left analog down to select current selected panel
//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);
}
}
}

View File

@@ -57,10 +57,11 @@ Right Trigger - Keep/Mulligan/Cancel/End Turn/Alpha Strike (Bottom Right Button)
(To select cards on the battlefield, close Zone tabs first (Button B), then use DPAD)
DPAD Up/Down/Left/Right - Selector
Left Shoulder - Tab Selector/Show
Left Shoulder - Player Panel Selector
Right Shoulder - Zone Selector/Show
Left Analog Down - Switch Player for Selector
Left Analog Down - Select Player (current selected panel)
Button A - Confirm
Button B - Cancel/Hide
Button Y - Show Zoom
Button Y - Show Zoom
Button Back - Show Menu Tabs