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
//! Hash-map of type erased values, useful for storing assorted dynamic state.
//!
//! A new map can be instantiated using [`OwnedStateMap`], but in a typical app you use maps provided by
//! the API. The most common widget maps are [`WIDGET.with_state_mut`] that is associated
//! with the widget instance and [`WidgetInfoBuilder::with_meta`] that is associated with the widget info.
//!
//! ```
//! # fn main() { }
//! use zng::{prelude::*, prelude_wgt::*};
//!
//! static_id! {
//! static ref STATE_ID: StateId<bool>;
//! }
//!
//! /// Extends [`WidgetInfo`] with state.
//! pub trait StateWidgetInfoExt {
//! /// Gets the state.
//! fn state(&self) -> Option<bool>;
//! }
//! impl StateWidgetInfoExt for WidgetInfo {
//! fn state(&self) -> Option<bool> {
//! self.meta().get_clone(*STATE_ID)
//! }
//! }
//!
//! /// State the state info.
//! #[property(CONTEXT)]
//! pub fn state(child: impl UiNode, state: impl IntoVar<bool>) -> impl UiNode {
//! let state = state.into_var();
//! match_node(child, move |_, op| match op {
//! UiNodeOp::Init => {
//! WIDGET.sub_var_info(&state);
//! }
//! UiNodeOp::Info { info } => {
//! info.set_meta(*STATE_ID, state.get());
//! }
//! _ => {}
//! })
//! }
//! ```
//!
//! # Full API
//!
//! See [`zng_state_map`] for the full API.
//!
//! [`WIDGET.with_state_mut`]: crate::widget::WIDGET::with_state_mut
//! [`WidgetInfoBuilder::with_meta`]: crate::widget::info::WidgetInfoBuilder::with_meta
pub use zng_state_map::{
state_map::{OccupiedStateMapEntry, StateMapEntry, VacantStateMapEntry},
OwnedStateMap, StateId, StateMapMut, StateMapRef, StateValue,
};