Skip to content

Commit a062081

Browse files
committed
Implemented remove materials when remove model file.
1 parent 0b223ce commit a062081

File tree

9 files changed

+244
-29
lines changed

9 files changed

+244
-29
lines changed

resources/messages/messages.properties

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -517,4 +517,6 @@ ModelConverterDialogDestinationFolder=Destination folder
517517
ModelConverterDialogExportMaterials=Need to export materials
518518
ModelConverterDialogMaterialsFolder=Folder to store materials
519519
ModelConverterDialogOverwriteMaterials=Overwrite materials
520-
ModelConverterDialogButtonOk=Convert
520+
ModelConverterDialogButtonOk=Convert
521+
522+
FileDeleteHandlerDeleteMaterials=Do you want to remove all materials which used from %file_name%?

resources/messages/messages_ru.properties

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -517,4 +517,6 @@ ModelConverterDialogDestinationFolder=Папка для сохранения
517517
ModelConverterDialogExportMaterials=Нужно ли эксп. материалы
518518
ModelConverterDialogMaterialsFolder=Папка для сохр. материалов
519519
ModelConverterDialogOverwriteMaterials=Перезаписывать ли материалы
520-
ModelConverterDialogButtonOk=Конвертировать
520+
ModelConverterDialogButtonOk=Конвертировать
521+
522+
FileDeleteHandlerDeleteMaterials=Хотите ли вы удалить все материалы которые использовались моделью %file_name%?

