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 = 24; public const double HEIGHT = 12; 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 => CallbackActive(); protected Func CallbackActive; 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, Func cbActive) { CenterX = x; CenterY = y; Label = label; CallbackActive = cbActive; Inputs = new HashSet(); Outputs = new HashSet(); } public void Draw(Canvas canvas) { _rect = new Rectangle() { 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 - 4; var h = 3; var w = 5; _hopperOuter = new Polygon() { Points = [new(hx - w, top - h), new(hx - w + 1, top + 0.4), new(hx + w - 1, top + 0.4), new(hx + w, top - h)], Fill = Brushes.Black, }; _hopperInner = new Polygon() { Points = [new(hx - w + 0.4, top - h), new(hx - w + 1 + 0.4, top + 0.4), new(hx + w - 1 - 0.4, top + 0.4), new(hx + w - 0.4, top - h)], Fill = Brushes.WhiteSmoke, }; _bottomOuter = new Polygon() { Points = [new(left + 4, bottom), new(right - 4, bottom), new(right - 3, bottom + 2), new(left + 3, bottom + 2)], Fill = Brushes.Black, }; _bottomInner = new Polygon() { Points = [new(left + 4 + 0.4, bottom), new(right - 4 - 0.4, bottom), new(right - 3 - 0.4, bottom + 2), new(left + 3 + 0.4, bottom + 2)], Fill = Brushes.WhiteSmoke, }; _text = new() { Text = Label, TextAlignment = TextAlignment.Center, VerticalAlignment = VerticalAlignment.Center, }; 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 void Scale(double scale) { _rect?.Width = WIDTH * scale; _rect?.Height = HEIGHT * scale; _rect?.StrokeThickness = 2; _rect?.SetValue(Canvas.LeftProperty, (CenterX - WIDTH / 2) * scale); _rect?.SetValue(Canvas.TopProperty, (CenterY - HEIGHT / 2) * scale); _hopperOuter?.RenderTransform = new ScaleTransform(scale, scale); _hopperInner?.RenderTransform = new ScaleTransform(scale, scale); _bottomOuter?.RenderTransform = new ScaleTransform(scale, scale); _bottomInner?.RenderTransform = new ScaleTransform(scale, scale); _text?.FontSize = 12; _text?.Width = WIDTH * scale; _text?.SetValue(Canvas.LeftProperty, (CenterX - WIDTH / 2) * scale); _text?.SetValue(Canvas.TopProperty, (CenterY * scale) - 8); } 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; } } }