From 830d62db6ca06f5126c4e0a1252cd288cb1fa22e Mon Sep 17 00:00:00 2001 From: crschnick Date: Thu, 11 Jan 2024 14:55:09 +0000 Subject: [PATCH] [stage] --- README.md | 1 - .../xpipe/app/browser/BrowserWelcomeComp.java | 2 +- .../xpipe/app/browser/FileSystemHelper.java | 2 +- .../app/browser/OpenFileSystemModel.java | 3 - .../xpipe/app/browser/action/LeafAction.java | 4 - .../io/xpipe/app/comp/base/OsLogoComp.java | 7 +- .../app/comp/store/DenseStoreEntryComp.java | 2 +- ...mp.java => DsStoreProviderChoiceComp.java} | 55 ++-- .../app/comp/store/GuiDsStoreCreator.java | 2 +- .../comp/store/StandardStoreEntryComp.java | 2 +- .../app/comp/store/StoreCreationMenu.java | 135 +++++---- .../xpipe/app/comp/store/StoreEntryComp.java | 2 +- .../main/java/io/xpipe/app/core/AppTheme.java | 4 - .../io/xpipe/app/core/AppWindowHelper.java | 5 - .../io/xpipe/app/ext/DataStoreProviders.java | 2 + .../app/fxcomps/impl/CharsetChoiceComp.java | 46 +++ .../app/fxcomps/impl/DataStoreChoiceComp.java | 25 +- ...Comp.java => FileReferenceChoiceComp.java} | 25 +- .../impl/FileSystemStoreChoiceComp.java | 53 ++++ .../app/fxcomps/impl/PrettyImageComp.java | 2 - .../app/fxcomps/impl/PrettyImageHelper.java | 38 +-- .../xpipe/app/fxcomps/impl/TextAreaComp.java | 34 +-- .../app/fxcomps/util/BindingsHelper.java | 6 +- .../xpipe/app/issue/SentryErrorHandler.java | 2 +- .../app/storage/ContextualFileReference.java | 19 -- .../xpipe/app/util/CustomComboBoxBuilder.java | 266 ++++++++++++++++++ .../io/xpipe/app/resources/img/os/alma-24.png | Bin 1222 -> 0 bytes .../xpipe/app/resources/img/os/alpine-24.png | Bin 872 -> 0 bytes .../img/os/{alpine.svg => alpine-color.svg} | 0 .../xpipe/app/resources/img/os/amazon-24.png | Bin 708 -> 0 bytes .../img/os/{amazon.svg => amazon-color.svg} | 0 .../io/xpipe/app/resources/img/os/arch-24.png | Bin 750 -> 0 bytes .../img/os/{arch.svg => arch-color.svg} | 0 .../xpipe/app/resources/img/os/centos-24.png | Bin 1162 -> 0 bytes .../img/os/{centos.svg => centos-color.svg} | 0 .../xpipe/app/resources/img/os/debian-24.png | Bin 1014 -> 0 bytes .../img/os/{debian.svg => debian-color.svg} | 0 .../resources/img/os/elementary-24-dark.png | Bin 623 -> 0 bytes .../app/resources/img/os/elementary-24.png | Bin 575 -> 0 bytes .../resources/img/os/endeavour-24-dark.png | Bin 915 -> 0 bytes .../app/resources/img/os/endeavour-24.png | Bin 958 -> 0 bytes .../xpipe/app/resources/img/os/fedora-24.png | Bin 925 -> 0 bytes .../img/os/{fedora.svg => fedora-color.svg} | 0 .../xpipe/app/resources/img/os/freebsd-24.png | Bin 749 -> 0 bytes .../img/os/{freebsd.svg => freebsd-color.svg} | 0 .../xpipe/app/resources/img/os/garuda-24.png | Bin 1036 -> 0 bytes .../xpipe/app/resources/img/os/gentoo-24.png | Bin 1090 -> 0 bytes .../img/os/{gentoo.svg => gentoo-color.svg} | 0 .../io/xpipe/app/resources/img/os/kali-24.png | Bin 730 -> 0 bytes .../img/os/{kali.svg => kali-color.svg} | 0 .../xpipe/app/resources/img/os/kubuntu-24.png | Bin 1051 -> 0 bytes .../img/os/{kubuntu.svg => kubuntu-color.svg} | 0 .../xpipe/app/resources/img/os/linux-24.png | Bin 941 -> 0 bytes .../app/resources/img/os/macos-24-dark.png | Bin 466 -> 0 bytes .../xpipe/app/resources/img/os/macos-24.png | Bin 434 -> 0 bytes .../xpipe/app/resources/img/os/manjaro-24.png | Bin 238 -> 0 bytes .../img/os/{manjaro.svg => manjaro-color.svg} | 0 .../io/xpipe/app/resources/img/os/mint-24.png | Bin 801 -> 0 bytes .../img/os/{mint.svg => mint-color.svg} | 0 .../xpipe/app/resources/img/os/netbsd-24.png | Bin 715 -> 0 bytes .../img/os/{netbsd.svg => netbsd-color.svg} | 0 .../xpipe/app/resources/img/os/nixos-24.png | Bin 1098 -> 0 bytes .../img/os/{nixos.svg => nixos-color.svg} | 0 .../xpipe/app/resources/img/os/openbsd-24.png | Bin 1364 -> 0 bytes .../img/os/{openbsd.svg => openbsd-color.svg} | 0 .../io/xpipe/app/resources/img/os/pop-24.png | Bin 686 -> 0 bytes .../img/os/{pop.svg => pop-color.svg} | 0 .../xpipe/app/resources/img/os/redhat-24.png | Bin 594 -> 0 bytes .../img/os/{redhat.svg => redhat-color.svg} | 0 .../xpipe/app/resources/img/os/rocky-24.png | Bin 683 -> 0 bytes .../img/os/{rocky.svg => rocky-color.svg} | 0 .../io/xpipe/app/resources/img/os/suse-24.png | Bin 1092 -> 0 bytes .../img/os/{suse.svg => suse-color.svg} | 0 .../xpipe/app/resources/img/os/ubuntu-24.png | Bin 1023 -> 0 bytes .../img/os/{ubuntu.svg => ubuntu-color.svg} | 0 .../xpipe/app/resources/img/os/windows-24.png | Bin 202 -> 0 bytes .../img/os/{windows.svg => windows-color.svg} | 0 .../xpipe/app/resources/img/os/zorin-24.png | Bin 662 -> 0 bytes .../img/os/{zorin.svg => zorin-color.svg} | 0 .../io/xpipe/app/resources/style/browser.css | 4 - .../java/io/xpipe/core/process/OsType.java | 4 +- .../io/xpipe/core/process/ProcessControl.java | 4 +- .../io/xpipe/core/process/ShellControl.java | 2 - .../io/xpipe/core/process/ShellDialects.java | 5 +- dist/changelogs/1.7.14.md | 3 + ext/base/src/main/java/module-info.java | 2 +- .../ext/base/resources/img/binary_icon.png | Bin 0 -> 4094 bytes .../ext/base/resources/img/file_icon.png | Bin 0 -> 3681 bytes .../base/resources/img/httpRequest_icon.png | Bin 0 -> 17825 bytes .../ext/base/resources/img/http_icon.png | Bin 0 -> 17825 bytes .../ext/base/resources/img/inMemory_icon.png | Bin 0 -> 11312 bytes .../resources/img/internalStream_icon.png | Bin 0 -> 4751 bytes .../ext/base/resources/img/sinkDrain_icon.png | Bin 0 -> 34044 bytes .../ext/base/resources/img/text_icon.png | Bin 0 -> 14686 bytes .../ext/base/resources/img/xpbs_icon.png | Bin 0 -> 4751 bytes .../ext/base/resources/img/xpbt_icon.png | Bin 0 -> 4751 bytes version | 2 +- 97 files changed, 538 insertions(+), 232 deletions(-) rename app/src/main/java/io/xpipe/app/comp/store/{DataStoreProviderChoiceComp.java => DsStoreProviderChoiceComp.java} (52%) create mode 100644 app/src/main/java/io/xpipe/app/fxcomps/impl/CharsetChoiceComp.java rename app/src/main/java/io/xpipe/app/fxcomps/impl/{ContextualFileReferenceChoiceComp.java => FileReferenceChoiceComp.java} (63%) create mode 100644 app/src/main/java/io/xpipe/app/fxcomps/impl/FileSystemStoreChoiceComp.java create mode 100644 app/src/main/java/io/xpipe/app/util/CustomComboBoxBuilder.java delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/os/alma-24.png delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/os/alpine-24.png rename app/src/main/resources/io/xpipe/app/resources/img/os/{alpine.svg => alpine-color.svg} (100%) delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/os/amazon-24.png rename app/src/main/resources/io/xpipe/app/resources/img/os/{amazon.svg => amazon-color.svg} (100%) delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/os/arch-24.png rename app/src/main/resources/io/xpipe/app/resources/img/os/{arch.svg => arch-color.svg} (100%) delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/os/centos-24.png rename app/src/main/resources/io/xpipe/app/resources/img/os/{centos.svg => centos-color.svg} (100%) delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/os/debian-24.png rename app/src/main/resources/io/xpipe/app/resources/img/os/{debian.svg => debian-color.svg} (100%) delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/os/elementary-24-dark.png delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/os/elementary-24.png delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/os/endeavour-24-dark.png delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/os/endeavour-24.png delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/os/fedora-24.png rename app/src/main/resources/io/xpipe/app/resources/img/os/{fedora.svg => fedora-color.svg} (100%) delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/os/freebsd-24.png rename app/src/main/resources/io/xpipe/app/resources/img/os/{freebsd.svg => freebsd-color.svg} (100%) delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/os/garuda-24.png delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/os/gentoo-24.png rename app/src/main/resources/io/xpipe/app/resources/img/os/{gentoo.svg => gentoo-color.svg} (100%) delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/os/kali-24.png rename app/src/main/resources/io/xpipe/app/resources/img/os/{kali.svg => kali-color.svg} (100%) delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/os/kubuntu-24.png rename app/src/main/resources/io/xpipe/app/resources/img/os/{kubuntu.svg => kubuntu-color.svg} (100%) delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/os/linux-24.png delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/os/macos-24-dark.png delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/os/macos-24.png delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/os/manjaro-24.png rename app/src/main/resources/io/xpipe/app/resources/img/os/{manjaro.svg => manjaro-color.svg} (100%) delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/os/mint-24.png rename app/src/main/resources/io/xpipe/app/resources/img/os/{mint.svg => mint-color.svg} (100%) delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/os/netbsd-24.png rename app/src/main/resources/io/xpipe/app/resources/img/os/{netbsd.svg => netbsd-color.svg} (100%) delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/os/nixos-24.png rename app/src/main/resources/io/xpipe/app/resources/img/os/{nixos.svg => nixos-color.svg} (100%) delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/os/openbsd-24.png rename app/src/main/resources/io/xpipe/app/resources/img/os/{openbsd.svg => openbsd-color.svg} (100%) delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/os/pop-24.png rename app/src/main/resources/io/xpipe/app/resources/img/os/{pop.svg => pop-color.svg} (100%) delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/os/redhat-24.png rename app/src/main/resources/io/xpipe/app/resources/img/os/{redhat.svg => redhat-color.svg} (100%) delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/os/rocky-24.png rename app/src/main/resources/io/xpipe/app/resources/img/os/{rocky.svg => rocky-color.svg} (100%) delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/os/suse-24.png rename app/src/main/resources/io/xpipe/app/resources/img/os/{suse.svg => suse-color.svg} (100%) delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/os/ubuntu-24.png rename app/src/main/resources/io/xpipe/app/resources/img/os/{ubuntu.svg => ubuntu-color.svg} (100%) delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/os/windows-24.png rename app/src/main/resources/io/xpipe/app/resources/img/os/{windows.svg => windows-color.svg} (100%) delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/os/zorin-24.png rename app/src/main/resources/io/xpipe/app/resources/img/os/{zorin.svg => zorin-color.svg} (100%) create mode 100644 dist/changelogs/1.7.14.md create mode 100644 ext/base/src/main/resources/io/xpipe/ext/base/resources/img/binary_icon.png create mode 100644 ext/base/src/main/resources/io/xpipe/ext/base/resources/img/file_icon.png create mode 100644 ext/base/src/main/resources/io/xpipe/ext/base/resources/img/httpRequest_icon.png create mode 100644 ext/base/src/main/resources/io/xpipe/ext/base/resources/img/http_icon.png create mode 100644 ext/base/src/main/resources/io/xpipe/ext/base/resources/img/inMemory_icon.png create mode 100644 ext/base/src/main/resources/io/xpipe/ext/base/resources/img/internalStream_icon.png create mode 100644 ext/base/src/main/resources/io/xpipe/ext/base/resources/img/sinkDrain_icon.png create mode 100644 ext/base/src/main/resources/io/xpipe/ext/base/resources/img/text_icon.png create mode 100644 ext/base/src/main/resources/io/xpipe/ext/base/resources/img/xpbs_icon.png create mode 100644 ext/base/src/main/resources/io/xpipe/ext/base/resources/img/xpbt_icon.png diff --git a/README.md b/README.md index d7e28a429..2a71c2ad0 100644 --- a/README.md +++ b/README.md @@ -115,7 +115,6 @@ Alternatively, you can also use your favorite package manager (if supported): - [choco](https://community.chocolatey.org/packages/xpipe): `choco install xpipe` - [AUR package](https://aur.archlinux.org/packages/xpipe): `yay -S xpipe` - [Homebrew](https://github.com/xpipe-io/homebrew-tap): `brew install --cask xpipe-io/tap/xpipe` -- [nixpkg](https://github.com/xpipe-io/nixpkg): You can install XPipe by following the linked repository instructions ## Open source model diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserWelcomeComp.java b/app/src/main/java/io/xpipe/app/browser/BrowserWelcomeComp.java index cc8174100..01e74cab1 100644 --- a/app/src/main/java/io/xpipe/app/browser/BrowserWelcomeComp.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserWelcomeComp.java @@ -81,7 +81,7 @@ public class BrowserWelcomeComp extends SimpleComp { var listBox = new ListBoxViewComp<>(list, list, e -> { var entry = DataStorage.get().getStoreEntryIfPresent(e.getUuid()); var graphic = entry.get().getProvider().getDisplayIconFileName(entry.get().getStore()); - var view = PrettyImageHelper.ofFixedSize(graphic, 50, 40); + var view = PrettyImageHelper.ofFixedSquare(graphic, 45); view.padding(new Insets(2, 8, 2, 8)); var content = JfxHelper.createNamedEntry(DataStorage.get().getStoreDisplayName(entry.get()), e.getPath(), graphic); diff --git a/app/src/main/java/io/xpipe/app/browser/FileSystemHelper.java b/app/src/main/java/io/xpipe/app/browser/FileSystemHelper.java index a42e3914d..8da5a1822 100644 --- a/app/src/main/java/io/xpipe/app/browser/FileSystemHelper.java +++ b/app/src/main/java/io/xpipe/app/browser/FileSystemHelper.java @@ -53,7 +53,7 @@ public class FileSystemHelper { } var shell = model.getFileSystem().getShell(); - if (shell.isEmpty() || !shell.get().isRunning()) { + if (shell.isEmpty()) { return path; } diff --git a/app/src/main/java/io/xpipe/app/browser/OpenFileSystemModel.java b/app/src/main/java/io/xpipe/app/browser/OpenFileSystemModel.java index 3d8b347d1..e76a0bd29 100644 --- a/app/src/main/java/io/xpipe/app/browser/OpenFileSystemModel.java +++ b/app/src/main/java/io/xpipe/app/browser/OpenFileSystemModel.java @@ -131,9 +131,6 @@ public final class OpenFileSystemModel { return Optional.empty(); } - // Start shell in case we exited - getFileSystem().getShell().orElseThrow().start(); - // Fix common issues with paths var adjustedPath = FileSystemHelper.adjustPath(this, path); if (!Objects.equals(path, adjustedPath)) { diff --git a/app/src/main/java/io/xpipe/app/browser/action/LeafAction.java b/app/src/main/java/io/xpipe/app/browser/action/LeafAction.java index 4e5a77792..cfdf1a99a 100644 --- a/app/src/main/java/io/xpipe/app/browser/action/LeafAction.java +++ b/app/src/main/java/io/xpipe/app/browser/action/LeafAction.java @@ -29,8 +29,6 @@ public interface LeafAction extends BrowserAction { ThreadHelper.runFailableAsync(() -> { BooleanScope.execute(model.getBusy(), () -> { - // Start shell in case we exited - model.getFileSystem().getShell().orElseThrow().start(); execute(model, selected); }); }); @@ -66,8 +64,6 @@ public interface LeafAction extends BrowserAction { mi.setOnAction(event -> { ThreadHelper.runFailableAsync(() -> { BooleanScope.execute(model.getBusy(), () -> { - // Start shell in case we exited - model.getFileSystem().getShell().orElseThrow().start(); execute(model, selected); }); }); diff --git a/app/src/main/java/io/xpipe/app/comp/base/OsLogoComp.java b/app/src/main/java/io/xpipe/app/comp/base/OsLogoComp.java index 22946a940..d57de2c46 100644 --- a/app/src/main/java/io/xpipe/app/comp/base/OsLogoComp.java +++ b/app/src/main/java/io/xpipe/app/comp/base/OsLogoComp.java @@ -51,7 +51,7 @@ public class OsLogoComp extends SimpleComp { var hide = BindingsHelper.map(img, s -> s != null); return new StackComp(List.of( new SystemStateComp(state).hide(hide), - PrettyImageHelper.ofRasterized(img, 24, 24).visible(hide))) + PrettyImageHelper.ofSvg(img, 24, 24).visible(hide))) .createRegion(); } @@ -66,9 +66,8 @@ public class OsLogoComp extends SimpleComp { if (ICONS.isEmpty()) { AppResources.with(AppResources.XPIPE_MODULE, "img/os", file -> { try (var list = Files.list(file)) { - list.filter(path -> path.toString().endsWith(".svg") && !path.toString().endsWith(LINUX_DEFAULT)) - .map(path -> FileNames.getFileName(path.toString())).forEach(path -> { - var base = FileNames.getBaseName(path).replace("-dark", "") + "-24.png"; + list.filter(path -> !path.toString().endsWith(LINUX_DEFAULT)).map(path -> FileNames.getFileName(path.toString())).forEach(path -> { + var base = FileNames.getBaseName(path).replace("-dark", "") + ".svg"; ICONS.put(FileNames.getBaseName(base).split("-")[0], "os/" + base); }); } diff --git a/app/src/main/java/io/xpipe/app/comp/store/DenseStoreEntryComp.java b/app/src/main/java/io/xpipe/app/comp/store/DenseStoreEntryComp.java index 8635ee8ea..85d00376e 100644 --- a/app/src/main/java/io/xpipe/app/comp/store/DenseStoreEntryComp.java +++ b/app/src/main/java/io/xpipe/app/comp/store/DenseStoreEntryComp.java @@ -56,7 +56,7 @@ public class DenseStoreEntryComp extends StoreEntryComp { }, grid.widthProperty())); if (showIcon) { - var storeIcon = createIcon(30, 24); + var storeIcon = createIcon(30, 25); grid.getColumnConstraints().add(new ColumnConstraints(46)); grid.add(storeIcon, 0, 0); GridPane.setHalignment(storeIcon, HPos.CENTER); diff --git a/app/src/main/java/io/xpipe/app/comp/store/DataStoreProviderChoiceComp.java b/app/src/main/java/io/xpipe/app/comp/store/DsStoreProviderChoiceComp.java similarity index 52% rename from app/src/main/java/io/xpipe/app/comp/store/DataStoreProviderChoiceComp.java rename to app/src/main/java/io/xpipe/app/comp/store/DsStoreProviderChoiceComp.java index c8d6b92ec..8993234be 100644 --- a/app/src/main/java/io/xpipe/app/comp/store/DataStoreProviderChoiceComp.java +++ b/app/src/main/java/io/xpipe/app/comp/store/DsStoreProviderChoiceComp.java @@ -1,16 +1,17 @@ package io.xpipe.app.comp.store; +import io.xpipe.app.core.AppI18n; import io.xpipe.app.ext.DataStoreProvider; import io.xpipe.app.ext.DataStoreProviders; import io.xpipe.app.fxcomps.Comp; import io.xpipe.app.fxcomps.CompStructure; import io.xpipe.app.fxcomps.SimpleCompStructure; import io.xpipe.app.prefs.AppPrefs; +import io.xpipe.app.util.CustomComboBoxBuilder; import io.xpipe.app.util.JfxHelper; import javafx.beans.property.Property; +import javafx.scene.Node; import javafx.scene.control.ComboBox; -import javafx.scene.control.ListCell; -import javafx.scene.input.KeyCode; import javafx.scene.layout.Region; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -18,23 +19,27 @@ import lombok.experimental.FieldDefaults; import java.util.List; import java.util.function.Predicate; -import java.util.function.Supplier; @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) @AllArgsConstructor -public class DataStoreProviderChoiceComp extends Comp>> { +public class DsStoreProviderChoiceComp extends Comp>> { Predicate filter; Property provider; boolean staticDisplay; + private Region createDefaultNode() { + return JfxHelper.createNamedEntry( + AppI18n.get("selectType"), AppI18n.get("selectTypeDescription"), "connection_icon.svg"); + } + private List getProviders() { return DataStoreProviders.getAll().stream().filter(filter).toList(); } private Region createGraphic(DataStoreProvider provider) { if (provider == null) { - return null; + return createDefaultNode(); } var graphic = provider.getDisplayIconFileName(null); @@ -42,40 +47,20 @@ public class DataStoreProviderChoiceComp extends Comp> createBase() { - Supplier> cellFactory = () -> new ListCell<>() { - @Override - protected void updateItem(DataStoreProvider item, boolean empty) { - super.updateItem(item, empty); - setGraphic(createGraphic(item)); - setAccessibleText(item != null ? item.getDisplayName() : null); - setAccessibleHelp(item != null ? item.getDisplayDescription() : null); - } - }; - var cb = new ComboBox(); - cb.setCellFactory(param -> { - return cellFactory.get(); - }); - cb.setButtonCell(cellFactory.get()); + public CompStructure> createBase() { + var comboBox = new CustomComboBoxBuilder<>(provider, this::createGraphic, createDefaultNode(), v -> true); + comboBox.setAccessibleNames(dataStoreProvider -> dataStoreProvider.getDisplayName()); var l = getProviders().stream() - .filter(p -> AppPrefs.get().developerShowHiddenProviders().get() || p.getCreationCategory() != null || staticDisplay) - .toList(); - l.forEach(dataStoreProvider -> cb.getItems().add(dataStoreProvider)); - if (provider.getValue() == null) { - provider.setValue(l.getFirst()); + .filter(p -> AppPrefs.get().developerShowHiddenProviders().get() || p.getCreationCategory() != null || staticDisplay).toList(); + l + .forEach(comboBox::add); + if (l.size() == 1) { + provider.setValue(l.get(0)); } - cb.setValue(provider.getValue()); - provider.bind(cb.valueProperty()); + ComboBox cb = comboBox.build(); + cb.getStyleClass().add("data-source-type"); cb.getStyleClass().add("choice-comp"); cb.setAccessibleText("Choose connection type"); - cb.setOnKeyPressed(event -> { - if (!event.getCode().equals(KeyCode.ENTER)) { - return; - } - - cb.show(); - event.consume(); - }); return new SimpleCompStructure<>(cb); } } 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 8aef2cd53..fae8ab4f2 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 @@ -276,7 +276,7 @@ public class GuiDsStoreCreator extends MultiStepComp.Step> { var layout = new BorderPane(); layout.getStyleClass().add("store-creator"); layout.setPadding(new Insets(20)); - var providerChoice = new DataStoreProviderChoiceComp(filter, provider, staticDisplay); + var providerChoice = new DsStoreProviderChoiceComp(filter, provider, staticDisplay); if (staticDisplay) { providerChoice.apply(struc -> struc.get().setDisable(true)); } diff --git a/app/src/main/java/io/xpipe/app/comp/store/StandardStoreEntryComp.java b/app/src/main/java/io/xpipe/app/comp/store/StandardStoreEntryComp.java index 6e402c56c..c93c35c8d 100644 --- a/app/src/main/java/io/xpipe/app/comp/store/StandardStoreEntryComp.java +++ b/app/src/main/java/io/xpipe/app/comp/store/StandardStoreEntryComp.java @@ -20,7 +20,7 @@ public class StandardStoreEntryComp extends StoreEntryComp { grid.setHgap(7); grid.setVgap(0); - var storeIcon = createIcon(50, 40); + var storeIcon = createIcon(50, 39); grid.add(storeIcon, 0, 0, 1, 2); grid.getColumnConstraints().add(new ColumnConstraints(66)); diff --git a/app/src/main/java/io/xpipe/app/comp/store/StoreCreationMenu.java b/app/src/main/java/io/xpipe/app/comp/store/StoreCreationMenu.java index 3e81430ff..132ca4953 100644 --- a/app/src/main/java/io/xpipe/app/comp/store/StoreCreationMenu.java +++ b/app/src/main/java/io/xpipe/app/comp/store/StoreCreationMenu.java @@ -3,9 +3,7 @@ package io.xpipe.app.comp.store; import io.xpipe.app.core.AppI18n; import io.xpipe.app.ext.DataStoreProvider; import io.xpipe.app.ext.DataStoreProviders; -import io.xpipe.app.fxcomps.impl.PrettyImageHelper; import io.xpipe.app.util.ScanAlert; -import javafx.scene.control.Menu; import javafx.scene.control.MenuButton; import javafx.scene.control.MenuItem; import javafx.scene.control.SeparatorMenuItem; @@ -14,71 +12,84 @@ import org.kordamp.ikonli.javafx.FontIcon; public class StoreCreationMenu { public static void addButtons(MenuButton menu) { - var automatically = new MenuItem(); - automatically.setGraphic(new FontIcon("mdi2e-eye-plus-outline")); - automatically.textProperty().bind(AppI18n.observable("addAutomatically")); - automatically.setOnAction(event -> { - ScanAlert.showAsync(null); - event.consume(); - }); - menu.getItems().add(automatically); - menu.getItems().add(new SeparatorMenuItem()); - - menu.getItems().add(category("addHost", "mdi2h-home-plus", - DataStoreProvider.CreationCategory.HOST, "ssh")); - - menu.getItems().add(category("addShell", "mdi2t-text-box-multiple", - DataStoreProvider.CreationCategory.SHELL, null)); - - menu.getItems().add(category("addScript", "mdi2s-script-text-outline", - DataStoreProvider.CreationCategory.SCRIPT, "script")); - - menu.getItems().add(category("addCommand", "mdi2c-code-greater-than", - DataStoreProvider.CreationCategory.COMMAND, "cmd")); - - menu.getItems().add(category("addTunnel", "mdi2v-vector-polyline-plus", - DataStoreProvider.CreationCategory.TUNNEL, null)); - - menu.getItems().add(category("addDatabase", "mdi2d-database-plus", - DataStoreProvider.CreationCategory.DATABASE, null)); - } - - private static MenuItem category(String name, String graphic, DataStoreProvider.CreationCategory category, String defaultProvider) { - var sub = DataStoreProviders.getAll().stream().filter(dataStoreProvider -> category.equals(dataStoreProvider.getCreationCategory())).toList(); - if (sub.size() < 2) { - var item = new MenuItem(); - item.setGraphic(new FontIcon(graphic)); - item.textProperty().bind(AppI18n.observable(name)); - item.setOnAction(event -> { - GuiDsStoreCreator.showCreation(defaultProvider != null ? DataStoreProviders.byName(defaultProvider).orElseThrow() : null, - v -> category.equals(v.getCreationCategory())); + { + var automatically = new MenuItem(); + automatically.setGraphic(new FontIcon("mdi2e-eye-plus-outline")); + automatically.textProperty().bind(AppI18n.observable("addAutomatically")); + automatically.setOnAction(event -> { + ScanAlert.showAsync(null); event.consume(); }); - return item; + menu.getItems().add(automatically); + menu.getItems().add(new SeparatorMenuItem()); } - var menu = new Menu(); - menu.setGraphic(new FontIcon(graphic)); - menu.textProperty().bind(AppI18n.observable(name)); - menu.setOnAction(event -> { - if (event.getTarget() != menu) { - return; - } - - GuiDsStoreCreator.showCreation(defaultProvider != null ? DataStoreProviders.byName(defaultProvider).orElseThrow() : null, - v -> category.equals(v.getCreationCategory())); - event.consume(); - }); - sub.forEach(dataStoreProvider -> { - var item = new MenuItem(dataStoreProvider.getDisplayName()); - item.setGraphic(PrettyImageHelper.ofFixedSmallSquare(dataStoreProvider.getDisplayIconFileName(null)).createRegion()); - item.setOnAction(event -> { - GuiDsStoreCreator.showCreation(dataStoreProvider, - v -> category.equals(v.getCreationCategory())); + { + var host = new MenuItem(); + host.setGraphic(new FontIcon("mdi2h-home-plus")); + host.textProperty().bind(AppI18n.observable("addHost")); + host.setOnAction(event -> { + GuiDsStoreCreator.showCreation(DataStoreProviders.byName("ssh").orElseThrow(), + v -> DataStoreProvider.CreationCategory.HOST.equals(v.getCreationCategory())); event.consume(); }); - menu.getItems().add(item); - }); - return menu; + menu.getItems().add(host); + } + { + var shell = new MenuItem(); + shell.setGraphic(new FontIcon("mdi2t-text-box-multiple")); + shell.textProperty().bind(AppI18n.observable("addShell")); + shell.setOnAction(event -> { + GuiDsStoreCreator.showCreation(null, + v -> DataStoreProvider.CreationCategory.SHELL.equals(v.getCreationCategory())); + event.consume(); + }); + menu.getItems().add(shell); + } + { + var cmd = new MenuItem(); + cmd.setGraphic(new FontIcon("mdi2c-code-greater-than")); + cmd.textProperty().bind(AppI18n.observable("addCommand")); + cmd.setOnAction(event -> { + GuiDsStoreCreator.showCreation(DataStoreProviders.byName("cmd").orElseThrow(), + v -> DataStoreProvider.CreationCategory.COMMAND.equals(v.getCreationCategory())); + event.consume(); + }); + menu.getItems().add(cmd); + } + { + var db = new MenuItem(); + db.setGraphic(new FontIcon("mdi2d-database-plus")); + db.textProperty().bind(AppI18n.observable("addDatabase")); + db.setOnAction(event -> { + GuiDsStoreCreator.showCreation(null, + v -> DataStoreProvider.CreationCategory.DATABASE.equals(v.getCreationCategory())); + event.consume(); + }); + menu.getItems().add(db); + } + { + var tunnel = new MenuItem(); + tunnel.setGraphic(new FontIcon("mdi2v-vector-polyline-plus")); + tunnel.textProperty().bind(AppI18n.observable("addTunnel")); + tunnel.setOnAction(event -> { + GuiDsStoreCreator.showCreation(null, + v -> DataStoreProvider.CreationCategory.TUNNEL.equals(v.getCreationCategory())); + event.consume(); + }); + menu.getItems().add(tunnel); + } + { + var script = new MenuItem(); + script.setGraphic(new FontIcon("mdi2s-script-text-outline")); + script.textProperty().bind(AppI18n.observable("addScript")); + script.setOnAction(event -> { + GuiDsStoreCreator.showCreation(DataStoreProviders.byName("script").orElseThrow(), + v -> DataStoreProvider.CreationCategory.SCRIPT.equals(v.getCreationCategory())); + event.consume(); + }); + menu.getItems().add(script); + } } + } diff --git a/app/src/main/java/io/xpipe/app/comp/store/StoreEntryComp.java b/app/src/main/java/io/xpipe/app/comp/store/StoreEntryComp.java index 6ffc72965..bcf27d8ad 100644 --- a/app/src/main/java/io/xpipe/app/comp/store/StoreEntryComp.java +++ b/app/src/main/java/io/xpipe/app/comp/store/StoreEntryComp.java @@ -160,7 +160,7 @@ public abstract class StoreEntryComp extends SimpleComp { : wrapper.getEntry() .getProvider() .getDisplayIconFileName(wrapper.getEntry().getStore()); - var imageComp = PrettyImageHelper.ofFixedSize(img, w, h); + var imageComp = PrettyImageHelper.ofFixed(img, w, h); var storeIcon = imageComp.createRegion(); if (wrapper.getValidity().getValue().isUsable()) { new FancyTooltipAugment<>(new SimpleStringProperty( diff --git a/app/src/main/java/io/xpipe/app/core/AppTheme.java b/app/src/main/java/io/xpipe/app/core/AppTheme.java index dc8e9726b..929b45d4b 100644 --- a/app/src/main/java/io/xpipe/app/core/AppTheme.java +++ b/app/src/main/java/io/xpipe/app/core/AppTheme.java @@ -124,10 +124,6 @@ public class AppTheme { } PlatformThread.runLaterIfNeeded(() -> { - if (AppMainWindow.getInstance() == null) { - return; - } - var window = AppMainWindow.getInstance().getStage(); var scene = window.getScene(); Pane root = (Pane) scene.getRoot(); diff --git a/app/src/main/java/io/xpipe/app/core/AppWindowHelper.java b/app/src/main/java/io/xpipe/app/core/AppWindowHelper.java index 8795025fb..317150d8e 100644 --- a/app/src/main/java/io/xpipe/app/core/AppWindowHelper.java +++ b/app/src/main/java/io/xpipe/app/core/AppWindowHelper.java @@ -269,11 +269,6 @@ public class AppWindowHelper { changed = true; } - // This should not happen but on weird Linux systems nothing is impossible - if (w < 0 || h < 0) { - return Optional.empty(); - } - return changed ? Optional.of(new Rectangle2D(x, y, w, h)) : Optional.empty(); } diff --git a/app/src/main/java/io/xpipe/app/ext/DataStoreProviders.java b/app/src/main/java/io/xpipe/app/ext/DataStoreProviders.java index 568b88ba2..66e41e7ff 100644 --- a/app/src/main/java/io/xpipe/app/ext/DataStoreProviders.java +++ b/app/src/main/java/io/xpipe/app/ext/DataStoreProviders.java @@ -3,6 +3,7 @@ package io.xpipe.app.ext; import io.xpipe.app.issue.ErrorEvent; import io.xpipe.core.store.DataStore; +import java.util.Comparator; import java.util.List; import java.util.Optional; import java.util.ServiceLoader; @@ -16,6 +17,7 @@ public class DataStoreProviders { if (ALL == null) { ALL = ServiceLoader.load(layer, DataStoreProvider.class).stream() .map(ServiceLoader.Provider::get) + .sorted(Comparator.comparing(DataStoreProvider::getId)) .collect(Collectors.toList()); ALL.removeIf(p -> { try { diff --git a/app/src/main/java/io/xpipe/app/fxcomps/impl/CharsetChoiceComp.java b/app/src/main/java/io/xpipe/app/fxcomps/impl/CharsetChoiceComp.java new file mode 100644 index 000000000..71f1cacd6 --- /dev/null +++ b/app/src/main/java/io/xpipe/app/fxcomps/impl/CharsetChoiceComp.java @@ -0,0 +1,46 @@ +package io.xpipe.app.fxcomps.impl; + +import io.xpipe.app.core.AppI18n; +import io.xpipe.app.fxcomps.SimpleComp; +import io.xpipe.app.util.CustomComboBoxBuilder; +import io.xpipe.core.charsetter.StreamCharset; +import javafx.beans.property.Property; +import javafx.scene.control.Label; +import javafx.scene.layout.Region; + +public class CharsetChoiceComp extends SimpleComp { + + private final Property charset; + + public CharsetChoiceComp(Property charset) { + this.charset = charset; + } + + @Override + protected Region createSimple() { + var builder = new CustomComboBoxBuilder<>( + charset, + streamCharset -> { + return new Label(streamCharset.getCharset().displayName() + + (streamCharset.hasByteOrderMark() ? " (BOM)" : "")); + }, + new Label(AppI18n.get("app.none")), + null); + builder.setAccessibleNames(streamCharset -> streamCharset.getNames().get(0)); + builder.addFilter((charset, filter) -> { + return charset.getCharset().displayName().contains(filter); + }); + builder.addHeader(AppI18n.get("app.common")); + for (var e : StreamCharset.COMMON) { + builder.add(e); + } + + builder.addHeader(AppI18n.get("app.other")); + for (var e : StreamCharset.RARE) { + builder.add(e); + } + var comboBox = builder.build(); + comboBox.setVisibleRowCount(16); + return comboBox; + } +} diff --git a/app/src/main/java/io/xpipe/app/fxcomps/impl/DataStoreChoiceComp.java b/app/src/main/java/io/xpipe/app/fxcomps/impl/DataStoreChoiceComp.java index 5334b23b4..51efee847 100644 --- a/app/src/main/java/io/xpipe/app/fxcomps/impl/DataStoreChoiceComp.java +++ b/app/src/main/java/io/xpipe/app/fxcomps/impl/DataStoreChoiceComp.java @@ -13,6 +13,7 @@ import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.DataStoreCategoryChoiceComp; import io.xpipe.core.store.DataStore; import io.xpipe.core.store.ShellStore; +import javafx.application.Platform; import javafx.beans.binding.Bindings; import javafx.beans.property.Property; import javafx.beans.property.SimpleBooleanProperty; @@ -105,7 +106,18 @@ public class DataStoreChoiceComp extends SimpleComp { selectedCategory).styleClass(Styles.LEFT_PILL); var filter = new FilterComp(filterText) .styleClass(Styles.CENTER_PILL) - .hgrow(); + .hgrow() + .apply(struc -> { + popover.setOnShowing(event -> { + Platform.runLater(() -> { + Platform.runLater(() -> { + Platform.runLater(() -> { + struc.getText().requestFocus(); + }); + }); + }); + }); + }); var addButton = Comp.of(() -> { MenuButton m = new MenuButton(null, new FontIcon("mdi2p-plus-box-outline")); @@ -120,16 +132,7 @@ public class DataStoreChoiceComp extends SimpleComp { var top = new HorizontalComp(List.of(category, filter.hgrow(), addButton)) .styleClass("top") .apply(struc -> struc.get().setFillHeight(true)) - .apply(struc -> { - // Ugly solution to focus the text field - // Somehow this does not work through the normal on shown listeners - struc.get().getChildren().get(0).focusedProperty().addListener((observable, oldValue, newValue) -> { - if (newValue) { - ((StackPane) struc.get().getChildren().get(1)).getChildren().get(1).requestFocus(); - } - }); - }) - .createStructure().get(); + .createRegion(); var r = section.vgrow().createRegion(); var content = new VBox(top, r); content.setFillWidth(true); diff --git a/app/src/main/java/io/xpipe/app/fxcomps/impl/ContextualFileReferenceChoiceComp.java b/app/src/main/java/io/xpipe/app/fxcomps/impl/FileReferenceChoiceComp.java similarity index 63% rename from app/src/main/java/io/xpipe/app/fxcomps/impl/ContextualFileReferenceChoiceComp.java rename to app/src/main/java/io/xpipe/app/fxcomps/impl/FileReferenceChoiceComp.java index 809046757..0520492ed 100644 --- a/app/src/main/java/io/xpipe/app/fxcomps/impl/ContextualFileReferenceChoiceComp.java +++ b/app/src/main/java/io/xpipe/app/fxcomps/impl/FileReferenceChoiceComp.java @@ -8,6 +8,7 @@ import io.xpipe.app.fxcomps.util.SimpleChangeListener; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.core.store.FileSystemStore; import javafx.beans.property.Property; +import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleObjectProperty; import javafx.beans.value.ObservableValue; import javafx.scene.layout.HBox; @@ -17,12 +18,14 @@ import org.kordamp.ikonli.javafx.FontIcon; import java.util.List; -public class ContextualFileReferenceChoiceComp extends SimpleComp { +public class FileReferenceChoiceComp extends SimpleComp { + private final boolean hideFileSystem; private final Property> fileSystem; private final Property filePath; - public ContextualFileReferenceChoiceComp(ObservableValue> fileSystem, Property filePath) { + public FileReferenceChoiceComp(ObservableValue> fileSystem, Property filePath) { + this.hideFileSystem = true; this.fileSystem = new SimpleObjectProperty<>(); SimpleChangeListener.apply(fileSystem, val -> { this.fileSystem.setValue(val); @@ -30,15 +33,27 @@ public class ContextualFileReferenceChoiceComp extends SimpleComp { this.filePath = filePath; } + public FileReferenceChoiceComp(boolean hideFileSystem, Property> fileSystem, Property filePath) { + this.hideFileSystem = hideFileSystem; + this.fileSystem = fileSystem != null ? fileSystem : new SimpleObjectProperty<>(); + this.filePath = filePath; + } + @Override protected Region createSimple() { + var fileSystemChoiceComp = + new FileSystemStoreChoiceComp(fileSystem).grow(false, true).styleClass(Styles.LEFT_PILL); + if (hideFileSystem) { + fileSystemChoiceComp.hide(new SimpleBooleanProperty(true)); + } + var fileNameComp = new TextFieldComp(filePath) .apply(struc -> HBox.setHgrow(struc.get(), Priority.ALWAYS)) - .styleClass(Styles.LEFT_PILL) + .styleClass(hideFileSystem ? Styles.LEFT_PILL : Styles.CENTER_PILL) .grow(false, true); var fileBrowseButton = new ButtonComp(null, new FontIcon("mdi2f-folder-open-outline"), () -> { - StandaloneFileBrowser.openSingleFile(() -> fileSystem.getValue(), fileStore -> { + StandaloneFileBrowser.openSingleFile(() -> hideFileSystem ? fileSystem.getValue() : null, fileStore -> { if (fileStore == null) { filePath.setValue(null); fileSystem.setValue(null); @@ -51,7 +66,7 @@ public class ContextualFileReferenceChoiceComp extends SimpleComp { .styleClass(Styles.RIGHT_PILL) .grow(false, true); - var layout = new HorizontalComp(List.of(fileNameComp, fileBrowseButton)) + var layout = new HorizontalComp(List.of(fileSystemChoiceComp, fileNameComp, fileBrowseButton)) .apply(struc -> struc.get().setFillHeight(true)); layout.apply(struc -> { diff --git a/app/src/main/java/io/xpipe/app/fxcomps/impl/FileSystemStoreChoiceComp.java b/app/src/main/java/io/xpipe/app/fxcomps/impl/FileSystemStoreChoiceComp.java new file mode 100644 index 000000000..0ae3c0ed6 --- /dev/null +++ b/app/src/main/java/io/xpipe/app/fxcomps/impl/FileSystemStoreChoiceComp.java @@ -0,0 +1,53 @@ +package io.xpipe.app.fxcomps.impl; + +import io.xpipe.app.fxcomps.SimpleComp; +import io.xpipe.app.storage.DataStorage; +import io.xpipe.app.storage.DataStoreEntry; +import io.xpipe.app.storage.DataStoreEntryRef; +import io.xpipe.app.util.CustomComboBoxBuilder; +import io.xpipe.core.store.FileSystemStore; +import javafx.beans.property.Property; +import javafx.scene.Node; +import javafx.scene.control.ComboBox; +import javafx.scene.control.Label; +import javafx.scene.layout.Region; + +public class FileSystemStoreChoiceComp extends SimpleComp { + + private final Property> selected; + + public FileSystemStoreChoiceComp(Property> selected) { + this.selected = selected; + } + + private static String getName(DataStoreEntryRef store) { + return store.get().getName(); + } + + private Region createGraphic(DataStoreEntryRef s) { + var provider = s.get().getProvider(); + var img = PrettyImageHelper.ofFixedSquare(provider.getDisplayIconFileName(s.getStore()), 16); + return new Label(getName(s), img.createRegion()); + } + + private Region createDisplayGraphic(DataStoreEntryRef s) { + var provider = s.get().getProvider(); + var img = PrettyImageHelper.ofFixedSquare(provider.getDisplayIconFileName(s.getStore()), 16); + return new Label(null, img.createRegion()); + } + + @Override + protected Region createSimple() { + var comboBox = new CustomComboBoxBuilder<>(selected, this::createGraphic, null, v -> true); + comboBox.setAccessibleNames(FileSystemStoreChoiceComp::getName); + comboBox.setSelectedDisplay(this::createDisplayGraphic); + DataStorage.get().getUsableEntries().stream() + .filter(e -> e.getStore() instanceof FileSystemStore) + .map(DataStoreEntry::ref) + .forEach(comboBox::add); + ComboBox cb = comboBox.build(); + cb.getStyleClass().add("choice-comp"); + cb.setMaxWidth(45); + return cb; + } +} diff --git a/app/src/main/java/io/xpipe/app/fxcomps/impl/PrettyImageComp.java b/app/src/main/java/io/xpipe/app/fxcomps/impl/PrettyImageComp.java index c7689b27d..0174d8f81 100644 --- a/app/src/main/java/io/xpipe/app/fxcomps/impl/PrettyImageComp.java +++ b/app/src/main/java/io/xpipe/app/fxcomps/impl/PrettyImageComp.java @@ -4,7 +4,6 @@ import io.xpipe.app.core.AppImages; import io.xpipe.app.fxcomps.SimpleComp; import io.xpipe.app.fxcomps.util.PlatformThread; import io.xpipe.app.fxcomps.util.SimpleChangeListener; -import io.xpipe.app.issue.TrackEvent; import io.xpipe.app.prefs.AppPrefs; import io.xpipe.core.store.FileNames; import javafx.beans.binding.Bindings; @@ -79,7 +78,6 @@ public class PrettyImageComp extends SimpleComp { } else if (AppImages.hasNormalImage(image.getValue().replace("-dark", ""))) { return AppImages.image(image.getValue().replace("-dark", "")); } else { - TrackEvent.withWarn("Image file not found").tag("file",image.getValue()).handle(); return null; } }, diff --git a/app/src/main/java/io/xpipe/app/fxcomps/impl/PrettyImageHelper.java b/app/src/main/java/io/xpipe/app/fxcomps/impl/PrettyImageHelper.java index 7a7e6d448..fe002aca8 100644 --- a/app/src/main/java/io/xpipe/app/fxcomps/impl/PrettyImageHelper.java +++ b/app/src/main/java/io/xpipe/app/fxcomps/impl/PrettyImageHelper.java @@ -6,49 +6,37 @@ import io.xpipe.core.store.FileNames; import javafx.beans.property.SimpleStringProperty; import javafx.beans.value.ObservableValue; -import java.util.Optional; - public class PrettyImageHelper { - public static Optional> rasterizedIfExists(String img, int width, int height) { + public static Comp ofFixedSquare(String img, int size) { if (img != null && img.endsWith(".svg")) { var base = FileNames.getBaseName(img); - var renderedName = base + "-" + height + ".png"; - if (AppImages.hasNormalImage(base + "-" + height + ".png")) { - return Optional.of(new PrettyImageComp(new SimpleStringProperty(renderedName), width, height)); + var renderedName = base + "-" + size + ".png"; + if (AppImages.hasNormalImage(base + "-" + size + ".png")) { + return new PrettyImageComp(new SimpleStringProperty(renderedName), size, size); + } else { + return new PrettySvgComp(new SimpleStringProperty(img), size, size); } } - return Optional.empty(); + return new PrettyImageComp(new SimpleStringProperty(img), size, size); } - public static Comp ofFixedSquare(String img, int size) { - return ofFixedSize(img, size, size); - } - - public static Comp ofFixedSize(String img, int w, int h) { - if (img == null) { - return new PrettyImageComp(new SimpleStringProperty(null), w, h); + public static Comp ofFixed(String img, int w, int h) { + if (w == h) { + return ofFixedSquare(img, w); } - var rasterized = rasterizedIfExists(img, w, h); - if (rasterized.isPresent()) { - return rasterized.get(); - } else { - return img.endsWith(".svg") ? new PrettySvgComp(new SimpleStringProperty(img), w, h) : new PrettyImageComp(new SimpleStringProperty(img), w, h); - } + return img.endsWith(".svg") ? new PrettySvgComp(new SimpleStringProperty(img), w, h) : new PrettyImageComp(new SimpleStringProperty(img), w, h); } + public static Comp ofSvg(ObservableValue img, int w, int h) { return new PrettySvgComp(img, w, h); } - public static Comp ofRasterized(ObservableValue img, int w, int h) { - return new PrettyImageComp(img, w, h); - } - public static Comp ofFixedSmallSquare(String img) { - return ofFixedSize(img, 16, 16); + return ofFixed(img, 16, 16); } } diff --git a/app/src/main/java/io/xpipe/app/fxcomps/impl/TextAreaComp.java b/app/src/main/java/io/xpipe/app/fxcomps/impl/TextAreaComp.java index 40d3bf625..2786d26d0 100644 --- a/app/src/main/java/io/xpipe/app/fxcomps/impl/TextAreaComp.java +++ b/app/src/main/java/io/xpipe/app/fxcomps/impl/TextAreaComp.java @@ -1,7 +1,6 @@ package io.xpipe.app.fxcomps.impl; -import io.xpipe.app.fxcomps.Comp; -import io.xpipe.app.fxcomps.CompStructure; +import io.xpipe.app.fxcomps.SimpleComp; import io.xpipe.app.fxcomps.util.PlatformThread; import io.xpipe.app.fxcomps.util.SimpleChangeListener; import javafx.beans.binding.Bindings; @@ -9,24 +8,11 @@ import javafx.beans.property.Property; import javafx.beans.property.SimpleStringProperty; import javafx.scene.control.TextArea; import javafx.scene.layout.AnchorPane; -import lombok.Builder; -import lombok.Value; +import javafx.scene.layout.Region; import java.util.Objects; -public class TextAreaComp extends Comp { - - @Value - @Builder - public static class Structure implements CompStructure { - AnchorPane pane; - TextArea textArea; - - @Override - public AnchorPane get() { - return pane; - } - } +public class TextAreaComp extends SimpleComp { private final Property currentValue; private final Property lastAppliedValue; @@ -46,7 +32,7 @@ public class TextAreaComp extends Comp { } @Override - public Structure createBase() { + protected Region createSimple() { var text = new TextArea(currentValue.getValue() != null ? currentValue.getValue() : null); text.setPrefRowCount(5); text.textProperty().addListener((c, o, n) -> { @@ -71,12 +57,6 @@ public class TextAreaComp extends Comp { } }); - var anchorPane = new AnchorPane(text); - AnchorPane.setBottomAnchor(text, 0.0); - AnchorPane.setTopAnchor(text, 0.0); - AnchorPane.setLeftAnchor(text, 0.0); - AnchorPane.setRightAnchor(text, 0.0); - if (lazy) { var isEqual = Bindings.createBooleanBinding( () -> Objects.equals(lastAppliedValue.getValue(), currentValue.getValue()), @@ -85,14 +65,16 @@ public class TextAreaComp extends Comp { var button = new IconButtonComp("mdi2c-checkbox-marked-outline") .hide(isEqual) .createRegion(); - anchorPane.getChildren().add(button); + var anchorPane = new AnchorPane(text, button); AnchorPane.setBottomAnchor(button, 10.0); AnchorPane.setRightAnchor(button, 10.0); text.prefWidthProperty().bind(anchorPane.widthProperty()); text.prefHeightProperty().bind(anchorPane.heightProperty()); + + return anchorPane; } - return new Structure(anchorPane, text); + return text; } } diff --git a/app/src/main/java/io/xpipe/app/fxcomps/util/BindingsHelper.java b/app/src/main/java/io/xpipe/app/fxcomps/util/BindingsHelper.java index d5133514d..87b54f342 100644 --- a/app/src/main/java/io/xpipe/app/fxcomps/util/BindingsHelper.java +++ b/app/src/main/java/io/xpipe/app/fxcomps/util/BindingsHelper.java @@ -304,10 +304,8 @@ public class BindingsHelper { if (target.size() - 1 == newList.size() && targetSet.containsAll(newSet)) { var l = new HashSet<>(targetSet); l.removeAll(newSet); - if (l.size() > 0) { - target.remove(l.iterator().next()); - return; - } + target.remove(l.iterator().next()); + return; } // Other cases are more difficult diff --git a/app/src/main/java/io/xpipe/app/issue/SentryErrorHandler.java b/app/src/main/java/io/xpipe/app/issue/SentryErrorHandler.java index 3074086d2..c4f4d4317 100644 --- a/app/src/main/java/io/xpipe/app/issue/SentryErrorHandler.java +++ b/app/src/main/java/io/xpipe/app/issue/SentryErrorHandler.java @@ -180,7 +180,7 @@ public class SentryErrorHandler implements ErrorHandler { s.setTag("terminal", Boolean.toString(ee.isTerminal())); s.setTag("omitted", Boolean.toString(ee.isOmitted())); s.setTag("diagnostics", Boolean.toString(ee.isShouldSendDiagnostics())); - s.setTag("logs", Boolean.toString(ee.isShouldSendDiagnostics() && !ee.getAttachments().isEmpty())); + s.setTag("logs", Boolean.toString(!ee.getAttachments().isEmpty())); var exMessage = ee.getThrowable() != null ? ee.getThrowable().getMessage() : null; if (ee.getDescription() != null && !ee.getDescription().equals(exMessage) && ee.isShouldSendDiagnostics()) { diff --git a/app/src/main/java/io/xpipe/app/storage/ContextualFileReference.java b/app/src/main/java/io/xpipe/app/storage/ContextualFileReference.java index 3e8e75c68..8e1e3219e 100644 --- a/app/src/main/java/io/xpipe/app/storage/ContextualFileReference.java +++ b/app/src/main/java/io/xpipe/app/storage/ContextualFileReference.java @@ -9,7 +9,6 @@ import lombok.NonNull; import java.nio.file.InvalidPathException; import java.nio.file.Path; -import java.util.Optional; import java.util.regex.Matcher; @AllArgsConstructor(access = AccessLevel.PRIVATE) @@ -37,24 +36,6 @@ public class ContextualFileReference { } } - public static Optional parseIfInDataDirectory(String s) { - var cf = of(s); - if (cf.serialize().contains("")) { - return Optional.of(cf); - } else { - return Optional.empty(); - } - } - - public static Optional resolveIfInDataDirectory(ShellControl shellControl, String s) { - if (s.contains("")) { - var cf = of(s); - return Optional.of(cf.toFilePath(shellControl)); - } else { - return Optional.empty(); - } - } - public static ContextualFileReference of(String s) { if (s == null) { return null; diff --git a/app/src/main/java/io/xpipe/app/util/CustomComboBoxBuilder.java b/app/src/main/java/io/xpipe/app/util/CustomComboBoxBuilder.java new file mode 100644 index 000000000..e5b6b4f16 --- /dev/null +++ b/app/src/main/java/io/xpipe/app/util/CustomComboBoxBuilder.java @@ -0,0 +1,266 @@ +package io.xpipe.app.util; + +import io.xpipe.app.core.AppI18n; +import io.xpipe.app.fxcomps.impl.FilterComp; +import io.xpipe.app.fxcomps.util.SimpleChangeListener; +import javafx.application.Platform; +import javafx.beans.property.Property; +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.value.ObservableValue; +import javafx.collections.FXCollections; +import javafx.geometry.Orientation; +import javafx.geometry.Pos; +import javafx.scene.Node; +import javafx.scene.control.ComboBox; +import javafx.scene.control.Label; +import javafx.scene.control.ListCell; +import javafx.scene.control.Separator; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyEvent; +import javafx.scene.input.MouseEvent; +import javafx.scene.layout.Region; +import javafx.scene.layout.VBox; + +import java.util.*; +import java.util.function.BiPredicate; +import java.util.function.Function; +import java.util.function.Predicate; + +public class CustomComboBoxBuilder { + + private final Property selected; + private final Function nodeFunction; + private ObservableValue emptyAccessibilityName = AppI18n.observable("none"); + private Function accessibleNameFunction; + private Function selectedDisplayNodeFunction; + private final Map nodeMap = new HashMap<>(); + private final Map actionsMap = new HashMap<>(); + private final List nodes = new ArrayList<>(); + private final Set disabledNodes = new HashSet<>(); + private final Node emptyNode; + private final Predicate veto; + private final Property filterString = new SimpleStringProperty(); + 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) { + this.selected = selected; + this.nodeFunction = nodeFunction; + this.selectedDisplayNodeFunction = nodeFunction; + this.emptyNode = emptyNode; + this.veto = veto; + } + + public void setSelectedDisplay(Function nodeFunction) { + selectedDisplayNodeFunction = nodeFunction; + } + + public void setAccessibleNames(Function function) { + accessibleNameFunction = function; + } + + public void setEmptyAccessibilityName(ObservableValue n) { + emptyAccessibilityName = n; + } + + public void addAction(Node node, Runnable run) { + nodes.add(node); + actionsMap.put(node, run); + } + + public void disable(Node node) { + disabledNodes.add(node); + } + + public void setUnknownNode(Function node) { + unknownNode = node; + } + + public Node add(T val) { + var node = nodeFunction.apply(val); + nodeMap.put(node, val); + nodes.add(node); + if (filterPredicate != null) { + filterable.add(val); + } + return node; + } + + public void addSeparator() { + var sep = new Separator(Orientation.HORIZONTAL); + nodes.add(sep); + disabledNodes.add(sep); + } + + public void addHeader(String name) { + var spacer = new Region(); + spacer.setPrefHeight(10); + var header = new Label(name); + header.setAlignment(Pos.CENTER); + var v = new VBox(spacer, header, new Separator(Orientation.HORIZONTAL)); + v.setAccessibleText(name); + v.setAlignment(Pos.CENTER); + nodes.add(v); + disabledNodes.add(v); + } + + public void addFilter(BiPredicate filterPredicate) { + this.filterPredicate = filterPredicate; + + var spacer = new Region(); + spacer.setPrefHeight(10); + var header = new FilterComp(filterString).createStructure(); + var v = new VBox(header.get()); + v.setAlignment(Pos.CENTER); + nodes.add(v); + filterNode = header.getText(); + } + + public ComboBox build() { + var cb = new ComboBox(); + cb.getItems().addAll(nodes); + + cb.setCellFactory((lv) -> { + return new Cell(); + }); + cb.setButtonCell(new SelectedCell()); + SimpleChangeListener.apply(selected, c -> { + var item = nodeMap.entrySet().stream() + .filter(e -> Objects.equals(c, e.getValue())) + .map(e -> e.getKey()) + .findAny() + .orElse(c == null || unknownNode == null ? emptyNode : unknownNode.apply(c)); + cb.setValue(item); + }); + cb.valueProperty().addListener((c, o, n) -> { + if (nodeMap.containsKey(n)) { + if (veto != null && !veto.test(nodeMap.get(n))) { + return; + } + selected.setValue(nodeMap.get(n)); + } + + if (actionsMap.containsKey(n)) { + cb.setValue(o); + actionsMap.get(n).run(); + } + }); + + if (filterPredicate != null) { + SimpleChangeListener.apply(filterString, c -> { + var filteredNodes = nodes.stream() + .filter(e -> e.equals(cb.getValue()) + || !(nodeMap.get(e) != null + && (filterable.contains(nodeMap.get(e)) + && filterString.getValue() != null + && !filterPredicate.test(nodeMap.get(e), c)))) + .toList(); + cb.setItems(FXCollections.observableList(filteredNodes)); + }); + + filterNode.sceneProperty().addListener((c, o, n) -> { + if (n != null) { + n.getWindow().focusedProperty().addListener((c2, o2, n2) -> { + Platform.runLater(() -> { + filterNode.requestFocus(); + }); + }); + } + Platform.runLater(() -> { + filterNode.requestFocus(); + }); + }); + } + + if (emptyNode != null) { + emptyNode.setAccessibleText(emptyAccessibilityName.getValue()); + } + if (accessibleNameFunction != null) { + nodes.forEach(node -> node.setAccessibleText(accessibleNameFunction.apply(nodeMap.get(node)))); + } + + return cb; + } + + private class SelectedCell extends ListCell { + + @Override + protected void updateItem(Node item, boolean empty) { + super.updateItem(item, empty); + + accessibleTextProperty().unbind(); + if (empty || item.equals(emptyNode)) { + if (emptyAccessibilityName != null) { + accessibleTextProperty().bind(emptyAccessibilityName); + } else { + setAccessibleText(null); + } + } + + if (empty) { + return; + } + + if (item.equals(emptyNode)) { + setGraphic(item); + return; + } + + // Case for dynamically created unknown nodes + if (!nodeMap.containsKey(item)) { + setGraphic(item); + // Don't expect the accessible name function to properly map this item + setAccessibleText(null); + return; + } + + var val = nodeMap.get(item); + var newNode = selectedDisplayNodeFunction.apply(val); + setGraphic(newNode); + setAccessibleText(newNode.getAccessibleText()); + } + } + + private class Cell extends ListCell { + + public Cell() { + addEventFilter(MouseEvent.MOUSE_PRESSED, event -> { + if (!nodeMap.containsKey(getItem())) { + event.consume(); + } + }); + addEventFilter(KeyEvent.KEY_PRESSED, event -> { + if (event.getCode() == KeyCode.ENTER && !nodeMap.containsKey(getItem())) { + event.consume(); + } + }); + } + + @Override + protected void updateItem(Node item, boolean empty) { + setGraphic(item); + if (getItem() == item) { + return; + } + + super.updateItem(item, empty); + if (item == null) { + return; + } + + setGraphic(item); + if (disabledNodes.contains(item)) { + this.setDisable(true); + this.setFocusTraversable(false); + // this.setPadding(Insets.EMPTY); + } else { + this.setDisable(false); + this.setFocusTraversable(true); + setAccessibleText(item.getAccessibleText()); + } + } + } +} diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/alma-24.png b/app/src/main/resources/io/xpipe/app/resources/img/os/alma-24.png deleted file mode 100644 index d3f01b22c92cb44a726177a08f5834f8178a1392..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1222 zcmV;%1UdVOP)P000;W1^@s654Bdt00009a7bBm000H< z000H<0a7JjcmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H11XD>w zK~zYIm6cm;R8xfrWG#<35kgpcu*^`(zF!0%Pmr&okD^Fv1$VXZJ{%BmJf5L%rJ%OdOByVfB*m5 zYwxwT=)`R1to6VG;2`b($5r#~-<{!-*3{9Ri-U%d^VbOpH!-FZaNe9CiZ&!5Rsi6V zf!pmpRejS0UpX*I?IWF??9 z(3i??{{6-xQeMJeIc7T$gCJUIb%WArjpl+?Yr?r_0c?N&E5K)%-iR%+`DP4GJp5D< z6apIp>{aE~!o-NRX5I<%BWHbwGwQFv7fFN-NIerQP7t)|kM>KB`N9B1 ze7ieRn)qiErU}T#fbxK6bnjIG=;R7hP}kl5S+WM~6<{x}^Q5*_oCL2IS_hm~cJob% zON#17clY^xw?xyNb49}spTCy!sz_m7I&|BDnV<5kT+5qXh-{6A`hZCLI#pFQ+y2Z_ zWuIGQhKfUD^9{W$YzpA>n2s8J96pm-Ui3gsBw6IS`iF5;;gP;WS#X8Tp3{%8n~!Wf zE*YQ=yu0_eud;K`hC=l#kuz9kr;s(9IqAa92Tk%gcBa#k`%TGF!m#F7j=eSbFn^akB{o(M|vBx5}+015Ri*V>mXlv;x>Gd4WLQ5x+fvc z<-qTLIh+L}gSWE5RV@q&*Qk_(h=%F8bT)89oNw?$I0qE&&q(7df*i z3sfg=E>LR?KwaZB?d4}rz}t% z*kc)qA|`$T@-P!d{CVhY=xe-zX;7Zr@#R@dV^>gfacwr{4556~j5`VfO(VD4I@)Op z)>te~q*S@7^Dj?X^=IiugqIsOEf*>xiU=yX6PTi;%+k}=PTGSkE*#1Dw~ zy>N@`u)HgdF3T0SK&>4lb{PY8D*2ep_{l6~kvRoa! k#uDHUgZhXl`X9;hFZb5@sfxBvhE07*qoM6N<$f}2M)oB#j- diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/alpine-24.png b/app/src/main/resources/io/xpipe/app/resources/img/os/alpine-24.png deleted file mode 100644 index f687d83718b11469fb40019545a9c47333a7e602..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 872 zcmV-u1DE`XP)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10`*Bm zK~zYIwUte1R96(of9JhPU!pT(8WD7%pbNF=C|y*ji}-~?s4Hbk5@RcVEGhi-6(<|7^t`q7q$?DWL`)!nVEN7M3c$9w;2=9?*8w& zzyCew-NS>=91@W)Kd2wG(uC&><1|U7*v)3JhHmp5yJ9U{JZuR0>v0 zFq}WqNz<6l^)`q|*9W!F5^n`6-GOJ2lhL@T8Z*d`kN}+(KyObcn|A|BDwR)X`9Vaw z)MM>HvgNUx=X;b}0UlLaHu_{GQfC$e&p^wHu5sE;Hva+;txaqd;lF{7<9DfPbfVG9 zW$CV#M*!3`I+4nm*FnE4x?L7nW;?M}mw?3+_Eb)}9nA*-BDINKh@4lfctx!GVdiGr z%gnsx?;_vSoN!{*LnAlaUXRR;U3bc-eGM!upxD3y-yEQvbUV#KfM}g*K&(Zht<(w+ zt9wRWVm)`xX55?{L+qa-bw|JD&e@FH|86tL?P8n-vhPDVfV8=t&4)*CZnh&{pTOS* z?iC(Z_w?GtI#OoD4Zq!?V(p34nw6ubY*OT}@fOKG0f^L_GpPOy@-NC|MW>6fTZJd0 z^a2eNJIIg)XFQ0CvJFH;`OQPW6p*+thY+uVhDWuPKSlEBj z^xFXcKkvzW5nDAV$i}JROH=xac>o2IJh;d@2l99d=uh43iwhrDe3*lBtS1>YQmax|$h^a=1`E0o_~EZV-T-kyQ-rE8`E)uqry yXiZ;h@l_xAPj+&&4wuQBQVg6d$x`yCEZzg4!2)o(4$JZY0000pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10#Qjs zK~zYIwbjjwRdpB#@XvF6O$#!?VYEU<#84!VT$CVYn}iTD(A*didew!Cc2fxh6V)oj zMKgDXcCE%m8yA5H{R0y+O>YJYA<8%qgH(<(_dYGWjmPVpJL8z&)p=gd_xrs3&hPMq z5erGmx=q4KO*@4RXy7u=S>u~HsIh2)9MUiKVo62HMa#Vv@0*@0Sj40mc2F8i*ta-=a8WvspQPS6Y67C>NBmaG?5d(z+L8a5 z(`7sR6rT5j8S6c`zsg;96o9N-CVilANZP4k^}^2H0tE7F>&>_zY?ZU_DO|^kczQm8 z&O2xr!Pb^_TR7x~wNbMTm*yjT3%$~QtS*Iaxp&dcUJRO#6;|4V*Re_J!L#_s qypF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10((hB zK~zYIwUkdtR8bU%zw_Q3YsL(d$E1S_Ayi;#3xmS8MT-{EDxy_UVy5;75`)l1ND-(p zV<8oU)FRqNn^qBpEs|=+q!unhLUfE$Geh6ZJ1v}GW}I=x#Iw7hS{K z(&S>pji1R?n-j40ZrCs4zC^eO8cyBSE9KpT-ZcTlkv5a+DJX2n1;}~_ zcF$0mX?aEg-wO2;W`R>R-cUE6Eg|a!rd80M!yKSA?s(3wl#p?P#LF24a-K2DcZWY! zKU((9X4=j;fr-(P!CZlv3@zH0crRw-F9QU6!#hAurODIk8V4quYl~IoB;ckngv){c zAv-TX+|(O@l_qyaTXzovL|bYegWgZsRf^(^*43NL~y?9j*Urpk3h2PV(&d5+yP gRJK;rjG%07*qoM6N<$f;s?IW&i*H diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/arch.svg b/app/src/main/resources/io/xpipe/app/resources/img/os/arch-color.svg similarity index 100% rename from app/src/main/resources/io/xpipe/app/resources/img/os/arch.svg rename to app/src/main/resources/io/xpipe/app/resources/img/os/arch-color.svg diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/centos-24.png b/app/src/main/resources/io/xpipe/app/resources/img/os/centos-24.png deleted file mode 100644 index 3f30ace8d3288ca175783a37f40325cf25b9750a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1162 zcmV;51apF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H11Q$s} zK~zYIot0f|R8^Bh076dPWG^KHs>y?{<Xhi#6SGavL(PpIwYC z)hn*+?2;pJ71zcE(6+nB<5&BpWmv3j2^d*C>O>y-H}V+w~_ zF=xZ#hpc+Rb+ga6VwwiXIN8lW$CnW8?&--nt&Dqn2T}@Mr)r(ZIR3U~j8(6sQ+@s2 zsWl#mx|yP9=c3u&iG)4W)%8G`h&llxBFw15S+QdEx$119D6n=j$*>Y#U7qUe2cf-E znfSPQ2CO}R{#-W2gR$!VWFlE?`wMv@-T}}ZHH=8QYR)avyh7hGrf`U$UqNwy(-OIE zb~}LO<*@WV0EA&_iWnoaZBj@k=kicIrmAhK(gvl?vC5D|nvazZ8&jGD=6eF*O8pZi z0PvjL071_wXgwI;He@BTf`}hh($i4f2cQDQB`|IRXp#hH>TzY=2;jIXdW|U_AlLPG z0&>=v@e@5gJ8!lud)dN9F>8lJ*lWenYjL7If>w`+@|9VssI4R@t7h3DmVKy*_O7W->w zy(Atg- z%BjnqH@KES>w~cLLd|c(pmnF#-b1WNr~6hz@l32TY%%W>#Xe?D%nus07*qoM6N<$g0rJ7y#N3J diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/centos.svg b/app/src/main/resources/io/xpipe/app/resources/img/os/centos-color.svg similarity index 100% rename from app/src/main/resources/io/xpipe/app/resources/img/os/centos.svg rename to app/src/main/resources/io/xpipe/app/resources/img/os/centos-color.svg diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/debian-24.png b/app/src/main/resources/io/xpipe/app/resources/img/os/debian-24.png deleted file mode 100644 index 6744c8524f49bcec150b9ed28becf4823d7ae43a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1014 zcmVpF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H11A|FK zK~zYIt(8q|R8l<1xuZoY9KL=aU(473wW(A3IWDK8QO%lDy5C3AMYL)L+f;AS|IkUZq7aD z|2y}b_wE(0W1V0c>Z3cw>eDJ_R;-@IFeY$WCa-=SAL*M|Dqoh`{Gz_)A!Fqu;GRW7 z{ubpY6~0{^96PWpmz%mFK&G+r7CV0H0hAW~yup~f1GH%NuMOv@9x~^TC+VlbUY99{e@k*+?22W>%bbUKCzg1D%5gs+KnYsZfwEeZ6NSA z;A1rHi_x+ZWWr4$D}gh>p+w%>Q!1Q|M1ohQsy|2cN8j4R#tE!cmFeO_Qf~Bj;Gebm zRoi!PWEP5Mpi*@|=nAavt5o^;RP`IcJBbTDe=Oc8@jxG#6JO9GD_RGPCI)+cDNW0S zn?j13MBXbC|E4y&V!lY!0Bf_6NU#h5Oaeod>Y8<&1`#=1X>aAws_7!J)hcpuXD(Ol zD>fajBqEj>ESpOGnectLjWmuJC|oHDcZ>2>am+kGkSS3q0T!$}c;%QCb{yux02BtE zscYWccJb${C;R$l0XBwXFN-ofwnno8^Iy?_Kbo}@DzdE;Oeff4z+aPh);MNn|E2Kw zUcJa`Qn+(YLP4p)jkSWlAjWyT!#g&!;Pi8gRH(TLV|o=EPUd?T%pyaZLv4S^8lJ_l zO;tW~#15*O4T^mZ7`1__SKH71da10vbBj(e8{O!if^dm0DY7X*c$9%8hEeF8a(;aT(g2gX_24ej}O-hN{MX0{9krWT~V$ z-Tss3f4h9sfW$!0DTFRjeJZoAx#mU$ZVCWk0=x<2ZI#)Zq0L!#K)l}@!#a;C?6z)y z$NvQ^`X;C9TQ*@O3uF^{@0Dc-0A$uR*Z5WPo*;_R4-x}Cr3s6j%6Mmkj@ zBqUWtR1L(^!B>&kl<*ITkDsCUE4L@_^Y*RTna(-)bKOmSNx>1c#tEK|Ni9WBA_QIBMCr51Kxp{O5t z5fSgz7GMxKSfb?<&|VE9;vMk1`sivBF!QwxC4V>YG$KBf5NrS@3%P5lM{QHbGyjHq zpai#2eXK4hfPX1<}U-@mS{N%T!@J8S@UjSBQRZ$;78_v16pdR-v_it#7LG~ z3|s*Y6?+y5nlk@6@aKi4;W`Ga2aaa>X5bcZF(O{p==qnr%W7Bh*QnF#sx%un^UpG2 z+SU8&@f7!{m+BF0RR@y4C^h}4PF9K2S(Ca~olJ%=P);uvnBm}v4f7)4+7*Wv;W;~;KgFn%lW5UVG$^HI!> z{vI5~)Fh@G4J?d)ZxrcM0e6zXO~Mtl!&dA~{Gwg#l*}K(3%th+oW!mYfzQI5H1Q6v z{kyuh0>ii%?JanM4`VA=T*n!_Y?HGE z=TMLK65+UugxM!Zk3zN7leikT3G--k!k@yrP6C8x zd5Uis5k|w;$c^9zz6j;KI9XR$-jppU@CNe}t_K^i0~;|nThoijDvk=m;A#k^Hy-LS zdF5f(L?O(j6T;)=7!XFuZ5?)A<%csUw14w7&1M`Edf`E}{Z66;e*xc#QaWCX1IhpZ N002ovPDHLkV1kFC1HAwM diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/endeavour-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/os/endeavour-24-dark.png deleted file mode 100644 index 90adafb9ecbaa9bd84222fd5c7339e46e3bee5c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 915 zcmV;E18n?>P)XiuNRckgPFxD52)cCT##LaFcauQe zv=rKP{nr*Diq?gKf^MpUD3VE<$uuowh%`+{D$)t<%-r|xaWToXNv3fU^@9WNzIV>| z-ShFzfgND-^~nMI*24Zya)a%X-y51ZcH>U>&$@JL!CHOtKNV1GU;Lufccq>hsMou6 zws_rI-LjL81vH<3daknf*ZDttr1i2=>C(y{*R9n(|4Kk7CVCrWXFn}IA8z_sEIx)y zO4e$$BLTIxi(2j4g+hPMtF%c_v{2Zm$}ig%P-_Fczgnmq=>7ffC zy$-zpp`KKSUVL1HskGK0Yfxw|#N|5jcJv0OvSp0Myz&s7?cc zOG7@Ndv<5!8xTdj8mP4f)mdN{z@?cNXgg4yqNk_z=smjwAVT$RMBbZTd1k)cI0)h9 zjnENtIXHZ{bqoT&Y+ZGAm)un)yRJwToP$QA8O}kHG{gI*=TQXR-A#c9W$%oQ$vN{- zJChz-Y9ewV zNs_O^Fg#+6IqO{deiWILajfS=826qDRX$jo5=6y}z#-98J@70Pr-e z%A~3O1?&E{Du60e&XEZMmdD5C#{eJ*%-2m~S=!KHEtkucMcAtn0V^DG(LmsZ54Dz(5#s^KZv8X#!6}-zNY7002ovPDHLkV1nPhrc(d_ diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/endeavour-24.png b/app/src/main/resources/io/xpipe/app/resources/img/os/endeavour-24.png deleted file mode 100644 index f34292bbbca6ff794bf27c13739743ef432aa07a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 958 zcmV;v13~#;&vqiYp&fQCm?FstaAHphBfdXk}WbBoiGcFY=hl%y*89mS7;Jndn*F%RTqU zIrjl|gn92yKm6qbo5^+cz~AIjBU96jXZ>U2NB=kY&w*D4zsskdGKksKA18;8m+$}2 zuniAC`04omMErhRypBvol}iy33VXaQnJBQPgF*D=h~OaI&6? zPt8=C?*4IN_udV1ko>iMR*RnX-tM_6Y~DYC*|B#o+>tjdu@P)oo8_+j1f0%fEcUOk zWwU+2n-_~6lf}hE&qnAfQkdvAwS&nd1M9+e;>0eT`>-0h#!tq3HvPs;Z5PGjB{PnD zZ#&n(mdV6uX!row{l#zHqt(cDZWacR!ej|(0WxbVP9|T)?7q@+eEFBj&VBWu04yxD z-WVNSg>88FNz9G`y#MRLtA;ez>zZD_I8}NF2d&LnHhT!?UI(}^)p5DFlt|ZIEkHaz z4IqLvHPPk}>A~#ds=Cp0m(#JE?O#9SFY8I~xiOh7m6%xlrrw)3<3*wxlq=J+Qkk{I zrFklqvaD1hR#u!2%_J$!B&4|}s zt57lHcM-k?Uh`gl1_%MdkUgr`|GNm=MOZx&RptP7j%A>%%A9i)YBh?r8dD=9GPAYg z+hWN6MB;@2J~!tcLG`M_A#v_&Q%#2=pG9U5Nf@5dC_3Uq@@Dpo1VP4B2V4}rrOu5U ze*FAP?YH$kr^;Xu@Ur)E#ED32O?A%Tu!*$dTnV$3h_qItXddVKq9{rT^qcAuBJ)(M zw_w((K@bO8sI8<#sHifn%6R~X$YQcw&Wmcawij7QmdklDs|2cDK-@W(Tc_(VaG?Uk zVk|mG8o-&^VxhUYPeslGlVY|_&BnxRsnFcqXYhkMw+(nlMWzHyMe-&RnMeVV@8=gL gCV(=~3A6(I4Md2H8W$3U761SM07*qoM6N<$g3#E<(f|Me diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/fedora-24.png b/app/src/main/resources/io/xpipe/app/resources/img/os/fedora-24.png deleted file mode 100644 index 6afd0a530c7543a756b99ed3b67c5acedd152a6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 925 zcmV;O17iG%P)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H111d>G zK~zYIos>&#RAm&$f9Jb*I!SpLT!~Q92-7LuR7nho8x1U~1Uj9_g47O%#IO)~n6NT2 zSJ?ntqX`RMGfj-Cozf}emW8p2ac82WGv#HW(G_Xhq)6}mj*B}Zcc$}-|K? zDUN?WKRWQJZGlv7E+r~CU}GC_y_PL9I-N<(L`_o*FP#yU$^QWd*ksUKsodPDsQKRn zmCh&Yi?+}j5NqIDi=?WP7zlS>SxY;(FL2rVX2;Z6A|8lIsOYzZ=TMa~=y*E!$5yBu zU?6-+2Wt`Kv;6VCuL0g$DaQ+^6Z60)sch+yz@Z8_YVB}aIDlc+^Ta-X_Us_Sfv~3R zce|W-5mANT>N4B_Gi(rZs4YCC`C%QqA!=LI{&()&ae>}-DWdNiRA1|;KobdE+_JFk zZ(vV@&pTaUYm;0b_!Z$VR9*rNI~M0pqjm!528IaN`*IV;t1hsqL0eOSYflx9^)CXX z$IJVym9qfTW4mU7S%7r5R8TnFYQjeEOmXmD;sehUo4S6t7uURw+JWj78NN2(V_e;* z=mv$ot>D07eE~I&bI$X`j$})p17D$-a5;PrVBFwsknbA4lIwM^_U0<{lcPJ!N3TD4 z1-L+io2?=pvOz_Prq*Buz<1WRQ1{Xb`n1wSyhFYpv$jxEKp=Ve%3}B6{lpybQ{+=1 z){cik`esLX;p)Wkf@onUG%;`B6oe1l~Y726VN9 zgPxwsB)_Q|F0c%2u8$1=aosE02KhouB8=w8lEtWLfSD!RO_5pF8nS zyMlipyz=WNX`mHg0l2Rs#hA5)iA?fIv*3RLYjY%kon^lP00000NkvXXu0mjfj+V68 diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/fedora.svg b/app/src/main/resources/io/xpipe/app/resources/img/os/fedora-color.svg similarity index 100% rename from app/src/main/resources/io/xpipe/app/resources/img/os/fedora.svg rename to app/src/main/resources/io/xpipe/app/resources/img/os/fedora-color.svg diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/freebsd-24.png b/app/src/main/resources/io/xpipe/app/resources/img/os/freebsd-24.png deleted file mode 100644 index 3b6c196d952136e0f5708f4477b1b6f8616def7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 749 zcmVpF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10(wbA zK~zYIwUtXqRACf=zw_Uljfoh7LK!j8!_??OPl6WFsz6FdCjys+1!b#h5d;N6ZK7S& z!s!8FO$cG&CPHaZfySWBLm8qNDBUt`uBf;Jz|lf*02O)!Sz?kUA<(P2aL|x18hu~tDeJUF^*$o|fRsYJ2pz!I z*`BQmJ)-(t!Q^cx1OOTb2d9iyeD4CrLCy=DnhP92T-^`+EKvGt*`@a~2jhSF;fHa> zhf)h{n+yDpqFs>N`P1v=rch`iD*#Aa)02oEn>!qUY8TyuN@pga!W&gnr68G{4ParN z$z0DT1a=_09Hj%%Di`Ojh27U(SJzK8`V7D*2ukC8;W@Dm;RcxPmf9DARj%O6ZV=p5 z>lKHU3lIPp&;yx+8r}J~;AqVP;dvp->a0M-EGxDEH2Xe{pdX7bknyY_nRMO((?vGK zvx2sGJfZNSm~?@sS;6mwJSZZ6%2??qGXz>64G0n~4qvV}4~>1EA@B!rT%#v}^aAM- z#azoxWIwh3;aES)X+ZxI{zb74`NQFF1qA@Dk=QL%j{sBigb%BwyZqsB{NF;}&!ROl z5)@aq0FRk{n*_oIkEd+6e`w@wp#~|G%tY75wQDTbK8(m-&>EluE5<@ fJTc1J1)+6m@Y5>dSvy3oD{!oz+(q5uP?LwTO1=45$QyvQ_}tY zdyF*51~#HA91J>e7VTCi&h8)GajS>9oB71&?U#Bh>t|3Mp%ai^03Xo++3+I_U-_Ei z*c-G@A4O*i)G4fAv3>W^xw%&l&%Co_f{D+rjA<{K!uySs3iAOeBJ@JPAVOAMWn8B? zcIqtk4bRYc`US`hYuo2(J@l~JD!hJZSM%TI~w9m+W}KA4{VzfQS;00#&J?p%7voif|9LDXphxUD=_cThD8%uSZH+u z#z4&=vmQyp#9|2$Q2@i27_)90{rKrjZe;<(9!H! znJ&?WMQ&7ppe=`7D*6dRL~{#?fz_J=O)Y2LB_OSb5C zZFyJIGY6=~Kb?I==EFX^VNea{?2PaH{NC7}dzs(Yvh)v=pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H11J6lB zK~zYIm6cm;R8Hm24TK~7! z%2|7h0Ti#UAL`07BeLeFAscPxQt})OEPXN?MAC_`H~ceDZeJ&ILM2#Aa}xO;#xB%8l^vFlb?2Bo+iurTuM)n)g z_;L3UodiZ19F{Q@F*^@(yW}$%zf2iFi(fmwzvyyDQ{~hy z>=A?G`2=AfW4c48?Ur@(9E?OX6mD26opehk(>oyth4`HHcbe=w#I`U+eJW}X%d`d< zJHXhkC}H0QX+7Q>`WqZTqP5|GOf$@wnGQHA+)dt?4lD-F4i;c?fA$7AXKr%8MXRZK zu4D)mPh(aGbV;_%OuK-JLHHjm^Qr1&B>JY%&zD^l0P}0sjCK~@1@;~=yy(h}b{9#{ z^gfs>)MODq(d7rl zO-(HuR`-GDZc(3_E3u<5^hz=~?$FY1b+(lgdrihl8MTSl#<%*$xuwhbq=wiZ8Dw!J(h0{;JQnD=ix~K*B4=a1o^p&C2OrTwMuXRWD#f6npzqX zg%X^h8$H=h(5WjJ|7Nn~XM3WPg(|G8tQ~j>_&~8_)u&%==olz5Kz72=BG6*Pwg_&` zjo}2wKFON9)!jOTiiN{VQf+3M0(Kbh?rqxBu>Wc;yL6b{i}Ad?51U&WE0xJ!b3t8Y zXM3WRa_&PjW|Uj(7-riMV}z|!tYm62=8*e~7R+5YPiQA_N^r&?2HXrpFNN6|jE$+1 z?B-p&UhgW#xF6sWq;8UoRfq?GQsA74A7%Pnv5Q|8dT)!-|7swJmZTb-F#rGn07*qo IM6N<$f;lGf*Z=?k diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/gentoo.svg b/app/src/main/resources/io/xpipe/app/resources/img/os/gentoo-color.svg similarity index 100% rename from app/src/main/resources/io/xpipe/app/resources/img/os/gentoo.svg rename to app/src/main/resources/io/xpipe/app/resources/img/os/gentoo-color.svg diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/kali-24.png b/app/src/main/resources/io/xpipe/app/resources/img/os/kali-24.png deleted file mode 100644 index b93abb542cf527d6bf09c798c7af830a7379fa12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 730 zcmV<00ww*4P)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10%u7? zK~zYI?UFrcQ&AMh|L4A!yf#fut4;BM97VB6(#c6^6m6iQh)s|?v`7^y z($vs^4nh$620;)V1Vt*MgPkh2ic)cE6Wdy)N$$%%E=EyPO{iJK-*ma>a(?Ihxxjz^ z00DrMQcUIQ{Ep$?48TjQYnZqWATKkK05lUlZ!=~mq?EdBK{2G1Vmj040{~T}YN3ps zMA)rCSCZA@ihk);e(jJ(+s97(NBi67Wi?v=5#GXuE zv;cTok|5AKRPDC3O3Lu#pNj!GvK5Zl$HYy7nY0it24)O!TR{-$9jeZ{eCF+oN0*8T zeu?PF=}R?P%X1Kf^&mZG818#FWhnK7I1)Qgz!ng_)4(K=ex)5KVWr>LQs#;ZI;1rH zYV8gf!uM%jKe{^{&K8>}7#%*uOvf0A6DSSAtzaAgkYS<+lrxj|U}*7MM1?~wHn{D9 z(6g1Y1c2`DQP(`wnff_bMV*@=W ziq!*WM}07J{Um5&)=1rWD5WFH5op1RiJDfb+k>G+d!VO>HBI{`Te+Ox-=~bm?gaX- z?l1LySrGw1r;In6dFMJaeFk`(fEgmBnT-^t8eZFWFuy86fj}g_3C!(8x&dH6h}s$0 zMW7^*e=^n|zP~C#QK=m9Lh&gAO=!Z#lsR|puL=qTBeA}Wsvfq??4GiIQK=}6QMY?} zFW7lo5y7nsC(}e?sm=QEvJ(9P0A10M767Qo1^}>}t9oCl-v1b10Ai5pI2sy+l>h($ M07*qoM6N<$g2<3Q+yDRo diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/kali.svg b/app/src/main/resources/io/xpipe/app/resources/img/os/kali-color.svg similarity index 100% rename from app/src/main/resources/io/xpipe/app/resources/img/os/kali.svg rename to app/src/main/resources/io/xpipe/app/resources/img/os/kali-color.svg diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/kubuntu-24.png b/app/src/main/resources/io/xpipe/app/resources/img/os/kubuntu-24.png deleted file mode 100644 index 6bd775d1cce9b2c1e41e8dd8fc32814952ea4d90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1051 zcmV+$1mydPP)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H11E@(v zK~zYIjg(txTvZf?zqND5C@r=IBub4zYl=0Mf(iyxXA+dwJhezo9!e~Y_+(NmEp}$& zLxfCb2=UVDQ>iKOLaSASmgYhelQU{S3QAP)8ZC_q38l0km`P^#^5L9JCUIt*^|;Pn z-@n$s_gO-*=ya=4ot?V?LmF$6tjIk{>)?jSX~y?gwrt+61IP z`Y{?O7MlHkfuqUY7##pMtR(deDia9p!2Jb;uA+7yiN=xKq*-+&>OPOr!PRiUnlmIq zClI>VK;J^?0{#Xn5ObcW`&@p3NOCXAt9hp~S_i-{b02|z2wVo zBJdExpo383r!N8HsE(3oyhJ3~Qv%$Z8QKX?oCVp5$S#&2hqB!Ps=Q;;PEYXsN?-N? zB>#_|N1_c(Tb?f)4Db&CmK#?W$zq8U6pNb-$aN2>1BBfn!fu-{@MFms)pt>zK^X>e z8@nt-CI>Jd-qMoOB?!Ed zg?o_(YW>MZg%>C8pv=s$vX)1Q2b(~Y@aK0UcBWwG%5i4q4pURvg3=FM0a*au45V3d zHW_*w{{T*9%fuc5Q98$~5xZ>BHI%o3uYildag5ZF2pyvK)&R;$pd8rb!vQ%(U;VuI z4m;f{EYrX(AR`DzQ62IM@GddY&|1)>Nb=VeFaXzCa<?Yc?J+TPyd!?=afE~|)%=jltn z@BDxN@0@eL3;&Y{0$%`s0Dsm60+)d;j}mYJ5I_vml(z;31o#DTJqmFjQ1I2&i38cw z(c!G0-zZtD0FK#l$Q6R-CwI(A*>)X9FD zT05P+nhley0QfI|{p?cx_6+`@8>KXInLJI0F98ezC;lx!UHY=ePRzl~O`D|!0nNp) zo@U%`SMlu7Pz_LAFS(i?1Z$u8lvGM1u-!%fyE-2Xf6u|r{dhed7w}pY8tX?(%g(cw zWl1)hl}sihwrz`u$jVC2nWS4l{ln__Pft(FgON_BC6P!-C=_xa=N?AfP`aL)Usw>^ zwqVTnb1<@bvNC8yV} z#md|#ry?@=d6xjv_tJ}!nhceFa3zZuKE~X8_{g$hil&=)jYt7~$9MR=-ZCS$ZIhl3 zF&|f)8(!j_4_AK=TlfFGrqQJmZQb@%+#lSe>1OSHc%9|gb1X0aRS{sVK%m9u?e~44 zYCzSHoC@0&0k>1y#A=_`PMYC&Gk^7yGC)3;#}+};4K)4!(z{h^Dr}Vjc04XGR2*aF z!c#knWm#C3MJ}J``pgUmb~U0K>aL-Cc}m%mj*lHF;he?dt-?sH!7CujZ3r&+>QgUb zb0@9Pbv+BDfE-{QJGgC6AuHM@(^>`C1!5PA!;w=HYaYK6pzFky=l P00000NkvXXu0mjf31z** diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/macos-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/os/macos-24-dark.png deleted file mode 100644 index 80799c9d315db6b9801e078575539acdcc8456b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 466 zcmV;@0WJQCP)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10bfZ( zK~zYIt<}Fu98nmC@$aY+MM9bsY9WFtB#_Eodndt7>w>$&SbKWy&zKQ5En8A1Kb<6l4d=>Ya`Pysv zYzYnvy%zi^!GEH!m+%4H7Vv$%$OVpI9H}JO#2gaF@CKuuf|qezI*JQ?D!^~?5vLyJ z1Rov)_u;d=Y?qm>FK9g?mO852p4WI*wfmR2$=v-e`s*4jM#ON&&VNV5N=oUzPVg=R z9uaYnQu@`pSQd0knx5es#;Z7g0g9B>XGWtWn*aa+07*qo IM6N<$g1#@wj{pDw diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/macos-24.png b/app/src/main/resources/io/xpipe/app/resources/img/os/macos-24.png deleted file mode 100644 index 45931b6693b752abcb3b0dfe0a38dd4c55ac10bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 434 zcmV;j0ZsmiP)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10Y6DZ zK~zYIt<|wE1VJ3f@ehtjL^KMgKtiF>C?pCJg%^-0G+qFS2OtuaNALiILMcduLaPy# zl8%Jt3WCTfcI5_p%ii2CnPz79`<_R_U0>L_F(!Mgr&{q_^h%2?Nc*J%J9>)f5g7GS@G5;616+1tE zEZR2n1nZITDh|+|1@FakB>V_%^=7{k34g)hPiT0CC+eC1nRDFb3CfXz+pNw|P>K{} zUb;|lA1RnpyO5cJn@GU`7VqM@{ZLnXt+gh*v(twKT}FYnHf?m z$Bnipbmz@rD^jrZ*AhE@FV#ibg`8RxW&{rf;kOD_gJH?DSiz;_WDHAQxlyd8E4|0Q cb%707*qoM6N<$f=ltW6#xJL diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/manjaro-24.png b/app/src/main/resources/io/xpipe/app/resources/img/os/manjaro-24.png deleted file mode 100644 index d0dc66ccf84a8a8133b67699abc9c51ff5602c61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoCO|{#S9F5he4R}c>anMprB-l zYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&Ktlyw!3+Mbi^Y1P46+Wc dU~N9g#BkqAg0G2ZPB73J44$rjF6*2UngHzmSHS=P diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/manjaro.svg b/app/src/main/resources/io/xpipe/app/resources/img/os/manjaro-color.svg similarity index 100% rename from app/src/main/resources/io/xpipe/app/resources/img/os/manjaro.svg rename to app/src/main/resources/io/xpipe/app/resources/img/os/manjaro-color.svg diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/mint-24.png b/app/src/main/resources/io/xpipe/app/resources/img/os/mint-24.png deleted file mode 100644 index 55a34ccdb0576b93c59967c15e41c8bfd1c156d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 801 zcmV++1K#|JP)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10}fXIfA`Kk_y4=++;boNXGzkp zYXm^$TTupLhfLP#AKKXY-VKShRU(#J zX`MM0z~{ege4%3Z8e^6jYql!1qjaijeO8b1G}C4RY5XJ_)v-9HP`fHE~Mj?s*&?RMCV?niBDO<0v@zzQeSEkqWZ22hQh0QLcK;O2OY^MY;?k@-M<+1z=( zgFglph)#Po9AQS*_Asw$oBaamp2B9~K-WQecQ@RUFfIUEYVK_ud zziu<=ErRKofj)-<06f2bVHDd090DqeFdr3_rbz+$YU_=!u|$?)WzlrpF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10$52z zK~zYI)zeLg)nyb0@Zb60dlOwmi(Hh{K!~((AyFY%BrehxCB$fpkhJ0cuTUd|i)d3; zn;kPmhXM@yrd}nM4&|;(+w6a8|{c z81O?^0m!=7h5NCl3;6{0Xn8Y6j7`@?b;{SYPq?kqW$miSxUgH;9)o_Hj`(kMy`roe zQ20n%f|hVh`XZVpXF_~KWZeVV@Z!z#RI~IN9>pqQk@SwXz8H2m8%Cja1@g! z>{RmxMulqU@{Zty)FTZjJXlCy<4=qjGA0~}_Z-hsEr#sKhD{)h;R1F`n^ip|EyX@9 zANXruqtWyheph%~)xoNecpigFuV_1!rT1|z>&{8fW!<=t(mm1^98mL#%bvzD6;Dd} zk1yd6w#K`DErfYeMPWTQ3Xfx@v|m*d7h~ARozkD8sUJ^hc`BNEF(Pff&iW-CyA;wR z!kQR#Lg>Xw;YV!HvJe-tp;uagW!bP9-$)Cyv_-lVpJB1IKI@(pmTT*qa_hNG0lCgC zkp1R$yO4ar{4B5eC;tw)P9;l+vro@#Ym1pA#fMtLUKKCTi2%4{7^|~%@0gDl-KXXO7$TmfPD&#)@uM!5h0002ovPDHLkV1iGLNE847 diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/netbsd.svg b/app/src/main/resources/io/xpipe/app/resources/img/os/netbsd-color.svg similarity index 100% rename from app/src/main/resources/io/xpipe/app/resources/img/os/netbsd.svg rename to app/src/main/resources/io/xpipe/app/resources/img/os/netbsd-color.svg diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/nixos-24.png b/app/src/main/resources/io/xpipe/app/resources/img/os/nixos-24.png deleted file mode 100644 index 2a9ebf5ca2278632adaf31a32b04546fa1380f01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1098 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 diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/redhat.svg b/app/src/main/resources/io/xpipe/app/resources/img/os/redhat-color.svg similarity index 100% rename from app/src/main/resources/io/xpipe/app/resources/img/os/redhat.svg rename to app/src/main/resources/io/xpipe/app/resources/img/os/redhat-color.svg diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/rocky-24.png b/app/src/main/resources/io/xpipe/app/resources/img/os/rocky-24.png deleted file mode 100644 index e163c535172180c692bfc699bcb0aa55834697ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 683 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 diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/ubuntu.svg b/app/src/main/resources/io/xpipe/app/resources/img/os/ubuntu-color.svg similarity index 100% rename from app/src/main/resources/io/xpipe/app/resources/img/os/ubuntu.svg rename to app/src/main/resources/io/xpipe/app/resources/img/os/ubuntu-color.svg diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/windows-24.png b/app/src/main/resources/io/xpipe/app/resources/img/os/windows-24.png deleted file mode 100644 index 7865d75091239dbdc357eca172d5955e95421237..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoCO|{#S9F5he4R}c>anMprB-l zYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&KtJzf5#QRRGuakwz3R&L`^RY)0Y?^j4lcu+w~y~E u^)d@q_}?A4OMUiA^`lcabt^RO=hBlb<6F%o=z0`r1%s!npUXO@geCw23`HaW diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/windows.svg b/app/src/main/resources/io/xpipe/app/resources/img/os/windows-color.svg similarity index 100% rename from app/src/main/resources/io/xpipe/app/resources/img/os/windows.svg rename to app/src/main/resources/io/xpipe/app/resources/img/os/windows-color.svg diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/zorin-24.png b/app/src/main/resources/io/xpipe/app/resources/img/os/zorin-24.png deleted file mode 100644 index 3ce6b2d3ccb4056a69b4bd4f3f5ba560f8477284..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 662 zcmV;H0%`q;P)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10wYO8 zK~zYI-IYy96;Tw&f9KA7V~F_1)F;^@h(4jBO^bE~?Sl{r%|KkV3bYck2wNmY*sDb? zf@XO`@3juH@=AEo9XV%>$XcU^~bA8RzY59Dq za@b!C-+BElUIrlBU`9a)*E!N_)o6IG&q=`B9#?jWM%PrMF55PDfOFDXs_ZdDZ-DF? z=xLNIZm;t+p4j@Z((2pMFv=j%uq-cGga getExitUuids(); - Optional getSourceStore(); ShellControl withSourceStore(ShellStore store); diff --git a/core/src/main/java/io/xpipe/core/process/ShellDialects.java b/core/src/main/java/io/xpipe/core/process/ShellDialects.java index 1cf9fbd4c..391ef2489 100644 --- a/core/src/main/java/io/xpipe/core/process/ShellDialects.java +++ b/core/src/main/java/io/xpipe/core/process/ShellDialects.java @@ -22,9 +22,8 @@ public class ShellDialects { public static ShellDialect ZSH; public static ShellDialect CSH; public static ShellDialect FISH; - + public static ShellDialect UNSUPPORTED; public static ShellDialect CISCO; - public static ShellDialect RBASH; public static List getStartableDialects() { return ALL.stream().filter(dialect -> dialect.getOpenCommand() != null).filter(dialect -> dialect != SH_BSD).toList(); @@ -51,8 +50,8 @@ public class ShellDialects { ASH = byId("ash"); SH = byId("sh"); SH_BSD = byId("shBsd"); + UNSUPPORTED = byId("unsupported"); CISCO = byId("cisco"); - RBASH = byId("rbash"); } @Override diff --git a/dist/changelogs/1.7.14.md b/dist/changelogs/1.7.14.md new file mode 100644 index 000000000..38ca4f578 --- /dev/null +++ b/dist/changelogs/1.7.14.md @@ -0,0 +1,3 @@ +This is just a small hotfix update to fix a few breaking issues: +- Fix performance regression in JavaFX by downgrading version temporarily +- Fix .deb installers not being able to resolve some packages on Ubuntu < 22 diff --git a/ext/base/src/main/java/module-info.java b/ext/base/src/main/java/module-info.java index 8007ac0ef..5fa9585f7 100644 --- a/ext/base/src/main/java/module-info.java +++ b/ext/base/src/main/java/module-info.java @@ -59,7 +59,7 @@ open module io.xpipe.ext.base { DeleteStoreChildrenAction, BrowseStoreAction; provides DataStoreProvider with - SimpleScriptStoreProvider, ScriptGroupStoreProvider, + SimpleScriptStoreProvider, InMemoryStoreProvider; } diff --git a/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/binary_icon.png b/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/binary_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4cd02c8641efea4ae7ce744ff13bc3137196f9ac GIT binary patch literal 4094 zcmeHJc~Dc=8b4VepdhKJAXuPUM5+*~0tG>$U=;Ey`o7CqSVwDmXRuS+g}X@!Ip|FVN9lsHgv>;aA2>mzjRE ze1-Y9*0yWx);bW^Id1rV)8;L%?mu{ve%$8e?X!J{uYbVKz@U)OgOSlOl-Rg<8l3?h zPCRik<@9f7Qq#_!JAWY~^YWG4y!`7oif)%y!w+g6*4EWGJbK*N^87_xJL~1EPHtEC z>o>i9?*@nXf|0TD3883mN+xGEIdYNBsp;&rjugx0ck-$8+7{N2IxcXw^42Gzt>#}{ z+L4DX+TTiQQBBp=3@FY{B9g8-g{;4D<;OdE5BJXcrO3Ha!O?;GcE(Wl2)+y6L+_Gg zvMfa_vjmBDE2w;1ucU!R*Imrw&--Lt(}=O{MIk$`vd{5qM99(i-*l0uP zF44&}#(u|}L#i5j`reOt4;IyopBokwWRA14)`<_e9hI|JZD86|wNM2iK!JsuzAUo>SOr^Va|t2sfE(paD0#4m#?#c$hi|1 zk;9qG9V)hF2}=9+!9}2s*19Td$X|+&a;trVvXa&zO-uzXWu*lJdO;`rK&#-># z`!Y%{ui#I;L^wU{0=;#Ls@NPVJU%Png=)Zy7`gn)K}EtH;q2J~&s77SBfL0cNJocR zsmZM5OJ#0T9Rv#ywum!Dg_meaKoKf0Qhp2lGZzPG6062iw2j8sf}g;8eD+ab;KPpU(Q%xi6X0Y>Ptp04$I z`?SFvx)E344c;yw9zlIF#VH&ZE0K?lDzariNMzt$P=x z>l$9*wM6LF8w_6p;t(L#e)UfBg#nL2uHV1w z*#!LuRM}`B>V!!JOBgm*N%jUItDC7d7ZvJ1nV&m~`n+7U7#PQYnf0f*+BnQPNsE<0Kn@g@z8gES- zi{|5W3&@#D!>Bk{)5srYqi#sn1MVpDNph*ATVl40jsgv_2D*Q;B^^CYhPF2>o)(Qu z(PTB|#w~q}t??Ze>hOHD7&6$!Gyo5?miS(uIbXQFgb__fAX7c2OF*^Hcogx|bn335p%e9A0kqknX0r&G!n&3lIC1 zwiDpuXGd|(EAPs07gYFOL9!Twn+NzT=;%7$O2E9ktzBwV8lN*XSM|>Da#Xlkp-gHv zcGb^ZA7l*vsXXU)cW{gY4B1|_7^204pz^FG|y;)TS5x%z(4}CXKB=G=`6`fI}H3xjzrR+nBwrVHJL})Y36x^iLxVbEs9Pqd0+Cihct=r@w z4af-%-JJ=goo0KLxLR`<_sn`+?aT4uWDSS|_oYi-$>Y7wet$Oo5!s&m+hmS`@7NCB z`%R{8G)oZ5o2n2jrVUCPRnNuzDQuMJ8DTROJVAxu9Pi(*;qmtVqHWgOPImbzyEzkkmbpV)j4 z)?DKUPd&V>{I9pyvLK_#UXf2+dEma^FJe6}_F8W-U(;&ieg3u0{qZbC`ZZ}#Q+uk! YVXJY(z7Wo0{B%Rk8@4*#Tpw`cU%yMWDgXcg literal 0 HcmV?d00001 diff --git a/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/file_icon.png b/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/file_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..93f85eebd9a3c12d8659020dd27e1358f6372e1f GIT binary patch literal 3681 zcmeHK`8(8Y7r(zIQ;ntfEj!_PBD9QUQWMFfWSLAJMo~kPJ=umqwtUMak1Z`qX=HlP zAhg)VWZ&jNq-iEfmYE?@3=$#cnfH4ChxeDa^TRpk`rPN7>pGwNKG$`h6i0%M97+uZ z0Fbk@J>~>}l*E++n-CJy`dH_001&|O1kqY77E6#{@{580PX=Um)bJ&pKc_kooBam6^mpyqi#9Yi!IBfv zYJJ?+4o~=lc-qzN%vq8<`Mj66k6%DAB|IW3IyNo=zM7bHEhRNAJtOmGR`$J|2M_Ze z{gq!(RQ#m0{CP!Xbq%wY^|G$Mp|QEOjosP(s;9T_4d*Slf8hP#(D2A8UmzSC|1>c< z_2ujIjA(Xl{@cR$#ibw1E2}@()_VdkOXeAM&hFR|;w6vip}|aA#CGbQn30L-%O^)f{o@m!IlXn}72m#m#l+{L_P90%gz^Q} z@f6D^4)xy_pVuskclH)`C)`-62~<)2b4LgNTwR<_ur+=Q`CI*NVOy9W)-X5qZ1XLI z>)aTRA~^V?Cy}zNKOMU;Hf7i%UKY1XtB+hV4{o=YBYzqAiT$l-c!6QrQAWHE#RZ=J zR95xAscPeJ>e)wIwO*K>`<%J$l$f=~7M^-s2d*_xFVmWQpAN5PGZhUC;h-E#yo9XGP*1y z@o~Z)mM(g{6GhgMpQ5fr-bpZesL(Vk3A=z{r&+3*A3FM+fFOqW31Bd9TYs`HuAjiaOAr))d4Ad}Dp4K!qGU!oNGaTjQAp7VpFJEUk zPs`HncJyd%RKev3$LgaaFtD#hs2?f77sw4>_99LB0J#UoAHG_jlA~V;?=Vbt&XuK8 zv~rl*1XC0EQ<;YOkoCI&Par+eH<}%!g4=v}-JcZT1+1B(awfMObUlj?CrQqIuzm|& zSY9hY8OI6)SY8XTf9~&jo;F1W?M&~$NLm0HjJr1GU$M!*V(BFADa&jxj6piyik-QR zAD5-;4~C@Tc@i6+|3yGFM(B5!&hfD>-2hb)>iGw4mk%gho*kfJT{=N(MKC)Z>+(0~ z3diTNA*3Vyb(|TRXAEz(poEilc>&!ib$2aBi3;v!Z!S}ZplA%6xmsz2em`R-1urd2CufeRWyc{MpEXPz7i9GU`~Bg8KC~CA zxHm|>WI@&|&{gdj=Rpfo#qr-A8q{JCk&djMlWn?pAO%tRs^C^9=vo@M%hWM}l?I}N zNb@Q<8QHHMii~~8KBUaf><)u8sIuk7+%m=96HJFLmtVn-8^L#(>z&LoBe;5CMgld07DEQpn2@k&8p{vtt@O4T zesBcgpZ{cj7^Q;SJ=FLcdPq`o3cu_vsrucCZ45Q znb)Y6tt5$Zh@V))RwY9^KU$-N98I1_V!EJksfM>2kr^$k-F`A*)mBb9vivGEhFz%= zZF#DqnI3+tmQibUf&&#m-Us8b=;*^M%S@_SJmvFs%MC56fCe@FQolI(^$z~WW1uT- zq`1*#?<883c{Ga9asES}Es0zB2zz4nq6X`>LQ@L%L@ZXmYheOQ)tl5Ey`({`DtLLw z0A3Q(OYVG^osE$I2Lye&1wdXaJ*^~SHk2eu!}*115X(x<5ABA}v5)Y&SgjRO17dp; zvGDXFyAbaNQ9W$U?sLRmQ%Owf#p4>R2r9n|TWn$|)4>BDY8jO^LjduxK~YHD``$jQ+5d(v~{-0)G)t1dRo+O(L4g_h4)M|d@L9Kvmw}7 L6ONTzk+1#(ol(}E literal 0 HcmV?d00001 diff --git a/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/httpRequest_icon.png b/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/httpRequest_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..850592c2e4c7c2f8257a02b3db3a26fff18f07a8 GIT binary patch literal 17825 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

;J*ZN>G)W4z=)4cnYBd=*inL4K zzc<|&i~(-H(Qm{m1!JcXY$PRZC4^;MG`!UpyM4Jrd>?O!l#!9|fJx0TNvV`)c-m0sLq@-?1Iu2iXJwjZWYz+loK<_Qt4n;>9 zT(Xw>=g1DqG#XxPrw$U{+*Xb+iX6`z16odwY3=ndk~;fdmy;;aSX7xAwxDX+vSv*6JmB zd+1J+0peys=dJi3gaY@`ILFFNZOo$4?4Q!XLaJ#4nYhl7a};chfQc38<>T8te0{st zVede^_uU?s$n%F=*)MBEByXE5>x>oe!Wtp&kRnJSUD?Q%pE}9D6xwAv5Z1^T8htKa zV(!~K(fkhDiET-A+aQZJ%HYUUYVIi;s9p ztzuL11cPV5Z44fXISr>^H?}F}Wh_|66Hj7ic0x=_I#r0JV4hDu%s!_*I}K%7uzhs; zG`kheRdawMNrEX<=`B2m3V*EcqTDC5b5>EK|Kv+{(?q1W4q>DA zmnagRe+$k%5!q|OY4DYbNFCEj(8OlDZ=m=_9fGl-$^3n$Lj0NY(w>4c+=t zZI_)qy}jjapt=Zs;;zHxYr}UJemm1m1mPQTw^zYXv%?TEcS4h%+z9urrUaC%%?^~kt;V(+0gF6-4JQG)PglCoJ$ z5`E^5KmSeKsxnIxh9q%a-IZ!fIbR=fr+*5kkUqCH%)psg8it+Bp$Fr2tl2+ZRZ?{b z7)_F<5#_n=-ty0_?VDTAUPNV?rK%8NkG`Nj{sbfWF|hBL5>{_*GB9=``Skt5Y75q|=8ELCO49QookbC% zVT$b`xQaf!-sD<)%RPO z#YD}W41fY)x;8E`EGrfd@t*5c7 z!!w)PT_TOJr}OkVX`YS}3Nh)gFE9E!xgDLLl@lO(y z74A^-P#O%qha7^b7;Ki=*wfoG*f!kFwQzl_@b$8zBHxpp!GEJGOkCemhcn)$K2(t0 z)DZausF~kJTgG+zeO~|2Yp22ecooeNpDC~L)!3qxS)SC$Cur^q+G2{~I}Z<(@#E-C zBEFIujHT#;NVHg1V)dnJvvt9F+(!dKE3q|!b2Egw^6C|fv6esOP;dP;uIit}q1P9) zoD;8F-UVgIp^4m_i9PCmZ`r~y4PJlB)R3RAO+e9myLb)!b%eMW zd$l$r9;r;BK?}>Ut(d$!)Af~7hk=P7RfovNAY<(RXF8i3x3d55b1S#~;QF9q-jBcD zLFaD^{b0Mhm3j72qc}_U3Qe}{lT6lK?f82BdcfbKx05oL>ZldDz3Ed~nJL_{m(5RA zEqc?x=53Nj08&WB*^B8m)wt z+wS<@c{`gmXcE`$t{n{boxe6WE;T<@r1Yakb??mG4yKQc9IhS|0d5;u-6$@+`;ez* zEY}~IAF2~4J5IWixJY~@hk zK?zlhW*#W+;AvqOvc9?Uw~q3?hx5HuUhZU(f9vg^z@X5Z8~tGBfqTuVm$POs4%A`z z#}{J|@vkrXtyeN|Sa;TDJ3)array|=6OxwdzViM4;YUI}V}WGhb^VpVLEfP1Fve|+ z+t}xsMU)+#^Fh;==~sea;eD_vt?)x7eqLD`#4Oj#FXqboFyt=akR{0E(D^yZ`_I literal 0 HcmV?d00001 diff --git a/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/http_icon.png b/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/http_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..850592c2e4c7c2f8257a02b3db3a26fff18f07a8 GIT binary patch literal 17825 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

;J*ZN>G)W4z=)4cnYBd=*inL4K zzc<|&i~(-H(Qm{m1!JcXY$PRZC4^;MG`!UpyM4Jrd>?O!l#!9|fJx0TNvV`)c-m0sLq@-?1Iu2iXJwjZWYz+loK<_Qt4n;>9 zT(Xw>=g1DqG#XxPrw$U{+*Xb+iX6`z16odwY3=ndk~;fdmy;;aSX7xAwxDX+vSv*6JmB zd+1J+0peys=dJi3gaY@`ILFFNZOo$4?4Q!XLaJ#4nYhl7a};chfQc38<>T8te0{st zVede^_uU?s$n%F=*)MBEByXE5>x>oe!Wtp&kRnJSUD?Q%pE}9D6xwAv5Z1^T8htKa zV(!~K(fkhDiET-A+aQZJ%HYUUYVIi;s9p ztzuL11cPV5Z44fXISr>^H?}F}Wh_|66Hj7ic0x=_I#r0JV4hDu%s!_*I}K%7uzhs; zG`kheRdawMNrEX<=`B2m3V*EcqTDC5b5>EK|Kv+{(?q1W4q>DA zmnagRe+$k%5!q|OY4DYbNFCEj(8OlDZ=m=_9fGl-$^3n$Lj0NY(w>4c+=t zZI_)qy}jjapt=Zs;;zHxYr}UJemm1m1mPQTw^zYXv%?TEcS4h%+z9urrUaC%%?^~kt;V(+0gF6-4JQG)PglCoJ$ z5`E^5KmSeKsxnIxh9q%a-IZ!fIbR=fr+*5kkUqCH%)psg8it+Bp$Fr2tl2+ZRZ?{b z7)_F<5#_n=-ty0_?VDTAUPNV?rK%8NkG`Nj{sbfWF|hBL5>{_*GB9=``Skt5Y75q|=8ELCO49QookbC% zVT$b`xQaf!-sD<)%RPO z#YD}W41fY)x;8E`EGrfd@t*5c7 z!!w)PT_TOJr}OkVX`YS}3Nh)gFE9E!xgDLLl@lO(y z74A^-P#O%qha7^b7;Ki=*wfoG*f!kFwQzl_@b$8zBHxpp!GEJGOkCemhcn)$K2(t0 z)DZausF~kJTgG+zeO~|2Yp22ecooeNpDC~L)!3qxS)SC$Cur^q+G2{~I}Z<(@#E-C zBEFIujHT#;NVHg1V)dnJvvt9F+(!dKE3q|!b2Egw^6C|fv6esOP;dP;uIit}q1P9) zoD;8F-UVgIp^4m_i9PCmZ`r~y4PJlB)R3RAO+e9myLb)!b%eMW zd$l$r9;r;BK?}>Ut(d$!)Af~7hk=P7RfovNAY<(RXF8i3x3d55b1S#~;QF9q-jBcD zLFaD^{b0Mhm3j72qc}_U3Qe}{lT6lK?f82BdcfbKx05oL>ZldDz3Ed~nJL_{m(5RA zEqc?x=53Nj08&WB*^B8m)wt z+wS<@c{`gmXcE`$t{n{boxe6WE;T<@r1Yakb??mG4yKQc9IhS|0d5;u-6$@+`;ez* zEY}~IAF2~4J5IWixJY~@hk zK?zlhW*#W+;AvqOvc9?Uw~q3?hx5HuUhZU(f9vg^z@X5Z8~tGBfqTuVm$POs4%A`z z#}{J|@vkrXtyeN|Sa;TDJ3)array|=6OxwdzViM4;YUI}V}WGhb^VpVLEfP1Fve|+ z+t}xsMU)+#^Fh;==~sea;eD_vt?)x7eqLD`#4Oj#FXqboFyt=akR{0E(D^yZ`_I literal 0 HcmV?d00001 diff --git a/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/inMemory_icon.png b/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/inMemory_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..be3a902914c6356ddbb5e457d1383e591ab75885 GIT binary patch literal 11312 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