1 // Written in the D programming language. 2 /++ 3 + Authors: KanzakiKino 4 + Copyright: KanzakiKino 2018 5 + License: LGPL-3.0 6 ++/ 7 module w4d.widget.base.context; 8 9 /// A template that declares WindowContext. 10 template Context () 11 { 12 enum Modkey 13 { 14 None = 0b00, 15 16 Ctrl = 0b01, 17 Shift = 0b10, 18 } 19 20 class WindowContext 21 { 22 this () 23 { 24 _tracked = null; 25 _focused = null; 26 _popup = null; 27 } 28 29 protected bool _needRedraw; 30 const @property needRedraw () { return _needRedraw; } 31 32 void requestRedraw () 33 { 34 _needRedraw = true; 35 } 36 void setNoNeedRedraw () 37 { 38 _needRedraw = false; 39 } 40 41 42 protected uint _modkey; 43 44 const @property ctrl () 45 { 46 return !!( _modkey & Modkey.Ctrl ); 47 } 48 const @property shift () 49 { 50 return !!( _modkey & Modkey.Shift ); 51 } 52 53 void setModkeyStatus ( Modkey key, bool press ) 54 { 55 if ( press ) { 56 _modkey |= key; 57 } else { 58 _modkey &= ~key; 59 } 60 } 61 62 63 protected Widget _tracked; 64 65 inout @property tracked () 66 { 67 return _popup? _popup: _tracked; 68 } 69 void setTracked ( Widget w ) 70 { 71 auto temp = _tracked; 72 _tracked = w; 73 74 if ( w !is temp ) { 75 if ( temp ) temp.handleTracked( false ); 76 if ( w ) w .handleTracked( true ); 77 } 78 } 79 80 81 protected Widget _focused; 82 83 inout @property focused () 84 { 85 return _popup? _popup: _focused; 86 } 87 void setFocused ( Widget w ) 88 { 89 auto temp = _focused; 90 _focused = w; 91 92 if ( w !is temp ) { 93 if ( temp ) temp.handleFocused( false ); 94 if ( w ) w .handleFocused( true ); 95 } 96 } 97 98 99 protected Widget _popup; 100 101 inout @property popup () { return _popup; } 102 103 void setPopup ( Widget w ) 104 { 105 auto temp = _popup; 106 _popup = w; 107 108 if ( w !is temp ) { 109 if ( temp ) temp.handlePopup( false, this ); 110 if ( w ) w .handlePopup( true , this ); 111 } 112 } 113 114 115 void forget ( in Widget w ) 116 { 117 if ( tracked is w ) { 118 setTracked( null ); 119 } 120 if ( focused is w ) { 121 setFocused( null ); 122 } 123 if ( popup is w ) { 124 setPopup( null ); 125 } 126 } 127 } 128 }