using Godot; using Skeleton.DataStructure.Link; using VirtualChemistry.Chemistry.Mixtures.Implements; public partial class FlaskContent : ColorRect { public HomogeneousMixture Mixture { get; set; } = HomogeneousMixture.Null; private const double ContainerHeight = 512d; private double ContainerVolume => Mixture.HeterogeneousMixture.Container.Volume(); public double Volume => Mixture.Volume; private TextureButton Mask { get; set; } public double VolumeStartFrom { get { double res = 0; for (LinkNode iter = Mixture.Layer.Previous; !iter.IsEnding; iter = iter.Previous) res += iter.Value.Volume; return res; } } private ColorRect Bar { get; set; } private AnimationPlayer AP { get; set; } public double StartFrom => (VolumeStartFrom / ContainerVolume) * ContainerHeight; public void UpdateVolumeAndPosition() { double height = (Volume / ContainerVolume) * ContainerHeight; Position = new Vector2(Position.X, 512-(float)(StartFrom + height)); Size = new Vector2(Size.X, (float)height); Color = Color.Color8( Mixture.ColorRed, Mixture.ColorGreen, Mixture.ColorGreen, Mixture.ColorTransparent ); } // Called when the node enters the scene tree for the first time. public override void _Ready() { Bar = GetNode("Bar"); AP = GetNode("AP"); Mask = GetNode("Mask"); } // Called every frame. 'delta' is the elapsed time since the previous frame. public override void _Process(double delta) { } private void OnSizeChange() => Mask.Size = Size; private void OnMouseEnter() => AP.Play("MouseEntered"); private void OnMouseExit() => AP.PlayBackwards("MouseEntered"); private void OnClick() => GlobalScene.MainControlPanel.Update(Mixture); }