Add Net Decks support

This commit is contained in:
drdev
2015-01-25 05:10:32 +00:00
parent f3a30793c5
commit 30fbe55ac3
25 changed files with 756 additions and 251 deletions

View File

@@ -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);

View File

@@ -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);
}
}

View File

@@ -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) {

View File

@@ -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();

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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 &emsp; 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 &emsp; Boolean, show the ETA statistic or not */
public void setShowETA(boolean b0) {
showETA = b0;
}
/** @param b0 &emsp; 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;
}
}