1 /// This module contains interfaces for handling mouse actions.
2 module fluid.io.mouse;
3 
4 import fluid.future.context;
5 
6 import fluid.io.action;
7 
8 @safe:
9 
10 /// I/O interface for emitting mouse events.
11 ///
12 /// While a mouse button is held down, it will emit inactive input events. The moment a mouse button is released,
13 /// it will emit an active event. This is unlike keyboard events in the sense that a mouse button will emit an event
14 /// one frame after it is no longer held.
15 ///
16 /// A `MouseIO` system will usually pass events to a `HoverIO` system it is child of.
17 interface MouseIO : IO {
18 
19     mixin inputEvents!(MouseIO, Button);
20 
21     ///
22     @("MouseIO.codes resolves into input event codes")
23     unittest {
24 
25         assert(MouseIO.codes.left == MouseIO.getCode(MouseIO.Button.left));
26         assert(MouseIO.codes.right == MouseIO.getCode(MouseIO.Button.right));
27 
28     }
29 
30     alias press = click;
31     alias release = click;
32 
33     ///
34     @("MouseIO.hold resolves into input events")
35     unittest {
36 
37         assert(MouseIO.hold.left == MouseIO.createEvent(MouseIO.Button.left, false));
38         assert(MouseIO.release.left == MouseIO.createEvent(MouseIO.Button.left, true));
39 
40         assert(MouseIO.hold.right == MouseIO.createEvent(MouseIO.Button.right, false));
41         assert(MouseIO.release.right == MouseIO.createEvent(MouseIO.Button.right, true));
42 
43     }
44 
45     enum Button {
46         none,
47         left,         // Left (primary) mouse button.
48         right,        // Right (secondary) mouse button.
49         middle,       // Middle mouse button.
50         extra1,       // Additional mouse button.
51         extra2,       // ditto
52         forward,      // Mouse button going forward in browser history.
53         back,         // Mouse button going back in browser history.
54 
55         primary = left,
56         secondary = right,
57 
58     }
59 
60 }