Skip to main content

radiantkit_core/tools/
selection_tool.rs

1use crate::{RadiantSceneMessage, RadiantTool};
2
3pub struct SelectionTool {
4    active_node_id: Option<u64>,
5    prev_position: [f32; 2],
6}
7
8impl SelectionTool {
9    pub fn new() -> Self {
10        Self {
11            active_node_id: None,
12            prev_position: [0.0, 0.0],
13        }
14    }
15}
16
17impl<M: From<RadiantSceneMessage>> RadiantTool<M> for SelectionTool {
18    fn on_mouse_down(&mut self, node_id: u64, _node_count: u64, _position: [f32; 2]) -> Option<M> {
19        Some(
20            if node_id > 0 {
21                self.active_node_id = Some(node_id - 1);
22                RadiantSceneMessage::SelectNode {
23                    id: Some(node_id - 1),
24                }
25            } else {
26                self.active_node_id = None;
27                RadiantSceneMessage::SelectNode { id: None }
28            }
29            .into(),
30        )
31    }
32
33    fn on_mouse_move(&mut self, position: [f32; 2]) -> Option<M> {
34        let result = if let Some(id) = self.active_node_id {
35            let message = RadiantSceneMessage::TransformNode {
36                id: id,
37                position: [
38                    position[0] - self.prev_position[0],
39                    position[1] - self.prev_position[1],
40                ],
41                scale: [0.0, 0.0],
42            };
43            Some(message.into())
44        } else {
45            None
46        };
47        self.prev_position = position;
48        result
49    }
50
51    fn on_mouse_up(&mut self, _position: [f32; 2]) -> Option<M> {
52        self.active_node_id = None;
53        self.prev_position = [0.0, 0.0];
54        None
55    }
56}