using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Pf2e.WPF.EntityViewer;
using Pf2e.WPF.EntityViewer.EntityViewStructure;
namespace Pf2e.WPF.EntityViewer.Component;
///
/// Логика взаимодействия для ViewLadder.xaml
///
internal partial class ViewLadder : UserControl
{
///
/// Ширина отступа глубины.
///
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
[Category("Entity Render")]
[Description("The size of tab.")]
public double DepthSize
{
get { return (double)GetValue(DepthSizeProperty); }
set { SetValue(DepthSizeProperty, value); }
}
public static readonly DependencyProperty DepthSizeProperty = DependencyProperty.Register(
"DepthSize",
typeof(double),
typeof(ViewLadder),
new FrameworkPropertyMetadata(20.0, new PropertyChangedCallback(OnValueChanged))
);
public IEnumerable Ladder
{
get { return (IEnumerable)GetValue(LadderProperty); }
set { SetValue(LadderProperty, value); }
}
public static readonly DependencyProperty LadderProperty = DependencyProperty.Register(
"Ladder",
typeof(IEnumerable),
typeof(ViewLadder),
new FrameworkPropertyMetadata(
Array.Empty(),
new PropertyChangedCallback(OnValueChanged)
)
);
private static void OnValueChanged(
DependencyObject obj,
DependencyPropertyChangedEventArgs args
)
{
ViewLadder control = (ViewLadder)obj;
control.Rebuild();
}
public ViewLadder()
{
InitializeComponent();
}
public void Rebuild()
{
int n = Ladder.Count();
Width = n * DepthSize;
DrawingGroup result = new();
result.Children.Add(
new GeometryDrawing()
{
Geometry = new RectangleGeometry(new(0, 0, n * DepthSize, Height)),
Pen = new(Brushes.Transparent, 0),
}
);
result.Children.Add(
new GeometryDrawing()
{
Geometry = GetLadderGeometryGroup(Ladder, DepthSize, Height),
Pen = new(Brushes.Black, 1),
}
);
TargetCanvas.Background = new DrawingBrush(result);
}
private GeometryGroup GetLadderGeometryGroup(IEnumerable ladder, double w, double h)
{
GeometryGroup geometryGroup = new();
double w2 = w / 2;
double h2 = h / 2;
int i = 0;
foreach (LadderType ladderType in ladder)
{
switch (ladderType)
{
case LadderType.Empty:
break;
case LadderType.Last:
geometryGroup.Children.Add(
new LineGeometry(new(i * w + w2, 0), new(i * w + w2, h2))
);
geometryGroup.Children.Add(
new LineGeometry(new(i * w + w2, h2), new(i * w + w, h2))
);
break;
case LadderType.Through:
geometryGroup.Children.Add(
new LineGeometry(new(i * w + w2, 0), new(i * w + w2, h))
);
if (i == ladder.Count() - 1)
{
geometryGroup.Children.Add(
new LineGeometry(new(i * w + w2, h2), new(i * w + w, h2))
);
}
break;
default:
throw new ArgumentOutOfRangeException(nameof(ladder));
}
i++;
}
return geometryGroup;
}
}