diff --git a/README.md b/README.md index 1aaa1e5b30..894b550f27 100644 --- a/README.md +++ b/README.md @@ -188,7 +188,8 @@ struct AppState { ### lens The [Lens datatype] gives access to a part of a larger data structure. Like -`Data`, This can be derived. +`Data`, this can be derived. Derived lenses are accessed as associated constants +with the same name as the field. ```rust #[derive(Clone, Data, Lens)] @@ -202,7 +203,7 @@ To use the lens, wrap your widget with `LensWrap` (note the conversion of CamelCase to snake_case): ```rust -LensWrap::new(WidgetThatExpectsf64::new(), app_state::value); +LensWrap::new(WidgetThatExpectsf64::new(), AppState::value); ``` ## Using druid diff --git a/druid-derive/src/lens.rs b/druid-derive/src/lens.rs index bd0feaf46d..fe856bb3e6 100644 --- a/druid-derive/src/lens.rs +++ b/druid-derive/src/lens.rs @@ -48,7 +48,7 @@ fn derive_struct(input: &syn::DeriveInput) -> Result Result for #field_name { fn with V>(&self, data: &#ty, f: F) -> V { @@ -86,13 +79,26 @@ fn derive_struct(input: &syn::DeriveInput) -> Result TokenStream { .into() } +/// Generates lenses to access the fields of a struct +/// +/// An associated constant is defined on the struct for each field, +/// having the same name as the field. #[proc_macro_derive(Lens)] pub fn derive_lens(input: TokenStream) -> TokenStream { let input = parse_macro_input!(input as syn::DeriveInput); diff --git a/druid/examples/calc.rs b/druid/examples/calc.rs index f8eaad4fe4..5207e57816 100644 --- a/druid/examples/calc.rs +++ b/druid/examples/calc.rs @@ -152,7 +152,7 @@ fn build_calc() -> impl Widget { let mut column = Flex::column(); let display = LensWrap::new( DynLabel::new(|data: &String, _env| data.clone()), - calc_state::value, + CalcState::value, ); column.add_child(pad(display), 0.0); column.add_child( diff --git a/druid/examples/either.rs b/druid/examples/either.rs index b8321cb506..66656aac0b 100644 --- a/druid/examples/either.rs +++ b/druid/examples/either.rs @@ -35,12 +35,12 @@ fn ui_builder() -> impl Widget { let mut col = Flex::column(); col.add_child( - Padding::new(5.0, LensWrap::new(Checkbox::new(), app_state::which)), + Padding::new(5.0, LensWrap::new(Checkbox::new(), AppState::which)), 0.0, ); let either = Either::new( |data, _env| data.which, - Padding::new(5.0, LensWrap::new(Slider::new(), app_state::value)), + Padding::new(5.0, LensWrap::new(Slider::new(), AppState::value)), Padding::new(5.0, label), ); col.add_child(either, 0.0); diff --git a/druid/examples/slider.rs b/druid/examples/slider.rs index fd2a756d1f..7a7edb89f0 100644 --- a/druid/examples/slider.rs +++ b/druid/examples/slider.rs @@ -31,13 +31,13 @@ fn build_widget() -> impl Widget { } }); let mut row = Flex::row(); - let checkbox = LensWrap::new(Checkbox::new(), demo_state::double); + let checkbox = LensWrap::new(Checkbox::new(), DemoState::double); let checkbox_label = Label::new("double the value"); row.add_child(checkbox, 0.0); row.add_child(Padding::new(5.0, checkbox_label), 1.0); - let bar = LensWrap::new(ProgressBar::new(), demo_state::value); - let slider = LensWrap::new(Slider::new(), demo_state::value); + let bar = LensWrap::new(ProgressBar::new(), DemoState::value); + let slider = LensWrap::new(Slider::new(), DemoState::value); let button_1 = Button::sized( "increment ", diff --git a/druid/examples/switch.rs b/druid/examples/switch.rs index b4ee759156..fa8dbe6bb8 100644 --- a/druid/examples/switch.rs +++ b/druid/examples/switch.rs @@ -23,7 +23,7 @@ struct DemoState { fn build_widget() -> impl Widget { let mut col = Flex::column(); let mut row = Flex::row(); - let switch = LensWrap::new(Switch::new(), demo_state::value); + let switch = LensWrap::new(Switch::new(), DemoState::value); let switch_label = Label::new("Setting label"); row.add_child(Padding::new(5.0, switch_label), 0.0);