src/com/ss/editor/Messages.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -540,6 +540,8 @@ public class Messages {
540540
public static final String MODEL_CONVERTER_DIALOG_OVERWRITE_MATERIALS;
541541
public static final String MODEL_CONVERTER_DIALOG_BUTTON_OK;
542542

543+
public static final String FILE_DELETE_HANDLER_DELETE_MATERIALS;
544+
543545
static {
544546

545547
final Locale locale = Locale.getDefault();
@@ -1081,5 +1083,7 @@ public class Messages {
10811083
MODEL_CONVERTER_DIALOG_MATERIAL_FOLDER = bundle.getString("ModelConverterDialogMaterialsFolder");
10821084
MODEL_CONVERTER_DIALOG_OVERWRITE_MATERIALS = bundle.getString("ModelConverterDialogOverwriteMaterials");
10831085
MODEL_CONVERTER_DIALOG_BUTTON_OK = bundle.getString("ModelConverterDialogButtonOk");
1086+
1087+
FILE_DELETE_HANDLER_DELETE_MATERIALS = bundle.getString("FileDeleteHandlerDeleteMaterials");
10841088
}
10851089
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.ss.editor.file.delete.handler;
2+
3+
import com.ss.editor.annotation.FXThread;
4+
import org.jetbrains.annotations.NotNull;
5+
6+
import java.nio.file.Path;
7+
8+
/**
9+
* The interface to implement a handler to handle deleted file from the editor.
10+
*
11+
* @author JavaSaBr
12+
*/
13+
public interface FileDeleteHandler extends Cloneable {
14+
15+
/**
16+
* Handle a file to delete before deleting.
17+
*
18+
* @param file the file to delete.
19+
*/
20+
@FXThread
21+
void preDelete(@NotNull final Path file);
22+
23+
/**
24+
* Handle a file to delete after deleting.
25+
*
26+
* @param file the deleted file.
27+
*/
28+
@FXThread
29+
void postDelete(@NotNull final Path file);
30+
31+
/**
32+
* Check that the file need to handle.
33+
*
34+
* @param file the file to check.
35+
* @return true of the file need to handle.
36+
*/
37+
@FXThread
38+
boolean isNeedHandle(@NotNull Path file);
39+
40+
/**
41+
* @return the cloned instance.
42+
*/
43+
FileDeleteHandler clone();
44+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.ss.editor.file.delete.handler;
2+
3+
import com.ss.editor.annotation.FromAnyThread;
4+
import com.ss.editor.file.delete.handler.impl.DeleteMaterialsModelFileDeleteHandler;
5+
import org.jetbrains.annotations.NotNull;
6+
import rlib.util.array.Array;
7+
import rlib.util.array.ArrayFactory;
8+
9+
import java.nio.file.Path;
10+
11+
/**
12+
* The factory of delete handlers of deleted file.
13+
*
14+
* @author JavaSaBr
15+
*/
16+
public class FileDeleteHandlerFactory {
17+
18+
private static final Array<FileDeleteHandler> HANDLERS = ArrayFactory.newArray(FileDeleteHandler.class);
19+
20+
static {
21+
HANDLERS.add(new DeleteMaterialsModelFileDeleteHandler());
22+
}
23+
24+
/**
25+
* Find handlers for the file.
26+
*
27+
* @param file the file.
28+
* @return the list of handlers.
29+
*/
30+
@FromAnyThread
31+
public static Array<FileDeleteHandler> findFor(@NotNull final Path file) {
32+
33+
final Array<FileDeleteHandler> result = ArrayFactory.newArray(FileDeleteHandler.class);
34+
35+
HANDLERS.forEach(result, file, (handler, toCollect, f) -> handler.isNeedHandle(f),
36+
(handler, toCollect, f) -> toCollect.add(handler.clone()));
37+
38+
return result;
39+
}
40+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.ss.editor.file.delete.handler.impl;
2+
3+
import com.ss.editor.Editor;
4+
import com.ss.editor.JFXApplication;
5+
import com.ss.editor.file.delete.handler.FileDeleteHandler;
6+
import org.jetbrains.annotations.NotNull;
7+
8+
import java.nio.file.Path;
9+
10+
/**
11+
* The base implementation of file delete handler.
12+
*
13+
* @author JavaSaBr
14+
*/
15+
public abstract class AbstractFileDeleteHandler implements FileDeleteHandler {
16+
17+
@NotNull
18+
protected static final JFXApplication JFX_APPLICATION = JFXApplication.getInstance();
19+
20+
@NotNull
21+
protected static final Editor EDITOR = Editor.getInstance();
22+
23+
@Override
24+
public void preDelete(@NotNull final Path file) {
25+
}
26+
27+
@Override
28+
public void postDelete(@NotNull final Path file) {
29+
30+
}
31+
32+
@Override
33+
public boolean isNeedHandle(@NotNull final Path file) {
34+
return false;
35+
}
36+
37+
@Override
38+
public FileDeleteHandler clone() {
39+
try {
40+
return (FileDeleteHandler) super.clone();
41+
} catch (final CloneNotSupportedException e) {
42+
throw new RuntimeException(e);
43+
}
44+
}
45+
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package com.ss.editor.file.delete.handler.impl;
2+
3+
import static com.ss.editor.util.EditorUtil.getAssetFile;
4+
import static com.ss.editor.util.EditorUtil.toAssetPath;
5+
import static java.util.Objects.requireNonNull;
6+
import com.jme3.asset.AssetManager;
7+
import com.jme3.material.Material;
8+
import com.jme3.scene.Spatial;
9+
import com.ss.editor.FileExtensions;
10+
import com.ss.editor.Messages;
11+
import com.ss.editor.ui.dialog.ConfirmDialog;
12+
import com.ss.editor.ui.scene.EditorFXScene;
13+
import com.ss.editor.util.EditorUtil;
14+
import com.ss.editor.util.NodeUtils;
15+
import org.jetbrains.annotations.NotNull;
16+
import org.jetbrains.annotations.Nullable;
17+
import rlib.util.FileUtils;
18+
import rlib.util.StringUtils;
19+
import rlib.util.array.Array;
20+
import rlib.util.array.ArrayFactory;
21+
22+
import java.nio.file.Files;
23+
import java.nio.file.Path;
24+
25+
/**
26+
* The implementation of delete handler to delete related materials.
27+
*
28+
* @author JavaSaBr
29+
*/
30+
public class DeleteMaterialsModelFileDeleteHandler extends AbstractFileDeleteHandler {
31+
32+
@Nullable
33+
private Spatial model;
34+
35+
@Override
36+
public void preDelete(@NotNull final Path file) {
37+
super.preDelete(file);
38+
39+
final AssetManager assetManager = EDITOR.getAssetManager();
40+
final Path assetFile = requireNonNull(getAssetFile(file));
41+
final String assetPath = toAssetPath(assetFile);
42+
43+
this.model = assetManager.loadModel(assetPath);
44+
}
45+
46+
/**
47+
* @return removed model.
48+
*/
49+
@NotNull
50+
private Spatial getModel() {
51+
return requireNonNull(model);
52+
}
53+
54+
@Override
55+
public void postDelete(@NotNull final Path file) {
56+
super.postDelete(file);
57+
58+
String question = Messages.FILE_DELETE_HANDLER_DELETE_MATERIALS;
59+
question = question.replace("%file_name%", file.getFileName().toString());
60+
61+
final EditorFXScene scene = JFX_APPLICATION.getScene();
62+
final ConfirmDialog confirmDialog = new ConfirmDialog(this::handle, question);
63+
confirmDialog.show(scene.getWindow());
64+
}
65+
66+
private void handle(@NotNull final Boolean result) {
67+
if (!result) return;
68+
69+
final Array<String> assetKeys = ArrayFactory.newArray(String.class);
70+
71+
final Spatial model = getModel();
72+
NodeUtils.visitGeometry(model, geometry -> {
73+
final Material material = geometry.getMaterial();
74+
final String assetName = material.getAssetName();
75+
if (!StringUtils.isEmpty(assetName)) assetKeys.add(assetName);
76+
});
77+
78+
assetKeys.stream().map(EditorUtil::getRealFile)
79+
.filter(Files::exists)
80+
.forEach(FileUtils::delete);
81+
}
82+
83+
@Override
84+
public boolean isNeedHandle(@NotNull final Path file) {
85+
final String extension = FileUtils.getExtension(file);
86+
return FileExtensions.JME_OBJECT.equals(extension);
87+
}
88+
}

src/com/ss/editor/ui/component/asset/tree/ResourceTree.java

Lines changed: 11 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,48 +3,27 @@
33
import static com.ss.editor.ui.component.asset.tree.resource.ResourceElementFactory.createFor;
44
import static com.ss.editor.ui.util.UIUtils.findItemForValue;
55
import static java.util.Objects.requireNonNull;
6-
76
import com.ss.editor.config.EditorConfig;
87
import com.ss.editor.file.converter.FileConverterDescription;
98
import com.ss.editor.file.converter.FileConverterRegistry;
109
import com.ss.editor.manager.ExecutorManager;
11-
import com.ss.editor.ui.component.asset.tree.context.menu.action.ConvertFileAction;
12-
import com.ss.editor.ui.component.asset.tree.context.menu.action.CopyFileAction;
13-
import com.ss.editor.ui.component.asset.tree.context.menu.action.CutFileAction;
14-
import com.ss.editor.ui.component.asset.tree.context.menu.action.DeleteFileAction;
15-
import com.ss.editor.ui.component.asset.tree.context.menu.action.NewFileAction;
16-
import com.ss.editor.ui.component.asset.tree.context.menu.action.OpenFileAction;
17-
import com.ss.editor.ui.component.asset.tree.context.menu.action.OpenFileByExternalEditorAction;
18-
import com.ss.editor.ui.component.asset.tree.context.menu.action.OpenWithFileAction;
19-
import com.ss.editor.ui.component.asset.tree.context.menu.action.PasteFileAction;
20-
import com.ss.editor.ui.component.asset.tree.context.menu.action.RenameFileAction;
10+
import com.ss.editor.ui.component.asset.tree.context.menu.action.*;
2111
import com.ss.editor.ui.component.asset.tree.resource.FileElement;
2212
import com.ss.editor.ui.component.asset.tree.resource.FolderElement;
2313
import com.ss.editor.ui.component.asset.tree.resource.ResourceElement;
2414
import com.ss.editor.ui.component.asset.tree.resource.ResourceLoadingElement;
2515
import com.ss.editor.ui.css.CSSClasses;
2616
import com.ss.editor.ui.util.UIUtils;
2717
import com.ss.editor.util.EditorUtil;
28-
29-
import org.jetbrains.annotations.NotNull;
30-
import org.jetbrains.annotations.Nullable;
31-
32-
import java.nio.file.Path;
33-
import java.util.Objects;
34-
import java.util.function.Consumer;
35-
import java.util.function.Predicate;
36-
3718
import javafx.collections.FXCollections;
3819
import javafx.collections.ObservableList;
3920
import javafx.event.ActionEvent;
4021
import javafx.event.EventHandler;
41-
import javafx.scene.control.ContextMenu;
42-
import javafx.scene.control.MenuItem;
43-
import javafx.scene.control.MultipleSelectionModel;
44-
import javafx.scene.control.TreeItem;
45-
import javafx.scene.control.TreeView;
22+
import javafx.scene.control.*;
4623
import javafx.scene.input.KeyCode;
4724
import javafx.scene.input.KeyEvent;
25+
import org.jetbrains.annotations.NotNull;
26+
import org.jetbrains.annotations.Nullable;
4827
import rlib.function.IntObjectConsumer;
4928
import rlib.ui.util.FXUtils;
5029
import rlib.util.StringUtils;
@@ -53,10 +32,15 @@
5332
import rlib.util.array.ArrayFactory;
5433
import rlib.util.array.ConcurrentArray;
5534

35+
import java.nio.file.Path;
36+
import java.util.Objects;
37+
import java.util.function.Consumer;
38+
import java.util.function.Predicate;
39+
5640
/**
5741
* THe implementation of a tree with resources of an asset folder.
5842
*
59-
* @author JavaSaBr.
43+
* @author JavaSaBr
6044
*/
6145
public class ResourceTree extends TreeView<ResourceElement> {
6246

@@ -257,7 +241,7 @@ private Predicate<Class<?>> getActionTester() {
257241
/**
258242
* @return the context menu for the element.
259243
*/
260-
ContextMenu getContextMenu(@NotNull final ResourceElement element) {
244+
protected ContextMenu getContextMenu(@NotNull final ResourceElement element) {
261245
if (isReadOnly()) return null;
262246

263247
final EditorConfig editorConfig = EditorConfig.getInstance();

src/com/ss/editor/ui/component/asset/tree/context/menu/action/DeleteFileAction.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import com.ss.editor.JFXApplication;
44
import com.ss.editor.Messages;
55
import com.ss.editor.config.EditorConfig;
6+
import com.ss.editor.file.delete.handler.FileDeleteHandler;
7+
import com.ss.editor.file.delete.handler.FileDeleteHandlerFactory;
68
import com.ss.editor.ui.Icons;
79
import com.ss.editor.ui.component.asset.tree.resource.ResourceElement;
810
import com.ss.editor.ui.dialog.ConfirmDialog;
@@ -11,6 +13,7 @@
1113
import javafx.scene.image.ImageView;
1214
import org.jetbrains.annotations.NotNull;
1315
import rlib.util.FileUtils;
16+
import rlib.util.array.Array;
1417

1518
import java.nio.file.Path;
1619

@@ -66,6 +69,9 @@ private void processDelete() {
6669
*/
6770
private void handle(@NotNull final Path file, @NotNull final Boolean result) {
6871
if (!result) return;
72+
final Array<FileDeleteHandler> handlers = FileDeleteHandlerFactory.findFor(file);
73+
handlers.forEach(file, FileDeleteHandler::preDelete);
6974
FileUtils.delete(file);
75+
handlers.forEach(file, FileDeleteHandler::postDelete);
7076
}
7177
}

0 commit comments

Comments
 (0)