cosmic/widget/
nav_bar_toggle.rs

1// Copyright 2022 System76 <info@system76.com>
2// SPDX-License-Identifier: MPL-2.0
3
4//! A button for toggling the navigation side panel.
5
6use crate::{Element, widget};
7use derive_setters::Setters;
8
9#[derive(Setters)]
10pub struct NavBarToggle<Message> {
11    active: bool,
12    #[setters(strip_option)]
13    on_toggle: Option<Message>,
14    class: crate::theme::Button,
15    selected: bool,
16}
17
18#[must_use]
19pub const fn nav_bar_toggle<Message>() -> NavBarToggle<Message> {
20    NavBarToggle {
21        active: false,
22        on_toggle: None,
23        class: crate::theme::Button::NavToggle,
24        selected: false,
25    }
26}
27
28impl<Message: 'static + Clone> From<NavBarToggle<Message>> for Element<'_, Message> {
29    fn from(nav_bar_toggle: NavBarToggle<Message>) -> Self {
30        let icon = if nav_bar_toggle.active {
31            widget::icon::from_svg_bytes(
32                &include_bytes!("../../res/icons/navbar-open-symbolic.svg")[..],
33            )
34            .symbolic(true)
35        } else {
36            widget::icon::from_svg_bytes(
37                &include_bytes!("../../res/icons/navbar-closed-symbolic.svg")[..],
38            )
39            .symbolic(true)
40        };
41
42        widget::button::icon(icon)
43            .padding([8, 16])
44            .on_press_maybe(nav_bar_toggle.on_toggle)
45            .selected(nav_bar_toggle.selected)
46            .class(nav_bar_toggle.class)
47            .into()
48    }
49}