private void MoveBinding(DragAndDropArgs args, ActionTreeViewItem row) { TreeViewItem item; var compositeChildrenCount = 0; for (var i = 0; i < args.insertAtIndex; i++) { item = args.parentItem.children[i]; if (item.hasChildren) { compositeChildrenCount += item.children.Count; } } args.insertAtIndex += compositeChildrenCount; var action = (ActionTreeItem)args.parentItem; var dstIndex = action.bindingsStartIndex + args.insertAtIndex; var srcIndex = action.bindingsStartIndex + row.index; if (dstIndex > srcIndex) { dstIndex--; } InputActionSerializationHelpers.MoveBinding(actionMapProperty, srcIndex, dstIndex); if (row.hasChildren) { for (var i = 0; i < row.children.Count; i++) { if (dstIndex > srcIndex) { // when moving composite down InputActionSerializationHelpers.MoveBinding(actionMapProperty, srcIndex, dstIndex); continue; } // when moving composite up dstIndex++; srcIndex = action.bindingsStartIndex + (row.children[i] as CompositeTreeItem).index; InputActionSerializationHelpers.MoveBinding(actionMapProperty, srcIndex, dstIndex); } } }
protected override DragAndDropVisualMode HandleDragAndDrop(DragAndDropArgs args) { if (args.dragAndDropPosition != DragAndDropPosition.BetweenItems) { return(DragAndDropVisualMode.None); } var id = Int32.Parse(DragAndDrop.paths.First()); var item = FindItem(id, rootItem); var row = (InputTreeViewLine)item; if (!row.isDraggable || args.parentItem != row.parent) { return(DragAndDropVisualMode.None); } if (args.performDrop) { var compositeChildrenCount = 0; for (var i = 0; i < args.insertAtIndex; i++) { item = args.parentItem.children[i]; if (item.hasChildren) { compositeChildrenCount += item.children.Count; } } args.insertAtIndex += compositeChildrenCount; var action = (ActionTreeItem)args.parentItem; var map = (ActionMapTreeItem)args.parentItem.parent; var dstIndex = action.bindingsStartIndex + args.insertAtIndex; var srcIndex = action.bindingsStartIndex + row.index; if (dstIndex > srcIndex) { dstIndex--; } InputActionSerializationHelpers.MoveBinding(map.elementProperty, srcIndex, dstIndex); if (row.hasChildren) { for (var i = 0; i < row.children.Count; i++) { if (dstIndex > srcIndex) { // when moving composite down InputActionSerializationHelpers.MoveBinding(map.elementProperty, srcIndex, dstIndex); continue; } // when moving composite up dstIndex++; srcIndex = action.bindingsStartIndex + (row.children[i] as CompositeTreeItem).index; InputActionSerializationHelpers.MoveBinding(map.elementProperty, srcIndex, dstIndex); } } m_ApplyAction(); DragAndDrop.AcceptDrag(); //since there is no easy way to know the id of the element after reordering //instead of updating the selected item, we leave the UI without selection if (OnSelectionChanged != null) { OnSelectionChanged(); } } return(DragAndDropVisualMode.Move); }