diff options
| author | Sophia Pearson <codergal89@gmail.com> | 2022-05-20 00:45:25 +0200 |
|---|---|---|
| committer | Sophia Pearson <codergal89@gmail.com> | 2022-05-20 18:56:04 +0200 |
| commit | 05d29ccce1898ed89c0b650c77242c2fa2805128 (patch) | |
| tree | e8ee3bcb570fa6f3d9d96273c2bf4d4c8618d08b /Scripts/OutputContainer.cs | |
| download | texty-05d29ccce1898ed89c0b650c77242c2fa2805128.tar.xz texty-05d29ccce1898ed89c0b650c77242c2fa2805128.zip | |
texty: initial commit
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 |
