diff --git a/.gitattributes b/.gitattributes index dd58893be21..5d591045bc0 100644 --- a/.gitattributes +++ b/.gitattributes @@ -925,6 +925,7 @@ forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLose.java -text forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLoseCardViewer.java -text forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java -text forge-gui-desktop/src/main/java/forge/screens/match/VAssignDamage.java -text +forge-gui-desktop/src/main/java/forge/screens/match/VAutoYields.java -text forge-gui-desktop/src/main/java/forge/screens/match/VMatchUI.java -text forge-gui-desktop/src/main/java/forge/screens/match/ViewWinLose.java -text forge-gui-desktop/src/main/java/forge/screens/match/ZoneAction.java -text diff --git a/forge-gui-desktop/src/main/java/forge/control/FControl.java b/forge-gui-desktop/src/main/java/forge/control/FControl.java index 4b76d382d5b..62a0f135d05 100644 --- a/forge-gui-desktop/src/main/java/forge/control/FControl.java +++ b/forge-gui-desktop/src/main/java/forge/control/FControl.java @@ -97,6 +97,7 @@ public enum FControl implements KeyEventDispatcher { private FScreen currentScreen; private boolean altKeyLastDown; private CloseAction closeAction; + private Player localPlayer; public static enum CloseAction { NONE, @@ -387,6 +388,10 @@ public enum FControl implements KeyEventDispatcher { return game; } + public Player getLocalPlayer() { + return localPlayer; + } + public final void stopGame() { List pp = new ArrayList(); for (Player p : game.getPlayers()) { @@ -476,7 +481,7 @@ public enum FControl implements KeyEventDispatcher { // The UI controls should use these game data as models CMatchUI.SINGLETON_INSTANCE.initMatch(game.getRegisteredPlayers(), humanLobbyPlayer); - Player localPlayer = null; + localPlayer = null; for (Player p : game.getPlayers()) { if (p.getLobbyPlayer() == humanLobbyPlayer) { localPlayer = p; diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/VAutoYields.java b/forge-gui-desktop/src/main/java/forge/screens/match/VAutoYields.java new file mode 100644 index 00000000000..21e36fd3aa9 --- /dev/null +++ b/forge-gui-desktop/src/main/java/forge/screens/match/VAutoYields.java @@ -0,0 +1,103 @@ +package forge.screens.match; + +import java.awt.Dimension; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; + +import forge.Singletons; +import forge.UiCommand; +import forge.game.Game; +import forge.game.player.Player; +import forge.toolbox.FButton; +import forge.toolbox.FCheckBox; +import forge.toolbox.FList; +import forge.toolbox.FOptionPane; +import forge.toolbox.FScrollPane; +import forge.view.FDialog; + +@SuppressWarnings("serial") +public class VAutoYields extends FDialog { + private static final int PADDING = 10; + private static final int BUTTON_WIDTH = 140; + private static final int BUTTON_HEIGHT = 26; + + private final FButton btnOk; + private final FButton btnRemove; + private final FList lstAutoYields; + private final FScrollPane listScroller; + private final FCheckBox chkDisableAll; + + public VAutoYields(final Game game, final Player player) { + super(true); + setTitle("Auto-Yields"); + + List autoYields = new ArrayList(); + for (String autoYield : player.getController().getAutoYields()) { + autoYields.add(autoYield); + } + lstAutoYields = new FList(autoYields.toArray(new String[]{})); + + int x = PADDING; + int y = PADDING; + int width = Singletons.getView().getFrame().getWidth() * 2 / 3; + int w = width - 2 * PADDING; + + listScroller = new FScrollPane(lstAutoYields, true); + + chkDisableAll = new FCheckBox("Disable All Auto Yields", game.getDisableAutoYields()); + chkDisableAll.addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + game.setDisableAutoYields(chkDisableAll.isSelected()); + } + }); + + btnOk = new FButton("OK"); + btnOk.setCommand(new UiCommand() { + @Override + public void run() { + setVisible(false); + } + }); + btnRemove = new FButton("Remove Yield"); + btnRemove.setCommand(new UiCommand() { + @Override + public void run() { + String selected = lstAutoYields.getSelectedValue(); + if (selected != null) { + lstAutoYields.removeItem(selected); + player.getController().setShouldAutoYield(selected, false); + VAutoYields.this.revalidate(); + } + } + }); + btnRemove.setEnabled(autoYields.size() > 0); + + Dimension checkBoxSize = chkDisableAll.getPreferredSize(); + int listHeight = lstAutoYields.getMinimumSize().height + 2 * PADDING; + + add(listScroller, x, y, w, listHeight); + y += listHeight + PADDING; + add(chkDisableAll, x, y, checkBoxSize.width, checkBoxSize.height); + x = w - 2 * BUTTON_WIDTH - PADDING; + add(btnOk, x, y, BUTTON_WIDTH, BUTTON_HEIGHT); + x += BUTTON_WIDTH + PADDING; + add(btnRemove, x, y, BUTTON_WIDTH, BUTTON_HEIGHT); + + this.pack(); + this.setSize(width, getHeight()); + } + + public void showAutoYields() { + if (lstAutoYields.getCount() > 0) { + setVisible(true); + dispose(); + } + else { + FOptionPane.showMessageDialog("There are no active auto-yields.", "No Auto-Yields", FOptionPane.INFORMATION_ICON); + } + } +} diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/menus/GameMenu.java b/forge-gui-desktop/src/main/java/forge/screens/match/menus/GameMenu.java index ec4ef260ff7..709c2ae48b8 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/menus/GameMenu.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/menus/GameMenu.java @@ -1,12 +1,15 @@ package forge.screens.match.menus; +import forge.Singletons; import forge.assets.FSkinProp; +import forge.control.FControl; import forge.match.MatchUtil; import forge.menus.MenuUtil; import forge.model.FModel; import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; import forge.screens.match.CMatchUI; +import forge.screens.match.VAutoYields; import forge.screens.match.controllers.CDock; import forge.toolbox.FSkin.*; @@ -38,10 +41,11 @@ public final class GameMenu { menu.addSeparator(); menu.add(getMenuItem_TargetingArcs()); menu.add(CardOverlaysMenu.getMenu(showMenuIcons)); - menu.addSeparator(); - menu.add(getMenuItem_GameSoundEffects()); + menu.add(getMenuItem_AutoYields()); menu.addSeparator(); menu.add(getMenuItem_ViewDeckList()); + menu.addSeparator(); + menu.add(getMenuItem_GameSoundEffects()); return menu; } @@ -183,6 +187,24 @@ public final class GameMenu { menu.setIcon(item.getIcon()); } + private static SkinnedMenuItem getMenuItem_AutoYields() { + SkinnedMenuItem menuItem = new SkinnedMenuItem("Auto-Yields"); + menuItem.setIcon((showIcons ? MenuUtil.getMenuIcon(FSkinProp.ICO_WARNING) : null)); + menuItem.addActionListener(getAutoYieldsAction()); + return menuItem; + } + + private static ActionListener getAutoYieldsAction() { + return new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + FControl control = Singletons.getControl(); + VAutoYields autoYields = new VAutoYields(control.getObservedGame(), control.getLocalPlayer()); + autoYields.showAutoYields(); + } + }; + } + private static SkinnedMenuItem getMenuItem_ViewDeckList() { SkinnedMenuItem menuItem = new SkinnedMenuItem("Deck List"); menuItem.setIcon((showIcons ? MenuUtil.getMenuIcon(FSkinProp.ICO_DECKLIST) : null)); @@ -198,5 +220,4 @@ public final class GameMenu { } }; } - } diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/FList.java b/forge-gui-desktop/src/main/java/forge/toolbox/FList.java index dbf1a26028c..c73c8a8709a 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/FList.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/FList.java @@ -93,6 +93,15 @@ public class FList extends SkinnedList { return width; } + public int getCount() { + return getModel().getSize(); + } + + @SuppressWarnings("rawtypes") + public void removeItem(E item) { + ((DefaultListModel)getModel()).removeElement(item); + } + private class ComplexCellRenderer implements ListCellRenderer { private DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer(); diff --git a/forge-gui-desktop/src/main/java/forge/view/FDialog.java b/forge-gui-desktop/src/main/java/forge/view/FDialog.java index b66c2215679..a1b3da674b2 100644 --- a/forge-gui-desktop/src/main/java/forge/view/FDialog.java +++ b/forge-gui-desktop/src/main/java/forge/view/FDialog.java @@ -205,7 +205,11 @@ public class FDialog extends SkinnedDialog implements ITitleBarOwner, KeyEventDi } super.add(popup); } - + + public void add(Component comp, int x, int y, int w, int h) { + add(comp, "x " + x + ", y " + y + ", w " + w + ", h " + h); + } + @Override public void add(Component comp, Object constraints) { if (innerPanel != null) {