15
15
//! A widget that just adds padding during layout.
16
16
17
17
use crate :: widget:: { prelude:: * , WidgetWrapper } ;
18
- use crate :: { Data , Insets , Point , WidgetPod } ;
18
+ use crate :: { Data , Insets , KeyOrValue , Point , WidgetPod } ;
19
19
20
20
use tracing:: { instrument, trace} ;
21
21
22
22
/// A widget that just adds padding around its child.
23
23
pub struct Padding < T , W > {
24
- left : f64 ,
25
- right : f64 ,
26
- top : f64 ,
27
- bottom : f64 ,
28
-
24
+ insets : KeyOrValue < Insets > ,
29
25
child : WidgetPod < T , W > ,
30
26
}
31
27
32
28
impl < T , W : Widget < T > > Padding < T , W > {
33
29
/// Create a new widget with the specified padding. This can either be an instance
34
- /// of [`kurbo::Insets`], a f64 for uniform padding, a 2-tuple for axis-uniform padding
35
- /// or 4-tuple with (left, top, right, bottom) values.
30
+ /// of [`Insets`], a [`Key`] referring to [`Insets`] in the [`Env`],
31
+ /// an `f64` for uniform padding, a `(f64, f64)` for axis-uniform padding,
32
+ /// or `(f64, f64, f64, f64)` (left, top, right, bottom) values.
36
33
///
37
34
/// # Examples
38
35
///
@@ -58,14 +55,10 @@ impl<T, W: Widget<T>> Padding<T, W> {
58
55
/// let _: Padding<(), _> = Padding::new(Insets::uniform_xy(10.0, 20.0), Label::new("ditto :)"));
59
56
/// ```
60
57
///
61
- /// [`kurbo::Insets`]: https://docs.rs/kurbo/0.5.3/kurbo/struct.Insets.html
62
- pub fn new ( insets : impl Into < Insets > , child : W ) -> Padding < T , W > {
63
- let insets = insets. into ( ) ;
58
+ /// [`Key`]: crate::Key
59
+ pub fn new ( insets : impl Into < KeyOrValue < Insets > > , child : W ) -> Padding < T , W > {
64
60
Padding {
65
- left : insets. x0 ,
66
- right : insets. x1 ,
67
- top : insets. y0 ,
68
- bottom : insets. y1 ,
61
+ insets : insets. into ( ) ,
69
62
child : WidgetPod :: new ( child) ,
70
63
}
71
64
}
@@ -86,25 +79,25 @@ impl<T: Data, W: Widget<T>> Widget<T> for Padding<T, W> {
86
79
self . child . lifecycle ( ctx, event, data, env)
87
80
}
88
81
89
- #[ instrument(
90
- name = "Padding" ,
91
- level = "trace" ,
92
- skip( self , ctx, _old_data, data, env)
93
- ) ]
94
- fn update ( & mut self , ctx : & mut UpdateCtx , _old_data : & T , data : & T , env : & Env ) {
82
+ #[ instrument( name = "Padding" , level = "trace" , skip( self , ctx, _old, data, env) ) ]
83
+ fn update ( & mut self , ctx : & mut UpdateCtx , _old : & T , data : & T , env : & Env ) {
84
+ if ctx. env_key_changed ( & self . insets ) {
85
+ ctx. request_layout ( ) ;
86
+ }
95
87
self . child . update ( ctx, data, env) ;
96
88
}
97
89
98
90
#[ instrument( name = "Padding" , level = "trace" , skip( self , ctx, bc, data, env) ) ]
99
91
fn layout ( & mut self , ctx : & mut LayoutCtx , bc : & BoxConstraints , data : & T , env : & Env ) -> Size {
100
92
bc. debug_check ( "Padding" ) ;
93
+ let insets = self . insets . resolve ( env) ;
101
94
102
- let hpad = self . left + self . right ;
103
- let vpad = self . top + self . bottom ;
95
+ let hpad = insets . x0 + insets . x1 ;
96
+ let vpad = insets . y0 + insets . y1 ;
104
97
105
98
let child_bc = bc. shrink ( ( hpad, vpad) ) ;
106
99
let size = self . child . layout ( ctx, & child_bc, data, env) ;
107
- let origin = Point :: new ( self . left , self . top ) ;
100
+ let origin = Point :: new ( insets . x0 , insets . y0 ) ;
108
101
self . child . set_origin ( ctx, data, env, origin) ;
109
102
110
103
let my_size = Size :: new ( size. width + hpad, size. height + vpad) ;
0 commit comments