summaryrefslogtreecommitdiff
path: root/Scripts/OutputContainer.cs
blob: d5a5bea2d6190488cbff2ced616607445a3f83d5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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();
                });
        }
    }
}