radiantkit_core/tools/
rectangle_tool.rs1use 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}