summaryrefslogtreecommitdiff
path: root/Scripts/OutputRow.cs
blob: 15a645406a0a1d2102995d52b0e4ef39e6bd4c6d (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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
using System;
using Godot;

namespace Texty.Scripts
{
    public abstract class OutputRow : VBoxContainer
    {
        [Signal]
        public delegate void InputTextChanged(string newText);

        [Signal]
        public delegate void OutputTextChanged(string newText);

        public Label Input;
        public Label Output;

        private string _inputText = "";
        private string _outputText = "";

        [Export]
        public string InputText
        {
            get => _inputText;
            set => UpdateText(Field.Input, value ?? "");
        }

        [Export]
        public string OutputText
        {
            get => _outputText;
            set => UpdateText(Field.Output, value ?? "");
        }

        public override void _Ready()
        {
            Input = GetNode<Label>(nameof(Input));
            UpdateLabel(Input, _inputText);
            Output = GetNode<Label>(nameof(Output));
            UpdateLabel(Output, _outputText);
        }

        private void UpdateText(Field field, string value)
        {
            switch (field)
            {
                case Field.Input:
                    _inputText = value;
                    EmitSignal(nameof(InputTextChanged), _inputText);
                    UpdateLabel(Input, value);
                    break;
                case Field.Output:
                    _outputText = value;
                    EmitSignal(nameof(OutputTextChanged), value);
                    UpdateLabel(Output, value);
                    break;
                default:
                    throw new ArgumentOutOfRangeException(nameof(field), field, "No such field!");
            }
        }

        private static void UpdateLabel(Label label, string value)
        {
            if (label != null) label.Text = value;
        }

        private enum Field
        {
            Input,
            Output
        }
    }
}