mirror of
https://github.com/mRemoteNG/mRemoteNG.git
synced 2026-02-17 22:11:48 +08:00
drag-n-drop now supports rearranging nodes. Fixed a small bug with child rearrangement
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user