diff --git a/src/main/java/org/cryptomator/ui/health/ResultListCellController.java b/src/main/java/org/cryptomator/ui/health/ResultListCellController.java index 1dd30c766..2717a054c 100644 --- a/src/main/java/org/cryptomator/ui/health/ResultListCellController.java +++ b/src/main/java/org/cryptomator/ui/health/ResultListCellController.java @@ -18,14 +18,12 @@ import javafx.beans.binding.ObjectBinding; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleObjectProperty; import javafx.fxml.FXML; -import javafx.scene.control.Button; import java.util.ArrayList; import java.util.List; // unscoped because each cell needs its own controller public class ResultListCellController implements FxController { - //TODO: use different glyphs! private static final FontAwesome5Icon INFO_ICON = FontAwesome5Icon.INFO_CIRCLE; private static final FontAwesome5Icon GOOD_ICON = FontAwesome5Icon.CHECK; private static final FontAwesome5Icon WARN_ICON = FontAwesome5Icon.EXCLAMATION_TRIANGLE; @@ -37,14 +35,17 @@ public class ResultListCellController implements FxController { private final Binding description; private final ResultFixApplier fixApplier; private final OptionalBinding fixState; - private final ObjectBinding glyph; + private final ObjectBinding severityGlyph; + private final ObjectBinding fixGlyph; private final BooleanBinding fixable; private final BooleanBinding fixing; private final BooleanBinding fixed; + private final BooleanBinding fixFailed; + private final BooleanBinding fixRunningOrDone; private final List subscriptions; - public FontAwesome5IconView iconView; - public Button fixButton; + public FontAwesome5IconView severityView; + public FontAwesome5IconView fixView; @Inject public ResultListCellController(ResultFixApplier fixApplier) { @@ -52,22 +53,27 @@ public class ResultListCellController implements FxController { this.description = EasyBind.wrapNullable(result).map(Result::getDescription).orElse(""); this.fixApplier = fixApplier; this.fixState = EasyBind.wrapNullable(result).mapObservable(Result::fixState); - this.glyph = Bindings.createObjectBinding(this::getGlyph, result); + this.severityGlyph = Bindings.createObjectBinding(this::getSeverityGlyph, result); + this.fixGlyph = Bindings.createObjectBinding(this::getFixGlyph, fixState); this.fixable = Bindings.createBooleanBinding(this::isFixable, fixState); this.fixing = Bindings.createBooleanBinding(this::isFixing, fixState); this.fixed = Bindings.createBooleanBinding(this::isFixed, fixState); + this.fixFailed = Bindings.createBooleanBinding(this::isFixFailed, fixState); + this.fixRunningOrDone = fixing.or(fixed).or(fixFailed); this.subscriptions = new ArrayList<>(); } @FXML public void initialize() { // see getGlyph() for relevant glyphs: - iconView.getStyleClass().remove("glyph-icon"); + severityView.getStyleClass().remove("glyph-icon"); + fixView.getStyleClass().remove("glyph-icon"); subscriptions.addAll(List.of( - EasyBind.includeWhen(iconView.getStyleClass(), "glyph-icon-muted", iconView.glyphProperty().isEqualTo(INFO_ICON)), // - EasyBind.includeWhen(iconView.getStyleClass(), "glyph-icon-primary", iconView.glyphProperty().isEqualTo(GOOD_ICON)), // - EasyBind.includeWhen(iconView.getStyleClass(), "glyph-icon-orange", iconView.glyphProperty().isEqualTo(WARN_ICON)), // - EasyBind.includeWhen(iconView.getStyleClass(), "glyph-icon-red", iconView.glyphProperty().isEqualTo(CRIT_ICON))) // + EasyBind.includeWhen(severityView.getStyleClass(), "glyph-icon-muted", severityView.glyphProperty().isEqualTo(INFO_ICON)), // + EasyBind.includeWhen(severityView.getStyleClass(), "glyph-icon-primary", severityView.glyphProperty().isEqualTo(GOOD_ICON)), // + EasyBind.includeWhen(severityView.getStyleClass(), "glyph-icon-orange", severityView.glyphProperty().isEqualTo(WARN_ICON)), // + EasyBind.includeWhen(severityView.getStyleClass(), "glyph-icon-red", severityView.glyphProperty().isEqualTo(CRIT_ICON)), // + EasyBind.includeWhen(fixView.getStyleClass(), "glyph-icon-muted", fixView.glyphProperty().isNotNull())) // ); } @@ -101,15 +107,19 @@ public class ResultListCellController implements FxController { return result; } + public Binding descriptionProperty() { + return description; + } + public String getDescription() { return description.getValue(); } - public ObjectBinding glyphProperty() { - return glyph; + public ObjectBinding severityGlyphProperty() { + return severityGlyph; } - public FontAwesome5Icon getGlyph() { + public FontAwesome5Icon getSeverityGlyph() { var r = result.get(); if (r == null) { return null; @@ -122,8 +132,17 @@ public class ResultListCellController implements FxController { }; } - public Binding descriptionProperty() { - return description; + public ObjectBinding fixGlyphProperty() { + return fixGlyph; + } + + public FontAwesome5Icon getFixGlyph() { + return fixState.get().map(s -> switch (s) { + case NOT_FIXABLE, FIXABLE -> null; + case FIXING -> FontAwesome5Icon.SPINNER; + case FIXED -> FontAwesome5Icon.CHECK; + case FIX_FAILED -> FontAwesome5Icon.TIMES; + }).orElse(null); } public BooleanBinding fixableProperty() { @@ -150,4 +169,21 @@ public class ResultListCellController implements FxController { return fixState.get().map(Result.FixState.FIXED::equals).orElse(false); } + public BooleanBinding fixFailedProperty() { + return fixFailed; + } + + public Boolean isFixFailed() { + return fixState.get().map(Result.FixState.FIX_FAILED::equals).orElse(false); + } + + public BooleanBinding fixRunningOrDoneProperty() { + return fixRunningOrDone; + } + + public boolean isFixRunningOrDone() { + return fixRunningOrDone.get(); + } + + } diff --git a/src/main/resources/fxml/health_result_listcell.fxml b/src/main/resources/fxml/health_result_listcell.fxml index 5fc6134af..f25aa7016 100644 --- a/src/main/resources/fxml/health_result_listcell.fxml +++ b/src/main/resources/fxml/health_result_listcell.fxml @@ -6,7 +6,6 @@ - - +