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))
}