Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions src/main/java/com/ss/editor/Messages.java
Original file line number Diff line number Diff line change
Expand Up @@ -240,10 +240,12 @@ public class Messages {
public static final String MODEL_NODE_TREE_ACTION_ANIMATION_PLAY_SETTINGS;
public static final String MODEL_NODE_TREE_ACTION_ANIMATION_STOP;
public static final String MODEL_NODE_TREE_ACTION_ANIMATION_PAUSE;
public static final String MODEL_NODE_TREE_ACTION_ANIMATION_MANUAL_EXTRAXT_SUB_ANIMATION;
public static final String MODEL_NODE_TREE_ACTION_ANIMATION_MANUAL_EXTRACT_SUB_ANIMATION;
public static final String MODEL_NODE_TREE_ACTION_CREATE_AUDIO_NODE;
public static final String MODEL_NODE_TREE_ACTION_AUDIO_PLAY;
public static final String MODEL_NODE_TREE_ACTION_AUDIO_STOP;
public static final String MODEL_NODE_TREE_ACTION_COPY;
public static final String MODEL_NODE_TREE_ACTION_PASTE;
public static final String MODEL_NODE_TREE_ACTION_CREATE_TONEG0D_PARTICLE_EMITTER;
public static final String MODEL_NODE_TREE_ACTION_CREATE_SOFT_TONEG0D_PARTICLE_EMITTER;
public static final String MODEL_NODE_TREE_ACTION_CREATE_DEFAULT_PARTICLE_EMITTER;
Expand Down Expand Up @@ -918,10 +920,12 @@ public class Messages {
MODEL_NODE_TREE_ACTION_ANIMATION_PLAY_SETTINGS = bundle.getString("ModelNodeTreeActionAnimationPlaySettings");
MODEL_NODE_TREE_ACTION_ANIMATION_STOP = bundle.getString("ModelNodeTreeActionAnimationStop");
MODEL_NODE_TREE_ACTION_ANIMATION_PAUSE = bundle.getString("ModelNodeTreeActionAnimationPause");
MODEL_NODE_TREE_ACTION_ANIMATION_MANUAL_EXTRAXT_SUB_ANIMATION = bundle.getString("ModelNodeTreeActionAnimationManualExtractSubAnimation");
MODEL_NODE_TREE_ACTION_ANIMATION_MANUAL_EXTRACT_SUB_ANIMATION = bundle.getString("ModelNodeTreeActionAnimationManualExtractSubAnimation");
MODEL_NODE_TREE_ACTION_CREATE_AUDIO_NODE = bundle.getString("ModelNodeTreeActionCreateAudioNode");
MODEL_NODE_TREE_ACTION_AUDIO_PLAY = bundle.getString("ModelNodeTreeActionAudioPlay");
MODEL_NODE_TREE_ACTION_AUDIO_STOP = bundle.getString("ModelNodeTreeActionAudioStop");
MODEL_NODE_TREE_ACTION_COPY = bundle.getString("ModelNodeTreeActionCopy");
MODEL_NODE_TREE_ACTION_PASTE = bundle.getString("ModelNodeTreeActionPaste");
MODEL_NODE_TREE_ACTION_CREATE_TONEG0D_PARTICLE_EMITTER = bundle.getString("ModelNodeTreeActionCreateToneg0dParticleEmitter");
MODEL_NODE_TREE_ACTION_CREATE_SOFT_TONEG0D_PARTICLE_EMITTER = bundle.getString("ModelNodeTreeActionCreateSoftToneg0dParticleEmitter");
MODEL_NODE_TREE_ACTION_CREATE_DEFAULT_PARTICLE_EMITTER = bundle.getString("ModelNodeTreeActionCreateDefaultParticleEmitter");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,8 +88,8 @@ public boolean hasChildren(@NotNull final NodeTree<?> nodeTree) {

@Override
@FXThread
public boolean canAccept(@NotNull final TreeNode<?> child, final boolean isCopy) {
final Object element = child.getElement();
public boolean canAccept(@NotNull final TreeNode<?> treeNode, final boolean isCopy) {
final Object element = treeNode.getElement();
return element instanceof Spatial && SceneLayer.getLayer((Spatial) element) != getElement();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,9 +78,9 @@ public void add(@NotNull final TreeNode<?> child) {
}

@Override
public boolean canAccept(@NotNull final TreeNode<?> child, final boolean isCopy) {
final Object element = child.getElement();
return (element instanceof Material && isCopy) || super.canAccept(child, isCopy);
public boolean canAccept(@NotNull final TreeNode<?> treeNode, final boolean isCopy) {
final Object element = treeNode.getElement();
return (element instanceof Material && isCopy) || super.canAccept(treeNode, isCopy);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -146,16 +146,16 @@ public boolean hasChildren(@NotNull final NodeTree<?> nodeTree) {
}

@Override
public boolean canAccept(@NotNull final TreeNode<?> child, final boolean isCopy) {
if (child == this) return false;
public boolean canAccept(@NotNull final TreeNode<?> treeNode, final boolean isCopy) {
if (treeNode == this) return false;

final Object element = child.getElement();
final Object element = treeNode.getElement();

if (element instanceof Spatial) {
return GeomUtils.canAttach(getElement(), (Spatial) element, isCopy);
}

return super.canAccept(child, isCopy);
return super.canAccept(treeNode, isCopy);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,9 +101,9 @@ public boolean canCopy() {

@Override
@FXThread
public boolean canAccept(@NotNull final TreeNode<?> child, final boolean isCopy) {
final Object element = child.getElement();
return element instanceof AbstractControl || super.canAccept(child, isCopy);
public boolean canAccept(@NotNull final TreeNode<?> treeNode, final boolean isCopy) {
final Object element = treeNode.getElement();
return element instanceof AbstractControl || super.canAccept(treeNode, isCopy);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public boolean canMove() {
}

@Override
public boolean canAccept(@NotNull final TreeNode<?> child, final boolean isCopy) {
public boolean canAccept(@NotNull final TreeNode<?> treeNode, final boolean isCopy) {
return false;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.ss.editor.ui.control.model.tree.action;

import static com.ss.editor.ui.control.tree.NodeTreeCell.DATA_FORMAT;
import com.ss.editor.Messages;
import com.ss.editor.annotation.FXThread;
import com.ss.editor.model.undo.editor.ModelChangeConsumer;
import com.ss.editor.ui.Icons;
import com.ss.editor.ui.control.tree.NodeTree;
import com.ss.editor.ui.control.tree.action.AbstractNodeAction;
import com.ss.editor.ui.control.tree.node.TreeNode;
import javafx.scene.image.Image;
import javafx.scene.input.Clipboard;
import javafx.scene.input.ClipboardContent;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

/**
* The action to copy a node in model.
*
* @author JavaSaBr
*/
public class CopyNodeAction extends AbstractNodeAction<ModelChangeConsumer> {

public CopyNodeAction(@NotNull final NodeTree<?> nodeTree, @NotNull final TreeNode<?> node) {
super(nodeTree, node);
}

@Override
@FXThread
protected @NotNull String getName() {
return Messages.MODEL_NODE_TREE_ACTION_COPY;
}

@Override
@FXThread
protected @Nullable Image getIcon() {
return Icons.COPY_16;
}

@Override
@FXThread
protected void process() {
super.process();

final TreeNode<?> node = getNode();

final ClipboardContent content = new ClipboardContent();
content.put(DATA_FORMAT, node.getObjectId());

final Clipboard clipboard = Clipboard.getSystemClipboard();
clipboard.setContent(content);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package com.ss.editor.ui.control.model.tree.action;

import static com.ss.rlib.util.ObjectUtils.notNull;
import com.ss.editor.Messages;
import com.ss.editor.annotation.FXThread;
import com.ss.editor.model.undo.editor.ModelChangeConsumer;
import com.ss.editor.ui.Icons;
import com.ss.editor.ui.control.tree.NodeTree;
import com.ss.editor.ui.control.tree.action.AbstractNodeAction;
import com.ss.editor.ui.control.tree.node.TreeNode;
import javafx.scene.image.Image;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

/**
* The action to paste a node in model.
*
* @author JavaSaBr
*/
public class PasteNodeAction extends AbstractNodeAction<ModelChangeConsumer> {

/**
* The copied node.
*/
@NotNull
private final TreeNode<?> copiedNode;

public PasteNodeAction(@NotNull final NodeTree<?> nodeTree, @NotNull final TreeNode<?> node,
@NotNull final TreeNode<?> copiedNode) {
super(nodeTree, node);
this.copiedNode = copiedNode;
}

@Override
@FXThread
protected @NotNull String getName() {
return Messages.MODEL_NODE_TREE_ACTION_PASTE;
}

@Override
@FXThread
protected @Nullable Image getIcon() {
return Icons.PASTE_16;
}

@Override
@FXThread
protected void process() {
super.process();

final ModelChangeConsumer changeConsumer = notNull(getNodeTree().getChangeConsumer());

final TreeNode<?> node = getNode();
node.accept(changeConsumer, copiedNode.getElement(), true);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public ManualExtractSubAnimationAction(@NotNull final NodeTree<?> nodeTree, @Not
@Override
@FXThread
protected @NotNull String getName() {
return Messages.MODEL_NODE_TREE_ACTION_ANIMATION_MANUAL_EXTRAXT_SUB_ANIMATION;
return Messages.MODEL_NODE_TREE_ACTION_ANIMATION_MANUAL_EXTRACT_SUB_ANIMATION;
}

@Override
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/com/ss/editor/ui/control/tree/NodeTreeCell.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@
*/
public class NodeTreeCell<C extends ChangeConsumer, M extends NodeTree<C>> extends TextFieldTreeCell<TreeNode<?>> {

@NotNull
public static final DataFormat DATA_FORMAT = new DataFormat(NodeTreeCell.class.getName());

@NotNull
private static final PseudoClass DROP_AVAILABLE_PSEUDO_CLASS = PseudoClass.getPseudoClass("drop-available");

Expand All @@ -51,9 +54,6 @@ public class NodeTreeCell<C extends ChangeConsumer, M extends NodeTree<C>> exten
@NotNull
private static final ExecutorManager EXECUTOR_MANAGER = ExecutorManager.getInstance();

@NotNull
private static final DataFormat DATA_FORMAT = new DataFormat(NodeTreeCell.class.getName());

@NotNull
private final StringConverter<TreeNode<?>> stringConverter = new StringConverter<TreeNode<?>>() {

Expand Down
26 changes: 21 additions & 5 deletions src/main/java/com/ss/editor/ui/control/tree/node/TreeNode.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,23 @@
package com.ss.editor.ui.control.tree.node;

import static com.ss.editor.ui.control.tree.NodeTreeCell.DATA_FORMAT;
import com.ss.editor.Editor;
import com.ss.editor.annotation.FXThread;
import com.ss.editor.annotation.FromAnyThread;
import com.ss.editor.model.UObject;
import com.ss.editor.model.undo.editor.ChangeConsumer;
import com.ss.editor.ui.control.model.tree.action.CopyNodeAction;
import com.ss.editor.ui.control.model.tree.action.PasteNodeAction;
import com.ss.editor.ui.control.model.tree.action.RenameNodeAction;
import com.ss.editor.ui.control.tree.NodeTree;
import com.ss.editor.ui.util.UIUtils;
import com.ss.rlib.util.array.Array;
import com.ss.rlib.util.array.ArrayFactory;
import javafx.collections.ObservableList;
import javafx.scene.control.MenuItem;
import javafx.scene.control.TreeItem;
import javafx.scene.image.Image;
import javafx.scene.input.Clipboard;
import javafx.scene.input.Dragboard;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
Expand Down Expand Up @@ -172,6 +178,16 @@ protected void setParent(@Nullable final TreeNode<?> parent) {
@FXThread
public void fillContextMenu(@NotNull final NodeTree<?> nodeTree, @NotNull final ObservableList<MenuItem> items) {
if (canEditName()) items.add(new RenameNodeAction(nodeTree, this));
if (canCopy()) items.add(new CopyNodeAction(nodeTree, this));

final Clipboard clipboard = Clipboard.getSystemClipboard();
final Long objectId = (Long) clipboard.getContent(DATA_FORMAT);
final TreeItem<?> treeItem = objectId == null ? null : UIUtils.findItem(nodeTree.getTreeView(), objectId);
final TreeNode<?> treeNode = treeItem == null ? null : (TreeNode<?>) treeItem.getValue();

if (treeNode != null && canAccept(treeNode, true)) {
items.add(new PasteNodeAction(nodeTree, this, treeNode));
}
}

/**
Expand Down Expand Up @@ -203,14 +219,14 @@ public void changeName(@NotNull final NodeTree<?> nodeTree, @NotNull final Strin
}

/**
* Can accept boolean.
* Check of possibility to accept the tree node as a new child.
*
* @param child the child
* @param isCopy true if need to copy the object.
* @return true of this node can accept the child.
* @param treeNode the node.
* @param isCopy true if need to copy the node.
* @return true if this node can be accept.
*/
@FXThread
public boolean canAccept(@NotNull final TreeNode<?> child, final boolean isCopy) {
public boolean canAccept(@NotNull final TreeNode<?> treeNode, final boolean isCopy) {
return false;
}

Expand Down
2 changes: 2 additions & 0 deletions src/main/resources/messages/messages.properties
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,8 @@ ModelNodeTreeActionAnimationManualExtractSubAnimation=Extract sub-animation manu
ModelNodeTreeActionCreateAudioNode=Audio node
ModelNodeTreeActionAudioPlay=Play
ModelNodeTreeActionAudioStop=Stop
ModelNodeTreeActionCopy=Copy
ModelNodeTreeActionPaste=Paste
ModelNodeTreeActionCreateToneg0dParticleEmitter=Toneg0d particles emitter
ModelNodeTreeActionCreateSoftToneg0dParticleEmitter=Toneg0d soft particle emitter
ModelNodeTreeActionCreateDefaultParticleEmitter=Default particle emitter
Expand Down
2 changes: 2 additions & 0 deletions src/main/resources/messages/messages_de.properties
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,8 @@ ModelNodeTreeActionAnimationManualExtractSubAnimation=Manuelles Entnehmen der An
ModelNodeTreeActionCreateAudioNode=Audio-Node
ModelNodeTreeActionAudioPlay=Abspielen
ModelNodeTreeActionAudioStop=Stoppen
ModelNodeTreeActionCopy=Copy
ModelNodeTreeActionPaste=Paste
ModelNodeTreeActionCreateToneg0dParticleEmitter=Toneg0d Partikelemitter
ModelNodeTreeActionCreateSoftToneg0dParticleEmitter=Toneg0d Weichpartikelemitter
ModelNodeTreeActionCreateDefaultParticleEmitter=Standard Partikel-Emitter
Expand Down
2 changes: 2 additions & 0 deletions src/main/resources/messages/messages_ru.properties
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,8 @@ ModelNodeTreeActionAnimationManualExtractSubAnimation=Извлечь вручн
ModelNodeTreeActionCreateAudioNode=Аудио узел
ModelNodeTreeActionAudioPlay=Проиграть
ModelNodeTreeActionAudioStop=Остановить
ModelNodeTreeActionCopy=Скопировать
ModelNodeTreeActionPaste=Вставить
ModelNodeTreeActionCreateToneg0dParticleEmitter=Toneg0d источник частиц
ModelNodeTreeActionCreateSoftToneg0dParticleEmitter=Toneg0d источник мягких частиц
ModelNodeTreeActionCreateDefaultParticleEmitter=Стандартный источник частиц
Expand Down
2 changes: 2 additions & 0 deletions src/main/resources/messages/messages_zh_CN.properties
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,8 @@ ModelNodeTreeActionAnimationManualExtractSubAnimation=\u624b\u52a8\u89e3\u538b\u
ModelNodeTreeActionCreateAudioNode=AudioNode
ModelNodeTreeActionAudioPlay=\u64ad\u653e
ModelNodeTreeActionAudioStop=\u505c\u6b62
ModelNodeTreeActionCopy=Copy
ModelNodeTreeActionPaste=Paste
ModelNodeTreeActionCreateToneg0dParticleEmitter=Toneg0d\u7c92\u5b50\u53d1\u751f\u5668
ModelNodeTreeActionCreateSoftToneg0dParticleEmitter=Toneg0d\u8f6f\u7c92\u5b50\u53d1\u751f\u5668
ModelNodeTreeActionCreateDefaultParticleEmitter=\u9ed8\u8ba4\u7c92\u5b50\u53d1\u751f\u5668
Expand Down