migrate Callback to Interface

- closes #5717
This commit is contained in:
Anthony Calosa
2025-08-26 05:14:20 +08:00
parent 23555b9564
commit f27472d9bd
29 changed files with 550 additions and 852 deletions

View File

@@ -639,13 +639,10 @@ public class Forge implements ApplicationListener {
return;
} //don't allow exiting multiple times
Callback<Boolean> callback = new Callback<Boolean>() {
@Override
public void run(Boolean result) {
if (result) {
exited = true;
exitAnimation(true);
}
Callback<Boolean> callback = result -> {
if (result) {
exited = true;
exitAnimation(true);
}
};
@@ -668,13 +665,10 @@ public class Forge implements ApplicationListener {
options.add(getLocalizer().getMessage("lblExit"));
options.add(getLocalizer().getMessage("lblCancel"));
Callback<Integer> callback = new Callback<Integer>() {
@Override
public void run(Integer result) {
if (result == 0) {
exited = true;
exitAnimation(false);
}
Callback<Integer> callback = result -> {
if (result == 0) {
exited = true;
exitAnimation(false);
}
};
@@ -701,30 +695,27 @@ public class Forge implements ApplicationListener {
return;
}
currentScreen.onSwitchAway(new Callback<Boolean>() {
@Override
public void run(Boolean result) {
if (result) {
if (replaceBackScreen && !Dscreens.isEmpty()) {
Dscreens.removeFirst();
}
if (Dscreens.peekFirst() != screen0) { //prevent screen being its own back screen
Dscreens.addFirst(screen0);
}
setCurrentScreen(screen0);
if (screen0 instanceof MatchScreen) {
//set cursor for classic mode
if (!isMobileAdventureMode) {
if (magnifyToggle) {
setCursor(FSkin.getCursor().get(1), "1");
} else {
setCursor(FSkin.getCursor().get(2), "2");
}
currentScreen.onSwitchAway(result -> {
if (result) {
if (replaceBackScreen && !Dscreens.isEmpty()) {
Dscreens.removeFirst();
}
if (Dscreens.peekFirst() != screen0) { //prevent screen being its own back screen
Dscreens.addFirst(screen0);
}
setCurrentScreen(screen0);
if (screen0 instanceof MatchScreen) {
//set cursor for classic mode
if (!isMobileAdventureMode) {
if (magnifyToggle) {
setCursor(FSkin.getCursor().get(1), "1");
} else {
setCursor(FSkin.getCursor().get(2), "2");
}
}
deltaTime = 0f;
hueFragTime = 0f;
}
deltaTime = 0f;
hueFragTime = 0f;
}
});
}

View File

@@ -295,13 +295,10 @@ public class AdventureDeckEditor extends FDeckEditor {
if(toSell.isEmpty())
return;
FOptionPane.showConfirmDialog(Forge.getLocalizer().getMessage("lblSellAllConfirm", toSell.countAll(), value), Forge.getLocalizer().getMessage("lblSellCurrentFilters"), Forge.getLocalizer().getMessage("lblSell"), Forge.getLocalizer().getMessage("lblCancel"), false, new Callback<>() {
@Override
public void run(Boolean result) {
if (result) {
Current.player().doBulkSell(toSell);
refresh();
}
FOptionPane.showConfirmDialog(Forge.getLocalizer().getMessage("lblSellAllConfirm", toSell.countAll(), value), Forge.getLocalizer().getMessage("lblSellCurrentFilters"), Forge.getLocalizer().getMessage("lblSell"), Forge.getLocalizer().getMessage("lblCancel"), false, result -> {
if (result) {
Current.player().doBulkSell(toSell);
refresh();
}
});
}
@@ -423,12 +420,9 @@ public class AdventureDeckEditor extends FDeckEditor {
if(toMove.isEmpty())
return;
FOptionPane.showConfirmDialog(Forge.getLocalizer().getMessage("lblAutoSellCurrentFiltersConfirm", toMove.countAll()), Forge.getLocalizer().getMessage("lblAutoSellCurrentFilters"), Forge.getLocalizer().getMessage("lblAutoSell"), Forge.getLocalizer().getMessage("lblCancel"), false, new Callback<>() {
@Override
public void run(Boolean result) {
if (result) {
moveCards(toMove, autoSellPage);
}
FOptionPane.showConfirmDialog(Forge.getLocalizer().getMessage("lblAutoSellCurrentFiltersConfirm", toMove.countAll()), Forge.getLocalizer().getMessage("lblAutoSellCurrentFilters"), Forge.getLocalizer().getMessage("lblAutoSell"), Forge.getLocalizer().getMessage("lblCancel"), false, result -> {
if (result) {
moveCards(toMove, autoSellPage);
}
});
}
@@ -823,12 +817,7 @@ public class AdventureDeckEditor extends FDeckEditor {
Localizer localizer = Forge.getLocalizer();
if (isDrafting()) {
FOptionPane.showConfirmDialog(localizer.getMessage("lblEndAdventureEventConfirm"), localizer.getMessage("lblLeaveDraft"), localizer.getMessage("lblLeave"), localizer.getMessage("lblCancel"), false, new Callback<>() {
@Override
public void run(Boolean result) {
resolveClose(canCloseCallback, result == true);
}
});
FOptionPane.showConfirmDialog(localizer.getMessage("lblEndAdventureEventConfirm"), localizer.getMessage("lblLeaveDraft"), localizer.getMessage("lblLeave"), localizer.getMessage("lblCancel"), false, result -> resolveClose(canCloseCallback, result == true));
return;
}
else if(getEditorConfig().isLimited() || getDeck().isEmpty()) {
@@ -840,12 +829,7 @@ public class AdventureDeckEditor extends FDeckEditor {
if (deckError != null) {
//Allow the player to close the editor with an invalid deck, but warn them that cards may be swapped out.
String warning = localizer.getMessage("lblAdventureDeckError", deckError);
FOptionPane.showConfirmDialog(warning, localizer.getMessage("lblInvalidDeck"), false, new Callback<>() {
@Override
public void run(Boolean result) {
resolveClose(canCloseCallback, result == true);
}
});
FOptionPane.showConfirmDialog(warning, localizer.getMessage("lblInvalidDeck"), false, result -> resolveClose(canCloseCallback, result == true));
return;
}

View File

@@ -39,7 +39,6 @@ import forge.sound.MusicPlaylist;
import forge.toolbox.FOptionPane;
import forge.trackable.TrackableCollection;
import forge.util.Aggregates;
import forge.util.Callback;
import org.apache.commons.lang3.tuple.Pair;
import java.util.*;
@@ -153,12 +152,9 @@ public class DuelScene extends ForgeScene {
}
private FOptionPane createFOption(String message, String title, FBufferedImage icon, Runnable runnable) {
return new FOptionPane(message, null, title, icon, null, ImmutableList.of(Forge.getLocalizer().getMessage("lblOK")), -1, new Callback<Integer>() {
@Override
public void run(Integer result) {
if (runnable != null)
runnable.run();
}
return new FOptionPane(message, null, title, icon, null, ImmutableList.of(Forge.getLocalizer().getMessage("lblOK")), -1, result -> {
if (runnable != null)
runnable.run();
});
}

View File

@@ -29,7 +29,6 @@ import forge.adventure.world.WorldSave;
import forge.deck.Deck;
import forge.gui.FThreads;
import forge.screens.TransitionScreen;
import forge.util.Callback;
import forge.util.MyRandom;
import java.util.Arrays;
@@ -124,26 +123,17 @@ public class EventScene extends MenuScene implements IAfterMatch {
//todo: add translation
decline.name = "Do not enter event";
enterWithCoin.callback = new Callback<Boolean>() {
@Override
public void run(Boolean result) {
currentEvent.eventStatus = AdventureEventController.EventStatus.Entered;
refresh();
}
enterWithCoin.callback = (result) -> {
currentEvent.eventStatus = AdventureEventController.EventStatus.Entered;
refresh();
};
enterWithShards.callback = new Callback<Boolean>() {
@Override
public void run(Boolean result) {
currentEvent.eventStatus = AdventureEventController.EventStatus.Entered;
refresh();
}
enterWithShards.callback = (result) -> {
currentEvent.eventStatus = AdventureEventController.EventStatus.Entered;
refresh();
};
enterWithGold.callback = new Callback<Boolean>() {
@Override
public void run(Boolean result) {
currentEvent.eventStatus = AdventureEventController.EventStatus.Entered;
refresh();
}
enterWithGold.callback = (result) -> {
currentEvent.eventStatus = AdventureEventController.EventStatus.Entered;
refresh();
};
introDialog.options = new DialogData[4];

View File

@@ -10,7 +10,6 @@ import forge.localinstance.properties.ForgePreferences;
import forge.model.FModel;
import forge.screens.FScreen;
import forge.toolbox.FOptionPane;
import forge.util.Callback;
import forge.util.ItemPool;
/**
@@ -65,12 +64,9 @@ public class ShopScene extends ForgeScene {
return;
FOptionPane.showConfirmDialog(Forge.getLocalizer().getMessage("lblSellAllConfirm", cards, profit),
Forge.getLocalizer().getMessage("lblAutoSellable"), Forge.getLocalizer().getMessage("lblSell"),
Forge.getLocalizer().getMessage("lblCancel"), false, new Callback<Boolean>() {
@Override
public void run(Boolean result) {
if (result) {
doAutosell();
}
Forge.getLocalizer().getMessage("lblCancel"), false, result -> {
if (result) {
doAutosell();
}
}
);

View File

@@ -34,15 +34,12 @@ public class GameEntityPicker extends TabPageScreen<GameEntityPicker> {
setHeight(FOptionPane.getMaxDisplayObjHeight());
optionPane = new FOptionPane(null, null, title, null, this,
isOptional ? ImmutableList.of(Forge.getLocalizer().getMessage("lblOK"), Forge.getLocalizer().getMessage("lblCancel")) : ImmutableList.of(Forge.getLocalizer().getMessage("lblOK")), 0, new Callback<Integer>() {
@Override
public void run(Integer result) {
if (result == 0) {
callback.run(((PickerTab) tabPages.get(0)).list.getSelectedItem());
}
else {
callback.run(null);
}
isOptional ? ImmutableList.of(Forge.getLocalizer().getMessage("lblOK"), Forge.getLocalizer().getMessage("lblCancel")) : ImmutableList.of(Forge.getLocalizer().getMessage("lblOK")), 0, result -> {
if (result == 0) {
callback.run(((PickerTab) tabPages.get(0)).list.getSelectedItem());
}
else {
callback.run(null);
}
}) {
@Override

View File

@@ -1421,50 +1421,46 @@ public class FDeckChooser extends FScreen {
return;
}
GuiChoose.getInteger(Forge.getLocalizer().getMessage("lblHowManyOpponents"), 1, 50, new Callback<Integer>() {
@Override
public void run(final Integer numOpponents) {
if (numOpponents == null) { return; }
List<DeckType> deckTypes = Lists.newArrayList(
DeckType.CUSTOM_DECK,
DeckType.PRECONSTRUCTED_DECK,
DeckType.QUEST_OPPONENT_DECK,
DeckType.COLOR_DECK,
DeckType.STANDARD_COLOR_DECK,
DeckType.STANDARD_CARDGEN_DECK,
DeckType.MODERN_COLOR_DECK,
DeckType.PAUPER_COLOR_DECK,
DeckType.PIONEER_CARDGEN_DECK,
DeckType.HISTORIC_CARDGEN_DECK,
DeckType.MODERN_CARDGEN_DECK,
DeckType.LEGACY_CARDGEN_DECK,
DeckType.VINTAGE_CARDGEN_DECK,
DeckType.PAUPER_CARDGEN_DECK,
DeckType.THEME_DECK,
DeckType.NET_DECK,
DeckType.NET_ARCHIVE_STANDARD_DECK,
DeckType.NET_ARCHIVE_PIONEER_DECK,
DeckType.NET_ARCHIVE_MODERN_DECK,
DeckType.NET_ARCHIVE_PAUPER_DECK,
DeckType.NET_ARCHIVE_VINTAGE_DECK,
DeckType.NET_ARCHIVE_LEGACY_DECK,
DeckType.NET_ARCHIVE_BLOCK_DECK
GuiChoose.getInteger(Forge.getLocalizer().getMessage("lblHowManyOpponents"), 1, 50, numOpponents -> {
if (numOpponents == null) { return; }
List<DeckType> deckTypes = Lists.newArrayList(
DeckType.CUSTOM_DECK,
DeckType.PRECONSTRUCTED_DECK,
DeckType.QUEST_OPPONENT_DECK,
DeckType.COLOR_DECK,
DeckType.STANDARD_COLOR_DECK,
DeckType.STANDARD_CARDGEN_DECK,
DeckType.MODERN_COLOR_DECK,
DeckType.PAUPER_COLOR_DECK,
DeckType.PIONEER_CARDGEN_DECK,
DeckType.HISTORIC_CARDGEN_DECK,
DeckType.MODERN_CARDGEN_DECK,
DeckType.LEGACY_CARDGEN_DECK,
DeckType.VINTAGE_CARDGEN_DECK,
DeckType.PAUPER_CARDGEN_DECK,
DeckType.THEME_DECK,
DeckType.NET_DECK,
DeckType.NET_ARCHIVE_STANDARD_DECK,
DeckType.NET_ARCHIVE_PIONEER_DECK,
DeckType.NET_ARCHIVE_MODERN_DECK,
DeckType.NET_ARCHIVE_PAUPER_DECK,
DeckType.NET_ARCHIVE_VINTAGE_DECK,
DeckType.NET_ARCHIVE_LEGACY_DECK,
DeckType.NET_ARCHIVE_BLOCK_DECK
);
if (!FModel.isdeckGenMatrixLoaded()) {
deckTypes.remove(DeckType.STANDARD_CARDGEN_DECK);
deckTypes.remove(DeckType.PIONEER_CARDGEN_DECK);
deckTypes.remove(DeckType.HISTORIC_CARDGEN_DECK);
deckTypes.remove(DeckType.MODERN_CARDGEN_DECK);
deckTypes.remove(DeckType.LEGACY_CARDGEN_DECK);
deckTypes.remove(DeckType.VINTAGE_CARDGEN_DECK);
deckTypes.remove(DeckType.PAUPER_CARDGEN_DECK);
}
);
if (!FModel.isdeckGenMatrixLoaded()) {
deckTypes.remove(DeckType.STANDARD_CARDGEN_DECK);
deckTypes.remove(DeckType.PIONEER_CARDGEN_DECK);
deckTypes.remove(DeckType.HISTORIC_CARDGEN_DECK);
deckTypes.remove(DeckType.MODERN_CARDGEN_DECK);
deckTypes.remove(DeckType.LEGACY_CARDGEN_DECK);
deckTypes.remove(DeckType.VINTAGE_CARDGEN_DECK);
deckTypes.remove(DeckType.PAUPER_CARDGEN_DECK);
}
ListChooser<DeckType> chooser = new ListChooser<>(
Forge.getLocalizer().getMessage("lblChooseAllowedDeckTypeOpponents"), 0, deckTypes.size(), deckTypes, null, new Callback<List<DeckType>>() {
@Override
public void run(final List<DeckType> allowedDeckTypes) {
ListChooser<DeckType> chooser = new ListChooser<>(
Forge.getLocalizer().getMessage("lblChooseAllowedDeckTypeOpponents"), 0, deckTypes.size(), deckTypes, null, allowedDeckTypes -> {
if (allowedDeckTypes == null || allowedDeckTypes.isEmpty()) {
return;
}
@@ -1490,38 +1486,33 @@ public class FDeckChooser extends FScreen {
gauntlet.startRound(players, humanPlayer);
}));
});
}
});
chooser.show(null, false); /*setting selectMax to true will select all available option*/
}
});
chooser.show(null, false); /*setting selectMax to true will select all available option*/
});
}
private void testVariantDeck(final Deck userDeck, final GameType variant) {
promptForDeck(Forge.getLocalizer().getMessage("lblSelectOpponentDeck"), variant, true, new Callback<Deck>() {
@Override
public void run(final Deck aiDeck) {
if (aiDeck == null) { return; }
promptForDeck(Forge.getLocalizer().getMessage("lblSelectOpponentDeck"), variant, true, aiDeck -> {
if (aiDeck == null) { return; }
LoadingOverlay.show(Forge.getLocalizer().getMessage("lblLoadingNewGame"), true, () -> {
Set<GameType> appliedVariants = new HashSet<>();
appliedVariants.add(variant);
LoadingOverlay.show(Forge.getLocalizer().getMessage("lblLoadingNewGame"), true, () -> {
Set<GameType> appliedVariants = new HashSet<>();
appliedVariants.add(variant);
List<RegisteredPlayer> players = new ArrayList<>();
RegisteredPlayer humanPlayer = RegisteredPlayer.forVariants(2, appliedVariants, userDeck, null, false, null, null);
humanPlayer.setPlayer(GamePlayerUtil.getGuiPlayer());
RegisteredPlayer aiPlayer = RegisteredPlayer.forVariants(2, appliedVariants, aiDeck, null, false, null, null);
aiPlayer.setPlayer(GamePlayerUtil.createAiPlayer());
players.add(humanPlayer);
players.add(aiPlayer);
List<RegisteredPlayer> players = new ArrayList<>();
RegisteredPlayer humanPlayer = RegisteredPlayer.forVariants(2, appliedVariants, userDeck, null, false, null, null);
humanPlayer.setPlayer(GamePlayerUtil.getGuiPlayer());
RegisteredPlayer aiPlayer = RegisteredPlayer.forVariants(2, appliedVariants, aiDeck, null, false, null, null);
aiPlayer.setPlayer(GamePlayerUtil.createAiPlayer());
players.add(humanPlayer);
players.add(aiPlayer);
final Map<RegisteredPlayer, IGuiGame> guiMap = new HashMap<>();
guiMap.put(humanPlayer, MatchController.instance);
final Map<RegisteredPlayer, IGuiGame> guiMap = new HashMap<>();
guiMap.put(humanPlayer, MatchController.instance);
final HostedMatch hostedMatch = GuiBase.getInterface().hostMatch();
hostedMatch.startMatch(GameType.Constructed, appliedVariants, players, guiMap);
});
}
final HostedMatch hostedMatch = GuiBase.getInterface().hostMatch();
hostedMatch.startMatch(GameType.Constructed, appliedVariants, players, guiMap);
});
});
}

View File

@@ -547,17 +547,14 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
if (showAddExtraSectionOption()) {
addItem(new FMenuItem(localizer.getMessage("lblAddDeckSection"), FSkinImage.CHAOS, e -> {
List<String> options = hiddenExtraSections.stream().map(DeckSection::getLocalizedName).collect(Collectors.toList());
GuiChoose.oneOrNone(localizer.getMessage("lblAddDeckSectionSelect"), options, new Callback<>() {
@Override
public void run(String result) {
if (result == null || !options.contains(result))
return;
DeckSection newSection = hiddenExtraSections.get(options.indexOf(result));
showExtraSectionTab(newSection);
filterCatalogForExtraSection(newSection);
getCatalogPage().scheduleRefresh();
setSelectedPage(getCatalogPage());
}
GuiChoose.oneOrNone(localizer.getMessage("lblAddDeckSectionSelect"), options, result -> {
if (result == null || !options.contains(result))
return;
DeckSection newSection = hiddenExtraSections.get(options.indexOf(result));
showExtraSectionTab(newSection);
filterCatalogForExtraSection(newSection);
getCatalogPage().scheduleRefresh();
setSelectedPage(getCatalogPage());
});
}));
}
@@ -592,24 +589,16 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
if (allowSaveAs())
addItem(new FMenuItem(localizer.getMessage("lblSaveAs"), Forge.hdbuttons ? FSkinImage.HDSAVEAS : FSkinImage.SAVEAS, e -> {
String defaultName = deckController.getNextAvailableName();
FOptionPane.showInputDialog(localizer.getMessage("lblNameNewCopyDeck"), defaultName, new Callback<>() {
@Override
public void run(String result) {
if (!StringUtils.isEmpty(result)) {
deckController.saveAs(result);
}
FOptionPane.showInputDialog(localizer.getMessage("lblNameNewCopyDeck"), defaultName, result -> {
if (!StringUtils.isEmpty(result)) {
deckController.saveAs(result);
}
});
}));
}
if (allowRename()) {
addItem(new FMenuItem(localizer.getMessage("lblRenameDeck"), Forge.hdbuttons ? FSkinImage.HDEDIT : FSkinImage.EDIT, e -> FOptionPane.showInputDialog(
localizer.getMessage("lblNewNameDeck"), deck.getName(), new Callback<>() {
@Override
public void run(String result) {
deckController.rename(result);
}
}))
localizer.getMessage("lblNewNameDeck"), deck.getName(), deckController::rename))
);
}
if (allowDelete()) {
@@ -618,13 +607,10 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
localizer.getMessage("lblDeleteDeck"),
localizer.getMessage("lblDelete"),
localizer.getMessage("lblCancel"), false,
new Callback<>() {
@Override
public void run(Boolean result) {
if (result) {
deckController.delete();
Forge.back();
}
result -> {
if (result) {
deckController.delete();
Forge.back();
}
}))
);
@@ -649,12 +635,7 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
CardEdition defaultLandSet = allowedLandSets.get(0);
List<CardEdition> finalAllowedLandSets = allowedLandSets;
FThreads.invokeInEdtNowOrLater(() -> {
AddBasicLandsDialog dialog = new AddBasicLandsDialog(deck, defaultLandSet, new Callback<>() {
@Override
public void run(CardPool landsToAdd) {
addChosenBasicLands(landsToAdd);
}
}, editorConfig.hasInfiniteCardPool() ? null : finalAllowedLandSets); //Null allows any lands to be selected
AddBasicLandsDialog dialog = new AddBasicLandsDialog(deck, defaultLandSet, this::addChosenBasicLands, editorConfig.hasInfiniteCardPool() ? null : finalAllowedLandSets); //Null allows any lands to be selected
dialog.show();
});
@@ -686,14 +667,11 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
}
protected void showDevAddCardDialog() {
FOptionPane.showInputDialog(Forge.getLocalizer().getMessage("lblPromptCardRequest"), new Callback<>() {
@Override
public void run(String result) {
if(StringUtils.isBlank(result))
return;
CardPool requested = CardPool.fromSingleCardRequest(result);
devAddCards(requested);
}
FOptionPane.showInputDialog(Forge.getLocalizer().getMessage("lblPromptCardRequest"), result -> {
if(StringUtils.isBlank(result))
return;
CardPool requested = CardPool.fromSingleCardRequest(result);
devAddCards(requested);
});
}
@@ -924,15 +902,12 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
List<PaperCard> commanders = deck.getCommanders(); //use commander name as default deck name
String initialInput = commanders.isEmpty() ? "New Deck" : Lang.joinHomogenous(commanders);
FThreads.invokeInEdtNowOrLater(() -> {
FOptionPane.showInputDialog(Forge.getLocalizer().getMessage("lblNameNewDeck"), initialInput, new Callback<>() {
@Override
public void run(String result) {
if (StringUtils.isEmpty(result)) { return; }
FOptionPane.showInputDialog(Forge.getLocalizer().getMessage("lblNameNewDeck"), initialInput, result -> {
if (StringUtils.isEmpty(result)) { return; }
deckController.saveAs(result);
if (callback != null) {
callback.run(true);
}
deckController.saveAs(result);
if (callback != null) {
callback.run(true);
}
});
});
@@ -979,17 +954,14 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
return;
}
FOptionPane.showOptionDialog(Forge.getLocalizer().getMessage("lblSaveChangesCurrentDeck"), "",
FOptionPane.QUESTION_ICON, onCloseOptions, new Callback<>() {
@Override
public void run(Integer result) {
if (result == 0) {
save(canCloseCallback);
} else if (result == 1) {
getDeckController().exitWithoutSaving(); //reload if not saving changes
canCloseCallback.run(true);
} else {
canCloseCallback.run(false);
}
FOptionPane.QUESTION_ICON, onCloseOptions, result -> {
if (result == 0) {
save(canCloseCallback);
} else if (result == 1) {
getDeckController().exitWithoutSaving(); //reload if not saving changes
canCloseCallback.run(true);
} else {
canCloseCallback.run(false);
}
});
}
@@ -1431,7 +1403,7 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
this.addMoveCardMenuItem(menu, source, destination, new MoveCardCallback(card, source, destination));
}
protected static class MoveCardCallback extends Callback<Integer> {
protected static class MoveCardCallback implements Callback<Integer> {
public final PaperCard card;
public final CardManagerPage from;
public final CardManagerPage to;
@@ -1465,13 +1437,10 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
if(max < 2)
callback.accept(1);
else
GuiChoose.getInteger(prompt, 1, max, 20, new Callback<>() {
@Override
public void run(Integer result) {
if (result == null || result == 0)
return;
callback.accept(result);
}
GuiChoose.getInteger(prompt, 1, max, 20, result -> {
if (result == null || result == 0)
return;
callback.accept(result);
});
}
}
@@ -2024,14 +1993,11 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
break;
case Commander:
if (canEditMainCommander() || isPartnerCommander(card)) {
addMoveCardMenuItem(menu, this, cardSourcePage, new Callback<>() {
@Override
public void run(Integer result) {
moveCard(card, cardSourcePage, result);
if(cardSourcePage == parentScreen.getCatalogPage()) {
parentScreen.getCatalogPage().refresh(); //refresh so commander options shown again
parentScreen.setSelectedPage(parentScreen.getCatalogPage());
}
addMoveCardMenuItem(menu, this, cardSourcePage, result -> {
moveCard(card, cardSourcePage, result);
if(cardSourcePage == parentScreen.getCatalogPage()) {
parentScreen.getCatalogPage().refresh(); //refresh so commander options shown again
parentScreen.setSelectedPage(parentScreen.getCatalogPage());
}
});
addReplaceVariantItems(menu, card);
@@ -2063,12 +2029,9 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
else
currentColors = null;
String prompt = Forge.getLocalizer().getMessage("lblChooseAColor", Lang.getNumeral(markedColorCount));
GuiChoose.getChoices(prompt, markedColorCount, markedColorCount, MagicColor.Constant.ONLY_COLORS, currentColors, null, new Callback<>() {
@Override
public void run(List<String> result) {
addCard(card.copyWithMarkedColors(ColorSet.fromNames(result)));
removeCard(card);
}
GuiChoose.getChoices(prompt, markedColorCount, markedColorCount, MagicColor.Constant.ONLY_COLORS, currentColors, null, result -> {
addCard(card.copyWithMarkedColors(ColorSet.fromNames(result)));
removeCard(card);
});
}));
}
@@ -2109,21 +2072,18 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
String prompt = localizer.getMessage("lblSelectReplacementCard") + " " + card.getName();
String promptQuantity = String.format("%s - %s %s", card, lblReplaceCard, localizer.getMessage("lblHowMany"));
//First have the player choose which card to swap in.
GuiChoose.oneOrNone(prompt, sortedOptions, new Callback<>() {
@Override
public void run(PaperCard replacement) {
if (replacement == null || replacement == card)
return;
//Next, ask how many copies they'd like to swap, taking into account the number available.
int available = parentScreen.getCardSourcePage().cardManager.isInfinite() ? Integer.MAX_VALUE : cardOptions.count(replacement);
int maxMovable = Math.min(available, cardManager.getItemCount(card));
new MoveQuantityPrompt(promptQuantity, maxMovable, (amount) -> {
CardManagerPage sourcePage = parentScreen.getCardSourcePage();
//Finally, swap the cards.
DeckSectionPage.this.moveCard(card, sourcePage, amount);
sourcePage.moveCard(replacement, DeckSectionPage.this, amount);
}).handleEvent(e);
}
GuiChoose.oneOrNone(prompt, sortedOptions, replacement -> {
if (replacement == null || replacement == card)
return;
//Next, ask how many copies they'd like to swap, taking into account the number available.
int available = parentScreen.getCardSourcePage().cardManager.isInfinite() ? Integer.MAX_VALUE : cardOptions.count(replacement);
int maxMovable = Math.min(available, cardManager.getItemCount(card));
new MoveQuantityPrompt(promptQuantity, maxMovable, (amount) -> {
CardManagerPage sourcePage = parentScreen.getCardSourcePage();
//Finally, swap the cards.
DeckSectionPage.this.moveCard(card, sourcePage, amount);
sourcePage.moveCard(replacement, DeckSectionPage.this, amount);
}).handleEvent(e);
});
}
@@ -2294,29 +2254,23 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
if(!cardManager.isEnabled())
return;
if(draftingFaceDown) {
addMoveCardMenuItem(menu, this, parentScreen.getSideboardPage(), new Callback<>() {
@Override
public void run(Integer result) { //ignore quantity
PaperCard realCard = getDraftPlayer().pickFromArchdemonCurse(getDraftPlayer().nextChoice());
moveCard(realCard, parentScreen.getSideboardPage());
}
addMoveCardMenuItem(menu, this, parentScreen.getSideboardPage(), result -> { //ignore quantity
PaperCard realCard = getDraftPlayer().pickFromArchdemonCurse(getDraftPlayer().nextChoice());
moveCard(realCard, parentScreen.getSideboardPage());
});
return;
}
DeckSection destination = DeckSection.matchingSection(card);
final DeckSectionPage destinationPage = parentScreen.getPageForSection(destination, true);
addMoveCardMenuItem(menu, this, destinationPage, new Callback<>() {
@Override
public void run(Integer result) { //ignore quantity
moveCard(card, destinationPage);
}
});
addMoveCardMenuItem(menu, this, parentScreen.getSideboardPage(), new Callback<>() {
@Override
public void run(Integer result) { //ignore quantity
moveCard(card, parentScreen.getSideboardPage());
}
addMoveCardMenuItem(menu, this, destinationPage, result -> { //ignore quantity
moveCard(card, destinationPage);
});
addMoveCardMenuItem(menu,
this,
parentScreen.getSideboardPage(),
result -> { //ignore quantity
moveCard(card, parentScreen.getSideboardPage());
});
}
@Override

View File

@@ -150,14 +150,11 @@ public class FSideboardDialog extends FDialog {
@Override
protected void buildMenu(FDropDownMenu menu, final PaperCard card) {
addItem(menu, Forge.getLocalizer().getMessage("lblMove"), Forge.getLocalizer().getMessage("lblToMainDeck"), FDeckEditor.MAIN_DECK_ICON, new Callback<Integer>() {
@Override
public void run(Integer result) {
if (result == null || result <= 0) { return; }
addItem(menu, Forge.getLocalizer().getMessage("lblMove"), Forge.getLocalizer().getMessage("lblToMainDeck"), FDeckEditor.MAIN_DECK_ICON, result -> {
if (result == null || result <= 0) { return; }
removeCard(card, result);
parent.getMainDeckPage().addCard(card, result);
}
removeCard(card, result);
parent.getMainDeckPage().addCard(card, result);
});
}
}
@@ -181,14 +178,11 @@ public class FSideboardDialog extends FDialog {
@Override
protected void buildMenu(FDropDownMenu menu, final PaperCard card) {
addItem(menu, Forge.getLocalizer().getMessage("lblMove"), Forge.getLocalizer().getMessage("lbltosideboard"), FDeckEditor.SIDEBOARD_ICON, new Callback<Integer>() {
@Override
public void run(Integer result) {
if (result == null || result <= 0) { return; }
addItem(menu, Forge.getLocalizer().getMessage("lblMove"), Forge.getLocalizer().getMessage("lbltosideboard"), FDeckEditor.SIDEBOARD_ICON, result -> {
if (result == null || result <= 0) { return; }
removeCard(card, result);
parent.getSideboardPage().addCard(card, result);
}
removeCard(card, result);
parent.getSideboardPage().addCard(card, result);
});
}
}

View File

@@ -534,18 +534,15 @@ public class PlayerPanel extends FContainer {
private FEventHandler avatarCommand = new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
AvatarSelector.show(getPlayerName(), avatarIndex, screen.getUsedAvatars(), new Callback<Integer>() {
@Override
public void run(Integer result) {
setAvatarIndex(result);
AvatarSelector.show(getPlayerName(), avatarIndex, screen.getUsedAvatars(), result -> {
setAvatarIndex(result);
if (index < 2) {
screen.updateAvatar(index, result);
screen.updateAvatarPrefs();
}
if (allowNetworking) {
screen.firePlayerChangeListener(index);
}
if (index < 2) {
screen.updateAvatar(index, result);
screen.updateAvatarPrefs();
}
if (allowNetworking) {
screen.firePlayerChangeListener(index);
}
});
}
@@ -554,18 +551,15 @@ public class PlayerPanel extends FContainer {
private FEventHandler sleeveCommand = new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
SleevesSelector.show(getPlayerName(), sleeveIndex, screen.getUsedSleeves(), new Callback<Integer>() {
@Override
public void run(Integer result) {
setSleeveIndex(result);
SleevesSelector.show(getPlayerName(), sleeveIndex, screen.getUsedSleeves(), result -> {
setSleeveIndex(result);
if (index < 2) {
screen.updateSleeve(index, result);
screen.updateSleevePrefs();
}
if (allowNetworking) {
screen.firePlayerChangeListener(index);
}
if (index < 2) {
screen.updateSleeve(index, result);
screen.updateSleevePrefs();
}
if (allowNetworking) {
screen.firePlayerChangeListener(index);
}
});
}
@@ -804,21 +798,18 @@ public class PlayerPanel extends FContainer {
private FLabel createNameRandomizer() {
final FLabel newNameBtn = new FLabel.Builder().iconInBackground(false)
.icon(Forge.hdbuttons ? FSkinImage.HDEDIT : FSkinImage.EDIT).opaque(false).build();
newNameBtn.setCommand(e -> getNewName(new Callback<String>() {
@Override
public void run(String newName) {
if (newName == null) { return; }
newNameBtn.setCommand(e -> getNewName(newName -> {
if (newName == null) { return; }
txtPlayerName.setText(newName);
txtPlayerName.setText(newName);
if (index == 0) {
prefs.setPref(FPref.PLAYER_NAME, newName);
prefs.save();
screen.getLobby().applyToSlot(index, UpdateLobbyPlayerEvent.nameUpdate(newName));
}
if (allowNetworking) {
screen.firePlayerChangeListener(index);
}
if (index == 0) {
prefs.setPref(FPref.PLAYER_NAME, newName);
prefs.save();
screen.getLobby().applyToSlot(index, UpdateLobbyPlayerEvent.nameUpdate(newName));
}
if (allowNetworking) {
screen.firePlayerChangeListener(index);
}
}));
return newNameBtn;
@@ -1070,41 +1061,32 @@ public class PlayerPanel extends FContainer {
final String message = Forge.getLocalizer().getMessage("lbltypeofName");
final FSkinImage icon = FOptionPane.QUESTION_ICON;
FOptionPane.showOptionDialog(message, title, icon, genderOptions, 2, new Callback<Integer>() {
@Override
public void run(final Integer genderIndex) {
if (genderIndex == null || genderIndex < 0) {
FOptionPane.showOptionDialog(message, title, icon, genderOptions, 2, genderIndex -> {
if (genderIndex == null || genderIndex < 0) {
callback.run(null);
return;
}
FOptionPane.showOptionDialog(message, title, icon, typeOptions, 2, typeIndex -> {
if (typeIndex == null || typeIndex < 0) {
callback.run(null);
return;
}
FOptionPane.showOptionDialog(message, title, icon, typeOptions, 2, new Callback<Integer>() {
@Override
public void run(final Integer typeIndex) {
if (typeIndex == null || typeIndex < 0) {
callback.run(null);
return;
}
generateRandomName(genderOptions.get(genderIndex), typeOptions.get(typeIndex), screen.getPlayerNames(), title, callback);
}
});
}
generateRandomName(genderOptions.get(genderIndex), typeOptions.get(typeIndex), screen.getPlayerNames(), title, callback);
});
});
}
private void generateRandomName(final String gender, final String type, final List<String> usedNames, final String title, final Callback<String> callback) {
final String newName = NameGenerator.getRandomName(gender, type, usedNames);
String confirmMsg = Forge.getLocalizer().getMessage("lblconfirmName").replace("%s", newName);
FOptionPane.showConfirmDialog(confirmMsg, title, Forge.getLocalizer().getMessage("lblUseThisName"), Forge.getLocalizer().getMessage("lblTryAgain"), true, new Callback<Boolean>() {
@Override
public void run(Boolean result) {
if (result) {
callback.run(newName);
}
else {
generateRandomName(gender, type, usedNames, title, callback);
}
FOptionPane.showConfirmDialog(confirmMsg, title, Forge.getLocalizer().getMessage("lblUseThisName"), Forge.getLocalizer().getMessage("lblTryAgain"), true, result -> {
if (result) {
callback.run(newName);
}
else {
generateRandomName(gender, type, usedNames, title, callback);
}
});
}

View File

@@ -32,7 +32,6 @@ import forge.screens.settings.SettingsScreen;
import forge.toolbox.FButton;
import forge.toolbox.FList;
import forge.toolbox.FOptionPane;
import forge.util.Callback;
import forge.util.ThreadUtil;
import forge.util.Utils;
@@ -107,15 +106,12 @@ public class LoadGauntletScreen extends LaunchScreen {
if (userDeck == null) {
//give user a chance to select a deck if none saved with gauntlet
FDeckChooser.promptForDeck(Forge.getLocalizer().getMessage("lblSelectGauntletDeck"), gauntlet.isCommanderGauntlet()
? GameType.CommanderGauntlet : GameType.Gauntlet, false, new Callback<Deck>() {
@Override
public void run(Deck result) {
if (result != null) {
gauntlet.setUserDeck(result);
GauntletIO.saveGauntlet(gauntlet);
}
}
});
? GameType.CommanderGauntlet : GameType.Gauntlet, false, result -> {
if (result != null) {
gauntlet.setUserDeck(result);
GauntletIO.saveGauntlet(gauntlet);
}
});
return;
}

View File

@@ -7,7 +7,6 @@ import java.util.List;
import forge.Forge;
import forge.assets.FSkinFont;
import forge.deck.Deck;
import forge.deck.DeckType;
import forge.deck.FDeckChooser;
import forge.game.GameType;
@@ -23,7 +22,6 @@ import forge.toolbox.FLabel;
import forge.toolbox.FTextArea;
import forge.toolbox.GuiChoose;
import forge.toolbox.ListChooser;
import forge.util.Callback;
import forge.util.Utils;
public class NewGauntletScreen extends LaunchScreen {
@@ -58,158 +56,125 @@ public class NewGauntletScreen extends LaunchScreen {
Forge.getLocalizer().getMessage("lblGauntletContest"),
Forge.getLocalizer().getMessage("lblQuickCommanderGauntlet"),
Forge.getLocalizer().getMessage("lblCustomCommanderGauntlet"),
}, new Callback<String>() {
@Override
public void run(String result) {
if (result == null) { return; }
}, result -> {
if (result == null) { return; }
if (Forge.getLocalizer().getMessage("lblQuickGauntlet").equals(result)) {
createQuickGauntlet();
} else if(Forge.getLocalizer().getMessage("lblCustomGauntlet").equals(result)) {
createCustomGauntlet();
} else if(Forge.getLocalizer().getMessage("lblQuickCommanderGauntlet").equals(result)) {
createQuickCommandGauntlet();
} else if(Forge.getLocalizer().getMessage("lblCustomCommanderGauntlet").equals(result)) {
createCustomCommanderGauntlet();
} else {
createGauntletContest();
}
if (Forge.getLocalizer().getMessage("lblQuickGauntlet").equals(result)) {
createQuickGauntlet();
} else if(Forge.getLocalizer().getMessage("lblCustomGauntlet").equals(result)) {
createCustomGauntlet();
} else if(Forge.getLocalizer().getMessage("lblQuickCommanderGauntlet").equals(result)) {
createQuickCommandGauntlet();
} else if(Forge.getLocalizer().getMessage("lblCustomCommanderGauntlet").equals(result)) {
createCustomCommanderGauntlet();
} else {
createGauntletContest();
}
});
}
private void createQuickCommandGauntlet() {
GuiChoose.getInteger(Forge.getLocalizer().getMessage("lblHowManyOpponents"), 3, 50, new Callback<Integer>() {
@Override
public void run(final Integer numOpponents) {
if (numOpponents == null) { return; }
GuiChoose.getInteger(Forge.getLocalizer().getMessage("lblHowManyOpponents"), 3, 50, numOpponents -> {
if (numOpponents == null) { return; }
ListChooser<DeckType> chooser = new ListChooser<>(
Forge.getLocalizer().getMessage("lblChooseAllowedDeckTypeOpponents"), 0, 11, Arrays.asList(DeckType.COMMANDER_DECK,
DeckType.PRECON_COMMANDER_DECK,
DeckType.RANDOM_COMMANDER_DECK), null, new Callback<List<DeckType>>() {
@Override
public void run(final List<DeckType> allowedDeckTypes) {
ListChooser<DeckType> chooser = new ListChooser<>(
Forge.getLocalizer().getMessage("lblChooseAllowedDeckTypeOpponents"), 0, 11, Arrays.asList(DeckType.COMMANDER_DECK,
DeckType.PRECON_COMMANDER_DECK,
DeckType.RANDOM_COMMANDER_DECK), null, allowedDeckTypes -> {
if (allowedDeckTypes == null || allowedDeckTypes.isEmpty()) {
return;
}
FDeckChooser.promptForDeck(Forge.getLocalizer().getMessage("lblSelectYourDeck"), GameType.Commander, false, new Callback<Deck>() {
@Override
public void run(Deck userDeck) {
if (userDeck == null) {
return;
}
GauntletData gauntlet = GauntletUtil.createCommanderGauntlet(userDeck, numOpponents, allowedDeckTypes, null);
launchGauntlet(gauntlet);
FDeckChooser.promptForDeck(Forge.getLocalizer().getMessage("lblSelectYourDeck"), GameType.Commander, false, userDeck -> {
if (userDeck == null) {
return;
}
GauntletData gauntlet = GauntletUtil.createCommanderGauntlet(userDeck, numOpponents, allowedDeckTypes, null);
launchGauntlet(gauntlet);
});
}
});
chooser.show(null, false); /*setting selectMax to true will select all available option*/
}
});
chooser.show(null, false); /*setting selectMax to true will select all available option*/
});
}
private void createQuickGauntlet() {
GuiChoose.getInteger(Forge.getLocalizer().getMessage("lblHowManyOpponents"), 3, 50, new Callback<Integer>() {
@Override
public void run(final Integer numOpponents) {
if (numOpponents == null) { return; }
GuiChoose.getInteger(Forge.getLocalizer().getMessage("lblHowManyOpponents"), 3, 50, numOpponents -> {
if (numOpponents == null) { return; }
ListChooser<DeckType> chooser = new ListChooser<>(
Forge.getLocalizer().getMessage("lblChooseAllowedDeckTypeOpponents"), 0, 11, Arrays.asList(DeckType.CUSTOM_DECK,
DeckType.PRECONSTRUCTED_DECK,
DeckType.QUEST_OPPONENT_DECK,
DeckType.COLOR_DECK,
DeckType.STANDARD_COLOR_DECK,
DeckType.STANDARD_CARDGEN_DECK,
DeckType.MODERN_COLOR_DECK,
DeckType.PIONEER_CARDGEN_DECK,
DeckType.HISTORIC_CARDGEN_DECK,
DeckType.MODERN_CARDGEN_DECK,
DeckType.LEGACY_CARDGEN_DECK,
DeckType.VINTAGE_CARDGEN_DECK,
DeckType.PAUPER_CARDGEN_DECK,
DeckType.THEME_DECK), null, new Callback<List<DeckType>>() {
@Override
public void run(final List<DeckType> allowedDeckTypes) {
ListChooser<DeckType> chooser = new ListChooser<>(
Forge.getLocalizer().getMessage("lblChooseAllowedDeckTypeOpponents"), 0, 11, Arrays.asList(DeckType.CUSTOM_DECK,
DeckType.PRECONSTRUCTED_DECK,
DeckType.QUEST_OPPONENT_DECK,
DeckType.COLOR_DECK,
DeckType.STANDARD_COLOR_DECK,
DeckType.STANDARD_CARDGEN_DECK,
DeckType.MODERN_COLOR_DECK,
DeckType.PIONEER_CARDGEN_DECK,
DeckType.HISTORIC_CARDGEN_DECK,
DeckType.MODERN_CARDGEN_DECK,
DeckType.LEGACY_CARDGEN_DECK,
DeckType.VINTAGE_CARDGEN_DECK,
DeckType.PAUPER_CARDGEN_DECK,
DeckType.THEME_DECK), null, allowedDeckTypes -> {
if (allowedDeckTypes == null || allowedDeckTypes.isEmpty()) {
return;
}
FDeckChooser.promptForDeck(Forge.getLocalizer().getMessage("lblSelectYourDeck"), GameType.Gauntlet, false, new Callback<Deck>() {
@Override
public void run(Deck userDeck) {
if (userDeck == null) {
return;
}
GauntletData gauntlet = GauntletUtil.createQuickGauntlet(userDeck, numOpponents, allowedDeckTypes, null);
launchGauntlet(gauntlet);
FDeckChooser.promptForDeck(Forge.getLocalizer().getMessage("lblSelectYourDeck"), GameType.Gauntlet, false, userDeck -> {
if (userDeck == null) {
return;
}
GauntletData gauntlet = GauntletUtil.createQuickGauntlet(userDeck, numOpponents, allowedDeckTypes, null);
launchGauntlet(gauntlet);
});
}
});
chooser.show(null, false); /*setting selectMax to true will select all available option*/
}
});
chooser.show(null, false); /*setting selectMax to true will select all available option*/
});
}
private void createCustomGauntlet() {
GuiChoose.getInteger(Forge.getLocalizer().getMessage("lblHowManyOpponents"), 3, 50, new Callback<Integer>() {
@Override
public void run(final Integer numOpponents) {
if (numOpponents == null) { return; }
GuiChoose.getInteger(Forge.getLocalizer().getMessage("lblHowManyOpponents"), 3, 50, numOpponents -> {
if (numOpponents == null) { return; }
GauntletData gauntlet = new GauntletData();
gauntlet.setDecks(new ArrayList<>());
promptForAiDeck(gauntlet, numOpponents);
}
GauntletData gauntlet = new GauntletData();
gauntlet.setDecks(new ArrayList<>());
promptForAiDeck(gauntlet, numOpponents);
});
}
private void createCustomCommanderGauntlet() {
GuiChoose.getInteger(Forge.getLocalizer().getMessage("lblHowManyOpponents"), 3, 50, new Callback<Integer>() {
@Override
public void run(final Integer numOpponents) {
if (numOpponents == null) { return; }
GuiChoose.getInteger(Forge.getLocalizer().getMessage("lblHowManyOpponents"), 3, 50, numOpponents -> {
if (numOpponents == null) { return; }
GauntletData gauntlet = new GauntletData(true);
gauntlet.setDecks(new ArrayList<>());
promptForAiDeck(gauntlet, numOpponents);
}
GauntletData gauntlet = new GauntletData(true);
gauntlet.setDecks(new ArrayList<>());
promptForAiDeck(gauntlet, numOpponents);
});
}
private void promptForAiDeck(final GauntletData gauntlet, final int numOpponents) {
final int opponentNum = gauntlet.getDecks().size() + 1;
final GameType gameType = gauntlet.isCommanderGauntlet() ? GameType.CommanderGauntlet : GameType.Gauntlet;
FDeckChooser.promptForDeck(Forge.getLocalizer().getMessage("lblSelectDeckForOpponent") + " " + opponentNum + " / " + numOpponents, gameType, true, new Callback<Deck>() {
@Override
public void run(Deck aiDeck) {
if (aiDeck == null) { return; }
FDeckChooser.promptForDeck(Forge.getLocalizer().getMessage("lblSelectDeckForOpponent") + " " + opponentNum + " / " + numOpponents, gameType, true, aiDeck -> {
if (aiDeck == null) { return; }
gauntlet.getDecks().add(aiDeck);
gauntlet.getEventNames().add(aiDeck.getName());
gauntlet.getDecks().add(aiDeck);
gauntlet.getEventNames().add(aiDeck.getName());
if (opponentNum < numOpponents) {
promptForAiDeck(gauntlet, numOpponents);
}
else {
//once all ai decks have been selected, prompt for user deck
FDeckChooser.promptForDeck(Forge.getLocalizer().getMessage("lblSelectYourDeck"), gameType, false, new Callback<Deck>() {
@Override
public void run(Deck userDeck) {
if (userDeck == null) { return; }
if (opponentNum < numOpponents) {
promptForAiDeck(gauntlet, numOpponents);
}
else {
//once all ai decks have been selected, prompt for user deck
FDeckChooser.promptForDeck(Forge.getLocalizer().getMessage("lblSelectYourDeck"), gameType, false, userDeck -> {
if (userDeck == null) { return; }
gauntlet.setUserDeck(userDeck);
GauntletUtil.setDefaultGauntletName(gauntlet, GauntletIO.PREFIX_CUSTOM);
launchGauntlet(gauntlet);
}
});
}
gauntlet.setUserDeck(userDeck);
GauntletUtil.setDefaultGauntletName(gauntlet, GauntletIO.PREFIX_CUSTOM);
launchGauntlet(gauntlet);
});
}
});
}
@@ -224,26 +189,20 @@ public class NewGauntletScreen extends LaunchScreen {
}
}
GuiChoose.oneOrNone(Forge.getLocalizer().getMessage("lblSelectGauntletContest"), contests, new Callback<GauntletData>() {
@Override
public void run(final GauntletData contest) {
if (contest == null) { return; }
GuiChoose.oneOrNone(Forge.getLocalizer().getMessage("lblSelectGauntletContest"), contests, contest -> {
if (contest == null) { return; }
FDeckChooser.promptForDeck(Forge.getLocalizer().getMessage("lblSelectYourDeck"), GameType.Gauntlet, false, new Callback<Deck>() {
@Override
public void run(final Deck userDeck) {
if (userDeck == null) { return; }
FDeckChooser.promptForDeck(Forge.getLocalizer().getMessage("lblSelectYourDeck"), GameType.Gauntlet, false, userDeck -> {
if (userDeck == null) { return; }
//create copy of contest to use as gauntlet
GauntletData gauntlet = new GauntletData();
gauntlet.setDecks(new ArrayList<>(contest.getDecks()));
gauntlet.setEventNames(new ArrayList<>(contest.getEventNames()));
gauntlet.setUserDeck(userDeck);
GauntletUtil.setDefaultGauntletName(gauntlet, contest.getDisplayName() + "_");
launchGauntlet(gauntlet);
}
});
}
//create copy of contest to use as gauntlet
GauntletData gauntlet = new GauntletData();
gauntlet.setDecks(new ArrayList<>(contest.getDecks()));
gauntlet.setEventNames(new ArrayList<>(contest.getEventNames()));
gauntlet.setUserDeck(userDeck);
GauntletUtil.setDefaultGauntletName(gauntlet, contest.getDisplayName() + "_");
launchGauntlet(gauntlet);
});
});
}

View File

@@ -23,7 +23,6 @@ import forge.toolbox.FLabel;
import forge.toolbox.FOptionPane;
import forge.toolbox.FTextArea;
import forge.toolbox.GuiChoose;
import forge.util.Callback;
import forge.util.Utils;
public class PuzzleScreen extends LaunchScreen {
@@ -56,32 +55,29 @@ public class PuzzleScreen extends LaunchScreen {
final ArrayList<Puzzle> puzzles = PuzzleIO.loadPuzzles(ForgeConstants.PUZZLE_DIR);
Collections.sort(puzzles);
GuiChoose.oneOrNone(Forge.getLocalizer().getMessage("lblChooseAPuzzle"), puzzles, new Callback<Puzzle>() {
@Override
public void run(final Puzzle chosen) {
if (chosen != null) {
LoadingOverlay.show(Forge.getLocalizer().getMessage("lblLoadingThePuzzle"), true, () -> {
// Load selected puzzle
final HostedMatch hostedMatch = GuiBase.getInterface().hostMatch();
hostedMatch.setStartGameHook(() -> chosen.applyToGame(hostedMatch.getGame()));
GuiChoose.oneOrNone(Forge.getLocalizer().getMessage("lblChooseAPuzzle"), puzzles, chosen -> {
if (chosen != null) {
LoadingOverlay.show(Forge.getLocalizer().getMessage("lblLoadingThePuzzle"), true, () -> {
// Load selected puzzle
final HostedMatch hostedMatch = GuiBase.getInterface().hostMatch();
hostedMatch.setStartGameHook(() -> chosen.applyToGame(hostedMatch.getGame()));
hostedMatch.setEndGameHook((() -> chosen.savePuzzleSolve(hostedMatch.getGame().getOutcome().isWinner(GamePlayerUtil.getGuiPlayer()))));
hostedMatch.setEndGameHook((() -> chosen.savePuzzleSolve(hostedMatch.getGame().getOutcome().isWinner(GamePlayerUtil.getGuiPlayer()))));
final List<RegisteredPlayer> players = new ArrayList<>();
final RegisteredPlayer human = new RegisteredPlayer(new Deck()).setPlayer(GamePlayerUtil.getGuiPlayer());
human.setStartingHand(0);
players.add(human);
final List<RegisteredPlayer> players = new ArrayList<>();
final RegisteredPlayer human = new RegisteredPlayer(new Deck()).setPlayer(GamePlayerUtil.getGuiPlayer());
human.setStartingHand(0);
players.add(human);
final RegisteredPlayer ai = new RegisteredPlayer(new Deck()).setPlayer(GamePlayerUtil.createAiPlayer());
ai.setStartingHand(0);
players.add(ai);
final RegisteredPlayer ai = new RegisteredPlayer(new Deck()).setPlayer(GamePlayerUtil.createAiPlayer());
ai.setStartingHand(0);
players.add(ai);
GameRules rules = new GameRules(GameType.Puzzle);
rules.setGamesPerMatch(1);
hostedMatch.startMatch(rules, null, players, human, GuiBase.getInterface().getNewGuiGame());
FOptionPane.showMessageDialog(chosen.getGoalDescription(), chosen.getName());
});
}
GameRules rules = new GameRules(GameType.Puzzle);
rules.setGamesPerMatch(1);
hostedMatch.startMatch(rules, null, players, human, GuiBase.getInterface().getNewGuiGame());
FOptionPane.showMessageDialog(chosen.getGoalDescription(), chosen.getName());
});
}
});

View File

@@ -69,40 +69,34 @@ public class DraftingProcessScreen extends FDeckEditor {
}
FThreads.invokeInEdtNowOrLater(() -> {
FOptionPane.showInputDialog(Forge.getLocalizer().getMessage("lblSaveDraftAs") + "?", new Callback<>() {
@Override
public void run(final String name) {
if (StringUtils.isEmpty(name)) {
save(callback); //re-prompt if user doesn't pick a name
FOptionPane.showInputDialog(Forge.getLocalizer().getMessage("lblSaveDraftAs") + "?", name -> {
if (StringUtils.isEmpty(name)) {
save(callback); //re-prompt if user doesn't pick a name
return;
}
// Check for overwrite case
for (DeckGroup d : FModel.getDecks().getDraft()) {
if (name.equalsIgnoreCase(d.getName())) {
FOptionPane.showConfirmDialog(
Forge.getLocalizer().getMessage("lblAlreadyDeckName") + name + Forge.getLocalizer().getMessage("lblOverwriteConfirm"),
Forge.getLocalizer().getMessage("lblOverwriteDeck"), false, result -> {
if (result) {
finishSave(name);
if (callback != null) {
callback.run(true);
}
} else {
save(callback); //If no overwrite, recurse
}
});
return;
}
}
// Check for overwrite case
for (DeckGroup d : FModel.getDecks().getDraft()) {
if (name.equalsIgnoreCase(d.getName())) {
FOptionPane.showConfirmDialog(
Forge.getLocalizer().getMessage("lblAlreadyDeckName") + name + Forge.getLocalizer().getMessage("lblOverwriteConfirm"),
Forge.getLocalizer().getMessage("lblOverwriteDeck"), false, new Callback<>() {
@Override
public void run(Boolean result) {
if (result) {
finishSave(name);
if (callback != null) {
callback.run(true);
}
} else {
save(callback); //If no overwrite, recurse
}
}
});
return;
}
}
finishSave(name);
if (callback != null) {
callback.run(true);
}
finishSave(name);
if (callback != null) {
callback.run(true);
}
});
});

View File

@@ -1188,12 +1188,9 @@ public class MatchScreen extends FScreen {
}
private void confirmUserConcedes() {
final Callback<Boolean> callback = new Callback<>() {
@Override
public void run(Boolean result) {
if (result) {
getGameController().concede();
}
final Callback<Boolean> callback = result -> {
if (result) {
getGameController().concede();
}
};

View File

@@ -13,7 +13,6 @@ import forge.menu.FPopupMenu;
import forge.model.FModel;
import forge.screens.FScreen;
import forge.toolbox.FOptionPane;
import forge.util.Callback;
public class OnlineMenu extends FPopupMenu {
public enum OnlineScreen {
@@ -31,23 +30,20 @@ public class OnlineMenu extends FPopupMenu {
if(screenClass == null) {
FOptionPane.showConfirmDialog(
Forge.getLocalizer().getMessage("lblLeaveLobbyDescription"),
Forge.getLocalizer().getMessage("lblDisconnect"), new Callback<Boolean>() {
@Override
public void run(Boolean result) {
if (result) {
if (FServerManager.getInstance() != null)
if(FServerManager.getInstance().isHosting()) {
FServerManager.getInstance().unsetReady();
FServerManager.getInstance().stopServer();
}
Forge.getLocalizer().getMessage("lblDisconnect"), result -> {
if (result) {
if (FServerManager.getInstance() != null)
if(FServerManager.getInstance().isHosting()) {
FServerManager.getInstance().unsetReady();
FServerManager.getInstance().stopServer();
}
if (OnlineLobbyScreen.getfGameClient() != null)
OnlineLobbyScreen.closeClient();
if (OnlineLobbyScreen.getfGameClient() != null)
OnlineLobbyScreen.closeClient();
Forge.back();
screen = null;
OnlineLobbyScreen.clearGameLobby();
}
Forge.back();
screen = null;
OnlineLobbyScreen.clearGameLobby();
}
});
return;

View File

@@ -355,13 +355,10 @@ public class ConquestAEtherScreen extends FScreen {
caption = caption0;
options = ImmutableList.copyOf(options0);
setSelectedOption(options.get(0));
setCommand(e -> GuiChoose.getChoices(Forge.getLocalizer().getMessage("lblSelectCaptionFilter", caption), 0, 1, options, Set.of(selectedOption), null, new Callback<>() {
@Override
public void run(List<AEtherFilter> result) {
if (!result.isEmpty()) {
setSelectedOption(result.get(0));
updateFilteredPool();
}
setCommand(e -> GuiChoose.getChoices(Forge.getLocalizer().getMessage("lblSelectCaptionFilter", caption), 0, 1, options, Set.of(selectedOption), null, result -> {
if (!result.isEmpty()) {
setSelectedOption(result.get(0));
updateFilteredPool();
}
}));
}

View File

@@ -95,12 +95,7 @@ public class ConquestCommandersScreen extends FScreen {
String problem = DeckFormat.PlanarConquest.getDeckConformanceProblem(commander.getDeck());
if (problem != null) {
//prevent selecting a commander with an invalid deck
FOptionPane.showMessageDialog(Forge.getLocalizer().getMessage("lblCantSelectDeckBecause", commander.getName(), problem), Forge.getLocalizer().getMessage("lblInvalidDeck"), FOptionPane.INFORMATION_ICON, new Callback<Integer>() {
@Override
public void run(Integer result) {
canCloseCallback.run(false);
}
});
FOptionPane.showMessageDialog(Forge.getLocalizer().getMessage("lblCantSelectDeckBecause", commander.getName(), problem), Forge.getLocalizer().getMessage("lblInvalidDeck"), FOptionPane.INFORMATION_ICON, result -> canCloseCallback.run(false));
return;
}

View File

@@ -28,7 +28,6 @@ import forge.gamemodes.planarconquest.ConquestBattle;
import forge.gamemodes.planarconquest.ConquestChaosBattle;
import forge.gamemodes.planarconquest.ConquestData;
import forge.gamemodes.planarconquest.ConquestEvent;
import forge.gamemodes.planarconquest.ConquestEvent.ChaosWheelOutcome;
import forge.gamemodes.planarconquest.ConquestEvent.ConquestEventRecord;
import forge.gamemodes.planarconquest.ConquestLocation;
import forge.gamemodes.planarconquest.ConquestPlane;
@@ -50,7 +49,6 @@ import forge.toolbox.FDisplayObject;
import forge.toolbox.FList;
import forge.toolbox.FOptionPane;
import forge.toolbox.FScrollPane;
import forge.util.Callback;
import forge.util.Utils;
import forge.util.collect.FCollectionView;
@@ -130,38 +128,30 @@ public class ConquestMultiverseScreen extends FScreen {
}
private void spinChaosWheel() {
ConquestChaosWheel.spin(new Callback<ChaosWheelOutcome>() {
@Override
public void run(ChaosWheelOutcome outcome) {
switch (outcome) {
case BOOSTER:
awardBoosters(model.getCurrentPlane().getAwardPool(), 1);
break;
case DOUBLE_BOOSTER:
awardBoosters(model.getCurrentPlane().getAwardPool(), 2);
break;
case SHARDS:
awardShards(FModel.getConquestPreferences().getPrefInt(CQPref.AETHER_WHEEL_SHARDS), false);
break;
case DOUBLE_SHARDS:
awardShards(2 * FModel.getConquestPreferences().getPrefInt(CQPref.AETHER_WHEEL_SHARDS), false);
break;
case PLANESWALK:
if (model.getUnlockedPlaneCount() == model.getAccessiblePlaneCount()) {
FOptionPane.showMessageDialog(Forge.getLocalizer().getMessage("lblAllPlanesUnlockedNotify"), Forge.getLocalizer().getMessage("lblAllPlanesUnlocked"), EMBLEM_IMAGE, new Callback<Integer>() {
@Override
public void run(Integer result) {
launchChaosBattle();
}
});
} else {
awardBonusPlaneswalkEmblems(FModel.getConquestPreferences().getPrefInt(CQPref.PLANESWALK_WHEEL_EMBLEMS));
}
break;
case CHAOS:
launchChaosBattle();
break;
ConquestChaosWheel.spin(outcome -> {
switch (outcome) {
case BOOSTER:
awardBoosters(model.getCurrentPlane().getAwardPool(), 1);
break;
case DOUBLE_BOOSTER:
awardBoosters(model.getCurrentPlane().getAwardPool(), 2);
break;
case SHARDS:
awardShards(FModel.getConquestPreferences().getPrefInt(CQPref.AETHER_WHEEL_SHARDS), false);
break;
case DOUBLE_SHARDS:
awardShards(2 * FModel.getConquestPreferences().getPrefInt(CQPref.AETHER_WHEEL_SHARDS), false);
break;
case PLANESWALK:
if (model.getUnlockedPlaneCount() == model.getAccessiblePlaneCount()) {
FOptionPane.showMessageDialog(Forge.getLocalizer().getMessage("lblAllPlanesUnlockedNotify"), Forge.getLocalizer().getMessage("lblAllPlanesUnlocked"), EMBLEM_IMAGE, result -> launchChaosBattle());
} else {
awardBonusPlaneswalkEmblems(FModel.getConquestPreferences().getPrefInt(CQPref.PLANESWALK_WHEEL_EMBLEMS));
}
break;
case CHAOS:
launchChaosBattle();
break;
}
});
}

View File

@@ -205,19 +205,16 @@ public class QuestSpellShopScreen extends TabPageScreen<QuestSpellShopScreen> {
final int max = itemManager.getItemCount(item);
if (max == 0) { return; }
final Callback<Integer> callback = new Callback<Integer>() {
@Override
public void run(final Integer result) {
if (result == null || result <= 0) { return; }
final Callback<Integer> callback = result -> {
if (result == null || result <= 0) { return; }
//invoke in background thread so other dialogs can be shown properly
FThreads.invokeInBackgroundThread(() -> {
ItemPool<InventoryItem> items = new ItemPool<>(InventoryItem.class);
items.add(item, result);
activateItems(items);
FThreads.invokeInEdtLater(() -> parentScreen.updateCreditsLabel());
});
}
//invoke in background thread so other dialogs can be shown properly
FThreads.invokeInBackgroundThread(() -> {
ItemPool<InventoryItem> items = new ItemPool<>(InventoryItem.class);
items.add(item, result);
activateItems(items);
FThreads.invokeInEdtLater(() -> parentScreen.updateCreditsLabel());
});
};
if (max == 1) {
callback.run(max);

View File

@@ -296,12 +296,9 @@ public class FilesPage extends TabPage<SettingsScreen> {
@Override
public void select() {
new GuiDownloader(createService(), new Callback<Boolean>() {
@Override
public void run(Boolean finished) {
if (finished) {
finishCallback();
}
new GuiDownloader(createService(), finished -> {
if (finished) {
finishCallback();
}
}).show();
}
@@ -322,20 +319,14 @@ public class FilesPage extends TabPage<SettingsScreen> {
@Override
public void select() {
final Map<String, String> categories = getCategories();
GuiChoose.one(prompt, categories.keySet(), new Callback<String>() {
@Override
public void run(String result) {
final String url = categories.get(result);
final String name = url.substring(url.lastIndexOf("/") + 2);
new GuiDownloader(new GuiDownloadZipService(name, name, url, ForgeConstants.FONTS_DIR, null, null), new Callback<Boolean>() {
@Override
public void run(Boolean finished) {
if (finished) {
finishCallback();
}
}
}).show();
}
GuiChoose.one(prompt, categories.keySet(), result -> {
final String url = categories.get(result);
final String name = url.substring(url.lastIndexOf("/") + 2);
new GuiDownloader(new GuiDownloadZipService(name, name, url, ForgeConstants.FONTS_DIR, null, null), finished -> {
if (finished) {
finishCallback();
}
}).show();
});
}
protected abstract Map<String, String> getCategories();
@@ -355,14 +346,11 @@ public class FilesPage extends TabPage<SettingsScreen> {
@Override
public void select() {
FFileChooser.show(Forge.getLocalizer().getMessage("lblSelect").replace("%s", label), ChoiceType.GetDirectory, description, new Callback<String>() {
@Override
public void run(String result) {
if (StringUtils.isEmpty(result) || description.equals(result)) { return; }
updateDir(result);
onDirectoryChanged(result);
FOptionPane.showMessageDialog(Forge.getLocalizer().getMessage("lblRestartForgeMoveFilesNewLocation"), Forge.getLocalizer().getMessage("lblRestartRequired"), FOptionPane.INFORMATION_ICON);
}
FFileChooser.show(Forge.getLocalizer().getMessage("lblSelect").replace("%s", label), ChoiceType.GetDirectory, description, result -> {
if (StringUtils.isEmpty(result) || description.equals(result)) { return; }
updateDir(result);
onDirectoryChanged(result);
FOptionPane.showMessageDialog(Forge.getLocalizer().getMessage("lblRestartForgeMoveFilesNewLocation"), Forge.getLocalizer().getMessage("lblRestartRequired"), FOptionPane.INFORMATION_ICON);
});
}
protected abstract void onDirectoryChanged(String newDir);

View File

@@ -28,7 +28,6 @@ import forge.toolbox.FCheckBox;
import forge.toolbox.FGroupList;
import forge.toolbox.FList;
import forge.toolbox.FOptionPane;
import forge.util.Callback;
import forge.util.Utils;
import java.util.*;
@@ -75,12 +74,9 @@ public class SettingsPage extends TabPage<SettingsScreen> {
FLanguage.changeLanguage(newValue);
FOptionPane.showConfirmDialog(Forge.getLocalizer().getMessage("lblRestartForgeDescription"), Forge.getLocalizer().getMessage("lblRestartForge"), Forge.getLocalizer().getMessage("lblRestart"), Forge.getLocalizer().getMessage("lblLater"), new Callback<Boolean>() {
@Override
public void run(Boolean result) {
if (result) {
Forge.restart(true);
}
FOptionPane.showConfirmDialog(Forge.getLocalizer().getMessage("lblRestartForgeDescription"), Forge.getLocalizer().getMessage("lblRestartForge"), Forge.getLocalizer().getMessage("lblRestart"), Forge.getLocalizer().getMessage("lblLater"), result -> {
if (result) {
Forge.restart(true);
}
});
}
@@ -125,12 +121,9 @@ public class SettingsPage extends TabPage<SettingsScreen> {
boolean landscapeMode = FModel.getPreferences().getPrefBoolean(FPref.UI_LANDSCAPE_MODE);
Forge.getDeviceAdapter().setLandscapeMode(landscapeMode); //ensure device able to save off ini file so landscape change takes effect
if (Forge.isLandscapeMode() != landscapeMode) {
FOptionPane.showConfirmDialog(Forge.getLocalizer().getMessage("lblRestartForgeDescription"), Forge.getLocalizer().getMessage("lblRestartForge"), Forge.getLocalizer().getMessage("lblRestart"), Forge.getLocalizer().getMessage("lblLater"), new Callback<Boolean>() {
@Override
public void run(Boolean result) {
if (result) {
Forge.restart(true);
}
FOptionPane.showConfirmDialog(Forge.getLocalizer().getMessage("lblRestartForgeDescription"), Forge.getLocalizer().getMessage("lblRestartForge"), Forge.getLocalizer().getMessage("lblRestart"), Forge.getLocalizer().getMessage("lblLater"), result -> {
if (result) {
Forge.restart(true);
}
});
}
@@ -376,12 +369,9 @@ public class SettingsPage extends TabPage<SettingsScreen> {
Forge.getLocalizer().getMessage("lblRestartForgeDescription"),
Forge.getLocalizer().getMessage("lblRestartForge"),
Forge.getLocalizer().getMessage("lblRestart"),
Forge.getLocalizer().getMessage("lblLater"), new Callback<Boolean>() {
@Override
public void run(Boolean result) {
if (result) {
Forge.restart(true);
}
Forge.getLocalizer().getMessage("lblLater"), result -> {
if (result) {
Forge.restart(true);
}
}
);
@@ -397,12 +387,9 @@ public class SettingsPage extends TabPage<SettingsScreen> {
Forge.getLocalizer().getMessage("lblRestartForgeDescription"),
Forge.getLocalizer().getMessage("lblRestartForge"),
Forge.getLocalizer().getMessage("lblRestart"),
Forge.getLocalizer().getMessage("lblLater"), new Callback<Boolean>() {
@Override
public void run(Boolean result) {
if (result) {
Forge.restart(true);
}
Forge.getLocalizer().getMessage("lblLater"), result -> {
if (result) {
Forge.restart(true);
}
}
);
@@ -418,12 +405,9 @@ public class SettingsPage extends TabPage<SettingsScreen> {
Forge.getLocalizer().getMessage("lblRestartForgeDescription"),
Forge.getLocalizer().getMessage("lblRestartForge"),
Forge.getLocalizer().getMessage("lblRestart"),
Forge.getLocalizer().getMessage("lblLater"), new Callback<Boolean>() {
@Override
public void run(Boolean result) {
if (result) {
Forge.restart(true);
}
Forge.getLocalizer().getMessage("lblLater"), result -> {
if (result) {
Forge.restart(true);
}
}
);
@@ -458,12 +442,9 @@ public class SettingsPage extends TabPage<SettingsScreen> {
Forge.getLocalizer().getMessage("lblRestartForgeDescription"),
Forge.getLocalizer().getMessage("lblRestartForge"),
Forge.getLocalizer().getMessage("lblRestart"),
Forge.getLocalizer().getMessage("lblLater"), new Callback<Boolean>() {
@Override
public void run(Boolean result) {
if (result) {
Forge.restart(true);
}
Forge.getLocalizer().getMessage("lblLater"), result -> {
if (result) {
Forge.restart(true);
}
}
);
@@ -495,12 +476,9 @@ public class SettingsPage extends TabPage<SettingsScreen> {
Forge.getLocalizer().getMessage("lblRestartForgeDescription"),
Forge.getLocalizer().getMessage("lblRestartForge"),
Forge.getLocalizer().getMessage("lblRestart"),
Forge.getLocalizer().getMessage("lblLater"), new Callback<Boolean>() {
@Override
public void run(Boolean result) {
if (result) {
Forge.restart(true);
}
Forge.getLocalizer().getMessage("lblLater"), result -> {
if (result) {
Forge.restart(true);
}
}
);
@@ -958,21 +936,18 @@ public class SettingsPage extends TabPage<SettingsScreen> {
description,
currentValue,
null,
new Callback<String>() {
@Override
public void run(String input) {
if (input == null) return; // cancelled
if (!input.matches("\\d+")) {
FOptionPane.showMessageDialog("Please enter a valid number.", "Invalid Input");
return;
}
int value = Integer.parseInt(input);
if (value < minValue || value > maxValue) {
FOptionPane.showMessageDialog("Value must be between " + minValue + " and " + maxValue + ".", "Invalid Input");
return;
}
valueChanged(input);
input -> {
if (input == null) return; // cancelled
if (!input.matches("\\d+")) {
FOptionPane.showMessageDialog("Please enter a valid number.", "Invalid Input");
return;
}
int value = Integer.parseInt(input);
if (value < minValue || value > maxValue) {
FOptionPane.showMessageDialog("Value must be between " + minValue + " and " + maxValue + ".", "Invalid Input");
return;
}
valueChanged(input);
},
true // isNumeric
);

View File

@@ -83,12 +83,7 @@ public class FOptionPane extends FDialog {
public static void showConfirmDialog(final String message, final String title, final String yesButtonText, final String noButtonText, final boolean defaultYes, final Callback<Boolean> callback) {
final List<String> options = ImmutableList.of(yesButtonText, noButtonText);
showOptionDialog(message, title, QUESTION_ICON, options, defaultYes ? 0 : 1, new Callback<Integer>() {
@Override
public void run(final Integer result) {
callback.run(result == 0);
}
});
showOptionDialog(message, title, QUESTION_ICON, options, defaultYes ? 0 : 1, result -> callback.run(result == 0));
}
public static void showOptionDialog(final String message, final String title, final FImage icon, final List<String> options, final Callback<Integer> callback) {
@@ -189,19 +184,15 @@ public class FOptionPane extends FDialog {
container.add(inputField);
container.setHeight(inputField.getHeight() + padTop + PADDING);
final FOptionPane optionPane = new FOptionPane(message, null, title, null, container, ImmutableList.of(Forge.getLocalizer().getMessage("lblOK"), Forge.getLocalizer().getMessage("lblCancel")), 0, new Callback<Integer>() {
@SuppressWarnings("unchecked")
@Override
public void run(final Integer result) {
if (result == 0) {
if (txtInput != null) {
callback.run((T)txtInput.getText());
} else {
callback.run(cbInput.getSelectedItem());
}
final FOptionPane optionPane = new FOptionPane(message, null, title, null, container, ImmutableList.of(Forge.getLocalizer().getMessage("lblOK"), Forge.getLocalizer().getMessage("lblCancel")), 0, result -> {
if (result == 0) {
if (txtInput != null) {
callback.run((T)txtInput.getText());
} else {
callback.run(null);
callback.run(cbInput.getSelectedItem());
}
} else {
callback.run(null);
}
}) {
@Override

View File

@@ -2,7 +2,6 @@ package forge.toolbox;
import forge.Forge;
import forge.toolbox.FEvent.FEventType;
import forge.util.Callback;
public class FSpinner extends FTextField {
@@ -36,16 +35,13 @@ public class FSpinner extends FTextField {
@Override
public boolean tap(float x, float y, int count) {
GuiChoose.getInteger(Forge.getLocalizer().getMessage("lblSelectANumber"), minValue, maxValue, new Callback<Integer>() {
@Override
public void run(Integer result) {
if (result != null && result != value) {
int oldValue = value;
setValue(result);
if (getChangedHandler() != null) {
//handle change event if value changed from input
getChangedHandler().handleEvent(new FEvent(FSpinner.this, FEventType.CHANGE, oldValue));
}
GuiChoose.getInteger(Forge.getLocalizer().getMessage("lblSelectANumber"), minValue, maxValue, result -> {
if (result != null && result != value) {
int oldValue = value;
setValue(result);
if (getChangedHandler() != null) {
//handle change event if value changed from input
getChangedHandler().handleEvent(new FEvent(FSpinner.this, FEventType.CHANGE, oldValue));
}
}
});

View File

@@ -35,12 +35,7 @@ public class GuiChoose {
callback.run(null);
return;
}
getChoices(message, 0, 1, choices, new Callback<List<T>>() {
@Override
public void run(final List<T> result) {
callback.run(result.isEmpty() ? null : result.get(0));
}
});
getChoices(message, 0, 1, choices, result -> callback.run(result.isEmpty() ? null : result.get(0)));
}
public static <T> void oneOrNone(final String message, final Collection<T> choices, final Callback<T> callback) {
@@ -48,12 +43,7 @@ public class GuiChoose {
callback.run(null);
return;
}
getChoices(message, 0, 1, choices, new Callback<List<T>>() {
@Override
public void run(final List<T> result) {
callback.run(result.isEmpty() ? null : result.get(0));
}
});
getChoices(message, 0, 1, choices, result -> callback.run(result.isEmpty() ? null : result.get(0)));
} // getChoiceOptional(String,T...)
// returned Object will never be null
@@ -80,12 +70,9 @@ public class GuiChoose {
return;
}
getChoices(message, 1, 1, choices, new Callback<List<T>>() {
@Override
public void run(final List<T> result) {
assert result.size() == 1;
callback.run(result.get(0));
}
getChoices(message, 1, 1, choices, result -> {
assert result.size() == 1;
callback.run(result.get(0));
});
}
@@ -99,12 +86,9 @@ public class GuiChoose {
return;
}
getChoices(message, 1, 1, choices, new Callback<List<T>>() {
@Override
public void run(final List<T> result) {
assert result.size() == 1;
callback.run(result.get(0));
}
getChoices(message, 1, 1, choices, result -> {
assert result.size() == 1;
callback.run(result.get(0));
});
}
@@ -172,52 +156,46 @@ public class GuiChoose {
}
choices.add(Forge.getLocalizer().getMessage("lblOther") + "...");
oneOrNone(message, choices, new Callback<Object>() {
@Override
public void run(Object choice) {
if (choice instanceof Integer || choice == null) {
callback.run((Integer)choice);
return;
}
//if Other option picked, prompt for number input
String prompt = "Enter a number";
if (min != Integer.MIN_VALUE) {
if (max != Integer.MAX_VALUE) {
prompt += " between " + min + " and " + max;
}
else {
prompt += " greater than or equal to " + min;
}
}
else if (max != Integer.MAX_VALUE) {
prompt += " less than or equal to " + max;
}
prompt += ":";
getNumberInput(prompt, message, min, max, callback);
oneOrNone(message, choices, choice -> {
if (choice instanceof Integer || choice == null) {
callback.run((Integer)choice);
return;
}
//if Other option picked, prompt for number input
String prompt = "Enter a number";
if (min != Integer.MIN_VALUE) {
if (max != Integer.MAX_VALUE) {
prompt += " between " + min + " and " + max;
}
else {
prompt += " greater than or equal to " + min;
}
}
else if (max != Integer.MAX_VALUE) {
prompt += " less than or equal to " + max;
}
prompt += ":";
getNumberInput(prompt, message, min, max, callback);
});
}
private static void getNumberInput(final String prompt, final String message, final int min, final int max, final Callback<Integer> callback) {
FOptionPane.showInputDialog(prompt, message, new Callback<String>() {
@Override
public void run(String result) {
if (result == null) { //that is 'cancel'
callback.run(null);
FOptionPane.showInputDialog(prompt, message, result -> {
if (result == null) { //that is 'cancel'
callback.run(null);
return;
}
if (StringUtils.isNumeric(result)) {
int val = Integer.parseInt(result);
if (val >= min && val <= max) {
callback.run(val);
return;
}
if (StringUtils.isNumeric(result)) {
int val = Integer.parseInt(result);
if (val >= min && val <= max) {
callback.run(val);
return;
}
}
//re-prompt if invalid input
getNumberInput(prompt, message, min, max, callback);
}
//re-prompt if invalid input
getNumberInput(prompt, message, min, max, callback);
});
}
@@ -271,12 +249,7 @@ public class GuiChoose {
callback.run(null);
return;
}
sortedGetChoices(message, 0, 1, choices, comparer, new Callback<List<T>>() {
@Override
public void run(List<T> result) {
callback.run(result.isEmpty() ? null : result.get(0));
}
});
sortedGetChoices(message, 0, 1, choices, comparer, result -> callback.run(result.isEmpty() ? null : result.get(0)));
}
// If comparer is NULL, T has to be comparable. Otherwise you'll get an exception from inside the Arrays.sort() routine
@@ -285,12 +258,7 @@ public class GuiChoose {
callback.run(null);
return;
}
sortedGetChoices(message, 0, 1, choices, comparer, new Callback<List<T>>() {
@Override
public void run(List<T> result) {
callback.run(result.isEmpty() ? null : result.get(0));
}
});
sortedGetChoices(message, 0, 1, choices, comparer, result -> callback.run(result.isEmpty() ? null : result.get(0)));
}
// If comparer is NULL, T has to be comparable. Otherwise you'll get an exception from inside the Arrays.sort() routine
@@ -299,12 +267,9 @@ public class GuiChoose {
callback.run(null);
return;
}
sortedGetChoices(message, 1, 1, choices, comparer, new Callback<List<T>>() {
@Override
public void run(List<T> result) {
assert result.size() == 1;
callback.run(result.get(0));
}
sortedGetChoices(message, 1, 1, choices, comparer, result -> {
assert result.size() == 1;
callback.run(result.get(0));
});
}
@@ -314,12 +279,9 @@ public class GuiChoose {
callback.run(null);
return;
}
sortedGetChoices(message, 1, 1, choices, comparer, new Callback<List<T>>() {
@Override
public void run(List<T> result) {
assert result.size() == 1;
callback.run(result.get(0));
}
sortedGetChoices(message, 1, 1, choices, comparer, result -> {
assert result.size() == 1;
callback.run(result.get(0));
});
}

View File

@@ -29,11 +29,7 @@ public class GuiDialog {
final String title = c == null ? "Question" : c + " - Ability";
String questionToUse = StringUtils.isBlank(question) ? "Activate card's ability?" : question;
final List<String> opts = options == null ? defaultConfirmOptions : options;
FOptionPane.showCardOptionDialog(c, questionToUse, title, FOptionPane.QUESTION_ICON, opts, defaultIsYes ? 0 : 1, new Callback<Integer>() {
@Override public void run(final Integer result) {
callback.run(result == 0);
}
});
FOptionPane.showCardOptionDialog(c, questionToUse, title, FOptionPane.QUESTION_ICON, opts, defaultIsYes ? 0 : 1, result -> callback.run(result == 0));
}
/**

View File

@@ -120,19 +120,16 @@ public class ListChooser<T> extends FContainer {
updateHeight();
optionPane = new FOptionPane(null, null, title, null, this, options, 0, new Callback<Integer>() {
@Override
public void run(Integer result) {
called = false;
if (result == 0) {
callback.run(lstChoices.getSelectedItems());
}
else if (minChoices > 0) {
show(); //show if user tries to cancel when input is mandatory
}
else {
callback.run(new ArrayList<>());
}
optionPane = new FOptionPane(null, null, title, null, this, options, 0, result -> {
called = false;
if (result == 0) {
callback.run(lstChoices.getSelectedItems());
}
else if (minChoices > 0) {
show(); //show if user tries to cancel when input is mandatory
}
else {
callback.run(new ArrayList<>());
}
}) {
@Override

View File

@@ -1,5 +1,6 @@
package forge.util;
public abstract class Callback<T> {
public abstract void run(T result);
@FunctionalInterface
public interface Callback<T> {
void run(T result);
}

View File

@@ -2,7 +2,7 @@ package forge.util;
import forge.gui.FThreads;
public abstract class WaitCallback<T> extends Callback<T> implements Runnable {
public abstract class WaitCallback<T> implements Callback<T>, Runnable {
public class Lock {
}