From c790870ae626db56c9e947bd8fc264246acb0041 Mon Sep 17 00:00:00 2001 From: crschnick Date: Fri, 22 Dec 2023 23:31:48 +0000 Subject: [PATCH] Rework insights popup --- app/build.gradle | 1 + .../app/comp/store/GuiDsStoreCreator.java | 7 +-- .../io/xpipe/app/ext/DataStoreProvider.java | 2 +- .../xpipe/app/fxcomps/impl/OptionsComp.java | 5 +- .../io/xpipe/app/util/MarkdownBuilder.java | 50 ++++++++++++++++++ app/src/main/java/module-info.java | 1 + .../resources/web/github-markdown-dark.css | 2 +- dist/licenses/javamarkdowngenerator.license | 21 ++++++++ .../licenses/javamarkdowngenerator.properties | 4 ++ .../script/SimpleScriptStoreProvider.java | 21 ++++++++ .../markdowngenerator-1.3.1.1.jar | Bin 0 -> 37018 bytes .../gradle_scripts/markdowngenerator.gradle | 31 +++++++++++ 12 files changed, 139 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/io/xpipe/app/util/MarkdownBuilder.java create mode 100644 dist/licenses/javamarkdowngenerator.license create mode 100644 dist/licenses/javamarkdowngenerator.properties create mode 100644 gradle/gradle_scripts/markdowngenerator-1.3.1.1.jar create mode 100644 gradle/gradle_scripts/markdowngenerator.gradle diff --git a/app/build.gradle b/app/build.gradle index 4b59f098f..451c317dd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -22,6 +22,7 @@ apply from: "$projectDir/gradle_scripts/github-api.gradle" apply from: "$projectDir/gradle_scripts/flexmark.gradle" apply from: "$rootDir/gradle/gradle_scripts/picocli.gradle" apply from: "$rootDir/gradle/gradle_scripts/versioncompare.gradle" +apply from: "$rootDir/gradle/gradle_scripts/markdowngenerator.gradle" configurations { implementation.extendsFrom(dep) diff --git a/app/src/main/java/io/xpipe/app/comp/store/GuiDsStoreCreator.java b/app/src/main/java/io/xpipe/app/comp/store/GuiDsStoreCreator.java index 82cda7ce4..4058cf8e4 100644 --- a/app/src/main/java/io/xpipe/app/comp/store/GuiDsStoreCreator.java +++ b/app/src/main/java/io/xpipe/app/comp/store/GuiDsStoreCreator.java @@ -212,7 +212,8 @@ public class GuiDsStoreCreator extends MultiStepComp.Step> { () -> { return provider.getValue() == null || store.getValue() == null - || !store.getValue().isComplete(); + || !store.getValue().isComplete() + || provider.getValue().createInsightsMarkdown(store.getValue()) == null; }, provider, store); @@ -225,8 +226,8 @@ public class GuiDsStoreCreator extends MultiStepComp.Step> { .createRegion() : null; }), - true) - .disable(disable) + true) + .hide(disable) .styleClass("button-comp"); } diff --git a/app/src/main/java/io/xpipe/app/ext/DataStoreProvider.java b/app/src/main/java/io/xpipe/app/ext/DataStoreProvider.java index 951864dd8..452a0f4d1 100644 --- a/app/src/main/java/io/xpipe/app/ext/DataStoreProvider.java +++ b/app/src/main/java/io/xpipe/app/ext/DataStoreProvider.java @@ -85,7 +85,7 @@ public interface DataStoreProvider { return null; } - return createInsightsMarkdown(store.getValue()); + return "## Insights\n\n" + createInsightsMarkdown(store.getValue()); }, store); return new MarkdownComp(content, s -> s) diff --git a/app/src/main/java/io/xpipe/app/fxcomps/impl/OptionsComp.java b/app/src/main/java/io/xpipe/app/fxcomps/impl/OptionsComp.java index 5f12cc7d7..2e626aef1 100644 --- a/app/src/main/java/io/xpipe/app/fxcomps/impl/OptionsComp.java +++ b/app/src/main/java/io/xpipe/app/fxcomps/impl/OptionsComp.java @@ -104,7 +104,10 @@ public class OptionsComp extends Comp> { extendedDescription.getStyleClass().add("long-description"); extendedDescription.setAccessibleText("Help"); AppFont.header(extendedDescription); - extendedDescription.setOnAction(e -> popover.show(extendedDescription)); + extendedDescription.setOnAction(e -> { + popover.show(extendedDescription); + e.consume(); + }); var descriptionBox = new HBox(description, new Spacer(Orientation.HORIZONTAL), extendedDescription); descriptionBox.setSpacing(5); diff --git a/app/src/main/java/io/xpipe/app/util/MarkdownBuilder.java b/app/src/main/java/io/xpipe/app/util/MarkdownBuilder.java new file mode 100644 index 000000000..474314c0c --- /dev/null +++ b/app/src/main/java/io/xpipe/app/util/MarkdownBuilder.java @@ -0,0 +1,50 @@ +package io.xpipe.app.util; + +import net.steppschuh.markdowngenerator.MarkdownElement; +import net.steppschuh.markdowngenerator.text.code.Code; +import net.steppschuh.markdowngenerator.text.code.CodeBlock; + +public class MarkdownBuilder { + + public static MarkdownBuilder of() { + return new MarkdownBuilder(); + } + + private final StringBuilder builder = new StringBuilder(); + + private MarkdownBuilder() {} + + public MarkdownBuilder add(String t) { + builder.append(t); + return this; + } + + public MarkdownBuilder line() { + builder.append("\n"); + return this; + } + + public MarkdownBuilder addCode(String s) { + builder.append(new Code(s).getSerialized("")); + return this; + } + + public MarkdownBuilder addCodeBlock(String s) { + builder.append("\n\n").append(new CodeBlock(s).getSerialized("")); + return this; + } + + public MarkdownBuilder addLine(MarkdownElement t) { + builder.append(t.getSerialized("")).append("\n"); + return this; + } + + public MarkdownBuilder addParagraph(String s) { + builder.append("\n\n").append(s); + return this; + } + + public String build() { + return builder.toString(); + } +} diff --git a/app/src/main/java/module-info.java b/app/src/main/java/module-info.java index fb1d763b5..8c0d9e470 100644 --- a/app/src/main/java/module-info.java +++ b/app/src/main/java/module-info.java @@ -83,6 +83,7 @@ open module io.xpipe.app { requires jdk.management.agent; requires com.jthemedetector; requires versioncompare; + requires net.steppschuh.markdowngenerator; // Required by extensions requires java.security.jgss; diff --git a/app/src/main/resources/io/xpipe/app/resources/web/github-markdown-dark.css b/app/src/main/resources/io/xpipe/app/resources/web/github-markdown-dark.css index de1172011..7573083e7 100644 --- a/app/src/main/resources/io/xpipe/app/resources/web/github-markdown-dark.css +++ b/app/src/main/resources/io/xpipe/app/resources/web/github-markdown-dark.css @@ -7,7 +7,7 @@ html { -ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%; margin: 0; - padding: 1em; + padding: 0 1em 1em 1em; color: #c9d1d9; font-family: -apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"; font-size: 14px; diff --git a/dist/licenses/javamarkdowngenerator.license b/dist/licenses/javamarkdowngenerator.license new file mode 100644 index 000000000..3ec372d21 --- /dev/null +++ b/dist/licenses/javamarkdowngenerator.license @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2016 Stephan Schultz + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/dist/licenses/javamarkdowngenerator.properties b/dist/licenses/javamarkdowngenerator.properties new file mode 100644 index 000000000..531ff3156 --- /dev/null +++ b/dist/licenses/javamarkdowngenerator.properties @@ -0,0 +1,4 @@ +name=Java-Markdown-Generator +version=1.3.1.1 +license=MIT License +link=https://github.com/Steppschuh/Java-Markdown-Generator \ No newline at end of file diff --git a/ext/base/src/main/java/io/xpipe/ext/base/script/SimpleScriptStoreProvider.java b/ext/base/src/main/java/io/xpipe/ext/base/script/SimpleScriptStoreProvider.java index bd4af43a3..52003e74f 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/script/SimpleScriptStoreProvider.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/script/SimpleScriptStoreProvider.java @@ -17,6 +17,7 @@ import io.xpipe.app.fxcomps.impl.DataStoreListChoiceComp; import io.xpipe.app.fxcomps.util.BindingsHelper; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntry; +import io.xpipe.app.util.MarkdownBuilder; import io.xpipe.app.util.OptionsBuilder; import io.xpipe.core.process.ShellDialect; import io.xpipe.core.store.DataStore; @@ -34,9 +35,29 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.UUID; +import java.util.stream.Collectors; public class SimpleScriptStoreProvider implements DataStoreProvider { + public String createInsightsMarkdown(DataStore store) { + var s = (SimpleScriptStore) store; + + var builder = MarkdownBuilder.of().addParagraph("XPipe will run the script in ") + .addCode(s.getMinimumDialect() != null ? s.getMinimumDialect().getDisplayName() : "default").add(" shells"); + + if (s.getEffectiveScripts() != null && !s.getEffectiveScripts().isEmpty()) { + builder.add(" with the following scripts prior").addCodeBlock(s.getEffectiveScripts().stream() + .map(scriptStoreDataStoreEntryRef -> scriptStoreDataStoreEntryRef.get().getName()).collect( + Collectors.joining("\n"))); + } + + if (s.getCommands() != null) { + builder.addParagraph("with command contents").addCodeBlock(s.getCommands()); + } + + return builder.build(); + } + @Override public Comp stateDisplay(StoreEntryWrapper w) { return new SystemStateComp(new SimpleObjectProperty<>(SystemStateComp.State.SUCCESS)); diff --git a/gradle/gradle_scripts/markdowngenerator-1.3.1.1.jar b/gradle/gradle_scripts/markdowngenerator-1.3.1.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..c3fcb282d24229daf7355ffeb2e6f0a5d47a1ea5 GIT binary patch literal 37018 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�{YZW`<5#2=P!`aTSie}jfv!RKWBDzp%fIh2&}cEgX!?ZyCz}7< zBG4cwzo@)L?m_i)uKV}xxC8t5@2j-bJ;1-;AA*_y)C2!lg`@6`d3PuI+kFiv$=@q} z=d=8y+%37CviGg{53gfTWKa+0pV-;Hh;o01{5OAQP!dqj&|f5YivI)2y}Rnp+3rWV z>ne7Y`*QtsmIG}EsO#NN^lV?hKgRye5f7B;4*2Jbdgm4Mquez@N%Ovq_^t*91qStz z`3arvoBC(Ke>npD`;i9fV(^QnTj!4&@E6a2H9DwX`WKyr!5`E8`xf0n{xr#*82CrI zGs%wOeJTD@C4!m-R2uvfKHHbq=#RmF7Yc(?fvR19QB4~EG1Wh{ub_0G^37j#&Zd7% z_aDTZpq!v$#9y3P=6}xlPiZ13AE>vM}5GlKqnSfTDw{DSn|lIot#N=kDUa&PAYSw7)o> dKm7xa-%f0mWFevMaM*x