Kaynağa Gözat

[references] prevent cycles on reference creation via drag & drop

Clement Espeute 1 yıl önce
ebeveyn
işleme
b34ab58435
2 değiştirilmiş dosya ile 10 ekleme ve 2 silme
  1. 8 0
      hide/comp/SceneEditor.hx
  2. 2 2
      hrt/prefab/Reference.hx

+ 8 - 0
hide/comp/SceneEditor.hx

@@ -3256,6 +3256,12 @@ class SceneEditor {
 		if(hrt.prefab.Prefab.getPrefabType(path) != null) {
 			var ref = new hrt.prefab.Reference(parent, null);
 			ref.source = relative;
+			if (ref.hasCycle()) {
+				parent.children.remove(ref);
+				hide.Ide.inst.quickError('Reference to $relative is creating a cycle. The reference creation was aborted.');
+				return null;
+			}
+
 			prefab = ref;
 			prefab.name = new haxe.io.Path(relative).file;
 		}
@@ -3287,6 +3293,8 @@ class SceneEditor {
 		var elts: Array<PrefabElement> = [];
 		for(path in paths) {
 			var obj3d = createDroppedElement(path, parent);
+			if (obj3d == null)
+				continue;
 
 			obj3d.setTransform(localMat);
 			autoName(obj3d);

+ 2 - 2
hrt/prefab/Reference.hx

@@ -65,7 +65,7 @@ class Reference extends Object3D {
 			return;
 		#if editor
 		if (hasCycle()) {
-			hide.Ide.inst.quickError('Reference $name to $source was creating a cycle. Removed');
+			hide.Ide.inst.quickError('Reference ${getAbsPath()} to $source is creating a cycle. Please fix the reference.');
 			refInstance = null;
 			return;
 		}
@@ -205,7 +205,7 @@ class Reference extends Object3D {
 			if(pname == "source" || pname == "editMode") {
 				refInstance = null;
 				if (hasCycle()) {
-					hide.Ide.inst.quickError('Reference to $source would create a cycle. Canceling.');
+					hide.Ide.inst.quickError('Reference to $source would create a cycle. The reference change was aborted.');
 					ctx.properties.undo.undo();
 					@:privateAccess ctx.properties.undo.redoElts.pop();
 					return;