From 4bde4911ea40d340958cd12c3df0fa6ac10a0b86 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 1 Sep 2022 19:02:31 +0800 Subject: [PATCH 1/3] 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 --- forge-gui-mobile/src/forge/Forge.java | 3 + .../forge/screens/match/views/VAvatar.java | 31 +++++++-- .../src/forge/toolbox/ListChooser.java | 69 +++++++++---------- 3 files changed, 62 insertions(+), 41 deletions(-) diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index 376cc2f6dc5..5aa830105eb 100644 --- a/forge-gui-mobile/src/forge/Forge.java +++ b/forge-gui-mobile/src/forge/Forge.java @@ -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); diff --git a/forge-gui-mobile/src/forge/screens/match/views/VAvatar.java b/forge-gui-mobile/src/forge/screens/match/views/VAvatar.java index e32ea675cfb..569279bf04c 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VAvatar.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VAvatar.java @@ -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); } } diff --git a/forge-gui-mobile/src/forge/toolbox/ListChooser.java b/forge-gui-mobile/src/forge/toolbox/ListChooser.java index 5f0e0359ec9..9925d5bb77a 100644 --- a/forge-gui-mobile/src/forge/toolbox/ListChooser.java +++ b/forge-gui-mobile/src/forge/toolbox/ListChooser.java @@ -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 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 extends FContainer { final String pattern = txtSearch.getText().toLowerCase(); if (!pattern.isEmpty()) { - predicates.add(new Predicate() { - @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)advancedSearchFilter.getPredicate()); @@ -319,4 +296,26 @@ public class ListChooser 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); + } + } } From 3421b3bdd78f3bef1f7cc43d2eaf6e240f96418e Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 1 Sep 2022 20:03:33 +0800 Subject: [PATCH 2/3] update controls --- forge-gui-mobile/src/forge/menu/FMenuBar.java | 2 +- forge-gui-mobile/src/forge/screens/match/MatchScreen.java | 6 ++++-- .../src/forge/screens/match/views/VAvatar.java | 2 +- forge-gui/release-files/GAMEPAD_README.txt | 7 ++++--- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/forge-gui-mobile/src/forge/menu/FMenuBar.java b/forge-gui-mobile/src/forge/menu/FMenuBar.java index 27e8a1a0cdb..4ed70b4ed30 100644 --- a/forge-gui-mobile/src/forge/menu/FMenuBar.java +++ b/forge-gui-mobile/src/forge/menu/FMenuBar.java @@ -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; } diff --git a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java index 667567521fd..a69c6574aff 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java @@ -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: diff --git a/forge-gui-mobile/src/forge/screens/match/views/VAvatar.java b/forge-gui-mobile/src/forge/screens/match/views/VAvatar.java index 569279bf04c..690078093b3 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VAvatar.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VAvatar.java @@ -179,7 +179,7 @@ public class VAvatar extends FDisplayObject { @Override public boolean keyDown(int keyCode) { - if (keyCode == Input.Keys.BUTTON_SELECT) { + 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(); diff --git a/forge-gui/release-files/GAMEPAD_README.txt b/forge-gui/release-files/GAMEPAD_README.txt index cdb3056e814..a141668182d 100644 --- a/forge-gui/release-files/GAMEPAD_README.txt +++ b/forge-gui/release-files/GAMEPAD_README.txt @@ -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 \ No newline at end of file +Button Y - Show Zoom +Button Back - Show Menu Tabs \ No newline at end of file From b6cab2ac5c63fec75fedac34c513711ea4e4da6e Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 1 Sep 2022 20:10:28 +0800 Subject: [PATCH 3/3] remove comment --- forge-gui-mobile/src/forge/Forge.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index 5aa830105eb..0bc001ec08e 100644 --- a/forge-gui-mobile/src/forge/Forge.java +++ b/forge-gui-mobile/src/forge/Forge.java @@ -288,7 +288,7 @@ public class Forge implements ApplicationListener { if (controller.getMapping().buttonB == buttonIndex) { container.keyDown(Keys.BUTTON_B); } - if (controller.getMapping().buttonBack == buttonIndex) { //selecting player + if (controller.getMapping().buttonBack == buttonIndex) { container.keyDown(Keys.BUTTON_SELECT); } } else {//Others