1 module d2d.toolkit.input.mouse;
2 
3 import d2d.window.windowevent;
4 
5 struct Mouse
6 {
7 	@disable this(this);
8 
9 	int x, y;
10 	int dx, dy;
11 	int wheelX, wheelY;
12 	int wheelDX, wheelDY;
13 
14 	bool[32] buttons;
15 
16 	static Mouse instance;
17 
18 	Mouse dup()
19 	{
20 		return Mouse(x, y, dx, dy, wheelX, wheelY, wheelDX, wheelDY, buttons);
21 	}
22 
23 	void move(int x, int y, int dx, int dy)
24 	{
25 		this.x = x;
26 		this.y = y;
27 		this.dx = dx;
28 		this.dy = dy;
29 	}
30 
31 	void moveTo(int x, int y)
32 	{
33 		move(x, y, x - this.x, y - this.y);
34 	}
35 
36 	void scroll(int dx, int dy)
37 	{
38 		wheelX += dx;
39 		wheelY += dy;
40 		wheelDX = dx;
41 		wheelDY = dy;
42 	}
43 
44 	void click(int button, bool down)
45 	{
46 		buttons[button] = down;
47 	}
48 
49 	void handle(Event event)
50 	{
51 		switch (event.type)
52 		{
53 		case Event.Type.MouseWheelMoved:
54 			scroll(event.x, event.y);
55 			break;
56 		case Event.Type.MouseMoved:
57 			move(event.x, event.y, event.xrel, event.yrel);
58 			break;
59 		case Event.Type.MouseButtonPressed:
60 			if (event.x != x || event.y != y)
61 				moveTo(event.x, event.y);
62 			click(event.mousebutton, true);
63 			break;
64 		case Event.Type.MouseButtonReleased:
65 			if (event.x != x || event.y != y)
66 				moveTo(event.x, event.y);
67 			click(event.mousebutton, false);
68 			break;
69 		default:
70 			break;
71 		}
72 	}
73 }