drag-n-drop now supports rearranging nodes. Fixed a small bug with child rearrangement

This commit is contained in:
David Sparer
2016-09-09 14:05:22 -06:00
parent d439a0df00
commit e6f846107a
3 changed files with 87 additions and 15 deletions

View File

@@ -59,11 +59,33 @@ namespace mRemoteNG.Container
{
var originalIndex = Children.IndexOf(child);
if (originalIndex < 0 || originalIndex == newIndex || newIndex < 0) return;
if (newIndex > Children.Count) newIndex = Children.Count;
Children.Remove(child);
if (newIndex > Children.Count) newIndex = Children.Count;
Children.Insert(newIndex, child);
}
public void SetChildAbove(ConnectionInfo childToPromote, ConnectionInfo reference)
{
var originalIndex = Children.IndexOf(childToPromote);
var newIndex = Children.IndexOf(reference);
if (newIndex < 0) return;
if (originalIndex < newIndex)
SetChildPosition(childToPromote, newIndex - 1);
else if (originalIndex > newIndex)
SetChildPosition(childToPromote, newIndex);
}
public void SetChildBelow(ConnectionInfo childToPromote, ConnectionInfo reference)
{
var originalIndex = Children.IndexOf(childToPromote);
var newIndex = Children.IndexOf(reference);
if (newIndex < 0) return;
if (originalIndex < newIndex)
SetChildPosition(childToPromote, newIndex);
else if (originalIndex > newIndex)
SetChildPosition(childToPromote, newIndex + 1);
}
public void PromoteChild(ConnectionInfo child)
{
var originalIndex = Children.IndexOf(child);

View File

@@ -15,10 +15,28 @@ namespace mRemoteNG.Tree
internal void HandleEvent_ModelDropped(object sender, ModelDropEventArgs e)
{
var draggedObject = (IHasParent)e.SourceModels[0];
var dropTarget = e.TargetModel as ContainerInfo;
if (dropTarget != null)
draggedObject.SetParent(dropTarget);
var draggedObject = (ConnectionInfo)e.SourceModels[0];
var dropTarget = e.TargetModel as ConnectionInfo;
if (dropTarget == null) return;
if (e.DropTargetLocation == DropTargetLocation.Item)
{
var dropTargetAsContainer = dropTarget as ContainerInfo;
if (dropTargetAsContainer == null) return;
draggedObject.SetParent(dropTargetAsContainer);
}
else if (e.DropTargetLocation == DropTargetLocation.AboveItem)
{
if (!draggedObject.Parent.Equals(dropTarget.Parent))
draggedObject.SetParent(dropTarget.Parent);
dropTarget.Parent.SetChildAbove(draggedObject, dropTarget);
}
else if (e.DropTargetLocation == DropTargetLocation.BelowItem)
{
if (!draggedObject.Parent.Equals(dropTarget.Parent))
draggedObject.SetParent(dropTarget.Parent);
dropTarget.Parent.SetChildBelow(draggedObject, dropTarget);
}
e.Handled = true;
e.RefreshObjects();
}
@@ -36,19 +54,46 @@ namespace mRemoteNG.Tree
e.InfoMessage = Language.strNodeNotDraggable;
e.DropSink.EnableFeedback = false;
}
else if (NodeDraggingOntoSelf(dropSource, dropTarget))
e.InfoMessage = Language.strNodeCannotDragOnSelf;
else if (AncestorDraggingOntoChild(dropSource, dropTarget))
else if (e.DropTargetLocation == DropTargetLocation.Item)
HandleCanDropOnItem(dropSource, dropTarget, e);
else if (e.DropTargetLocation == DropTargetLocation.AboveItem || e.DropTargetLocation == DropTargetLocation.BelowItem)
HandleCanDropBetweenItems(dropSource, dropTarget, e);
else
return;
e.Handled = true;
}
private void HandleCanDropOnItem(ConnectionInfo dropSource, ConnectionInfo dropTarget, ModelDropEventArgs e)
{
if (dropTarget is ContainerInfo)
{
if (NodeDraggingOntoSelf(dropSource, dropTarget))
e.InfoMessage = Language.strNodeCannotDragOnSelf;
else if (AncestorDraggingOntoChild(dropSource, dropTarget))
e.InfoMessage = Language.strNodeCannotDragParentOnChild;
else if (DraggingOntoCurrentParent(dropSource, dropTarget))
e.InfoMessage = Language.strNodeAlreadyInFolder;
else
{
e.Effect = DragDropEffects.Move;
e.DropSink.FeedbackColor = DropAllowedFeedbackColor;
}
}
else
{
e.DropSink.EnableFeedback = false;
}
}
private void HandleCanDropBetweenItems(ConnectionInfo dropSource, ConnectionInfo dropTarget, ModelDropEventArgs e)
{
if (AncestorDraggingOntoChild(dropSource, dropTarget))
e.InfoMessage = Language.strNodeCannotDragParentOnChild;
else if (DraggingOntoCurrentParent(dropSource, dropTarget))
e.InfoMessage = Language.strNodeAlreadyInFolder;
else
{
e.Effect = DragDropEffects.Move;
e.DropSink.FeedbackColor = DropAllowedFeedbackColor;
}
e.Handled = true;
}
private bool NodeIsDraggable(ConnectionInfo node)

View File

@@ -47,7 +47,8 @@ namespace mRemoteNG.UI.Window
FillImageList();
LinkModelToView();
SetEventHandlers();
SetupDropSink();
SetEventHandlers();
}
private void FillImageList()
@@ -79,6 +80,12 @@ namespace mRemoteNG.UI.Window
olvConnections.ChildrenGetter = item => ((ContainerInfo)item).Children;
}
private void SetupDropSink()
{
var dropSink = (SimpleDropSink)olvConnections.DropSink;
dropSink.CanDropBetween = true;
}
private object ConnectionImageGetter(object rowObject)
{
if (rowObject is RootNodeInfo) return "Root";
@@ -569,7 +576,6 @@ namespace mRemoteNG.UI.Window
Export.ExportToFile(Windows.treeForm.tvConnections.Nodes[0], Windows.treeForm.tvConnections.SelectedNode, Runtime.ConnectionTreeModel);
}
//TODO Fix for TreeListView
private void cMenTreeMoveUp_Click(object sender, EventArgs e)
{
SelectedNode.Parent.PromoteChild(SelectedNode);
@@ -577,7 +583,6 @@ namespace mRemoteNG.UI.Window
Runtime.SaveConnectionsBG();
}
//TODO Fix for TreeListView
private void cMenTreeMoveDown_Click(object sender, EventArgs e)
{
SelectedNode.Parent.DemoteChild(SelectedNode);