using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Shapes; namespace PamhagenSysCtrl.Helpers.Pipeline { public class Rebler : INode { public const double WIDTH = 120; 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; set; } private TextBlock? _text; private Shape? _rect; private Shape? _hopperOuter; private Shape? _hopperInner; private Shape? _bottomInner; private Shape? _bottomOuter; public Rebler(string label, double x, double y) { CenterX = x; CenterY = y; Label = label; Inputs = new HashSet(); Outputs = new HashSet(); } public void Draw(Canvas canvas) { _rect = new Rectangle() { Width = WIDTH, Height = HEIGHT, Fill = Brushes.WhiteSmoke, Stroke = Brushes.Black, StrokeThickness = 2, }; var left = CenterX - WIDTH / 2; var right = CenterX + WIDTH / 2; var top = CenterY - HEIGHT / 2; var bottom = CenterY + HEIGHT / 2; var hx = right - 20; var h = 15; var w = 25; _hopperOuter = new Polygon() { Points = [new(hx - w, top - h), new(hx - w + 5, top + 2), new(hx + w - 5, top + 2), new(hx + w, top - h)], Fill = Brushes.Black, }; _hopperInner = new Polygon() { Points = [new(hx - w + 2, top - h), new(hx - w + 5 + 2, top + 2), new(hx + w - 5 - 2, top + 2), new(hx + w - 2, top - h)], Fill = Brushes.WhiteSmoke, }; _bottomOuter = new Polygon() { Points = [new(left + 20, bottom), new(right - 20, bottom), new(right - 15, bottom + 10), new(left + 15, bottom + 10)], Fill = Brushes.Black, }; _bottomInner = new Polygon() { Points = [new(left + 20 + 2, bottom), new(right - 20 - 2, bottom), new(right - 15 - 2, bottom + 10), new(left + 15 + 2, bottom + 10)], Fill = Brushes.WhiteSmoke, }; _text = new() { Text = Label, FontSize = 12, Width = WIDTH, TextAlignment = TextAlignment.Center, VerticalAlignment = VerticalAlignment.Center, }; _rect.SetValue(Canvas.LeftProperty, CenterX - WIDTH / 2); _rect.SetValue(Canvas.TopProperty, CenterY - HEIGHT / 2); _text.SetValue(Canvas.LeftProperty, CenterX - WIDTH / 2); _text.SetValue(Canvas.TopProperty, CenterY - 8); canvas.Children.Add(_hopperOuter); canvas.Children.Add(_bottomOuter); canvas.Children.Add(_rect); canvas.Children.Add(_hopperInner); canvas.Children.Add(_bottomInner); canvas.Children.Add(_text); } 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) { var color = IsActive && isHovering && isPressed ? PamhagenBrushes.Red : IsActive && isHovering ? PamhagenBrushes.Red : !IsActive && isHovering && isPressed ? PamhagenBrushes.Green : !IsActive && isHovering ? PamhagenBrushes.Green : IsActive ? PamhagenBrushes.Green : Brushes.WhiteSmoke; _rect?.Fill = color; _hopperInner?.Fill = color; _bottomInner?.Fill = color; } } }