1 ///
2 module fluid.hover_button;
3 
4 import fluid.node;
5 import fluid.frame;
6 import fluid.input;
7 import fluid.label;
8 import fluid.style;
9 import fluid.utils;
10 import fluid.button;
11 
12 @safe:
13 deprecated("`fluid.hover_button` is deprecated, because it is legacy code and has no known usecase. "
14     ~ "Please create your own `Button` node subclass and override `mouseImpl`. "
15     ~ "`hover_button` will be removed in Fluid 0.9.0."):
16 
17 
18 alias hoverButton = simpleConstructor!HoverButton;
19 alias frameHoverButton = simpleConstructor!FrameHoverButton;
20 
21 alias HoverButton = HoverButtonImpl!Label;
22 alias FrameHoverButton = HoverButtonImpl!Frame;
23 
24 /// An button that triggers every frame as long as the button is hovered. Useful for advanced buttons which react to
25 /// more than just left button click.
26 ///
27 /// Note, this is a somewhat low-level node and the hover event, as stated, triggers every frame. There are no hover
28 /// entry nor hover leave events. Make sure you know what you're doing when using this node!
29 class HoverButtonImpl(T : Node = Label) : ButtonImpl!T {
30 
31     mixin enableInputActions;
32 
33     /// Create a new hover button.
34     /// Params:
35     ///     pressed = Action to perform when the button is hovered.
36     this(T...)(T sup) {
37 
38         super(sup);
39 
40     }
41 
42     // Disable action on `press`.
43     protected override void press() {
44 
45     }
46 
47     /// Check events
48     protected override void mouseImpl() {
49 
50         // Simple enough
51         submitted();
52 
53     }
54 
55     protected override bool keyboardImpl() {
56 
57         return false;
58 
59     }
60 
61 }
62 
63 @("Legacy: HoverButton works (abandoned)")
64 unittest {
65 
66     import fluid.backend;
67 
68     int hoverFrameCount;
69 
70     auto io = new HeadlessBackend;
71     auto root = hoverButton(.nullTheme, "Hello, World!", delegate { hoverFrameCount += 1; });
72 
73     root.io = io;
74 
75     // Move the mouse away from the button
76     io.mousePosition = io.windowSize;
77     root.draw();
78 
79     assert(hoverFrameCount == 0);
80 
81     // Hover the button now
82     io.nextFrame;
83     io.mousePosition = Vector2(0, 0);
84     root.draw();
85 
86     assert(hoverFrameCount == 1);
87 
88     // Press the button
89     io.nextFrame;
90     io.press(MouseButton.left);
91     root.draw();
92 
93     assert(io.isDown(MouseButton.left));
94     assert(hoverFrameCount == 2);
95 
96     // Wait while the button is pressed
97     io.nextFrame;
98     root.draw();
99 
100     assert(io.isDown(MouseButton.left));
101     assert(hoverFrameCount == 3);
102 
103     // Release the button
104     io.nextFrame;
105     io.release(MouseButton.left);
106     root.draw();
107 
108     assert(io.isUp(MouseButton.left));
109     assert(hoverFrameCount == 4);
110 
111     // Move the mouse elsewhere
112     io.nextFrame;
113     io.mousePosition = Vector2(-1, -1);
114     root.draw();
115 
116     assert(hoverFrameCount == 4);
117 
118     // Press the button outside
119     io.nextFrame;
120     io.press(MouseButton.left);
121     root.draw();
122 
123     assert(hoverFrameCount == 4);
124 
125 
126 }