using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Shapes; namespace PamhagenSysCtrl.Helpers.Pipeline { public class Valve : INode { public const double DIAMETER = 24; public double CenterX { get; set; } public double CenterY { get; set; } public int Nr { get; set; } public string Label => $"V{Nr}"; public Brush? Highlight { get; set; } public bool IsLocked { get; set; } public bool IsOpen => CallbackIsOpen(); public bool WantOpen => CallbackWantOpen(); public ISet Inputs { get; init; } public ISet Outputs { get; init; } protected Func CallbackIsOpen; protected Func CallbackWantOpen; private Shape? _circle; private TextBlock? _text; public Valve(int nr, double x, double y, Func cbOpen, Func cbWant) { CenterX = x; CenterY = y; Nr = nr; CallbackIsOpen = cbOpen; CallbackWantOpen = cbWant; Inputs = new HashSet(); Outputs = new HashSet(); } public void Draw(Canvas canvas) { _circle = new Ellipse() { Height = DIAMETER, Width = DIAMETER, Fill = Brushes.DarkGray, Stroke = Brushes.Black, StrokeThickness = 2, }; _circle.SetValue(Canvas.LeftProperty, CenterX - DIAMETER / 2); _circle.SetValue(Canvas.TopProperty, CenterY - DIAMETER / 2); _text = new() { Text = Label, FontSize = 10, Width = DIAMETER, Height = DIAMETER, TextAlignment = TextAlignment.Center, VerticalAlignment = VerticalAlignment.Center, }; _text.SetValue(Canvas.LeftProperty, CenterX - DIAMETER / 2); _text.SetValue(Canvas.TopProperty, CenterY - DIAMETER / 2 + 5.5); canvas.Children.Add(_circle); canvas.Children.Add(_text); } public bool IsInside(double x, double y) { return Math.Sqrt(Math.Pow(CenterX - x, 2) + Math.Pow(CenterY - y, 2)) <= DIAMETER / 2; } public void Update(bool isHovering, bool isPressed) { _circle?.Fill = IsLocked && !WantOpen && !IsOpen ? PamhagenBrushes.DimOrange : IsLocked && !WantOpen && IsOpen ? PamhagenBrushes.Red : IsLocked && WantOpen && !IsOpen ? PamhagenBrushes.Yellow : IsLocked && WantOpen && IsOpen ? PamhagenBrushes.Green : Highlight ?? (isHovering ? Brushes.LightGray : Brushes.DarkGray); } } }