1use crate::{
2 core::{algebra::Vector2, math::Rect, pool::Handle, scope_profile},
3 message::UiMessage,
4 widget::{Widget, WidgetBuilder},
5 BuildContext, Control, UiNode, UserInterface,
6};
7use std::{
8 any::{Any, TypeId},
9 ops::{Deref, DerefMut},
10};
11
12#[derive(Clone)]
14pub struct Canvas {
15 widget: Widget,
16}
17
18crate::define_widget_deref!(Canvas);
19
20impl Control for Canvas {
21 fn query_component(&self, type_id: TypeId) -> Option<&dyn Any> {
22 if type_id == TypeId::of::<Self>() {
23 Some(self)
24 } else {
25 None
26 }
27 }
28
29 fn measure_override(&self, ui: &UserInterface, _available_size: Vector2<f32>) -> Vector2<f32> {
30 scope_profile!();
31
32 let size_for_child = Vector2::new(f32::INFINITY, f32::INFINITY);
33
34 for child_handle in self.widget.children() {
35 ui.measure_node(*child_handle, size_for_child);
36 }
37
38 Vector2::default()
39 }
40
41 fn arrange_override(&self, ui: &UserInterface, final_size: Vector2<f32>) -> Vector2<f32> {
42 scope_profile!();
43
44 for &child_handle in self.widget.children() {
45 let child = ui.nodes.borrow(child_handle);
46 ui.arrange_node(
47 child_handle,
48 &Rect::new(
49 child.desired_local_position().x,
50 child.desired_local_position().y,
51 child.desired_size().x,
52 child.desired_size().y,
53 ),
54 );
55 }
56
57 final_size
58 }
59
60 fn handle_routed_message(&mut self, ui: &mut UserInterface, message: &mut UiMessage) {
61 self.widget.handle_routed_message(ui, message);
62 }
63}
64
65impl Canvas {
66 pub fn new(widget: Widget) -> Self {
67 Self { widget }
68 }
69}
70
71pub struct CanvasBuilder {
72 widget_builder: WidgetBuilder,
73}
74
75impl CanvasBuilder {
76 pub fn new(widget_builder: WidgetBuilder) -> Self {
77 Self { widget_builder }
78 }
79
80 pub fn build(self, ui: &mut BuildContext) -> Handle<UiNode> {
81 let canvas = Canvas {
82 widget: self.widget_builder.build(),
83 };
84 ui.add_node(UiNode::new(canvas))
85 }
86}