veloren_voxygen/ui/ice/renderer/widget/
button.rs1use super::super::{super::Rotation, Defaults, IcedRenderer, Primitive, style};
2use iced::{Element, Layout, Point, Rectangle, button, mouse};
3
4impl button::Renderer for IcedRenderer {
5 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}