package com.faforever.client.mod;
import com.faforever.client.i18n.I18n;
import com.faforever.client.notification.ImmediateNotification;
import com.faforever.client.notification.NotificationService;
import com.faforever.client.notification.ReportAction;
import com.faforever.client.notification.Severity;
import com.faforever.client.reporting.ReportingService;
import com.faforever.client.util.IdenticonUtil;
import javafx.collections.ListChangeListener;
import javafx.collections.WeakListChangeListener;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressBar;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyCode;
import javafx.scene.input.MouseEvent;
import org.apache.commons.lang3.StringUtils;
import javax.annotation.Resource;
import static java.util.Collections.singletonList;
public class ModDetailController {
@FXML
Label progressLabel;
@FXML
Button uninstallButton;
@FXML
Button installButton;
@FXML
ImageView thumbnailImageView;
@FXML
Label nameLabel;
@FXML
Label authorLabel;
@FXML
ProgressBar progressBar;
@FXML
Label modDescriptionLabel;
@FXML
Node modDetailRoot;
@Resource
ModService modService;
@Resource
NotificationService notificationService;
@Resource
I18n i18n;
@Resource
ReportingService reportingService;
private ModInfoBean mod;
private ListChangeListener<ModInfoBean> installStatusChangeListener;
@FXML
void initialize() {
uninstallButton.managedProperty().bind(uninstallButton.visibleProperty());
installButton.managedProperty().bind(installButton.visibleProperty());
progressBar.managedProperty().bind(progressBar.visibleProperty());
progressBar.visibleProperty().bind(uninstallButton.visibleProperty().not().and(installButton.visibleProperty().not()));
progressLabel.managedProperty().bind(progressLabel.visibleProperty());
progressLabel.visibleProperty().bind(progressBar.visibleProperty());
modDetailRoot.setOnKeyPressed(keyEvent -> {
if (keyEvent.getCode() == KeyCode.ESCAPE){
onCloseButtonClicked();
}
});
installStatusChangeListener = change -> {
while (change.next()) {
for (ModInfoBean modInfoBean : change.getAddedSubList()) {
if (mod.getId().equals(modInfoBean.getId())) {
setInstalled(true);
return;
}
}
for (ModInfoBean modInfoBean : change.getRemoved()) {
if (mod.getId().equals(modInfoBean.getId())) {
setInstalled(false);
return;
}
}
}
};
}
public void onCloseButtonClicked() {
getRoot().setVisible(false);
}
private void setInstalled(boolean installed) {
installButton.setVisible(!installed);
uninstallButton.setVisible(installed);
}
public Node getRoot() {
return modDetailRoot;
}
public void setMod(ModInfoBean mod) {
this.mod = mod;
if (StringUtils.isNotEmpty(mod.getThumbnailUrl())) {
thumbnailImageView.setImage(modService.loadThumbnail(mod));
} else {
thumbnailImageView.setImage(IdenticonUtil.createIdenticon(mod.getId()));
}
nameLabel.setText(mod.getName());
authorLabel.setText(mod.getAuthor());
boolean modInstalled = modService.isModInstalled(mod.getId());
installButton.setVisible(!modInstalled);
uninstallButton.setVisible(modInstalled);
modDescriptionLabel.textProperty().bind(mod.descriptionProperty());
modService.getInstalledMods().addListener(new WeakListChangeListener<>(installStatusChangeListener));
setInstalled(modService.isModInstalled(mod.getId()));
}
@FXML
void onInstallButtonClicked() {
installButton.setVisible(false);
modService.downloadAndInstallMod(mod, progressBar.progressProperty(), progressLabel.textProperty())
.exceptionally(throwable -> {
notificationService.addNotification(new ImmediateNotification(
i18n.get("errorTitle"),
i18n.get("modVault.installationFailed", mod.getName(), throwable.getLocalizedMessage()),
Severity.ERROR, throwable, singletonList(new ReportAction(i18n, reportingService, throwable))));
return null;
});
}
@FXML
void onUninstallButtonClicked() {
progressBar.progressProperty().unbind();
progressBar.setProgress(-1);
uninstallButton.setVisible(false);
modService.uninstallMod(mod).exceptionally(throwable -> {
notificationService.addNotification(new ImmediateNotification(
i18n.get("errorTitle"),
i18n.get("modVault.couldNotDeleteMod", mod.getName(), throwable.getLocalizedMessage()),
Severity.ERROR, throwable, singletonList(new ReportAction(i18n, reportingService, throwable))));
return null;
});
}
@FXML
void onDimmerClicked() {
onCloseButtonClicked();
}
public void onContentPaneClicked(MouseEvent event) {
event.consume();
}
}