package com.faforever.client.game; import com.faforever.client.i18n.I18n; import com.faforever.client.map.MapService; import com.google.common.base.Joiner; import javafx.fxml.FXML; import javafx.scene.Node; import javafx.scene.control.Label; import javafx.scene.control.Tooltip; import javafx.scene.image.ImageView; import javafx.scene.input.MouseButton; import javafx.scene.input.MouseEvent; import org.apache.commons.lang3.StringUtils; import org.springframework.context.ApplicationContext; import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.util.Objects; import java.util.function.Consumer; import static javafx.beans.binding.Bindings.createObjectBinding; import static javafx.beans.binding.Bindings.createStringBinding; public class GameTileController { @FXML Label lockIconLabel; @FXML Label gameTypeLabel; @FXML Node gameTileRoot; @FXML Label gameMapLabel; @FXML Label gameTitleLabel; @FXML Label numberOfPlayersLabel; @FXML Label hostLabel; @FXML Label modsLabel; @FXML ImageView mapImageView; @Resource MapService mapService; @Resource I18n i18n; @Resource ApplicationContext applicationContext; @Resource GameService gameService; @Resource JoinGameHelper joinGameHelper; private Consumer<GameInfoBean> onSelectedListener; private GameInfoBean gameInfoBean; public void setOnSelectedListener(Consumer<GameInfoBean> onSelectedListener) { this.onSelectedListener = onSelectedListener; } @FXML void initialize() { modsLabel.managedProperty().bind(modsLabel.visibleProperty()); modsLabel.visibleProperty().bind(modsLabel.textProperty().isNotEmpty()); gameTypeLabel.managedProperty().bind(gameTypeLabel.visibleProperty()); lockIconLabel.managedProperty().bind(lockIconLabel.visibleProperty()); } @PostConstruct void postConstruct() { joinGameHelper.setParentNode(getRoot()); } public Node getRoot() { return gameTileRoot; } public void setGameInfoBean(GameInfoBean gameInfoBean) { this.gameInfoBean = gameInfoBean; GameTypeBean gameType = gameService.getGameTypeByString(gameInfoBean.getFeaturedMod()); String fullName = gameType != null ? gameType.getFullName() : null; gameTypeLabel.setText(StringUtils.defaultString(fullName)); gameTitleLabel.setText(gameInfoBean.getTitle()); hostLabel.setText(gameInfoBean.getHost()); gameMapLabel.textProperty().bind(gameInfoBean.mapFolderNameProperty()); numberOfPlayersLabel.textProperty().bind(createStringBinding( () -> i18n.get("game.players.format", gameInfoBean.getNumPlayers(), gameInfoBean.getMaxPlayers()), gameInfoBean.numPlayersProperty(), gameInfoBean.maxPlayersProperty() )); mapImageView.imageProperty().bind(createObjectBinding(() -> mapService.loadSmallPreview(gameInfoBean.getMapFolderName()), gameInfoBean.mapFolderNameProperty())); modsLabel.textProperty().bind(createStringBinding( () -> Joiner.on(i18n.get("textSeparator")).join(gameInfoBean.getSimMods().values()), gameInfoBean.getSimMods() )); // TODO display "unknown map" image first since loading may take a while mapImageView.imageProperty().bind(createObjectBinding( () -> mapService.loadSmallPreview(gameInfoBean.getMapFolderName()), gameInfoBean.mapFolderNameProperty() )); lockIconLabel.visibleProperty().bind(gameInfoBean.passwordProtectedProperty()); Tooltip tooltip = new Tooltip(); Tooltip.install(gameTileRoot, tooltip); tooltip.activatedProperty().addListener((observable, oldValue, newValue) -> { if (newValue) { GameTooltipController gameTooltipController = applicationContext.getBean(GameTooltipController.class); gameTooltipController.setGameInfoBean(gameInfoBean); tooltip.setGraphic(gameTooltipController.getRoot()); } }); tooltip.showingProperty().addListener((observable, oldValue, newValue) -> { if (!newValue) { tooltip.setGraphic(null); } }); } @FXML void onClick(MouseEvent mouseEvent) { Objects.requireNonNull(onSelectedListener, "onSelectedListener has not been set"); Objects.requireNonNull(gameInfoBean, "gameInfoBean has not been set"); gameTileRoot.requestFocus(); onSelectedListener.accept(gameInfoBean); if (mouseEvent.getButton() == MouseButton.PRIMARY && mouseEvent.getClickCount() == 2) { mouseEvent.consume(); joinGameHelper.join(gameInfoBean); } } }