diff --git a/app/src/main/java/io/xpipe/app/comp/base/ListBoxViewComp.java b/app/src/main/java/io/xpipe/app/comp/base/ListBoxViewComp.java index 918879fd4..c56aa25a9 100644 --- a/app/src/main/java/io/xpipe/app/comp/base/ListBoxViewComp.java +++ b/app/src/main/java/io/xpipe/app/comp/base/ListBoxViewComp.java @@ -3,7 +3,6 @@ package io.xpipe.app.comp.base; import io.xpipe.app.fxcomps.Comp; import io.xpipe.app.fxcomps.CompStructure; import io.xpipe.app.fxcomps.SimpleCompStructure; -import io.xpipe.app.fxcomps.util.BindingsHelper; import io.xpipe.app.fxcomps.util.PlatformThread; import javafx.application.Platform; import javafx.collections.ListChangeListener; @@ -67,7 +66,7 @@ public class ListBoxViewComp extends Comp> { .toList(); if (!listView.getChildren().equals(newShown)) { - BindingsHelper.setContent(listView.getChildren(), newShown); + listView.getChildren().setAll(newShown); listView.layout(); } }; diff --git a/app/src/main/java/io/xpipe/app/comp/base/ListSelectorComp.java b/app/src/main/java/io/xpipe/app/comp/base/ListSelectorComp.java index 64d001c40..352943eb1 100644 --- a/app/src/main/java/io/xpipe/app/comp/base/ListSelectorComp.java +++ b/app/src/main/java/io/xpipe/app/comp/base/ListSelectorComp.java @@ -28,6 +28,7 @@ public class ListSelectorComp extends SimpleComp { vbox.getStyleClass().add("content"); for (var v : values) { var cb = new CheckBox(null); + cb.setSelected(selected.contains(v)); cb.selectedProperty().addListener((c, o, n) -> { if (n) { selected.add(v); @@ -35,8 +36,8 @@ public class ListSelectorComp extends SimpleComp { selected.remove(v); } }); - cb.setSelected(selected.contains(v)); var l = new Label(toString.apply(v), cb); + l.setOnMouseClicked(event -> cb.setSelected(!cb.isSelected())); vbox.getChildren().add(l); } var sp = new ScrollPane(vbox); diff --git a/app/src/main/java/io/xpipe/app/comp/source/store/GuiDsStoreCreator.java b/app/src/main/java/io/xpipe/app/comp/source/store/GuiDsStoreCreator.java index a99ff05ad..b23e9637e 100644 --- a/app/src/main/java/io/xpipe/app/comp/source/store/GuiDsStoreCreator.java +++ b/app/src/main/java/io/xpipe/app/comp/source/store/GuiDsStoreCreator.java @@ -82,8 +82,8 @@ public class GuiDsStoreCreator extends MultiStepComp.Step> { }); this.apply(r -> { - r.get().setPrefWidth(AppFont.em(32)); - r.get().setPrefHeight(AppFont.em(38)); + r.get().setPrefWidth(AppFont.em(36)); + r.get().setPrefHeight(AppFont.em(42)); }); } @@ -92,7 +92,8 @@ public class GuiDsStoreCreator extends MultiStepComp.Step> { ThreadHelper.runAsync(() -> { e.applyChanges(newE); if (!DataStorage.get().getStores().contains(e)) { - DataStorage.get().addStore(e); + DataStorage.get().addStoreEntry(e); + ScanAlert.showIfNeeded(e.getStore()); } DataStorage.get().refresh(); }); @@ -102,7 +103,8 @@ public class GuiDsStoreCreator extends MultiStepComp.Step> { public static void showCreation(Predicate filter) { show(null, null, null, filter, e -> { try { - DataStorage.get().addStore(e); + DataStorage.get().addStoreEntry(e); + ScanAlert.showIfNeeded(e.getStore()); } catch (Exception ex) { ErrorEvent.fromThrowable(ex).handle(); } @@ -218,11 +220,6 @@ public class GuiDsStoreCreator extends MultiStepComp.Step> { return new LoadingOverlayComp(Comp.of(() -> layout), busy).createStructure(); } - @Override - public void onContinue() { - ScanAlert.showIfNeeded(entry.getValue().getStore()); - } - @Override public boolean canContinue() { if (provider.getValue() != null) { diff --git a/app/src/main/java/io/xpipe/app/comp/storage/store/StoreEntryComp.java b/app/src/main/java/io/xpipe/app/comp/storage/store/StoreEntryComp.java index 76ce62776..596fba1cf 100644 --- a/app/src/main/java/io/xpipe/app/comp/storage/store/StoreEntryComp.java +++ b/app/src/main/java/io/xpipe/app/comp/storage/store/StoreEntryComp.java @@ -5,6 +5,7 @@ import io.xpipe.app.comp.base.LazyTextFieldComp; import io.xpipe.app.comp.base.LoadingOverlayComp; import io.xpipe.app.core.AppFont; import io.xpipe.app.core.AppI18n; +import io.xpipe.app.ext.ActionProvider; import io.xpipe.app.fxcomps.Comp; import io.xpipe.app.fxcomps.SimpleComp; import io.xpipe.app.fxcomps.SimpleCompStructure; @@ -161,6 +162,14 @@ public class StoreEntryComp extends SimpleComp { }); }); + + new PopupMenuAugment<>(false) { + @Override + protected ContextMenu createContextMenu() { + return StoreEntryComp.this.createContextMenu(); + } + }.augment(new SimpleCompStructure<>(button)); + return button; } @@ -182,9 +191,9 @@ public class StoreEntryComp extends SimpleComp { }); button.apply(new FancyTooltipAugment<>( actionProvider.getName(entry.getEntry().getStore().asNeeded()))); - if (!actionProvider.showIfDisabled()) { + if (actionProvider.activeType() == ActionProvider.DataStoreCallSite.ActiveType.ONLY_SHOW_IF_ENABLED) { button.hide(Bindings.not(p.getValue())); - } else { + } else if (actionProvider.activeType() == ActionProvider.DataStoreCallSite.ActiveType.ALWAYS_SHOW) { button.disable(Bindings.not(p.getValue())); } list.add(button); @@ -242,9 +251,10 @@ public class StoreEntryComp extends SimpleComp { }); }); item.textProperty().bind(name); - item.disableProperty().bind(Bindings.not(p.getValue())); - if (!actionProvider.showIfDisabled()) { + if (actionProvider.activeType() == ActionProvider.DataStoreCallSite.ActiveType.ONLY_SHOW_IF_ENABLED) { item.visibleProperty().bind(p.getValue()); + } else if (actionProvider.activeType() == ActionProvider.DataStoreCallSite.ActiveType.ALWAYS_SHOW) { + item.disableProperty().bind(Bindings.not(p.getValue())); } contextMenu.getItems().add(item); } diff --git a/app/src/main/java/io/xpipe/app/comp/storage/store/StoreEntrySection.java b/app/src/main/java/io/xpipe/app/comp/storage/store/StoreEntrySection.java index 80aa8e4d5..756782d7d 100644 --- a/app/src/main/java/io/xpipe/app/comp/storage/store/StoreEntrySection.java +++ b/app/src/main/java/io/xpipe/app/comp/storage/store/StoreEntrySection.java @@ -7,6 +7,7 @@ import io.xpipe.app.fxcomps.augment.GrowAugment; import io.xpipe.app.fxcomps.impl.HorizontalComp; import io.xpipe.app.fxcomps.impl.VerticalComp; import io.xpipe.app.fxcomps.util.BindingsHelper; +import io.xpipe.app.storage.DataStorage; import javafx.beans.binding.Bindings; import javafx.collections.FXCollections; import javafx.collections.ObservableList; @@ -28,12 +29,17 @@ public class StoreEntrySection implements StorageFilter.Filterable { public static ObservableList createTopLevels() { var filtered = BindingsHelper.filteredContentBinding( StoreViewState.get().getAllEntries(), - storeEntryWrapper -> !storeEntryWrapper.getEntry().getState().isUsable() - || storeEntryWrapper - .getEntry() - .getProvider() - .getParent(storeEntryWrapper.getEntry().getStore()) - == null); + storeEntryWrapper -> { + if (!storeEntryWrapper.getEntry().getState().isUsable()) { + return true; + } + + var parent = storeEntryWrapper + .getEntry() + .getProvider() + .getParent(storeEntryWrapper.getEntry().getStore()); + return parent == null || (DataStorage.get().getStoreEntryIfPresent(parent).isEmpty()); + }); var topLevel = BindingsHelper.mappedContentBinding(filtered, storeEntryWrapper -> create(storeEntryWrapper)); var ordered = BindingsHelper.orderedContentBinding( topLevel, @@ -101,7 +107,7 @@ public class StoreEntrySection implements StorageFilter.Filterable { new HorizontalComp(topEntryList), new HorizontalComp(List.of(spacer, content)) .apply(struc -> struc.get().setFillHeight(true)) - .hide(Bindings.size(children).isEqualTo(0)))); + .hide(BindingsHelper.persist(Bindings.size(children).isEqualTo(0))))); } @Override diff --git a/app/src/main/java/io/xpipe/app/core/AppI18n.java b/app/src/main/java/io/xpipe/app/core/AppI18n.java index 47b0750cf..fcde61e60 100644 --- a/app/src/main/java/io/xpipe/app/core/AppI18n.java +++ b/app/src/main/java/io/xpipe/app/core/AppI18n.java @@ -18,6 +18,7 @@ import org.apache.commons.io.FilenameUtils; import org.ocpsoft.prettytime.PrettyTime; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; @@ -37,6 +38,7 @@ public class AppI18n { private static final Pattern VAR_PATTERN = Pattern.compile("\\$\\w+?\\$"); private Map translations; + private Map markdownDocumentations; private PrettyTime prettyTime; private static AppI18n INSTANCE = new AppI18n(); @@ -189,6 +191,10 @@ private static AppI18n INSTANCE = new AppI18n(); return name.endsWith(ending); } + public String getMarkdownDocumentation(String name) { + return markdownDocumentations.getOrDefault(name, ""); + } + private void load() { TrackEvent.info("Loading translations ..."); @@ -210,6 +216,10 @@ private static AppI18n INSTANCE = new AppI18n(); return FileVisitResult.CONTINUE; } + if (!file.getFileName().toString().endsWith(".properties")) { + return FileVisitResult.CONTINUE; + } + fileCounter.incrementAndGet(); try (var in = Files.newInputStream(file)) { var props = new Properties(); @@ -233,6 +243,39 @@ private static AppI18n INSTANCE = new AppI18n(); .handle(); }); } + + markdownDocumentations = new HashMap<>(); + for (var module : AppExtensionManager.getInstance().getContentModules()) { + AppResources.with(module.getName(), "lang", basePath -> { + if (!Files.exists(basePath)) { + return; + } + + var moduleName = FilenameUtils.getExtension(module.getName()); + Files.walkFileTree(basePath, new SimpleFileVisitor() { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + if (!matchesLocale(file)) { + return FileVisitResult.CONTINUE; + } + + if (!file.getFileName().toString().endsWith(".md")) { + return FileVisitResult.CONTINUE; + } + + var name = file.getFileName().toString().substring(0, file.getFileName().toString().lastIndexOf("_")); + try (var in = Files.newInputStream(file)) { + var usedPrefix = moduleName + ":"; + markdownDocumentations.put(usedPrefix + name, new String(in.readAllBytes(), StandardCharsets.UTF_8)); + } catch (IOException ex) { + ErrorEvent.fromThrowable(ex).omitted(true).build().handle(); + } + return FileVisitResult.CONTINUE; + } + }); + }); + } + this.prettyTime = new PrettyTime( AppPrefs.get() != null ? AppPrefs.get().language.getValue().getLocale() diff --git a/app/src/main/java/io/xpipe/app/ext/ActionProvider.java b/app/src/main/java/io/xpipe/app/ext/ActionProvider.java index e9c47fc11..e84949fa3 100644 --- a/app/src/main/java/io/xpipe/app/ext/ActionProvider.java +++ b/app/src/main/java/io/xpipe/app/ext/ActionProvider.java @@ -75,6 +75,12 @@ public interface ActionProvider { public static interface DataStoreCallSite { + enum ActiveType { + ONLY_SHOW_IF_ENABLED, + ALWAYS_SHOW, + ALWAYS_ENABLE + } + Action createAction(T store); Class getApplicableClass(); @@ -95,8 +101,8 @@ public interface ActionProvider { String getIcon(T store); - default boolean showIfDisabled() { - return true; + default ActiveType activeType() { + return ActiveType.ONLY_SHOW_IF_ENABLED; } } diff --git a/app/src/main/java/io/xpipe/app/fxcomps/impl/ChoicePaneComp.java b/app/src/main/java/io/xpipe/app/fxcomps/impl/ChoicePaneComp.java index 8f31f55cb..3db92f7fe 100644 --- a/app/src/main/java/io/xpipe/app/fxcomps/impl/ChoicePaneComp.java +++ b/app/src/main/java/io/xpipe/app/fxcomps/impl/ChoicePaneComp.java @@ -9,6 +9,7 @@ import io.xpipe.app.fxcomps.util.SimpleChangeListener; import javafx.beans.property.Property; import javafx.beans.value.ObservableValue; import javafx.collections.FXCollections; +import javafx.geometry.Insets; import javafx.scene.control.ComboBox; import javafx.scene.layout.Region; import javafx.scene.layout.VBox; @@ -55,10 +56,12 @@ public class ChoicePaneComp extends Comp> { if (n == null) { vbox.getChildren().remove(1); } else { + var region = n.comp().createRegion(); + region.setPadding(new Insets(0, 0, 0, 10)); if (vbox.getChildren().size() == 1) { - vbox.getChildren().add(n.comp().createRegion()); + vbox.getChildren().add(region); } else { - vbox.getChildren().set(1, n.comp().createRegion()); + vbox.getChildren().set(1, region); } } }); 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 33505638c..13b4a3c64 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 @@ -2,6 +2,7 @@ package io.xpipe.app.fxcomps.impl; import atlantafx.base.controls.Popover; import atlantafx.base.controls.Spacer; +import io.xpipe.app.comp.base.MarkdownComp; import io.xpipe.app.core.AppFont; import io.xpipe.app.fxcomps.Comp; import io.xpipe.app.fxcomps.CompStructure; @@ -10,8 +11,10 @@ import io.xpipe.app.fxcomps.util.PlatformThread; import javafx.beans.Observable; import javafx.beans.binding.Bindings; import javafx.beans.value.ObservableValue; +import javafx.geometry.Insets; import javafx.geometry.Orientation; import javafx.geometry.Pos; +import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.layout.*; @@ -76,16 +79,21 @@ public class OptionsComp extends Comp> { description.managedProperty().bind(PlatformThread.sync(compRegion.managedProperty())); } - if (entry.longDescription() != null) { - var popover = new Popover(new Label(entry.longDescription().getValue())); + if (entry.longDescriptionSource() != null) { + var markDown = new MarkdownComp(entry.longDescriptionSource(), s -> s) + .apply(struc -> struc.get().setMaxWidth(500)) + .apply(struc -> struc.get().setMaxHeight(400)); + var popover = new Popover(markDown.createRegion()); popover.setCloseButtonEnabled(false); popover.setHeaderAlwaysVisible(false); popover.setDetachable(true); AppFont.small(popover.getContentNode()); - var descriptionHover = new Label("?"); + var descriptionHover = new Button("... ?"); + descriptionHover.setPadding(new Insets(0, 6, 0, 6)); + descriptionHover.getStyleClass().add("long-description"); AppFont.header(descriptionHover); - descriptionHover.setOnMouseClicked(e -> popover.show(descriptionHover)); + descriptionHover.setOnAction(e -> popover.show(descriptionHover)); var descriptionBox = new HBox(description, new Spacer(Orientation.HORIZONTAL), descriptionHover); HBox.setHgrow(descriptionBox, Priority.ALWAYS); @@ -159,5 +167,5 @@ public class OptionsComp extends Comp> { return entries; } - public record Entry(String key, ObservableValue description, ObservableValue longDescription, ObservableValue name, Comp comp) {} + public record Entry(String key, ObservableValue description, String longDescriptionSource, ObservableValue name, Comp comp) {} } diff --git a/app/src/main/java/io/xpipe/app/launcher/LauncherInput.java b/app/src/main/java/io/xpipe/app/launcher/LauncherInput.java index c56d81bc4..25f630474 100644 --- a/app/src/main/java/io/xpipe/app/launcher/LauncherInput.java +++ b/app/src/main/java/io/xpipe/app/launcher/LauncherInput.java @@ -69,7 +69,7 @@ public abstract class LauncherInput { if (scheme.equalsIgnoreCase("xpipe")) { var action = uri.getAuthority(); - var args = Arrays.asList(uri.getPath().split("/")); + var args = Arrays.asList(uri.getPath().substring(1).split("/")); var found = ActionProvider.ALL.stream() .filter(actionProvider -> actionProvider.getLauncherCallSite() != null && actionProvider diff --git a/app/src/main/java/io/xpipe/app/storage/DataStorage.java b/app/src/main/java/io/xpipe/app/storage/DataStorage.java index 97ec79b84..8230d3f6e 100644 --- a/app/src/main/java/io/xpipe/app/storage/DataStorage.java +++ b/app/src/main/java/io/xpipe/app/storage/DataStorage.java @@ -339,31 +339,41 @@ public abstract class DataStorage { }); } - private void propagateUpdate() throws Exception { + private void propagateUpdate() { for (DataStoreEntry dataStoreEntry : getStores()) { - dataStoreEntry.refresh(false); + dataStoreEntry.simpleRefresh(); } - for (var dataStoreEntry : sourceEntries) { - dataStoreEntry.refresh(false); + for (var e : sourceEntries) { + e.simpleRefresh(); } } - public void addStore(@NonNull DataStoreEntry e) { + public void addStoreEntry(@NonNull DataStoreEntry e) { if (getStoreIfPresent(e.getName()).isPresent()) { throw new IllegalArgumentException("Store with name " + e.getName() + " already exists"); } e.setDirectory(getStoresDir().resolve(e.getUuid().toString())); this.storeEntries.add(e); + propagateUpdate(); save(); this.listeners.forEach(l -> l.onStoreAdd(e)); } + public void addStoreIfNotPresent(@NonNull String name, DataStore store) { + if (getStoreEntryIfPresent(store).isPresent()) { + return; + } + + var e = DataStoreEntry.createNew(UUID.randomUUID(), createUniqueStoreEntryName(name), store); + addStoreEntry(e); + } + public DataStoreEntry addStore(@NonNull String name, DataStore store) { var e = DataStoreEntry.createNew(UUID.randomUUID(), createUniqueStoreEntryName(name), store); - addStore(e); + addStoreEntry(e); return e; } diff --git a/app/src/main/java/io/xpipe/app/storage/StorageElement.java b/app/src/main/java/io/xpipe/app/storage/StorageElement.java index ff07bc80f..adabacc6d 100644 --- a/app/src/main/java/io/xpipe/app/storage/StorageElement.java +++ b/app/src/main/java/io/xpipe/app/storage/StorageElement.java @@ -1,7 +1,7 @@ package io.xpipe.app.storage; +import io.xpipe.app.issue.ErrorEvent; import lombok.Builder; -import lombok.SneakyThrows; import lombok.Value; import lombok.extern.jackson.Jacksonized; import org.apache.commons.io.FileUtils; @@ -38,9 +38,12 @@ public abstract class StorageElement { return elementState; } - @SneakyThrows public void simpleRefresh() { - refresh(false); + try { + refresh(false); + } catch (Exception e) { + ErrorEvent.fromThrowable(e).handle(); + } } public abstract void refresh(boolean deep) throws Exception; diff --git a/app/src/main/java/io/xpipe/app/util/OptionsBuilder.java b/app/src/main/java/io/xpipe/app/util/OptionsBuilder.java index 0bbb55bb0..7c7034028 100644 --- a/app/src/main/java/io/xpipe/app/util/OptionsBuilder.java +++ b/app/src/main/java/io/xpipe/app/util/OptionsBuilder.java @@ -21,7 +21,7 @@ public class OptionsBuilder { private ObservableValue name; private ObservableValue description; - private ObservableValue longDescription; + private String longDescription; private Comp comp; private void finishCurrent() { @@ -106,7 +106,7 @@ public class OptionsBuilder { public OptionsBuilder longDescription(String descriptionKey) { finishCurrent(); - longDescription = AppI18n.observable(descriptionKey); + longDescription = AppI18n.getInstance().getMarkdownDocumentation(descriptionKey); return this; } diff --git a/app/src/main/java/io/xpipe/app/util/ScanAlert.java b/app/src/main/java/io/xpipe/app/util/ScanAlert.java index 50841e3b8..b20a5bc90 100644 --- a/app/src/main/java/io/xpipe/app/util/ScanAlert.java +++ b/app/src/main/java/io/xpipe/app/util/ScanAlert.java @@ -38,9 +38,12 @@ public class ScanAlert { alert.setTitle(AppI18n.get("scanAlertTitle")); alert.setWidth(300); var content = new VerticalComp(List.of( - new LabelComp(AppI18n.get("scanAlertHeader")).apply(struc -> struc.get().setWrapText(true)), + new LabelComp(AppI18n.get("scanAlertHeader")) + .apply(struc -> struc.get().setWrapText(true)), new ListSelectorComp<>( - applicable, scanOperation -> AppI18n.get(scanOperation.getNameKey()), selected))) + applicable, + scanOperation -> AppI18n.get(scanOperation.getNameKey()), + selected))) .apply(struc -> struc.get().setSpacing(15)) .styleClass("window-content") .createRegion(); @@ -51,12 +54,12 @@ public class ScanAlert { buttonType -> { if (buttonType.isPresent() && buttonType.get().getButtonData().isDefaultButton()) { - try (var ignored = new BusyProperty(busy)) { - for (var a : applicable) { + for (var a : selected) { + try (var ignored = new BusyProperty(busy)) { a.getScanner().run(); + } catch (Exception ex) { + ErrorEvent.fromThrowable(ex).handle(); } - } catch (Exception ex) { - ErrorEvent.fromThrowable(ex).handle(); } } }); diff --git a/ext/base/src/main/java/io/xpipe/ext/base/LocalStoreProvider.java b/ext/base/src/main/java/io/xpipe/ext/base/LocalStoreProvider.java index 1146af5b6..c135a336b 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/LocalStoreProvider.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/LocalStoreProvider.java @@ -40,7 +40,7 @@ public class LocalStoreProvider implements DataStoreProvider { } var e = DataStoreEntry.createNew(UUID.randomUUID(), "Local Machine", new LocalStore()); - DataStorage.get().addStore(e); + DataStorage.get().addStoreEntry(e); e.setConfiguration(StorageElement.Configuration.builder() .deletable(false) .editable(false) diff --git a/ext/base/src/main/java/io/xpipe/ext/base/actions/AddStoreAction.java b/ext/base/src/main/java/io/xpipe/ext/base/actions/AddStoreAction.java index 7025ae27b..2993731a7 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/actions/AddStoreAction.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/actions/AddStoreAction.java @@ -38,7 +38,7 @@ public class AddStoreAction implements ActionProvider { return new LauncherCallSite() { @Override public String getId() { - return "addStore"; + return "add"; } @Override diff --git a/ext/base/src/main/java/io/xpipe/ext/base/actions/EditStoreAction.java b/ext/base/src/main/java/io/xpipe/ext/base/actions/EditStoreAction.java index 394516d3a..cd32c48d2 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/actions/EditStoreAction.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/actions/EditStoreAction.java @@ -37,8 +37,8 @@ public class EditStoreAction implements ActionProvider { } @Override - public boolean showIfDisabled() { - return false; + public ActiveType activeType() { + return ActiveType.ALWAYS_ENABLE; } @Override diff --git a/ext/base/src/main/java/io/xpipe/ext/base/actions/ShareStoreAction.java b/ext/base/src/main/java/io/xpipe/ext/base/actions/ShareStoreAction.java index ad9757101..c134329b0 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/actions/ShareStoreAction.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/actions/ShareStoreAction.java @@ -43,11 +43,6 @@ public class ShareStoreAction implements ActionProvider { public DataStoreCallSite getDataStoreCallSite() { return new DataStoreCallSite() { - @Override - public boolean showIfDisabled() { - return false; - } - @Override public ActionProvider.Action createAction(DataStore store) { return new Action(store); diff --git a/version b/version index c52db9804..167b000b4 100644 --- a/version +++ b/version @@ -1 +1 @@ -0.5.3 \ No newline at end of file +0.5.4 \ No newline at end of file