1 module re.input.virtual.button;
2 
3 import re.input;
4 import std.algorithm;
5 
6 /// a virtual button
7 class VirtualButton : VirtualInput {
8     /// monitors a single button
9     static abstract class Node : VirtualInput.Node {
10         @property public bool is_down();
11         @property public bool is_up();
12         @property public bool is_pressed();
13         @property public bool is_released();
14     }
15 
16     /// logic-controllable button
17     static class LogicButton : Node {
18         public bool logic_pressed = false;
19         
20         @property public override bool is_down() { return logic_pressed; }
21         @property public override bool is_up() { return !logic_pressed; }
22         @property public override bool is_pressed() { return logic_pressed; }
23         @property public override bool is_released() { return !logic_pressed; }
24     }
25 
26     /// monitors a keyboard key
27     static class KeyboardKey : Node {
28         /// the key being monitored
29         public Keys key;
30 
31         /// creates a keyboard key node
32         this(Keys key) {
33             this.key = key;
34         }
35 
36         @property public override bool is_down() {
37             return Input.is_key_down(key);
38         }
39 
40         @property public override bool is_up() {
41             return Input.is_key_up(key);
42         }
43 
44         @property public override bool is_pressed() {
45             return Input.is_key_pressed(key);
46         }
47 
48         @property public override bool is_released() {
49             return Input.is_key_released(key);
50         }
51     }
52 
53     @property public bool is_down() {
54         return nodes.any!(x => (cast(Node) x).is_down);
55     }
56 
57     @property public bool is_up() {
58         return nodes.any!(x => (cast(Node) x).is_up);
59     }
60 
61     @property public bool is_pressed() {
62         return nodes.any!(x => (cast(Node) x).is_pressed);
63     }
64 
65     @property public bool is_released() {
66         return nodes.any!(x => (cast(Node) x).is_released);
67     }
68 }
69 
70 @("input-button")
71 unittest {
72     auto the_button = new VirtualButton();
73     the_button.nodes ~= new VirtualButton.KeyboardKey(Keys.KEY_E);
74 
75     assert(the_button.nodes.length > 0);
76 }