using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Shapes; namespace PamhagenSysCtrl.Helpers.Pipeline { public class Tank : INode, ISink, ISource { public const double WIDTH = 60; public const double HEIGHT = 100; public double CenterX { get; set; } public double CenterY { get; set; } public double TopY => CenterY - HEIGHT / 2; public double BottomY => CenterY + HEIGHT / 2; public string Label { get; set; } public FillState FillState => CallbackFillState(); public bool IsFull => FillState == FillState.Full; public bool IsFilled => FillState != FillState.Empty; public ISet Inputs { get; init; } public ISet Outputs { get; init; } public int? CapacityLiters { get; set; } protected Func CallbackFillState; private Shape? _rect; private TextBlock? _text; public Tank(string label, double x, double y, int capacityLiters, Func cbFillState) { CenterX = x; CenterY = y; Label = label; CapacityLiters = capacityLiters; CallbackFillState = cbFillState; Inputs = new HashSet(); Outputs = new HashSet(); } public void Draw(Canvas canvas) { _rect = new Rectangle() { Width = WIDTH, Height = HEIGHT, Stroke = Brushes.Black, StrokeThickness = 2, Fill = Brushes.WhiteSmoke, }; _text = new() { Text = CapacityLiters.HasValue ? $"{Label}\n{CapacityLiters:N0}" : 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 - (CapacityLiters.HasValue ? 16 : 8)); canvas.Children.Add(_rect); 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) { _rect?.Fill = PamhagenBrushes.ForFillState(FillState, isHovering && isPressed ? Brushes.DarkGray : isHovering ? Brushes.LightGray : Brushes.WhiteSmoke ); } } }