mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 20:28:00 +00:00
Add FDeckViewer to display deck list when double-clicking
Improve support for opening modal dialog on top of another modal dialog
This commit is contained in:
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -15245,6 +15245,7 @@ forge-gui/src/main/java/forge/gui/deckchooser/DeckgenUtil.java -text
|
|||||||
forge-gui/src/main/java/forge/gui/deckchooser/DecksComboBox.java -text
|
forge-gui/src/main/java/forge/gui/deckchooser/DecksComboBox.java -text
|
||||||
forge-gui/src/main/java/forge/gui/deckchooser/DecksComboBoxEvent.java -text
|
forge-gui/src/main/java/forge/gui/deckchooser/DecksComboBoxEvent.java -text
|
||||||
forge-gui/src/main/java/forge/gui/deckchooser/FDeckChooser.java -text
|
forge-gui/src/main/java/forge/gui/deckchooser/FDeckChooser.java -text
|
||||||
|
forge-gui/src/main/java/forge/gui/deckchooser/FDeckViewer.java -text
|
||||||
forge-gui/src/main/java/forge/gui/deckchooser/GenerateThemeDeck.java svneol=native#text/plain
|
forge-gui/src/main/java/forge/gui/deckchooser/GenerateThemeDeck.java svneol=native#text/plain
|
||||||
forge-gui/src/main/java/forge/gui/deckchooser/IDecksComboBoxListener.java -text
|
forge-gui/src/main/java/forge/gui/deckchooser/IDecksComboBoxListener.java -text
|
||||||
forge-gui/src/main/java/forge/gui/deckeditor/CDeckEditorUI.java -text
|
forge-gui/src/main/java/forge/gui/deckeditor/CDeckEditorUI.java -text
|
||||||
|
|||||||
@@ -1,11 +1,8 @@
|
|||||||
package forge.gui.deckchooser;
|
package forge.gui.deckchooser;
|
||||||
|
|
||||||
import java.awt.Toolkit;
|
|
||||||
import java.awt.datatransfer.StringSelection;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map.Entry;
|
|
||||||
import com.google.common.base.Predicate;
|
import com.google.common.base.Predicate;
|
||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.Iterables;
|
||||||
|
|
||||||
@@ -13,7 +10,6 @@ import forge.Singletons;
|
|||||||
import forge.card.CardDb;
|
import forge.card.CardDb;
|
||||||
import forge.deck.CardPool;
|
import forge.deck.CardPool;
|
||||||
import forge.deck.Deck;
|
import forge.deck.Deck;
|
||||||
import forge.deck.DeckSection;
|
|
||||||
import forge.deck.generation.DeckGenerator2Color;
|
import forge.deck.generation.DeckGenerator2Color;
|
||||||
import forge.deck.generation.DeckGenerator3Color;
|
import forge.deck.generation.DeckGenerator3Color;
|
||||||
import forge.deck.generation.DeckGenerator5Color;
|
import forge.deck.generation.DeckGenerator5Color;
|
||||||
@@ -195,58 +191,6 @@ public class DeckgenUtil {
|
|||||||
deckManager.setSelectedIndex(MyRandom.getRandom().nextInt(size));
|
deckManager.setSelectedIndex(MyRandom.getRandom().nextInt(size));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Shows decklist dialog for a given deck.
|
|
||||||
* @param lst0 {@link javax.swing.JList}
|
|
||||||
*/
|
|
||||||
public static void showDecklist(final Deck deck) {
|
|
||||||
if (deck == null) { return; }
|
|
||||||
|
|
||||||
// Dump into map and display.
|
|
||||||
final String nl = System.getProperty("line.separator");
|
|
||||||
final StringBuilder deckList = new StringBuilder();
|
|
||||||
final String dName = deck.getName();
|
|
||||||
deckList.append(dName == null ? "" : dName + nl + nl);
|
|
||||||
|
|
||||||
int nLines = 0;
|
|
||||||
for (DeckSection s : DeckSection.values()){
|
|
||||||
CardPool cp = deck.get(s);
|
|
||||||
if (cp == null || cp.isEmpty()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
deckList.append(s.toString()).append(": ");
|
|
||||||
if (s.isSingleCard()) {
|
|
||||||
deckList.append(cp.get(0).getName()).append(nl);
|
|
||||||
nLines++;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
deckList.append(nl);
|
|
||||||
nLines++;
|
|
||||||
for (final Entry<PaperCard, Integer> ev : cp) {
|
|
||||||
deckList.append(ev.getValue()).append(" ").append(ev.getKey()).append(nl);
|
|
||||||
nLines++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
deckList.append(nl);
|
|
||||||
nLines++;
|
|
||||||
}
|
|
||||||
|
|
||||||
final StringBuilder msg = new StringBuilder();
|
|
||||||
if (nLines <= 32) {
|
|
||||||
msg.append(deckList.toString());
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
msg.append("Decklist too long for dialog." + nl + nl);
|
|
||||||
}
|
|
||||||
|
|
||||||
msg.append("Copy Decklist to Clipboard?");
|
|
||||||
|
|
||||||
// Output
|
|
||||||
if (FOptionPane.showConfirmDialog(msg.toString(), "Decklist", "OK", "Cancel")) {
|
|
||||||
final StringSelection ss = new StringSelection(deckList.toString());
|
|
||||||
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null);
|
|
||||||
}
|
|
||||||
} // End showDecklist
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks lengths of selected values for color lists
|
* Checks lengths of selected values for color lists
|
||||||
* to see if a deck generator exists. Alert and visual reminder if fail.
|
* to see if a deck generator exists. Alert and visual reminder if fail.
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
|
|||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
if (selectedDeckType != DeckType.COLOR_DECK && selectedDeckType != DeckType.THEME_DECK) {
|
if (selectedDeckType != DeckType.COLOR_DECK && selectedDeckType != DeckType.THEME_DECK) {
|
||||||
DeckgenUtil.showDecklist(getDeck());
|
FDeckViewer.show(getDeck());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
144
forge-gui/src/main/java/forge/gui/deckchooser/FDeckViewer.java
Normal file
144
forge-gui/src/main/java/forge/gui/deckchooser/FDeckViewer.java
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
package forge.gui.deckchooser;
|
||||||
|
|
||||||
|
import java.awt.Dimension;
|
||||||
|
import java.awt.Toolkit;
|
||||||
|
import java.awt.datatransfer.StringSelection;
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
|
import javax.swing.JLabel;
|
||||||
|
|
||||||
|
import forge.deck.CardPool;
|
||||||
|
import forge.deck.Deck;
|
||||||
|
import forge.deck.DeckSection;
|
||||||
|
import forge.gui.toolbox.FButton;
|
||||||
|
import forge.gui.toolbox.FOptionPane;
|
||||||
|
import forge.gui.toolbox.itemmanager.CardManager;
|
||||||
|
import forge.gui.toolbox.itemmanager.ItemManagerContainer;
|
||||||
|
import forge.gui.toolbox.itemmanager.views.ItemCellRenderer;
|
||||||
|
import forge.gui.toolbox.itemmanager.views.ItemColumn;
|
||||||
|
import forge.gui.toolbox.itemmanager.views.SColumnUtil;
|
||||||
|
import forge.gui.toolbox.itemmanager.views.ItemColumn.ColumnDef;
|
||||||
|
import forge.item.PaperCard;
|
||||||
|
import forge.view.FDialog;
|
||||||
|
|
||||||
|
@SuppressWarnings("serial")
|
||||||
|
public class FDeckViewer extends FDialog {
|
||||||
|
private final Deck deck;
|
||||||
|
private final List<DeckSection> sections = new ArrayList<DeckSection>();
|
||||||
|
private final CardManager cardManager;
|
||||||
|
private DeckSection currentSection;
|
||||||
|
|
||||||
|
private final FButton btnCopyToClipboard = new FButton("Copy to Clipboard");
|
||||||
|
private final FButton btnChangeSection = new FButton("Change Section");
|
||||||
|
private final FButton btnClose = new FButton("Close");
|
||||||
|
|
||||||
|
public static void show(final Deck deck) {
|
||||||
|
if (deck == null) { return; }
|
||||||
|
|
||||||
|
FDeckViewer deckViewer = new FDeckViewer(deck);
|
||||||
|
deckViewer.setVisible(true);
|
||||||
|
deckViewer.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
private FDeckViewer(Deck deck0) {
|
||||||
|
this.deck = deck0;
|
||||||
|
this.setTitle(deck.getName());
|
||||||
|
this.cardManager = new CardManager(false);
|
||||||
|
this.cardManager.setPool(deck.getMain());
|
||||||
|
this.setDefaultFocus(this.cardManager.getTable().getComponent());
|
||||||
|
|
||||||
|
for (Entry<DeckSection, CardPool> entry : deck) {
|
||||||
|
this.sections.add(entry.getKey());
|
||||||
|
}
|
||||||
|
this.currentSection = DeckSection.Main;
|
||||||
|
updateCaption();
|
||||||
|
|
||||||
|
this.btnCopyToClipboard.setFocusable(false);
|
||||||
|
this.btnCopyToClipboard.addActionListener(new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent arg0) {
|
||||||
|
FDeckViewer.this.copyToClipboard();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.btnChangeSection.setFocusable(false);
|
||||||
|
if (this.sections.size() > 1) {
|
||||||
|
this.btnChangeSection.addActionListener(new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent arg0) {
|
||||||
|
FDeckViewer.this.changeSection();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.btnChangeSection.setEnabled(false);
|
||||||
|
}
|
||||||
|
this.btnClose.setFocusable(false);
|
||||||
|
this.btnClose.addActionListener(new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent arg0) {
|
||||||
|
FDeckViewer.this.setVisible(false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
final int width = 700;
|
||||||
|
final int height = 600;
|
||||||
|
this.setPreferredSize(new Dimension(width, height));
|
||||||
|
this.setSize(width, height);
|
||||||
|
|
||||||
|
this.add(new ItemManagerContainer(this.cardManager), "w 100%, pushy, growy, spanx 4, gapbottom 10px, wrap");
|
||||||
|
this.add(this.btnCopyToClipboard, "w 200px!, h 26px!, gapright 5px");
|
||||||
|
this.add(this.btnChangeSection, "w 200px!, h 26px!");
|
||||||
|
this.add(new JLabel(), "pushx, growx");
|
||||||
|
this.add(this.btnClose, "w 120px!, h 26px!");
|
||||||
|
|
||||||
|
Map<ColumnDef, ItemColumn> columns = SColumnUtil.getDeckDefaultColumns();
|
||||||
|
columns.get(ColumnDef.DECK_QUANTITY).setCellRenderer(new ItemCellRenderer()); //prevent displaying +/- buttons
|
||||||
|
this.cardManager.getTable().setup(columns);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void changeSection() {
|
||||||
|
int index = sections.indexOf(currentSection);
|
||||||
|
index = (index + 1) % sections.size();
|
||||||
|
currentSection = sections.get(index);
|
||||||
|
this.cardManager.setPool(this.deck.get(currentSection));
|
||||||
|
updateCaption();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateCaption() {
|
||||||
|
this.cardManager.setCaption(deck.getName() + " - " + currentSection.name());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void copyToClipboard() {
|
||||||
|
final String nl = System.getProperty("line.separator");
|
||||||
|
final StringBuilder deckList = new StringBuilder();
|
||||||
|
final String dName = deck.getName();
|
||||||
|
deckList.append(dName == null ? "" : dName + nl + nl);
|
||||||
|
|
||||||
|
for (DeckSection s : DeckSection.values()){
|
||||||
|
CardPool cp = deck.get(s);
|
||||||
|
if (cp == null || cp.isEmpty()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
deckList.append(s.toString()).append(": ");
|
||||||
|
if (s.isSingleCard()) {
|
||||||
|
deckList.append(cp.get(0).getName()).append(nl);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
deckList.append(nl);
|
||||||
|
for (final Entry<PaperCard, Integer> ev : cp) {
|
||||||
|
deckList.append(ev.getValue()).append(" ").append(ev.getKey()).append(nl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
deckList.append(nl);
|
||||||
|
}
|
||||||
|
|
||||||
|
final StringSelection ss = new StringSelection(deckList.toString());
|
||||||
|
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null);
|
||||||
|
FOptionPane.showMessageDialog("Deck list for '" + deck.getName() + "' copied to clipboard.");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,13 +2,10 @@ package forge.gui.home.gauntlet;
|
|||||||
|
|
||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
||||||
import java.awt.event.ActionListener;
|
import java.awt.event.ActionListener;
|
||||||
import java.awt.event.MouseAdapter;
|
|
||||||
import java.awt.event.MouseEvent;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import javax.swing.JList;
|
|
||||||
import javax.swing.SwingUtilities;
|
import javax.swing.SwingUtilities;
|
||||||
|
|
||||||
import forge.Command;
|
import forge.Command;
|
||||||
@@ -19,7 +16,6 @@ import forge.game.player.RegisteredPlayer;
|
|||||||
import forge.gauntlet.GauntletData;
|
import forge.gauntlet.GauntletData;
|
||||||
import forge.gauntlet.GauntletIO;
|
import forge.gauntlet.GauntletIO;
|
||||||
import forge.gui.SOverlayUtils;
|
import forge.gui.SOverlayUtils;
|
||||||
import forge.gui.deckchooser.DeckgenUtil;
|
|
||||||
import forge.gui.framework.ICDoc;
|
import forge.gui.framework.ICDoc;
|
||||||
import forge.net.FServer;
|
import forge.net.FServer;
|
||||||
import forge.net.Lobby;
|
import forge.net.Lobby;
|
||||||
@@ -38,16 +34,6 @@ public enum CSubmenuGauntletContests implements ICDoc {
|
|||||||
|
|
||||||
private final VSubmenuGauntletContests view = VSubmenuGauntletContests.SINGLETON_INSTANCE;
|
private final VSubmenuGauntletContests view = VSubmenuGauntletContests.SINGLETON_INSTANCE;
|
||||||
|
|
||||||
private final MouseAdapter madDecklist = new MouseAdapter() {
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
@Override
|
|
||||||
public void mouseClicked(final MouseEvent e) {
|
|
||||||
final GauntletData gd = view.getGauntletLister().getSelectedGauntlet();
|
|
||||||
if (e.getClickCount() == 2)
|
|
||||||
DeckgenUtil.showDecklist( gd.getDecks().get(((JList<String>)e.getSource()).getSelectedIndex()) );
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
private final ActionListener actStartGame = new ActionListener() {
|
private final ActionListener actStartGame = new ActionListener() {
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent arg0) {
|
public void actionPerformed(ActionEvent arg0) {
|
||||||
@@ -71,7 +57,6 @@ public enum CSubmenuGauntletContests implements ICDoc {
|
|||||||
@Override
|
@Override
|
||||||
public void initialize() {
|
public void initialize() {
|
||||||
view.getBtnStart().addActionListener(actStartGame);
|
view.getBtnStart().addActionListener(actStartGame);
|
||||||
view.getLstDecks().addMouseListener(madDecklist);
|
|
||||||
|
|
||||||
view.getLstDecks().initialize();
|
view.getLstDecks().initialize();
|
||||||
updateData();
|
updateData();
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import java.awt.event.MouseMotionAdapter;
|
|||||||
import java.awt.event.WindowEvent;
|
import java.awt.event.WindowEvent;
|
||||||
import java.awt.event.WindowFocusListener;
|
import java.awt.event.WindowFocusListener;
|
||||||
import java.awt.geom.RoundRectangle2D;
|
import java.awt.geom.RoundRectangle2D;
|
||||||
|
import java.util.Stack;
|
||||||
|
|
||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
import javax.swing.JOptionPane;
|
import javax.swing.JOptionPane;
|
||||||
@@ -147,18 +148,29 @@ public class FDialog extends SkinnedDialog implements ITitleBarOwner, KeyEventDi
|
|||||||
if (this.isVisible() == visible) { return; }
|
if (this.isVisible() == visible) { return; }
|
||||||
|
|
||||||
if (visible) {
|
if (visible) {
|
||||||
setLocationRelativeTo(JOptionPane.getRootFrame());
|
if (openModals.isEmpty()) {
|
||||||
|
setLocationRelativeTo(JOptionPane.getRootFrame());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
setLocationRelativeTo(openModals.peek());
|
||||||
|
}
|
||||||
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(this); //support handling keyboard shortcuts in dialog
|
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(this); //support handling keyboard shortcuts in dialog
|
||||||
if (isModal()) {
|
if (isModal()) {
|
||||||
backdropPanel.setVisible(true);
|
if (openModals.isEmpty()) {
|
||||||
Singletons.getView().getNavigationBar().setMenuShortcutsEnabled(false);
|
backdropPanel.setVisible(true);
|
||||||
|
Singletons.getView().getNavigationBar().setMenuShortcutsEnabled(false);
|
||||||
|
}
|
||||||
|
openModals.push(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(this);
|
KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(this);
|
||||||
if (isModal()) {
|
if (isModal()) {
|
||||||
backdropPanel.setVisible(false);
|
openModals.pop();
|
||||||
Singletons.getView().getNavigationBar().setMenuShortcutsEnabled(true);
|
if (openModals.isEmpty()) {
|
||||||
|
backdropPanel.setVisible(false);
|
||||||
|
Singletons.getView().getNavigationBar().setMenuShortcutsEnabled(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
super.setVisible(visible);
|
super.setVisible(visible);
|
||||||
@@ -317,6 +329,7 @@ public class FDialog extends SkinnedDialog implements ITitleBarOwner, KeyEventDi
|
|||||||
return getIconImages().isEmpty() ? null : getIconImages().get(0);
|
return getIconImages().isEmpty() ? null : getIconImages().get(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final Stack<FDialog> openModals = new Stack<FDialog>();
|
||||||
private static final BackdropPanel backdropPanel = new BackdropPanel();
|
private static final BackdropPanel backdropPanel = new BackdropPanel();
|
||||||
|
|
||||||
public static JPanel getBackdropPanel() {
|
public static JPanel getBackdropPanel() {
|
||||||
|
|||||||
Reference in New Issue
Block a user