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 }