rg3d_ui/
canvas.rs

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/// Allows user to directly set position and size of a node
13#[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}