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) { if (controller.getMapping().buttonB == buttonIndex) {
container.keyDown(Keys.BUTTON_B); container.keyDown(Keys.BUTTON_B);
} }
if (controller.getMapping().buttonBack == buttonIndex) {
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

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

View File

@@ -579,14 +579,16 @@ public class MatchScreen extends FScreen {
} catch (Exception e) {} } catch (Exception e) {}
} }
break; break;
case Keys.PAGE_DOWN: case Keys.BUTTON_L1: //switch selected panels
if (Forge.hasGamepad()) { if (Forge.hasGamepad()) {
//nullPotentialListener(); //nullPotentialListener();
selectedPlayerPanel().hideSelectedTab(); selectedPlayerPanel().hideSelectedTab();
selectedPlayer--; selectedPlayer--;
if (selectedPlayer < 0) if (selectedPlayer < 0)
selectedPlayer=playerPanelsList.size()-1; selectedPlayer=playerPanelsList.size()-1;
selectedPlayerPanel().setNextSelectedTab(true); selectedPlayerPanel().closeSelectedTab();
selectedPlayerPanel().getSelectedRow().unselectCurrent();
//selectedPlayerPanel().setNextSelectedTab(true);
} }
break; break;
case Keys.ENTER: case 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.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.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
public void handleEvent(FEvent e) {
FPopupMenu menu = new FPopupMenu() { FPopupMenu menu = new FPopupMenu() {
@Override @Override
protected void buildMenu() { protected void buildMenu() {
addItem(new FMenuItem(Forge.getLocalizer().getMessage("lblAdvancedSearch"), Forge.hdbuttons ? FSkinImage.HDSEARCH : FSkinImage.SEARCH, new FEventHandler() { addItem(new FMenuItem(Forge.getLocalizer().getMessage("lblAdvancedSearch"), Forge.hdbuttons ? FSkinImage.HDSEARCH : FSkinImage.SEARCH, e1 -> advancedSearchFilter.edit()));
@Override addItem(new FMenuItem(Forge.getLocalizer().getMessage("lblResetFilters"), Forge.hdbuttons ? FSkinImage.HDDELETE : FSkinImage.DELETE, e2 -> resetFilters()));
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()); 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);
}
}
} }

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) (To select cards on the battlefield, close Zone tabs first (Button B), then use DPAD)
DPAD Up/Down/Left/Right - Selector DPAD Up/Down/Left/Right - Selector
Left Shoulder - Tab Selector/Show Left Shoulder - Player Panel Selector
Right Shoulder - Zone Selector/Show Right Shoulder - Zone Selector/Show
Left Analog Down - Switch Player for Selector Left Analog Down - Select Player (current selected panel)
Button A - Confirm Button A - Confirm
Button B - Cancel/Hide Button B - Cancel/Hide
Button Y - Show Zoom Button Y - Show Zoom
Button Back - Show Menu Tabs