mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-16 10:48:00 +00:00
Add Net Decks support
This commit is contained in:
@@ -23,6 +23,8 @@ import forge.assets.FSkinProp;
|
||||
import forge.assets.ISkinImage;
|
||||
import forge.control.GuiTimer;
|
||||
import forge.deck.CardPool;
|
||||
import forge.download.GuiDownloadService;
|
||||
import forge.download.GuiDownloader;
|
||||
import forge.error.BugReportDialog;
|
||||
import forge.game.GameEntity;
|
||||
import forge.game.GameEntityView;
|
||||
@@ -50,6 +52,7 @@ import forge.toolbox.FOptionPane;
|
||||
import forge.toolbox.FSkin;
|
||||
import forge.toolbox.FSkin.SkinImage;
|
||||
import forge.util.BuildInfo;
|
||||
import forge.util.Callback;
|
||||
import forge.util.FCollectionView;
|
||||
import forge.util.FileUtil;
|
||||
import forge.util.gui.SGuiChoose;
|
||||
@@ -258,6 +261,11 @@ public class GuiDesktop implements IGuiBase {
|
||||
return fc.getSelectedFile();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void download(GuiDownloadService service, Callback<Boolean> callback) {
|
||||
new GuiDownloader(service, callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void copyToClipboard(String text) {
|
||||
StringSelection ss = new StringSelection(text);
|
||||
|
||||
@@ -33,13 +33,16 @@ public class DecksComboBox extends FComboBoxWrapper<DeckType> {
|
||||
return new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
MouseUtil.setCursor(Cursor.WAIT_CURSOR);
|
||||
DeckType newDeckType = (DeckType)getSelectedItem();
|
||||
if (newDeckType != selectedDeckType) {
|
||||
notifyDeckTypeSelected(newDeckType);
|
||||
selectedDeckType = newDeckType;
|
||||
Object selectedItem = getSelectedItem();
|
||||
if (selectedItem instanceof DeckType) {
|
||||
MouseUtil.setCursor(Cursor.WAIT_CURSOR);
|
||||
DeckType newDeckType = (DeckType)selectedItem;
|
||||
if (newDeckType != selectedDeckType) {
|
||||
selectedDeckType = newDeckType;
|
||||
notifyDeckTypeSelected(newDeckType);
|
||||
}
|
||||
MouseUtil.resetCursor();
|
||||
}
|
||||
MouseUtil.resetCursor();
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -68,4 +71,10 @@ public class DecksComboBox extends FComboBoxWrapper<DeckType> {
|
||||
selectedDeckType = valueOf;
|
||||
setSelectedItem(selectedDeckType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setText(String text0) {
|
||||
selectedDeckType = null; //ensure selecting current deck type again raises event
|
||||
super.setText(text0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ import forge.deck.Deck;
|
||||
import forge.deck.DeckProxy;
|
||||
import forge.deck.DeckType;
|
||||
import forge.deck.DeckgenUtil;
|
||||
import forge.deck.NetDeckCategory;
|
||||
import forge.deck.RandomDeckGenerator;
|
||||
import forge.game.GameType;
|
||||
import forge.game.player.RegisteredPlayer;
|
||||
@@ -38,6 +39,8 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
|
||||
private DecksComboBox decksComboBox;
|
||||
private DeckType selectedDeckType;
|
||||
private ItemManagerContainer lstDecksContainer;
|
||||
private NetDeckCategory netDeckCategory;
|
||||
private boolean refreshingDeckType;
|
||||
|
||||
private final DeckManager lstDecks = new DeckManager(GameType.Constructed);
|
||||
private final FLabel btnViewDeck = new FLabel.ButtonBuilder().text("View Deck").fontSize(14).build();
|
||||
@@ -219,6 +222,26 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
|
||||
});
|
||||
}
|
||||
|
||||
private void updateNetDecks() {
|
||||
if (netDeckCategory != null) {
|
||||
decksComboBox.setText(netDeckCategory.toString());
|
||||
}
|
||||
lstDecks.setAllowMultipleSelections(false);
|
||||
|
||||
lstDecks.setPool(DeckProxy.getNetDecks(netDeckCategory));
|
||||
lstDecks.setup(ItemManagerConfig.NET_DECKS);
|
||||
|
||||
btnRandom.setText("Random Deck");
|
||||
btnRandom.setCommand(new UiCommand() {
|
||||
@Override
|
||||
public void run() {
|
||||
DeckgenUtil.randomSelect(lstDecks);
|
||||
}
|
||||
});
|
||||
|
||||
lstDecks.setSelectedIndex(0);
|
||||
}
|
||||
|
||||
public Deck getDeck() {
|
||||
DeckProxy proxy = lstDecks.getSelectedItem();
|
||||
return proxy.getDeck();
|
||||
@@ -269,14 +292,36 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
|
||||
}
|
||||
|
||||
public void setIsAi(boolean isAiDeck) {
|
||||
this.isAi = isAiDeck;
|
||||
isAi = isAiDeck;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.deckchooser.IDecksComboBoxListener#deckTypeSelected(forge.gui.deckchooser.DecksComboBoxEvent)
|
||||
*/
|
||||
@Override
|
||||
public void deckTypeSelected(DecksComboBoxEvent ev) {
|
||||
public void deckTypeSelected(final DecksComboBoxEvent ev) {
|
||||
if (ev.getDeckType() == DeckType.NET_DECK && !refreshingDeckType) {
|
||||
FThreads.invokeInBackgroundThread(new Runnable() { //needed for loading net decks
|
||||
@Override
|
||||
public void run() {
|
||||
final NetDeckCategory category = NetDeckCategory.selectAndLoad(lstDecks.getGameType());
|
||||
|
||||
FThreads.invokeInEdtLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (category == null) {
|
||||
decksComboBox.setDeckType(selectedDeckType); //restore old selection if user cancels
|
||||
if (selectedDeckType == DeckType.NET_DECK && netDeckCategory != null) {
|
||||
decksComboBox.setText(netDeckCategory.toString());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
netDeckCategory = category;
|
||||
refreshDecksList(DeckType.NET_DECK, true, ev);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
return;
|
||||
}
|
||||
refreshDecksList(ev.getDeckType(), false, ev);
|
||||
}
|
||||
|
||||
@@ -285,7 +330,9 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
|
||||
selectedDeckType = deckType;
|
||||
|
||||
if (ev == null) {
|
||||
refreshingDeckType = true;
|
||||
decksComboBox.refresh(deckType);
|
||||
refreshingDeckType = false;
|
||||
}
|
||||
lstDecks.setCaption(deckType.toString());
|
||||
|
||||
@@ -308,6 +355,9 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
|
||||
case RANDOM_DECK:
|
||||
updateRandom();
|
||||
break;
|
||||
case NET_DECK:
|
||||
updateNetDecks();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -322,8 +372,15 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
|
||||
}
|
||||
|
||||
private String getState() {
|
||||
String deckType = decksComboBox.getDeckType().name();
|
||||
StringBuilder state = new StringBuilder(deckType);
|
||||
StringBuilder state = new StringBuilder();
|
||||
if (decksComboBox.getDeckType() == null || decksComboBox.getDeckType() == DeckType.NET_DECK) {
|
||||
//handle special case of net decks
|
||||
if (netDeckCategory == null) { return ""; }
|
||||
state.append(NetDeckCategory.PREFIX + netDeckCategory.getName());
|
||||
}
|
||||
else {
|
||||
state.append(decksComboBox.getDeckType().name());
|
||||
}
|
||||
state.append(";");
|
||||
joinSelectedDecks(state, SELECTED_DECK_DELIMITER);
|
||||
return state.toString();
|
||||
@@ -345,25 +402,20 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
|
||||
}
|
||||
}
|
||||
|
||||
/** Returns a clean name from the state that can be used for labels. */
|
||||
public final String getStateForLabel() {
|
||||
String deckType = decksComboBox.getDeckType().toString();
|
||||
StringBuilder state = new StringBuilder(deckType);
|
||||
state.append(": ");
|
||||
joinSelectedDecks(state, ", ");
|
||||
return state.toString();
|
||||
}
|
||||
|
||||
private void restoreSavedState() {
|
||||
DeckType oldDeckType = selectedDeckType;
|
||||
if (stateSetting == null) {
|
||||
//if can't restore saved state, just refresh deck list
|
||||
refreshDecksList(selectedDeckType, true, null);
|
||||
refreshDecksList(oldDeckType, true, null);
|
||||
return;
|
||||
}
|
||||
|
||||
String savedState = prefs.getPref(stateSetting);
|
||||
refreshDecksList(getDeckTypeFromSavedState(savedState), true, null);
|
||||
lstDecks.setSelectedStrings(getSelectedDecksFromSavedState(savedState));
|
||||
if (!lstDecks.setSelectedStrings(getSelectedDecksFromSavedState(savedState))) {
|
||||
//if can't select old decks, just refresh deck list
|
||||
refreshDecksList(oldDeckType, true, null);
|
||||
}
|
||||
}
|
||||
|
||||
private DeckType getDeckTypeFromSavedState(String savedState) {
|
||||
@@ -372,7 +424,12 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
|
||||
return selectedDeckType;
|
||||
}
|
||||
else {
|
||||
return DeckType.valueOf(savedState.split(";")[0]);
|
||||
String deckType = savedState.split(";")[0];
|
||||
if (deckType.startsWith(NetDeckCategory.PREFIX)) {
|
||||
netDeckCategory = NetDeckCategory.selectAndLoad(lstDecks.getGameType(), deckType.substring(NetDeckCategory.PREFIX.length()));
|
||||
return DeckType.NET_DECK;
|
||||
}
|
||||
return DeckType.valueOf(deckType);
|
||||
}
|
||||
}
|
||||
catch (IllegalArgumentException ex) {
|
||||
|
||||
@@ -23,6 +23,7 @@ import forge.UiCommand;
|
||||
import forge.assets.FSkinProp;
|
||||
import forge.gui.SOverlayUtils;
|
||||
import forge.toolbox.*;
|
||||
import forge.util.Callback;
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
|
||||
import javax.swing.*;
|
||||
@@ -47,6 +48,10 @@ public class GuiDownloader extends DefaultBoundedRangeModel {
|
||||
|
||||
// Kill overlay
|
||||
SOverlayUtils.hideOverlay();
|
||||
|
||||
if (callback != null) {
|
||||
callback.run(btnStart.getText() == "OK"); //determine result based on whether download finished
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -58,9 +63,14 @@ public class GuiDownloader extends DefaultBoundedRangeModel {
|
||||
private final FRadioButton radProxyHTTP = new FRadioButton("HTTP Proxy");
|
||||
|
||||
private final GuiDownloadService service;
|
||||
private final Callback<Boolean> callback;
|
||||
|
||||
public GuiDownloader(GuiDownloadService service0) {
|
||||
this(service0, null);
|
||||
}
|
||||
public GuiDownloader(GuiDownloadService service0, Callback<Boolean> callback0) {
|
||||
service = service0;
|
||||
callback = callback0;
|
||||
|
||||
String radConstraints = "w 100%!, h 30px!, gap 2% 0 0 10px";
|
||||
JXButtonPanel grpPanel = new JXButtonPanel();
|
||||
|
||||
@@ -52,7 +52,19 @@ public class FComboBox<E> extends SkinnedComboBox<E> implements IComboBox<E> {
|
||||
private Border getDefaultBorder() {
|
||||
return UIManager.getBorder("ComboBox.border");
|
||||
}
|
||||
|
||||
|
||||
public String getText() {
|
||||
Object selectedItem = getSelectedItem();
|
||||
if (selectedItem == null) {
|
||||
return "";
|
||||
}
|
||||
return selectedItem.toString();
|
||||
}
|
||||
public void setText(String text0) {
|
||||
setSelectedItem(null);
|
||||
dataModel.setSelectedItem(text0); //use this to get around inability to set selected item that's not in items
|
||||
}
|
||||
|
||||
public TextAlignment getTextAlignment() {
|
||||
return textAlignment;
|
||||
}
|
||||
@@ -60,7 +72,7 @@ public class FComboBox<E> extends SkinnedComboBox<E> implements IComboBox<E> {
|
||||
public void setTextAlignment(TextAlignment align) {
|
||||
textAlignment = align;
|
||||
}
|
||||
|
||||
|
||||
public SkinFont getSkinFont() {
|
||||
return this.skinFont;
|
||||
}
|
||||
|
||||
@@ -32,138 +32,145 @@ public class FComboBoxWrapper<E> implements IComboBox<E> {
|
||||
|
||||
public FComboBoxWrapper() {
|
||||
super();
|
||||
this.comboBox = new FComboBox<E>();
|
||||
comboBox = new FComboBox<E>();
|
||||
allWrappers.add(this);
|
||||
}
|
||||
|
||||
public FComboBoxWrapper(E[] items) {
|
||||
super();
|
||||
this.comboBox = new FComboBox<E>(items);
|
||||
comboBox = new FComboBox<E>(items);
|
||||
allWrappers.add(this);
|
||||
}
|
||||
|
||||
public FComboBoxWrapper(Vector<E> items) {
|
||||
super();
|
||||
this.comboBox = new FComboBox<E>(items);
|
||||
comboBox = new FComboBox<E>(items);
|
||||
allWrappers.add(this);
|
||||
}
|
||||
|
||||
public FComboBoxWrapper(ComboBoxModel<E> aModel) {
|
||||
super();
|
||||
this.comboBox = new FComboBox<E>(aModel);
|
||||
comboBox = new FComboBox<E>(aModel);
|
||||
allWrappers.add(this);
|
||||
}
|
||||
|
||||
public void addItem(E item) {
|
||||
this.comboBox.addItem(item);
|
||||
comboBox.addItem(item);
|
||||
}
|
||||
|
||||
public void removeItem(E item) {
|
||||
this.comboBox.removeItem(item);
|
||||
comboBox.removeItem(item);
|
||||
}
|
||||
|
||||
public void removeAllItems() {
|
||||
this.comboBox.removeAllItems();
|
||||
comboBox.removeAllItems();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public E getSelectedItem() {
|
||||
Object res = this.comboBox.getSelectedItem();
|
||||
Object res = comboBox.getSelectedItem();
|
||||
return res == null ? null : (E) res;
|
||||
}
|
||||
|
||||
public void setSelectedItem(Object item) {
|
||||
this.comboBox.setSelectedItem(item);
|
||||
comboBox.setSelectedItem(item);
|
||||
}
|
||||
|
||||
public int getSelectedIndex() {
|
||||
return this.comboBox.getSelectedIndex();
|
||||
return comboBox.getSelectedIndex();
|
||||
}
|
||||
|
||||
public void setSelectedIndex(int index) {
|
||||
this.comboBox.setSelectedIndex(index);
|
||||
comboBox.setSelectedIndex(index);
|
||||
}
|
||||
|
||||
public String getText() {
|
||||
return comboBox.getText();
|
||||
}
|
||||
public void setText(String text0) {
|
||||
comboBox.setText(text0);
|
||||
}
|
||||
|
||||
public void setMaximumRowCount(int count) {
|
||||
this.comboBox.setMaximumRowCount(count);
|
||||
comboBox.setMaximumRowCount(count);
|
||||
}
|
||||
|
||||
public int getItemCount() {
|
||||
return this.comboBox.getItemCount();
|
||||
return comboBox.getItemCount();
|
||||
}
|
||||
|
||||
public E getItemAt(int index) {
|
||||
return this.comboBox.getItemAt(index);
|
||||
return comboBox.getItemAt(index);
|
||||
}
|
||||
|
||||
public void addActionListener(ActionListener l) {
|
||||
this.comboBox.addActionListener(l);
|
||||
comboBox.addActionListener(l);
|
||||
}
|
||||
|
||||
public void addItemListener(ItemListener l) {
|
||||
this.comboBox.addItemListener(l);
|
||||
comboBox.addItemListener(l);
|
||||
}
|
||||
|
||||
public void addKeyListener(KeyListener l) {
|
||||
this.comboBox.addKeyListener(l);
|
||||
comboBox.addKeyListener(l);
|
||||
}
|
||||
|
||||
public void setRenderer(ListCellRenderer<? super E> aRenderer) {
|
||||
this.comboBox.setRenderer(aRenderer);
|
||||
comboBox.setRenderer(aRenderer);
|
||||
}
|
||||
|
||||
public void setModel(ComboBoxModel<E> aModel) {
|
||||
this.comboBox.setModel(aModel);
|
||||
comboBox.setModel(aModel);
|
||||
}
|
||||
|
||||
public void setTextAlignment(TextAlignment align) {
|
||||
this.comboBox.setTextAlignment(align);
|
||||
comboBox.setTextAlignment(align);
|
||||
}
|
||||
|
||||
public void setSkinFont(SkinFont skinFont) {
|
||||
this.comboBox.setSkinFont(skinFont);
|
||||
comboBox.setSkinFont(skinFont);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isVisible() {
|
||||
return this.comboBox.isVisible();
|
||||
return comboBox.isVisible();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setVisible(boolean aFlag) {
|
||||
this.comboBox.setVisible(aFlag);
|
||||
comboBox.setVisible(aFlag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnabled() {
|
||||
return this.comboBox.isEnabled();
|
||||
return comboBox.isEnabled();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setEnabled(boolean aFlag) {
|
||||
this.comboBox.setEnabled(aFlag);
|
||||
comboBox.setEnabled(aFlag);
|
||||
}
|
||||
|
||||
public int getAutoSizeWidth() {
|
||||
return this.comboBox.getAutoSizeWidth();
|
||||
return comboBox.getAutoSizeWidth();
|
||||
}
|
||||
|
||||
public void addTo(Container container) {
|
||||
this.addTo(container, null);
|
||||
addTo(container, null);
|
||||
}
|
||||
public void addTo(Container container, Object constraints0) {
|
||||
container.add(this.comboBox, constraints0);
|
||||
this.constraints = constraints0;
|
||||
container.add(comboBox, constraints0);
|
||||
constraints = constraints0;
|
||||
}
|
||||
|
||||
//disguise as component for sake of rare places that need to access component in wrapper
|
||||
//use addTo instead if you want constraints remembered after refreshing skin
|
||||
public JComponent getComponent() {
|
||||
return this.comboBox;
|
||||
return comboBox;
|
||||
}
|
||||
|
||||
private void refreshSkin() {
|
||||
this.comboBox = refreshComboBoxSkin(this.comboBox, this.constraints);
|
||||
comboBox = refreshComboBoxSkin(comboBox, constraints);
|
||||
}
|
||||
|
||||
//refresh combo box skin by replacing it with a copy of itself
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package forge.toolbox;
|
||||
|
||||
import forge.FThreads;
|
||||
import forge.interfaces.IProgressBar;
|
||||
|
||||
import javax.swing.*;
|
||||
@@ -9,9 +8,6 @@ import java.util.Date;
|
||||
|
||||
/**
|
||||
* A simple progress bar component using the Forge skin.
|
||||
*
|
||||
* Can show
|
||||
*
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public class FProgressBar extends JProgressBar implements IProgressBar {
|
||||
@@ -23,20 +19,13 @@ public class FProgressBar extends JProgressBar implements IProgressBar {
|
||||
|
||||
private boolean percentMode = false;
|
||||
|
||||
/** */
|
||||
public FProgressBar() {
|
||||
super();
|
||||
reset();
|
||||
setStringPainted(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets description on bar. Must be called from EDT.
|
||||
*
|
||||
* @param s0   A description to prepend before statistics.
|
||||
*/
|
||||
public void setDescription(final String s0) {
|
||||
FThreads.assertExecutedByEdt(true);
|
||||
desc = s0;
|
||||
setString(s0);
|
||||
}
|
||||
@@ -79,9 +68,8 @@ public class FProgressBar extends JProgressBar implements IProgressBar {
|
||||
setString(sb.toString());
|
||||
}
|
||||
|
||||
/** Resets the various values required for this class. Must be called from EDT. */
|
||||
/** Resets the various values required for this class. */
|
||||
public void reset() {
|
||||
FThreads.assertExecutedByEdt(true);
|
||||
setIndeterminate(true);
|
||||
setValue(0);
|
||||
tempVal = 0;
|
||||
@@ -91,17 +79,14 @@ public class FProgressBar extends JProgressBar implements IProgressBar {
|
||||
setShowCount(true);
|
||||
}
|
||||
|
||||
/** @param b0   Boolean, show the ETA statistic or not */
|
||||
public void setShowETA(boolean b0) {
|
||||
showETA = b0;
|
||||
}
|
||||
|
||||
/** @param b0   Boolean, show the ETA statistic or not */
|
||||
public void setShowCount(boolean b0) {
|
||||
showCount = b0;
|
||||
}
|
||||
|
||||
/** */
|
||||
private void calculateETA(int v0) {
|
||||
float tempMillis = new Date().getTime();
|
||||
float timePerUnit = (tempMillis - startMillis) / v0;
|
||||
@@ -111,9 +96,7 @@ public class FProgressBar extends JProgressBar implements IProgressBar {
|
||||
public boolean isPercentMode() {
|
||||
return percentMode;
|
||||
}
|
||||
|
||||
public void setPercentMode(boolean value) {
|
||||
percentMode = value;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user