Skip to content

Commit 22e92e2

Browse files
author
YCode
committed
chore: 深度BuildTree
1 parent c7f76ab commit 22e92e2

1 file changed

Lines changed: 31 additions & 7 deletions

File tree

YCode.Designer.Fluxo/FluxoDesigner.cs

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ static FluxoDesigner()
1818
private bool? _isLoaded;
1919
private DispatcherTimer? _autoPanningTimer;
2020

21-
private readonly TranslateTransform _translateTransform = new();
22-
private readonly ScaleTransform _scaleTransform = new();
21+
private readonly TranslateTransform TranslateTransform = new();
22+
private readonly ScaleTransform ScaleTransform = new();
2323

2424
public FluxoDesigner()
2525
{
@@ -28,8 +28,8 @@ public FluxoDesigner()
2828
this.AddHandler(FluxoNode.DragCompletedEvent, new DragCompletedEventHandler(this.OnNodeDragCompleted));
2929

3030
var transform = new TransformGroup();
31-
transform.Children.Add(_scaleTransform);
32-
transform.Children.Add(_translateTransform);
31+
transform.Children.Add(ScaleTransform);
32+
transform.Children.Add(TranslateTransform);
3333

3434
this.SetValue(ViewportTransformPropertyKey, transform);
3535

@@ -577,8 +577,12 @@ public void AutoLayout()
577577

578578
var nodes = this.ItemsHost.Children.OfType<FluxoNode>();
579579

580+
var dfsScope = nodes.ToDictionary(k => k, v => 0);
581+
580582
var pos = new Point(this.ViewportLocation.X + 160d, this.ViewportLocation.Y + 100d);
581583

584+
var hashTree = new Dictionary<int, List<FluxoLayoutTree>>();
585+
582586
Sorting();
583587

584588
void Sorting()
@@ -591,6 +595,8 @@ void Sorting()
591595
{
592596
var tree = BuildTree(root, 0);
593597

598+
BuildHash(tree, 0);
599+
594600
Hierarchy(tree, pos);
595601
}
596602

@@ -625,6 +631,20 @@ void Translate(FluxoLayoutTree node, Point location)
625631
new Point(node.Node.Location.X + node.Node.ActualWidth + span, child.Node.Location.Y + dy));
626632
}
627633
}
634+
635+
void BuildHash(FluxoLayoutTree root, int depth)
636+
{
637+
if (hashTree.TryGetValue(depth, out var value))
638+
{
639+
value.Add(root);
640+
}
641+
else
642+
{
643+
hashTree[depth] = [root];
644+
}
645+
646+
root.Nexts.ForEach(node => BuildHash(node, depth + 1));
647+
}
628648
}
629649

630650
FluxoLayoutTree BuildTree(FluxoNode root, int depth)
@@ -634,16 +654,20 @@ FluxoLayoutTree BuildTree(FluxoNode root, int depth)
634654
Depth = depth
635655
};
636656

657+
dfsScope[root] = 1;
658+
637659
var nexts = root.Lines.Where(x => root.NodeId.Equals(x.SourceId)).Select(x => x.Target);
638660

639661
foreach (var next in nexts)
640662
{
641-
if (next != null)
663+
if (next != null && dfsScope[next] == 0)
642664
{
643665
tree.AddNext(BuildTree(next, depth + 1));
644666
}
645667
}
646668

669+
dfsScope[root] = -1;
670+
647671
return tree;
648672
}
649673
}
@@ -660,9 +684,9 @@ private static void OnViewportLocationChanged(DependencyObject d, DependencyProp
660684
{
661685
if (d is FluxoDesigner designer && e.NewValue is Point translate)
662686
{
663-
designer._translateTransform.X = -translate.X * designer.Zoom;
687+
designer.TranslateTransform.X = -translate.X * designer.Zoom;
664688

665-
designer._translateTransform.Y = -translate.Y * designer.Zoom;
689+
designer.TranslateTransform.Y = -translate.Y * designer.Zoom;
666690

667691
designer.RaiseEvent(nameof(designer.ViewportUpdated), new RoutedEventArgs());
668692
}

0 commit comments

Comments
 (0)