/// <summary> /// Adds the control to the tree /// </summary> /// <param name="ancestor"></param> /// <param name="control"></param> private void AddControlNode(Node parentNode, GUIControl control, int atIndex) { SceneNode node = new SceneNode(control); if (atIndex >= 0) parentNode.Nodes.Insert(atIndex, node); else parentNode.Nodes.Add(node); foreach (GUIControl childControl in control.Controls) { AddControlNode(node, childControl); } }
private void mSceneTreeView_DragOver(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(typeof(TreeNodeAdv[])) && mSceneTreeView.DropPosition.Node != null) { TreeNodeAdv[] nodes = e.Data.GetData(typeof(TreeNodeAdv[])) as TreeNodeAdv[]; TreeNodeAdv parent = mSceneTreeView.DropPosition.Node; if (mSceneTreeView.DropPosition.Position != NodePosition.Inside) { parent = parent.Parent; } SceneNode parentSceneNode = parent.Tag as SceneNode; bool bParentIsView = parentSceneNode != null && parentSceneNode.Control is GUIView; foreach (TreeNodeAdv node in nodes) { SceneNode sceneNode = node.Tag as SceneNode; // Can't re-parent to one of its children if (!CheckNodeParent(parent, node)) { e.Effect = DragDropEffects.None; return; } // GUIViews can only be direct children of the root (scene) if (sceneNode.Control is GUIView && (parent != mSceneTreeView.Root)) { e.Effect = DragDropEffects.None; return; } if (!(sceneNode.Control is GUIView)) { GUIView parentView = sceneNode.Control.ParentView; GUIView targetParentView = null; if (parentSceneNode != null) { if (bParentIsView) { targetParentView = parentSceneNode.Control as GUIView; } else { targetParentView = parentSceneNode.Control.ParentView; } } // Can't reparent to a different view if (parentView != targetParentView) { e.Effect = DragDropEffects.None; return; } // Can't reparent to a non-GUIGroup if (!(parentSceneNode.Control is GUIGroup) && !(parentSceneNode.Control is GUIView)) { e.Effect = DragDropEffects.None; return; } } } e.Effect = e.AllowedEffect; } }
/// <summary> /// Adds a sceneView node to the scene hierarchy at a specific index /// </summary> /// <param name="sceneView"></param> /// <returns></returns> private void AddViewNode(GUIView view, int atIndex) { SceneNode node = new SceneNode(view); if (atIndex >= 0) mTreeModel.Nodes.Insert(atIndex, node); else mTreeModel.Nodes.Add(node); AddControlNodes(node, view.Controls); }
private void mSceneTreeView_DragDrop(object sender, DragEventArgs e) { mSceneTreeView.BeginUpdate(); { TreeNodeAdv[] nodes = (TreeNodeAdv[])e.Data.GetData(typeof(TreeNodeAdv[])); Node dropNode = mSceneTreeView.DropPosition.Node.Tag as Node; GUIControl parentControl = null; List <GUIControl> controls = new List <GUIControl>(); int index = -1; bool bParentChange = false; // If dropped inside, we're re-grouping (re-parenting) the controls if (mSceneTreeView.DropPosition.Position == NodePosition.Inside) { bParentChange = true; SceneNode parent = dropNode as SceneNode; parentControl = parent.Control; // Create a list of controls that we'll re-parent foreach (TreeNodeAdv n in nodes) { SceneNode sceneNode = n.Tag as SceneNode; if (sceneNode.Control is GUIView) { continue; } controls.Add(sceneNode.Control); } } else { SceneNode parent = dropNode.Parent as SceneNode; Node nextItem = dropNode; if (mSceneTreeView.DropPosition.Position == NodePosition.After) { nextItem = dropNode.NextNode; } parentControl = (parent != null) ? parent.Control : null; index = dropNode.Parent.Nodes.IndexOf(nextItem); // Create a list of controls we're going to reorder foreach (TreeNodeAdv n in nodes) { SceneNode sceneNode = n.Tag as SceneNode; controls.Add(sceneNode.Control); if (sceneNode.Control.Parent != parentControl) { bParentChange = true; } } } if (controls.Count > 0) { controls.Sort ( (a, b) => ( (b is GUIView ? b.Scene.Views.IndexOf((GUIView)b) : b.Parent.Controls.IndexOf(b)) - (a is GUIView ? a.Scene.Views.IndexOf((GUIView)a) : a.Parent.Controls.IndexOf(a)) ) ); if (bParentChange) { mCommandManager.AddCommand(new ChangeParentCommand(controls, parentControl, index), true); } else { mCommandManager.AddCommand(new ChangeOrderCommand(controls, index), true); } } mSceneTreeView.DropPosition.Node.IsExpanded = true; } mSceneTreeView.EndUpdate(); }