using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Shapes; namespace PamhagenSysCtrl.Helpers.Pipeline { public class EncasedAuger : INode { public const double WIDTH = 16; public const double HEIGHT = 4; public double CenterX { get; set; } public double CenterY { get; set; } public double Angle { get; set; } public string Label { get; set; } public ISet Inputs { get; init; } public ISet Outputs { get; init; } public bool IsClickable { get; private set; } public bool IsActive => CallbackActive(); public bool IsAnimationActive { get => _animationActive; set { _animationActive = value; _auger?.IsAnimationActive = value; } } protected Func CallbackActive; private bool _animationActive; private Canvas? _canvas; private Rectangle? _inner; private Rectangle? _outer; private Auger? _auger; private TextBlock? _text; public EncasedAuger(string label, double x, double y, Func cbActive, double angle = 0, bool clickable = true) { CenterX = x; CenterY = y; Label = label; Angle = angle; CallbackActive = cbActive; IsClickable = clickable; Inputs = new HashSet(); Outputs = new HashSet(); } public void Draw(Canvas canvas) { _canvas = new Canvas() { RenderTransform = new RotateTransform(Angle), }; _outer = new Rectangle() { Fill = Brushes.Black, }; _inner = new Rectangle() { Fill = Brushes.WhiteSmoke, }; _canvas.Children.Add(_outer); _canvas.Children.Add(_inner); canvas.Children.Add(_canvas); _text = new() { Text = Label, TextAlignment = TextAlignment.Center, VerticalAlignment = VerticalAlignment.Center, }; canvas.Children.Add(_text); _auger = new Auger(CenterX, CenterY, WIDTH, 2.4, Angle); _auger.Draw(canvas); } public void Scale(double scale) { var border = Graph.ToBorder(scale); _canvas?.SetValue(Canvas.LeftProperty, (CenterX - WIDTH / 2) * scale); _canvas?.SetValue(Canvas.TopProperty, (CenterY - HEIGHT / 2) * scale); _canvas?.RenderTransform = new RotateTransform(Angle, WIDTH / 2 * scale, HEIGHT / 2 * scale); _outer?.Width = WIDTH * scale; _outer?.Height = HEIGHT * scale; _inner?.Width = WIDTH * scale; _inner?.Height = HEIGHT * scale - border * 2; _inner?.SetValue(Canvas.TopProperty, border); _text?.FontSize = 12; _text?.Width = WIDTH * scale; _text?.SetValue(Canvas.LeftProperty, (CenterX - WIDTH / 2) * scale); _text?.SetValue(Canvas.TopProperty, (CenterY + HEIGHT / 2) * scale); _auger?.Scale(scale); } public bool IsInside(double x, double y) { return Math.Sqrt(Math.Pow(CenterX - x, 2) + Math.Pow(CenterY - y, 2)) <= WIDTH / 2; } public void Update(bool isHovering, bool isPressed) { isHovering = isHovering && IsClickable; IsAnimationActive = IsActive; _inner?.Fill = IsAnimationActive && isHovering && isPressed ? PamhagenBrushes.Red : IsAnimationActive && isHovering ? PamhagenBrushes.Red : !IsAnimationActive && isHovering && isPressed ? PamhagenBrushes.Green : !IsAnimationActive && isHovering ? PamhagenBrushes.Green : IsAnimationActive ? PamhagenBrushes.Green : Brushes.WhiteSmoke; } } }