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.wrapper; 8 import w4d.layout.lineup, 9 w4d.widget.base, 10 w4d.exception; 11 import std.conv; 12 13 /// A widget that wraps other wraps. 14 class WrapperWidget : Widget 15 { 16 protected Widget _child; 17 18 /// 19 override @property Widget[] children () 20 { 21 return _child? [_child]: []; 22 } 23 /// Child widget that is wrapped. 24 @property T child (T = Widget) () 25 { 26 return _child.to!T; 27 } 28 29 /// 30 this () 31 { 32 super(); 33 setLayout!VerticalLineupLayout; 34 35 _child = null; 36 } 37 38 /// Changes the child widget. 39 Widget setChild ( Widget child ) 40 { 41 enforce( child, "Null is not a valid child." ); 42 _child = child; 43 requestLayout(); 44 return child; 45 } 46 /// Removes the child widget. 47 void removeChild () 48 { 49 _context.forget( _child ); 50 _child = null; 51 requestLayout(); 52 } 53 54 protected static template DisableModifyChild () 55 { 56 import w4d.widget.base, 57 w4d.exception; 58 59 enum DisableModifyChild_ErrorMes = "Modifying a child is not allowed."; 60 61 override Widget setChild ( Widget child ) 62 { 63 throw new W4dException( DisableModifyChild_ErrorMes ); 64 } 65 override void removeChild () 66 { 67 throw new W4dException( DisableModifyChild_ErrorMes ); 68 } 69 } 70 71 /// 72 override @property bool trackable () { return false; } 73 /// 74 override @property bool focusable () { return false; } 75 }