From 2f54a794072183fa07a41ea0a6995147f38d78ff Mon Sep 17 00:00:00 2001 From: Christopher Schnick Date: Sat, 7 Jan 2023 22:19:54 +0100 Subject: [PATCH] Various small improvements --- .../extension/DataStoreActionProvider.java | 4 +++ .../io/xpipe/extension/DataStoreProvider.java | 2 +- .../fxcomps/impl/ShellStoreChoiceComp.java | 35 +++---------------- .../extension/util/CustomComboBoxBuilder.java | 11 ++++-- .../resources/lang/translations_en.properties | 1 + 5 files changed, 19 insertions(+), 34 deletions(-) diff --git a/extension/src/main/java/io/xpipe/extension/DataStoreActionProvider.java b/extension/src/main/java/io/xpipe/extension/DataStoreActionProvider.java index b656c0b5..40e6adc4 100644 --- a/extension/src/main/java/io/xpipe/extension/DataStoreActionProvider.java +++ b/extension/src/main/java/io/xpipe/extension/DataStoreActionProvider.java @@ -52,4 +52,8 @@ public interface DataStoreActionProvider { default void execute(T store) throws Exception { } + + default boolean showIfDisabled() { + return true; + } } diff --git a/extension/src/main/java/io/xpipe/extension/DataStoreProvider.java b/extension/src/main/java/io/xpipe/extension/DataStoreProvider.java index e97f18a9..f1f1f4eb 100644 --- a/extension/src/main/java/io/xpipe/extension/DataStoreProvider.java +++ b/extension/src/main/java/io/xpipe/extension/DataStoreProvider.java @@ -40,7 +40,7 @@ public interface DataStoreProvider { } default GuiDialog guiDialog(Property store) { - throw new ExtensionException("Gui Dialog is not implemented by provider " + getId()); + return null; } default boolean init() throws Exception { diff --git a/extension/src/main/java/io/xpipe/extension/fxcomps/impl/ShellStoreChoiceComp.java b/extension/src/main/java/io/xpipe/extension/fxcomps/impl/ShellStoreChoiceComp.java index 39387b53..66f403bb 100644 --- a/extension/src/main/java/io/xpipe/extension/fxcomps/impl/ShellStoreChoiceComp.java +++ b/extension/src/main/java/io/xpipe/extension/fxcomps/impl/ShellStoreChoiceComp.java @@ -3,7 +3,6 @@ package io.xpipe.extension.fxcomps.impl; import io.xpipe.core.store.ShellStore; import io.xpipe.extension.DataStoreProviders; import io.xpipe.extension.I18n; -import io.xpipe.extension.event.ErrorEvent; import io.xpipe.extension.fxcomps.SimpleComp; import io.xpipe.extension.util.CustomComboBoxBuilder; import io.xpipe.extension.util.XPipeDaemon; @@ -37,7 +36,7 @@ public class ShellStoreChoiceComp extends SimpleComp { .filter(e -> e.equals(s)) .findAny() .flatMap(store -> XPipeDaemon.getInstance().getStoreName(store)) - .orElse("?"); + .orElse(I18n.get("unknown")); return new Label(name, imgView); } @@ -45,41 +44,15 @@ public class ShellStoreChoiceComp extends SimpleComp { @Override @SuppressWarnings("unchecked") protected Region createSimple() { - var comboBox = new CustomComboBoxBuilder(selected, this::createGraphic, null, n -> { - if (n != null) { - try { - n.checkComplete(); - // n.test(); - } catch (Exception ex) { - var name = XPipeDaemon.getInstance().getNamedStores().stream() - .filter(e -> e.equals(n)) - .findAny() - .flatMap(store -> XPipeDaemon.getInstance().getStoreName(store)) - .orElse("?"); - ErrorEvent.fromMessage(I18n.get("extension.namedHostNotActive", name)) - .reportable(false) - .handle(); - return false; - } - } - - // if (n != null && !supportCheck.test(n)) { - // var name = XPipeDaemon.getInstance().getNamedStores().stream() - // .filter(e -> e.equals(n)).findAny() - // .flatMap(store -> - // XPipeDaemon.getInstance().getStoreName(store)).orElse(I18n.get("localMachine")); - // ErrorEvent.fromMessage(I18n.get("extension.namedHostFeatureUnsupported", - // name)).reportable(false).handle(); - // return false; - // } - return true; - }); + var comboBox = new CustomComboBoxBuilder(selected, this::createGraphic, new Label(I18n.get("none")), n -> true); + comboBox.setUnknownNode(t -> createGraphic(t)); var available = XPipeDaemon.getInstance().getNamedStores().stream() .filter(s -> s != self) .filter(s -> storeClass.isAssignableFrom(s.getClass()) && applicableCheck.test((T) s)) .map(s -> (ShellStore) s) .toList(); + available.forEach(s -> comboBox.add((T) s)); ComboBox cb = comboBox.build(); cb.getStyleClass().add("choice-comp"); diff --git a/extension/src/main/java/io/xpipe/extension/util/CustomComboBoxBuilder.java b/extension/src/main/java/io/xpipe/extension/util/CustomComboBoxBuilder.java index 1a6f2914..1ec0baf5 100644 --- a/extension/src/main/java/io/xpipe/extension/util/CustomComboBoxBuilder.java +++ b/extension/src/main/java/io/xpipe/extension/util/CustomComboBoxBuilder.java @@ -35,6 +35,7 @@ public class CustomComboBoxBuilder { private final List filterable = new ArrayList<>(); private BiPredicate filterPredicate; private Node filterNode; + private Function unknownNode; public CustomComboBoxBuilder( Property selected, Function nodeFunction, Node emptyNode, Predicate veto @@ -50,6 +51,10 @@ public class CustomComboBoxBuilder { actionsMap.put(node, run); } + public void setUnknownNode(Function node) { + unknownNode = node; + } + public Node add(T val) { var node = nodeFunction.apply(val); nodeMap.put(node, val); @@ -101,8 +106,8 @@ public class CustomComboBoxBuilder { .filter(e -> Objects.equals(c, e.getValue())) .map(e -> e.getKey()) .findAny() - .orElse(null); - cb.setValue(Optional.ofNullable(item).orElse(emptyNode)); + .orElse(c == null || unknownNode == null? emptyNode : unknownNode.apply(c)); + cb.setValue(item); }); cb.valueProperty().addListener((c, o, n) -> { if (nodeMap.containsKey(n)) { @@ -161,7 +166,9 @@ public class CustomComboBoxBuilder { return; } + // Case for dynamically created unknown nodes if (!nodeMap.containsKey(item)) { + setGraphic(item); return; } diff --git a/extension/src/main/resources/io/xpipe/extension/resources/lang/translations_en.properties b/extension/src/main/resources/io/xpipe/extension/resources/lang/translations_en.properties index 58fe26ee..49abce35 100644 --- a/extension/src/main/resources/io/xpipe/extension/resources/lang/translations_en.properties +++ b/extension/src/main/resources/io/xpipe/extension/resources/lang/translations_en.properties @@ -10,6 +10,7 @@ mustNotBeEmpty=$NAME$ must not be empty null=$VALUE$ must be not null hostFeatureUnsupported=Host does not support the feature $FEATURE$ missingStore=$NAME$ does not exist +unknown=Unknown namedHostFeatureUnsupported=$HOST$ does not support this feature namedHostNotActive=$HOST$ is not active noInformationAvailable=No information available