From 7be3a3712a0096602df7d7a11742e202f5dd2008 Mon Sep 17 00:00:00 2001 From: crschnick Date: Thu, 16 Apr 2026 21:20:54 +0000 Subject: [PATCH] Rework script handling for enabled state --- .../io/xpipe/app/comp/base/CheckBoxComp.java | 61 +++++++++++++++++++ .../xpipe/app/comp/base/ToggleSwitchComp.java | 8 --- .../main/java/io/xpipe/app/ext/GuiDialog.java | 5 +- .../xpipe/app/hub/comp/StoreCreationComp.java | 2 +- .../ext/base/script/ScriptStoreProvider.java | 27 +++++--- 5 files changed, 84 insertions(+), 19 deletions(-) create mode 100644 app/src/main/java/io/xpipe/app/comp/base/CheckBoxComp.java diff --git a/app/src/main/java/io/xpipe/app/comp/base/CheckBoxComp.java b/app/src/main/java/io/xpipe/app/comp/base/CheckBoxComp.java new file mode 100644 index 000000000..e81ad519f --- /dev/null +++ b/app/src/main/java/io/xpipe/app/comp/base/CheckBoxComp.java @@ -0,0 +1,61 @@ +package io.xpipe.app.comp.base; + +import atlantafx.base.controls.ToggleSwitch; +import io.xpipe.app.comp.RegionBuilder; +import io.xpipe.app.core.AppI18n; +import io.xpipe.app.platform.LabelGraphic; +import io.xpipe.app.platform.PlatformThread; +import javafx.beans.binding.Bindings; +import javafx.beans.property.Property; +import javafx.beans.property.ReadOnlyObjectWrapper; +import javafx.beans.value.ObservableValue; +import javafx.css.PseudoClass; +import javafx.geometry.Pos; +import javafx.scene.control.CheckBox; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyEvent; +import lombok.EqualsAndHashCode; +import lombok.Value; + +@Value +@EqualsAndHashCode(callSuper = true) +public class CheckBoxComp extends RegionBuilder { + + Property selected; + ObservableValue name; + ObservableValue graphic; + + @Override + public CheckBox createSimple() { + var s = new CheckBox(); + s.setOnAction(event -> event.consume()); + s.setAlignment(Pos.CENTER); + s.getStyleClass().add("check-box-comp"); + s.setSelected(selected.getValue() != null ? selected.getValue() : false); + s.selectedProperty().addListener((observable, oldValue, newValue) -> { + selected.setValue(newValue); + }); + selected.addListener((observable, oldValue, newValue) -> { + PlatformThread.runLaterIfNeeded(() -> { + s.setSelected(newValue); + }); + }); + if (name != null) { + name.subscribe(value -> { + PlatformThread.runLaterIfNeeded(() -> { + s.setText(value); + }); + }); + } + if (graphic != null) { + graphic.subscribe(value -> { + PlatformThread.runLaterIfNeeded(() -> { + s.setGraphic(value.createGraphicNode()); + }); + }); + s.setAlignment(Pos.CENTER); + s.pseudoClassStateChanged(PseudoClass.getPseudoClass("has-graphic"), true); + } + return s; + } +} diff --git a/app/src/main/java/io/xpipe/app/comp/base/ToggleSwitchComp.java b/app/src/main/java/io/xpipe/app/comp/base/ToggleSwitchComp.java index d4140128c..1fca74bc2 100644 --- a/app/src/main/java/io/xpipe/app/comp/base/ToggleSwitchComp.java +++ b/app/src/main/java/io/xpipe/app/comp/base/ToggleSwitchComp.java @@ -73,14 +73,6 @@ public class ToggleSwitchComp extends RegionBuilder { s.setAlignment(Pos.CENTER); s.pseudoClassStateChanged(PseudoClass.getPseudoClass("has-graphic"), true); } - - s.setOnKeyPressed(keyEvent -> { - if (keyEvent.getCode() == KeyCode.SPACE || keyEvent.getCode() == KeyCode.ENTER) { - s.setSelected(!s.isSelected()); - keyEvent.consume(); - } - }); - return s; } } 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 f6edfd8fa..c0c5eba56 100644 --- a/app/src/main/java/io/xpipe/app/ext/GuiDialog.java +++ b/app/src/main/java/io/xpipe/app/ext/GuiDialog.java @@ -2,15 +2,18 @@ package io.xpipe.app.ext; import io.xpipe.app.platform.OptionsBuilder; +import io.xpipe.app.storage.DataStoreEntry; import lombok.AllArgsConstructor; import lombok.Value; +import java.util.function.Consumer; + @Value @AllArgsConstructor public class GuiDialog { OptionsBuilder options; - Runnable onFinish; + Consumer onFinish; public GuiDialog(OptionsBuilder options) { this.options = 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 8e8c7c4bf..5c726417c 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 @@ -82,7 +82,7 @@ public class StoreCreationComp extends ModalOverlayContentComp { model.getFinished().addListener((observable, oldValue, newValue) -> { if (newValue && d.equals(activeDialog.get())) { ThreadHelper.runAsync(() -> { - d.getOnFinish().run(); + d.getOnFinish().accept(model.getEntry().getValue()); }); } }); diff --git a/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptStoreProvider.java b/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptStoreProvider.java index 3e8b72399..2e2353372 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptStoreProvider.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptStoreProvider.java @@ -1,6 +1,8 @@ package io.xpipe.ext.base.script; import io.xpipe.app.comp.BaseRegionBuilder; +import io.xpipe.app.comp.RegionBuilder; +import io.xpipe.app.comp.base.CheckBoxComp; import io.xpipe.app.comp.base.ListSelectorComp; import io.xpipe.app.core.AppI18n; import io.xpipe.app.ext.*; @@ -19,6 +21,7 @@ import javafx.beans.property.*; import javafx.beans.value.ObservableValue; import javafx.collections.FXCollections; +import javafx.scene.control.CheckBox; import lombok.SneakyThrows; import java.util.ArrayList; @@ -42,13 +45,15 @@ public class ScriptStoreProvider implements DataStoreProvider { enabled.set(s.isEnabled()); }); - var toggle = StoreToggleComp.>enableToggle( - null, sec, enabled, (s, aBoolean) -> { - var state = s.getState().toBuilder().enabled(aBoolean).build(); - s.setState(state); - }); + var checkbox = new CheckBoxComp(enabled, null, null); + checkbox.describe(d -> d.nameKey("enabled")); + enabled.addListener((observable, oldValue, newValue) -> { + ScriptStore st = sec.getWrapper().getEntry().getStore().asNeeded(); + var state = st.getState().toBuilder().enabled(newValue).build(); + st.setState(state); + }); - return StoreEntryComp.create(sec, toggle, preferLarge); + return StoreEntryComp.create(sec, checkbox, preferLarge); } @Override @@ -135,7 +140,7 @@ public class ScriptStoreProvider implements DataStoreProvider { var selectorComp = new ListSelectorComp<>( FXCollections.observableList(vals), name, ignored -> null, selectedExecTypes, v -> false, () -> false); - return new OptionsBuilder() + return new GuiDialog(new OptionsBuilder() .nameAndDescription("scriptSourceType") .sub(textSourceChoice.build(), textSource) .nameAndDescription("executionType") @@ -165,8 +170,12 @@ public class ScriptStoreProvider implements DataStoreProvider { .shellScript(selectedExecTypes.contains(3)) .build(); }, - store) - .buildDialog(); + store), (finished) -> { + if (entry == null) { + finished.setStorePersistentState(EnabledStoreState.builder().enabled(true).build()); + } + + }); } @Override