aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx/Ui/Applet/SwkbdAppletDialog.cs
blob: 7c14f0e8d28f1b53ff0a7f86416c66ce6fea8e6d (plain) (blame)
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
using Gtk;
using System;

namespace Ryujinx.Ui.Applet
{
    public class SwkbdAppletDialog : MessageDialog
    {
        private int _inputMin;
        private int _inputMax;

        private Predicate<int> _checkLength;

        private readonly Label _validationInfo;

        public Entry  InputEntry   { get; }
        public Button OkButton     { get; }
        public Button CancelButton { get; }

        public SwkbdAppletDialog(Window parent) : base(parent, DialogFlags.Modal | DialogFlags.DestroyWithParent, MessageType.Question, ButtonsType.None, null)
        {
            SetDefaultSize(300, 0);

            _validationInfo = new Label()
            {
                Visible = false
            };

            InputEntry = new Entry()
            {
                Visible = true
            };

            InputEntry.Activated += OnInputActivated;
            InputEntry.Changed   += OnInputChanged;

            OkButton     = (Button)AddButton("OK",     ResponseType.Ok);
            CancelButton = (Button)AddButton("Cancel", ResponseType.Cancel);

            ((Box)MessageArea).PackEnd(_validationInfo, true, true, 0);
            ((Box)MessageArea).PackEnd(InputEntry,      true, true, 4);

            SetInputLengthValidation(0, int.MaxValue); // Disable by default.
        }

        public void SetInputLengthValidation(int min, int max)
        {
            _inputMin = Math.Min(min, max);
            _inputMax = Math.Max(min, max);

            _validationInfo.Visible = false;

            if (_inputMin <= 0 && _inputMax == int.MaxValue) // Disable.
            {
                _validationInfo.Visible = false;

                _checkLength = (length) => true;
            }
            else if (_inputMin > 0 && _inputMax == int.MaxValue)
            {
                _validationInfo.Visible = true;
                _validationInfo.Markup  = $"<i>Must be at least {_inputMin} characters long</i>";

                _checkLength = (length) => _inputMin <= length;
            }
            else
            {
                _validationInfo.Visible = true;
                _validationInfo.Markup  = $"<i>Must be {_inputMin}-{_inputMax} characters long</i>";

                _checkLength = (length) => _inputMin <= length && length <= _inputMax;
            }

            OnInputChanged(this, EventArgs.Empty);
        }

        private void OnInputActivated(object sender, EventArgs e)
        {
            if (OkButton.IsSensitive)
            {
                Respond(ResponseType.Ok);
            }
        }

        private void OnInputChanged(object sender, EventArgs e)
        {
            OkButton.Sensitive = _checkLength(InputEntry.Text.Length);
        }
    }
}