using System.Linq; using Godot; namespace Texty.Scripts { public abstract class OutputContainer : PanelContainer { private double _lastScrollLimit; private VScrollBar _scrollBar; [Export(PropertyHint.Range, "10,40,1")] public int MaximumRows = 20; public VBoxContainer OutputRows; public ScrollContainer ScrollContainer; public override void _Ready() { ScrollContainer = GetNode(nameof(ScrollContainer)); _scrollBar = ScrollContainer.GetVScrollbar(); OutputRows = ScrollContainer.GetNode(nameof(OutputRows)); _lastScrollLimit = _scrollBar.MaxValue; _scrollBar.Connect("changed", this, nameof(OnScrollLimitChanged)); } public void Add(OutputRow row) { OutputRows.AddChild(row); ExpungeOldRows(); } public void OnScrollLimitChanged() { if (!(_lastScrollLimit < _scrollBar.MaxValue)) return; _lastScrollLimit = _scrollBar.MaxValue; ScrollContainer.ScrollVertical = (int)_scrollBar.MaxValue; } private void ExpungeOldRows() { GD.Range(OutputRows.GetChildCount() - MaximumRows) .Select(idx => OutputRows.GetChild(idx)) .ToList() .ForEach(row => { OutputRows.RemoveChild(row); row.QueueFree(); }); } } }