namespace Yw.WpfUI.Hydro
{
///
/// 抽象选择辅助类
///
internal class LogicalSelectionHelper
{
///
///
///
public LogicalSelectionHelper(HelixViewport3D viewport)
{
_viewport = viewport;
}
///
/// 选择改变事件
///
public event Action> SelectionChangedEvent;
///
/// 状态改变事件
///
public event Action StateChangedEvent;
private readonly HelixViewport3D _viewport;//三维组件
///
/// 选择集合
///
public List Selection
{
get { return _selection; }
private set { _selection = value; }
}
private List _selection = new();
#region 内部实现
//添加选择
private void AddToSelection(LogicalVisual3D visual)
{
if (_selection.Contains(visual))
{
return;
}
_selection.Add(visual);
this.StateChangedEvent?.Invoke(visual, true);
}
//从选择中移除
private void RemoveFromSelection(LogicalVisual3D visual)
{
if (!_selection.Contains(visual))
{
return;
}
_selection.Remove(visual);
this.StateChangedEvent?.Invoke(visual, false);
}
//清理选择
private void ClearSelection()
{
if (_selection.Count < 1)
{
return;
}
_selection.ForEach(x => this.StateChangedEvent?.Invoke(x, false));
_selection.Clear();
}
#endregion
///
/// 处理单个选择
///
public void HandleSingle(Point pt)
{
var logicalVisual = _viewport.FindNearestVisual(pt) as LogicalVisual3D;
if (logicalVisual == null)
{
if (_selection.Count > 0)
{
ClearSelection();
this.SelectionChangedEvent?.Invoke(null);
}
return;
}
if (_selection.Count == 1 && _selection[0] == logicalVisual)
{
return;
}
ClearSelection();
AddToSelection(logicalVisual);
this.SelectionChangedEvent?.Invoke(_selection);
}
///
/// 处理多个选择
///
public void HandleMulti(Point pt)
{
var logicalVisual = _viewport.FindNearestVisual(pt) as LogicalVisual3D;
if (logicalVisual == null)
{
return;
}
if (_selection.Contains(logicalVisual))
{
return;
}
AddToSelection(logicalVisual);
this.SelectionChangedEvent?.Invoke(_selection);
}
///
/// 选择Visual
/// 不触发选择改变事件
///
public void SelectVisual(LogicalVisual3D visual)
{
ClearSelection();
if (visual == null)
{
return;
}
AddToSelection(visual);
}
///
/// 选择Visuals
///
public void SelectVisual(List visuals)
{
ClearSelection();
if (visuals == null || visuals.Count < 1)
{
return;
}
visuals.ForEach(AddToSelection);
}
}
}