diff --git a/app/src/main/java/io/xpipe/app/util/DataStoreFormatter.java b/app/src/main/java/io/xpipe/app/util/DataStoreFormatter.java index cbf9d0103..f4f94aed1 100644 --- a/app/src/main/java/io/xpipe/app/util/DataStoreFormatter.java +++ b/app/src/main/java/io/xpipe/app/util/DataStoreFormatter.java @@ -17,45 +17,6 @@ public class DataStoreFormatter { return String.join(" ", Arrays.stream(elements).filter(s -> s != null).toList()); } - public static String formattedOsName(String osName) { - osName = osName.replaceAll("^Microsoft ", ""); - - var proRequired = !LicenseProvider.get().checkOsName(osName); - if (!proRequired) { - return osName; - } - - return "[Pro] " + osName; - } - - public static ObservableValue shellInformation(StoreEntryWrapper w) { - return BindingsHelper.map(w.getPersistentState(), o -> { - if (o instanceof ShellStoreState s) { - if (s.getRunning() == null) { - return null; - } - - if (s.getShellDialect() != null - && !s.getShellDialect().getDumbMode().supportsAnyPossibleInteraction()) { - if (s.getOsName() != null) { - return formattedOsName(s.getOsName()); - } - - if (s.getShellDialect().equals(ShellDialects.NO_INTERACTION)) { - return null; - } - - return s.getShellDialect().getDisplayName(); - } - - var prefix = s.getTtyState() != null && s.getTtyState() != ShellTtyState.NONE ? "[PTY] " : ""; - return s.isRunning() ? prefix + formattedOsName(s.getOsName()) : "Connection failed"; - } - - return "?"; - }); - } - public static String capitalize(String name) { if (name == null) { return null; diff --git a/app/src/main/java/io/xpipe/app/util/LicenseProvider.java b/app/src/main/java/io/xpipe/app/util/LicenseProvider.java index 78a2cae4f..80f3e2865 100644 --- a/app/src/main/java/io/xpipe/app/util/LicenseProvider.java +++ b/app/src/main/java/io/xpipe/app/util/LicenseProvider.java @@ -24,7 +24,7 @@ public abstract class LicenseProvider { public abstract LicensedFeature getFeature(String id); - public abstract boolean checkOsName(String name); + public abstract LicensedFeature checkOsName(String name); public abstract void checkOsNameOrThrow(String s); diff --git a/app/src/main/java/io/xpipe/app/util/ShellStoreFormat.java b/app/src/main/java/io/xpipe/app/util/ShellStoreFormat.java new file mode 100644 index 000000000..7499ae766 --- /dev/null +++ b/app/src/main/java/io/xpipe/app/util/ShellStoreFormat.java @@ -0,0 +1,76 @@ +package io.xpipe.app.util; + +import io.xpipe.app.comp.store.StoreSection; +import io.xpipe.app.core.AppI18n; +import io.xpipe.app.fxcomps.util.BindingsHelper; +import io.xpipe.app.prefs.AppPrefs; +import io.xpipe.core.process.ShellDialects; +import io.xpipe.core.process.ShellEnvironmentStoreState; +import io.xpipe.core.process.ShellStoreState; +import io.xpipe.core.process.ShellTtyState; +import javafx.beans.binding.Bindings; +import javafx.beans.value.ObservableValue; +import lombok.Value; + +import java.util.Arrays; +import java.util.function.Function; +import java.util.stream.Collectors; + +@Value +public class ShellStoreFormat { + + public static ObservableValue shellEnvironment(StoreSection section, boolean includeOsName) { + return Bindings.createStringBinding( + () -> { + var s = (ShellEnvironmentStoreState) + section.getWrapper().getPersistentState().getValue(); + var def = Boolean.TRUE.equals(s.getSetDefault()) ? AppI18n.get("default") : null; + var name = DataStoreFormatter.join((includeOsName ? s.getOsName() : null), s.getShellName()); + return new ShellStoreFormat(null,name, new String[]{def}).format(); + }, + AppPrefs.get().language(), + section.getWrapper().getPersistentState()); + } + + @SuppressWarnings("unchecked") + public static ObservableValue shellStore(StoreSection section, Function f) { + return BindingsHelper.map(section.getWrapper().getPersistentState(), o -> { + var s = (T) o; + var info = f.apply(s); + if (s.getShellDialect() != null + && !s.getShellDialect().getDumbMode().supportsAnyPossibleInteraction()) { + if (s.getOsName() != null) { + return new ShellStoreFormat(LicenseProvider.get().checkOsName(s.getOsName()), s.getOsName(), new String[]{info}).format(); + } + + if (s.getShellDialect().equals(ShellDialects.NO_INTERACTION)) { + return new ShellStoreFormat(null, null, new String[]{info}).format(); + } + + return new ShellStoreFormat(LicenseProvider.get().getFeature(s.getShellDialect().getLicenseFeatureId()), s.getShellDialect().getDisplayName(), new String[]{info}).format(); + } + + return new ShellStoreFormat(LicenseProvider.get().checkOsName(s.getOsName()), s.getOsName(), + new String[]{s.getTtyState() != null && s.getTtyState() != ShellTtyState.NONE ? "TTY" : null, info}).format(); + }); + } + + LicensedFeature licensedFeature; + String name; + String[] states; + + public String format() { + var lic = licensedFeature != null ? "[" + licensedFeature.getDescriptionSuffix().orElse(null) + "]" : null; + var name = this.name; + var state = getStates() != null ? Arrays.stream(getStates()).filter(s -> s != null).map(s -> "[" + s + "]").collect(Collectors.joining(" ")) : null; + if (state != null && state.isEmpty()) { + state = null; + } + return DataStoreFormatter.join(lic, state, name); + } + + public static String formattedOsName(String osName) { + osName = osName.replaceAll("^Microsoft ", ""); + return osName; + } +} diff --git a/ext/base/src/main/java/io/xpipe/ext/base/store/ShellStoreProvider.java b/ext/base/src/main/java/io/xpipe/ext/base/store/ShellStoreProvider.java index 23cf94d5c..95fd851be 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/store/ShellStoreProvider.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/store/ShellStoreProvider.java @@ -15,6 +15,7 @@ import io.xpipe.app.resources.SystemIcons; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntry; import io.xpipe.app.util.DataStoreFormatter; +import io.xpipe.app.util.ShellStoreFormat; import io.xpipe.app.util.TerminalLauncher; import io.xpipe.core.process.ShellStoreState; import io.xpipe.ext.base.script.ScriptStore; @@ -72,6 +73,6 @@ public interface ShellStoreProvider extends DataStoreProvider { @Override default ObservableValue informationString(StoreSection section) { - return DataStoreFormatter.shellInformation(section.getWrapper()); + return ShellStoreFormat.shellStore(section,state -> null); } }