diff --git a/DeedyDesigner/Deedy.Activity/ActionViewer.cs b/DeedyDesigner/Deedy.Activity/ActionViewer.cs index 59b87ac..944f968 100644 --- a/DeedyDesigner/Deedy.Activity/ActionViewer.cs +++ b/DeedyDesigner/Deedy.Activity/ActionViewer.cs @@ -554,33 +554,28 @@ namespace Deedy.Activity this.IsSelectable = true; } - if (newValue is ICombinedElement newCombinedElement) + if (newValue is ICombinedElement newCombined) { this.IsExpandable = true; - this.ElementCount = newCombinedElement.Elements.Count; - newCombinedElement.Elements.CollectionChanged += Elements_CollectionChanged; + this.ElementCount = newCombined.Elements.Count; + newCombined.Elements.CollectionChanged += Elements_CollectionChanged; } else this.IsExpandable = false; - if (newValue is ICriticalZoneManageable criticalZoneManageable) + if (newValue is ICriticalZoneManageable criticalZone) { - if (criticalZoneManageable.IsLeaveZoneHidden) this.ShowLeaveZone = Visibility.Collapsed; - if (criticalZoneManageable.IsEntryZoneHidden) this.ShowEntryZone = Visibility.Collapsed; + if (criticalZone.IsLeaveZoneHidden) this.ShowLeaveZone = Visibility.Collapsed; + if (criticalZone.IsEntryZoneHidden) this.ShowEntryZone = Visibility.Collapsed; } - if (newValue is IExitlineManageable exitlinemanageable) + if (newValue is IContainerWithExitline withExitline) { - if ((exitlinemanageable.ExitlinePosition & ExitlinePosition.LeftLower) == ExitlinePosition.LeftLower) + if (withExitline.ExitlinePosition.HasFlag(ExitlinePosition.LeftLower)) this.ShowLeftExitline = Visibility.Visible; - else if ((exitlinemanageable.ExitlinePosition & ExitlinePosition.Rightlower) == ExitlinePosition.Rightlower) + if (withExitline.ExitlinePosition.HasFlag(ExitlinePosition.Rightlower)) this.ShowRightExitline = Visibility.Visible; - else if ((exitlinemanageable.ExitlinePosition & ExitlinePosition.Underline) == ExitlinePosition.Underline) - { - this.ShowLeftExitline = Visibility.Visible; - this.ShowRightExitline = Visibility.Visible; - } - - this.ActionElement.AdjustExitlinePosition(); + // 新元素被托管渲染后调整子元素退出线位置 + withExitline.AdjustExitlinePosition(); } if (newValue is ILogicController logicController) { @@ -591,8 +586,7 @@ namespace Deedy.Activity case LogicalBehavior.Break: this.ShowBreakHandle = Visibility.Visible; break; case LogicalBehavior.Continue: this.ShowContinueHandle = Visibility.Visible; break; case LogicalBehavior.Customize: this.ShowCustomizeHandle = Visibility.Visible; break; - default: - break; + default: break; } } //TODO:根据节点的特征与当前工作状态来判定如何处理当前视图的属性 @@ -607,6 +601,8 @@ namespace Deedy.Activity this.IsExpanded = true; this.ElementCount = combined.Elements.Count; } + // 节点集合变更时调整退出线位置 + if (this.ActionElement is IContainerWithExitline container) container.AdjustExitlinePosition(); } protected virtual void ActionElement_PropertyChanged(object? sender, PropertyChangedEventArgs e) @@ -617,8 +613,9 @@ namespace Deedy.Activity case nameof(IActionElement.InstantInfo): this.InstantInfo = this.ActionElement.InstantInfo; break; - case nameof(IExitlineManageable): - this.ActionElement.AdjustExitlinePosition(); + case nameof(IContainerWithExitline.ExitlinePosition): + // 自身退出线变更时调整所有子节点退出线位置 + (this.ActionElement as IContainerWithExitline)?.AdjustExitlinePosition(); break; default: break; } diff --git a/DeedyDesigner/Deedy.Activity/Contract/Interface/IContainerElement.cs b/DeedyDesigner/Deedy.Activity/Contract/Interface/IContainerElement.cs index cc9c180..218d431 100644 --- a/DeedyDesigner/Deedy.Activity/Contract/Interface/IContainerElement.cs +++ b/DeedyDesigner/Deedy.Activity/Contract/Interface/IContainerElement.cs @@ -17,6 +17,14 @@ namespace Deedy.Activity if (index < this.Elements.Count) this.Elements.Insert((int)index, element); if (index >= this.Elements.Count) this.Elements.Add(element); } + public void MoveTo(IElement element, uint index) + { + if (element == null) return; + int newIndex = (index >= this.Elements.Count) ? this.Elements.Count - 1 : (int)index; + int oldIndex = this.Elements.IndexOf(element); + if (oldIndex < 0) this.Elements.Insert(newIndex, element); + else this.Elements.Move(oldIndex, newIndex); + } /// /// 如果类型上没有组装规则,则认为不允许组装,否则按照组装规则处理 /// diff --git a/DeedyDesigner/Deedy.Activity/Contract/Interface/IExitlineManageable.cs b/DeedyDesigner/Deedy.Activity/Contract/Interface/IContainerWithExitline.cs similarity index 77% rename from DeedyDesigner/Deedy.Activity/Contract/Interface/IExitlineManageable.cs rename to DeedyDesigner/Deedy.Activity/Contract/Interface/IContainerWithExitline.cs index 57ae6ce..76b3bc5 100644 --- a/DeedyDesigner/Deedy.Activity/Contract/Interface/IExitlineManageable.cs +++ b/DeedyDesigner/Deedy.Activity/Contract/Interface/IContainerWithExitline.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace Deedy.Activity { - public interface IExitlineManageable + public interface IContainerWithExitline : IContainerElement, IActionElement { ExitlinePosition ExitlinePosition { get; set; } bool? IsExitlineAtSamePosition { get; set; } diff --git a/DeedyDesigner/Deedy.Activity/Helper.cs b/DeedyDesigner/Deedy.Activity/Helper.cs index ae2b399..e728369 100644 --- a/DeedyDesigner/Deedy.Activity/Helper.cs +++ b/DeedyDesigner/Deedy.Activity/Helper.cs @@ -212,20 +212,32 @@ namespace Deedy.Activity return default; } - public static void AdjustExitlinePosition(this IActionElement element) + public static void AdjustExitlinePosition(this IContainerWithExitline container) { - if (element is IExitlineManageable exitlineManageable - && (exitlineManageable.ExitlinePosition == ExitlinePosition.LeftLower - || exitlineManageable.ExitlinePosition == ExitlinePosition.Rightlower)) + if (container != null + && (container.ExitlinePosition == ExitlinePosition.LeftLower + || container.ExitlinePosition == ExitlinePosition.Rightlower)) { - //TODO:根据退出线方向是否相同的设置项调整子节点的退出线位置 - if (exitlineManageable.IsExitlineAtSamePosition == true) + var lastChild = container.Elements[container.Elements.Count - 1] as IContainerWithExitline; + if (lastChild != null + && (lastChild.ExitlinePosition == ExitlinePosition.LeftLower + || lastChild.ExitlinePosition == ExitlinePosition.Rightlower)) { - //TODO:同向退出线控制 - } - if (exitlineManageable.IsExitlineAtSamePosition == false) - { - //TODO:对向退出线控制 + if (container.IsExitlineAtSamePosition == true) + { + if (container.ExitlinePosition == ExitlinePosition.LeftLower) + lastChild.ExitlinePosition = ExitlinePosition.LeftLower; + if (container.ExitlinePosition == ExitlinePosition.Rightlower) + lastChild.ExitlinePosition = ExitlinePosition.Rightlower; + } + if (container.IsExitlineAtSamePosition == false) + { + if (container.ExitlinePosition == ExitlinePosition.LeftLower) + lastChild.ExitlinePosition = ExitlinePosition.LeftLower; + if (container.ExitlinePosition == ExitlinePosition.Rightlower) + lastChild.ExitlinePosition = ExitlinePosition.Rightlower; + } + //lastChild.AdjustExitlinePosition(); } } }