package net.demilich.metastone.gui.deckbuilder; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javafx.beans.value.ObservableValue; import javafx.collections.FXCollections; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.scene.control.ComboBox; import javafx.scene.control.TextField; import javafx.scene.layout.HBox; import net.demilich.metastone.GameNotification; import net.demilich.metastone.NotificationProxy; import net.demilich.metastone.game.cards.CardSet; import net.demilich.metastone.game.decks.DeckFormat; import net.demilich.metastone.gui.common.CardSetStringConverter; import net.demilich.metastone.gui.common.DeckFormatStringConverter; public class CardFilterView extends HBox { @FXML private TextField searchField; @FXML private ComboBox<CardSet> cardSetBox; @FXML private ComboBox<DeckFormat> deckFormatBox; private List<DeckFormat> deckFormats = new ArrayList<DeckFormat>(); public CardFilterView(List<DeckFormat> deckFormats) { FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/fxml/CardFilterView.fxml")); fxmlLoader.setRoot(this); fxmlLoader.setController(this); try { fxmlLoader.load(); } catch (IOException exception) { throw new RuntimeException(exception); } searchField.textProperty().addListener(this::textChanged); deckFormatBox.setConverter(new DeckFormatStringConverter()); DeckFormat deckFormat = new DeckFormat(); deckFormat.setName("DECK FORMAT"); deckFormats.add(0, deckFormat); deckFormatBox.setItems(FXCollections.observableArrayList(deckFormats)); deckFormatBox.getSelectionModel().selectFirst(); deckFormatBox.valueProperty().addListener(this::formatChanged); cardSetBox.setConverter(new CardSetStringConverter()); cardSetBox.setItems(FXCollections.observableArrayList(CardSet.values())); cardSetBox.getSelectionModel().selectFirst(); cardSetBox.valueProperty().addListener(this::setChanged); } private void filterChanged() { DeckFormat deckFormat = null; if (!deckFormatBox.getSelectionModel().isSelected(0)) { deckFormat = deckFormatBox.getSelectionModel().getSelectedItem(); } NotificationProxy.sendNotification(GameNotification.FILTER_CARDS, new CardFilter(searchField.getText(), cardSetBox.getSelectionModel().getSelectedItem(), deckFormat)); } private void formatChanged(ObservableValue<? extends DeckFormat> observable, DeckFormat oldValue, DeckFormat newValue) { CardSet set = cardSetBox.getSelectionModel().getSelectedItem(); if (deckFormatBox.getSelectionModel().isSelected(0)) { cardSetBox.setItems(FXCollections.observableArrayList(CardSet.values())); } else { List<CardSet> sets = newValue.getCardSets(); sets.add(0, CardSet.ANY); cardSetBox.setItems(FXCollections.observableArrayList(sets)); } if (!deckFormatBox.getSelectionModel().isSelected(0) && !set.equals(CardSet.ANY) && !newValue.isInFormat(set)) { cardSetBox.getSelectionModel().selectFirst(); } else { cardSetBox.getSelectionModel().select(set); } filterChanged(); } public void injectDeckFormats(List<DeckFormat> deckFormats) { this.deckFormats.addAll(deckFormats); } private void setChanged(ObservableValue<? extends CardSet> observable, CardSet oldValue, CardSet newValue) { filterChanged(); } private void textChanged(ObservableValue<? extends String> observable, String oldValue, String newValue) { filterChanged(); } }