Support exiling and retrieving multiple for Planar Conquest

This commit is contained in:
drdev
2016-04-07 21:29:02 +00:00
parent 8f05205a6a
commit d6c0861663
4 changed files with 204 additions and 41 deletions

View File

@@ -532,6 +532,16 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
updateView(false, items);
}
public void addItemsFlat(Iterable<T> itemsToAdd) {
pool.addAllFlat(itemsToAdd);
if (isUnfiltered()) {
for (T item : itemsToAdd) {
model.addItem(item, 1);
}
}
updateView(false, itemsToAdd);
}
public void setItems(Iterable<Entry<T, Integer>> items) {
pool.clear();
model.clear();
@@ -560,6 +570,18 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
updateView(false, itemsToSelect);
}
public void removeItemsFlat(Iterable<T> itemsToRemove) {
final Iterable<T> itemsToSelect = currentView == listView ? getSelectedItems() : null;
pool.removeAllFlat(itemsToRemove);
if (isUnfiltered()) {
for (T item : itemsToRemove) {
model.removeItem(item, 1);
}
}
updateView(false, itemsToSelect);
}
public void removeAllItems() {
pool.clear();
model.clear();

View File

@@ -120,17 +120,21 @@ public abstract class ItemView<T extends InventoryItem> {
protected abstract void onRefresh();
protected void fixSelection(final Iterable<T> itemsToSelect, final int backupIndexToSelect, final float scrollValueToRestore) {
if (itemsToSelect == null) {
if (maxSelections <= 1 || minSelections > 0) {
setSelectedIndex(0, false); //select first item if no items to select
}
else { //if in multi-select mode, clear selection instead
if (itemManager.getMultiSelectMode()) { //if in multi-select mode, clear selection
setSelectedIndex(-1, false);
}
else { //otherwise select first item if no items to select
setSelectedIndex(0, false);
}
setScrollValue(0); //ensure scrolled to top
}
else {
if (!setSelectedItems(itemsToSelect)) {
setSelectedIndex(backupIndexToSelect);
if (itemManager.getMultiSelectMode()) { //in multi-select mode, clear selection after scrolling into view
setSelectedIndex(-1, false);
}
}
}
}
@@ -245,8 +249,7 @@ public abstract class ItemView<T extends InventoryItem> {
}
protected void onSelectionChange() {
final int index = getSelectedIndex();
if (index != -1) {
if (getSelectedIndex() != -1 || itemManager.getMultiSelectMode()) {
if (itemManager.getSelectionChangedHandler() != null) {
itemManager.getSelectionChangedHandler().handleEvent(new FEvent(itemManager, FEventType.CHANGE));
}

View File

@@ -1,8 +1,10 @@
package forge.screens.planarconquest;
import java.util.Collection;
import java.util.Map.Entry;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableList;
import forge.FThreads;
import forge.assets.FImage;
@@ -34,12 +36,62 @@ import forge.toolbox.FEvent.FEventHandler;
public class ConquestCollectionScreen extends TabPageScreen<ConquestCollectionScreen> {
private final FLabel lblShards = add(new FLabel.Builder().font(ConquestAEtherScreen.LABEL_FONT).parseSymbols().build());
private final FLabel lblInfo = add(new FLabel.Builder().font(FSkinFont.get(11)).build());
private final FLabel btnExileMultiple = add(new FLabel.ButtonBuilder().font(ConquestAEtherScreen.LABEL_FONT).parseSymbols().build());
public ConquestCollectionScreen() {
super("", ConquestMenu.getMenu(), new CollectionTab[] {
new CollectionTab("Collection", FSkinImage.SPELLBOOK),
new CollectionTab("Exile", FSkinImage.EXILE)
});
btnExileMultiple.setVisible(false); //hide unless in multi-select mode
btnExileMultiple.setCommand(new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
final ConquestData model = FModel.getConquest().getModel();
FThreads.invokeInBackgroundThread(new Runnable() {
@Override
public void run() {
if (getSelectedPage() == tabPages[0]) {
int value = 0;
final Collection<PaperCard> cards = getCollectionTab().list.getSelectedItems();
for (PaperCard card : cards) {
value += ConquestUtil.getShardValue(card, CQPref.AETHER_BASE_EXILE_VALUE);
}
if (model.exileCards(cards, value)) {
FThreads.invokeInEdtLater(new Runnable() {
@Override
public void run() {
updateShards();
getCollectionTab().list.removeItemsFlat(cards);
getExileTab().list.addItemsFlat(cards);
updateTabCaptions();
}
});
}
}
else {
int cost = 0;
final Collection<PaperCard> cards = getExileTab().list.getSelectedItems();
for (PaperCard card : cards) {
cost += ConquestUtil.getShardValue(card, CQPref.AETHER_BASE_RETRIEVE_COST);
}
if (model.retrieveCardsFromExile(cards, cost)) {
FThreads.invokeInEdtLater(new Runnable() {
@Override
public void run() {
updateShards();
getCollectionTab().list.addItemsFlat(cards);
getExileTab().list.removeItemsFlat(cards);
updateTabCaptions();
}
});
}
}
}
});
}
});
}
@Override
@@ -83,6 +135,38 @@ public class ConquestCollectionScreen extends TabPageScreen<ConquestCollectionSc
getExileTab().updateCaption();
}
private void updateExileButtonCaption() {
String action;
CQPref baseValuePref;
Collection<PaperCard> cards;
if (getSelectedPage() == tabPages[0]) {
action = "Exile";
baseValuePref = CQPref.AETHER_BASE_EXILE_VALUE;
cards = getCollectionTab().list.getSelectedItems();
}
else {
action = "Retrieve";
baseValuePref = CQPref.AETHER_BASE_RETRIEVE_COST;
cards = getExileTab().list.getSelectedItems();
}
int count = cards.size();
String caption = action;
if (count > 0) {
if (count > 1) {
caption += " " + count + " cards";
}
int total = 0;
for (PaperCard card : cards) {
total += ConquestUtil.getShardValue(card, baseValuePref);
}
caption += " for {AE}" + total;
}
btnExileMultiple.setText(caption);
btnExileMultiple.setEnabled(count > 0);
}
private CollectionTab getCollectionTab() {
return (CollectionTab)tabPages[0];
}
@@ -104,6 +188,9 @@ public class ConquestCollectionScreen extends TabPageScreen<ConquestCollectionSc
lblInfo.setBounds(x + labelWidth, y, w - labelWidth, labelHeight);
y += labelHeight;
super.doLayout(y, width, height);
float buttonHeight = tabHeader.getHeight() - 2 * ItemFilter.PADDING;
btnExileMultiple.setBounds(x, height - buttonHeight - ItemFilter.PADDING, w, buttonHeight);
}
private static class CollectionTab extends TabPage<ConquestCollectionScreen> {
@@ -125,7 +212,15 @@ public class ConquestCollectionScreen extends TabPageScreen<ConquestCollectionSc
protected void doLayout(float width, float height) {
list.setBounds(0, 0, width, height);
}
@Override
public boolean fling(float velocityX, float velocityY) {
if (list.getMultiSelectMode()) {
return false; //prevent changing tabs while in multi-select mode
}
return super.fling(velocityX, velocityY);
}
private class CollectionManager extends CardManager {
public CollectionManager(String caption0) {
super(false);
@@ -143,7 +238,7 @@ public class ConquestCollectionScreen extends TabPageScreen<ConquestCollectionSc
FThreads.invokeInBackgroundThread(new Runnable() {
@Override
public void run() {
if (model.retrieveCardFromExile(card, cost)) {
if (model.retrieveCardsFromExile(ImmutableList.of(card), cost)) {
FThreads.invokeInEdtLater(new Runnable() {
@Override
public void run() {
@@ -167,7 +262,7 @@ public class ConquestCollectionScreen extends TabPageScreen<ConquestCollectionSc
FThreads.invokeInBackgroundThread(new Runnable() {
@Override
public void run() {
if (model.exileCard(card, value)) {
if (model.exileCards(ImmutableList.of(card), value)) {
FThreads.invokeInEdtLater(new Runnable() {
@Override
public void run() {
@@ -187,6 +282,14 @@ public class ConquestCollectionScreen extends TabPageScreen<ConquestCollectionSc
menu.addItem(item);
}
});
setSelectionChangedHandler(new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
if (getMultiSelectMode()) {
parentScreen.updateExileButtonCaption();
}
}
});
}
@Override
@@ -199,8 +302,14 @@ public class ConquestCollectionScreen extends TabPageScreen<ConquestCollectionSc
@Override
protected void onCardLongPress(int index, Entry<PaperCard, Integer> value, float x, float y) {
toggleMultiSelectMode(index);
//hide tabs and show Exile/Retrieve button while in multi-select mode
boolean multiSelectMode = getMultiSelectMode();
if (multiSelectMode) {
parentScreen.updateExileButtonCaption();
}
parentScreen.btnExileMultiple.setVisible(multiSelectMode);
parentScreen.tabHeader.setVisible(!multiSelectMode);
}
}