Esempio n. 1
0
		protected Component CreateComponent(TreeNodeAdv baseNode, Type cmpType)
		{
			GameObjectNode baseObjNode = baseNode == null ? null : baseNode.Tag as GameObjectNode;
			GameObject baseObj = baseObjNode == null ? null : baseObjNode.Obj;

			UndoRedoManager.BeginMacro();

			// There is no GameObject? Create one!
			if (baseObj == null)
			{
				baseObj = this.CreateGameObject(baseNode, cmpType.Name);
				baseObjNode = this.FindNode(baseObj);
			}
			// There already is such Component? Return it.
			else
			{
				Component existingComponent = baseObj.GetComponent(cmpType);
				if (existingComponent != null) return existingComponent;
			}

			// Create Components
			CreateComponentAction action = new CreateComponentAction(baseObj, cmpType.CreateInstanceOf() as Component);
			UndoRedoManager.Do(action);
			UndoRedoManager.EndMacro(UndoRedoManager.MacroDeriveName.FromFirst);

			return action.Result.LastOrDefault();
		}
Esempio n. 2
0
		private void objectView_DragDrop(object sender, DragEventArgs e)
		{
			this.objectView.BeginUpdate();

			bool effectMove = (e.Effect & DragDropEffects.Move) != DragDropEffects.None;
			bool effectCopy = (e.Effect & DragDropEffects.Copy) != DragDropEffects.None;
			DataObject data = e.Data as DataObject;
			if (data != null)
			{
				ConvertOperation convertOp = new ConvertOperation(data, ConvertOperation.Operation.All);
				this.tempDropTarget = this.DragDropGetTargetNode();
				if (data.ContainsGameObjectRefs())
				{
					this.tempDropData = data.GetGameObjectRefs();

					// Display context menu if both moving and copying are availabled
					if (effectMove && effectCopy)
						this.contextMenuDragMoveCopy.Show(this, this.PointToClient(new Point(e.X, e.Y)));
					else if (effectCopy)
						this.copyHereToolStripMenuItem_Click(this, null);
					else if (effectMove)
						this.moveHereToolStripMenuItem_Click(this, null);
				}
				else if (data.ContainsComponentRefs())
				{
					this.tempDropData = data.GetComponentRefs();

					// Display context menu if both moving and copying are availabled
					if (effectMove && effectCopy)
						this.contextMenuDragMoveCopy.Show(this, this.PointToClient(new Point(e.X, e.Y)));
					else if (effectCopy)
						this.copyHereToolStripMenuItem_Click(this, null);
					else if (effectMove)
						this.moveHereToolStripMenuItem_Click(this, null);
				}
				else if (this.tempDropTarget != null && convertOp.CanPerform<Component>())
				{
					GameObject dropObj = null;
					if (this.tempDropTarget is GameObjectNode)
						dropObj = (this.tempDropTarget as GameObjectNode).Obj;
					else
						dropObj = (this.tempDropTarget as ComponentNode).Component.GameObj;

					var componentQuery = convertOp.Perform<Component>();
					if (componentQuery != null)
					{
						// Create Components
						CreateComponentAction createAction = new CreateComponentAction(dropObj, componentQuery.Where(c => c.GameObj == null));
						UndoRedoManager.BeginMacro();
						UndoRedoManager.Do(new DeleteComponentAction(componentQuery.Select(c => dropObj.GetComponent(c.GetType())).NotNull()));
						UndoRedoManager.Do(createAction);
						UndoRedoManager.EndMacro(UndoRedoManager.MacroDeriveName.FromLast);

						bool selCleared = false;
						foreach (Component newComponent in createAction.Result)
						{
							NodeBase dataNode = this.FindNode(newComponent);
							if (dataNode == null) continue;
							TreeNodeAdv viewNode = this.objectView.FindNode(this.objectModel.GetPath(dataNode));
							if (viewNode == null) continue;
							if (!selCleared)
							{
								this.objectView.ClearSelection();
								selCleared = true;
							}
							viewNode.IsSelected = true;
							this.objectView.EnsureVisible(viewNode);
						}
					}
				}
				else if (convertOp.CanPerform<GameObject>())
				{
					GameObject dropObj = (this.tempDropTarget is GameObjectNode) ? (this.tempDropTarget as GameObjectNode).Obj : null;
					var gameObjQuery = convertOp.Perform<GameObject>();
					if (gameObjQuery != null)
					{
						CreateGameObjectAction action = new CreateGameObjectAction(dropObj, gameObjQuery);
						UndoRedoManager.Do(action);

						bool selCleared = false;
						foreach (GameObject newObj in action.Result)
						{
							NodeBase dataNode = this.FindNode(newObj);
							if (dataNode == null) continue;
							TreeNodeAdv viewNode = this.objectView.FindNode(this.objectModel.GetPath(dataNode));
							if (viewNode == null) continue;
							if (!selCleared)
							{
								this.objectView.ClearSelection();
								selCleared = true;
							}
							viewNode.IsSelected = true;
							this.objectView.EnsureVisible(viewNode);
						}
					}
				}
			}

			this.objectView.EndUpdate();
		}
Esempio n. 3
0
		private void copyHereToolStripMenuItem_Click(object sender, EventArgs e)
		{
			GameObject[] draggedObj = this.tempDropData as GameObject[];
			Component[] draggedComp = this.tempDropData as Component[];
			GameObject dropObj = (this.tempDropTarget is GameObjectNode) ? (this.tempDropTarget as GameObjectNode).Obj : null;

			if (draggedObj != null)
			{
				UndoRedoManager.BeginMacro();
				CloneGameObjectAction cloneAction = new CloneGameObjectAction(draggedObj);
				UndoRedoManager.Do(cloneAction);
				UndoRedoManager.Do(new SetGameObjectParentAction(dropObj, cloneAction.Result));
				UndoRedoManager.EndMacro(UndoRedoManager.MacroDeriveName.FromFirst);
				
				// Deselect dragged nodes
				foreach (GameObject dragObj in draggedObj)
				{
					TreeNodeAdv dragObjViewNode = this.objectView.FindNode(this.objectModel.GetPath(this.FindNode(dragObj)));
					dragObjViewNode.IsSelected = false;
				}
				// Select new nodes
				foreach (GameObject dragObjClone in cloneAction.Result)
				{
					TreeNodeAdv dragObjViewNode = this.objectView.FindNode(this.objectModel.GetPath(this.FindNode(dragObjClone)));
					dragObjViewNode.IsSelected = true;
					this.objectView.EnsureVisible(dragObjViewNode);
				}
			}
			else if (draggedComp != null)
			{
				// Clone Components
				CreateComponentAction cloneAction = new CreateComponentAction(dropObj, draggedComp.Select(c => c.Clone()));
				UndoRedoManager.Do(cloneAction);
				
				// Deselect dragged nodes
				foreach (Component dragObj in draggedComp)
				{
					TreeNodeAdv dragObjViewNode = this.objectView.FindNode(this.objectModel.GetPath(this.FindNode(dragObj)));
					dragObjViewNode.IsSelected = false;
				}
				// Select new nodes
				foreach (Component dragObjClone in cloneAction.Result)
				{
					TreeNodeAdv dragObjViewNode = this.objectView.FindNode(this.objectModel.GetPath(this.FindNode(dragObjClone)));
					dragObjViewNode.IsSelected = true;
					this.objectView.EnsureVisible(dragObjViewNode);
				}
			}
		}