package com.faforever.client.achievements;
import com.faforever.client.api.AchievementDefinition;
import com.faforever.client.api.AchievementState;
import com.faforever.client.api.AchievementType;
import com.faforever.client.api.PlayerAchievement;
import com.faforever.client.i18n.I18n;
import com.faforever.client.preferences.PreferencesService;
import com.google.common.base.MoreObjects;
import javafx.application.Platform;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressBar;
import javafx.scene.effect.ColorAdjust;
import javafx.scene.image.ImageView;
import javafx.scene.layout.GridPane;
import javax.annotation.Resource;
import java.util.Locale;
import java.util.Objects;
public class AchievementItemController {
@FXML
GridPane achievementItemRoot;
@FXML
Label nameLabel;
@FXML
Label descriptionLabel;
@FXML
Label pointsLabel;
@FXML
ProgressBar progressBar;
@FXML
Label progressLabel;
@FXML
ImageView imageView;
@Resource
Locale locale;
@Resource
I18n i18n;
@Resource
PreferencesService preferencesService;
@Resource
AchievementService achievementService;
private AchievementDefinition achievementDefinition;
@FXML
void initialize() {
progressBar.managedProperty().bind(progressBar.visibleProperty());
progressLabel.managedProperty().bind(progressLabel.visibleProperty());
}
public Node getRoot() {
return achievementItemRoot;
}
public void setAchievementDefinition(AchievementDefinition achievementDefinition) {
this.achievementDefinition = achievementDefinition;
nameLabel.setText(achievementDefinition.getName());
descriptionLabel.setText(achievementDefinition.getDescription());
pointsLabel.setText(String.format(locale, "%d", achievementDefinition.getExperiencePoints()));
imageView.setImage(achievementService.getRevealedIcon(achievementDefinition));
progressLabel.setText(i18n.get("achievement.stepsFormat", 0, achievementDefinition.getTotalSteps()));
progressBar.setProgress(0);
if (AchievementType.STANDARD == achievementDefinition.getType()) {
progressBar.setVisible(false);
progressLabel.setVisible(false);
}
ColorAdjust colorAdjust = new ColorAdjust();
colorAdjust.setSaturation(-1);
imageView.setEffect(colorAdjust);
imageView.setOpacity(0.5);
}
public void setPlayerAchievement(PlayerAchievement playerAchievement) {
if (achievementDefinition == null) {
throw new IllegalStateException("achievementDefinition needs to be set first");
}
if (!Objects.equals(achievementDefinition.getId(), playerAchievement.getAchievementId())) {
throw new IllegalStateException("Achievement ID does not match");
}
if (AchievementState.UNLOCKED == playerAchievement.getState()) {
imageView.setImage(achievementService.getUnlockedIcon(achievementDefinition));
imageView.setOpacity(1);
imageView.setEffect(null);
}
if (AchievementType.INCREMENTAL == achievementDefinition.getType()) {
Integer currentSteps = MoreObjects.firstNonNull(playerAchievement.getCurrentSteps(), 0);
Integer totalSteps = achievementDefinition.getTotalSteps();
progressBar.setProgress((double) currentSteps / totalSteps);
Platform.runLater(() -> progressLabel.setText(i18n.get("achievement.stepsFormat", currentSteps, totalSteps)));
}
}
}