1

feat: экспорт папки

This commit is contained in:
2025-02-27 13:21:18 +03:00
parent 93dfa59d40
commit d9098e2d34

View File

@@ -7,6 +7,7 @@ import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem; import javafx.scene.control.MenuItem;
import javafx.scene.control.TreeItem; import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView; import javafx.scene.control.TreeView;
import javafx.stage.DirectoryChooser;
import javafx.stage.FileChooser; import javafx.stage.FileChooser;
import javafx.stage.Stage; import javafx.stage.Stage;
import lombok.Setter; import lombok.Setter;
@@ -16,12 +17,17 @@ import ru.di9.ss14.extractor.ContentRec;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream;
import java.net.URL; import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import java.util.SortedSet; import java.util.SortedSet;
import static java.lang.System.out;
public class MainController implements Initializable { public class MainController implements Initializable {
private static final int STATE_NOT_LOADED = 0; private static final int STATE_NOT_LOADED = 0;
private static final int STATE_LOAD_IN_PROGRESS = 1; private static final int STATE_LOAD_IN_PROGRESS = 1;
@@ -107,14 +113,15 @@ public class MainController implements Initializable {
if (contentRec.isFolder()) { if (contentRec.isFolder()) {
createTreeItems(fileItem, contentRec.getChildren()); createTreeItems(fileItem, contentRec.getChildren());
fileItem.setContextMenuBuilder(() -> createFolderContextMenu(contentRec));
} else { } else {
fileItem.setContextMenuBuilder(() -> createContextMenu(contentRec)); fileItem.setContextMenuBuilder(() -> createFileContextMenu(contentRec));
} }
}); });
} }
private ContextMenu createContextMenu(ContentRec contentRec) { private ContextMenu createFileContextMenu(ContentRec contentRec) {
var menuItem = new MenuItem("\uD83D\uDCBE Сохранить %s в...".formatted(contentRec.getName())); var menuItem = new MenuItem("\uD83D\uDCBE Сохранить файл '%s' в...".formatted(contentRec.getName()));
menuItem.setOnAction(event -> { menuItem.setOnAction(event -> {
var fileChooser = new FileChooser(); var fileChooser = new FileChooser();
fileChooser.setTitle("Сохранить " + contentRec.getName()); fileChooser.setTitle("Сохранить " + contentRec.getName());
@@ -142,4 +149,49 @@ public class MainController implements Initializable {
contextMenu.getItems().add(menuItem); contextMenu.getItems().add(menuItem);
return contextMenu; return contextMenu;
} }
private ContextMenu createFolderContextMenu(ContentRec contentRec) {
var menuItem = new MenuItem("\uD83D\uDCBE Сохранить папку '%s' в...".formatted(contentRec.getName()));
menuItem.setOnAction(event -> {
var dirChooser = new DirectoryChooser();
dirChooser.setTitle("Сохранить " + contentRec.getName());
if (lastSaveDir != null) {
dirChooser.setInitialDirectory(lastSaveDir);
}
File dir = dirChooser.showDialog(stage);
if (dir == null) {
return;
}
try {
exportRecursiveFolder(contentRec, dir.toPath());
} catch (IOException e) {
throw new RuntimeException(e);
}
lastSaveDir = dir;
});
var contextMenu = new ContextMenu();
contextMenu.getItems().add(menuItem);
return contextMenu;
}
private void exportRecursiveFolder(ContentRec contentRec, Path currentDir) throws IOException {
var subDir = currentDir.resolve(contentRec.getName());
if (Files.notExists(subDir)) {
Files.createDirectory(subDir);
}
for (ContentRec rec : contentRec.getChildren()) {
if (rec.isFolder()) {
exportRecursiveFolder(rec, subDir);
} else {
try (var out = new FileOutputStream(subDir.resolve(rec.getName()).toFile())) {
manager.readContent(rec.getId(), out);
}
}
}
}
} }