diff --git a/src/main/java/org/cryptomator/ui/controls/FontAwesome5Icon.java b/src/main/java/org/cryptomator/ui/controls/FontAwesome5Icon.java index 66eda7556..ea6ba00d3 100644 --- a/src/main/java/org/cryptomator/ui/controls/FontAwesome5Icon.java +++ b/src/main/java/org/cryptomator/ui/controls/FontAwesome5Icon.java @@ -27,6 +27,7 @@ public enum FontAwesome5Icon { FILE("\uF15B"), // FILE_IMPORT("\uF56F"), // FOLDER_OPEN("\uF07C"), // + FUNNEL("\uF0B0"), // HAND_HOLDING_HEART("\uF4BE"), // HEART("\uF004"), // HDD("\uF0A0"), // diff --git a/src/main/java/org/cryptomator/ui/health/CheckDetailController.java b/src/main/java/org/cryptomator/ui/health/CheckDetailController.java index 83cb4ea7d..8f0454fd1 100644 --- a/src/main/java/org/cryptomator/ui/health/CheckDetailController.java +++ b/src/main/java/org/cryptomator/ui/health/CheckDetailController.java @@ -14,13 +14,25 @@ import javafx.beans.binding.BooleanExpression; import javafx.beans.property.BooleanProperty; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleBooleanProperty; +import javafx.beans.property.SimpleObjectProperty; import javafx.beans.value.ObservableValue; import javafx.collections.FXCollections; import javafx.fxml.FXML; +import javafx.scene.control.ChoiceBox; import javafx.scene.control.ListView; +import javafx.util.StringConverter; +import java.util.Arrays; import java.util.function.Function; +import java.util.function.Predicate; import java.util.stream.Stream; +import static org.cryptomator.cryptofs.health.api.DiagnosticResult.Severity; +import static org.cryptomator.ui.health.Result.FixState.FIXABLE; +import static org.cryptomator.ui.health.Result.FixState.FIXED; +import static org.cryptomator.ui.health.Result.FixState.FIXING; +import static org.cryptomator.ui.health.Result.FixState.FIX_FAILED; +import static org.cryptomator.ui.health.Result.FixState.NOT_FIXABLE; + @HealthCheckScoped public class CheckDetailController implements FxController { @@ -43,8 +55,11 @@ public class CheckDetailController implements FxController { private final BooleanProperty fixAllInfoResultsExecuted; private final BooleanBinding fixAllInfoResultsPossible; + private final ObjectProperty> resultsFilter; public ListView resultsListView; + public ChoiceBox severityChoiceBox; + public ChoiceBox fixStateChoiceBox; private Subscription resultSubscription; @Inject @@ -62,17 +77,18 @@ public class CheckDetailController implements FxController { this.checkFailed = BooleanExpression.booleanExpression(checkState.map(Check.CheckState.ERROR::equals).orElse(false)); this.checkCancelled = BooleanExpression.booleanExpression(checkState.map(Check.CheckState.CANCELLED::equals).orElse(false)); this.checkFinished = checkSucceeded.or(checkFailed).or(checkCancelled); - this.countOfWarnSeverity = results.reduce(countSeverity(DiagnosticResult.Severity.WARN)); - this.countOfCritSeverity = results.reduce(countSeverity(DiagnosticResult.Severity.CRITICAL)); + this.countOfWarnSeverity = results.reduce(countSeverity(Severity.WARN)); + this.countOfCritSeverity = results.reduce(countSeverity(Severity.CRITICAL)); this.warnOrCritsExist = EasyBind.combine(checkSucceeded, countOfWarnSeverity, countOfCritSeverity, (suceeded, warns, crits) -> suceeded && (warns.longValue() > 0 || crits.longValue() > 0)); this.fixAllInfoResultsExecuted = new SimpleBooleanProperty(false); this.fixAllInfoResultsPossible = Bindings.createBooleanBinding(() -> results.stream().anyMatch(this::isFixableInfoResult), results) // .and(fixAllInfoResultsExecuted.not()); + this.resultsFilter = new SimpleObjectProperty<>(r -> true); selectedTask.addListener(this::selectedTaskChanged); } private boolean isFixableInfoResult(Result r) { - return r.diagnosis().getSeverity() == DiagnosticResult.Severity.INFO && r.getState() == Result.FixState.FIXABLE; + return r.diagnosis().getSeverity() == Severity.INFO && r.getState() == FIXABLE; } private void selectedTaskChanged(ObservableValue observable, Check oldValue, Check newValue) { @@ -82,6 +98,8 @@ public class CheckDetailController implements FxController { if (newValue != null) { resultSubscription = EasyBind.bindContent(results, newValue.getResults()); } + severityChoiceBox.setValue(null); + fixStateChoiceBox.setValue(null); } private Function, Long> countSeverity(DiagnosticResult.Severity severity) { @@ -90,8 +108,25 @@ public class CheckDetailController implements FxController { @FXML public void initialize() { - resultsListView.setItems(results); + resultsListView.setItems(results.filtered(resultsFilter)); resultsListView.setCellFactory(resultListCellFactory); + + severityChoiceBox.getItems().add(null); + severityChoiceBox.getItems().addAll(Arrays.stream(DiagnosticResult.Severity.values()).toList()); + //severityFilter.setConverter(new SeverityStringifier()); + severityChoiceBox.setValue(null); + + fixStateChoiceBox.getItems().add(null); + fixStateChoiceBox.getItems().addAll(Arrays.stream(Result.FixState.values()).toList()); + fixStateChoiceBox.setValue(null); + + resultsFilter.bind(Bindings.createObjectBinding(() -> this::filterResults, severityChoiceBox.valueProperty(), fixStateChoiceBox.valueProperty())); + } + + private boolean filterResults(Result r) { + var desiredFixState = fixStateChoiceBox.getValue(); + var desiredSeverity = severityChoiceBox.getValue(); + return (desiredFixState == null || r.getState() == desiredFixState) && (desiredSeverity == null || r.diagnosis().getSeverity() == desiredSeverity); } @FXML diff --git a/src/main/resources/fxml/health_check_details.fxml b/src/main/resources/fxml/health_check_details.fxml index d4564a852..03b5a4dfa 100644 --- a/src/main/resources/fxml/health_check_details.fxml +++ b/src/main/resources/fxml/health_check_details.fxml @@ -8,6 +8,7 @@ + - - + + + + + + + \ No newline at end of file