veloren_voxygen/ui/ice/renderer/widget/
button.rs

1use super::super::{super::Rotation, Defaults, IcedRenderer, Primitive, style};
2use iced::{Element, Layout, Point, Rectangle, button, mouse};
3
4impl button::Renderer for IcedRenderer {
5    // TODO: what if this gets large enough to not be copied around?
6    type Style = style::button::Style;
7
8    const DEFAULT_PADDING: iced::Padding = iced::Padding::ZERO;
9
10    fn draw<M>(
11        &mut self,
12        _defaults: &Self::Defaults,
13        bounds: Rectangle,
14        cursor_position: Point,
15        is_disabled: bool,
16        is_pressed: bool,
17        style: &Self::Style,
18        content: &Element<'_, M, Self>,
19        content_layout: Layout<'_>,
20    ) -> Self::Output {
21        let is_mouse_over = bounds.contains(cursor_position);
22
23        let (maybe_image, text_color) = if is_disabled {
24            style.disabled()
25        } else if is_mouse_over {
26            if is_pressed {
27                style.pressed()
28            } else {
29                style.hovered()
30            }
31        } else {
32            style.active()
33        };
34
35        let (content, _) = content.draw(
36            self,
37            &Defaults { text_color },
38            content_layout,
39            cursor_position,
40            &bounds,
41        );
42
43        let primitive = if let Some((handle, color)) = maybe_image {
44            let background = Primitive::Image {
45                handle: (handle, Rotation::None),
46                bounds,
47                color,
48                source_rect: None,
49            };
50
51            Primitive::Group {
52                primitives: vec![background, content],
53            }
54        } else {
55            content
56        };
57
58        let mouse_interaction = if is_mouse_over {
59            mouse::Interaction::Pointer
60        } else {
61            mouse::Interaction::default()
62        };
63
64        (primitive, mouse_interaction)
65    }
66}