1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//! Data view widgets and nodes.
//!
//! The [`DataView!`](struct@DataView) widget can be used to dynamically presents data from a variable, unlike
//! the [`widget::node::presenter`](crate::widget::node::presenter) node the generated UI can be retained
//! across updates of the data variable.
//!
//! The example below declares a `DataView!` using the shorthand syntax:
//!
//! ```
//! use zng::prelude::*;
//!
//! fn countdown(n: impl IntoVar<usize>) -> impl UiNode {
//!     DataView!(::<usize>, n, hn!(|a: &DataViewArgs<usize>| {
//!         // we generate a new view on the first call or when the data has changed to zero.
//!         if a.view_is_nil() || a.data().get_new() == Some(0) {
//!             a.set_view(if a.data().get() > 0 {
//!                 // countdown view
//!                 Text! {
//!                     font_size = 28;
//!                     // bind data, same view will be used for all n > 0 values.
//!                     txt = a.data().map_to_txt();
//!                 }
//!             } else {
//!                 // finished view
//!                 Text! {
//!                     font_color = rgb(0, 128, 0);
//!                     font_size = 18;
//!                     txt = "Congratulations!";
//!                 }
//!             });
//!         }
//!     }))
//! }
//! ```
//!
//! You can also use the normal widget syntax and set the `view` property.
//!
//! ```
//! # use zng::prelude::*;
//! # let _scope = APP.defaults(); let n = var(0usize); let _ =
//! DataView! {
//!     view::<usize> = {
//!         data: n,
//!         update: hn!(|a: &DataViewArgs<usize>| { }),
//!     };
//! }
//! # ;
//! ```
//!
//! # Full API
//!
//! See [`zng_wgt_data_view`] for the full view API.

pub use zng_wgt_data_view::{DataView, DataViewArgs};