cosmic/widget/button/
image.rs
1use super::Builder;
5use crate::{
6 Element,
7 widget::{self, image::Handle},
8};
9use iced_core::{Length, Padding, font::Weight, widget::Id};
10use std::borrow::Cow;
11
12pub type Button<'a, Message> = Builder<'a, Message, Image<'a, Handle, Message>>;
13
14pub fn image<'a, Message>(handle: impl Into<Handle> + 'a) -> Button<'a, Message> {
16 Button::new(Image {
17 image: widget::image(handle).border_radius([9.0; 4]),
18 selected: false,
19 on_remove: None,
20 })
21}
22
23pub struct Image<'a, Handle, Message> {
25 image: widget::Image<'a, Handle>,
26 selected: bool,
27 on_remove: Option<Message>,
28}
29
30impl<'a, Message> Button<'a, Message> {
31 #[inline]
32 pub fn new(variant: Image<'a, Handle, Message>) -> Self {
33 Self {
34 id: Id::unique(),
35 label: Cow::Borrowed(""),
36 tooltip: Cow::Borrowed(""),
37 on_press: None,
38 width: Length::Shrink,
39 height: Length::Shrink,
40 padding: Padding::from(0),
41 spacing: 0,
42 icon_size: 16,
43 line_height: 20,
44 font_size: 14,
45 font_weight: Weight::Normal,
46 class: crate::theme::style::Button::Image,
47 variant,
48 }
49 }
50
51 #[inline]
52 pub fn on_remove(mut self, message: Message) -> Self {
53 self.variant.on_remove = Some(message);
54 self
55 }
56
57 #[inline]
58 pub fn on_remove_maybe(mut self, message: Option<Message>) -> Self {
59 self.variant.on_remove = message;
60 self
61 }
62
63 #[inline]
64 pub fn selected(mut self, selected: bool) -> Self {
65 self.variant.selected = selected;
66 self
67 }
68}
69
70impl<'a, Message> From<Button<'a, Message>> for Element<'a, Message>
71where
72 Handle: Clone + std::hash::Hash,
73 Message: Clone + 'static,
74{
75 fn from(builder: Button<'a, Message>) -> Element<'a, Message> {
76 let content = builder
77 .variant
78 .image
79 .width(builder.width)
80 .height(builder.height);
81
82 super::custom_image_button(content, builder.variant.on_remove)
83 .padding(0)
84 .selected(builder.variant.selected)
85 .id(builder.id)
86 .on_press_maybe(builder.on_press)
87 .class(builder.class)
88 .into()
89 }
90}