Skip to content

Commit bfe6146

Browse files
committed
Implemented D&D models from asset tree to model tree.
1 parent e361fc0 commit bfe6146

File tree

6 files changed

+170
-59
lines changed

6 files changed

+170
-59
lines changed

src/com/ss/editor/ui/component/editor/impl/scene/AbstractSceneFileEditor.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
package com.ss.editor.ui.component.editor.impl.scene;
22

33
import static com.ss.editor.control.transform.SceneEditorControl.LOADED_MODEL_KEY;
4-
import static com.ss.editor.util.EditorUtil.getAssetFile;
5-
import static com.ss.editor.util.EditorUtil.toAssetPath;
4+
import static com.ss.editor.util.EditorUtil.*;
65
import static com.ss.editor.util.MaterialUtils.saveIfNeedTextures;
76
import static com.ss.editor.util.MaterialUtils.updateMaterialIdNeed;
87
import static java.util.Objects.requireNonNull;
@@ -58,7 +57,6 @@
5857
import com.ss.editor.util.MaterialUtils;
5958
import com.ss.editor.util.NodeUtils;
6059
import com.ss.extension.scene.SceneLayer;
61-
import com.ss.extension.scene.SceneNode;
6260
import javafx.geometry.Point2D;
6361
import javafx.scene.control.SplitPane;
6462
import javafx.scene.control.ToggleButton;
@@ -1128,8 +1126,7 @@ private void addNewModel(final @NotNull DragEvent dragEvent, @NotNull final Path
11281126
EXECUTOR_MANAGER.addEditorThreadTask(() -> {
11291127

11301128
final MA editorAppState = getEditorAppState();
1131-
final SceneLayer defaultLayer = currentModel instanceof SceneNode ?
1132-
((SceneNode) currentModel).getLayers().first() : null;
1129+
final SceneLayer defaultLayer = getDefaultLayer(this);
11331130

11341131
final AssetManager assetManager = EDITOR.getAssetManager();
11351132
final Spatial loadedModel = assetManager.loadModel(modelKey);

src/com/ss/editor/ui/control/model/node/spatial/NodeModelNode.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
11
package com.ss.editor.ui.control.model.node.spatial;
22

3+
import static com.ss.editor.control.transform.SceneEditorControl.LOADED_MODEL_KEY;
34
import static com.ss.editor.ui.control.tree.node.ModelNodeFactory.createFor;
5+
import static com.ss.editor.util.EditorUtil.*;
6+
import static java.util.Objects.requireNonNull;
7+
import com.jme3.asset.AssetManager;
48
import com.jme3.scene.Node;
59
import com.jme3.scene.Spatial;
10+
import com.ss.editor.FileExtensions;
611
import com.ss.editor.Messages;
12+
import com.ss.editor.model.undo.editor.ChangeConsumer;
713
import com.ss.editor.ui.Icons;
814
import com.ss.editor.ui.control.model.tree.ModelNodeTree;
915
import com.ss.editor.ui.control.model.tree.action.CreateNodeAction;
@@ -20,18 +26,23 @@
2026
import com.ss.editor.ui.control.model.tree.action.light.CreateDirectionLightAction;
2127
import com.ss.editor.ui.control.model.tree.action.light.CreatePointLightAction;
2228
import com.ss.editor.ui.control.model.tree.action.light.CreateSpotLightAction;
29+
import com.ss.editor.ui.control.model.tree.action.operation.AddChildOperation;
2330
import com.ss.editor.ui.control.model.tree.action.terrain.CreateTerrainAction;
2431
import com.ss.editor.ui.control.tree.AbstractNodeTree;
2532
import com.ss.editor.ui.control.tree.node.ModelNode;
33+
import com.ss.editor.ui.util.UIUtils;
2634
import com.ss.editor.util.GeomUtils;
35+
import com.ss.extension.scene.SceneLayer;
2736
import javafx.scene.control.Menu;
2837
import javafx.scene.image.Image;
2938
import javafx.scene.image.ImageView;
39+
import javafx.scene.input.Dragboard;
3040
import org.jetbrains.annotations.NotNull;
3141
import org.jetbrains.annotations.Nullable;
3242
import rlib.util.array.Array;
3343
import rlib.util.array.ArrayFactory;
3444

45+
import java.nio.file.Path;
3546
import java.util.List;
3647

3748
/**
@@ -138,4 +149,29 @@ public void remove(@NotNull final ModelNode<?> child) {
138149
public Image getIcon() {
139150
return Icons.NODE_16;
140151
}
152+
153+
@Override
154+
public boolean canAcceptExternal(@NotNull final Dragboard dragboard) {
155+
return UIUtils.isHasFile(dragboard, FileExtensions.JME_OBJECT);
156+
}
157+
158+
@Override
159+
public void acceptExternal(@NotNull final Dragboard dragboard, @NotNull final ChangeConsumer consumer) {
160+
UIUtils.handleDroppedFile(dragboard, FileExtensions.JME_OBJECT, getElement(), consumer, (node, cons, path) -> {
161+
162+
final SceneLayer defaultLayer = getDefaultLayer(cons);
163+
final Path assetFile = requireNonNull(getAssetFile(path), "Not found asset file for " + path);
164+
final String assetPath = toAssetPath(assetFile);
165+
166+
final AssetManager assetManager = EDITOR.getAssetManager();
167+
final Spatial loadedModel = assetManager.loadModel(assetPath);
168+
loadedModel.setUserData(LOADED_MODEL_KEY, true);
169+
170+
if (defaultLayer != null) {
171+
SceneLayer.setLayer(defaultLayer, loadedModel);
172+
}
173+
174+
cons.execute(new AddChildOperation(loadedModel, node));
175+
});
176+
}
141177
}

src/com/ss/editor/ui/control/tree/AbstractNodeTreeCell.java

Lines changed: 36 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static com.ss.editor.ui.util.UIUtils.findItem;
44
import static com.ss.editor.ui.util.UIUtils.findItemForValue;
5+
import static java.util.Objects.requireNonNull;
56
import static rlib.util.ClassUtils.unsafeCast;
67
import com.ss.editor.manager.ExecutorManager;
78
import com.ss.editor.model.undo.editor.ChangeConsumer;
@@ -317,46 +318,44 @@ private void startDrag(@NotNull final MouseEvent mouseEvent) {
317318
*/
318319
private void dragDropped(@NotNull final DragEvent dragEvent) {
319320

321+
final ModelNode<?> item = getItem();
322+
if (item == null) return;
323+
320324
final Dragboard dragboard = dragEvent.getDragboard();
321325
final Long objectId = (Long) dragboard.getContent(DATA_FORMAT);
322-
if (objectId == null) return;
323326

324-
final TreeView<ModelNode<?>> treeView = getTreeView();
325-
final TreeItem<ModelNode<?>> dragTreeItem = findItem(treeView, objectId);
326-
final ModelNode<?> dragItem = dragTreeItem == null ? null : dragTreeItem.getValue();
327-
if (dragItem == null) return;
327+
if (objectId != null) {
328328

329-
final ModelNode<?> item = getItem();
330-
if (item == null || !item.canAccept(dragItem)) return;
329+
final TreeView<ModelNode<?>> treeView = getTreeView();
330+
final TreeItem<ModelNode<?>> dragTreeItem = findItem(treeView, objectId);
331+
final ModelNode<?> dragItem = dragTreeItem == null ? null : dragTreeItem.getValue();
332+
if (dragItem == null || !item.canAccept(dragItem)) return;
333+
334+
final TreeItem<ModelNode<?>> newParentItem = findItemForValue(treeView, item);
335+
if (newParentItem == null) return;
336+
337+
final Set<TransferMode> transferModes = dragboard.getTransferModes();
338+
final boolean isCopy = transferModes.contains(TransferMode.COPY);
331339

332-
final Set<TransferMode> transferModes = dragboard.getTransferModes();
333-
final boolean isCopy = transferModes.contains(TransferMode.COPY);
334340

335-
final TreeItem<ModelNode<?>> newParentItem = findItemForValue(treeView, item);
336-
if (newParentItem == null) return;
341+
final Object element = dragItem.getElement();
337342

338-
final Object element = dragItem.getElement();
343+
if (processDragDropped(dragTreeItem, dragItem, item, isCopy, newParentItem, element)) return;
339344

340-
if (processDragDropped(dragTreeItem, dragItem, item, isCopy, newParentItem, element)) return;
345+
} else if (item.canAcceptExternal(dragboard)) {
346+
347+
final M nodeTree = getNodeTree();
348+
final ChangeConsumer changeConsumer = requireNonNull(nodeTree.getChangeConsumer());
349+
350+
item.acceptExternal(dragboard, changeConsumer);
351+
}
341352

342353
dragEvent.consume();
343354
}
344355

345356
protected boolean processDragDropped(@NotNull final TreeItem<ModelNode<?>> dragTreeItem, @NotNull final ModelNode<?> dragItem,
346357
@NotNull final ModelNode<?> item, final boolean isCopy,
347358
@NotNull final TreeItem<ModelNode<?>> newParentItem, @NotNull final Object element) {
348-
// FIXME if (isCopy) {
349-
//
350-
// //TODO переделать на операцию
351-
// final ModelNode<?> copy = item.copy();
352-
// final ModelNode<?> newParent = newParentItem.getValue();
353-
// newParent.add(dragItem);
354-
//
355-
// final M nodeTree = getNodeTree();
356-
// nodeTree.notifyAdded(newParent, copy, -1);
357-
// return false;
358-
// }
359-
360359
return true;
361360
}
362361

@@ -365,17 +364,22 @@ protected boolean processDragDropped(@NotNull final TreeItem<ModelNode<?>> dragT
365364
*/
366365
private void dragOver(@NotNull final DragEvent dragEvent) {
367366

367+
final ModelNode<?> item = getItem();
368+
if (item == null) return;
369+
368370
final Dragboard dragboard = dragEvent.getDragboard();
369371
final Long objectId = (Long) dragboard.getContent(DATA_FORMAT);
370-
if (objectId == null) return;
371372

372-
final TreeView<ModelNode<?>> treeView = getTreeView();
373-
final TreeItem<ModelNode<?>> dragTreeItem = findItem(treeView, objectId);
374-
final ModelNode<?> dragItem = dragTreeItem == null ? null : dragTreeItem.getValue();
375-
if (dragItem == null) return;
373+
if (objectId != null) {
376374

377-
final ModelNode<?> item = getItem();
378-
if (item == null || !item.canAccept(dragItem)) return;
375+
final TreeView<ModelNode<?>> treeView = getTreeView();
376+
final TreeItem<ModelNode<?>> dragTreeItem = findItem(treeView, objectId);
377+
final ModelNode<?> dragItem = dragTreeItem == null ? null : dragTreeItem.getValue();
378+
if (dragItem == null || !item.canAccept(dragItem)) return;
379+
380+
} else if (!item.canAcceptExternal(dragboard)) {
381+
return;
382+
}
379383

380384
final Set<TransferMode> transferModes = dragboard.getTransferModes();
381385
final boolean isCopy = transferModes.contains(TransferMode.COPY);

src/com/ss/editor/ui/control/tree/node/ModelNode.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
import com.ss.editor.Editor;
44
import com.ss.editor.model.UObject;
5+
import com.ss.editor.model.undo.editor.ChangeConsumer;
56
import com.ss.editor.ui.control.tree.AbstractNodeTree;
67
import javafx.collections.ObservableList;
78
import javafx.scene.control.MenuItem;
89
import javafx.scene.image.Image;
10+
import javafx.scene.input.Dragboard;
911
import org.jetbrains.annotations.NotNull;
1012
import org.jetbrains.annotations.Nullable;
1113
import rlib.util.array.Array;
@@ -136,12 +138,25 @@ public void changeName(@NotNull final AbstractNodeTree<?> nodeTree, @NotNull fin
136138
}
137139

138140
/**
139-
* @return true of this node can have the child.
141+
* @return true of this node can accept the child.
140142
*/
141143
public boolean canAccept(@NotNull final ModelNode<?> child) {
142144
return false;
143145
}
144146

147+
/**
148+
* @return true if this node can accept external resource.
149+
*/
150+
public boolean canAcceptExternal(@NotNull final Dragboard dragboard) {
151+
return false;
152+
}
153+
154+
/**
155+
* Accept external resources to this node.
156+
*/
157+
public void acceptExternal(@NotNull final Dragboard dragboard, @NotNull final ChangeConsumer consumer) {
158+
}
159+
145160
/**
146161
* @return true if this node supports moving.
147162
*/

src/com/ss/editor/ui/util/UIUtils.java

Lines changed: 59 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -419,18 +419,7 @@ public static void openAssetDialog(@NotNull final Consumer<Path> handler, @NotNu
419419
public static void acceptIfHasFile(@NotNull final DragEvent dragEvent, @NotNull final Array<String> extensions) {
420420

421421
final Dragboard dragboard = dragEvent.getDragboard();
422-
final List<File> files = unsafeCast(dragboard.getContent(DataFormat.FILES));
423-
424-
if (files == null || files.size() != 1) {
425-
return;
426-
}
427-
428-
final File file = files.get(0);
429-
final String extension = FileUtils.getExtension(file.getName(), true);
430-
431-
if (!extensions.contains(extension)) {
432-
return;
433-
}
422+
if (!isHasFile(dragboard, extensions)) return;
434423

435424
final Set<TransferMode> transferModes = dragboard.getTransferModes();
436425
final boolean isCopy = transferModes.contains(TransferMode.COPY);
@@ -439,6 +428,7 @@ public static void acceptIfHasFile(@NotNull final DragEvent dragEvent, @NotNull
439428
dragEvent.consume();
440429
}
441430

431+
442432
/**
443433
* Accept a drag event if it has a file with required extension.
444434
*
@@ -448,24 +438,56 @@ public static void acceptIfHasFile(@NotNull final DragEvent dragEvent, @NotNull
448438
public static void acceptIfHasFile(@NotNull final DragEvent dragEvent, @NotNull final String targetExtension) {
449439

450440
final Dragboard dragboard = dragEvent.getDragboard();
441+
if (!isHasFile(dragboard, targetExtension)) return;
442+
443+
final Set<TransferMode> transferModes = dragboard.getTransferModes();
444+
final boolean isCopy = transferModes.contains(TransferMode.COPY);
445+
446+
dragEvent.acceptTransferModes(isCopy ? TransferMode.COPY : TransferMode.MOVE);
447+
dragEvent.consume();
448+
}
449+
450+
451+
/**
452+
* Check the dragboard.
453+
*
454+
* @param dragboard the dragboard.
455+
* @param extensions the extensions.
456+
* @return true if there are required file.
457+
*/
458+
public static boolean isHasFile(@NotNull final Dragboard dragboard, @NotNull final Array<String> extensions) {
459+
451460
final List<File> files = unsafeCast(dragboard.getContent(DataFormat.FILES));
452461

453462
if (files == null || files.size() != 1) {
454-
return;
463+
return false;
455464
}
456465

457466
final File file = files.get(0);
458-
final String extension = FileUtils.getExtension(file.getName(), false);
467+
final String extension = FileUtils.getExtension(file.getName(), true);
459468

460-
if (!targetExtension.equalsIgnoreCase(extension)) {
461-
return;
469+
return extensions.contains(extension);
470+
}
471+
472+
/**
473+
* Check the dragboard.
474+
*
475+
* @param dragboard the dragboard.
476+
* @param targetExtension the target extension.
477+
* @return true if there are required file.
478+
*/
479+
public static boolean isHasFile(@NotNull final Dragboard dragboard, @NotNull final String targetExtension) {
480+
481+
final List<File> files = unsafeCast(dragboard.getContent(DataFormat.FILES));
482+
483+
if (files == null || files.size() != 1) {
484+
return false;
462485
}
463486

464-
final Set<TransferMode> transferModes = dragboard.getTransferModes();
465-
final boolean isCopy = transferModes.contains(TransferMode.COPY);
487+
final File file = files.get(0);
488+
final String extension = FileUtils.getExtension(file.getName(), true);
466489

467-
dragEvent.acceptTransferModes(isCopy ? TransferMode.COPY : TransferMode.MOVE);
468-
dragEvent.consume();
490+
return targetExtension.equalsIgnoreCase(extension);
469491
}
470492

471493
/**
@@ -538,7 +560,23 @@ public static <F, S> void handleDroppedFile(@NotNull final DragEvent dragEvent,
538560
@NotNull final S secondArg,
539561
@NotNull final TriConsumer<F, S, Path> handler) {
540562

541-
final Dragboard dragboard = dragEvent.getDragboard();
563+
handleDroppedFile(dragEvent.getDragboard(), targetExtension, firstArg, secondArg, handler);
564+
}
565+
566+
/**
567+
* Handle a first dropped file if it has required extensions.
568+
*
569+
* @param dragboard the dragboard.
570+
* @param targetExtension the extension.
571+
* @param firstArg the first argument.
572+
* @param secondArg the second argument.
573+
* @param handler the handler.
574+
*/
575+
public static <F, S> void handleDroppedFile(@NotNull final Dragboard dragboard,
576+
@NotNull final String targetExtension, @NotNull final F firstArg,
577+
@NotNull final S secondArg,
578+
@NotNull final TriConsumer<F, S, Path> handler) {
579+
542580
final List<File> files = unsafeCast(dragboard.getContent(DataFormat.FILES));
543581

544582
if (files == null || files.size() != 1) {

src/com/ss/editor/util/EditorUtil.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@
1515
import com.ss.editor.manager.ClasspathManager;
1616
import com.ss.editor.manager.ExecutorManager;
1717
import com.ss.editor.manager.ResourceManager;
18+
import com.ss.editor.model.undo.editor.ChangeConsumer;
19+
import com.ss.editor.model.undo.editor.SceneChangeConsumer;
1820
import com.ss.editor.ui.scene.EditorFXScene;
21+
import com.ss.extension.scene.SceneLayer;
22+
import com.ss.extension.scene.SceneNode;
1923
import javafx.geometry.Insets;
2024
import javafx.scene.control.Alert;
2125
import javafx.scene.control.DialogPane;
@@ -480,4 +484,21 @@ public static <T> T tryToCreateUserObject(@NotNull final Object owner, @NotNull
480484

481485
return cast(resultType, newExample);
482486
}
487+
488+
/**
489+
* Get a default layer of the change consumer.
490+
*
491+
* @param consumer the change consumer.
492+
* @return the default layer or null.
493+
*/
494+
@Nullable
495+
public static SceneLayer getDefaultLayer(@NotNull final ChangeConsumer consumer) {
496+
497+
if (!(consumer instanceof SceneChangeConsumer)) {
498+
return null;
499+
}
500+
501+
final SceneNode sceneNode = ((SceneChangeConsumer) consumer).getCurrentModel();
502+
return sceneNode.getLayers().first();
503+
}
483504
}

0 commit comments

Comments
 (0)