Rework script handling for enabled state

This commit is contained in:
crschnick
2026-04-16 21:20:54 +00:00
parent e2a77bc594
commit 7be3a3712a
5 changed files with 84 additions and 19 deletions
@@ -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<CheckBox> {
Property<Boolean> selected;
ObservableValue<String> name;
ObservableValue<LabelGraphic> 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;
}
}
@@ -73,14 +73,6 @@ public class ToggleSwitchComp extends RegionBuilder<ToggleSwitch> {
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;
}
}
@@ -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<DataStoreEntry> onFinish;
public GuiDialog(OptionsBuilder options) {
this.options = options;
@@ -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());
});
}
});
@@ -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.<StatefulDataStore<EnabledStoreState>>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