144 lines
4.1 KiB
C#
144 lines
4.1 KiB
C#
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;
|
|
|
|
/// <summary>
|
|
/// Логика взаимодействия для ViewLadder.xaml
|
|
/// </summary>
|
|
internal partial class ViewLadder : UserControl
|
|
{
|
|
/// <summary>
|
|
/// Ширина отступа глубины.
|
|
/// </summary>
|
|
[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<LadderType> Ladder
|
|
{
|
|
get { return (IEnumerable<LadderType>)GetValue(LadderProperty); }
|
|
set { SetValue(LadderProperty, value); }
|
|
}
|
|
public static readonly DependencyProperty LadderProperty = DependencyProperty.Register(
|
|
"Ladder",
|
|
typeof(IEnumerable<LadderType>),
|
|
typeof(ViewLadder),
|
|
new FrameworkPropertyMetadata(
|
|
Array.Empty<LadderType>(),
|
|
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<LadderType> 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;
|
|
}
|
|
}
|