Skip to main content

radiantkit_core/tools/
rectangle_tool.rs

1use crate::{RadiantSceneMessage, RadiantTool};
2use macro_magic::export_tokens;
3use serde::{Deserialize, Serialize};
4
5#[export_tokens]
6#[derive(Serialize, Deserialize, Debug, Clone)]
7pub enum RadiantRectangleMessage {
8    AddRectangle { position: [f32; 2], scale: [f32; 2] },
9}
10
11pub struct RectangleTool {
12    active_node_id: Option<u64>,
13    start_position: [f32; 2],
14    prev_position: [f32; 2],
15}
16
17impl RectangleTool {
18    pub fn new() -> Self {
19        Self {
20            active_node_id: None,
21            start_position: [0.0, 0.0],
22            prev_position: [0.0, 0.0],
23        }
24    }
25}
26
27impl<M: From<RadiantRectangleMessage> + From<RadiantSceneMessage>> RadiantTool<M>
28    for RectangleTool
29{
30    fn on_mouse_down(&mut self, _node_id: u64, node_count: u64, position: [f32; 2]) -> Option<M> {
31        let message = RadiantRectangleMessage::AddRectangle {
32            position,
33            scale: [10.0, 10.0],
34        };
35        self.active_node_id = Some(node_count);
36        self.start_position = position;
37        self.prev_position = position;
38        Some(message.into())
39    }
40
41    fn on_mouse_move(&mut self, position: [f32; 2]) -> Option<M> {
42        let result = if let Some(id) = self.active_node_id {
43            let message = RadiantSceneMessage::TransformNode {
44                id: id,
45                position: [0.0, 0.0],
46                scale: [
47                    position[0] - self.prev_position[0],
48                    position[1] - self.prev_position[1],
49                ],
50            };
51            Some(message.into())
52        } else {
53            None
54        };
55        self.prev_position = position;
56        result
57    }
58
59    fn on_mouse_up(&mut self, _position: [f32; 2]) -> Option<M> {
60        self.active_node_id = None;
61        self.start_position = [0.0, 0.0];
62        self.prev_position = [0.0, 0.0];
63        None
64    }
65}