diff options
Diffstat (limited to 'Scripts/OutputContainer.cs')
| -rw-r--r-- | Scripts/OutputContainer.cs | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/Scripts/OutputContainer.cs b/Scripts/OutputContainer.cs new file mode 100644 index 0000000..d5a5bea --- /dev/null +++ b/Scripts/OutputContainer.cs @@ -0,0 +1,53 @@ +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<ScrollContainer>(nameof(ScrollContainer)); + _scrollBar = ScrollContainer.GetVScrollbar(); + OutputRows = ScrollContainer.GetNode<VBoxContainer>(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(); + }); + } + } +}
\ No newline at end of file |
