Add header to deck editor

This commit is contained in:
drdev
2014-06-11 02:58:58 +00:00
parent c349c3df29
commit d23d9a9665
4 changed files with 96 additions and 109 deletions

View File

@@ -2,11 +2,14 @@ package forge.deck;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment;
import com.badlogic.gdx.math.Vector2;
import com.google.common.base.Supplier; import com.google.common.base.Supplier;
import forge.Forge; import forge.Forge.Graphics;
import forge.assets.FImage; import forge.assets.FImage;
import forge.assets.FSkin; import forge.assets.FSkin;
import forge.assets.FSkinFont;
import forge.assets.FSkinImage; import forge.assets.FSkinImage;
import forge.assets.FTextureRegionImage; import forge.assets.FTextureRegionImage;
import forge.deck.io.DeckPreferences; import forge.deck.io.DeckPreferences;
@@ -16,17 +19,19 @@ import forge.itemmanager.ItemManagerConfig;
import forge.limited.BoosterDraft; import forge.limited.BoosterDraft;
import forge.model.FModel; import forge.model.FModel;
import forge.screens.TabPageScreen; import forge.screens.TabPageScreen;
import forge.toolbox.FContainer;
import forge.toolbox.FEvent; import forge.toolbox.FEvent;
import forge.toolbox.FEvent.FEventHandler; import forge.toolbox.FEvent.FEventHandler;
import forge.toolbox.FLabel; import forge.toolbox.FLabel;
import forge.toolbox.FOptionPane; import forge.toolbox.FOptionPane;
import forge.toolbox.FTextField;
import forge.util.Callback; import forge.util.Callback;
import forge.util.ItemPool; import forge.util.ItemPool;
import forge.util.Utils; import forge.util.Utils;
import forge.util.storage.IStorage; import forge.util.storage.IStorage;
public class FDeckEditor extends TabPageScreen<FDeckEditor> { public class FDeckEditor extends TabPageScreen<FDeckEditor> {
private static final float HEADER_HEIGHT = Math.round(Utils.AVG_FINGER_HEIGHT * 0.8f);
public enum EditorType { public enum EditorType {
Constructed(new DeckController<Deck>(FModel.getDecks().getConstructed(), new Supplier<Deck>() { Constructed(new DeckController<Deck>(FModel.getDecks().getConstructed(), new Supplier<Deck>() {
@Override @Override
@@ -95,53 +100,46 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
return new DeckEditorPage[] { return new DeckEditorPage[] {
new CatalogPage(), new CatalogPage(),
new DeckSectionPage(DeckSection.Main), new DeckSectionPage(DeckSection.Main),
new DeckSectionPage(DeckSection.Sideboard), new DeckSectionPage(DeckSection.Sideboard)
new OptionsPage()
}; };
case Draft: case Draft:
return new DeckEditorPage[] { return new DeckEditorPage[] {
new DraftPackPage(), new DraftPackPage(),
new DeckSectionPage(DeckSection.Main), new DeckSectionPage(DeckSection.Main),
new DeckSectionPage(DeckSection.Sideboard, ItemManagerConfig.DRAFT_POOL), new DeckSectionPage(DeckSection.Sideboard, ItemManagerConfig.DRAFT_POOL)
new OptionsPage()
}; };
case Sealed: case Sealed:
return new DeckEditorPage[] { return new DeckEditorPage[] {
new DeckSectionPage(DeckSection.Main), new DeckSectionPage(DeckSection.Main),
new DeckSectionPage(DeckSection.Sideboard, ItemManagerConfig.SEALED_POOL), new DeckSectionPage(DeckSection.Sideboard, ItemManagerConfig.SEALED_POOL)
new OptionsPage()
}; };
case Commander: case Commander:
return new DeckEditorPage[] { return new DeckEditorPage[] {
new CatalogPage(), new CatalogPage(),
new DeckSectionPage(DeckSection.Main), new DeckSectionPage(DeckSection.Main),
new DeckSectionPage(DeckSection.Sideboard), new DeckSectionPage(DeckSection.Sideboard),
new DeckSectionPage(DeckSection.Commander), new DeckSectionPage(DeckSection.Commander)
new OptionsPage()
}; };
case Archenemy: case Archenemy:
return new DeckEditorPage[] { return new DeckEditorPage[] {
new CatalogPage(), new CatalogPage(),
new DeckSectionPage(DeckSection.Main), new DeckSectionPage(DeckSection.Main),
new DeckSectionPage(DeckSection.Sideboard), new DeckSectionPage(DeckSection.Sideboard),
new DeckSectionPage(DeckSection.Schemes), new DeckSectionPage(DeckSection.Schemes)
new OptionsPage()
}; };
case Planechase: case Planechase:
return new DeckEditorPage[] { return new DeckEditorPage[] {
new CatalogPage(), new CatalogPage(),
new DeckSectionPage(DeckSection.Main), new DeckSectionPage(DeckSection.Main),
new DeckSectionPage(DeckSection.Sideboard), new DeckSectionPage(DeckSection.Sideboard),
new DeckSectionPage(DeckSection.Planes), new DeckSectionPage(DeckSection.Planes)
new OptionsPage()
}; };
case Vanguard: case Vanguard:
return new DeckEditorPage[] { return new DeckEditorPage[] {
new CatalogPage(), new CatalogPage(),
new DeckSectionPage(DeckSection.Main), new DeckSectionPage(DeckSection.Main),
new DeckSectionPage(DeckSection.Sideboard), new DeckSectionPage(DeckSection.Sideboard),
new DeckSectionPage(DeckSection.Avatar), new DeckSectionPage(DeckSection.Avatar)
new OptionsPage()
}; };
} }
} }
@@ -151,7 +149,11 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
private CatalogPage catalogPage; private CatalogPage catalogPage;
private DeckSectionPage mainDeckPage; private DeckSectionPage mainDeckPage;
private DeckSectionPage sideboardPage; private DeckSectionPage sideboardPage;
private OptionsPage optionsPage;
protected final DeckHeader deckHeader = add(new DeckHeader());
private final FLabel lblName = deckHeader.add(new FLabel.Builder().font(FSkinFont.get(16)).insets(new Vector2(Utils.scaleX(5), 0)).build());
private final FLabel btnSave = deckHeader.add(new FLabel.Builder().icon(FSkinImage.SAVE).align(HAlignment.CENTER).pressedColor(Header.BTN_PRESSED_COLOR).build());
private final FLabel btnMoreOptions = deckHeader.add(new FLabel.Builder().text("...").font(FSkinFont.get(20)).align(HAlignment.CENTER).pressedColor(Header.BTN_PRESSED_COLOR).build());
public FDeckEditor(EditorType editorType0, DeckProxy editDeck) { public FDeckEditor(EditorType editorType0, DeckProxy editDeck) {
this(editorType0, editDeck.getName(), editDeck.getPath()); this(editorType0, editDeck.getName(), editDeck.getPath());
@@ -167,7 +169,8 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
if (StringUtils.isEmpty(editDeckName)) { if (StringUtils.isEmpty(editDeckName)) {
deck = new Deck(); deck = new Deck();
if (editorType == EditorType.Draft) { if (editorType == EditorType.Draft) {
tabPages[3].hideTab(); //hide Options page while drafting //hide deck header on while drafting
deckHeader.setVisible(false);
} }
} }
else { else {
@@ -178,6 +181,36 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
deck = editorType.getController().getDeck(); deck = editorType.getController().getDeck();
} }
lblName.setText(deck.getName());
btnSave.setCommand(new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
save(null);
}
});
/*btnAddLands.setCommand(new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
}
});
btnDelete.setCommand(new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
FOptionPane.showConfirmDialog(
"Are you sure you want to delete '" + parentScreen.getDeck().getName() + "'?",
"Delete Deck", "Delete", "Cancel", false, new Callback<Boolean>() {
@Override
public void run(Boolean result) {
if (result) {
parentScreen.getEditorType().getController().delete();
Forge.back();
}
}
});
}
});*/
//cache specific pages and initialize all pages after fields set //cache specific pages and initialize all pages after fields set
for (int i = 0; i < tabPages.length; i++) { for (int i = 0; i < tabPages.length; i++) {
DeckEditorPage tabPage = (DeckEditorPage) tabPages[i]; DeckEditorPage tabPage = (DeckEditorPage) tabPages[i];
@@ -193,9 +226,6 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
sideboardPage = deckSectionPage; sideboardPage = deckSectionPage;
} }
} }
else if (tabPage instanceof OptionsPage) {
optionsPage = (OptionsPage) tabPage;
}
tabPage.initialize(); tabPage.initialize();
} }
@@ -205,6 +235,15 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
} }
} }
@Override
protected void doLayout(float startY, float width, float height) {
if (deckHeader.isVisible()) {
deckHeader.setBounds(0, startY, width, HEADER_HEIGHT);
startY += HEADER_HEIGHT;
}
super.doLayout(startY, width, height);
}
public EditorType getEditorType() { public EditorType getEditorType() {
return editorType; return editorType;
} }
@@ -225,17 +264,13 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
return sideboardPage; return sideboardPage;
} }
protected OptionsPage getOptionsPage() {
return optionsPage;
}
protected BoosterDraft getDraft() { protected BoosterDraft getDraft() {
return null; return null;
} }
protected void save(final Callback<Boolean> callback) { protected void save(final Callback<Boolean> callback) {
final DeckController<?> controller = editorType.getController(); final DeckController<?> controller = editorType.getController();
final String name = getOptionsPage().txtName.getText(); final String name = deck.getName();
final String deckStr = DeckProxy.getDeckString(controller.getModelPath(), name); final String deckStr = DeckProxy.getDeckString(controller.getModelPath(), name);
// Warn if no name // Warn if no name
@@ -321,6 +356,33 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
}); });
} }
protected class DeckHeader extends FContainer {
private DeckHeader() {
setHeight(HEADER_HEIGHT);
}
@Override
public void drawBackground(Graphics g) {
g.fillRect(Header.BACK_COLOR, 0, 0, getWidth(), HEADER_HEIGHT);
}
@Override
public void drawOverlay(Graphics g) {
float y = HEADER_HEIGHT - Header.LINE_THICKNESS / 2;
g.drawLine(Header.LINE_THICKNESS, Header.LINE_COLOR, 0, y, getWidth(), y);
}
@Override
protected void doLayout(float width, float height) {
float x = 0;
lblName.setBounds(0, 0, width - 2 * height, height);
x += lblName.getWidth();
btnSave.setBounds(x, 0, height, height);
x += height;
btnMoreOptions.setBounds(x, 0, height, height);
}
}
protected static abstract class DeckEditorPage extends TabPage<FDeckEditor> { protected static abstract class DeckEditorPage extends TabPage<FDeckEditor> {
protected DeckEditorPage(String caption0, FImage icon0) { protected DeckEditorPage(String caption0, FImage icon0) {
super(caption0, icon0); super(caption0, icon0);
@@ -514,91 +576,12 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
} }
else { else {
hideTab(); //hide this tab page when finished drafting hideTab(); //hide this tab page when finished drafting
parentScreen.getOptionsPage().showTab(); //show options page when finished drafting
draft.finishedDrafting(); draft.finishedDrafting();
parentScreen.save(null); parentScreen.save(null);
} }
} }
} }
protected static class OptionsPage extends DeckEditorPage {
private static final float PADDING = Utils.scaleMin(5);
private final FLabel lblName = add(new FLabel.Builder().text("Name:").textColor(FLabel.INLINE_LABEL_COLOR).build());
private final FTextField txtName = add(new FTextField());
private final FLabel btnSave = add(new FLabel.ButtonBuilder().text("Save Deck").icon(FSkinImage.SAVE).build());
private final FLabel btnAddLands = add(new FLabel.ButtonBuilder().text("Add Lands").icon(FSkinImage.LAND).build());
private final FLabel btnDelete = add(new FLabel.ButtonBuilder().text("Delete Deck").icon(FSkinImage.DELETE).build());
/*private final FLabel btnNew = add(new FLabel.ButtonBuilder().text("New Deck").icon(FSkinImage.NEW).build());
private final FLabel btnOpen = add(new FLabel.ButtonBuilder().text("Open Deck").icon(FSkinImage.OPEN).build());
private final FLabel btnSaveAs = add(new FLabel.ButtonBuilder().text("Save Deck As").icon(FSkinImage.SAVEAS).build());*/
protected OptionsPage() {
super("Options", FSkinImage.SETTINGS);
}
@Override
protected void initialize() {
txtName.setGhostText("[New Deck]");
txtName.setText(parentScreen.getDeck().getName());
txtName.setReadOnly(true); //TODO: Allow editing for non-limited decks
btnSave.setCommand(new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
parentScreen.save(null);
}
});
btnAddLands.setCommand(new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
}
});
btnDelete.setCommand(new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
FOptionPane.showConfirmDialog(
"Are you sure you want to delete '" + parentScreen.getDeck().getName() + "'?",
"Delete Deck", "Delete", "Cancel", false, new Callback<Boolean>() {
@Override
public void run(Boolean result) {
if (result) {
parentScreen.getEditorType().getController().delete();
Forge.back();
}
}
});
}
});
}
@Override
protected void doLayout(float width, float height) {
float x = PADDING;
float y = PADDING;
float w = width - 2 * PADDING;
lblName.setBounds(x, y, lblName.getAutoSizeBounds().width, txtName.getHeight());
txtName.setBounds(x + lblName.getWidth(), y, w - lblName.getWidth(), txtName.getHeight());
y += txtName.getHeight() + PADDING;
float buttonHeight = Utils.AVG_FINGER_HEIGHT;
float dy = buttonHeight + PADDING;
btnSave.setBounds(x, y, w, buttonHeight);
y += dy;
btnAddLands.setBounds(x, y, w, buttonHeight);
y += dy;
btnDelete.setBounds(x, y, w, buttonHeight);
y += dy;
/*btnNew.setBounds(x, y, w, buttonHeight);
y += dy;
btnOpen.setBounds(x, y, w, buttonHeight);
y += dy;
btnSaveAs.setBounds(x, y, w, buttonHeight);*/
}
}
public static class DeckController<T extends DeckBase> { public static class DeckController<T extends DeckBase> {
private T model; private T model;
private boolean saved; private boolean saved;

View File

@@ -83,8 +83,12 @@ public class DraftingProcessScreen extends FDeckEditor {
finishedDraft.addAiDecks(computer); finishedDraft.addAiDecks(computer);
FModel.getDecks().getDraft().add(finishedDraft); FModel.getDecks().getDraft().add(finishedDraft);
this.getEditorType().getController().load("", name); getEditorType().getController().load("", name);
DeckPreferences.setDraftDeck(name); DeckPreferences.setDraftDeck(name);
//show header for main deck and sideboard when finished drafting
deckHeader.setVisible(true);
revalidate();
} }
@Override @Override

View File

@@ -203,7 +203,7 @@ public class FLabel extends FDisplayObject implements IButton {
if (icon != null) { if (icon != null) {
bounds.width += icon.getWidth() + insets.x; bounds.width += icon.getWidth() + insets.x;
} }
return bounds; return bounds;
} }
@@ -253,7 +253,7 @@ public class FLabel extends FDisplayObject implements IButton {
float x = insets.x; float x = insets.x;
float y = insets.y; float y = insets.y;
w -= 2 * x; w -= 2 * x;
h -= 2 * x; h -= 2 * y;
if (pressed) { //while pressed, translate graphics so icon and text appear shifted down and to the right if (pressed) { //while pressed, translate graphics so icon and text appear shifted down and to the right
x += Utils.scaleX(1); x += Utils.scaleX(1);
y += Utils.scaleY(1); y += Utils.scaleY(1);

View File

@@ -24,7 +24,7 @@ public enum ItemManagerConfig {
null, null, 1, 0), null, null, 1, 0),
CARD_CATALOG(SColumnUtil.getCatalogDefaultColumns(true), true, false, false, CARD_CATALOG(SColumnUtil.getCatalogDefaultColumns(true), true, false, false,
null, null, 4, 0), null, null, 4, 0),
DECK_EDITOR(SColumnUtil.getDeckEditorDefaultColumns(), false, false, false, DECK_EDITOR(SColumnUtil.getDeckEditorDefaultColumns(), false, false, true,
GroupDef.DEFAULT, ColumnDef.CMC, 4, 1), GroupDef.DEFAULT, ColumnDef.CMC, 4, 1),
DRAFT_PACK(SColumnUtil.getDraftPackDefaultColumns(), false, false, true, DRAFT_PACK(SColumnUtil.getDraftPackDefaultColumns(), false, false, true,
null, null, 4, 1), null, null, 4, 1),