using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; namespace PamhagenSysCtrl.Helpers.Pipeline { class EntryTrough : INode { public const double WIDTH = 150; public const double HEIGHT = 60; public double CenterX { get; set; } public double CenterY { get; set; } public string Label { get; set; } public ISet Inputs { get; init; } public ISet Outputs { get; init; } public bool IsActive { get => _active; set { _active = value; _auger?.IsActive = value; if (value) { _doorTransform?.BeginAnimation( RotateTransform.AngleProperty, new DoubleAnimation { From = _doorTransform.Angle, To = 60, Duration = TimeSpan.FromSeconds(Math.Abs(_doorTransform.Angle - 60) / 60.0) }); } else { _doorTransform?.BeginAnimation( RotateTransform.AngleProperty, new DoubleAnimation { From = _doorTransform.Angle, To = 0, Duration = TimeSpan.FromSeconds(Math.Abs(_doorTransform.Angle - 0) / 60.0) }); } } } private bool _active; private Shape? _inner; private Shape? _outer; private TextBlock? _text; private Auger? _auger; private Shape? _door; private RotateTransform? _doorTransform; public EntryTrough(string label, double x, double y) { CenterX = x; CenterY = y; Label = label; Inputs = new HashSet(); Outputs = new HashSet(); } public void Draw(Canvas canvas) { var top = CenterY - HEIGHT / 2; var right = CenterX + WIDTH / 2; var bottom = CenterY + HEIGHT / 2; var left = CenterX - WIDTH / 2; _outer = new Polygon() { Points = [new(left, top), new(right, top), new(right - 20, bottom), new(left, bottom), new(left, bottom - 20), new(left + 12.5, bottom - 20)], Fill = Brushes.Black, }; _inner = new Polygon() { Points = [new(left + 2, top), new(right - 2, top), new(right - 20 - 2, bottom - 2), new(left, bottom - 2), new(left, bottom - 18), new(left + 15.5, bottom - 18)], Fill = Brushes.WhiteSmoke, }; _doorTransform = new RotateTransform(0, left, bottom - 24); _door = new Line() { X1 = left, Y1 = bottom - 24, X2 = left, Y2 = bottom + 4, Stroke = Brushes.Black, StrokeThickness = 4, RenderTransform = _doorTransform, }; _text = new() { Text = Label, FontSize = 12, Width = WIDTH, TextAlignment = TextAlignment.Center, VerticalAlignment = VerticalAlignment.Center, }; _text.SetValue(Canvas.LeftProperty, CenterX - WIDTH / 2); _text.SetValue(Canvas.TopProperty, CenterY - 7.5 - 8); canvas.Children.Add(_outer); canvas.Children.Add(_inner); canvas.Children.Add(_text); canvas.Children.Add(_door); _auger = new(CenterX - 11, CenterY + HEIGHT / 2 - 9, WIDTH - 25, 12); _auger.Draw(canvas); } public bool IsInside(double x, double y) { return Math.Abs(x - CenterX) <= WIDTH / 2 && Math.Abs(y - CenterY) <= HEIGHT / 2; } public void Update(bool isHovering, bool isPressed) { _inner?.Fill = IsActive && isHovering && isPressed ? PamhagenBrushes.Red : IsActive && isHovering ? PamhagenBrushes.Red : !IsActive && isHovering && isPressed ? PamhagenBrushes.Green : !IsActive && isHovering ? PamhagenBrushes.Green : IsActive ? PamhagenBrushes.Green : Brushes.WhiteSmoke; } } }