Skip to main content

action

Function action 

Source
pub fn action<'a, Message, Renderer>(
    button: Button<'a, Message, Renderer>,
    on_press: Message,
) -> Element<'a, Message, Theme, Renderer>
where Message: Clone + 'a, Renderer: Renderer + Renderer + 'a,
Examples found in repository?
examples/showcase/pages/feedback.rs (lines 54-57)
51fn snackbars() -> material::Element<'static, Message> {
52    use material::widget::button::{self, ButtonVariant};
53
54    page::row([button::action(
55        button::button("Show snackbar", ButtonVariant::Filled),
56        Message::ShowSnackbar,
57    )])
58    .into()
59}
60
61fn dialogs() -> material::Element<'static, Message> {
62    use material::widget::button::{self, ButtonVariant};
63
64    page::row([button::action(
65        button::button("Open sign-in dialog", ButtonVariant::Filled),
66        Message::DialogOpened,
67    )])
68    .into()
69}
More examples
Hide additional examples
examples/showcase/pages/controls.rs (lines 22-25)
18fn counter_controls(state: &Showcase) -> material::Element<'_, Message> {
19    use material::widget::button::{self, ButtonVariant};
20
21    page::row([
22        button::action(
23            button::button("Minus", ButtonVariant::Outlined),
24            Message::Decrement,
25        ),
26        material::text::headline_medium(state.count.to_string()).into(),
27        button::action(
28            button::button("Plus", ButtonVariant::Filled),
29            Message::Increment,
30        ),
31    ])
32    .into()
33}
examples/showcase/pages/structure.rs (lines 88-91)
78fn bottom_app_bar() -> material::Element<'static, Message> {
79    use material::widget::app_bar;
80    use material::widget::button::{self, FabSize, FabVariant};
81
82    app_bar::bottom(
83        app_bar::icon_actions([
84            ("menu", Message::MenuPressed),
85            ("search", Message::Increment),
86            ("info", Message::Increment),
87        ]),
88        Some(button::action(
89            button::fab("add", FabVariant::Primary, FabSize::Standard),
90            Message::Increment,
91        )),
92    )
93    .into()
94}
95
96fn toolbars() -> material::Element<'static, Message> {
97    use material::widget::button::{self, FabSize, FabVariant};
98    use material::widget::toolbar;
99
100    let docked = toolbar::docked(toolbar::icon_actions([
101        ("arrow_back", Message::Decrement),
102        ("arrow_forward", Message::Increment),
103        ("add", Message::Increment),
104        ("tab", Message::Increment),
105        ("star", Message::Increment),
106        ("search", Message::Increment),
107    ]));
108
109    let docked_vibrant = toolbar::docked_vibrant([
110        toolbar::vibrant_icon_action("edit", Message::Increment),
111        toolbar::selected_vibrant_icon_action("check", Message::Increment),
112        toolbar::vibrant_icon_action("delete", Message::Decrement),
113        toolbar::vibrant_icon_action("more_vert", Message::MenuPressed),
114    ]);
115
116    let floating = toolbar::floating([
117        toolbar::selected_icon_action("format_bold", Message::Increment),
118        toolbar::icon_action("format_italic", Message::Increment),
119        toolbar::icon_action("format_underlined", Message::Increment),
120        toolbar::icon_action("format_color_text", Message::Increment),
121    ]);
122
123    let floating_vibrant = toolbar::floating_with_fab(
124        toolbar::floating_vibrant(toolbar::vibrant_icon_actions([
125            ("share", Message::Increment),
126            ("add", Message::Increment),
127            ("edit", Message::Increment),
128        ])),
129        button::fab("search", FabVariant::Primary, FabSize::Standard).on_press(Message::Increment),
130    );
131
132    let vertical = toolbar::vertical_floating([
133        toolbar::icon_action("undo", Message::Decrement),
134        toolbar::icon_action("redo", Message::Increment),
135        toolbar::selected_icon_action("palette", Message::Increment),
136    ]);
137
138    page::component_stack([
139        docked.into(),
140        docked_vibrant.into(),
141        page::row([floating.into(), vertical.into()]).into(),
142        floating_vibrant.into(),
143    ])
144    .into()
145}
146
147fn bottom_sheets(state: &Showcase) -> material::Element<'static, Message> {
148    let width = page::preview_width(state.window_size.width);
149    let standard = material::widget::sheet::standard_bottom(sheet_content(
150        "Standard bottom sheet",
151        "Coexists with the page and keeps secondary content available.",
152    ));
153
154    let modal_preview = page::preview_pane(material::widget::sheet::modal_overlay(sheet_content(
155        "Modal bottom sheet",
156        "Uses a scrim and blocks interaction behind the sheet.",
157    )));
158
159    page::component_stack([
160        page::centered_preview(width, standard).into(),
161        page::centered_preview(width, modal_preview).into(),
162    ])
163    .into()
164}
165
166fn side_sheets(state: &Showcase) -> material::Element<'static, Message> {
167    let width = page::preview_width(state.window_size.width);
168    let standard = page::preview_pane(
169        Row::new()
170            .push(side_sheet_preview_content())
171            .push(material::widget::sheet::standard_side(side_sheet_content(
172                "Standard side sheet",
173                "Coexists with the page while supporting content remains visible.",
174            )))
175            .width(Length::Fill)
176            .height(Length::Fill),
177    );
178
179    let modal = page::preview_pane(
180        Stack::with_children([
181            side_sheet_preview_content(),
182            material::widget::sheet::modal_side_overlay(
183                material::widget::sheet::Side::Right,
184                side_sheet_content(
185                    "Modal side sheet",
186                    "Uses a scrim and keeps focus on a temporary side task.",
187                ),
188            )
189            .into(),
190        ])
191        .width(Length::Fill)
192        .height(Length::Fill),
193    );
194
195    page::component_stack([
196        page::centered_preview(width, standard).into(),
197        page::centered_preview(width, modal).into(),
198    ])
199    .into()
200}
201
202fn side_sheet_preview_content() -> material::Element<'static, Message> {
203    let supporting_items = material::widget::list::group([
204        material::widget::list::one_line_icon("description", "Project brief").into(),
205        material::widget::list::one_line_icon("schedule", "Recent activity").into(),
206    ]);
207
208    material::widget::container::surface_container_highest(
209        Column::new()
210            .push(material::text::title_medium("Supporting page"))
211            .push(material::text::body_medium(
212                "Primary content remains visible beside the standard sheet.",
213            ))
214            .push(Space::new().height(Length::Fixed(page::STACK_SPACING)))
215            .push(supporting_items)
216            .spacing(page::COMPACT_STACK_SPACING),
217    )
218    .width(Length::Fill)
219    .height(Length::Fill)
220    .padding(page::CARD_PADDING)
221    .into()
222}
223
224fn sheet_content(
225    title: &'static str,
226    supporting: &'static str,
227) -> material::Element<'static, Message> {
228    use material::widget::button::{self, ButtonVariant};
229
230    material::widget::sheet::bottom_content(page::compact_stack([
231        material::text::title_medium(title).into(),
232        material::text::body_medium(supporting).into(),
233        page::row([
234            button::action(
235                button::button("Dismiss", ButtonVariant::Text),
236                Message::Decrement,
237            ),
238            button::action(
239                button::button("Apply", ButtonVariant::Filled),
240                Message::Increment,
241            ),
242        ])
243        .into(),
244    ]))
245    .into()
246}
247
248fn side_sheet_content(
249    title: &'static str,
250    supporting: &'static str,
251) -> material::Element<'static, Message> {
252    use material::widget::button::{self, ButtonVariant, IconButtonVariant};
253
254    let header = Row::new()
255        .push(material::text::title_medium(title).width(Length::Fill))
256        .push(button::action(
257            button::icon_button("close", IconButtonVariant::Standard),
258            Message::Decrement,
259        ))
260        .align_y(alignment::Vertical::Center);
261    let actions = Row::new()
262        .push(Space::new().width(Length::Fill))
263        .push(button::action(
264            button::button("Apply", ButtonVariant::Filled),
265            Message::Increment,
266        ))
267        .spacing(page::ROW_SPACING)
268        .align_y(alignment::Vertical::Center);
269
270    material::widget::sheet::side_content(
271        Column::new()
272            .push(header)
273            .push(material::text::body_medium(supporting))
274            .push(Space::new().height(Length::Fill))
275            .push(actions)
276            .spacing(page::COMPACT_STACK_SPACING)
277            .height(Length::Fill),
278    )
279    .into()
280}