Files
VirtualChemistry.Demo/Scenes/FlaskContent.cs
2024-06-27 04:16:35 +08:00

58 lines
1.7 KiB
C#
Executable File

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<HomogeneousMixture> 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<ColorRect>("Bar");
AP = GetNode<AnimationPlayer>("AP");
Mask = GetNode<TextureButton>("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);
}