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();
});
}
}
}
|