zng_wgt_access/
events.rs

1use zng_app::access::*;
2use zng_view_api::access::AccessCmdName;
3use zng_wgt::prelude::*;
4
5event_property! {
6    /// Access requested a click.
7    ///
8    /// Note that the normal click event is already triggered by this event.
9    pub fn on_access_click<on_pre_access_click>(child: impl IntoUiNode, handler: Handler<AccessClickArgs>) -> UiNode {
10        const PRE: bool;
11        let child = EventNodeBuilder::new(ACCESS_CLICK_EVENT).build::<PRE>(child, handler);
12        access_capable(child, AccessCmdName::Click)
13    }
14
15    /// Access requested to expand or collapse the widget content.
16    pub fn on_access_expander<on_pre_access_expander>(child: impl IntoUiNode, handler: Handler<AccessExpanderArgs>) -> UiNode {
17        const PRE: bool;
18        let child = EventNodeBuilder::new(ACCESS_EXPANDER_EVENT).build::<PRE>(child, handler);
19        access_capable(child, AccessCmdName::SetExpanded)
20    }
21
22    /// Access requested to increment or decrement the widget value by steps.
23    pub fn on_access_increment<on_pre_access_increment>(child: impl IntoUiNode, handler: Handler<AccessIncrementArgs>) -> UiNode {
24        const PRE: bool;
25        let child = EventNodeBuilder::new(ACCESS_INCREMENT_EVENT).build::<PRE>(child, handler);
26        access_capable(child, AccessCmdName::Increment)
27    }
28
29    /// Access requested to show or hide the widget's tooltip.
30    ///
31    /// Note that the tooltip property already handles this event.
32    pub fn on_access_tooltip<on_pre_access_tooltip>(child: impl IntoUiNode, handler: Handler<AccessToolTipArgs>) -> UiNode {
33        const PRE: bool;
34        let child = EventNodeBuilder::new(ACCESS_TOOLTIP_EVENT).build::<PRE>(child, handler);
35        access_capable(child, AccessCmdName::SetToolTipVis)
36    }
37
38    /// Access requested a scroll command.
39    ///
40    /// Note that the scroll widget already handles this event.
41    pub fn on_access_scroll<on_pre_access_scroll>(child: impl IntoUiNode, handler: Handler<AccessScrollArgs>) -> UiNode {
42        const PRE: bool;
43        let child = EventNodeBuilder::new(ACCESS_SCROLL_EVENT).build::<PRE>(child, handler);
44        access_capable(child, AccessCmdName::Scroll)
45    }
46
47    /// Access requested a text input/replace.
48    ///
49    /// Note that the text widget already handles this event.
50    pub fn on_access_text<on_pre_access_text>(child: impl IntoUiNode, handler: Handler<AccessTextArgs>) -> UiNode {
51        const PRE: bool;
52        let child = EventNodeBuilder::new(ACCESS_TEXT_EVENT).build::<PRE>(child, handler);
53        match_node(child, move |_, op| {
54            if let UiNodeOp::Info { info } = op
55                && let Some(mut access) = info.access()
56            {
57                access.push_command(AccessCmdName::SetString);
58                access.push_command(AccessCmdName::ReplaceSelectedText);
59            }
60        })
61    }
62
63    /// Access requested a number input.
64    pub fn on_access_number<on_pre_access_number>(child: impl IntoUiNode, handler: Handler<AccessNumberArgs>) -> UiNode {
65        const PRE: bool;
66        let child = EventNodeBuilder::new(ACCESS_NUMBER_EVENT).build::<PRE>(child, handler);
67        access_capable(child, AccessCmdName::SetNumber)
68    }
69
70    /// Access requested a text selection.
71    ///
72    /// Note that the text widget already handles this event.
73    pub fn on_access_selection<on_pre_access_selection>(child: impl IntoUiNode, handler: Handler<AccessSelectionArgs>) -> UiNode {
74        const PRE: bool;
75        let child = EventNodeBuilder::new(ACCESS_SELECTION_EVENT).build::<PRE>(child, handler);
76        access_capable(child, AccessCmdName::SelectText)
77    }
78}
79
80fn access_capable(child: impl IntoUiNode, cmd: AccessCmdName) -> UiNode {
81    match_node(child, move |_, op| {
82        if let UiNodeOp::Info { info } = op
83            && let Some(mut access) = info.access()
84        {
85            access.push_command(cmd)
86        }
87    })
88}