diff --git a/app/src/main/java/io/xpipe/app/browser/action/BrowserAction.java b/app/src/main/java/io/xpipe/app/browser/action/BrowserAction.java index 9c8e7473e..566e6d54a 100644 --- a/app/src/main/java/io/xpipe/app/browser/action/BrowserAction.java +++ b/app/src/main/java/io/xpipe/app/browser/action/BrowserAction.java @@ -53,10 +53,6 @@ public abstract class BrowserAction extends StoreAction { } } - if (model.getFileSystem() == null) { - return false; - } - model.getBusy().set(true); // Start shell in case we exited diff --git a/app/src/main/java/io/xpipe/app/action/BranchStoreActionProvider.java b/app/src/main/java/io/xpipe/app/hub/action/BranchStoreActionProvider.java similarity index 57% rename from app/src/main/java/io/xpipe/app/action/BranchStoreActionProvider.java rename to app/src/main/java/io/xpipe/app/hub/action/BranchStoreActionProvider.java index 6936073c8..01b37cc39 100644 --- a/app/src/main/java/io/xpipe/app/action/BranchStoreActionProvider.java +++ b/app/src/main/java/io/xpipe/app/hub/action/BranchStoreActionProvider.java @@ -1,6 +1,6 @@ -package io.xpipe.app.action; +package io.xpipe.app.hub.action; -import io.xpipe.app.hub.action.StoreActionProvider; +import io.xpipe.app.action.ActionProvider; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.core.store.DataStore; @@ -8,5 +8,5 @@ import java.util.List; public interface BranchStoreActionProvider extends StoreActionProvider { - List getChildren(DataStoreEntryRef store); + List> getChildren(DataStoreEntryRef store); } diff --git a/app/src/main/java/io/xpipe/app/action/LeafStoreActionProvider.java b/app/src/main/java/io/xpipe/app/hub/action/LeafStoreActionProvider.java similarity index 72% rename from app/src/main/java/io/xpipe/app/action/LeafStoreActionProvider.java rename to app/src/main/java/io/xpipe/app/hub/action/LeafStoreActionProvider.java index 1d0d959e0..a0c144bb4 100644 --- a/app/src/main/java/io/xpipe/app/action/LeafStoreActionProvider.java +++ b/app/src/main/java/io/xpipe/app/hub/action/LeafStoreActionProvider.java @@ -1,6 +1,6 @@ -package io.xpipe.app.action; +package io.xpipe.app.hub.action; -import io.xpipe.app.hub.action.StoreActionProvider; +import io.xpipe.app.action.AbstractAction; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.core.store.DataStore; @@ -15,8 +15,4 @@ public interface LeafStoreActionProvider extends StoreActio default boolean requiresValidStore() { return true; } - - default boolean isSystemAction() { - return false; - } } diff --git a/app/src/main/java/io/xpipe/app/hub/action/StoreActionCategory.java b/app/src/main/java/io/xpipe/app/hub/action/StoreActionCategory.java new file mode 100644 index 000000000..4ea766452 --- /dev/null +++ b/app/src/main/java/io/xpipe/app/hub/action/StoreActionCategory.java @@ -0,0 +1,11 @@ +package io.xpipe.app.hub.action; + +public enum StoreActionCategory { + + CUSTOM, + OPEN, + CONFIGURATION, + APPEARANCE, + DEVELOPER, + DELETION +} diff --git a/app/src/main/java/io/xpipe/app/hub/action/StoreActionProvider.java b/app/src/main/java/io/xpipe/app/hub/action/StoreActionProvider.java index 8d1fcd241..574a42a53 100644 --- a/app/src/main/java/io/xpipe/app/hub/action/StoreActionProvider.java +++ b/app/src/main/java/io/xpipe/app/hub/action/StoreActionProvider.java @@ -9,6 +9,10 @@ import javafx.beans.value.ObservableValue; public interface StoreActionProvider extends ActionProvider { + default StoreActionCategory getCategory() { + return null; + } + default boolean isMajor(DataStoreEntryRef o) { return false; } diff --git a/app/src/main/java/io/xpipe/app/hub/action/impl/BrowseStoreActionProvider.java b/app/src/main/java/io/xpipe/app/hub/action/impl/BrowseStoreActionProvider.java index f4c550b72..6e6095488 100644 --- a/app/src/main/java/io/xpipe/app/hub/action/impl/BrowseStoreActionProvider.java +++ b/app/src/main/java/io/xpipe/app/hub/action/impl/BrowseStoreActionProvider.java @@ -1,11 +1,12 @@ package io.xpipe.app.hub.action.impl; -import io.xpipe.app.action.LeafStoreActionProvider; +import io.xpipe.app.hub.action.LeafStoreActionProvider; import io.xpipe.app.browser.BrowserFullSessionModel; import io.xpipe.app.core.AppI18n; import io.xpipe.app.core.AppLayoutModel; import io.xpipe.app.ext.ProcessControlProvider; import io.xpipe.app.hub.action.StoreAction; +import io.xpipe.app.hub.action.StoreActionCategory; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.LabelGraphic; import io.xpipe.core.store.FilePath; @@ -29,6 +30,11 @@ public class BrowseStoreActionProvider implements LeafStoreActionProvider o) { return true; diff --git a/app/src/main/java/io/xpipe/app/hub/action/impl/ChangeStoreIconActionProvider.java b/app/src/main/java/io/xpipe/app/hub/action/impl/ChangeStoreIconActionProvider.java index e1dfd13f3..77ca07888 100644 --- a/app/src/main/java/io/xpipe/app/hub/action/impl/ChangeStoreIconActionProvider.java +++ b/app/src/main/java/io/xpipe/app/hub/action/impl/ChangeStoreIconActionProvider.java @@ -1,9 +1,10 @@ package io.xpipe.app.hub.action.impl; import io.xpipe.app.action.AbstractAction; -import io.xpipe.app.action.LeafStoreActionProvider; +import io.xpipe.app.hub.action.LeafStoreActionProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.hub.action.StoreAction; +import io.xpipe.app.hub.action.StoreActionCategory; import io.xpipe.app.hub.comp.StoreIconChoiceDialog; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.LabelGraphic; @@ -17,6 +18,11 @@ import lombok.extern.jackson.Jacksonized; public class ChangeStoreIconActionProvider implements LeafStoreActionProvider { + @Override + public StoreActionCategory getCategory() { + return StoreActionCategory.CONFIGURATION; + } + @Override public AbstractAction createAction(DataStoreEntryRef ref) { return Action.builder().ref(ref).build(); diff --git a/app/src/main/java/io/xpipe/app/hub/action/impl/CloneStoreActionProvider.java b/app/src/main/java/io/xpipe/app/hub/action/impl/CloneStoreActionProvider.java index f5f466fed..ff92c0ae5 100644 --- a/app/src/main/java/io/xpipe/app/hub/action/impl/CloneStoreActionProvider.java +++ b/app/src/main/java/io/xpipe/app/hub/action/impl/CloneStoreActionProvider.java @@ -1,9 +1,10 @@ package io.xpipe.app.hub.action.impl; import io.xpipe.app.action.AbstractAction; -import io.xpipe.app.action.LeafStoreActionProvider; +import io.xpipe.app.hub.action.LeafStoreActionProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.hub.action.StoreAction; +import io.xpipe.app.hub.action.StoreActionCategory; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntry; import io.xpipe.app.storage.DataStoreEntryRef; @@ -19,6 +20,11 @@ import java.time.Duration; public class CloneStoreActionProvider implements LeafStoreActionProvider { + @Override + public StoreActionCategory getCategory() { + return StoreActionCategory.CONFIGURATION; + } + @Override public AbstractAction createAction(DataStoreEntryRef ref) { return Action.builder().ref(ref).build(); diff --git a/app/src/main/java/io/xpipe/app/hub/action/impl/EditStoreActionProvider.java b/app/src/main/java/io/xpipe/app/hub/action/impl/EditStoreActionProvider.java index 7123908f3..8db2226a8 100644 --- a/app/src/main/java/io/xpipe/app/hub/action/impl/EditStoreActionProvider.java +++ b/app/src/main/java/io/xpipe/app/hub/action/impl/EditStoreActionProvider.java @@ -1,9 +1,10 @@ package io.xpipe.app.hub.action.impl; import io.xpipe.app.action.AbstractAction; -import io.xpipe.app.action.LeafStoreActionProvider; +import io.xpipe.app.hub.action.LeafStoreActionProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.hub.action.StoreAction; +import io.xpipe.app.hub.action.StoreActionCategory; import io.xpipe.app.hub.comp.StoreCreationDialog; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.LabelGraphic; @@ -16,6 +17,11 @@ import lombok.extern.jackson.Jacksonized; public class EditStoreActionProvider implements LeafStoreActionProvider { + @Override + public StoreActionCategory getCategory() { + return StoreActionCategory.CONFIGURATION; + } + @Override public AbstractAction createAction(DataStoreEntryRef ref) { return Action.builder().ref(ref).build(); @@ -28,12 +34,12 @@ public class EditStoreActionProvider implements LeafStoreActionProvider getName(DataStoreEntryRef store) { - return AppI18n.observable("base.edit"); + return AppI18n.observable("configure"); } @Override public LabelGraphic getIcon(DataStoreEntryRef store) { - return new LabelGraphic.IconGraphic("mdal-edit"); + return new LabelGraphic.IconGraphic("mdi2w-wrench"); } @Override @@ -41,11 +47,6 @@ public class EditStoreActionProvider implements LeafStoreActionProvider o) { - return true; - } - @Override public String getId() { return "editStore"; diff --git a/app/src/main/java/io/xpipe/app/hub/action/impl/LaunchStoreActionProvider.java b/app/src/main/java/io/xpipe/app/hub/action/impl/LaunchStoreActionProvider.java index 417289d9d..3e3050a3e 100644 --- a/app/src/main/java/io/xpipe/app/hub/action/impl/LaunchStoreActionProvider.java +++ b/app/src/main/java/io/xpipe/app/hub/action/impl/LaunchStoreActionProvider.java @@ -1,9 +1,10 @@ package io.xpipe.app.hub.action.impl; -import io.xpipe.app.action.LeafStoreActionProvider; +import io.xpipe.app.hub.action.LeafStoreActionProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.hub.action.BatchStoreActionProvider; import io.xpipe.app.hub.action.StoreAction; +import io.xpipe.app.hub.action.StoreActionCategory; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.LabelGraphic; import io.xpipe.core.store.DataStore; @@ -16,6 +17,11 @@ import lombok.extern.jackson.Jacksonized; public class LaunchStoreActionProvider implements LeafStoreActionProvider, BatchStoreActionProvider { + @Override + public StoreActionCategory getCategory() { + return StoreActionCategory.OPEN; + } + @Override public String getId() { return "launch"; diff --git a/app/src/main/java/io/xpipe/app/hub/action/impl/RefreshChildrenStoreActionProvider.java b/app/src/main/java/io/xpipe/app/hub/action/impl/RefreshChildrenStoreActionProvider.java index 543fd500e..3d5b1a594 100644 --- a/app/src/main/java/io/xpipe/app/hub/action/impl/RefreshChildrenStoreActionProvider.java +++ b/app/src/main/java/io/xpipe/app/hub/action/impl/RefreshChildrenStoreActionProvider.java @@ -1,9 +1,10 @@ package io.xpipe.app.hub.action.impl; import io.xpipe.app.action.AbstractAction; -import io.xpipe.app.action.LeafStoreActionProvider; +import io.xpipe.app.hub.action.LeafStoreActionProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.hub.action.StoreAction; +import io.xpipe.app.hub.action.StoreActionCategory; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.FixedHierarchyStore; @@ -16,6 +17,11 @@ import lombok.extern.jackson.Jacksonized; public class RefreshChildrenStoreActionProvider implements LeafStoreActionProvider { + @Override + public StoreActionCategory getCategory() { + return StoreActionCategory.OPEN; + } + @Override public boolean isDefault(DataStoreEntryRef o) { return true; diff --git a/app/src/main/java/io/xpipe/app/hub/action/impl/SampleStoreActionProvider.java b/app/src/main/java/io/xpipe/app/hub/action/impl/SampleStoreActionProvider.java index b04f2b5a4..ee7b5f8ae 100644 --- a/app/src/main/java/io/xpipe/app/hub/action/impl/SampleStoreActionProvider.java +++ b/app/src/main/java/io/xpipe/app/hub/action/impl/SampleStoreActionProvider.java @@ -1,9 +1,10 @@ package io.xpipe.app.hub.action.impl; -import io.xpipe.app.action.LeafStoreActionProvider; +import io.xpipe.app.hub.action.LeafStoreActionProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.ext.ShellStore; import io.xpipe.app.hub.action.StoreAction; +import io.xpipe.app.hub.action.StoreActionCategory; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.LabelGraphic; import io.xpipe.core.process.CommandControl; @@ -22,6 +23,11 @@ import java.io.StringReader; public class SampleStoreActionProvider implements LeafStoreActionProvider { + @Override + public StoreActionCategory getCategory() { + return StoreActionCategory.OPEN; + } + @Override public Action createAction(DataStoreEntryRef ref) { return Action.builder().ref(ref).build(); diff --git a/app/src/main/java/io/xpipe/app/hub/action/impl/ScanStoreActionProvider.java b/app/src/main/java/io/xpipe/app/hub/action/impl/ScanStoreActionProvider.java index 5590f9d81..e7b4b12ed 100644 --- a/app/src/main/java/io/xpipe/app/hub/action/impl/ScanStoreActionProvider.java +++ b/app/src/main/java/io/xpipe/app/hub/action/impl/ScanStoreActionProvider.java @@ -1,10 +1,11 @@ package io.xpipe.app.hub.action.impl; import io.xpipe.app.action.AbstractAction; -import io.xpipe.app.action.LeafStoreActionProvider; +import io.xpipe.app.hub.action.LeafStoreActionProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.ext.ShellStore; import io.xpipe.app.hub.action.StoreAction; +import io.xpipe.app.hub.action.StoreActionCategory; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.LabelGraphic; import io.xpipe.app.util.ScanDialog; @@ -18,6 +19,11 @@ import lombok.extern.jackson.Jacksonized; public class ScanStoreActionProvider implements LeafStoreActionProvider { + @Override + public StoreActionCategory getCategory() { + return StoreActionCategory.OPEN; + } + @Override public AbstractAction createAction(DataStoreEntryRef ref) { return Action.builder().ref(ref).build(); diff --git a/app/src/main/java/io/xpipe/app/hub/comp/StoreEntryComp.java b/app/src/main/java/io/xpipe/app/hub/comp/StoreEntryComp.java index 8c3ad8a47..3e06bdc12 100644 --- a/app/src/main/java/io/xpipe/app/hub/comp/StoreEntryComp.java +++ b/app/src/main/java/io/xpipe/app/hub/comp/StoreEntryComp.java @@ -1,8 +1,8 @@ package io.xpipe.app.hub.comp; import io.xpipe.app.action.ActionProvider; -import io.xpipe.app.action.BranchStoreActionProvider; -import io.xpipe.app.action.LeafStoreActionProvider; +import io.xpipe.app.hub.action.BranchStoreActionProvider; +import io.xpipe.app.hub.action.LeafStoreActionProvider; import io.xpipe.app.comp.Comp; import io.xpipe.app.comp.SimpleComp; import io.xpipe.app.comp.SimpleCompStructure; @@ -10,11 +10,11 @@ import io.xpipe.app.comp.augment.ContextMenuAugment; import io.xpipe.app.comp.augment.GrowAugment; import io.xpipe.app.comp.base.*; import io.xpipe.app.comp.base.IconButtonComp; -import io.xpipe.app.comp.base.LabelComp; import io.xpipe.app.comp.base.LazyTextFieldComp; import io.xpipe.app.comp.base.LoadingOverlayComp; import io.xpipe.app.core.*; import io.xpipe.app.core.AppResources; +import io.xpipe.app.hub.action.StoreActionCategory; import io.xpipe.app.hub.action.StoreActionProvider; import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.storage.DataStoreColor; @@ -43,6 +43,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.Stream; public abstract class StoreEntryComp extends SimpleComp { @@ -288,14 +290,30 @@ public abstract class StoreEntryComp extends SimpleComp { button.apply(new ContextMenuAugment<>( mouseEvent -> mouseEvent.getButton() == MouseButton.PRIMARY, keyEvent -> false, () -> { var cm = ContextMenuHelper.create(); - branch.getChildren(getWrapper().getEntry().ref()).stream() - .filter(actionProvider -> getWrapper().showActionProvider(actionProvider, false)) - .forEach(childProvider -> { - var menu = buildMenuItemForAction(childProvider); - if (menu != null) { - cm.getItems().add(menu); - } - }); + var children = branch.getChildren(getWrapper().getEntry().ref()); + var cats = Arrays.stream(StoreActionCategory.values()).collect(Collectors.toCollection(ArrayList::new)); + cats.addFirst(null); + for (var cat : cats) { + var catChildren = children.stream() + .filter(actionProvider -> actionProvider.getCategory() == cat) + .toList(); + if (catChildren.isEmpty()) { + continue; + } + + catChildren.forEach(childProvider -> { + var menu = buildMenuItemForAction(childProvider); + if (menu != null) { + cm.getItems().add(menu); + } + }); + cm.getItems().add(new SeparatorMenuItem()); + } + + if (cm.getItems().getLast() instanceof SeparatorMenuItem) { + cm.getItems().removeLast(); + } + return cm; })); } @@ -325,168 +343,164 @@ public abstract class StoreEntryComp extends SimpleComp { protected ContextMenu createContextMenu(Region name) { var contextMenu = ContextMenuHelper.create(); - var hasSep = false; - for (var p : getWrapper().getMinorActionProviders()) { - var item = buildMenuItemForAction(p); - if (item == null) { + var cats = Arrays.stream(StoreActionCategory.values()).collect(Collectors.toCollection(ArrayList::new)); + cats.addFirst(null); + for (var cat : cats) { + var items = new ArrayList(); + for (var p : getWrapper().getMinorActionProviders()) { + var item = buildMenuItemForAction(p); + if (item == null || p.getCategory() != cat) { + continue; + } + + items.add(item); + } + + if (cat == StoreActionCategory.CONFIGURATION) { + var rename = new MenuItem(AppI18n.get("rename"), new FontIcon("mdal-edit")); + rename.setOnAction(event -> { + name.requestFocus(); + }); + items.add(rename); + + var notes = new MenuItem(AppI18n.get("addNotes"), new FontIcon("mdi2n-note-text")); + notes.setOnAction(event -> { + getWrapper().getNotes().setValue(new StoreNotes(null, getDefaultNotes())); + event.consume(); + }); + notes.visibleProperty().bind(BindingsHelper.map(getWrapper().getNotes(), s -> s.getCommited() == null)); + items.add(notes); + + var readOnly = new MenuItem(); + readOnly.graphicProperty() + .bind(Bindings.createObjectBinding( + () -> { + var is = getWrapper().getReadOnly().get(); + return is + ? new FontIcon("mdi2l-lock-open-variant-outline") + : new FontIcon("mdi2l-lock-open-outline"); + }, + getWrapper().getReadOnly())); + readOnly.textProperty() + .bind(Bindings.createStringBinding( + () -> { + var is = getWrapper().getReadOnly().get(); + return is ? AppI18n.get("unsetReadOnly") : AppI18n.get("setReadOnly"); + }, + AppI18n.activeLanguage(), + getWrapper().getReadOnly())); + readOnly.setOnAction(event -> + getWrapper().getEntry().setReadOnly(!getWrapper().getReadOnly().get())); + items.add(readOnly); + } + + if (cat == StoreActionCategory.DEVELOPER) { + if (AppPrefs.get().developerMode().getValue()) { + var browse = new MenuItem(AppI18n.get("browseInternalStorage"), new FontIcon("mdi2f-folder-open-outline")); + browse.setOnAction(event -> DesktopHelper.browsePathLocal(getWrapper().getEntry().getDirectory())); + items.add(browse); + } + + if (AppPrefs.get().enableHttpApi().get()) { + var copyId = new MenuItem(AppI18n.get("copyId"), new FontIcon("mdi2c-content-copy")); + copyId.setOnAction(event -> ClipboardHelper.copyText(getWrapper().getEntry().getUuid().toString())); + items.add(copyId); + } + } + + if (cat == StoreActionCategory.APPEARANCE) { + if (section.getDepth() == 1) { + var color = new Menu(AppI18n.get("color"), new FontIcon("mdi2f-format-color-fill")); + var none = new MenuItem(); + none.textProperty().bind(AppI18n.observable("none")); + none.setOnAction(event -> { + getWrapper().getEntry().setColor(null); + event.consume(); + }); + color.getItems().add(none); + Arrays.stream(DataStoreColor.values()).forEach(dataStoreColor -> { + MenuItem m = new MenuItem(); + m.textProperty().bind(AppI18n.observable(dataStoreColor.getId())); + m.setOnAction(event -> { + getWrapper().getEntry().setColor(dataStoreColor); + event.consume(); + }); + color.getItems().add(m); + }); + items.add(color); + } + + if (getWrapper().getEntry().getProvider() != null && getWrapper().getEntry().getProvider().canMoveCategories()) { + var move = new Menu(AppI18n.get("moveTo"), new FontIcon("mdi2f-folder-move-outline")); + StoreViewState.get().getSortedCategories(getWrapper().getCategory().getValue().getRoot()).getList().forEach( + storeCategoryWrapper -> { + MenuItem m = new MenuItem(); + m.textProperty().setValue(" ".repeat(storeCategoryWrapper.getDepth()) + storeCategoryWrapper.getName().getValue()); + m.setOnAction(event -> { + getWrapper().moveTo(storeCategoryWrapper.getCategory()); + event.consume(); + }); + if (storeCategoryWrapper.getParent() == null) { + m.setDisable(true); + } + + move.getItems().add(m); + }); + items.add(move); + } + { + var order = new Menu(AppI18n.get("order"), new FontIcon("mdal-bookmarks")); + var noOrder = new MenuItem(AppI18n.get("none"), new FontIcon("mdi2r-reorder-horizontal")); + noOrder.setOnAction(event -> { + getWrapper().setOrder(null); + event.consume(); + }); + if (getWrapper().getEntry().getExplicitOrder() == null) { + noOrder.setDisable(true); + } + order.getItems().add(noOrder); + order.getItems().add(new SeparatorMenuItem()); + + var top = new MenuItem(AppI18n.get("stickToTop"), new FontIcon("mdi2o-order-bool-descending")); + top.setOnAction(event -> { + getWrapper().setOrder(DataStoreEntry.Order.TOP); + event.consume(); + }); + if (DataStoreEntry.Order.TOP.equals(getWrapper().getEntry().getExplicitOrder())) { + top.setDisable(true); + } + order.getItems().add(top); + + var bottom = new MenuItem(AppI18n.get("stickToBottom"), new FontIcon("mdi2o-order-bool-ascending")); + bottom.setOnAction(event -> { + getWrapper().setOrder(DataStoreEntry.Order.BOTTOM); + event.consume(); + }); + if (DataStoreEntry.Order.BOTTOM.equals(getWrapper().getEntry().getExplicitOrder())) { + bottom.setDisable(true); + } + order.getItems().add(bottom); + items.add(order); + } + } + + if (cat == StoreActionCategory.DELETION) { + var del = new MenuItem(AppI18n.get("remove"), new FontIcon("mdal-delete_outline")); + del.disableProperty().bind(Bindings.createBooleanBinding(() -> { + return !getWrapper().getDeletable().get(); + }, getWrapper().getDeletable())); + del.setOnAction(event -> getWrapper().delete()); + contextMenu.getItems().add(del); + } + + if (items.isEmpty()) { continue; } - if (p instanceof LeafStoreActionProvider l && l.isSystemAction() && !hasSep) { - if (contextMenu.getItems().size() > 0) { - contextMenu.getItems().add(new SeparatorMenuItem()); - } - hasSep = true; - } - - contextMenu.getItems().add(item); - } - if (contextMenu.getItems().size() > 0 && !hasSep) { + contextMenu.getItems().addAll(items); contextMenu.getItems().add(new SeparatorMenuItem()); } - var rename = new MenuItem(AppI18n.get("rename"), new FontIcon("mdal-edit")); - rename.setOnAction(event -> { - name.requestFocus(); - }); - contextMenu.getItems().add(rename); - - - var notes = new MenuItem(AppI18n.get("addNotes"), new FontIcon("mdi2n-note-text")); - notes.setOnAction(event -> { - getWrapper().getNotes().setValue(new StoreNotes(null, getDefaultNotes())); - event.consume(); - }); - notes.visibleProperty().bind(BindingsHelper.map(getWrapper().getNotes(), s -> s.getCommited() == null)); - contextMenu.getItems().add(notes); - - if (AppPrefs.get().developerMode().getValue()) { - var browse = new MenuItem(AppI18n.get("browseInternalStorage"), new FontIcon("mdi2f-folder-open-outline")); - browse.setOnAction(event -> - DesktopHelper.browsePathLocal(getWrapper().getEntry().getDirectory())); - contextMenu.getItems().add(browse); - } - - if (AppPrefs.get().enableHttpApi().get()) { - var copyId = new MenuItem(AppI18n.get("copyId"), new FontIcon("mdi2c-content-copy")); - copyId.setOnAction(event -> - ClipboardHelper.copyText(getWrapper().getEntry().getUuid().toString())); - contextMenu.getItems().add(copyId); - } - - if (section.getDepth() == 1) { - var color = new Menu(AppI18n.get("color"), new FontIcon("mdi2f-format-color-fill")); - var none = new MenuItem(); - none.textProperty().bind(AppI18n.observable("none")); - none.setOnAction(event -> { - getWrapper().getEntry().setColor(null); - event.consume(); - }); - color.getItems().add(none); - Arrays.stream(DataStoreColor.values()).forEach(dataStoreColor -> { - MenuItem m = new MenuItem(); - m.textProperty().bind(AppI18n.observable(dataStoreColor.getId())); - m.setOnAction(event -> { - getWrapper().getEntry().setColor(dataStoreColor); - event.consume(); - }); - color.getItems().add(m); - }); - contextMenu.getItems().add(color); - } - - if (getWrapper().getEntry().getProvider() != null - && getWrapper().getEntry().getProvider().canMoveCategories()) { - var move = new Menu(AppI18n.get("moveTo"), new FontIcon("mdi2f-folder-move-outline")); - StoreViewState.get() - .getSortedCategories(getWrapper().getCategory().getValue().getRoot()) - .getList() - .forEach(storeCategoryWrapper -> { - MenuItem m = new MenuItem(); - m.textProperty() - .setValue(" ".repeat(storeCategoryWrapper.getDepth()) - + storeCategoryWrapper.getName().getValue()); - m.setOnAction(event -> { - getWrapper().moveTo(storeCategoryWrapper.getCategory()); - event.consume(); - }); - if (storeCategoryWrapper.getParent() == null) { - m.setDisable(true); - } - - move.getItems().add(m); - }); - contextMenu.getItems().add(move); - } - { - var order = new Menu(AppI18n.get("order"), new FontIcon("mdal-bookmarks")); - var noOrder = new MenuItem(AppI18n.get("none"), new FontIcon("mdi2r-reorder-horizontal")); - noOrder.setOnAction(event -> { - getWrapper().setOrder(null); - event.consume(); - }); - if (getWrapper().getEntry().getExplicitOrder() == null) { - noOrder.setDisable(true); - } - order.getItems().add(noOrder); - order.getItems().add(new SeparatorMenuItem()); - - var top = new MenuItem(AppI18n.get("stickToTop"), new FontIcon("mdi2o-order-bool-descending")); - top.setOnAction(event -> { - getWrapper().setOrder(DataStoreEntry.Order.TOP); - event.consume(); - }); - if (DataStoreEntry.Order.TOP.equals(getWrapper().getEntry().getExplicitOrder())) { - top.setDisable(true); - } - order.getItems().add(top); - - var bottom = new MenuItem(AppI18n.get("stickToBottom"), new FontIcon("mdi2o-order-bool-ascending")); - bottom.setOnAction(event -> { - getWrapper().setOrder(DataStoreEntry.Order.BOTTOM); - event.consume(); - }); - if (DataStoreEntry.Order.BOTTOM.equals(getWrapper().getEntry().getExplicitOrder())) { - bottom.setDisable(true); - } - order.getItems().add(bottom); - contextMenu.getItems().add(order); - } - - var readOnly = new MenuItem(); - readOnly.graphicProperty() - .bind(Bindings.createObjectBinding( - () -> { - var is = getWrapper().getReadOnly().get(); - return is - ? new FontIcon("mdi2l-lock-open-variant-outline") - : new FontIcon("mdi2l-lock-open-outline"); - }, - getWrapper().getReadOnly())); - readOnly.textProperty() - .bind(Bindings.createStringBinding( - () -> { - var is = getWrapper().getReadOnly().get(); - return is ? AppI18n.get("unsetReadOnly") : AppI18n.get("setReadOnly"); - }, - AppI18n.activeLanguage(), - getWrapper().getReadOnly())); - readOnly.setOnAction(event -> - getWrapper().getEntry().setReadOnly(!getWrapper().getReadOnly().get())); - contextMenu.getItems().add(readOnly); - - contextMenu.getItems().add(new SeparatorMenuItem()); - - var del = new MenuItem(AppI18n.get("remove"), new FontIcon("mdal-delete_outline")); - del.disableProperty() - .bind(Bindings.createBooleanBinding( - () -> { - return !getWrapper().getDeletable().get(); - }, - getWrapper().getDeletable())); - del.setOnAction(event -> getWrapper().delete()); - contextMenu.getItems().add(del); - return contextMenu; } diff --git a/app/src/main/java/io/xpipe/app/hub/comp/StoreEntryWrapper.java b/app/src/main/java/io/xpipe/app/hub/comp/StoreEntryWrapper.java index d6b02ddc9..52a08f72d 100644 --- a/app/src/main/java/io/xpipe/app/hub/comp/StoreEntryWrapper.java +++ b/app/src/main/java/io/xpipe/app/hub/comp/StoreEntryWrapper.java @@ -4,6 +4,8 @@ import io.xpipe.app.action.*; import io.xpipe.app.ext.LocalStore; import io.xpipe.app.ext.ShellStore; import io.xpipe.app.ext.SingletonSessionStore; +import io.xpipe.app.hub.action.BranchStoreActionProvider; +import io.xpipe.app.hub.action.LeafStoreActionProvider; import io.xpipe.app.hub.action.StoreActionProvider; import io.xpipe.app.hub.action.impl.EditStoreActionProvider; import io.xpipe.app.issue.ErrorEvent; 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 8084c2d89..9e5d79ccf 100644 --- a/app/src/main/java/io/xpipe/app/storage/DataStorage.java +++ b/app/src/main/java/io/xpipe/app/storage/DataStorage.java @@ -207,14 +207,14 @@ public abstract class DataStorage { localIdentities.get().setParentCategory(ALL_IDENTITIES_CATEGORY_UUID); } - var allMacros = getStoreCategoryIfPresent(ALL_MACROS_CATEGORY_UUID); - if (allMacros.isEmpty()) { - var cat = DataStoreCategory.createNew(null, ALL_MACROS_CATEGORY_UUID, "All macros"); - cat.setDirectory(categoriesDir.resolve(ALL_MACROS_CATEGORY_UUID.toString())); - storeCategories.add(cat); - } else { - allMacros.get().setParentCategory(null); - } +// var allMacros = getStoreCategoryIfPresent(ALL_MACROS_CATEGORY_UUID); +// if (allMacros.isEmpty()) { +// var cat = DataStoreCategory.createNew(null, ALL_MACROS_CATEGORY_UUID, "All macros"); +// cat.setDirectory(categoriesDir.resolve(ALL_MACROS_CATEGORY_UUID.toString())); +// storeCategories.add(cat); +// } else { +// allMacros.get().setParentCategory(null); +// } if (supportsSync()) { var sharedIdentities = getStoreCategoryIfPresent(SYNCED_IDENTITIES_CATEGORY_UUID); diff --git a/ext/base/src/main/java/io/xpipe/ext/base/identity/LocalIdentityConvertActionProvider.java b/ext/base/src/main/java/io/xpipe/ext/base/identity/LocalIdentityConvertActionProvider.java index c52c250df..7d414e5ad 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/identity/LocalIdentityConvertActionProvider.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/identity/LocalIdentityConvertActionProvider.java @@ -1,10 +1,11 @@ package io.xpipe.ext.base.identity; import io.xpipe.app.action.AbstractAction; -import io.xpipe.app.action.LeafStoreActionProvider; +import io.xpipe.app.hub.action.LeafStoreActionProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.ext.DataStoreCreationCategory; import io.xpipe.app.hub.action.StoreAction; +import io.xpipe.app.hub.action.StoreActionCategory; import io.xpipe.app.hub.comp.StoreCreationDialog; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntryRef; @@ -18,6 +19,11 @@ import lombok.extern.jackson.Jacksonized; public class LocalIdentityConvertActionProvider implements LeafStoreActionProvider { + @Override + public StoreActionCategory getCategory() { + return StoreActionCategory.CUSTOM; + } + @Override public AbstractAction createAction(DataStoreEntryRef ref) { return Action.builder().ref(ref).build(); diff --git a/ext/base/src/main/java/io/xpipe/ext/base/script/RunScriptActionProviderMenu.java b/ext/base/src/main/java/io/xpipe/ext/base/script/RunScriptActionProviderMenu.java index e6e56773e..18c4e6b68 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/script/RunScriptActionProviderMenu.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/script/RunScriptActionProviderMenu.java @@ -4,8 +4,7 @@ import io.xpipe.app.action.*; import io.xpipe.app.core.AppI18n; import io.xpipe.app.ext.ProcessControlProvider; import io.xpipe.app.ext.ShellStore; -import io.xpipe.app.hub.action.BatchStoreActionProvider; -import io.xpipe.app.hub.action.StoreAction; +import io.xpipe.app.hub.action.*; import io.xpipe.app.hub.action.impl.CategoryConfigActionProvider; import io.xpipe.app.hub.action.impl.CategorySelectActionProvider; import io.xpipe.app.hub.action.impl.RefreshStoreActionProvider; @@ -22,10 +21,16 @@ import javafx.beans.value.ObservableValue; import lombok.Value; import java.util.List; +import java.util.stream.Collectors; public class RunScriptActionProviderMenu implements BranchStoreActionProvider, BatchStoreActionProvider { + @Override + public StoreActionCategory getCategory() { + return StoreActionCategory.CUSTOM; + } + @Value private static class TerminalRunActionProvider implements LeafStoreActionProvider, BatchStoreActionProvider { @@ -239,7 +244,7 @@ public class RunScriptActionProviderMenu } @Override - public List getChildren(DataStoreEntryRef store) { + public List> getChildren(DataStoreEntryRef store) { if (hierarchy.isLeaf()) { return List.of( new TerminalRunActionProvider(hierarchy), @@ -249,7 +254,7 @@ public class RunScriptActionProviderMenu return hierarchy.getChildren().stream() .map(c -> new ScriptActionProvider(c)) - .toList(); + .collect(Collectors.toList()); } } @@ -419,7 +424,7 @@ public class RunScriptActionProviderMenu } @Override - public List getChildren(DataStoreEntryRef store) { + public List> getChildren(DataStoreEntryRef store) { if (Boolean.TRUE.equals( DataStorage.get().getEffectiveCategoryConfig(store.get()).getDontAllowScripts())) { return List.of(new ScriptsDisabledActionProvider()); @@ -442,9 +447,9 @@ public class RunScriptActionProviderMenu return true; }); - var list = hierarchy.getChildren().stream() + List> list = hierarchy.getChildren().stream() .map(c -> new ScriptActionProvider(c)) - .toList(); + .collect(Collectors.toList()); if (list.isEmpty()) { return List.of(new NoScriptsActionProvider()); } else { diff --git a/ext/base/src/main/java/io/xpipe/ext/base/script/SimpleScriptQuickEditActionProvider.java b/ext/base/src/main/java/io/xpipe/ext/base/script/SimpleScriptQuickEditActionProvider.java index 04a36660e..bd3370d7c 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/script/SimpleScriptQuickEditActionProvider.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/script/SimpleScriptQuickEditActionProvider.java @@ -1,9 +1,10 @@ package io.xpipe.ext.base.script; import io.xpipe.app.action.AbstractAction; -import io.xpipe.app.action.LeafStoreActionProvider; +import io.xpipe.app.hub.action.LeafStoreActionProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.hub.action.StoreAction; +import io.xpipe.app.hub.action.StoreActionCategory; import io.xpipe.app.hub.comp.StoreCreationDialog; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntryRef; @@ -20,6 +21,11 @@ import java.util.Arrays; public class SimpleScriptQuickEditActionProvider implements LeafStoreActionProvider { + @Override + public StoreActionCategory getCategory() { + return StoreActionCategory.CUSTOM; + } + @Override public boolean isDefault(DataStoreEntryRef o) { return true; diff --git a/ext/base/src/main/java/io/xpipe/ext/base/service/ServiceCopyAddressActionProvider.java b/ext/base/src/main/java/io/xpipe/ext/base/service/ServiceCopyAddressActionProvider.java index e3d5a3e8b..13c9de886 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/service/ServiceCopyAddressActionProvider.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/service/ServiceCopyAddressActionProvider.java @@ -1,9 +1,10 @@ package io.xpipe.ext.base.service; import io.xpipe.app.action.AbstractAction; -import io.xpipe.app.action.LeafStoreActionProvider; +import io.xpipe.app.hub.action.LeafStoreActionProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.hub.action.StoreAction; +import io.xpipe.app.hub.action.StoreActionCategory; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.ClipboardHelper; import io.xpipe.app.util.LabelGraphic; @@ -15,6 +16,11 @@ import lombok.extern.jackson.Jacksonized; public class ServiceCopyAddressActionProvider implements LeafStoreActionProvider { + @Override + public StoreActionCategory getCategory() { + return StoreActionCategory.CUSTOM; + } + @Override public boolean isMajor(DataStoreEntryRef o) { return true; diff --git a/ext/base/src/main/java/io/xpipe/ext/base/service/ServiceRefreshActionProvider.java b/ext/base/src/main/java/io/xpipe/ext/base/service/ServiceRefreshActionProvider.java index 73f7fa91e..be4ad4373 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/service/ServiceRefreshActionProvider.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/service/ServiceRefreshActionProvider.java @@ -1,9 +1,10 @@ package io.xpipe.ext.base.service; -import io.xpipe.app.action.LeafStoreActionProvider; +import io.xpipe.app.hub.action.LeafStoreActionProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.hub.action.BatchStoreActionProvider; import io.xpipe.app.hub.action.StoreAction; +import io.xpipe.app.hub.action.StoreActionCategory; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.LabelGraphic; @@ -17,6 +18,11 @@ public class ServiceRefreshActionProvider implements LeafStoreActionProvider, BatchStoreActionProvider { + @Override + public StoreActionCategory getCategory() { + return StoreActionCategory.CUSTOM; + } + @Override public boolean isMajor(DataStoreEntryRef o) { return true; diff --git a/ext/base/src/main/java/io/xpipe/ext/base/store/StorePauseActionProvider.java b/ext/base/src/main/java/io/xpipe/ext/base/store/StorePauseActionProvider.java index a28c90831..f004ca189 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/store/StorePauseActionProvider.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/store/StorePauseActionProvider.java @@ -1,9 +1,10 @@ package io.xpipe.ext.base.store; -import io.xpipe.app.action.LeafStoreActionProvider; +import io.xpipe.app.hub.action.LeafStoreActionProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.hub.action.BatchStoreActionProvider; import io.xpipe.app.hub.action.StoreAction; +import io.xpipe.app.hub.action.StoreActionCategory; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.LabelGraphic; @@ -15,6 +16,11 @@ import lombok.extern.jackson.Jacksonized; public class StorePauseActionProvider implements LeafStoreActionProvider, BatchStoreActionProvider { + @Override + public StoreActionCategory getCategory() { + return StoreActionCategory.CUSTOM; + } + @Override public boolean isMutation() { return true; diff --git a/ext/base/src/main/java/io/xpipe/ext/base/store/StoreRestartActionProvider.java b/ext/base/src/main/java/io/xpipe/ext/base/store/StoreRestartActionProvider.java index a15558b01..264060b96 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/store/StoreRestartActionProvider.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/store/StoreRestartActionProvider.java @@ -1,9 +1,10 @@ package io.xpipe.ext.base.store; -import io.xpipe.app.action.LeafStoreActionProvider; +import io.xpipe.app.hub.action.LeafStoreActionProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.hub.action.BatchStoreActionProvider; import io.xpipe.app.hub.action.StoreAction; +import io.xpipe.app.hub.action.StoreActionCategory; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.LabelGraphic; import io.xpipe.core.store.DataStore; @@ -16,6 +17,11 @@ import lombok.extern.jackson.Jacksonized; public class StoreRestartActionProvider implements LeafStoreActionProvider, BatchStoreActionProvider { + @Override + public StoreActionCategory getCategory() { + return StoreActionCategory.CUSTOM; + } + @Override public boolean isMutation() { return true; diff --git a/ext/base/src/main/java/io/xpipe/ext/base/store/StoreStartActionProvider.java b/ext/base/src/main/java/io/xpipe/ext/base/store/StoreStartActionProvider.java index 8b44b7458..b14840e01 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/store/StoreStartActionProvider.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/store/StoreStartActionProvider.java @@ -1,9 +1,10 @@ package io.xpipe.ext.base.store; -import io.xpipe.app.action.LeafStoreActionProvider; +import io.xpipe.app.hub.action.LeafStoreActionProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.hub.action.BatchStoreActionProvider; import io.xpipe.app.hub.action.StoreAction; +import io.xpipe.app.hub.action.StoreActionCategory; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.LabelGraphic; @@ -15,6 +16,11 @@ import lombok.extern.jackson.Jacksonized; public class StoreStartActionProvider implements LeafStoreActionProvider, BatchStoreActionProvider { + @Override + public StoreActionCategory getCategory() { + return StoreActionCategory.CUSTOM; + } + @Override public boolean isMutation() { return true; diff --git a/ext/base/src/main/java/io/xpipe/ext/base/store/StoreStopActionProvider.java b/ext/base/src/main/java/io/xpipe/ext/base/store/StoreStopActionProvider.java index b37dc54ca..538e942b1 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/store/StoreStopActionProvider.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/store/StoreStopActionProvider.java @@ -1,9 +1,10 @@ package io.xpipe.ext.base.store; -import io.xpipe.app.action.LeafStoreActionProvider; +import io.xpipe.app.hub.action.LeafStoreActionProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.hub.action.BatchStoreActionProvider; import io.xpipe.app.hub.action.StoreAction; +import io.xpipe.app.hub.action.StoreActionCategory; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.LabelGraphic; @@ -15,6 +16,11 @@ import lombok.extern.jackson.Jacksonized; public class StoreStopActionProvider implements LeafStoreActionProvider, BatchStoreActionProvider { + @Override + public StoreActionCategory getCategory() { + return StoreActionCategory.CUSTOM; + } + @Override public boolean isMutation() { return true; diff --git a/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusContainerActionProviderMenu.java b/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusContainerActionProviderMenu.java index 69c3f1338..4392dd0ae 100644 --- a/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusContainerActionProviderMenu.java +++ b/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusContainerActionProviderMenu.java @@ -1,8 +1,9 @@ package io.xpipe.ext.system.incus; import io.xpipe.app.action.ActionProvider; -import io.xpipe.app.action.BranchStoreActionProvider; +import io.xpipe.app.hub.action.BranchStoreActionProvider; import io.xpipe.app.core.AppI18n; +import io.xpipe.app.hub.action.StoreActionProvider; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.LabelGraphic; import io.xpipe.ext.base.store.StorePauseActionProvider; @@ -37,7 +38,7 @@ public class IncusContainerActionProviderMenu implements BranchStoreActionProvid } @Override - public List getChildren(DataStoreEntryRef store) { + public List> getChildren(DataStoreEntryRef store) { return List.of( new StoreStartActionProvider(), new StoreStopActionProvider(), diff --git a/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusContainerConsoleActionProvider.java b/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusContainerConsoleActionProvider.java index ebe52bf03..ca8276b48 100644 --- a/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusContainerConsoleActionProvider.java +++ b/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusContainerConsoleActionProvider.java @@ -1,7 +1,7 @@ package io.xpipe.ext.system.incus; import io.xpipe.app.action.AbstractAction; -import io.xpipe.app.action.LeafStoreActionProvider; +import io.xpipe.app.hub.action.LeafStoreActionProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.hub.action.StoreAction; import io.xpipe.app.storage.DataStoreEntryRef; diff --git a/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusContainerEditConfigActionProvider.java b/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusContainerEditConfigActionProvider.java index 8fe9ba795..6200bdf76 100644 --- a/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusContainerEditConfigActionProvider.java +++ b/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusContainerEditConfigActionProvider.java @@ -1,7 +1,7 @@ package io.xpipe.ext.system.incus; import io.xpipe.app.action.AbstractAction; -import io.xpipe.app.action.LeafStoreActionProvider; +import io.xpipe.app.hub.action.LeafStoreActionProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.hub.action.StoreAction; import io.xpipe.app.storage.DataStoreEntryRef; diff --git a/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusContainerEditRunConfigActionProvider.java b/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusContainerEditRunConfigActionProvider.java index d11583e49..eb54ea341 100644 --- a/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusContainerEditRunConfigActionProvider.java +++ b/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusContainerEditRunConfigActionProvider.java @@ -1,7 +1,7 @@ package io.xpipe.ext.system.incus; import io.xpipe.app.action.AbstractAction; -import io.xpipe.app.action.LeafStoreActionProvider; +import io.xpipe.app.hub.action.LeafStoreActionProvider; import io.xpipe.app.browser.BrowserFullSessionModel; import io.xpipe.app.browser.file.BrowserFileOpener; import io.xpipe.app.core.AppI18n; diff --git a/ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdContainerActionProviderMenu.java b/ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdContainerActionProviderMenu.java index e5e3fb873..d88656774 100644 --- a/ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdContainerActionProviderMenu.java +++ b/ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdContainerActionProviderMenu.java @@ -1,8 +1,9 @@ package io.xpipe.ext.system.lxd; import io.xpipe.app.action.ActionProvider; -import io.xpipe.app.action.BranchStoreActionProvider; +import io.xpipe.app.hub.action.BranchStoreActionProvider; import io.xpipe.app.core.AppI18n; +import io.xpipe.app.hub.action.StoreActionProvider; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.LabelGraphic; import io.xpipe.ext.base.store.StorePauseActionProvider; @@ -37,7 +38,7 @@ public class LxdContainerActionProviderMenu implements BranchStoreActionProvider } @Override - public List getChildren(DataStoreEntryRef store) { + public List> getChildren(DataStoreEntryRef store) { return List.of( new StoreStartActionProvider(), new StoreStopActionProvider(), diff --git a/ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdContainerConsoleActionProvider.java b/ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdContainerConsoleActionProvider.java index 09371aeb7..09cc50e81 100644 --- a/ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdContainerConsoleActionProvider.java +++ b/ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdContainerConsoleActionProvider.java @@ -1,7 +1,7 @@ package io.xpipe.ext.system.lxd; import io.xpipe.app.action.AbstractAction; -import io.xpipe.app.action.LeafStoreActionProvider; +import io.xpipe.app.hub.action.LeafStoreActionProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.hub.action.StoreAction; import io.xpipe.app.storage.DataStoreEntryRef; diff --git a/ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdContainerEditConfigActionProvider.java b/ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdContainerEditConfigActionProvider.java index 0c98b1a99..760a4c1f2 100644 --- a/ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdContainerEditConfigActionProvider.java +++ b/ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdContainerEditConfigActionProvider.java @@ -1,7 +1,7 @@ package io.xpipe.ext.system.lxd; import io.xpipe.app.action.AbstractAction; -import io.xpipe.app.action.LeafStoreActionProvider; +import io.xpipe.app.hub.action.LeafStoreActionProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.hub.action.StoreAction; import io.xpipe.app.storage.DataStoreEntryRef; diff --git a/ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdContainerEditRunConfigActionProvider.java b/ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdContainerEditRunConfigActionProvider.java index 75093e5a7..e3a92a080 100644 --- a/ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdContainerEditRunConfigActionProvider.java +++ b/ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdContainerEditRunConfigActionProvider.java @@ -1,7 +1,7 @@ package io.xpipe.ext.system.lxd; import io.xpipe.app.action.AbstractAction; -import io.xpipe.app.action.LeafStoreActionProvider; +import io.xpipe.app.hub.action.LeafStoreActionProvider; import io.xpipe.app.browser.BrowserFullSessionModel; import io.xpipe.app.browser.file.BrowserFileOpener; import io.xpipe.app.core.AppI18n; diff --git a/ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanContainerActionProviderMenu.java b/ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanContainerActionProviderMenu.java index ab2e3792c..840ce198e 100644 --- a/ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanContainerActionProviderMenu.java +++ b/ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanContainerActionProviderMenu.java @@ -1,8 +1,9 @@ package io.xpipe.ext.system.podman; import io.xpipe.app.action.ActionProvider; -import io.xpipe.app.action.BranchStoreActionProvider; +import io.xpipe.app.hub.action.BranchStoreActionProvider; import io.xpipe.app.core.AppI18n; +import io.xpipe.app.hub.action.StoreActionProvider; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.LabelGraphic; import io.xpipe.ext.base.store.StoreRestartActionProvider; @@ -36,7 +37,7 @@ public class PodmanContainerActionProviderMenu implements BranchStoreActionProvi } @Override - public List getChildren(DataStoreEntryRef store) { + public List> getChildren(DataStoreEntryRef store) { return List.of( new StoreStartActionProvider(), new StoreStopActionProvider(), diff --git a/ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanContainerAttachActionProvider.java b/ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanContainerAttachActionProvider.java index c5ee97d6b..f6b92faf5 100644 --- a/ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanContainerAttachActionProvider.java +++ b/ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanContainerAttachActionProvider.java @@ -1,6 +1,6 @@ package io.xpipe.ext.system.podman; -import io.xpipe.app.action.LeafStoreActionProvider; +import io.xpipe.app.hub.action.LeafStoreActionProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.hub.action.StoreAction; import io.xpipe.app.storage.DataStoreEntryRef; diff --git a/ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanContainerInspectActionProvider.java b/ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanContainerInspectActionProvider.java index 8a498c2e8..7f9c72ca4 100644 --- a/ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanContainerInspectActionProvider.java +++ b/ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanContainerInspectActionProvider.java @@ -1,7 +1,7 @@ package io.xpipe.ext.system.podman; import io.xpipe.app.action.AbstractAction; -import io.xpipe.app.action.LeafStoreActionProvider; +import io.xpipe.app.hub.action.LeafStoreActionProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.hub.action.StoreAction; import io.xpipe.app.storage.DataStoreEntryRef; diff --git a/ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanContainerLogsActionProvider.java b/ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanContainerLogsActionProvider.java index b5be80827..fb56a9b40 100644 --- a/ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanContainerLogsActionProvider.java +++ b/ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanContainerLogsActionProvider.java @@ -1,7 +1,7 @@ package io.xpipe.ext.system.podman; import io.xpipe.app.action.AbstractAction; -import io.xpipe.app.action.LeafStoreActionProvider; +import io.xpipe.app.hub.action.LeafStoreActionProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.hub.action.StoreAction; import io.xpipe.app.storage.DataStoreEntryRef;