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 }