iced-widget-kit 0.1.0

Extra widgets for the Iced GUI library
Documentation
use iced::{
    Border, Color, Element, Shadow, Theme, color,
    widget::{column, container::Style, row, space},
};

use iced_widget::{Button, Container, button, center, text};
use iced_widget_kit::ribbon::Ribbon;
use iced_widget_kit::ribbon::group;

fn main() -> iced::Result {
    iced::run(App::update, App::view)
}

#[derive(Debug, Default)]
struct App {
    open_group_downdown: Option<u32>,
    pressed_message: Option<String>,
}

#[derive(Clone, Debug)]
enum Message {
    CollapsedButtonPressed(u32),
    GroupDropdownDismissed,
    ButtonPressed(&'static str),
}

impl App {
    fn update(&mut self, message: Message) {
        match message {
            Message::CollapsedButtonPressed(i) => self.open_group_downdown = Some(i),
            Message::GroupDropdownDismissed => self.open_group_downdown = None,
            Message::ButtonPressed(message) => {
                self.pressed_message = Some(message.to_owned() + " pressed!")
            }
        }
    }

    fn view(&self) -> Element<'_, Message, Theme> {
        let group_1 = group(1, "Group One", |size| match size {
            group::Size::Collapsed => None,
            group::Size::Small => None,
            group::Size::Medium => None,
            group::Size::Large => Some(large_button(color!(255, 0, 0), "Button 1").into()),
        });

        let group_2 = group(2, "Group Two", |size| match size {
            group::Size::Collapsed => None,
            group::Size::Small => None,
            group::Size::Medium => Some(
                column![
                    small_button(color!(0, 255, 0), "Button 2"),
                    small_button(color!(0, 0, 255), "Button 3"),
                ]
                .into(),
            ),
            group::Size::Large => Some(
                row![
                    large_button(color!(0, 255, 0), "Button 2"),
                    large_button(color!(0, 0, 255), "Button 3")
                ]
                .into(),
            ),
        });

        let group_3 = group(3, "Group Three", |size| match size {
            group::Size::Collapsed => None,
            group::Size::Small => None,
            group::Size::Medium => Some(
                column![
                    small_button(color!(255, 255, 0), "Button 4"),
                    small_button(color!(255, 0, 255), "Button 5"),
                    small_button(color!(255, 255, 255), "Button 6")
                ]
                .into(),
            ),
            group::Size::Large => Some(
                row![
                    large_button(color!(255, 255, 0), "Button 4"),
                    large_button(color!(255, 0, 255), "Button 5"),
                    large_button(color!(255, 255, 255), "Button 6")
                ]
                .into(),
            ),
        });

        let group_4 = group(4, "Group Four", |size| match size {
            group::Size::Collapsed => Some(large_rectangle(color!(64, 64, 64)).into()),
            group::Size::Small => None,
            group::Size::Medium => None,
            group::Size::Large => Some(
                row![
                    large_button(color!(125, 0, 0), "Button 7"),
                    column![
                        small_button(color!(0, 125, 0), "Button 8"),
                        small_button(color!(0, 0, 125), "Button 9"),
                    ],
                ]
                .into(),
            ),
        })
        .on_collapsed_press(Message::CollapsedButtonPressed(4));

        let mut ribbon = Ribbon::new([group_1, group_2, group_3, group_4])
            .on_group_dropdown_dismiss(Message::GroupDropdownDismissed)
            .spacing(10);

        if let Some(group_id) = self.open_group_downdown {
            ribbon = ribbon.open_group(group_id);
        }

        column![ribbon, center(self.pressed_message.as_ref().map(text))].into()
    }
}

fn rectangle_base<'a>(color: Color) -> Container<'a, Message, Theme> {
    center(space()).style(move |_| Style {
        text_color: None,
        background: Some(color.into()),
        border: Border::default(),
        shadow: Shadow::default(),
        snap: true,
    })
}

fn small_rectangle<'a>(color: Color) -> Container<'a, Message, Theme> {
    rectangle_base(color).width(24).height(24)
}

fn large_rectangle<'a>(color: Color) -> Container<'a, Message, Theme> {
    rectangle_base(color).width(36).height(36)
}

fn small_button<'a>(color: Color, label: &'static str) -> Button<'a, Message, Theme> {
    button(row![small_rectangle(color), text(label)].spacing(4))
        .height(32)
        .on_press(Message::ButtonPressed(label))
}

fn large_button<'a>(color: Color, label: &'static str) -> Button<'a, Message, Theme> {
    button(row![large_rectangle(color), text(label)].spacing(4))
        .height(56)
        .on_press(Message::ButtonPressed(label))
}