Files
aistudio-wpf-diagram/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramSelectionService.cs

116 lines
3.3 KiB
C#
Raw Normal View History

2021-07-23 09:42:22 +08:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
2022-10-28 22:45:39 +08:00
namespace AIStudio.Wpf.DiagramDesigner
2021-07-23 09:42:22 +08:00
{
2023-06-28 22:11:24 +08:00
public class DiagramSelectionService
2021-07-23 09:42:22 +08:00
{
private IDiagramViewModel DiagramViewModel;
2023-06-28 22:11:24 +08:00
public DiagramSelectionService(IDiagramViewModel diagramViewModel)
2021-07-23 09:42:22 +08:00
{
this.DiagramViewModel = diagramViewModel;
}
public void AddToSelection(ISelectable item)
{
if (item is IGroupable)
{
List<IGroupable> groupItems = GetGroupMembers(item as IGroupable);
foreach (ISelectable groupItem in groupItems)
{
groupItem.IsSelected = true;
}
}
else
{
item.IsSelected = true;
}
}
2023-05-14 18:02:59 +08:00
public void RemoveFromSelection(ISelectable item)
2021-07-23 09:42:22 +08:00
{
if (item is IGroupable)
{
List<IGroupable> groupItems = GetGroupMembers(item as IGroupable);
foreach (ISelectable groupItem in groupItems)
{
groupItem.IsSelected = false;
}
}
else
{
item.IsSelected = false;
}
}
2023-03-07 22:59:27 +08:00
internal List<IGroupable> GetGroupMembers(IGroupable item, bool withchildren=true)
2021-07-23 09:42:22 +08:00
{
IEnumerable<IGroupable> list = DiagramViewModel.Items.OfType<IGroupable>();
IGroupable rootItem = GetRoot(list, item);
if (rootItem == null)
{
return new List<IGroupable>();
}
2023-03-07 22:59:27 +08:00
if (rootItem.IsGroup)//分组状态下,获取全部成员
{
return GetGroupMembers(list, rootItem);
}
else
{
if (withchildren)
return GetGroupMembers(list, item);//普通的Parent关系获取其Children
else
return new List<IGroupable>() { item };
}
2021-07-23 09:42:22 +08:00
}
internal IGroupable GetGroupRoot(IGroupable item)
{
IEnumerable<IGroupable> list = DiagramViewModel.Items.OfType<IGroupable>();
return GetRoot(list, item);
}
private IGroupable GetRoot(IEnumerable<IGroupable> list, IGroupable node)
{
if (node == null || node.ParentId == Guid.Empty)
{
return node;
}
else
{
foreach (IGroupable item in list)
{
if (item.Id == node.ParentId)
{
return GetRoot(list, item);
}
}
return null;
}
}
private List<IGroupable> GetGroupMembers(IEnumerable<IGroupable> list, IGroupable parent)
{
List<IGroupable> groupMembers = new List<IGroupable>();
groupMembers.Add(parent);
var children = list.Where(node => node.ParentId == parent.Id && node.ParentId != Guid.Empty);
foreach (IGroupable child in children)
{
groupMembers.AddRange(GetGroupMembers(list, child));
}
return groupMembers;
}
2023-03-07 22:59:27 +08:00
2021-07-23 09:42:22 +08:00
}
}