mirror of
https://github.com/cryptomator/cryptomator.git
synced 2026-05-19 19:21:27 +00:00
ditch custom in-place sorting and rely on javafx methods
This commit is contained in:
@@ -14,19 +14,23 @@ import org.slf4j.LoggerFactory;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
import javafx.application.Platform;
|
||||
import javafx.beans.binding.Bindings;
|
||||
import javafx.beans.binding.BooleanBinding;
|
||||
import javafx.beans.property.BooleanProperty;
|
||||
import javafx.beans.property.ObjectProperty;
|
||||
import javafx.beans.property.SimpleBooleanProperty;
|
||||
import javafx.beans.property.StringProperty;
|
||||
import javafx.beans.value.ObservableValue;
|
||||
import javafx.collections.FXCollections;
|
||||
import javafx.collections.ObservableList;
|
||||
import javafx.fxml.FXML;
|
||||
|
||||
import javafx.scene.Node;
|
||||
import javafx.scene.Scene;
|
||||
import javafx.scene.control.Label;
|
||||
import javafx.scene.control.RadioButton;
|
||||
import javafx.scene.control.Toggle;
|
||||
import javafx.scene.control.ToggleGroup;
|
||||
import javafx.scene.layout.HBox;
|
||||
import javafx.scene.layout.VBox;
|
||||
import javafx.stage.DirectoryChooser;
|
||||
import javafx.stage.Stage;
|
||||
@@ -59,12 +63,14 @@ public class CreateNewVaultLocationController implements FxController {
|
||||
private final ObservableValue<Boolean> validVaultPath;
|
||||
private final BooleanProperty usePresetPath;
|
||||
private final BooleanProperty loadingPresetLocations = new SimpleBooleanProperty(false);
|
||||
private final ObservableList<Node> radioButtons;
|
||||
|
||||
private Path customVaultPath = DEFAULT_CUSTOM_VAULT_PATH;
|
||||
|
||||
//FXML
|
||||
public ToggleGroup locationPresetsToggler;
|
||||
public VBox radioButtonVBox;
|
||||
public HBox customLocationRadioBtn;
|
||||
public RadioButton customRadioButton;
|
||||
public Label locationStatusLabel;
|
||||
public FontAwesome5IconView goodLocation;
|
||||
@@ -88,6 +94,7 @@ public class CreateNewVaultLocationController implements FxController {
|
||||
this.validVaultPath = ObservableUtil.mapWithDefault(vaultPathStatus, VaultPathStatus::valid, false);
|
||||
this.vaultPathStatus.addListener(this::updateStatusLabel);
|
||||
this.usePresetPath = new SimpleBooleanProperty();
|
||||
this.radioButtons = FXCollections.observableArrayList();
|
||||
}
|
||||
|
||||
private VaultPathStatus validatePath(Path p) throws NullPointerException {
|
||||
@@ -137,6 +144,8 @@ public class CreateNewVaultLocationController implements FxController {
|
||||
window.addEventHandler(WindowEvent.WINDOW_HIDING, _ -> task.cancel(true));
|
||||
locationPresetsToggler.selectedToggleProperty().addListener(this::togglePredefinedLocation);
|
||||
usePresetPath.bind(locationPresetsToggler.selectedToggleProperty().isNotEqualTo(customRadioButton));
|
||||
radioButtons.add(customLocationRadioBtn);
|
||||
Bindings.bindContent(radioButtonVBox.getChildren(), radioButtons.sorted(this::compareLocationPresets));
|
||||
}
|
||||
|
||||
private void loadLocationPresets() {
|
||||
@@ -148,34 +157,24 @@ public class CreateNewVaultLocationController implements FxController {
|
||||
}
|
||||
|
||||
private void createRadioButtonFor(LocationPreset preset) {
|
||||
assert !radioButtonVBox.getChildren().isEmpty();
|
||||
|
||||
Platform.runLater(() -> {
|
||||
var btn = new RadioButton(preset.name());
|
||||
btn.setUserData(preset.path());
|
||||
|
||||
//in place sorting
|
||||
var vboxElements = radioButtonVBox.getChildren();
|
||||
boolean added = false;
|
||||
for (int listIndex = 0; listIndex < vboxElements.size(); listIndex++) {
|
||||
if (vboxElements.get(listIndex) instanceof RadioButton rb) {
|
||||
//another radio button
|
||||
if (rb.getText().compareTo(preset.name()) > 0) {
|
||||
vboxElements.add(listIndex, btn);
|
||||
added = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!added) {
|
||||
vboxElements.add(vboxElements.size() - 1, btn); //last element is always the custom location btn
|
||||
}
|
||||
|
||||
radioButtons.add(btn);
|
||||
locationPresetsToggler.getToggles().add(btn);
|
||||
});
|
||||
}
|
||||
|
||||
private int compareLocationPresets(Node n1, Node n2) {
|
||||
if (customLocationRadioBtn.getId().equals(n1.getId())) {
|
||||
return 1;
|
||||
} else if (customLocationRadioBtn.getId().equals(n2.getId())) {
|
||||
return -1;
|
||||
} else {
|
||||
return ((RadioButton) n1).getText().compareToIgnoreCase(((RadioButton) n2).getText());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void togglePredefinedLocation(@SuppressWarnings("unused") ObservableValue<? extends Toggle> observable, @SuppressWarnings("unused") Toggle oldValue, Toggle newValue) {
|
||||
var storagePath = Optional.ofNullable((Path) newValue.getUserData()).orElse(customVaultPath);
|
||||
|
||||
Reference in New Issue
Block a user