1 /**
2 Copyright: Copyright (c) 2014 Andrey Penechko.
3 License: a$(WEB boost.org/LICENSE_1_0.txt, Boost License 1.0).
4 Authors: Andrey Penechko.
5 */
6 
7 module anchovy.gui.behaviors.checkbehavior;
8 
9 import anchovy.gui;
10 import anchovy.gui.interfaces.iwidgetbehavior;
11 
12 //version = Check_debug;
13 
14 
15 class CheckBehavior : IWidgetBehavior
16 {
17 	bool isHovered;
18 	bool isPressed;
19 	Widget _widget;
20 
21 public:
22 
23 	override void attachTo(Widget widget)
24 	{
25 		version(Check_debug) writeln("attachTo ", widget["name"], " ", widget["type"], " ", widget["isChecked"]);
26 		_widget = widget;
27 
28 		widget.addEventHandler(&onClick);
29 		widget.addEventHandler(&pointerPressed);
30 		widget.addEventHandler(&pointerReleased);
31 		widget.addEventHandler(&pointerMoved);
32 		widget.addEventHandler(&pointerEntered);
33 		widget.addEventHandler(&pointerLeaved);
34 
35 		isHovered = false;
36 		isPressed = false;
37 
38 		widget.property("isChecked").valueChanged.connect( (FlexibleObject a, Variant b){updateState();} );
39 
40 		updateState();
41 	}
42 
43 	bool onClick(Widget widget, PointerClickEvent event)
44 	{
45 		widget.setProperty!"isChecked"(!widget.getPropertyAs!("isChecked", bool));
46 
47 		version(Check_debug) writeln("onClick");
48 
49 		return true;
50 	}
51 
52 	bool pointerPressed(Widget widget, PointerPressEvent event)
53 	{
54 		if (event.button == PointerButton.PB_LEFT)
55 		{
56 			isPressed = true;
57 		}
58 
59 		updateState();
60 
61 		version(Check_debug) writeln("pointerPressed");
62 
63 		return true;
64 	}
65 	
66 	bool pointerReleased(Widget widget, PointerReleaseEvent event)
67 	{
68 		if (event.button == PointerButton.PB_LEFT)
69 		{
70 			isHovered = true;
71 			isPressed = false;
72 		}
73 
74 		updateState();
75 		version(Check_debug) writeln("pointerReleased");
76 
77 		return true;
78 	}
79 
80 	bool pointerMoved(Widget widget, PointerMoveEvent event)
81 	{
82 		return true;
83 	}
84 
85 	bool pointerEntered(Widget widget, PointerEnterEvent event)
86 	{
87 		if (event.context.pressedWidget is this)
88 		{
89 			isPressed = true;
90 			version(Check_debug) writeln("pressed");
91 		}
92 		else
93 		{
94 			isHovered = true;
95 			version(Check_debug) writeln("pointerEntered hovered");
96 		}
97 
98 		updateState();
99 		return true;
100 	}
101 	
102 	bool pointerLeaved(Widget widget, PointerLeaveEvent event)
103 	{
104 		isHovered = false;
105 
106 		updateState();
107 		version(Check_debug) writeln("pointerLeaved");
108 
109 		return true;
110 	}
111 
112 	// normal_unchecked == normal
113 	static const string[6] stateStrings = ["normal", "normal_checked", "hovered_unchecked",
114 	 "hovered_checked", "pressed_unchecked", "pressed_checked"];
115 	
116 	void updateState()
117 	{
118 		version(Check_debug)  writeln(_widget["name"], " ", _widget["type"]);
119 
120 		uint checked = _widget.getPropertyAs!("isChecked", bool) ? 1 : 0;
121 		uint hovered = isHovered ? 2 : 0;
122 		if (isPressed) hovered = 4;
123 
124 		version(Check_debug) writefln("checked %s hovered %s pressed %s %s", _widget.getPropertyAs!("isChecked", bool)
125 		 , hovered, isPressed, stateStrings[checked | hovered]);
126 
127 		_widget.setProperty!"state"(stateStrings[checked | hovered]);
128 	}
129 }