/// <summary> /// Updates the mouse hover box with stuff. /// </summary> /// <remarks> /// <para> /// This creates and removes GUI elements every frame. /// Supposedly that's quite expensive, but I think that's /// how the old JS code do it anyway. /// </para> /// </remarks> private void UpdateHoverInfo() { foreach (Node children in hoveredItems.GetChildren()) { hoveredItems.RemoveChild(children); // Using QueueFree leaves a gap at // the bottom of the panel children.Free(); } if (mouseHoverPanel.RectSize != new Vector2(270, 130)) { mouseHoverPanel.RectSize = new Vector2(270, 130); } if (mouseHoverPanel.MarginLeft != -280) { mouseHoverPanel.MarginLeft = -280; } if (mouseHoverPanel.MarginRight != -10) { mouseHoverPanel.MarginRight = -10; } var compounds = stage.Clouds.GetAllAvailableAt(stage.Camera.CursorWorldPos); var builder = new StringBuilder(string.Empty, 250); if (showMouseCoordinates) { builder.AppendFormat(CultureInfo.CurrentCulture, "Stuff at {0:F1}, {1:F1}:\n", stage.Camera.CursorWorldPos.x, stage.Camera.CursorWorldPos.z); } var mousePosLabel = hoveredItems.GetParent().GetNode <Label>("MousePos"); if (compounds.Count == 0) { builder.Append("Nothing to eat here"); } else { builder.Append("At cursor:"); bool first = true; // Create for each compound the information in GUI foreach (var entry in compounds) { if (first) { var compoundsLabel = new Label(); compoundsLabel.Valign = Label.VAlign.Center; hoveredItems.AddChild(compoundsLabel); compoundsLabel.AddConstantOverride("line_spacing", -5); compoundsLabel.Text = "Compounds: \n"; } first = false; var hBox = new HBoxContainer(); var compoundText = new Label(); var readableName = entry.Key.Name; var compoundIcon = GUICommon.Instance.CreateCompoundIcon(readableName, 25, 25); var compoundsText = new StringBuilder(readableName, 150); compoundsText.AppendFormat(CultureInfo.CurrentCulture, ": {0:F1}", entry.Value); compoundText.Text = compoundsText.ToString(); hBox.AddChild(compoundIcon); hBox.AddChild(compoundText); hoveredItems.AddChild(hBox); } } var aiMicrobes = GetTree().GetNodesInGroup(Constants.AI_GROUP); // Show the hovered over microbe's species foreach (Microbe entry in aiMicrobes) { var distance = (entry.Translation - stage.Camera.CursorWorldPos).Length(); // Find only cells that have the mouse // position within their membrane if (distance > entry.Radius) { continue; } var microbeText = new Label(); microbeText.Valign = Label.VAlign.Center; hoveredItems.AddChild(microbeText); microbeText.Text = "Cell of species " + entry.Species.FormattedName; } mousePosLabel.Text = builder.ToString(); }