namespace Yw.WpfUI.Hydro
{
///
/// 选择管理器
///
internal class SimpleSelectionManager
{
///
///
///
public SimpleSelectionManager(HelixViewport3D viewport)
{
_viewport = viewport;
}
///
/// 选择改变事件
///
public event Action> SelectionChangedEvent;
///
/// 状态改变事件
///
public event Action StateChangedEvent;
private readonly HelixViewport3D _viewport;//控件
private readonly List _selection = new();//选择集合
#region 内部实现
//添加选择
private void AddToSelection(Visual3D visual)
{
if (_selection.Contains(visual))
{
return;
}
_selection.Add(visual);
this.StateChangedEvent?.Invoke(visual, eSelectionType.Load);
}
//从选择中移除
private void RemoveFromSelection(Visual3D visual)
{
if (!_selection.Contains(visual))
{
return;
}
_selection.Remove(visual);
this.StateChangedEvent?.Invoke(visual, eSelectionType.Unload);
}
//清理选择
private void ClearSelection()
{
if (_selection.Count < 1)
{
return;
}
_selection.ForEach(x => this.StateChangedEvent?.Invoke(x, eSelectionType.Unload));
_selection.Clear();
}
#endregion
///
/// 处理单个选择
///
public void HandleSingle(Point pt)
{
var visual = _viewport.FindNearestVisual(pt);
if (visual == null)
{
if (_selection.Count > 0)
{
ClearSelection();
this.SelectionChangedEvent?.Invoke(null);
}
return;
}
if (_selection.Count == 1 && _selection[0] == visual)
{
return;
}
ClearSelection();
AddToSelection(visual);
this.SelectionChangedEvent?.Invoke(_selection);
}
///
/// 处理多个选择
///
public void HandleMulti(Point pt)
{
var visual = _viewport.FindNearestVisual(pt);
if (visual == null)
{
return;
}
if (_selection.Contains(visual))
{
return;
}
AddToSelection(visual);
this.SelectionChangedEvent?.Invoke(_selection);
}
///
/// 选择Visual
/// 不触发选择改变事件
///
public void SelectVisual(Visual3D visual)
{
ClearSelection();
if (visual == null)
{
return;
}
AddToSelection(visual);
}
///
/// 选择Visuals
///
public void SelectVisuals(List visuals)
{
ClearSelection();
if (visuals == null || visuals.Count < 1)
{
return;
}
visuals.ForEach(AddToSelection);
}
}
}