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