From f9368497b751a74183a632f3dd35bd6aa79ca406 Mon Sep 17 00:00:00 2001 From: crschnick Date: Wed, 17 Sep 2025 13:07:21 +0000 Subject: [PATCH] Rework options builder validator --- .../io/xpipe/app/comp/base/OptionsComp.java | 6 ++-- .../main/java/io/xpipe/app/ext/GuiDialog.java | 4 +-- .../xpipe/app/hub/comp/StoreCreationComp.java | 28 ++++++++++--------- .../xpipe/app/platform/ChainedValidator.java | 9 ------ .../app/platform/ExclusiveValidator.java | 5 ---- .../io/xpipe/app/platform/OptionsBuilder.java | 4 +-- .../xpipe/app/platform/SimpleValidator.java | 5 ---- .../java/io/xpipe/app/platform/Validator.java | 2 -- .../podman/PodmanContainerStoreProvider.java | 6 ++-- 9 files changed, 25 insertions(+), 44 deletions(-) diff --git a/app/src/main/java/io/xpipe/app/comp/base/OptionsComp.java b/app/src/main/java/io/xpipe/app/comp/base/OptionsComp.java index 1aa299d59..a8e10d665 100644 --- a/app/src/main/java/io/xpipe/app/comp/base/OptionsComp.java +++ b/app/src/main/java/io/xpipe/app/comp/base/OptionsComp.java @@ -5,6 +5,7 @@ import io.xpipe.app.comp.CompStructure; import io.xpipe.app.comp.SimpleCompStructure; import io.xpipe.app.core.AppFontSizes; import io.xpipe.app.platform.BindingsHelper; +import io.xpipe.app.platform.Check; import io.xpipe.app.platform.Validator; import io.xpipe.app.util.Hyperlinks; @@ -35,10 +36,12 @@ public class OptionsComp extends Comp> { private final List entries; private final Validator validator; + private final List checks; - public OptionsComp(List entries, Validator validator) { + public OptionsComp(List entries, Validator validator, List checks) { this.entries = entries; this.validator = validator; + this.checks = checks; } @Override @@ -214,7 +217,6 @@ public class OptionsComp extends Comp> { return; } - var checks = validator.getActiveChecks(); var failed = checks.stream() .filter(check -> check.getValidationResult().getMessages().size() > 0) .findFirst(); diff --git a/app/src/main/java/io/xpipe/app/ext/GuiDialog.java b/app/src/main/java/io/xpipe/app/ext/GuiDialog.java index 52148379d..bca24509b 100644 --- a/app/src/main/java/io/xpipe/app/ext/GuiDialog.java +++ b/app/src/main/java/io/xpipe/app/ext/GuiDialog.java @@ -1,6 +1,7 @@ package io.xpipe.app.ext; import io.xpipe.app.comp.Comp; +import io.xpipe.app.platform.OptionsBuilder; import io.xpipe.app.platform.Validator; import lombok.AllArgsConstructor; @@ -10,6 +11,5 @@ import lombok.Value; @AllArgsConstructor public class GuiDialog { - Comp comp; - Validator validator; + OptionsBuilder options; } diff --git a/app/src/main/java/io/xpipe/app/hub/comp/StoreCreationComp.java b/app/src/main/java/io/xpipe/app/hub/comp/StoreCreationComp.java index ce5d89905..d2683c2ef 100644 --- a/app/src/main/java/io/xpipe/app/hub/comp/StoreCreationComp.java +++ b/app/src/main/java/io/xpipe/app/hub/comp/StoreCreationComp.java @@ -36,10 +36,9 @@ public class StoreCreationComp extends ModalOverlayContentComp { return model.getBusy(); } - private Region createStoreProperties(Comp providerComp, Validator providerVal, Validator propVal) { + private OptionsBuilder createStoreProperties() { var nameKey = model.storeTypeNameKey(); - var built = new OptionsBuilder(propVal) - .addComp(providerComp, model.getStore()) + var built = new OptionsBuilder() .name(nameKey + "Name") .description(nameKey + "NameDescription") .addString(model.getName(), false) @@ -50,10 +49,8 @@ public class StoreCreationComp extends ModalOverlayContentComp { && DataStorage.get().getEffectiveReadOnlyState(model.getExistingEntry()) && s.equals(model.getExistingEntry().getName()); return !same; - })) - .buildComp(); - var comp = new OptionsComp(built.getEntries(), new ChainedValidator(List.of(providerVal, propVal))); - return comp.styleClass("store-creator-options").createRegion(); + })); + return built; } private Region createLayout() { @@ -73,16 +70,21 @@ public class StoreCreationComp extends ModalOverlayContentComp { model.getProvider().subscribe(n -> { if (n != null) { var d = n.guiDialog(model.getExistingEntry(), model.getStore()); - if (d == null || d.getComp() == null || d.getValidator() == null) { + if (d == null) { return; } - var propVal = new SimpleValidator(); - var propR = createStoreProperties(d.getComp(), d.getValidator(), propVal); + var propOptions = createStoreProperties(); model.getInitialStore().setValue(model.getStore().getValue()); var valSp = new GraphicDecorationStackPane(); - valSp.getChildren().add(propR); + + var full = new OptionsBuilder(); + full.sub(d.getOptions()); + full.sub(propOptions); + + var region = full.buildComp().styleClass("store-creator-options").createRegion(); + valSp.getChildren().add(region); var sp = new ScrollPane(valSp); sp.setSkin(new ScrollPaneSkin(sp)); @@ -102,10 +104,10 @@ public class StoreCreationComp extends ModalOverlayContentComp { layout.setCenter(vbox); - model.getValidator().setValue(new ChainedValidator(List.of(d.getValidator(), propVal))); + model.getValidator().setValue(full.buildEffectiveValidator()); Platform.runLater(() -> { - propR.requestFocus(); + region.requestFocus(); }); } else { layout.setCenter(null); diff --git a/app/src/main/java/io/xpipe/app/platform/ChainedValidator.java b/app/src/main/java/io/xpipe/app/platform/ChainedValidator.java index 6e8c7e6f0..ceec8ab5a 100644 --- a/app/src/main/java/io/xpipe/app/platform/ChainedValidator.java +++ b/app/src/main/java/io/xpipe/app/platform/ChainedValidator.java @@ -108,13 +108,4 @@ public class ChainedValidator implements Validator { }, observables); } - - @Override - public Collection getActiveChecks() { - var all = new ArrayList(); - for (var val : validators) { - all.addAll(val.getActiveChecks()); - } - return all; - } } diff --git a/app/src/main/java/io/xpipe/app/platform/ExclusiveValidator.java b/app/src/main/java/io/xpipe/app/platform/ExclusiveValidator.java index 33bb7582a..a7b2102b3 100644 --- a/app/src/main/java/io/xpipe/app/platform/ExclusiveValidator.java +++ b/app/src/main/java/io/xpipe/app/platform/ExclusiveValidator.java @@ -84,9 +84,4 @@ public final class ExclusiveValidator implements Validator { }, observables); } - - @Override - public Collection getActiveChecks() { - return validators.get(obs.getValue()).getActiveChecks(); - } } diff --git a/app/src/main/java/io/xpipe/app/platform/OptionsBuilder.java b/app/src/main/java/io/xpipe/app/platform/OptionsBuilder.java index c1148824c..b421ef421 100644 --- a/app/src/main/java/io/xpipe/app/platform/OptionsBuilder.java +++ b/app/src/main/java/io/xpipe/app/platform/OptionsBuilder.java @@ -409,7 +409,7 @@ public class OptionsBuilder { public OptionsComp buildComp() { finishCurrent(); - var comp = new OptionsComp(entries, buildEffectiveValidator()); + var comp = new OptionsComp(entries, buildEffectiveValidator(), allChecks); for (Augment> augment : augments) { comp.apply(augment); } @@ -421,6 +421,6 @@ public class OptionsBuilder { } public GuiDialog buildDialog() { - return new GuiDialog(buildComp(), buildEffectiveValidator()); + return new GuiDialog(this); } } diff --git a/app/src/main/java/io/xpipe/app/platform/SimpleValidator.java b/app/src/main/java/io/xpipe/app/platform/SimpleValidator.java index 065f173b7..6b5bf8785 100644 --- a/app/src/main/java/io/xpipe/app/platform/SimpleValidator.java +++ b/app/src/main/java/io/xpipe/app/platform/SimpleValidator.java @@ -123,11 +123,6 @@ public class SimpleValidator implements Validator { validationResultProperty); } - @Override - public Collection getActiveChecks() { - return checks.keySet(); - } - private void refreshProperties() { ValidationResult nextResult = new ValidationResult(); for (Check check : checks.keySet()) { diff --git a/app/src/main/java/io/xpipe/app/platform/Validator.java b/app/src/main/java/io/xpipe/app/platform/Validator.java index cd0a961dd..e53dddd79 100644 --- a/app/src/main/java/io/xpipe/app/platform/Validator.java +++ b/app/src/main/java/io/xpipe/app/platform/Validator.java @@ -122,6 +122,4 @@ public interface Validator { * @param separator The string to separate consecutive validation messages with */ StringBinding createStringBinding(String prefix, String separator); - - Collection getActiveChecks(); } diff --git a/ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanContainerStoreProvider.java b/ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanContainerStoreProvider.java index 0fb3cf37c..7cf0c4d76 100644 --- a/ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanContainerStoreProvider.java +++ b/ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanContainerStoreProvider.java @@ -56,10 +56,9 @@ public class PodmanContainerStoreProvider implements ShellStoreProvider { @Override public GuiDialog guiDialog(DataStoreEntry entry, Property store) { - var val = new SimpleValidator(); PodmanContainerStore st = (PodmanContainerStore) store.getValue(); - var q = new OptionsBuilder() + return new OptionsBuilder() .name("host") .description("podmanHostDescription") .addComp(StoreChoiceComp.host( @@ -70,8 +69,7 @@ public class PodmanContainerStoreProvider implements ShellStoreProvider { .name("container") .description("podmanContainerDescription") .addStaticString(st.getContainerName()) - .buildComp(); - return new GuiDialog(q, val); + .buildDialog(); } @Override