From f06dcf9b606ea50503c8cfb300368e27b346bc90 Mon Sep 17 00:00:00 2001 From: crschnick Date: Sat, 11 Oct 2025 20:15:56 +0000 Subject: [PATCH] Ad ability to move categories --- .../xpipe/app/hub/comp/StoreCategoryComp.java | 22 +++++++++++++++++++ .../app/hub/comp/StoreCategoryWrapper.java | 4 ++++ .../io/xpipe/app/storage/DataStorage.java | 16 ++++++++++++++ .../xpipe/app/terminal/KittyTerminalType.java | 3 +-- 4 files changed, 43 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/xpipe/app/hub/comp/StoreCategoryComp.java b/app/src/main/java/io/xpipe/app/hub/comp/StoreCategoryComp.java index 540152221..33f996c66 100644 --- a/app/src/main/java/io/xpipe/app/hub/comp/StoreCategoryComp.java +++ b/app/src/main/java/io/xpipe/app/hub/comp/StoreCategoryComp.java @@ -24,6 +24,7 @@ import javafx.css.PseudoClass; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.control.ContextMenu; +import javafx.scene.control.Menu; import javafx.scene.control.MenuItem; import javafx.scene.control.SeparatorMenuItem; import javafx.scene.input.KeyCode; @@ -240,6 +241,27 @@ public class StoreCategoryComp extends SimpleComp { contextMenu.getItems().add(new SeparatorMenuItem()); + var move = new Menu(AppI18n.get("moveTo"), new FontIcon("mdi2f-folder-move-outline")); + StoreViewState.get() + .getSortedCategories(getCategory().getRoot()) + .getList() + .forEach(storeCategoryWrapper -> { + MenuItem m = new MenuItem(); + m.textProperty() + .setValue(" ".repeat(storeCategoryWrapper.getDepth()) + + storeCategoryWrapper.getName().getValue()); + m.setOnAction(event -> { + category.moveToParent(storeCategoryWrapper.getCategory()); + event.consume(); + }); + if (storeCategoryWrapper.getParent() == null) { + m.setDisable(true); + } + + move.getItems().add(m); + }); + contextMenu.getItems().add(move); + var del = new MenuItem(AppI18n.get("remove"), new FontIcon("mdal-delete_outline")); del.setOnAction(event -> { category.delete(); diff --git a/app/src/main/java/io/xpipe/app/hub/comp/StoreCategoryWrapper.java b/app/src/main/java/io/xpipe/app/hub/comp/StoreCategoryWrapper.java index 3519b9e6f..0d4efb570 100644 --- a/app/src/main/java/io/xpipe/app/hub/comp/StoreCategoryWrapper.java +++ b/app/src/main/java/io/xpipe/app/hub/comp/StoreCategoryWrapper.java @@ -99,6 +99,10 @@ public class StoreCategoryWrapper { }); } + public void moveToParent(DataStoreCategory newParent) { + DataStorage.get().moveCategoryToParent(category, newParent); + } + public void delete() { for (var c : children.getList()) { c.delete(); 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 d12f042c5..438779ecd 100644 --- a/app/src/main/java/io/xpipe/app/storage/DataStorage.java +++ b/app/src/main/java/io/xpipe/app/storage/DataStorage.java @@ -542,6 +542,22 @@ public abstract class DataStorage { saveAsync(); } + + public void moveCategoryToParent(DataStoreCategory cat, DataStoreCategory newParent) { + if (newParent.getUuid().equals(cat.getUuid())) { + return; + } + + if (cat.getParentCategory() == null) { + return; + } + + cat.setParentCategory(newParent.getUuid()); + listeners.forEach(storageListener -> storageListener.onEntryCategoryChange()); + listeners.forEach(storageListener -> storageListener.onStoreListUpdate()); + saveAsync(); + } + public void setOrderIndex(DataStoreEntry entry, int index) { entry.setOrderIndex(index); listeners.forEach(storageListener -> storageListener.onStoreListUpdate()); diff --git a/app/src/main/java/io/xpipe/app/terminal/KittyTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/KittyTerminalType.java index ccc029bfd..20e8f18d9 100644 --- a/app/src/main/java/io/xpipe/app/terminal/KittyTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/KittyTerminalType.java @@ -198,12 +198,11 @@ public interface KittyTerminalType extends ExternalTerminalType, TrackableTermin return false; } - var time = System.currentTimeMillis(); sc.command(CommandBuilder.of() .add("open", "-n", "-a", "kitty.app", "--args") .add("-o", "allow_remote_control=socket-only", "--listen-on", "unix:" + getSocket())) .execute(); - + for (int i = 0; i < 50; i++) { ThreadHelper.sleep(100); try (SocketChannel channel = SocketChannel.open(StandardProtocolFamily.UNIX)) {