GUI: improved pick card/trigger dialog (cards list sorted by name now, closes #11874);

This commit is contained in:
Oleg Agafonov 2024-07-19 11:24:55 +04:00
parent b2891e90cf
commit e5912b227a
2 changed files with 22 additions and 6 deletions

View file

@ -18,15 +18,18 @@ import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
/**
* Panel with cards list, can show cards in two modes:
* - cards one by one in the line;
* - stacked and multicolumns (if many cards);
* - stacked and multi-columns (if many cards);
*
* Uses in some dialogs like pile choose and cards choosing
* Used in some dialogs like pile choose, cards choosing/targeting and test render
*/
public class CardArea extends JPanel implements CardEventProducer {
@ -34,7 +37,10 @@ public class CardArea extends JPanel implements CardEventProducer {
protected final CardEventSource cardEventSource = new CardEventSource();
private static int MAX_CARDS_PER_COLUMN = 20; // max cards amount in one column
private static final int MAX_CARDS_PER_COLUMN = 20; // max cards amount in one column
// TODO: add fast search and sort by card zones
private static final boolean SORTED_BY_CARD_NAME = true;
private boolean reloaded = false;
private final javax.swing.JLayeredPane cardArea;
@ -160,10 +166,20 @@ public class CardArea extends JPanel implements CardEventProducer {
fixDialogSize();
}
private List<CardView> getSortedList(CardsView showCards) {
if (SORTED_BY_CARD_NAME) {
return showCards.values().stream()
.sorted(Comparator.comparing(CardView::getName))
.collect(Collectors.toList());
} else {
return new ArrayList<>(showCards.values());
}
}
private void loadCardsFew(CardsView showCards, BigCard bigCard, UUID gameId) {
Rectangle rectangle = new Rectangle(cardDimension.width, cardDimension.height);
int cardsAdded = 0;
for (CardView card : showCards.values()) {
for (CardView card : getSortedList(showCards)) {
if (cardsAdded > 0) {
rectangle.translate(cardDimension.width + xOffsetBetweenCardsOrColumns, 0);
}
@ -219,7 +235,7 @@ public class CardArea extends JPanel implements CardEventProducer {
if (showCards != null && !showCards.isEmpty()) {
Rectangle rectangle = new Rectangle(cardDimension.width, cardDimension.height);
int count = 0;
for (CardView card : showCards.values()) {
for (CardView card : getSortedList(showCards)) {
addCard(card, bigCard, gameId, rectangle);
if (count >= MAX_CARDS_PER_COLUMN) {
rectangle.translate(cardDimension.width + xOffsetBetweenCardsOrColumns, -(MAX_CARDS_PER_COLUMN * verticalCardOffset));

View file

@ -22,7 +22,7 @@
/**
* Game GUI: choose target card from the cards list (example: exile and choose card to cast, choose triggers order, etc)
*
* @author BetaSteward_at_googlemail.com
* @author BetaSteward_at_googlemail.com, JayDi85
*/
public class ShowCardsDialog extends MageDialog {